From f334010e2deefe71e4207e302485ee03aaaa1a0f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 13 Aug 2009 09:33:09 +0200 Subject: Initial commit to opentox-ruby-api-wrapper. --- .document | 5 ++++ .gitignore | 5 ++++ LICENSE | 20 +++++++++++++ README.rdoc | 18 +++++++++++ Rakefile | 56 +++++++++++++++++++++++++++++++++++ lib/opentox-ruby-api-wrapper.rb | 0 test/opentox-ruby-api-wrapper_test.rb | 7 +++++ test/test_helper.rb | 10 +++++++ 8 files changed, 121 insertions(+) create mode 100644 .document create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.rdoc create mode 100644 Rakefile create mode 100644 lib/opentox-ruby-api-wrapper.rb create mode 100644 test/opentox-ruby-api-wrapper_test.rb create mode 100644 test/test_helper.rb diff --git a/.document b/.document new file mode 100644 index 0000000..ecf3673 --- /dev/null +++ b/.document @@ -0,0 +1,5 @@ +README.rdoc +lib/**/*.rb +bin/* +features/**/*.feature +LICENSE diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..00c0b86 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.sw? +.DS_Store +coverage +rdoc +pkg diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b3e4dc8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2009 Christoph Helma + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.rdoc b/README.rdoc new file mode 100644 index 0000000..4b593d1 --- /dev/null +++ b/README.rdoc @@ -0,0 +1,18 @@ += opentox-ruby-api-wrapper + +Description goes here. + +== Note on Patches/Pull Requests + +* Fork the project. +* Make your feature addition or bug fix. +* Add tests for it. This is important so I don't break it in a + future version unintentionally. +* Commit, do not mess with rakefile, version, or history. + (if you want to have your own version, that is fine but + bump version in a commit by itself I can ignore when I pull) +* Send me a pull request. Bonus points for topic branches. + +== Copyright + +Copyright (c) 2009 Christoph Helma. See LICENSE for details. diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..db42494 --- /dev/null +++ b/Rakefile @@ -0,0 +1,56 @@ +require 'rubygems' +require 'rake' + +begin + require 'jeweler' + Jeweler::Tasks.new do |gem| + gem.name = "opentox-ruby-api-wrapper" + gem.summary = %Q{TODO: one-line summary of your gem} + gem.description = %Q{TODO: longer description of your gem} + gem.email = "helma@in-silico.de" + gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" + gem.authors = ["Christoph Helma"] + gem.add_development_dependency "thoughtbot-shoulda" + # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings + end +rescue LoadError + puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler" +end + +require 'rake/testtask' +Rake::TestTask.new(:test) do |test| + test.libs << 'lib' << 'test' + test.pattern = 'test/**/*_test.rb' + test.verbose = true +end + +begin + require 'rcov/rcovtask' + Rcov::RcovTask.new do |test| + test.libs << 'test' + test.pattern = 'test/**/*_test.rb' + test.verbose = true + end +rescue LoadError + task :rcov do + abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov" + end +end + +task :test => :check_dependencies + +task :default => :test + +require 'rake/rdoctask' +Rake::RDocTask.new do |rdoc| + if File.exist?('VERSION') + version = File.read('VERSION') + else + version = "" + end + + rdoc.rdoc_dir = 'rdoc' + rdoc.title = "opentox-ruby-api-wrapper #{version}" + rdoc.rdoc_files.include('README*') + rdoc.rdoc_files.include('lib/**/*.rb') +end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb new file mode 100644 index 0000000..e69de29 diff --git a/test/opentox-ruby-api-wrapper_test.rb b/test/opentox-ruby-api-wrapper_test.rb new file mode 100644 index 0000000..6f7f82e --- /dev/null +++ b/test/opentox-ruby-api-wrapper_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class OpentoxRubyApiWrapperTest < Test::Unit::TestCase + should "probably rename this file and start testing for real" do + flunk "hey buddy, you should probably rename this file and start testing for real" + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..837ad16 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,10 @@ +require 'rubygems' +require 'test/unit' +require 'shoulda' + +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) +$LOAD_PATH.unshift(File.dirname(__FILE__)) +require 'opentox-ruby-api-wrapper' + +class Test::Unit::TestCase +end -- cgit v1.2.3 From c8b96ecfdd5cc881d2660497e3bacc1b1f9b854a Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 13 Aug 2009 09:48:26 +0200 Subject: Version bump to 0.0.0 --- VERSION | 1 + 1 file changed, 1 insertion(+) create mode 100644 VERSION diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..77d6f4c --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.0.0 -- cgit v1.2.3 From 9370c0e754fe405c7a8c2ca7d290bb92f02971f8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 13 Aug 2009 09:49:17 +0200 Subject: Version bump to 0.1.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 77d6f4c..6e8bf73 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.0 +0.1.0 -- cgit v1.2.3 From 1985adc474962f590c5e7331e570fde3dfa3dc5b Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 13 Aug 2009 11:03:59 +0200 Subject: gemspec and rdoc documentation added --- .gitignore | 1 - LICENSE | 694 +++++++++++++++++++++++- README.rdoc | 29 +- Rakefile | 8 +- lib/opentox-ruby-api-wrapper.rb | 137 +++++ opentox-ruby-api-wrapper.gemspec | 58 ++ rdoc/classes/OpenTox.html | 115 ++++ rdoc/classes/OpenTox/Compound.html | 247 +++++++++ rdoc/classes/OpenTox/Dataset.html | 331 +++++++++++ rdoc/classes/OpenTox/Feature.html | 217 ++++++++ rdoc/classes/OpenTox/Fminer.html | 178 ++++++ rdoc/classes/OpenTox/OpenTox.html | 162 ++++++ rdoc/created.rid | 1 + rdoc/files/README_rdoc.html | 140 +++++ rdoc/files/lib/opentox-ruby-api-wrapper_rb.html | 109 ++++ rdoc/fr_class_index.html | 32 ++ rdoc/fr_file_index.html | 28 + rdoc/fr_method_index.html | 43 ++ rdoc/index.html | 26 + rdoc/rdoc-style.css | 208 +++++++ 20 files changed, 2728 insertions(+), 36 deletions(-) create mode 100644 opentox-ruby-api-wrapper.gemspec create mode 100644 rdoc/classes/OpenTox.html create mode 100644 rdoc/classes/OpenTox/Compound.html create mode 100644 rdoc/classes/OpenTox/Dataset.html create mode 100644 rdoc/classes/OpenTox/Feature.html create mode 100644 rdoc/classes/OpenTox/Fminer.html create mode 100644 rdoc/classes/OpenTox/OpenTox.html create mode 100644 rdoc/created.rid create mode 100644 rdoc/files/README_rdoc.html create mode 100644 rdoc/files/lib/opentox-ruby-api-wrapper_rb.html create mode 100644 rdoc/fr_class_index.html create mode 100644 rdoc/fr_file_index.html create mode 100644 rdoc/fr_method_index.html create mode 100644 rdoc/index.html create mode 100644 rdoc/rdoc-style.css diff --git a/.gitignore b/.gitignore index 00c0b86..00278f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ *.sw? .DS_Store coverage -rdoc pkg diff --git a/LICENSE b/LICENSE index b3e4dc8..94a9ed0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,20 +1,674 @@ -Copyright (c) 2009 Christoph Helma - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.rdoc b/README.rdoc index 4b593d1..f33ef93 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,17 +1,22 @@ = opentox-ruby-api-wrapper -Description goes here. - -== Note on Patches/Pull Requests - -* Fork the project. -* Make your feature addition or bug fix. -* Add tests for it. This is important so I don't break it in a - future version unintentionally. -* Commit, do not mess with rakefile, version, or history. - (if you want to have your own version, that is fine but - bump version in a commit by itself I can ignore when I pull) -* Send me a pull request. Bonus points for topic branches. +Ruby wrapper for the OpenTox REST API (http://www.opentox.org) + +== Installation + +Run the following if you haven't already: + + gem sources -a http://gems.github.com + +Install the gem: + + sudo gem install helma-opentox-ruby-api-wrapper + +== Usage + +- set the environment variables OPENTOX_COMPOUNDS, OPENTOX_FEATURES, OPENTOX_DATASETS, OPENTOX_FMINER to the base URI of the OpenTox REST webservices +- require 'opentox-ruby-api-wrapper' in your ruby application +- consult the API documentation for details == Copyright diff --git a/Rakefile b/Rakefile index db42494..a1b950e 100644 --- a/Rakefile +++ b/Rakefile @@ -5,11 +5,13 @@ begin require 'jeweler' Jeweler::Tasks.new do |gem| gem.name = "opentox-ruby-api-wrapper" - gem.summary = %Q{TODO: one-line summary of your gem} - gem.description = %Q{TODO: longer description of your gem} - gem.email = "helma@in-silico.de" + gem.summary = %Q{Ruby wrapper for the OpenTox REST API} + gem.description = %Q{} + gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] + gem.add_dependency "rest-client" + gem.add_dependency "crack" gem.add_development_dependency "thoughtbot-shoulda" # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index e69de29..647b357 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -0,0 +1,137 @@ +require 'rest_client' +require 'crack/xml' + +module OpenTox + + class OpenTox + attr_reader :uri + + # Escape all nonword characters + def uri_escape(string) + URI.escape(string, /[^\w]/) + end + end + + class Compound < OpenTox + + # Initialize with :uri => uri, :smiles => smiles or :name => name (name can be also an InChI/InChiKey, CAS number, etc) + def initialize(params) + if params[:uri] + @uri = params[:uri].to_s + elsif params[:smiles] + @uri = RestClient.post ENV['OPENTOX_COMPOUNDS'] ,:smiles => uri_escape(params[:smiles]) + elsif params[:name] + @uri = RestClient.post ENV['OPENTOX_COMPOUNDS'] ,:name => uri_escape(params[:name]) + end + end + + # Get the (canonical) smiles + def smiles + RestClient.get @uri + end + + # Matchs a smarts string + def match?(smarts) + if RestClient.get(@uri + '/match/' + uri_escape(smarts)) == 'true' + true + else + false + end + end + + # Match an array of smarts features, returns matching features + def match(smarts_features) + smarts_features.collect{ |smarts| smarts if self.match?(smarts.name) }.compact + end + + end + + class Feature < OpenTox + + # Initialize with :uri => uri, or :name => name, :values => hash_of_property_names_and_values + def initialize(params) + if params[:uri] + @uri = params[:uri].to_s + else + @uri = ENV['OPENTOX_FEATURES'] + uri_escape(params[:name]) + params[:values].each do |k,v| + @uri += '/' + k.to_s + '/' + v.to_s + end + end + end + + # Get the value of a property + def value(property) + RestClient.get @uri + '/' + property + end + + # Get the name of the feature + def name + RestClient.get @uri + '/name' + end + + end + + class Dataset < OpenTox + + # Initialize with :uri => uri or :name => name (creates a new dataset) + def initialize(params) + if params[:uri] + @uri = params[:uri].to_s + elsif params[:name] + @uri = RestClient.post ENV['OPENTOX_DATASETS'], :name => params[:name] + RestClient.delete @uri + '/associations' + end + end + + # Get the dataset name + def name + RestClient.get @uri + '/name' + end + + # Get all compounds from a dataset + def compounds + RestClient.get(@uri + '/compounds').split("\n").collect{ |c| Compound.new(:uri => c) } + end + + # Get all compounds and features from a dataset, returns a hash with compound_uris as keys and arrays of features as values + def all_compounds_and_features + compounds = {} + Crack::XML.parse(RestClient.get @uri + '/compounds/features')['dataset']['compound'].each do |c| + features = c['feature_uri'].collect{ |f| Feature.new :uri => f } + compounds[c['uri']] = features + end + compounds + end + + # Get all features from a dataset + def all_features + RestClient.get(@uri + '/features').split("\n").collect{|f| Feature.new(:uri => f)} + end + + # Get all features for a compound + def features(compound) + RestClient.get(@uri + '/compound/' + uri_escape(compound.uri) + '/features').split("\n").collect{|f| Feature.new(:uri => f) } + end + + # Add a compound and a feature to a dataset + def add(compound,feature) + RestClient.put @uri, :compound_uri => compound.uri, :feature_uri => feature.uri + end + + end + + class Fminer < OpenTox + + # Create a new dataset with BBRC features + def initialize(training_dataset) + @dataset_uri = RestClient.post ENV['OPENTOX_FMINER'], :dataset_uri => training_dataset.uri + end + + def dataset + Dataset.new(:uri => @dataset_uri) + end + + end + +end diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec new file mode 100644 index 0000000..cd99a9b --- /dev/null +++ b/opentox-ruby-api-wrapper.gemspec @@ -0,0 +1,58 @@ +# Generated by jeweler +# DO NOT EDIT THIS FILE +# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec` +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = %q{opentox-ruby-api-wrapper} + s.version = "0.1.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= + s.authors = ["Christoph Helma"] + s.date = %q{2009-08-13} + s.description = %q{} + s.email = %q{helma@in-silico.ch} + s.extra_rdoc_files = [ + "LICENSE", + "README.rdoc" + ] + s.files = [ + ".document", + ".gitignore", + "LICENSE", + "README.rdoc", + "Rakefile", + "VERSION", + "lib/opentox-ruby-api-wrapper.rb", + "test/opentox-ruby-api-wrapper_test.rb", + "test/test_helper.rb" + ] + s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} + s.rdoc_options = ["--charset=UTF-8"] + s.require_paths = ["lib"] + s.rubygems_version = %q{1.3.5} + s.summary = %q{Ruby wrapper for the OpenTox REST API} + s.test_files = [ + "test/test_helper.rb", + "test/opentox-ruby-api-wrapper_test.rb" + ] + + if s.respond_to? :specification_version then + current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION + s.specification_version = 3 + + if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, [">= 0"]) + else + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + end + else + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + end +end diff --git a/rdoc/classes/OpenTox.html b/rdoc/classes/OpenTox.html new file mode 100644 index 0000000..21b7032 --- /dev/null +++ b/rdoc/classes/OpenTox.html @@ -0,0 +1,115 @@ + + + + + + Module: OpenTox + + + + + + + + + + +
+ + + + + + + + + + +
ModuleOpenTox
In: + + lib/opentox-ruby-api-wrapper.rb + +
+
+
+ + +
+ + + +
+ + + +
+ + +
+ + + + +
+ +
+

Classes and Modules

+ + Class OpenTox::Compound
+Class OpenTox::Dataset
+Class OpenTox::Feature
+Class OpenTox::Fminer
+Class OpenTox::OpenTox
+ +
+ + + + + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/rdoc/classes/OpenTox/Compound.html b/rdoc/classes/OpenTox/Compound.html new file mode 100644 index 0000000..c892d0e --- /dev/null +++ b/rdoc/classes/OpenTox/Compound.html @@ -0,0 +1,247 @@ + + + + + + Class: OpenTox::Compound + + + + + + + + + + +
+ + + + + + + + + + + + + + +
ClassOpenTox::Compound
In: + + lib/opentox-ruby-api-wrapper.rb + +
+
Parent: + + OpenTox + +
+
+ + +
+ + + +
+ + + +
+ +
+

Methods

+ +
+ match   + match?   + new   + smiles   +
+
+ +
+ + + + +
+ + + + + + + + + +
+

Public Class methods

+ +
+ + + + +
+

+Initialize with :uri => uri, :smiles => smiles or :name => name +(name can be also an InChI/InChiKey, CAS number, etc) +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 18
+                def initialize(params)
+                        if params[:uri]
+                                @uri = params[:uri].to_s
+                        elsif params[:smiles]
+                                @uri = RestClient.post ENV['OPENTOX_COMPOUNDS'] ,:smiles => uri_escape(params[:smiles])
+                        elsif params[:name]
+                                @uri = RestClient.post ENV['OPENTOX_COMPOUNDS'] ,:name => uri_escape(params[:name])
+                        end
+                end
+
+
+
+
+ +

Public Instance methods

+ +
+ + + + +
+

+Match an array of smarts features, returns matching features +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 43
+                def match(smarts_features)
+                        smarts_features.collect{ |smarts| smarts if self.match?(smarts.name) }.compact
+                end
+
+
+
+
+ +
+ + + + +
+

+Matchs a smarts string +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 34
+                def match?(smarts)
+                        if RestClient.get(@uri + '/match/' + uri_escape(smarts)) == 'true'
+                                true
+                        else
+                                false
+                        end
+                end
+
+
+
+
+ +
+ + + + +
+

+Get the (canonical) smiles +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 29
+                def smiles
+                        RestClient.get @uri
+                end
+
+
+
+
+ + +
+ + +
+ + + + + + \ No newline at end of file diff --git a/rdoc/classes/OpenTox/Dataset.html b/rdoc/classes/OpenTox/Dataset.html new file mode 100644 index 0000000..f6966f7 --- /dev/null +++ b/rdoc/classes/OpenTox/Dataset.html @@ -0,0 +1,331 @@ + + + + + + Class: OpenTox::Dataset + + + + + + + + + + +
+ + + + + + + + + + + + + + +
ClassOpenTox::Dataset
In: + + lib/opentox-ruby-api-wrapper.rb + +
+
Parent: + + OpenTox + +
+
+ + +
+ + + +
+ + + +
+ +
+

Methods

+ +
+ add   + all_compounds_and_features   + all_features   + compounds   + features   + name   + new   +
+
+ +
+ + + + +
+ + + + + + + + + +
+

Public Class methods

+ +
+ + + + +
+

+Initialize with :uri => uri or :name => name (creates a new dataset) +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 78
+                def initialize(params)
+                        if params[:uri]
+                                @uri = params[:uri].to_s
+                        elsif params[:name] 
+                                @uri = RestClient.post ENV['OPENTOX_DATASETS'], :name => params[:name]
+                                RestClient.delete @uri + '/associations'
+                        end
+                end
+
+
+
+
+ +

Public Instance methods

+ +
+ + + + +
+

+Add a compound and a feature to a dataset +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 118
+                def add(compound,feature)
+                        RestClient.put @uri, :compound_uri => compound.uri, :feature_uri => feature.uri
+                end
+
+
+
+
+ +
+ + + + +
+

+Get all compounds and features from a dataset, returns a hash +with compound_uris as keys and arrays of features as values +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 98
+                def all_compounds_and_features
+                        compounds = {}
+                        Crack::XML.parse(RestClient.get @uri + '/compounds/features')['dataset']['compound'].each do |c|
+                                features = c['feature_uri'].collect{ |f| Feature.new :uri => f }
+                                compounds[c['uri']] = features
+                        end
+                        compounds
+                end
+
+
+
+
+ +
+ + + + +
+

+Get all features from a dataset +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 108
+                def all_features
+                        RestClient.get(@uri + '/features').split("\n").collect{|f| Feature.new(:uri => f)}
+                end
+
+
+
+
+ +
+ + + + +
+

+Get all compounds from a dataset +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 93
+                def compounds
+                        RestClient.get(@uri + '/compounds').split("\n").collect{ |c| Compound.new(:uri => c) }
+                end
+
+
+
+
+ +
+ + + + +
+

+Get all features for a compound +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 113
+                def features(compound)
+                        RestClient.get(@uri + '/compound/' + uri_escape(compound.uri) + '/features').split("\n").collect{|f| Feature.new(:uri => f) }
+                end
+
+
+
+
+ +
+ + + + +
+

+Get the dataset name +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 88
+                def name
+                        RestClient.get @uri + '/name'
+                end
+
+
+
+
+ + +
+ + +
+ + + + + + \ No newline at end of file diff --git a/rdoc/classes/OpenTox/Feature.html b/rdoc/classes/OpenTox/Feature.html new file mode 100644 index 0000000..5e53a12 --- /dev/null +++ b/rdoc/classes/OpenTox/Feature.html @@ -0,0 +1,217 @@ + + + + + + Class: OpenTox::Feature + + + + + + + + + + +
+ + + + + + + + + + + + + + +
ClassOpenTox::Feature
In: + + lib/opentox-ruby-api-wrapper.rb + +
+
Parent: + + OpenTox + +
+
+ + +
+ + + +
+ + + +
+ +
+

Methods

+ +
+ name   + new   + value   +
+
+ +
+ + + + +
+ + + + + + + + + +
+

Public Class methods

+ +
+ + + + +
+

+Initialize with :uri => uri, or :name => name, :values => +hash_of_property_names_and_values +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 52
+                def initialize(params)
+                        if params[:uri]
+                                @uri = params[:uri].to_s
+                        else
+                                @uri = ENV['OPENTOX_FEATURES'] + uri_escape(params[:name]) 
+                                params[:values].each do |k,v|
+                                        @uri += '/' + k.to_s + '/' + v.to_s
+                                end
+                        end
+                end
+
+
+
+
+ +

Public Instance methods

+ +
+ + + + +
+

+Get the name of the feature +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 69
+                def name
+                        RestClient.get @uri + '/name'
+                end
+
+
+
+
+ +
+ + + + +
+

+Get the value of a property +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 64
+                def value(property)
+                        RestClient.get @uri + '/' + property
+                end
+
+
+
+
+ + +
+ + +
+ + + + + + \ No newline at end of file diff --git a/rdoc/classes/OpenTox/Fminer.html b/rdoc/classes/OpenTox/Fminer.html new file mode 100644 index 0000000..6c3b4fe --- /dev/null +++ b/rdoc/classes/OpenTox/Fminer.html @@ -0,0 +1,178 @@ + + + + + + Class: OpenTox::Fminer + + + + + + + + + + +
+ + + + + + + + + + + + + + +
ClassOpenTox::Fminer
In: + + lib/opentox-ruby-api-wrapper.rb + +
+
Parent: + + OpenTox + +
+
+ + +
+ + + +
+ + + +
+ +
+

Methods

+ +
+ dataset   + new   +
+
+ +
+ + + + +
+ + + + + + + + + +
+

Public Class methods

+ +
+ + + + +
+

+Create a new dataset with BBRC features +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 127
+                def initialize(training_dataset)
+                        @dataset_uri = RestClient.post ENV['OPENTOX_FMINER'], :dataset_uri => training_dataset.uri
+                end
+
+
+
+
+ +

Public Instance methods

+ +
+ + + + +
+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 131
+                def dataset
+                        Dataset.new(:uri => @dataset_uri)
+                end
+
+
+
+
+ + +
+ + +
+ + + + + + \ No newline at end of file diff --git a/rdoc/classes/OpenTox/OpenTox.html b/rdoc/classes/OpenTox/OpenTox.html new file mode 100644 index 0000000..35611f8 --- /dev/null +++ b/rdoc/classes/OpenTox/OpenTox.html @@ -0,0 +1,162 @@ + + + + + + Class: OpenTox::OpenTox + + + + + + + + + + +
+ + + + + + + + + + + + + + +
ClassOpenTox::OpenTox
In: + + lib/opentox-ruby-api-wrapper.rb + +
+
Parent: + Object +
+
+ + +
+ + + +
+ + + +
+ +
+

Methods

+ +
+ uri_escape   +
+
+ +
+ + + + +
+ + + + + +
+

Attributes

+ +
+ + + + + + +
uri [R] 
+
+
+ + + + +
+

Public Instance methods

+ +
+ + + + +
+

+Escape all nonword characters +

+

[Source]

+
+
+# File lib/opentox-ruby-api-wrapper.rb, line 10
+                def uri_escape(string)
+                        URI.escape(string, /[^\w]/)
+                end
+
+
+
+
+ + +
+ + +
+ + + + + + \ No newline at end of file diff --git a/rdoc/created.rid b/rdoc/created.rid new file mode 100644 index 0000000..8dc2058 --- /dev/null +++ b/rdoc/created.rid @@ -0,0 +1 @@ +Thu, 13 Aug 2009 11:01:58 +0200 diff --git a/rdoc/files/README_rdoc.html b/rdoc/files/README_rdoc.html new file mode 100644 index 0000000..3342971 --- /dev/null +++ b/rdoc/files/README_rdoc.html @@ -0,0 +1,140 @@ + + + + + + File: README.rdoc + + + + + + + + + + +
+

README.rdoc

+ + + + + + + + + +
Path:README.rdoc +
Last Update:Thu Aug 13 11:00:51 +0200 2009
+
+ + +
+ + + +
+ +
+

opentox-ruby-api-wrapper

+

+Ruby wrapper for the OpenTox REST API +(www.opentox.org) +

+

Installation

+

+Run the following if you haven‘t already: +

+
+        gem sources -a http://gems.github.com
+
+

+Install the gem: +

+
+        sudo gem install helma-opentox-ruby-api-wrapper
+
+

Usage

+
    +
  • set the environment variables OPENTOX_COMPOUNDS, OPENTOX_FEATURES, +OPENTOX_DATASETS, OPENTOX_FMINER to the base URI of the OpenTox REST webservices + +
  • +
  • require ‘opentox-ruby-api-wrapper’ in your ruby application + +
  • +
  • consult the API documentation for details + +
  • +
+

Copyright

+

+Copyright (c) 2009 Christoph Helma. See LICENSE for details. +

+ +
+ + +
+ + +
+ + + + +
+ + + + + + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/rdoc/files/lib/opentox-ruby-api-wrapper_rb.html b/rdoc/files/lib/opentox-ruby-api-wrapper_rb.html new file mode 100644 index 0000000..be6ca28 --- /dev/null +++ b/rdoc/files/lib/opentox-ruby-api-wrapper_rb.html @@ -0,0 +1,109 @@ + + + + + + File: opentox-ruby-api-wrapper.rb + + + + + + + + + + +
+

opentox-ruby-api-wrapper.rb

+ + + + + + + + + +
Path:lib/opentox-ruby-api-wrapper.rb +
Last Update:Thu Aug 13 10:44:46 +0200 2009
+
+ + +
+ + + +
+ + +
+

Required files

+ +
+ rest_client   + crack/xml   +
+
+ +
+ + +
+ + + + +
+ + + + + + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/rdoc/fr_class_index.html b/rdoc/fr_class_index.html new file mode 100644 index 0000000..7242f18 --- /dev/null +++ b/rdoc/fr_class_index.html @@ -0,0 +1,32 @@ + + + + + + + + Classes + + + + + + + + \ No newline at end of file diff --git a/rdoc/fr_file_index.html b/rdoc/fr_file_index.html new file mode 100644 index 0000000..eac1d09 --- /dev/null +++ b/rdoc/fr_file_index.html @@ -0,0 +1,28 @@ + + + + + + + + Files + + + + + + + + \ No newline at end of file diff --git a/rdoc/fr_method_index.html b/rdoc/fr_method_index.html new file mode 100644 index 0000000..63abf5e --- /dev/null +++ b/rdoc/fr_method_index.html @@ -0,0 +1,43 @@ + + + + + + + + Methods + + + + + + + + \ No newline at end of file diff --git a/rdoc/index.html b/rdoc/index.html new file mode 100644 index 0000000..bb24624 --- /dev/null +++ b/rdoc/index.html @@ -0,0 +1,26 @@ + + + + + + + opentox-ruby-api-wrapper 0.1.0 + + + + + + + + + + + + \ No newline at end of file diff --git a/rdoc/rdoc-style.css b/rdoc/rdoc-style.css new file mode 100644 index 0000000..44c7b3d --- /dev/null +++ b/rdoc/rdoc-style.css @@ -0,0 +1,208 @@ + +body { + font-family: Verdana,Arial,Helvetica,sans-serif; + font-size: 90%; + margin: 0; + margin-left: 40px; + padding: 0; + background: white; +} + +h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; } +h1 { font-size: 150%; } +h2,h3,h4 { margin-top: 1em; } + +a { background: #eef; color: #039; text-decoration: none; } +a:hover { background: #039; color: #eef; } + +/* Override the base stylesheet's Anchor inside a table cell */ +td > a { + background: transparent; + color: #039; + text-decoration: none; +} + +/* and inside a section title */ +.section-title > a { + background: transparent; + color: #eee; + text-decoration: none; +} + +/* === Structural elements =================================== */ + +div#index { + margin: 0; + margin-left: -40px; + padding: 0; + font-size: 90%; +} + + +div#index a { + margin-left: 0.7em; +} + +div#index .section-bar { + margin-left: 0px; + padding-left: 0.7em; + background: #ccc; + font-size: small; +} + + +div#classHeader, div#fileHeader { + width: auto; + color: white; + padding: 0.5em 1.5em 0.5em 1.5em; + margin: 0; + margin-left: -40px; + border-bottom: 3px solid #006; +} + +div#classHeader a, div#fileHeader a { + background: inherit; + color: white; +} + +div#classHeader td, div#fileHeader td { + background: inherit; + color: white; +} + + +div#fileHeader { + background: #057; +} + +div#classHeader { + background: #048; +} + + +.class-name-in-header { + font-size: 180%; + font-weight: bold; +} + + +div#bodyContent { + padding: 0 1.5em 0 1.5em; +} + +div#description { + padding: 0.5em 1.5em; + background: #efefef; + border: 1px dotted #999; +} + +div#description h1,h2,h3,h4,h5,h6 { + color: #125;; + background: transparent; +} + +div#validator-badges { + text-align: center; +} +div#validator-badges img { border: 0; } + +div#copyright { + color: #333; + background: #efefef; + font: 0.75em sans-serif; + margin-top: 5em; + margin-bottom: 0; + padding: 0.5em 2em; +} + + +/* === Classes =================================== */ + +table.header-table { + color: white; + font-size: small; +} + +.type-note { + font-size: small; + color: #DEDEDE; +} + +.xxsection-bar { + background: #eee; + color: #333; + padding: 3px; +} + +.section-bar { + color: #333; + border-bottom: 1px solid #999; + margin-left: -20px; +} + + +.section-title { + background: #79a; + color: #eee; + padding: 3px; + margin-top: 2em; + margin-left: -30px; + border: 1px solid #999; +} + +.top-aligned-row { vertical-align: top } +.bottom-aligned-row { vertical-align: bottom } + +/* --- Context section classes ----------------------- */ + +.context-row { } +.context-item-name { font-family: monospace; font-weight: bold; color: black; } +.context-item-value { font-size: small; color: #448; } +.context-item-desc { color: #333; padding-left: 2em; } + +/* --- Method classes -------------------------- */ +.method-detail { + background: #efefef; + padding: 0; + margin-top: 0.5em; + margin-bottom: 1em; + border: 1px dotted #ccc; +} +.method-heading { + color: black; + background: #ccc; + border-bottom: 1px solid #666; + padding: 0.2em 0.5em 0 0.5em; +} +.method-signature { color: black; background: inherit; } +.method-name { font-weight: bold; } +.method-args { font-style: italic; } +.method-description { padding: 0 0.5em 0 0.5em; } + +/* --- Source code sections -------------------- */ + +a.source-toggle { font-size: 90%; } +div.method-source-code { + background: #262626; + color: #ffdead; + margin: 1em; + padding: 0.5em; + border: 1px dashed #999; + overflow: hidden; +} + +div.method-source-code pre { color: #ffdead; overflow: hidden; } + +/* --- Ruby keyword styles --------------------- */ + +.standalone-code { background: #221111; color: #ffdead; overflow: hidden; } + +.ruby-constant { color: #7fffd4; background: transparent; } +.ruby-keyword { color: #00ffff; background: transparent; } +.ruby-ivar { color: #eedd82; background: transparent; } +.ruby-operator { color: #00ffee; background: transparent; } +.ruby-identifier { color: #ffdead; background: transparent; } +.ruby-node { color: #ffa07a; background: transparent; } +.ruby-comment { color: #b22222; font-weight: bold; background: transparent; } +.ruby-regexp { color: #ffa07a; background: transparent; } +.ruby-value { color: #7fffd4; background: transparent; } \ No newline at end of file -- cgit v1.2.3 From 6683afffc7f9b2f1d58a6ebbf8e9b2f4213437ef Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 13 Aug 2009 11:04:21 +0200 Subject: Regenerated gemspec for version 0.1.0 --- opentox-ruby-api-wrapper.gemspec | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index cd99a9b..6efec64 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -24,6 +24,21 @@ Gem::Specification.new do |s| "Rakefile", "VERSION", "lib/opentox-ruby-api-wrapper.rb", + "opentox-ruby-api-wrapper.gemspec", + "rdoc/classes/OpenTox.html", + "rdoc/classes/OpenTox/Compound.html", + "rdoc/classes/OpenTox/Dataset.html", + "rdoc/classes/OpenTox/Feature.html", + "rdoc/classes/OpenTox/Fminer.html", + "rdoc/classes/OpenTox/OpenTox.html", + "rdoc/created.rid", + "rdoc/files/README_rdoc.html", + "rdoc/files/lib/opentox-ruby-api-wrapper_rb.html", + "rdoc/fr_class_index.html", + "rdoc/fr_file_index.html", + "rdoc/fr_method_index.html", + "rdoc/index.html", + "rdoc/rdoc-style.css", "test/opentox-ruby-api-wrapper_test.rb", "test/test_helper.rb" ] -- cgit v1.2.3 From b5d23150591cd29accf3ec818389e30d5812d7ef Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 13 Aug 2009 11:12:40 +0200 Subject: description added, rdoc removed --- .gitignore | 1 + README.rdoc | 2 +- Rakefile | 2 +- rdoc/classes/OpenTox.html | 115 -------- rdoc/classes/OpenTox/Compound.html | 247 ------------------ rdoc/classes/OpenTox/Dataset.html | 331 ------------------------ rdoc/classes/OpenTox/Feature.html | 217 ---------------- rdoc/classes/OpenTox/Fminer.html | 178 ------------- rdoc/classes/OpenTox/OpenTox.html | 162 ------------ rdoc/created.rid | 1 - rdoc/files/README_rdoc.html | 140 ---------- rdoc/files/lib/opentox-ruby-api-wrapper_rb.html | 109 -------- rdoc/fr_class_index.html | 32 --- rdoc/fr_file_index.html | 28 -- rdoc/fr_method_index.html | 43 --- rdoc/index.html | 26 -- rdoc/rdoc-style.css | 208 --------------- 17 files changed, 3 insertions(+), 1839 deletions(-) delete mode 100644 rdoc/classes/OpenTox.html delete mode 100644 rdoc/classes/OpenTox/Compound.html delete mode 100644 rdoc/classes/OpenTox/Dataset.html delete mode 100644 rdoc/classes/OpenTox/Feature.html delete mode 100644 rdoc/classes/OpenTox/Fminer.html delete mode 100644 rdoc/classes/OpenTox/OpenTox.html delete mode 100644 rdoc/created.rid delete mode 100644 rdoc/files/README_rdoc.html delete mode 100644 rdoc/files/lib/opentox-ruby-api-wrapper_rb.html delete mode 100644 rdoc/fr_class_index.html delete mode 100644 rdoc/fr_file_index.html delete mode 100644 rdoc/fr_method_index.html delete mode 100644 rdoc/index.html delete mode 100644 rdoc/rdoc-style.css diff --git a/.gitignore b/.gitignore index 00278f4..00c0b86 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.sw? .DS_Store coverage +rdoc pkg diff --git a/README.rdoc b/README.rdoc index f33ef93..e4d8a0e 100644 --- a/README.rdoc +++ b/README.rdoc @@ -16,7 +16,7 @@ Install the gem: - set the environment variables OPENTOX_COMPOUNDS, OPENTOX_FEATURES, OPENTOX_DATASETS, OPENTOX_FMINER to the base URI of the OpenTox REST webservices - require 'opentox-ruby-api-wrapper' in your ruby application -- consult the API documentation for details +- consult the rdoc API documentation for details == Copyright diff --git a/Rakefile b/Rakefile index a1b950e..de8e703 100644 --- a/Rakefile +++ b/Rakefile @@ -6,7 +6,7 @@ begin Jeweler::Tasks.new do |gem| gem.name = "opentox-ruby-api-wrapper" gem.summary = %Q{Ruby wrapper for the OpenTox REST API} - gem.description = %Q{} + gem.description = %Q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] diff --git a/rdoc/classes/OpenTox.html b/rdoc/classes/OpenTox.html deleted file mode 100644 index 21b7032..0000000 --- a/rdoc/classes/OpenTox.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Module: OpenTox - - - - - - - - - - -
- - - - - - - - - - -
ModuleOpenTox
In: - - lib/opentox-ruby-api-wrapper.rb - -
-
-
- - -
- - - -
- - - -
- - -
- - - - -
- -
-

Classes and Modules

- - Class OpenTox::Compound
-Class OpenTox::Dataset
-Class OpenTox::Feature
-Class OpenTox::Fminer
-Class OpenTox::OpenTox
- -
- - - - - - - - - - -
- - - - - - \ No newline at end of file diff --git a/rdoc/classes/OpenTox/Compound.html b/rdoc/classes/OpenTox/Compound.html deleted file mode 100644 index c892d0e..0000000 --- a/rdoc/classes/OpenTox/Compound.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - Class: OpenTox::Compound - - - - - - - - - - -
- - - - - - - - - - - - - - -
ClassOpenTox::Compound
In: - - lib/opentox-ruby-api-wrapper.rb - -
-
Parent: - - OpenTox - -
-
- - -
- - - -
- - - -
- -
-

Methods

- -
- match   - match?   - new   - smiles   -
-
- -
- - - - -
- - - - - - - - - -
-

Public Class methods

- -
- - - - -
-

-Initialize with :uri => uri, :smiles => smiles or :name => name -(name can be also an InChI/InChiKey, CAS number, etc) -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 18
-                def initialize(params)
-                        if params[:uri]
-                                @uri = params[:uri].to_s
-                        elsif params[:smiles]
-                                @uri = RestClient.post ENV['OPENTOX_COMPOUNDS'] ,:smiles => uri_escape(params[:smiles])
-                        elsif params[:name]
-                                @uri = RestClient.post ENV['OPENTOX_COMPOUNDS'] ,:name => uri_escape(params[:name])
-                        end
-                end
-
-
-
-
- -

Public Instance methods

- -
- - - - -
-

-Match an array of smarts features, returns matching features -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 43
-                def match(smarts_features)
-                        smarts_features.collect{ |smarts| smarts if self.match?(smarts.name) }.compact
-                end
-
-
-
-
- -
- - - - -
-

-Matchs a smarts string -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 34
-                def match?(smarts)
-                        if RestClient.get(@uri + '/match/' + uri_escape(smarts)) == 'true'
-                                true
-                        else
-                                false
-                        end
-                end
-
-
-
-
- -
- - - - -
-

-Get the (canonical) smiles -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 29
-                def smiles
-                        RestClient.get @uri
-                end
-
-
-
-
- - -
- - -
- - - - - - \ No newline at end of file diff --git a/rdoc/classes/OpenTox/Dataset.html b/rdoc/classes/OpenTox/Dataset.html deleted file mode 100644 index f6966f7..0000000 --- a/rdoc/classes/OpenTox/Dataset.html +++ /dev/null @@ -1,331 +0,0 @@ - - - - - - Class: OpenTox::Dataset - - - - - - - - - - -
- - - - - - - - - - - - - - -
ClassOpenTox::Dataset
In: - - lib/opentox-ruby-api-wrapper.rb - -
-
Parent: - - OpenTox - -
-
- - -
- - - -
- - - -
- -
-

Methods

- -
- add   - all_compounds_and_features   - all_features   - compounds   - features   - name   - new   -
-
- -
- - - - -
- - - - - - - - - -
-

Public Class methods

- -
- - - - -
-

-Initialize with :uri => uri or :name => name (creates a new dataset) -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 78
-                def initialize(params)
-                        if params[:uri]
-                                @uri = params[:uri].to_s
-                        elsif params[:name] 
-                                @uri = RestClient.post ENV['OPENTOX_DATASETS'], :name => params[:name]
-                                RestClient.delete @uri + '/associations'
-                        end
-                end
-
-
-
-
- -

Public Instance methods

- -
- - - - -
-

-Add a compound and a feature to a dataset -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 118
-                def add(compound,feature)
-                        RestClient.put @uri, :compound_uri => compound.uri, :feature_uri => feature.uri
-                end
-
-
-
-
- -
- - - - -
-

-Get all compounds and features from a dataset, returns a hash -with compound_uris as keys and arrays of features as values -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 98
-                def all_compounds_and_features
-                        compounds = {}
-                        Crack::XML.parse(RestClient.get @uri + '/compounds/features')['dataset']['compound'].each do |c|
-                                features = c['feature_uri'].collect{ |f| Feature.new :uri => f }
-                                compounds[c['uri']] = features
-                        end
-                        compounds
-                end
-
-
-
-
- -
- - - - -
-

-Get all features from a dataset -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 108
-                def all_features
-                        RestClient.get(@uri + '/features').split("\n").collect{|f| Feature.new(:uri => f)}
-                end
-
-
-
-
- -
- - - - -
-

-Get all compounds from a dataset -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 93
-                def compounds
-                        RestClient.get(@uri + '/compounds').split("\n").collect{ |c| Compound.new(:uri => c) }
-                end
-
-
-
-
- -
- - - - -
-

-Get all features for a compound -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 113
-                def features(compound)
-                        RestClient.get(@uri + '/compound/' + uri_escape(compound.uri) + '/features').split("\n").collect{|f| Feature.new(:uri => f) }
-                end
-
-
-
-
- -
- - - - -
-

-Get the dataset name -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 88
-                def name
-                        RestClient.get @uri + '/name'
-                end
-
-
-
-
- - -
- - -
- - - - - - \ No newline at end of file diff --git a/rdoc/classes/OpenTox/Feature.html b/rdoc/classes/OpenTox/Feature.html deleted file mode 100644 index 5e53a12..0000000 --- a/rdoc/classes/OpenTox/Feature.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - Class: OpenTox::Feature - - - - - - - - - - -
- - - - - - - - - - - - - - -
ClassOpenTox::Feature
In: - - lib/opentox-ruby-api-wrapper.rb - -
-
Parent: - - OpenTox - -
-
- - -
- - - -
- - - -
- -
-

Methods

- -
- name   - new   - value   -
-
- -
- - - - -
- - - - - - - - - -
-

Public Class methods

- -
- - - - -
-

-Initialize with :uri => uri, or :name => name, :values => -hash_of_property_names_and_values -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 52
-                def initialize(params)
-                        if params[:uri]
-                                @uri = params[:uri].to_s
-                        else
-                                @uri = ENV['OPENTOX_FEATURES'] + uri_escape(params[:name]) 
-                                params[:values].each do |k,v|
-                                        @uri += '/' + k.to_s + '/' + v.to_s
-                                end
-                        end
-                end
-
-
-
-
- -

Public Instance methods

- -
- - - - -
-

-Get the name of the feature -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 69
-                def name
-                        RestClient.get @uri + '/name'
-                end
-
-
-
-
- -
- - - - -
-

-Get the value of a property -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 64
-                def value(property)
-                        RestClient.get @uri + '/' + property
-                end
-
-
-
-
- - -
- - -
- - - - - - \ No newline at end of file diff --git a/rdoc/classes/OpenTox/Fminer.html b/rdoc/classes/OpenTox/Fminer.html deleted file mode 100644 index 6c3b4fe..0000000 --- a/rdoc/classes/OpenTox/Fminer.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - Class: OpenTox::Fminer - - - - - - - - - - -
- - - - - - - - - - - - - - -
ClassOpenTox::Fminer
In: - - lib/opentox-ruby-api-wrapper.rb - -
-
Parent: - - OpenTox - -
-
- - -
- - - -
- - - -
- -
-

Methods

- -
- dataset   - new   -
-
- -
- - - - -
- - - - - - - - - -
-

Public Class methods

- -
- - - - -
-

-Create a new dataset with BBRC features -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 127
-                def initialize(training_dataset)
-                        @dataset_uri = RestClient.post ENV['OPENTOX_FMINER'], :dataset_uri => training_dataset.uri
-                end
-
-
-
-
- -

Public Instance methods

- -
- - - - -
-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 131
-                def dataset
-                        Dataset.new(:uri => @dataset_uri)
-                end
-
-
-
-
- - -
- - -
- - - - - - \ No newline at end of file diff --git a/rdoc/classes/OpenTox/OpenTox.html b/rdoc/classes/OpenTox/OpenTox.html deleted file mode 100644 index 35611f8..0000000 --- a/rdoc/classes/OpenTox/OpenTox.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - Class: OpenTox::OpenTox - - - - - - - - - - -
- - - - - - - - - - - - - - -
ClassOpenTox::OpenTox
In: - - lib/opentox-ruby-api-wrapper.rb - -
-
Parent: - Object -
-
- - -
- - - -
- - - -
- -
-

Methods

- -
- uri_escape   -
-
- -
- - - - -
- - - - - -
-

Attributes

- -
- - - - - - -
uri [R] 
-
-
- - - - -
-

Public Instance methods

- -
- - - - -
-

-Escape all nonword characters -

-

[Source]

-
-
-# File lib/opentox-ruby-api-wrapper.rb, line 10
-                def uri_escape(string)
-                        URI.escape(string, /[^\w]/)
-                end
-
-
-
-
- - -
- - -
- - - - - - \ No newline at end of file diff --git a/rdoc/created.rid b/rdoc/created.rid deleted file mode 100644 index 8dc2058..0000000 --- a/rdoc/created.rid +++ /dev/null @@ -1 +0,0 @@ -Thu, 13 Aug 2009 11:01:58 +0200 diff --git a/rdoc/files/README_rdoc.html b/rdoc/files/README_rdoc.html deleted file mode 100644 index 3342971..0000000 --- a/rdoc/files/README_rdoc.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - File: README.rdoc - - - - - - - - - - -
-

README.rdoc

- - - - - - - - - -
Path:README.rdoc -
Last Update:Thu Aug 13 11:00:51 +0200 2009
-
- - -
- - - -
- -
-

opentox-ruby-api-wrapper

-

-Ruby wrapper for the OpenTox REST API -(www.opentox.org) -

-

Installation

-

-Run the following if you haven‘t already: -

-
-        gem sources -a http://gems.github.com
-
-

-Install the gem: -

-
-        sudo gem install helma-opentox-ruby-api-wrapper
-
-

Usage

-
    -
  • set the environment variables OPENTOX_COMPOUNDS, OPENTOX_FEATURES, -OPENTOX_DATASETS, OPENTOX_FMINER to the base URI of the OpenTox REST webservices - -
  • -
  • require ‘opentox-ruby-api-wrapper’ in your ruby application - -
  • -
  • consult the API documentation for details - -
  • -
-

Copyright

-

-Copyright (c) 2009 Christoph Helma. See LICENSE for details. -

- -
- - -
- - -
- - - - -
- - - - - - - - - - - -
- - - - - - \ No newline at end of file diff --git a/rdoc/files/lib/opentox-ruby-api-wrapper_rb.html b/rdoc/files/lib/opentox-ruby-api-wrapper_rb.html deleted file mode 100644 index be6ca28..0000000 --- a/rdoc/files/lib/opentox-ruby-api-wrapper_rb.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - File: opentox-ruby-api-wrapper.rb - - - - - - - - - - -
-

opentox-ruby-api-wrapper.rb

- - - - - - - - - -
Path:lib/opentox-ruby-api-wrapper.rb -
Last Update:Thu Aug 13 10:44:46 +0200 2009
-
- - -
- - - -
- - -
-

Required files

- -
- rest_client   - crack/xml   -
-
- -
- - -
- - - - -
- - - - - - - - - - - -
- - - - - - \ No newline at end of file diff --git a/rdoc/fr_class_index.html b/rdoc/fr_class_index.html deleted file mode 100644 index 7242f18..0000000 --- a/rdoc/fr_class_index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - Classes - - - - - - - - \ No newline at end of file diff --git a/rdoc/fr_file_index.html b/rdoc/fr_file_index.html deleted file mode 100644 index eac1d09..0000000 --- a/rdoc/fr_file_index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - Files - - - - - - - - \ No newline at end of file diff --git a/rdoc/fr_method_index.html b/rdoc/fr_method_index.html deleted file mode 100644 index 63abf5e..0000000 --- a/rdoc/fr_method_index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - Methods - - - - - - - - \ No newline at end of file diff --git a/rdoc/index.html b/rdoc/index.html deleted file mode 100644 index bb24624..0000000 --- a/rdoc/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - opentox-ruby-api-wrapper 0.1.0 - - - - - - - - - - - - \ No newline at end of file diff --git a/rdoc/rdoc-style.css b/rdoc/rdoc-style.css deleted file mode 100644 index 44c7b3d..0000000 --- a/rdoc/rdoc-style.css +++ /dev/null @@ -1,208 +0,0 @@ - -body { - font-family: Verdana,Arial,Helvetica,sans-serif; - font-size: 90%; - margin: 0; - margin-left: 40px; - padding: 0; - background: white; -} - -h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; } -h1 { font-size: 150%; } -h2,h3,h4 { margin-top: 1em; } - -a { background: #eef; color: #039; text-decoration: none; } -a:hover { background: #039; color: #eef; } - -/* Override the base stylesheet's Anchor inside a table cell */ -td > a { - background: transparent; - color: #039; - text-decoration: none; -} - -/* and inside a section title */ -.section-title > a { - background: transparent; - color: #eee; - text-decoration: none; -} - -/* === Structural elements =================================== */ - -div#index { - margin: 0; - margin-left: -40px; - padding: 0; - font-size: 90%; -} - - -div#index a { - margin-left: 0.7em; -} - -div#index .section-bar { - margin-left: 0px; - padding-left: 0.7em; - background: #ccc; - font-size: small; -} - - -div#classHeader, div#fileHeader { - width: auto; - color: white; - padding: 0.5em 1.5em 0.5em 1.5em; - margin: 0; - margin-left: -40px; - border-bottom: 3px solid #006; -} - -div#classHeader a, div#fileHeader a { - background: inherit; - color: white; -} - -div#classHeader td, div#fileHeader td { - background: inherit; - color: white; -} - - -div#fileHeader { - background: #057; -} - -div#classHeader { - background: #048; -} - - -.class-name-in-header { - font-size: 180%; - font-weight: bold; -} - - -div#bodyContent { - padding: 0 1.5em 0 1.5em; -} - -div#description { - padding: 0.5em 1.5em; - background: #efefef; - border: 1px dotted #999; -} - -div#description h1,h2,h3,h4,h5,h6 { - color: #125;; - background: transparent; -} - -div#validator-badges { - text-align: center; -} -div#validator-badges img { border: 0; } - -div#copyright { - color: #333; - background: #efefef; - font: 0.75em sans-serif; - margin-top: 5em; - margin-bottom: 0; - padding: 0.5em 2em; -} - - -/* === Classes =================================== */ - -table.header-table { - color: white; - font-size: small; -} - -.type-note { - font-size: small; - color: #DEDEDE; -} - -.xxsection-bar { - background: #eee; - color: #333; - padding: 3px; -} - -.section-bar { - color: #333; - border-bottom: 1px solid #999; - margin-left: -20px; -} - - -.section-title { - background: #79a; - color: #eee; - padding: 3px; - margin-top: 2em; - margin-left: -30px; - border: 1px solid #999; -} - -.top-aligned-row { vertical-align: top } -.bottom-aligned-row { vertical-align: bottom } - -/* --- Context section classes ----------------------- */ - -.context-row { } -.context-item-name { font-family: monospace; font-weight: bold; color: black; } -.context-item-value { font-size: small; color: #448; } -.context-item-desc { color: #333; padding-left: 2em; } - -/* --- Method classes -------------------------- */ -.method-detail { - background: #efefef; - padding: 0; - margin-top: 0.5em; - margin-bottom: 1em; - border: 1px dotted #ccc; -} -.method-heading { - color: black; - background: #ccc; - border-bottom: 1px solid #666; - padding: 0.2em 0.5em 0 0.5em; -} -.method-signature { color: black; background: inherit; } -.method-name { font-weight: bold; } -.method-args { font-style: italic; } -.method-description { padding: 0 0.5em 0 0.5em; } - -/* --- Source code sections -------------------- */ - -a.source-toggle { font-size: 90%; } -div.method-source-code { - background: #262626; - color: #ffdead; - margin: 1em; - padding: 0.5em; - border: 1px dashed #999; - overflow: hidden; -} - -div.method-source-code pre { color: #ffdead; overflow: hidden; } - -/* --- Ruby keyword styles --------------------- */ - -.standalone-code { background: #221111; color: #ffdead; overflow: hidden; } - -.ruby-constant { color: #7fffd4; background: transparent; } -.ruby-keyword { color: #00ffff; background: transparent; } -.ruby-ivar { color: #eedd82; background: transparent; } -.ruby-operator { color: #00ffee; background: transparent; } -.ruby-identifier { color: #ffdead; background: transparent; } -.ruby-node { color: #ffa07a; background: transparent; } -.ruby-comment { color: #b22222; font-weight: bold; background: transparent; } -.ruby-regexp { color: #ffa07a; background: transparent; } -.ruby-value { color: #7fffd4; background: transparent; } \ No newline at end of file -- cgit v1.2.3 From 89ab213095398f0001b368d8d82c99bebd6da78e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 13 Aug 2009 11:12:49 +0200 Subject: Regenerated gemspec for version 0.1.0 --- opentox-ruby-api-wrapper.gemspec | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 6efec64..59d2eb7 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -10,7 +10,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] s.date = %q{2009-08-13} - s.description = %q{} + s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.extra_rdoc_files = [ "LICENSE", @@ -25,20 +25,6 @@ Gem::Specification.new do |s| "VERSION", "lib/opentox-ruby-api-wrapper.rb", "opentox-ruby-api-wrapper.gemspec", - "rdoc/classes/OpenTox.html", - "rdoc/classes/OpenTox/Compound.html", - "rdoc/classes/OpenTox/Dataset.html", - "rdoc/classes/OpenTox/Feature.html", - "rdoc/classes/OpenTox/Fminer.html", - "rdoc/classes/OpenTox/OpenTox.html", - "rdoc/created.rid", - "rdoc/files/README_rdoc.html", - "rdoc/files/lib/opentox-ruby-api-wrapper_rb.html", - "rdoc/fr_class_index.html", - "rdoc/fr_file_index.html", - "rdoc/fr_method_index.html", - "rdoc/index.html", - "rdoc/rdoc-style.css", "test/opentox-ruby-api-wrapper_test.rb", "test/test_helper.rb" ] -- cgit v1.2.3 From d2f298ada82db479624b6b56269952e6cf4bb27a Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 14 Aug 2009 15:08:31 +0200 Subject: Version bump to 0.1.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6e8bf73..17e51c3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.0 +0.1.1 -- cgit v1.2.3 From 664599d8d38310c3e054084dc07f01ec8967c999 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 14 Aug 2009 15:10:05 +0200 Subject: post instead of put to submit to dataset --- lib/opentox-ruby-api-wrapper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 647b357..19b9e4a 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -116,7 +116,7 @@ module OpenTox # Add a compound and a feature to a dataset def add(compound,feature) - RestClient.put @uri, :compound_uri => compound.uri, :feature_uri => feature.uri + RestClient.post @uri, :compound_uri => compound.uri, :feature_uri => feature.uri end end -- cgit v1.2.3 From ac7b8b3f3a63e944af7e4c817077b3490d779bad Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 14 Aug 2009 15:10:11 +0200 Subject: Regenerated gemspec for version 0.1.1 --- opentox-ruby-api-wrapper.gemspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 59d2eb7..f9ca4de 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "0.1.0" + s.version = "0.1.1" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-08-13} + s.date = %q{2009-08-14} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.extra_rdoc_files = [ -- cgit v1.2.3 From e4ea099d7ea5e60453c4409bd821d829f4d16484 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 14 Aug 2009 16:22:04 +0200 Subject: Default environments added --- lib/opentox-ruby-api-wrapper.rb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 19b9e4a..168e24d 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,6 +1,11 @@ require 'rest_client' require 'crack/xml' +ENV['OPENTOX_COMPOUND'] = 'http://webservices.in-silico.ch/compound/v0/' unless ENV['OPENTOX_COMPOUND'] +ENV['OPENTOX_FEATURE'] = 'http://webservices.in-silico.ch/feature/v0/' unless ENV['OPENTOX_FEATURE'] +ENV['OPENTOX_DATASET'] = 'http://webservices.in-silico.ch/dataset/v0/' unless ENV['OPENTOX_DATASET'] +ENV['OPENTOX_FMINER'] = 'http://webservices.in-silico.ch/fminer/v0/' unless ENV['OPENTOX_FMINER'] + module OpenTox class OpenTox @@ -19,9 +24,9 @@ module OpenTox if params[:uri] @uri = params[:uri].to_s elsif params[:smiles] - @uri = RestClient.post ENV['OPENTOX_COMPOUNDS'] ,:smiles => uri_escape(params[:smiles]) + @uri = RestClient.post ENV['OPENTOX_COMPOUND'] ,:smiles => uri_escape(params[:smiles]) elsif params[:name] - @uri = RestClient.post ENV['OPENTOX_COMPOUNDS'] ,:name => uri_escape(params[:name]) + @uri = RestClient.post ENV['OPENTOX_COMPOUND'] ,:name => uri_escape(params[:name]) end end @@ -53,7 +58,7 @@ module OpenTox if params[:uri] @uri = params[:uri].to_s else - @uri = ENV['OPENTOX_FEATURES'] + uri_escape(params[:name]) + @uri = ENV['OPENTOX_FEATURE'] + uri_escape(params[:name]) params[:values].each do |k,v| @uri += '/' + k.to_s + '/' + v.to_s end @@ -79,7 +84,7 @@ module OpenTox if params[:uri] @uri = params[:uri].to_s elsif params[:name] - @uri = RestClient.post ENV['OPENTOX_DATASETS'], :name => params[:name] + @uri = RestClient.post ENV['OPENTOX_DATASET'], :name => params[:name] RestClient.delete @uri + '/associations' end end -- cgit v1.2.3 From 75bc3d65bc9922649e0cda3d36ff0b82e5c6284b Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 14 Aug 2009 16:23:00 +0200 Subject: Version bump to 0.1.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 17e51c3..d917d3e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.1 +0.1.2 -- cgit v1.2.3 From 021ac7d2be705f4979e1e675aa675caaf2079e51 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 14 Aug 2009 16:24:28 +0200 Subject: Regenerated gemspec for version 0.1.2 --- opentox-ruby-api-wrapper.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index f9ca4de..2ec1e85 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "0.1.1" + s.version = "0.1.2" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] -- cgit v1.2.3 From a040b7e6103f463527758d3c051e28c8b0f777b3 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 14 Aug 2009 17:36:51 +0200 Subject: Spork added from git://github.com/deadprogrammer/spork.git --- lib/opentox-ruby-api-wrapper.rb | 1 + lib/spork.rb | 81 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 lib/spork.rb diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 168e24d..70a4580 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,5 +1,6 @@ require 'rest_client' require 'crack/xml' +require 'spork' ENV['OPENTOX_COMPOUND'] = 'http://webservices.in-silico.ch/compound/v0/' unless ENV['OPENTOX_COMPOUND'] ENV['OPENTOX_FEATURE'] = 'http://webservices.in-silico.ch/feature/v0/' unless ENV['OPENTOX_FEATURE'] diff --git a/lib/spork.rb b/lib/spork.rb new file mode 100644 index 0000000..5b43281 --- /dev/null +++ b/lib/spork.rb @@ -0,0 +1,81 @@ +# A way to cleanly handle process forking in Sinatra when using Passenger, aka "sporking some code". +# This will allow you to properly execute some code asynchronously, which otherwise does not work correctly. +# +# Written by Ron Evans +# More info at http://deadprogrammersociety.com +# +# Mostly lifted from the Spawn plugin for Rails (http://github.com/tra/spawn) +# but with all of the Rails stuff removed.... cause you are using Sinatra. If you are using Rails, Spawn is +# what you need. If you are using something else besides Sinatra that is Rack-based under Passenger, and you are having trouble with +# asynch processing, let me know if spork helped you. +# +module Spork + # things to close in child process + @@resources = [] + def self.resources + @@resources + end + + # set the resource to disconnect from in the child process (when forking) + def self.resource_to_close(resource) + @@resources << resource + end + + # close all the resources added by calls to resource_to_close + def self.close_resources + @@resources.each do |resource| + resource.close if resource && resource.respond_to?(:close) && !resource.closed? + end + @@resources = [] + end + + # actually perform the fork... er, spork + # valid options are: + # :priority => to set the process priority of the child + # :logger => a logger object to use from the child + # :no_detach => true if you want to keep the child process under the parent control. usually you do NOT want this + def self.spork(options={}) + logger = options[:logger] + logger.debug "spork> parent PID = #{Process.pid}" if logger + child = fork do + begin + start = Time.now + logger.debug "spork> child PID = #{Process.pid}" if logger + + # set the nice priority if needed + Process.setpriority(Process::PRIO_PROCESS, 0, options[:priority]) if options[:priority] + + # disconnect from the rack + Spork.close_resources + + # run the block of code that takes so long + yield + + rescue => ex + logger.error "spork> Exception in child[#{Process.pid}] - #{ex.class}: #{ex.message}" if logger + ensure + logger.info "spork> child[#{Process.pid}] took #{Time.now - start} sec" if logger + # this form of exit doesn't call at_exit handlers + exit!(0) + end + end + + # detach from child process (parent may still wait for detached process if they wish) + Process.detach(child) unless options[:no_detach] + + return child + end + +end + +# Patch to work with passenger +if defined? Passenger::Rack::RequestHandler + class Passenger::Rack::RequestHandler + alias_method :orig_process_request, :process_request + def process_request(env, input, output) + Spork.resource_to_close(input) + Spork.resource_to_close(output) + orig_process_request(env, input, output) + end + end +end -- cgit v1.2.3 From ded28a603c6d0f2db411c6e675f0e3f0ce068b09 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 14 Aug 2009 17:37:42 +0200 Subject: Version bump to 0.1.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d917d3e..b1e80bb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.2 +0.1.3 -- cgit v1.2.3 From 5fa17bdd34f93e3449ddbc822557dfa7c528879d Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 14 Aug 2009 17:37:54 +0200 Subject: Regenerated gemspec for version 0.1.3 --- opentox-ruby-api-wrapper.gemspec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 2ec1e85..e9883b8 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "0.1.2" + s.version = "0.1.3" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] @@ -24,6 +24,7 @@ Gem::Specification.new do |s| "Rakefile", "VERSION", "lib/opentox-ruby-api-wrapper.rb", + "lib/spork.rb", "opentox-ruby-api-wrapper.gemspec", "test/opentox-ruby-api-wrapper_test.rb", "test/test_helper.rb" -- cgit v1.2.3 From 75d79c2f6556b466898e40049058199fabfe6dd2 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 15 Aug 2009 13:43:12 +0200 Subject: Version bump to 0.1.4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index b1e80bb..845639e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.3 +0.1.4 -- cgit v1.2.3 From 5bf99a0df4e24aef86681814951a9a8c08f5a1e6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 15 Aug 2009 13:45:32 +0200 Subject: authentification helper added, lazar object added --- lib/helper.rb | 26 ++++++++++++++++++++++++++ lib/opentox-ruby-api-wrapper.rb | 22 ++++++++++++++++++---- 2 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 lib/helper.rb diff --git a/lib/helper.rb b/lib/helper.rb new file mode 100644 index 0000000..a9f451e --- /dev/null +++ b/lib/helper.rb @@ -0,0 +1,26 @@ +helpers do + + # Authentification + def protected! + response['WWW-Authenticate'] = %(Basic realm="Testing HTTP Auth") and \ + throw(:halt, [401, "Not authorized\n"]) and \ + return unless authorized? + end + + def authorized? + @auth ||= Rack::Auth::Basic::Request.new(request.env) + @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ['api', API_KEY] + end + + +=begin + def xml(object) + builder do |xml| + xml.instruct! + object.to_xml + end + end +=end + +end + diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 70a4580..8e4e28e 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,11 +1,12 @@ -require 'rest_client' -require 'crack/xml' -require 'spork' +[ 'rest_client', 'crack/xml', 'spork', 'helper' ].each do |lib| + require lib +end ENV['OPENTOX_COMPOUND'] = 'http://webservices.in-silico.ch/compound/v0/' unless ENV['OPENTOX_COMPOUND'] ENV['OPENTOX_FEATURE'] = 'http://webservices.in-silico.ch/feature/v0/' unless ENV['OPENTOX_FEATURE'] ENV['OPENTOX_DATASET'] = 'http://webservices.in-silico.ch/dataset/v0/' unless ENV['OPENTOX_DATASET'] ENV['OPENTOX_FMINER'] = 'http://webservices.in-silico.ch/fminer/v0/' unless ENV['OPENTOX_FMINER'] +ENV['OPENTOX_LAZAR'] = 'http://webservices.in-silico.ch/lazar/v0/' unless ENV['OPENTOX_LAZAR'] module OpenTox @@ -86,7 +87,6 @@ module OpenTox @uri = params[:uri].to_s elsif params[:name] @uri = RestClient.post ENV['OPENTOX_DATASET'], :name => params[:name] - RestClient.delete @uri + '/associations' end end @@ -140,4 +140,18 @@ module OpenTox end + class Lazar < OpenTox + + # Create a new prediction model from a dataset + def initialize(training_dataset) + @uri = RestClient.post ENV['OPENTOX_LAZAR'] + 'models/' , :dataset_uri => training_dataset.uri + end + + # Predict a compound + def predict(compound) + RestClient.post @uri, :compound_uri => compound.uri + end + + end + end -- cgit v1.2.3 From 82f7a9b1a639a8693c0b1267b6b280ee121d8f9a Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 15 Aug 2009 13:45:40 +0200 Subject: Regenerated gemspec for version 0.1.4 --- opentox-ruby-api-wrapper.gemspec | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index e9883b8..e6e30c4 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "0.1.3" + s.version = "0.1.4" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-08-14} + s.date = %q{2009-08-15} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.extra_rdoc_files = [ @@ -23,6 +23,7 @@ Gem::Specification.new do |s| "README.rdoc", "Rakefile", "VERSION", + "lib/helper.rb", "lib/opentox-ruby-api-wrapper.rb", "lib/spork.rb", "opentox-ruby-api-wrapper.gemspec", -- cgit v1.2.3 From bb2614a3cb7720f906c9d853e0dc1f3713058005 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 15 Aug 2009 18:36:49 +0200 Subject: XML support removed, YAML expected for object serialization. --- Rakefile | 1 - lib/opentox-ruby-api-wrapper.rb | 19 ++++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Rakefile b/Rakefile index de8e703..72eebcf 100644 --- a/Rakefile +++ b/Rakefile @@ -11,7 +11,6 @@ begin gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] gem.add_dependency "rest-client" - gem.add_dependency "crack" gem.add_development_dependency "thoughtbot-shoulda" # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 8e4e28e..81a7292 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,4 +1,6 @@ -[ 'rest_client', 'crack/xml', 'spork', 'helper' ].each do |lib| + +#['rubygems', 'rest_client', 'spork', 'helper' ].each do |lib| +['rubygems', 'rest_client', 'spork' ].each do |lib| require lib end @@ -102,12 +104,7 @@ module OpenTox # Get all compounds and features from a dataset, returns a hash with compound_uris as keys and arrays of features as values def all_compounds_and_features - compounds = {} - Crack::XML.parse(RestClient.get @uri + '/compounds/features')['dataset']['compound'].each do |c| - features = c['feature_uri'].collect{ |f| Feature.new :uri => f } - compounds[c['uri']] = features - end - compounds + YAML.load(RestClient.get(@uri + '/compounds/features')) end # Get all features from a dataset @@ -143,8 +140,12 @@ module OpenTox class Lazar < OpenTox # Create a new prediction model from a dataset - def initialize(training_dataset) - @uri = RestClient.post ENV['OPENTOX_LAZAR'] + 'models/' , :dataset_uri => training_dataset.uri + def initialize(params) + if params[:uri] + @uri = params[:uri] + elsif params[:dataset_ur] + @uri = RestClient.post ENV['OPENTOX_LAZAR'] + 'models/' , :dataset_uri => training_dataset.uri + end end # Predict a compound -- cgit v1.2.3 From 54de12dbd9f3419432cd3239374499dd1c08504b Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 15 Aug 2009 18:37:10 +0200 Subject: Version bump to 0.1.5 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 845639e..9faa1b7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.4 +0.1.5 -- cgit v1.2.3 From db581d732b97774bcd8726944778bf3c98667fdc Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 15 Aug 2009 18:37:22 +0200 Subject: Regenerated gemspec for version 0.1.5 --- opentox-ruby-api-wrapper.gemspec | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index e6e30c4..a583120 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "0.1.4" + s.version = "0.1.5" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] @@ -46,16 +46,13 @@ Gem::Specification.new do |s| if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end else s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From a5adc95d43368b976d33be3f00068bdd8e4d255c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 16 Aug 2009 19:02:00 +0200 Subject: intermediary commit --- Rakefile | 1 - lib/opentox-ruby-api-wrapper.rb | 31 ++++++++++--- opentox-ruby-api-wrapper.gemspec | 6 +-- test/hamster_carcinogenicity.csv | 85 +++++++++++++++++++++++++++++++++++ test/opentox-ruby-api-wrapper_test.rb | 63 ++++++++++++++++++++++++-- test/test_helper.rb | 2 +- 6 files changed, 174 insertions(+), 14 deletions(-) create mode 100644 test/hamster_carcinogenicity.csv diff --git a/Rakefile b/Rakefile index 72eebcf..5d13273 100644 --- a/Rakefile +++ b/Rakefile @@ -11,7 +11,6 @@ begin gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] gem.add_dependency "rest-client" - gem.add_development_dependency "thoughtbot-shoulda" # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end rescue LoadError diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 81a7292..001c9ac 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,4 +1,3 @@ - #['rubygems', 'rest_client', 'spork', 'helper' ].each do |lib| ['rubygems', 'rest_client', 'spork' ].each do |lib| require lib @@ -8,7 +7,7 @@ ENV['OPENTOX_COMPOUND'] = 'http://webservices.in-silico.ch/compound/v0/' unless ENV['OPENTOX_FEATURE'] = 'http://webservices.in-silico.ch/feature/v0/' unless ENV['OPENTOX_FEATURE'] ENV['OPENTOX_DATASET'] = 'http://webservices.in-silico.ch/dataset/v0/' unless ENV['OPENTOX_DATASET'] ENV['OPENTOX_FMINER'] = 'http://webservices.in-silico.ch/fminer/v0/' unless ENV['OPENTOX_FMINER'] -ENV['OPENTOX_LAZAR'] = 'http://webservices.in-silico.ch/lazar/v0/' unless ENV['OPENTOX_LAZAR'] +ENV['OPENTOX_LAZAR'] = 'http://webservices.in-silico.ch/lazar/v0/' unless ENV['OPENTOX_LAZAR'] module OpenTox @@ -19,6 +18,20 @@ module OpenTox def uri_escape(string) URI.escape(string, /[^\w]/) end + + def finished? + YAML.load(RestClient.get(@uri))[:finished] + end + + def finished + print "closing " + puts @uri + '/finished' + RestClient.post @uri + '/finished' + end + + def destroy + RestClient.delete @uri + end end class Compound < OpenTox @@ -87,11 +100,19 @@ module OpenTox def initialize(params) if params[:uri] @uri = params[:uri].to_s - elsif params[:name] + elsif params[:name] and params[:filename] + @uri = `curl -X POST -F file=@#{params[:filename]} -F name="#{params[:name]}" #{ENV['OPENTOX_DATASET']}` + elsif params[:name] @uri = RestClient.post ENV['OPENTOX_DATASET'], :name => params[:name] end end + def finished + print "closing " + puts @uri + '/finished' + RestClient.post(@uri + '/finished',nil) + end + # Get the dataset name def name RestClient.get @uri + '/name' @@ -143,8 +164,8 @@ module OpenTox def initialize(params) if params[:uri] @uri = params[:uri] - elsif params[:dataset_ur] - @uri = RestClient.post ENV['OPENTOX_LAZAR'] + 'models/' , :dataset_uri => training_dataset.uri + elsif params[:dataset_uri] + @uri = RestClient.post ENV['OPENTOX_LAZAR'] + 'models' , :dataset_uri => params[:dataset_uri] end end diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index a583120..0e5ab5e 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-08-15} + s.date = %q{2009-08-16} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.extra_rdoc_files = [ @@ -27,6 +27,7 @@ Gem::Specification.new do |s| "lib/opentox-ruby-api-wrapper.rb", "lib/spork.rb", "opentox-ruby-api-wrapper.gemspec", + "test/hamster_carcinogenicity.csv", "test/opentox-ruby-api-wrapper_test.rb", "test/test_helper.rb" ] @@ -46,13 +47,10 @@ Gem::Specification.new do |s| if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) end else s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) end end diff --git a/test/hamster_carcinogenicity.csv b/test/hamster_carcinogenicity.csv new file mode 100644 index 0000000..009808f --- /dev/null +++ b/test/hamster_carcinogenicity.csv @@ -0,0 +1,85 @@ +CC=O,true +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,true +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,true +C1(N=CNN=1)N,false +Br(=O)(=O)[O-].[K+],true +[Cl-].[Cd+2].[Cl-],false +O=S(=O)([O-])[O-].[Cd+2],false +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,false +ClCOC,true +C=C(Cl)C=C,false +Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,false +O=C1OC2=C(C=CC=C2)C=C1,false +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,true +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,false +C=CCN(CC=C)N=O,true +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,false +O=C(N(C)C)Cl,true +CN(C)N,true +N(NC)C.[H]Cl.[H]Cl,true +CCO,false +O=C(N(CC)N=O)NCCO,true +O=C(N(CC)N=O)NCC(=O)C,true +C=O,false +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,true +O=CC1=CC=CO1,false +OCC1CO1,true +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,false +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,true +NN,true +OS(=O)(=O)O.NN,true +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,true +OCCNN,false +O=C(C1=CC=NC=C1)NN,false +OC(=O)C1=CC=NC=C1,false +O=C(NC1=CC=CC(=C1)Cl)OC(C)C,false +O=C(NC1=CC=CC=C1)OC(C)C,false +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],false +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,false +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,false +CN(N)C=O,true +O=C(C(=C)C)OC,false +CNN,true +O=C(C1=CC=CN=C1)CCCN(N=O)C,false +CC1=CC(=O)NC(=S)N1,true +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,false +O=N[O-].[Na+],false +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,true +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,true +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],false +N(CC(CO)O)(CC(O)C)N=O,true +N(CC(CO)O)(CC(C)=O)N=O,true +N(CC(CO)O)(CCO)N=O,false +O=C(C)CN(N=O)CCO,true +C1C(N(C(CN1N=O)C)C)C,true +N(CC(C)=O)(CC=C)N=O,true +N(CC(CO)O)(C)N=O,true +O=NN1CCOCC1,true +N1C=CC=C(C=1)C2N(N=O)CCC2,true +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,false +O=NN1CCCCC1,true +O=NN1CCCC1,true +O=C(N(CC(C)=O)N=O)NCCCl,true +N(C(=O)N)(N=O)CC(C)=O,true +C1(CCN=C=S)=CC=CC=C1,false +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,false +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,false +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,false +C1(=CC(=C(O)C=C1)O)C(O)=O,false +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,false +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,false +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,false +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,false +ClC(=CCl)Cl,false +NC(=O)OCC,true +C=CCl,true +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,false +C1(CN(CC(N1N=O)C)N=O)C,true +N(CCN(C)C)(C)N=O,true +C1(CN(N=O)CC(O1)C)C,true +O1C(N(CC1C)N=O)=O,true +CCOC(=O)N(C)N=O,true +C1N(COC1)N=O,true +O=C(N(CCC1=CC=CC=C1)N=O)N,true +O=NN1CCC1,true +F[B-](F)(F)F.[Na+],false diff --git a/test/opentox-ruby-api-wrapper_test.rb b/test/opentox-ruby-api-wrapper_test.rb index 6f7f82e..256a06a 100644 --- a/test/opentox-ruby-api-wrapper_test.rb +++ b/test/opentox-ruby-api-wrapper_test.rb @@ -1,7 +1,64 @@ require 'test_helper' class OpentoxRubyApiWrapperTest < Test::Unit::TestCase - should "probably rename this file and start testing for real" do - flunk "hey buddy, you should probably rename this file and start testing for real" - end + + def setup + @pids = [] + port = 5000 + [ "opentox-compound", "opentox-feature" , "opentox-dataset" , "opentox-fminer" , "opentox-lazar" ].each do |component| + ENV[component.upcase.gsub(/-/,'_')] = "http://localhost:#{port}/" +=begin + Dir.chdir ENV['HOME'] + '/webservices/' + component + Dir["test.sqlite3"].each { |f| FileUtils.rm_rf(f) } + file = 'application.rb' + @pids << fork {`urxvt -title #{component} -e thin --debug --rackup config.ru start -p #{port} -e test`} + Process.detach(@pids.last) +=end + port += 1 + end + end + +=begin + def teardown + @pids.each do |pid| + begin + Process.kill(9,pid) + puts "killed " + pid.to_s + rescue + puts "failed to kill process" + pid.to_s + end + end + end +=end + + def test_create_dataset_and_model_and_make_a_prediction + #sleep 15 + dataset = OpenTox::Dataset.new :name => "Hamster Carcinogenicity", :filename => "test/hamster_carcinogenicity.csv" + puts dataset.uri + wait_for_completion dataset + assert_match(/#{ENV['OPENTOX_DATASET']}\d+$/,dataset.uri) + assert_equal("Hamster Carcinogenicity",dataset.name) + lazar = OpenTox::Lazar.new :dataset_uri => dataset.uri + puts lazar.uri + wait_for_completion lazar + assert_match(/#{ENV['OPENTOX_LAZAR']}model\/\d+$/,lazar.uri) + query_structure = OpenTox::Compound.new :smiles => 'c1ccccc1NN' + prediction = lazar.predict query_structure + puts prediction.uri + wait_for_completion prediction + puts prediction.to_yaml + assert_equal(true, prediction.classification) + assert_match(/\d+/, prediction.classification) + end + +end + +def wait_for_completion(object) + timeout = 60 + time = 0 + while (!object.finished? and time < timeout) + sleep 1 + time += 1 + end + puts "timeout" if timeout >= 60 end diff --git a/test/test_helper.rb b/test/test_helper.rb index 837ad16..4911cf4 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,9 +1,9 @@ require 'rubygems' require 'test/unit' -require 'shoulda' $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) $LOAD_PATH.unshift(File.dirname(__FILE__)) + require 'opentox-ruby-api-wrapper' class Test::Unit::TestCase -- cgit v1.2.3 From e5b63460933112573a4e5ed1f2825c9267370ce0 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 17 Aug 2009 11:04:41 +0200 Subject: lazar prediction class added, tests finished --- lib/opentox-ruby-api-wrapper.rb | 70 ++++++++++++++++++++++------------- test/opentox-ruby-api-wrapper_test.rb | 46 +++++++---------------- test/start-local-webservices.rb | 13 +++++++ 3 files changed, 71 insertions(+), 58 deletions(-) create mode 100755 test/start-local-webservices.rb diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 001c9ac..3f9d739 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -19,19 +19,21 @@ module OpenTox URI.escape(string, /[^\w]/) end + # Returns true if object creation has finished (for asynchronous processes) def finished? YAML.load(RestClient.get(@uri))[:finished] end - def finished - print "closing " - puts @uri + '/finished' - RestClient.post @uri + '/finished' + # Get the object name + def name + RestClient.get @uri + '/name' end + # Deletes an object def destroy RestClient.delete @uri end + end class Compound < OpenTox @@ -87,11 +89,6 @@ module OpenTox RestClient.get @uri + '/' + property end - # Get the name of the feature - def name - RestClient.get @uri + '/name' - end - end class Dataset < OpenTox @@ -102,29 +99,18 @@ module OpenTox @uri = params[:uri].to_s elsif params[:name] and params[:filename] @uri = `curl -X POST -F file=@#{params[:filename]} -F name="#{params[:name]}" #{ENV['OPENTOX_DATASET']}` - elsif params[:name] - @uri = RestClient.post ENV['OPENTOX_DATASET'], :name => params[:name] + elsif params[:name] + @uri = RestClient.post ENV['OPENTOX_DATASET'], :name => params[:name], :data => params[:data].to_yaml end end - def finished - print "closing " - puts @uri + '/finished' - RestClient.post(@uri + '/finished',nil) - end - - # Get the dataset name - def name - RestClient.get @uri + '/name' - end - # Get all compounds from a dataset def compounds RestClient.get(@uri + '/compounds').split("\n").collect{ |c| Compound.new(:uri => c) } end - # Get all compounds and features from a dataset, returns a hash with compound_uris as keys and arrays of features as values - def all_compounds_and_features + # Get all compounds and features from a dataset, returns a hash with compound_uris as keys and arrays of feature_uris as values + def all_compounds_and_features_uris YAML.load(RestClient.get(@uri + '/compounds/features')) end @@ -140,7 +126,13 @@ module OpenTox # Add a compound and a feature to a dataset def add(compound,feature) - RestClient.post @uri, :compound_uri => compound.uri, :feature_uri => feature.uri + RestClient.put @uri, :compound_uri => compound.uri, :feature_uri => feature.uri + end + + # Tell the dataset that it is complete + def close + puts @uri + '/finished' + RestClient.put @uri + '/finished', nil end end @@ -171,7 +163,33 @@ module OpenTox # Predict a compound def predict(compound) - RestClient.post @uri, :compound_uri => compound.uri + LazarPrediction.new(:uri => RestClient.post(@uri, :compound_uri => compound.uri)) + end + + end + + class LazarPrediction < OpenTox + + def initialize(params) + if params[:uri] + @uri = params[:uri] + end + end + + def classification + YAML.load(RestClient.get @uri)[:classification] + end + + def confidence + YAML.load(RestClient.get @uri)[:confidence] + end + + def neighbors + RestClient.get @uri + '/neighbors' + end + + def features + RestClient.get @uri + '/features' end end diff --git a/test/opentox-ruby-api-wrapper_test.rb b/test/opentox-ruby-api-wrapper_test.rb index 256a06a..6b09c4a 100644 --- a/test/opentox-ruby-api-wrapper_test.rb +++ b/test/opentox-ruby-api-wrapper_test.rb @@ -3,62 +3,44 @@ require 'test_helper' class OpentoxRubyApiWrapperTest < Test::Unit::TestCase def setup - @pids = [] - port = 5000 - [ "opentox-compound", "opentox-feature" , "opentox-dataset" , "opentox-fminer" , "opentox-lazar" ].each do |component| - ENV[component.upcase.gsub(/-/,'_')] = "http://localhost:#{port}/" -=begin - Dir.chdir ENV['HOME'] + '/webservices/' + component - Dir["test.sqlite3"].each { |f| FileUtils.rm_rf(f) } - file = 'application.rb' - @pids << fork {`urxvt -title #{component} -e thin --debug --rackup config.ru start -p #{port} -e test`} - Process.detach(@pids.last) -=end - port += 1 - end - end - -=begin - def teardown - @pids.each do |pid| - begin - Process.kill(9,pid) - puts "killed " + pid.to_s - rescue - puts "failed to kill process" + pid.to_s + if ENV['LOCAL'] + port = 5000 + [ "opentox-compound", "opentox-feature" , "opentox-dataset" , "opentox-fminer" , "opentox-lazar" ].each do |component| + ENV[component.upcase.gsub(/-/,'_')] = "http://localhost:#{port}/" + port += 1 end end end -=end def test_create_dataset_and_model_and_make_a_prediction - #sleep 15 dataset = OpenTox::Dataset.new :name => "Hamster Carcinogenicity", :filename => "test/hamster_carcinogenicity.csv" puts dataset.uri wait_for_completion dataset assert_match(/#{ENV['OPENTOX_DATASET']}\d+$/,dataset.uri) assert_equal("Hamster Carcinogenicity",dataset.name) + assert_equal(true,dataset.finished?) lazar = OpenTox::Lazar.new :dataset_uri => dataset.uri puts lazar.uri wait_for_completion lazar + assert_equal(true,lazar.finished?) assert_match(/#{ENV['OPENTOX_LAZAR']}model\/\d+$/,lazar.uri) query_structure = OpenTox::Compound.new :smiles => 'c1ccccc1NN' + puts query_structure.uri prediction = lazar.predict query_structure puts prediction.uri wait_for_completion prediction - puts prediction.to_yaml + puts prediction.classification + puts prediction.confidence + puts prediction.neighbors + puts prediction.features assert_equal(true, prediction.classification) - assert_match(/\d+/, prediction.classification) + assert_match(/0\.\d+/, prediction.confidence.to_s) end end def wait_for_completion(object) - timeout = 60 - time = 0 - while (!object.finished? and time < timeout) + while (!object.finished?) sleep 1 - time += 1 end - puts "timeout" if timeout >= 60 end diff --git a/test/start-local-webservices.rb b/test/start-local-webservices.rb new file mode 100755 index 0000000..66dea29 --- /dev/null +++ b/test/start-local-webservices.rb @@ -0,0 +1,13 @@ +#!/usr/bin/env ruby +require 'fileutils' + +port = 5000 +[ "opentox-compound", "opentox-feature" , "opentox-dataset" , "opentox-fminer" , "opentox-lazar" ].each do |component| + ENV[component.upcase.gsub(/-/,'_')] = "http://localhost:#{port}/" + Dir.chdir ENV['HOME'] + '/webservices/' + component + Dir["test.sqlite3"].each { |f| FileUtils.rm_rf(f) } + file = 'application.rb' + pid = fork {`urxvt -title #{component} -e thin --debug --rackup config.ru start -p #{port} -e test`} + Process.detach(pid) + port += 1 +end -- cgit v1.2.3 From 8367b4a5dd554413282a55a1fbf717ef3d93a605 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 17 Aug 2009 11:05:05 +0200 Subject: Version bump to 0.2.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9faa1b7..0ea3a94 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.5 +0.2.0 -- cgit v1.2.3 From ed70223abf4ead192139c1c59fbb5547625472df Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 17 Aug 2009 11:06:16 +0200 Subject: Regenerated gemspec for version 0.2.0 --- opentox-ruby-api-wrapper.gemspec | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 0e5ab5e..8c95cb9 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "0.1.5" + s.version = "0.2.0" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-08-16} + s.date = %q{2009-08-17} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.extra_rdoc_files = [ @@ -29,6 +29,7 @@ Gem::Specification.new do |s| "opentox-ruby-api-wrapper.gemspec", "test/hamster_carcinogenicity.csv", "test/opentox-ruby-api-wrapper_test.rb", + "test/start-local-webservices.rb", "test/test_helper.rb" ] s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} @@ -38,7 +39,8 @@ Gem::Specification.new do |s| s.summary = %q{Ruby wrapper for the OpenTox REST API} s.test_files = [ "test/test_helper.rb", - "test/opentox-ruby-api-wrapper_test.rb" + "test/opentox-ruby-api-wrapper_test.rb", + "test/start-local-webservices.rb" ] if s.respond_to? :specification_version then -- cgit v1.2.3 From 8c8dfc8916cccbd57fa8fb405ddf212c90f96022 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 17 Aug 2009 11:42:31 +0200 Subject: dataset creation from name fixed --- lib/opentox-ruby-api-wrapper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 3f9d739..a27125b 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -100,7 +100,7 @@ module OpenTox elsif params[:name] and params[:filename] @uri = `curl -X POST -F file=@#{params[:filename]} -F name="#{params[:name]}" #{ENV['OPENTOX_DATASET']}` elsif params[:name] - @uri = RestClient.post ENV['OPENTOX_DATASET'], :name => params[:name], :data => params[:data].to_yaml + @uri = RestClient.post ENV['OPENTOX_DATASET'], :name => params[:name] end end -- cgit v1.2.3 From 0edc99e3cd007b378b26b6dca784461e3b7450fb Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 17 Aug 2009 11:43:09 +0200 Subject: Version bump to 0.2.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0ea3a94..0c62199 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.0 +0.2.1 -- cgit v1.2.3 From b107bb5dc168701bcc7173a766d6368a128a33aa Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 17 Aug 2009 11:43:15 +0200 Subject: Regenerated gemspec for version 0.2.1 --- opentox-ruby-api-wrapper.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 8c95cb9..3621873 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "0.2.0" + s.version = "0.2.1" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] -- cgit v1.2.3 From f2ca04688970f0fec0c472e9223ce9bd3a5516ff Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 17 Aug 2009 14:36:51 +0200 Subject: put parameter added for dataset.close --- lib/opentox-ruby-api-wrapper.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index a27125b..4a65697 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -131,8 +131,7 @@ module OpenTox # Tell the dataset that it is complete def close - puts @uri + '/finished' - RestClient.put @uri + '/finished', nil + RestClient.put @uri, :finished => 'true' end end -- cgit v1.2.3 From 3c7112436effe893efcbbf330b9e605d28556b26 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 17 Aug 2009 14:39:38 +0200 Subject: Version bump to 0.2.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0c62199..ee1372d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.1 +0.2.2 -- cgit v1.2.3 From 26c7176e39178797874460dd0fbe61cfeb360770 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 17 Aug 2009 14:39:45 +0200 Subject: Regenerated gemspec for version 0.2.2 --- opentox-ruby-api-wrapper.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 3621873..5118641 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "0.2.1" + s.version = "0.2.2" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] -- cgit v1.2.3 From d45ceec09ae23bfb8a20af625f216069cefa1b9e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 20 Aug 2009 17:05:00 +0200 Subject: Initial Rake tasks added --- Rakefile | 2 ++ lib/opentox-ruby-api-wrapper.rb | 1 - lib/tasks/opentox.rb | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 lib/tasks/opentox.rb diff --git a/Rakefile b/Rakefile index 5d13273..881e0b8 100644 --- a/Rakefile +++ b/Rakefile @@ -11,6 +11,8 @@ begin gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] gem.add_dependency "rest-client" + gem.files.include %w(lib/tasks/opentox.rb) + #gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end rescue LoadError diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 4a65697..db46149 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,4 +1,3 @@ -#['rubygems', 'rest_client', 'spork', 'helper' ].each do |lib| ['rubygems', 'rest_client', 'spork' ].each do |lib| require lib end diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb new file mode 100644 index 0000000..c44ceb6 --- /dev/null +++ b/lib/tasks/opentox.rb @@ -0,0 +1,15 @@ +desc "Install required gems" +task :install do + puts `sudo gem install #{@gems}` +end + +desc "Update gems" +task :update do + puts `sudo gem update #{@gems}` +end + +desc "Run tests" +task :test do + load 'test.rb' +end + -- cgit v1.2.3 From 2d935206eacec241a52713d1fe319cc78189d97d Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 21 Aug 2009 09:58:05 +0200 Subject: environment.rb and templates added --- Rakefile | 2 +- lib/environment.rb | 44 ++++++++++++++++++++++++++++++++++++++++ lib/opentox-ruby-api-wrapper.rb | 22 ++++++++------------ lib/tasks/opentox.rb | 29 +++++++++++++++----------- lib/templates/config.yaml | 13 ++++++++++++ opentox-ruby-api-wrapper.gemspec | 4 +++- 6 files changed, 86 insertions(+), 28 deletions(-) create mode 100644 lib/environment.rb create mode 100644 lib/templates/config.yaml diff --git a/Rakefile b/Rakefile index 881e0b8..87da98d 100644 --- a/Rakefile +++ b/Rakefile @@ -11,7 +11,7 @@ begin gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] gem.add_dependency "rest-client" - gem.files.include %w(lib/tasks/opentox.rb) + gem.files.include %w(lib/tasks/opentox.rb, lib/environment.rb, lib/templates/*) #gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end diff --git a/lib/environment.rb b/lib/environment.rb new file mode 100644 index 0000000..b22e8e5 --- /dev/null +++ b/lib/environment.rb @@ -0,0 +1,44 @@ +require 'yaml' +config_file = File.join(ENV['HOME'], '.opentox/config.yaml') + +if File.exist?(config_file) + config = YAML.load_file(config_file) +else + FileUtils.mkdir_p File.dirname(config_file) + FileUtils.cp(File.join(File.dirname(__FILE__), 'templates/config.yaml'), config_file) + puts "Please edit #{config_file} and restart your application." + exit +end + +puts config + +@environment = "development" unless @environment = ENV['OPENTOX'] +@config = config[@environment] + +port = 5000 +@services = {} +begin + `killall thin` if @environment == "development" +rescue +end +config["services"].each do |service| + dir = File.join(@config["base_dir"], service) + case @environment + when "development|test" + @services[dir] = "http://localhost:#{port}/" + Dir.chdir dir + `thin --debug --rackup config.ru start -p #{port} -e #{@environment} &` + #pid = fork {`urxvt -title #{service} -e thin --debug --rackup config.ru start -p #{port} -e development`} + #Process.detach(pid) + port += 1 + when "production" + @services[dir] = "http://#{@config['base_uri']}/#{service}/v#{major_version}/" + `touch #{File.join(dir,"tmp/restart.txt")}` + else + "Puts environment #{ENV['OPENTOX']} not supported." + end +end + +def major_version + File.open(File.join(File.dirname(__FILE__), '../VERSION')).each_line.first.split(/\./)[0] +end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index db46149..4ee6fd3 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,13 +1,7 @@ -['rubygems', 'rest_client', 'spork' ].each do |lib| +['rubygems', 'rest_client', 'spork', 'environment'].each do |lib| require lib end -ENV['OPENTOX_COMPOUND'] = 'http://webservices.in-silico.ch/compound/v0/' unless ENV['OPENTOX_COMPOUND'] -ENV['OPENTOX_FEATURE'] = 'http://webservices.in-silico.ch/feature/v0/' unless ENV['OPENTOX_FEATURE'] -ENV['OPENTOX_DATASET'] = 'http://webservices.in-silico.ch/dataset/v0/' unless ENV['OPENTOX_DATASET'] -ENV['OPENTOX_FMINER'] = 'http://webservices.in-silico.ch/fminer/v0/' unless ENV['OPENTOX_FMINER'] -ENV['OPENTOX_LAZAR'] = 'http://webservices.in-silico.ch/lazar/v0/' unless ENV['OPENTOX_LAZAR'] - module OpenTox class OpenTox @@ -42,9 +36,9 @@ module OpenTox if params[:uri] @uri = params[:uri].to_s elsif params[:smiles] - @uri = RestClient.post ENV['OPENTOX_COMPOUND'] ,:smiles => uri_escape(params[:smiles]) + @uri = RestClient.post @services['opentox-compound'] ,:smiles => uri_escape(params[:smiles]) elsif params[:name] - @uri = RestClient.post ENV['OPENTOX_COMPOUND'] ,:name => uri_escape(params[:name]) + @uri = RestClient.post @services['opentox-compound'] ,:name => uri_escape(params[:name]) end end @@ -76,7 +70,7 @@ module OpenTox if params[:uri] @uri = params[:uri].to_s else - @uri = ENV['OPENTOX_FEATURE'] + uri_escape(params[:name]) + @uri = @services['opentox-feature']+ uri_escape(params[:name]) params[:values].each do |k,v| @uri += '/' + k.to_s + '/' + v.to_s end @@ -97,9 +91,9 @@ module OpenTox if params[:uri] @uri = params[:uri].to_s elsif params[:name] and params[:filename] - @uri = `curl -X POST -F file=@#{params[:filename]} -F name="#{params[:name]}" #{ENV['OPENTOX_DATASET']}` + @uri = `curl -X POST -F file=@#{params[:filename]} -F name="#{params[:name]}" #{@services['opentox-dataset']}` elsif params[:name] - @uri = RestClient.post ENV['OPENTOX_DATASET'], :name => params[:name] + @uri = RestClient.post @services['opentox-dataset'], :name => params[:name] end end @@ -139,7 +133,7 @@ module OpenTox # Create a new dataset with BBRC features def initialize(training_dataset) - @dataset_uri = RestClient.post ENV['OPENTOX_FMINER'], :dataset_uri => training_dataset.uri + @dataset_uri = RestClient.post @services['opentox-fminer'], :dataset_uri => training_dataset.uri end def dataset @@ -155,7 +149,7 @@ module OpenTox if params[:uri] @uri = params[:uri] elsif params[:dataset_uri] - @uri = RestClient.post ENV['OPENTOX_LAZAR'] + 'models' , :dataset_uri => params[:dataset_uri] + @uri = RestClient.post @services['opentox-lazar']+ 'models' , :dataset_uri => params[:dataset_uri] end end diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb index c44ceb6..59fc16c 100644 --- a/lib/tasks/opentox.rb +++ b/lib/tasks/opentox.rb @@ -1,15 +1,20 @@ -desc "Install required gems" -task :install do - puts `sudo gem install #{@gems}` -end +require File.join(File.dirname(__FILE__), '../..', 'test/opentox-ruby-api-wrapper_test.rb') -desc "Update gems" -task :update do - puts `sudo gem update #{@gems}` -end +namespace :opentox do -desc "Run tests" -task :test do - load 'test.rb' -end + desc "Install required gems" + task :install do + puts `sudo gem install #{@gems}` + end + desc "Update gems" + task :update do + puts `sudo gem update #{@gems}` + end + + desc "Run tests" + task :test do + load 'test.rb' + end + +end diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml new file mode 100644 index 0000000..bae9dc6 --- /dev/null +++ b/lib/templates/config.yaml @@ -0,0 +1,13 @@ +development: + base_dir: ~/webservices + +production: + base_uri: webservices.in-silico.ch + base_dir: /var/www/webservices + +services: + - opentox-feature + - opentox-compound + - opentox-dataset + - opentox-fminer + - opentox-lazar diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 5118641..9d30d93 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-08-17} + s.date = %q{2009-08-21} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.extra_rdoc_files = [ @@ -26,6 +26,8 @@ Gem::Specification.new do |s| "lib/helper.rb", "lib/opentox-ruby-api-wrapper.rb", "lib/spork.rb", + "lib/tasks/opentox.rb", + "lib/templates/config.yaml", "opentox-ruby-api-wrapper.gemspec", "test/hamster_carcinogenicity.csv", "test/opentox-ruby-api-wrapper_test.rb", -- cgit v1.2.3 From 4d343f7c584ce09638005665b4ed2de718ff17a6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 25 Aug 2009 20:58:26 +0200 Subject: rake tasks to (re)start webservices added --- lib/environment.rb | 40 ++++--------------------- lib/opentox-ruby-api-wrapper.rb | 31 +++++++++---------- lib/tasks/opentox.rb | 56 ++++++++++++++++++++++++++++++++--- lib/templates/config.yaml | 11 ++----- opentox-ruby-api-wrapper.gemspec | 4 ++- test/opentox-ruby-api-wrapper_test.rb | 3 +- 6 files changed, 81 insertions(+), 64 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index b22e8e5..793fef9 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -1,8 +1,10 @@ -require 'yaml' -config_file = File.join(ENV['HOME'], '.opentox/config.yaml') +# load configuration +ENV['RACK_ENV'] = 'development' unless ENV['RACK_ENV'] + +config_file = File.join(ENV['HOME'], ".opentox/config/#{ENV['RACK_ENV']}.yaml") if File.exist?(config_file) - config = YAML.load_file(config_file) + @@config = YAML.load_file(config_file) else FileUtils.mkdir_p File.dirname(config_file) FileUtils.cp(File.join(File.dirname(__FILE__), 'templates/config.yaml'), config_file) @@ -10,35 +12,3 @@ else exit end -puts config - -@environment = "development" unless @environment = ENV['OPENTOX'] -@config = config[@environment] - -port = 5000 -@services = {} -begin - `killall thin` if @environment == "development" -rescue -end -config["services"].each do |service| - dir = File.join(@config["base_dir"], service) - case @environment - when "development|test" - @services[dir] = "http://localhost:#{port}/" - Dir.chdir dir - `thin --debug --rackup config.ru start -p #{port} -e #{@environment} &` - #pid = fork {`urxvt -title #{service} -e thin --debug --rackup config.ru start -p #{port} -e development`} - #Process.detach(pid) - port += 1 - when "production" - @services[dir] = "http://#{@config['base_uri']}/#{service}/v#{major_version}/" - `touch #{File.join(dir,"tmp/restart.txt")}` - else - "Puts environment #{ENV['OPENTOX']} not supported." - end -end - -def major_version - File.open(File.join(File.dirname(__FILE__), '../VERSION')).each_line.first.split(/\./)[0] -end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 4ee6fd3..d74b412 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,4 +1,4 @@ -['rubygems', 'rest_client', 'spork', 'environment'].each do |lib| +['rubygems', 'sinatra', 'sinatra/respond_to', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'spork', 'environment'].each do |lib| require lib end @@ -9,12 +9,8 @@ module OpenTox # Escape all nonword characters def uri_escape(string) - URI.escape(string, /[^\w]/) - end - - # Returns true if object creation has finished (for asynchronous processes) - def finished? - YAML.load(RestClient.get(@uri))[:finished] + #URI.escape(string, /[^\w]/) + URI.escape(string, /[^#{URI::PATTERN::UNRESERVED}]/) end # Get the object name @@ -36,9 +32,9 @@ module OpenTox if params[:uri] @uri = params[:uri].to_s elsif params[:smiles] - @uri = RestClient.post @services['opentox-compound'] ,:smiles => uri_escape(params[:smiles]) + @uri = RestClient.post @@config[:services]["opentox-compound"] ,:smiles => uri_escape(params[:smiles]) elsif params[:name] - @uri = RestClient.post @services['opentox-compound'] ,:name => uri_escape(params[:name]) + @uri = RestClient.post @@config[:services]["opentox-compound"] ,:name => uri_escape(params[:name]) end end @@ -47,6 +43,11 @@ module OpenTox RestClient.get @uri end + # Get the unique id (URI encoded canonical smiles) + def uid + RestClient.get @uri + '.uid' + end + # Matchs a smarts string def match?(smarts) if RestClient.get(@uri + '/match/' + uri_escape(smarts)) == 'true' @@ -70,7 +71,7 @@ module OpenTox if params[:uri] @uri = params[:uri].to_s else - @uri = @services['opentox-feature']+ uri_escape(params[:name]) + @uri = @@config[:services]["opentox-feature"] + uri_escape(params[:name]) params[:values].each do |k,v| @uri += '/' + k.to_s + '/' + v.to_s end @@ -91,9 +92,9 @@ module OpenTox if params[:uri] @uri = params[:uri].to_s elsif params[:name] and params[:filename] - @uri = `curl -X POST -F file=@#{params[:filename]} -F name="#{params[:name]}" #{@services['opentox-dataset']}` + @uri = `curl -X POST -F file=@#{params[:filename]} -F name="#{params[:name]}" #{@@config[:services]["opentox-dataset"]}` elsif params[:name] - @uri = RestClient.post @services['opentox-dataset'], :name => params[:name] + @uri = RestClient.post @@config[:services]["opentox-dataset"], :name => params[:name] end end @@ -104,7 +105,7 @@ module OpenTox # Get all compounds and features from a dataset, returns a hash with compound_uris as keys and arrays of feature_uris as values def all_compounds_and_features_uris - YAML.load(RestClient.get(@uri + '/compounds/features')) + YAML.load(RestClient.get(@uri + '/compounds/features.yaml')) end # Get all features from a dataset @@ -133,7 +134,7 @@ module OpenTox # Create a new dataset with BBRC features def initialize(training_dataset) - @dataset_uri = RestClient.post @services['opentox-fminer'], :dataset_uri => training_dataset.uri + @dataset_uri = RestClient.post @@config[:services]["opentox-fminer"], :dataset_uri => training_dataset.uri end def dataset @@ -149,7 +150,7 @@ module OpenTox if params[:uri] @uri = params[:uri] elsif params[:dataset_uri] - @uri = RestClient.post @services['opentox-lazar']+ 'models' , :dataset_uri => params[:dataset_uri] + @uri = RestClient.post @@config[:services]["opentox-lazar"] + 'models' , :dataset_uri => params[:dataset_uri] end end diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb index 59fc16c..6f1284f 100644 --- a/lib/tasks/opentox.rb +++ b/lib/tasks/opentox.rb @@ -1,4 +1,4 @@ -require File.join(File.dirname(__FILE__), '../..', 'test/opentox-ruby-api-wrapper_test.rb') +require "environment" namespace :opentox do @@ -12,9 +12,57 @@ namespace :opentox do puts `sudo gem update #{@gems}` end - desc "Run tests" - task :test do - load 'test.rb' + namespace :services do + + desc "Run opentox services" + task :start do + @@config[:services].each do |service,uri| + dir = File.join(@@config[:base_dir], service) + case @@config[:webserver] + when 'thin' + port = uri.sub(/^.*:/,'').sub(/\/$/,'') + Dir.chdir dir + begin + `thin --trace --rackup config.ru start -p #{port} -e #{ENV['RACK_ENV']} &` + puts "#{service} started on port #{port}." + rescue + puts "Cannot start #{service} on port #{port}." + end + when 'passenger' + puts "not yet implemented" + else + puts "not yet implemented" + end + end + end + + desc "Stop opentox services" + task :stop do + @@config[:services].each do |service,uri| + port = uri.sub(/^.*:/,'').sub(/\/$/,'') + `echo "SHUTDOWN" | nc localhost #{port}` if port + end + end + + desc "Restart opentox services" + task :restart => [:stop, :start] + + end + + namespace :test do + + ENV['RACK_ENV'] = 'test' + test = "#{Dir.pwd}/test/test.rb" + + desc "Run local tests" + task :local => "opentox:services:restart" do + load test + end + + task :remote do + #load 'test.rb' + end + end end diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index bae9dc6..768fa01 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -1,11 +1,6 @@ -development: - base_dir: ~/webservices - -production: - base_uri: webservices.in-silico.ch - base_dir: /var/www/webservices - -services: +:base_dir: /home/ch/webservices +:webserver: thin +:services: - opentox-feature - opentox-compound - opentox-dataset diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 9d30d93..5c72422 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-08-21} + s.date = %q{2009-08-25} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.extra_rdoc_files = [ @@ -23,11 +23,13 @@ Gem::Specification.new do |s| "README.rdoc", "Rakefile", "VERSION", + "lib/environment.rb", "lib/helper.rb", "lib/opentox-ruby-api-wrapper.rb", "lib/spork.rb", "lib/tasks/opentox.rb", "lib/templates/config.yaml", + "lib/templates/config.yaml", "opentox-ruby-api-wrapper.gemspec", "test/hamster_carcinogenicity.csv", "test/opentox-ruby-api-wrapper_test.rb", diff --git a/test/opentox-ruby-api-wrapper_test.rb b/test/opentox-ruby-api-wrapper_test.rb index 6b09c4a..0a394e2 100644 --- a/test/opentox-ruby-api-wrapper_test.rb +++ b/test/opentox-ruby-api-wrapper_test.rb @@ -1,4 +1,4 @@ -require 'test_helper' +require File.join(File.dirname(__FILE__), 'test_helper.rb') class OpentoxRubyApiWrapperTest < Test::Unit::TestCase @@ -10,6 +10,7 @@ class OpentoxRubyApiWrapperTest < Test::Unit::TestCase port += 1 end end + ENV['OPENTOX'] = "test" end def test_create_dataset_and_model_and_make_a_prediction -- cgit v1.2.3 From 6a2c3f2100d030c30b7d8ac8c95dcece7edb040c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 8 Sep 2009 16:04:23 +0200 Subject: api separated into individual components, adapted for new webservice versions --- Rakefile | 4 +- lib/algorithm.rb | 35 ++++++++ lib/compound.rb | 67 +++++++++++++++ lib/dataset.rb | 76 +++++++++++++++++ lib/environment.rb | 12 ++- lib/feature.rb | 45 ++++++++++ lib/model.rb | 51 ++++++++++++ lib/opentox-ruby-api-wrapper.rb | 174 +++------------------------------------ lib/tasks/opentox.rb | 86 ++++++++++++++----- lib/templates/config.ru | 23 ++++++ lib/templates/config.yaml | 12 +-- lib/utils.rb | 11 +++ opentox-ruby-api-wrapper.gemspec | 15 ++-- 13 files changed, 412 insertions(+), 199 deletions(-) create mode 100644 lib/algorithm.rb create mode 100644 lib/compound.rb create mode 100644 lib/dataset.rb create mode 100644 lib/feature.rb create mode 100644 lib/model.rb create mode 100644 lib/templates/config.ru create mode 100644 lib/utils.rb diff --git a/Rakefile b/Rakefile index 87da98d..675ac64 100644 --- a/Rakefile +++ b/Rakefile @@ -11,8 +11,8 @@ begin gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] gem.add_dependency "rest-client" - gem.files.include %w(lib/tasks/opentox.rb, lib/environment.rb, lib/templates/*) - #gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] + gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] + gem.files.include %w(lib/tasks/opentox.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end rescue LoadError diff --git a/lib/algorithm.rb b/lib/algorithm.rb new file mode 100644 index 0000000..912e14d --- /dev/null +++ b/lib/algorithm.rb @@ -0,0 +1,35 @@ +module OpenTox + module Algorithm + + class Fminer < OpenTox + # Create a new dataset with BBRC features + def initialize(training_dataset) + @uri = RestClient.post @@config[:services]["opentox-fminer"], :dataset_uri => training_dataset.uri + end + end + + class Similarity < OpenTox + + def initialize + @uri = @@config[:services]["opentox-similarity"] + end + + def self.tanimoto(dataset,compounds) + RestClient.post @uri + 'tanimoto', :dataset_uri => dataset.uri, :compound_uris => compounds.collect{ |c| c.uri } + end + + def self.weighted_tanimoto(dataset,compounds) + RestClient.post @uri + 'weighted_tanimoto', :dataset_uri => dataset.uri, :compound_uris => compounds.collect{ |c| c.uri } + end + + end + + class Lazar < OpenTox + # Create a new prediction model from a dataset + def initialize(params) + @uri = RestClient.post @@config[:services]["opentox-lazar"] + 'models' , :dataset_uri => params[:dataset_uri] + end + end + + end +end diff --git a/lib/compound.rb b/lib/compound.rb new file mode 100644 index 0000000..4652770 --- /dev/null +++ b/lib/compound.rb @@ -0,0 +1,67 @@ +module OpenTox + + # uri: /compound/:inchi + class Compound < OpenTox + + attr_reader :inchi + + # Initialize with :uri => uri, :smiles => smiles or :name => name (name can be also an InChI/InChiKey, CAS number, etc) + def initialize(params) + @@cactus_uri="http://cactus.nci.nih.gov/chemical/structure/" + if params[:smiles] + @inchi = smiles2inchi(params[:smiles]) + @uri = File.join(@@config[:services]["opentox-dataset"],"compound",@inchi) + elsif params[:inchi] + @inchi = inchi + @uri = File.join(@@config[:services]["opentox-dataset"],"compound",@inchi) + elsif params[:name] + @inchi = RestClient.get "#{@@cactus_uri}#{params[:name]}/stdinchi" + @uri = File.join(@@config[:services]["opentox-dataset"],"compound",@inchi) + elsif params[:uri] + @inchi = params[:uri].sub(/^.*InChI/, 'InChI') + @uri = params[:uri] + end + end + + # Get the (canonical) smiles + def smiles + obconversion(@inchi,'inchi','can') + end + + def sdf + obconversion(@inchi,'inchi','sdf') + end + + # Matchs a smarts string + def match?(smarts) + obconversion = OpenBabel::OBConversion.new + obmol = OpenBabel::OBMol.new + obconversion.set_in_format('inchi') + obconversion.read_string(obmol,@inchi) + smarts_pattern = OpenBabel::OBSmartsPattern.new + smarts_pattern.init(smarts) + smarts_pattern.match(obmol) + end + + # Match an array of smarts features, returns matching features + def match(smarts_features) + smarts_features.all_features.collect{ |smarts| smarts if self.match?(smarts.name) }.compact + end + + def smiles2inchi(smiles) + obconversion(smiles,'smi','inchi') + end + + def smiles2cansmi(smiles) + obconversion(smiles,'smi','can') + end + + def obconversion(identifier,input_format,output_format) + obconversion = OpenBabel::OBConversion.new + obmol = OpenBabel::OBMol.new + obconversion.set_in_and_out_formats input_format, output_format + obconversion.read_string obmol, identifier + obconversion.write_string(obmol).gsub(/\s/,'').chomp + end + end +end diff --git a/lib/dataset.rb b/lib/dataset.rb new file mode 100644 index 0000000..ca82f11 --- /dev/null +++ b/lib/dataset.rb @@ -0,0 +1,76 @@ +module OpenTox + + # key: /datasets + # set: dataset uris + # key: /dataset/:dataset/compounds + # set: compound uris + # key: /dataset/:dataset/compound/:inchi/:feature_type + # set: feature uris + class Dataset < OpenTox + + # Initialize with :uri => uri or :name => name (creates a new dataset) + def initialize(uri) + super(uri) + end + + def self.create(params) + uri = RestClient.post File.join(@@config[:services]["opentox-dataset"],"datasets"), :name => params[:name] + Dataset.new(uri.to_s) + end + + def self.find(params) + if params[:name] + uri = RestClient.get File.join(@@config[:services]["opentox-dataset"], params[:name]) + elsif params[:uri] + uri = params[:uri] + end + if RestClient.get uri + Dataset.new(uri) + else + nil + end + end + + def import(params) + if params[:csv] + # RestClient seems not to work for file uploads + `curl -X POST -F "file=@#{params[:csv]};type=text/csv" -F compound_format=#{params[:compound_format]} -F feature_type=#{params[:feature_type]} #{@uri + '/import'}` + end + end + + def add_features(features,feature_type) + #puts @uri + #puts feature_type + #puts features.to_yaml + HTTPClient.post @uri, {:feature_type => feature_type, :features => features.to_yaml} + #`curl -X POST -F feature_type="#{feature_type}" -F features="#{features.to_yaml}" #{@uri}` + end + + # Get all compounds from a dataset + def compound_uris + RestClient.get(File.join(@uri, 'compounds')).split("\n") + end + + def compounds + compound_uris.collect{|uri| Compound.new(:uri => uri)} + end + + # Get all features for a compound + def feature_uris(compound,feature_type) + #puts File.join(@uri, 'compound', compound.inchi, feature_type) + RestClient.get(File.join(@uri, 'compound', compound.inchi, feature_type)).split("\n") + end + + # Get all features for a compound + def features(compound,feature_type) + feature_uris(compound,feature_type).collect{|uri| Feature.new(:uri => uri)} + end + + # Delete a dataset + def delete + RestClient.delete @uri + end + + end + +end diff --git a/lib/environment.rb b/lib/environment.rb index 793fef9..c65e968 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -1,14 +1,18 @@ # load configuration -ENV['RACK_ENV'] = 'development' unless ENV['RACK_ENV'] +ENV['RACK_ENV'] = 'test' unless ENV['RACK_ENV'] + +basedir = File.join(ENV['HOME'], ".opentox") +config_dir = File.join(basedir, "config") +@@tmp_dir = File.join(basedir, "tmp") +config_file = File.join(config_dir, "#{ENV['RACK_ENV']}.yaml") -config_file = File.join(ENV['HOME'], ".opentox/config/#{ENV['RACK_ENV']}.yaml") if File.exist?(config_file) @@config = YAML.load_file(config_file) else - FileUtils.mkdir_p File.dirname(config_file) + FileUtils.mkdir_p config_dir + FileUtils.mkdir_p @@tmp_dir FileUtils.cp(File.join(File.dirname(__FILE__), 'templates/config.yaml'), config_file) puts "Please edit #{config_file} and restart your application." exit end - diff --git a/lib/feature.rb b/lib/feature.rb new file mode 100644 index 0000000..0cad7c0 --- /dev/null +++ b/lib/feature.rb @@ -0,0 +1,45 @@ +module OpenTox + + # uri: /feature/:name/:property_name/:property_value/... + class Feature < OpenTox + + attr_accessor :name, :values + + def initialize(params) + if params[:uri] + @uri = params[:uri] + items = URI.split(@uri)[5].split(/\//) + @name = items[1] + @values = {} + i = 3 + while i < items.size + @values[items[i]] = items[i+1] + i += 2 + end + else + @name = URI.encode(URI.decode(params[:name])) + @values = params[:values] + @uri = File.join(@@config[:services]["opentox-dataset"],"feature",path) + end + end + + def values_path + path = '' + @values.each do |k,v| + path += '/' + URI.encode(k.to_s) + '/' + URI.encode(v.to_s) + end + path + end + + def path + File.join(@name,values_path) + end + + def value(property) + items = @uri.split(/\//) + i = items.index(property) + items[i+1] + end + + end +end diff --git a/lib/model.rb b/lib/model.rb new file mode 100644 index 0000000..7f43860 --- /dev/null +++ b/lib/model.rb @@ -0,0 +1,51 @@ +module OpenTox + module Model + + class Lazar < OpenTox + + # Create a new prediction model from a dataset + def initialize(params) + super(params[:uri]) + end + + # Predict a compound + def predict(compound) + LazarPrediction.new(:uri => RestClient.post(@uri, :compound_uri => compound.uri)) + end + + end + + end + + module Prediction + + module Classification + + class Lazar < OpenTox + + def initialize(params) + super(params[:uri]) + end + + def classification + YAML.load(RestClient.get @uri)[:classification] + end + + def confidence + YAML.load(RestClient.get @uri)[:confidence] + end + + def neighbors + RestClient.get @uri + '/neighbors' + end + + def features + RestClient.get @uri + '/features' + end + + end + + end + + end +end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index d74b412..e504e65 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,4 +1,5 @@ -['rubygems', 'sinatra', 'sinatra/respond_to', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'spork', 'environment'].each do |lib| +#['rubygems', 'sinatra', 'sinatra/respond_to', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'spork', 'environment', 'openbabel', 'httpclient'].each do |lib| +['rubygems', 'sinatra', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'spork', 'environment', 'openbabel', 'httpclient'].each do |lib| require lib end @@ -7,10 +8,8 @@ module OpenTox class OpenTox attr_reader :uri - # Escape all nonword characters - def uri_escape(string) - #URI.escape(string, /[^\w]/) - URI.escape(string, /[^#{URI::PATTERN::UNRESERVED}]/) + def initialize(uri) + @uri = uri end # Get the object name @@ -23,168 +22,15 @@ module OpenTox RestClient.delete @uri end - end - - class Compound < OpenTox - - # Initialize with :uri => uri, :smiles => smiles or :name => name (name can be also an InChI/InChiKey, CAS number, etc) - def initialize(params) - if params[:uri] - @uri = params[:uri].to_s - elsif params[:smiles] - @uri = RestClient.post @@config[:services]["opentox-compound"] ,:smiles => uri_escape(params[:smiles]) - elsif params[:name] - @uri = RestClient.post @@config[:services]["opentox-compound"] ,:name => uri_escape(params[:name]) - end - end - - # Get the (canonical) smiles - def smiles - RestClient.get @uri - end - - # Get the unique id (URI encoded canonical smiles) - def uid - RestClient.get @uri + '.uid' - end - - # Matchs a smarts string - def match?(smarts) - if RestClient.get(@uri + '/match/' + uri_escape(smarts)) == 'true' - true - else - false - end - end - - # Match an array of smarts features, returns matching features - def match(smarts_features) - smarts_features.collect{ |smarts| smarts if self.match?(smarts.name) }.compact - end - - end - - class Feature < OpenTox - - # Initialize with :uri => uri, or :name => name, :values => hash_of_property_names_and_values - def initialize(params) - if params[:uri] - @uri = params[:uri].to_s - else - @uri = @@config[:services]["opentox-feature"] + uri_escape(params[:name]) - params[:values].each do |k,v| - @uri += '/' + k.to_s + '/' + v.to_s - end - end - end - - # Get the value of a property - def value(property) - RestClient.get @uri + '/' + property + # Object path without hostname + def path + URI.split(@uri)[5] end end - class Dataset < OpenTox - - # Initialize with :uri => uri or :name => name (creates a new dataset) - def initialize(params) - if params[:uri] - @uri = params[:uri].to_s - elsif params[:name] and params[:filename] - @uri = `curl -X POST -F file=@#{params[:filename]} -F name="#{params[:name]}" #{@@config[:services]["opentox-dataset"]}` - elsif params[:name] - @uri = RestClient.post @@config[:services]["opentox-dataset"], :name => params[:name] - end - end - - # Get all compounds from a dataset - def compounds - RestClient.get(@uri + '/compounds').split("\n").collect{ |c| Compound.new(:uri => c) } - end - - # Get all compounds and features from a dataset, returns a hash with compound_uris as keys and arrays of feature_uris as values - def all_compounds_and_features_uris - YAML.load(RestClient.get(@uri + '/compounds/features.yaml')) - end - - # Get all features from a dataset - def all_features - RestClient.get(@uri + '/features').split("\n").collect{|f| Feature.new(:uri => f)} - end - - # Get all features for a compound - def features(compound) - RestClient.get(@uri + '/compound/' + uri_escape(compound.uri) + '/features').split("\n").collect{|f| Feature.new(:uri => f) } - end - - # Add a compound and a feature to a dataset - def add(compound,feature) - RestClient.put @uri, :compound_uri => compound.uri, :feature_uri => feature.uri - end - - # Tell the dataset that it is complete - def close - RestClient.put @uri, :finished => 'true' - end - - end - - class Fminer < OpenTox - - # Create a new dataset with BBRC features - def initialize(training_dataset) - @dataset_uri = RestClient.post @@config[:services]["opentox-fminer"], :dataset_uri => training_dataset.uri - end - - def dataset - Dataset.new(:uri => @dataset_uri) - end - - end - - class Lazar < OpenTox - - # Create a new prediction model from a dataset - def initialize(params) - if params[:uri] - @uri = params[:uri] - elsif params[:dataset_uri] - @uri = RestClient.post @@config[:services]["opentox-lazar"] + 'models' , :dataset_uri => params[:dataset_uri] - end - end - - # Predict a compound - def predict(compound) - LazarPrediction.new(:uri => RestClient.post(@uri, :compound_uri => compound.uri)) - end - - end - - class LazarPrediction < OpenTox - - def initialize(params) - if params[:uri] - @uri = params[:uri] - end - end - - def classification - YAML.load(RestClient.get @uri)[:classification] - end - - def confidence - YAML.load(RestClient.get @uri)[:confidence] - end - - def neighbors - RestClient.get @uri + '/neighbors' - end - - def features - RestClient.get @uri + '/features' - end - - end +end +['compound','feature','dataset','algorithm','model','utils'].each do |lib| + require lib end diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb index 6f1284f..afb8cb6 100644 --- a/lib/tasks/opentox.rb +++ b/lib/tasks/opentox.rb @@ -1,4 +1,4 @@ -require "environment" +load File.join(File.dirname(__FILE__), '..', 'environment.rb') namespace :opentox do @@ -18,18 +18,22 @@ namespace :opentox do task :start do @@config[:services].each do |service,uri| dir = File.join(@@config[:base_dir], service) - case @@config[:webserver] - when 'thin' + server = @@config[:webserver] + `redis-server &` + case server + when /thin|mongrel|webrick/ port = uri.sub(/^.*:/,'').sub(/\/$/,'') Dir.chdir dir + pid_file = File.join(@@tmp_dir,"#{service}.pid") begin - `thin --trace --rackup config.ru start -p #{port} -e #{ENV['RACK_ENV']} &` - puts "#{service} started on port #{port}." + `#{server} --trace --rackup config.ru start -p #{port} -e #{ENV['RACK_ENV']} -P #{pid_file} -d &` + puts "#{service} started on localhost:#{port} in #{ENV['RACK_ENV']} environment with PID file #{pid_file}." rescue puts "Cannot start #{service} on port #{port}." end when 'passenger' - puts "not yet implemented" + `touch #{File.join(dir, 'tmp/restart.txt')}` + puts "#{service} restarted." else puts "not yet implemented" end @@ -38,9 +42,18 @@ namespace :opentox do desc "Stop opentox services" task :stop do - @@config[:services].each do |service,uri| - port = uri.sub(/^.*:/,'').sub(/\/$/,'') - `echo "SHUTDOWN" | nc localhost #{port}` if port + server = @@config[:webserver] + if server =~ /thin|mongrel|webrick/ + @@config[:services].each do |service,uri| + port = uri.sub(/^.*:/,'').sub(/\/$/,'') + pid_file = File.join(@@tmp_dir,"#{service}.pid") + begin + puts `#{server} stop -P #{pid_file}` + puts "#{service} stopped on localhost:#{port}" + rescue + puts "Cannot stop #{service} on port #{port}." + end + end end end @@ -49,20 +62,55 @@ namespace :opentox do end - namespace :test do + desc "Run all OpenTox tests" + task :test do + @@config[:services].each do |service,uri| + dir = File.join(@@config[:base_dir], service) + Dir.chdir dir + puts "Running tests in #{dir}" + `rake test -t 1>&2` + end + end - ENV['RACK_ENV'] = 'test' - test = "#{Dir.pwd}/test/test.rb" +end - desc "Run local tests" - task :local => "opentox:services:restart" do - load test +desc "Start service in current directory" +task :start do + service = File.basename(Dir.pwd).intern + server = @@config[:webserver] + case server + when /thin|mongrel|webrick/ + port = @@config[:services][service].sub(/^.*:/,'').sub(/\/$/,'') + pid_file = File.join(@@tmp_dir,"#{service}.pid") + begin + `#{server} --trace --rackup config.ru start -p #{port} -e #{ENV['RACK_ENV']} -P #{pid_file} -d &` + puts "#{service} started on localhost:#{port} in #{ENV['RACK_ENV']} environment with PID file #{pid_file}." + rescue + puts "Cannot start #{service} on port #{port}." + end + when 'passenger' + `touch tmp/restart.txt` + puts "#{service} restarted." + else + puts "not yet implemented" end +end - task :remote do - #load 'test.rb' +desc "Stop service in current directory" +task :stop do + service = File.basename(Dir.pwd).intern + server = @@config[:webserver] + if server =~ /thin|mongrel|webrick/ + port = @@config[:services][service].sub(/^.*:/,'').sub(/\/$/,'') + pid_file = File.join(@@tmp_dir,"#{service}.pid") + begin + puts `thin stop -P #{pid_file}` + puts "#{service} stopped on localhost:#{port}" + rescue + puts "Cannot stop #{service} on port #{port}." end - end - end + +desc "Restart service in current directory" +task :restart => [:stop, :start] diff --git a/lib/templates/config.ru b/lib/templates/config.ru new file mode 100644 index 0000000..63dd2ce --- /dev/null +++ b/lib/templates/config.ru @@ -0,0 +1,23 @@ +require 'rubygems' +require 'sinatra' +require 'application.rb' +require 'rack' +require 'rack/contrib' + +FileUtils.mkdir_p 'log' unless File.exists?('log') +log = File.new("log/#{ENV["RACK_ENV"]}.log", "a") +$stdout.reopen(log) +$stderr.reopen(log) + +if ENV['RACK_ENV'] == 'production' + use Rack::MailExceptions do |mail| + mail.to 'helma@in-silico.ch' + mail.subject '[ERROR] %s' + end +elsif ENV['RACK_ENV'] == 'development' + use Rack::Reloader + use Rack::ShowExceptions +end + +run Sinatra::Application + diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index 768fa01..14326fe 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -1,8 +1,10 @@ :base_dir: /home/ch/webservices :webserver: thin :services: - - opentox-feature - - opentox-compound - - opentox-dataset - - opentox-fminer - - opentox-lazar +# make sure to provide a full uri (including training slash) + opentox-feature: "http://localhost:5000/" + opentox-compound: "http://localhost:5001/" + opentox-dataset: "http://localhost:5002/" + opentox-fminer: "http://localhost:5003/" + opentox-similarity: "http://localhost:5004/" + opentox-lazar: "http://localhost:5005/" diff --git a/lib/utils.rb b/lib/utils.rb new file mode 100644 index 0000000..2716f45 --- /dev/null +++ b/lib/utils.rb @@ -0,0 +1,11 @@ +module OpenTox + module Utils + + # gauss kernel + def self.gauss(sim, sigma = 0.3) + x = 1.0 - sim + Math.exp(-(x*x)/(2*sigma*sigma)) + end + + end +end diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 5c72422..7ef0252 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-08-25} + s.date = %q{2009-09-08} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.extra_rdoc_files = [ @@ -17,20 +17,25 @@ Gem::Specification.new do |s| "README.rdoc" ] s.files = [ - ".document", - ".gitignore", - "LICENSE", + "LICENSE", "README.rdoc", "Rakefile", "VERSION", + "lib/algorithm.rb", + "lib/compound.rb", + "lib/dataset.rb", "lib/environment.rb", + "lib/feature.rb", "lib/helper.rb", + "lib/model.rb", "lib/opentox-ruby-api-wrapper.rb", "lib/spork.rb", "lib/tasks/opentox.rb", + "lib/templates/config.ru", + "lib/templates/config.ru", "lib/templates/config.yaml", "lib/templates/config.yaml", - "opentox-ruby-api-wrapper.gemspec", + "lib/utils.rb", "test/hamster_carcinogenicity.csv", "test/opentox-ruby-api-wrapper_test.rb", "test/start-local-webservices.rb", -- cgit v1.2.3 From 285daeaafa3bdff027bc068be9a13232fca3e35d Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 10 Sep 2009 15:20:28 +0200 Subject: Version bump to 1.0.0 --- VERSION | 2 +- lib/opentox.rb | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 lib/opentox.rb diff --git a/VERSION b/VERSION index ee1372d..3eefcb9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.2 +1.0.0 diff --git a/lib/opentox.rb b/lib/opentox.rb new file mode 100644 index 0000000..1a12123 --- /dev/null +++ b/lib/opentox.rb @@ -0,0 +1,28 @@ +module OpenTox + + class OpenTox + attr_accessor :uri + + def initialize(uri) + @uri = uri + end + + # Get the object name + def name + RestClient.get @uri + '/name' + end + + # Deletes an object + def destroy + RestClient.delete @uri + end + + # Object path without hostname + def path + URI.split(@uri)[5] + end + + end + +end + -- cgit v1.2.3 From 59249a0febc2f90cd1643ddb7e3baa68e3f49065 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 10 Sep 2009 15:21:09 +0200 Subject: initial wrapper for new webservices --- lib/algorithm.rb | 16 +++++------- lib/compound.rb | 4 +-- lib/dataset.rb | 54 +++++++++++++++++++++++++---------------- lib/feature.rb | 7 +++--- lib/model.rb | 3 +++ lib/opentox-ruby-api-wrapper.rb | 32 ++---------------------- lib/tasks/opentox.rb | 3 ++- 7 files changed, 52 insertions(+), 67 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 912e14d..33731af 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -3,23 +3,19 @@ module OpenTox class Fminer < OpenTox # Create a new dataset with BBRC features - def initialize(training_dataset) - @uri = RestClient.post @@config[:services]["opentox-fminer"], :dataset_uri => training_dataset.uri + def self.create(training_dataset_uri) + RestClient.post @@config[:services]["opentox-fminer"], :dataset_uri => training_dataset_uri end end class Similarity < OpenTox - def initialize - @uri = @@config[:services]["opentox-similarity"] + def self.tanimoto(dataset1,compound1,dataset2,compound2) + RestClient.get File.join(@@config[:services]["opentox-dataset"], 'algorithm/tanimoto/dataset',dataset1.name,compound1.inchi,'dataset',dataset2.name,compound2.inchi) end - def self.tanimoto(dataset,compounds) - RestClient.post @uri + 'tanimoto', :dataset_uri => dataset.uri, :compound_uris => compounds.collect{ |c| c.uri } - end - - def self.weighted_tanimoto(dataset,compounds) - RestClient.post @uri + 'weighted_tanimoto', :dataset_uri => dataset.uri, :compound_uris => compounds.collect{ |c| c.uri } + def self.weighted_tanimoto(dataset1,compound1,dataset2,compound2) + RestClient.get URI.encode(File.join(@@config[:services]["opentox-dataset"], 'algorithm/weighted_tanimoto/dataset',dataset1.name,'compound',compound1.inchi,'dataset',dataset2.name,'compound',compound2.inchi)) end end diff --git a/lib/compound.rb b/lib/compound.rb index 4652770..67c8004 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -44,8 +44,8 @@ module OpenTox end # Match an array of smarts features, returns matching features - def match(smarts_features) - smarts_features.all_features.collect{ |smarts| smarts if self.match?(smarts.name) }.compact + def match(smarts_dataset) + smarts_dataset.all_features.collect{ |uri| uri if self.match?(Feature.new(:uri => uri).name) }.compact end def smiles2inchi(smiles) diff --git a/lib/dataset.rb b/lib/dataset.rb index ca82f11..f6d0dd7 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -4,7 +4,7 @@ module OpenTox # set: dataset uris # key: /dataset/:dataset/compounds # set: compound uris - # key: /dataset/:dataset/compound/:inchi/:feature_type + # key: /dataset/:dataset/compound/:inchi # set: feature uris class Dataset < OpenTox @@ -19,31 +19,32 @@ module OpenTox end def self.find(params) - if params[:name] - uri = RestClient.get File.join(@@config[:services]["opentox-dataset"], params[:name]) - elsif params[:uri] - uri = params[:uri] - end - if RestClient.get uri - Dataset.new(uri) - else + begin + if params[:name] + uri = File.join(@@config[:services]["opentox-dataset"], URI.encode(params[:name])) + elsif params[:uri] + uri = params[:uri] + end + RestClient.get uri # check if the resource is available + Dataset.new(uri) if uri + rescue nil end end + def self.find_or_create(params) + self.create(params) unless self.find(params) + end + def import(params) if params[:csv] # RestClient seems not to work for file uploads - `curl -X POST -F "file=@#{params[:csv]};type=text/csv" -F compound_format=#{params[:compound_format]} -F feature_type=#{params[:feature_type]} #{@uri + '/import'}` + `curl -X POST -F "file=@#{params[:csv]};type=text/csv" -F compound_format=#{params[:compound_format]} #{@uri + '/import'}` end end - def add_features(features,feature_type) - #puts @uri - #puts feature_type - #puts features.to_yaml - HTTPClient.post @uri, {:feature_type => feature_type, :features => features.to_yaml} - #`curl -X POST -F feature_type="#{feature_type}" -F features="#{features.to_yaml}" #{@uri}` + def add(features) + HTTPClient.post @uri, {:features => features.to_yaml} end # Get all compounds from a dataset @@ -56,14 +57,17 @@ module OpenTox end # Get all features for a compound - def feature_uris(compound,feature_type) - #puts File.join(@uri, 'compound', compound.inchi, feature_type) - RestClient.get(File.join(@uri, 'compound', compound.inchi, feature_type)).split("\n") + def feature_uris(compound) + RestClient.get(File.join(@uri, 'compound', compound.inchi)).split("\n") end # Get all features for a compound - def features(compound,feature_type) - feature_uris(compound,feature_type).collect{|uri| Feature.new(:uri => uri)} + def features(compound) + feature_uris(compound).collect{|uri| Feature.new(:uri => uri)} + end + + def all_features + RestClient.get(File.join(@uri, 'features')).split("\n") end # Delete a dataset @@ -71,6 +75,14 @@ module OpenTox RestClient.delete @uri end + def tanimoto(dataset) + RestClient.get(File.join(@uri,'tanimoto',dataset.path)) + end + + def weighted_tanimoto(dataset) + RestClient.get(File.join(@uri,'weighted_tanimoto',dataset.path)) + end + end end diff --git a/lib/feature.rb b/lib/feature.rb index 0cad7c0..8b0839f 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -9,15 +9,16 @@ module OpenTox if params[:uri] @uri = params[:uri] items = URI.split(@uri)[5].split(/\//) - @name = items[1] + @name = items[2] @values = {} - i = 3 + i = 4 while i < items.size @values[items[i]] = items[i+1] i += 2 end else - @name = URI.encode(URI.decode(params[:name])) + @name = params[:name] + #@name = URI.encode(URI.decode(params[:name])) @values = params[:values] @uri = File.join(@@config[:services]["opentox-dataset"],"feature",path) end diff --git a/lib/model.rb b/lib/model.rb index 7f43860..c50a458 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -1,4 +1,7 @@ module OpenTox + + # key: /models + # set: dataset uris module Model class Lazar < OpenTox diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index e504e65..9d7e5e5 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,36 +1,8 @@ #['rubygems', 'sinatra', 'sinatra/respond_to', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'spork', 'environment', 'openbabel', 'httpclient'].each do |lib| -['rubygems', 'sinatra', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'spork', 'environment', 'openbabel', 'httpclient'].each do |lib| +['rubygems', 'sinatra', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'environment', 'openbabel', 'httpclient'].each do |lib| require lib end -module OpenTox - - class OpenTox - attr_reader :uri - - def initialize(uri) - @uri = uri - end - - # Get the object name - def name - RestClient.get @uri + '/name' - end - - # Deletes an object - def destroy - RestClient.delete @uri - end - - # Object path without hostname - def path - URI.split(@uri)[5] - end - - end - -end - -['compound','feature','dataset','algorithm','model','utils'].each do |lib| +['opentox', 'compound','feature','dataset','algorithm','model','utils'].each do |lib| require lib end diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb index afb8cb6..0dace9a 100644 --- a/lib/tasks/opentox.rb +++ b/lib/tasks/opentox.rb @@ -19,7 +19,8 @@ namespace :opentox do @@config[:services].each do |service,uri| dir = File.join(@@config[:base_dir], service) server = @@config[:webserver] - `redis-server &` + #puts "Starting Redis database" + #puts `redis-server /etc/redis.conf &` case server when /thin|mongrel|webrick/ port = uri.sub(/^.*:/,'').sub(/\/$/,'') -- cgit v1.2.3 From abd0e1ae7b933cbd1c1907dd9e7f1ce1782cf743 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 11 Sep 2009 23:55:32 +0200 Subject: InChI escaping fixed --- Rakefile | 2 +- lib/algorithm.rb | 4 +++- lib/dataset.rb | 6 ++++-- lib/model.rb | 8 ++++++++ lib/opentox-ruby-api-wrapper.rb | 5 ++--- opentox-ruby-api-wrapper.gemspec | 11 ++++++----- 6 files changed, 24 insertions(+), 12 deletions(-) diff --git a/Rakefile b/Rakefile index 675ac64..6f71f5d 100644 --- a/Rakefile +++ b/Rakefile @@ -10,7 +10,7 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - gem.add_dependency "rest-client" + gem.add_dependency "technoweenie-rest-client" gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] gem.files.include %w(lib/tasks/opentox.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 33731af..7007e3a 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -15,7 +15,9 @@ module OpenTox end def self.weighted_tanimoto(dataset1,compound1,dataset2,compound2) - RestClient.get URI.encode(File.join(@@config[:services]["opentox-dataset"], 'algorithm/weighted_tanimoto/dataset',dataset1.name,'compound',compound1.inchi,'dataset',dataset2.name,'compound',compound2.inchi)) + # URI.escape does not work here + uri = File.join(@@config[:services]["opentox-dataset"], 'algorithm/weighted_tanimoto/dataset',CGI.escape(dataset1.name),'compound',CGI.escape(compound1.inchi),'dataset',CGI.escape(dataset2.name),'compound',CGI.escape(compound2.inchi)) + RestClient.get uri end end diff --git a/lib/dataset.rb b/lib/dataset.rb index f6d0dd7..b635985 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -39,12 +39,13 @@ module OpenTox def import(params) if params[:csv] # RestClient seems not to work for file uploads + #RestClient.post @uri + '/import', :compound_format => params[:compound_format], :content_type => "text/csv", :file => File.new(params[:csv]) `curl -X POST -F "file=@#{params[:csv]};type=text/csv" -F compound_format=#{params[:compound_format]} #{@uri + '/import'}` end end def add(features) - HTTPClient.post @uri, {:features => features.to_yaml} + RestClient.post @uri, :features => features.to_yaml end # Get all compounds from a dataset @@ -58,7 +59,8 @@ module OpenTox # Get all features for a compound def feature_uris(compound) - RestClient.get(File.join(@uri, 'compound', compound.inchi)).split("\n") + uri = File.join(@uri, 'compound', CGI.escape(compound.inchi)) # URI.encode does not work here + RestClient.get(uri).split("\n") end # Get all features for a compound diff --git a/lib/model.rb b/lib/model.rb index c50a458..0fa3be6 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -11,6 +11,14 @@ module OpenTox super(params[:uri]) end + def self.find(name) + RestClient.get File.join(@@config[:services]["opentox-lazar"], 'model', URI.encode(params[:name])) + end + + def self.find_all + RestClient.get File.join(@@config[:services]["opentox-lazar"], 'models')#.split("\n") + end + # Predict a compound def predict(compound) LazarPrediction.new(:uri => RestClient.post(@uri, :compound_uri => compound.uri)) diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 9d7e5e5..fd68e72 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,8 +1,7 @@ -#['rubygems', 'sinatra', 'sinatra/respond_to', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'spork', 'environment', 'openbabel', 'httpclient'].each do |lib| -['rubygems', 'sinatra', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'environment', 'openbabel', 'httpclient'].each do |lib| +['rubygems', 'sinatra', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'cgi', 'openbabel'].each do |lib| require lib end -['opentox', 'compound','feature','dataset','algorithm','model','utils'].each do |lib| +['environment', 'opentox', 'compound','feature','dataset','algorithm','model','utils'].each do |lib| require lib end diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 7ef0252..fd8094f 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "0.2.2" + s.version = "1.0.0" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-09-08} + s.date = %q{2009-09-11} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.extra_rdoc_files = [ @@ -29,6 +29,7 @@ Gem::Specification.new do |s| "lib/helper.rb", "lib/model.rb", "lib/opentox-ruby-api-wrapper.rb", + "lib/opentox.rb", "lib/spork.rb", "lib/tasks/opentox.rb", "lib/templates/config.ru", @@ -57,11 +58,11 @@ Gem::Specification.new do |s| s.specification_version = 3 if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then - s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) else - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end else - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From 352124655e3a5abd1bea607179f520ed2e2db772 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 6 Oct 2009 10:26:01 +0200 Subject: Version bump to 0.0.0 --- VERSION | 2 +- lib/task.rb | 55 +++++++++++++++++++++++ lib/tasks/redis.rb | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 lib/task.rb create mode 100644 lib/tasks/redis.rb diff --git a/VERSION b/VERSION index 3eefcb9..77d6f4c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0 +0.0.0 diff --git a/lib/task.rb b/lib/task.rb new file mode 100644 index 0000000..74c3fb8 --- /dev/null +++ b/lib/task.rb @@ -0,0 +1,55 @@ +module OpenTox + + class Task < OpenTox + #private :new + + def initialize(uri) + super(uri) + end + + def self.create(params) + uri = RestClient.post @@config[:services]["opentox-task"], :resource_uri => params[:resource_uri] + Task.new uri + end + + def self.find(params) + Task.new(params[:uri]) + end + + def self.base_uri + @@config[:services]["opentox-task"] + end + + def start + RestClient.put @uri, :status => 'started' + end + + def stop + RestClient.put @uri, :status => 'stopped' + end + + def completed + RestClient.put @uri, :status => 'completed' + end + + def status + RestClient.get File.join(@uri, 'status') + end + + def completed? + self.status == 'completed' + end + + def resource + RestClient.get @uri + end + + def wait_for_completion + until self.completed? + sleep 1 + end + end + + end + +end diff --git a/lib/tasks/redis.rb b/lib/tasks/redis.rb new file mode 100644 index 0000000..ed317d3 --- /dev/null +++ b/lib/tasks/redis.rb @@ -0,0 +1,125 @@ +# Inspired by rabbitmq.rake the Redbox project at http://github.com/rick/redbox/tree/master +require 'fileutils' +require 'open-uri' + +class RedisRunner + + def self.redisdir + "/tmp/redis/" + end + + def self.redisconfdir + '/etc/redis.conf' + end + + def self.dtach_socket + '/tmp/redis.dtach' + end + + # Just check for existance of dtach socket + def self.running? + File.exists? dtach_socket + end + + def self.start + puts 'Detach with Ctrl+\ Re-attach with rake redis:attach' + sleep 3 + exec "dtach -A #{dtach_socket} redis-server #{redisconfdir}" + end + + def self.attach + exec "dtach -a #{dtach_socket}" + end + + def self.stop + sh 'echo "SHUTDOWN" | nc localhost 6379' + end + +end + +namespace :redis do + + desc 'About redis' + task :about do + puts "\nSee http://code.google.com/p/redis/ for information about redis.\n\n" + end + + desc 'Start redis' + task :start do + RedisRunner.start + end + + desc 'Stop redis' + task :stop do + RedisRunner.stop + end + + desc 'Restart redis' + task :restart do + RedisRunner.stop + RedisRunner.start + end + + desc 'Attach to redis dtach socket' + task :attach do + RedisRunner.attach + end + + desc 'Install the lastest verison of Redis from Github (requires git, duh)' + task :install => [:about, :download, :make] do + %w(redis-benchmark redis-cli redis-server).each do |bin| + sh "sudo cp /tmp/redis/#{bin} /usr/bin/" + end + + puts "Installed redis-benchmark, redis-cli and redis-server to /usr/bin/" + + unless File.exists?('/etc/redis.conf') + sh 'sudo cp /tmp/redis/redis.conf /etc/' + puts "Installed redis.conf to /etc/ \n You should look at this file!" + end + end + + task :make do + sh "cd #{RedisRunner.redisdir} && make clean" + sh "cd #{RedisRunner.redisdir} && make" + end + + desc "Download package" + task :download do + sh 'rm -rf /tmp/redis/' if File.exists?("#{RedisRunner.redisdir}/.svn") + sh 'git clone git://github.com/antirez/redis.git /tmp/redis' unless File.exists?(RedisRunner.redisdir) + sh "cd #{RedisRunner.redisdir} && git pull" if File.exists?("#{RedisRunner.redisdir}/.git") + end + +end + +namespace :dtach do + + desc 'About dtach' + task :about do + puts "\nSee http://dtach.sourceforge.net/ for information about dtach.\n\n" + end + + desc 'Install dtach 0.8 from source' + task :install => [:about] do + + Dir.chdir('/tmp/') + unless File.exists?('/tmp/dtach-0.8.tar.gz') + require 'net/http' + + url = 'http://downloads.sourceforge.net/project/dtach/dtach/0.8/dtach-0.8.tar.gz' + open('/tmp/dtach-0.8.tar.gz', 'wb') do |file| file.write(open(url).read) end + end + + unless File.directory?('/tmp/dtach-0.8') + system('tar xzf dtach-0.8.tar.gz') + end + + Dir.chdir('/tmp/dtach-0.8/') + sh 'cd /tmp/dtach-0.8/ && ./configure && make' + sh 'sudo cp /tmp/dtach-0.8/dtach /usr/bin/' + + puts 'Dtach successfully installed to /usr/bin.' + end +end + -- cgit v1.2.3 From 246174ade0daa18a16cbe8698c2d848e519b2dcb Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 6 Oct 2009 10:31:24 +0200 Subject: Version bump to 1.0.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 77d6f4c..3eefcb9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.0 +1.0.0 -- cgit v1.2.3 From 9f16c1ede56a95368044a333f716d09c0240e5ab Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 6 Oct 2009 10:31:32 +0200 Subject: Version bump to 1.1.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 3eefcb9..9084fa2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0 +1.1.0 -- cgit v1.2.3 From 5d5688fbe43806af8523e5481715b5969feeab60 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 6 Oct 2009 10:39:43 +0200 Subject: Passes tests in opentox-test --- Rakefile | 2 + lib/algorithm.rb | 16 ++++--- lib/compound.rb | 8 ++-- lib/dataset.rb | 8 +++- lib/environment.rb | 19 +++++++- lib/feature.rb | 16 ++++--- lib/model.rb | 23 +++++++--- lib/opentox-ruby-api-wrapper.rb | 4 +- lib/opentox.rb | 1 - lib/tasks/opentox.rb | 16 +++++-- lib/templates/config.yaml | 14 +++--- lib/utils.rb | 2 - opentox-ruby-api-wrapper.gemspec | 17 +++---- test/hamster_carcinogenicity.csv | 85 ----------------------------------- test/opentox-ruby-api-wrapper_test.rb | 47 ------------------- test/start-local-webservices.rb | 13 ------ test/test_helper.rb | 10 ----- 17 files changed, 91 insertions(+), 210 deletions(-) delete mode 100644 test/hamster_carcinogenicity.csv delete mode 100644 test/opentox-ruby-api-wrapper_test.rb delete mode 100755 test/start-local-webservices.rb delete mode 100644 test/test_helper.rb diff --git a/Rakefile b/Rakefile index 6f71f5d..99d2812 100644 --- a/Rakefile +++ b/Rakefile @@ -11,6 +11,8 @@ begin gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] gem.add_dependency "technoweenie-rest-client" + gem.add_dependency "sinatra" + gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] gem.files.include %w(lib/tasks/opentox.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 7007e3a..43f7ede 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -3,20 +3,24 @@ module OpenTox class Fminer < OpenTox # Create a new dataset with BBRC features - def self.create(training_dataset_uri) - RestClient.post @@config[:services]["opentox-fminer"], :dataset_uri => training_dataset_uri + def self.create(params) + puts params[:dataset_uri] + uri = RestClient.post File.join(@@config[:services]["opentox-algorithm"],'fminer'), :dataset_uri => params[:dataset_uri] + print "fminer finsihed " + puts uri + uri end end class Similarity < OpenTox def self.tanimoto(dataset1,compound1,dataset2,compound2) - RestClient.get File.join(@@config[:services]["opentox-dataset"], 'algorithm/tanimoto/dataset',dataset1.name,compound1.inchi,'dataset',dataset2.name,compound2.inchi) + RestClient.get File.join(@@config[:services]["opentox-algorithm"], 'tanimoto/dataset',dataset1.name,compound1.inchi,'dataset',dataset2.name,compound2.inchi) end def self.weighted_tanimoto(dataset1,compound1,dataset2,compound2) # URI.escape does not work here - uri = File.join(@@config[:services]["opentox-dataset"], 'algorithm/weighted_tanimoto/dataset',CGI.escape(dataset1.name),'compound',CGI.escape(compound1.inchi),'dataset',CGI.escape(dataset2.name),'compound',CGI.escape(compound2.inchi)) + uri = File.join(@@config[:services]["opentox-algorithm"], 'weighted_tanimoto/dataset',CGI.escape(dataset1.name),'compound',CGI.escape(compound1.inchi),'dataset',CGI.escape(dataset2.name),'compound',CGI.escape(compound2.inchi)) RestClient.get uri end @@ -24,8 +28,8 @@ module OpenTox class Lazar < OpenTox # Create a new prediction model from a dataset - def initialize(params) - @uri = RestClient.post @@config[:services]["opentox-lazar"] + 'models' , :dataset_uri => params[:dataset_uri] + def self.create(params) + RestClient.post File.join(@@config[:services]["opentox-algorithm"],"lazar_classification"), params end end diff --git a/lib/compound.rb b/lib/compound.rb index 67c8004..c4ba8d9 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -10,13 +10,13 @@ module OpenTox @@cactus_uri="http://cactus.nci.nih.gov/chemical/structure/" if params[:smiles] @inchi = smiles2inchi(params[:smiles]) - @uri = File.join(@@config[:services]["opentox-dataset"],"compound",@inchi) + @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:inchi] - @inchi = inchi - @uri = File.join(@@config[:services]["opentox-dataset"],"compound",@inchi) + @inchi = params[:inchi] + @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:name] @inchi = RestClient.get "#{@@cactus_uri}#{params[:name]}/stdinchi" - @uri = File.join(@@config[:services]["opentox-dataset"],"compound",@inchi) + @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:uri] @inchi = params[:uri].sub(/^.*InChI/, 'InChI') @uri = params[:uri] diff --git a/lib/dataset.rb b/lib/dataset.rb index b635985..754e7f4 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -14,7 +14,7 @@ module OpenTox end def self.create(params) - uri = RestClient.post File.join(@@config[:services]["opentox-dataset"],"datasets"), :name => params[:name] + uri = RestClient.post @@config[:services]["opentox-dataset"], :name => params[:name] Dataset.new(uri.to_s) end @@ -36,6 +36,10 @@ module OpenTox self.create(params) unless self.find(params) end + def self.base_uri + @@config[:services]["opentox-dataset"] + end + def import(params) if params[:csv] # RestClient seems not to work for file uploads @@ -45,7 +49,7 @@ module OpenTox end def add(features) - RestClient.post @uri, :features => features.to_yaml + RestClient.put @uri, :features => features end # Get all compounds from a dataset diff --git a/lib/environment.rb b/lib/environment.rb index c65e968..3a9319d 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -1,7 +1,7 @@ -# load configuration - +# set default environment ENV['RACK_ENV'] = 'test' unless ENV['RACK_ENV'] +# load configuration basedir = File.join(ENV['HOME'], ".opentox") config_dir = File.join(basedir, "config") @@tmp_dir = File.join(basedir, "tmp") @@ -16,3 +16,18 @@ else puts "Please edit #{config_file} and restart your application." exit end + +# configure redis database +begin + case ENV['RACK_ENV'] + when 'production' + @@redis = Redis.new :db => 0 + when 'development' + @@redis = Redis.new :db => 1 + when 'test' + @@redis = Redis.new :db => 2 + @@redis.flush_db + end +rescue + puts "Redis database not running, please start it with 'rake redis:start'." +end diff --git a/lib/feature.rb b/lib/feature.rb index 8b0839f..a3ba333 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -9,31 +9,33 @@ module OpenTox if params[:uri] @uri = params[:uri] items = URI.split(@uri)[5].split(/\//) - @name = items[2] + @name = items[1] @values = {} - i = 4 + i = 2 while i < items.size @values[items[i]] = items[i+1] i += 2 end else @name = params[:name] - #@name = URI.encode(URI.decode(params[:name])) - @values = params[:values] - @uri = File.join(@@config[:services]["opentox-dataset"],"feature",path) + @values = {} + params.each do |k,v| + @values[k] = v unless k.to_s == 'name' + end + @uri = File.join(@@config[:services]["opentox-feature"],path) end end def values_path path = '' @values.each do |k,v| - path += '/' + URI.encode(k.to_s) + '/' + URI.encode(v.to_s) + path = File.join path, URI.encode(k.to_s), URI.encode(v.to_s) end path end def path - File.join(@name,values_path) + File.join(URI.encode(@name),values_path) end def value(property) diff --git a/lib/model.rb b/lib/model.rb index 0fa3be6..ec4d069 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -1,22 +1,27 @@ module OpenTox - # key: /models - # set: dataset uris module Model - class Lazar < OpenTox + class LazarClassification < OpenTox # Create a new prediction model from a dataset - def initialize(params) - super(params[:uri]) + def initialize(uri) + super(uri) + end + + def self.create(params) + uri = RestClient.post File.join(@@config[:services]["opentox-model"], 'lazar_classification'), params + puts "URI: " + uri + LazarClassification.new(uri.to_s) end def self.find(name) - RestClient.get File.join(@@config[:services]["opentox-lazar"], 'model', URI.encode(params[:name])) + uri = RestClient.get File.join(@@config[:services]["opentox-model"], 'lazar_classification', URI.encode(params[:name])) + LazarClassification.new(uri) end def self.find_all - RestClient.get File.join(@@config[:services]["opentox-lazar"], 'models')#.split("\n") + RestClient.get File.join(@@config[:services]["opentox-model"], 'lazar_classification')#.split("\n") end # Predict a compound @@ -24,6 +29,10 @@ module OpenTox LazarPrediction.new(:uri => RestClient.post(@uri, :compound_uri => compound.uri)) end + def self.base_uri + @@config[:services]["opentox-model"] + end + end end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index fd68e72..3e66528 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,7 +1,7 @@ -['rubygems', 'sinatra', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'cgi', 'openbabel'].each do |lib| +['rubygems', 'sinatra', 'sinatra/url_for', 'redis','builder', 'rest_client', 'yaml', 'cgi', 'openbabel', 'spork', 'environment'].each do |lib| require lib end -['environment', 'opentox', 'compound','feature','dataset','algorithm','model','utils'].each do |lib| +['opentox', 'compound','feature','dataset','algorithm','model','task','utils'].each do |lib| require lib end diff --git a/lib/opentox.rb b/lib/opentox.rb index 1a12123..9b1226b 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -25,4 +25,3 @@ module OpenTox end end - diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb index 0dace9a..4cac9a5 100644 --- a/lib/tasks/opentox.rb +++ b/lib/tasks/opentox.rb @@ -1,4 +1,16 @@ -load File.join(File.dirname(__FILE__), '..', 'environment.rb') +require File.join(File.dirname(__FILE__), '..', 'opentox-ruby-api-wrapper.rb') +require File.join(File.dirname(__FILE__), 'redis.rb') + +namespace :redis do + + desc "Flush Redis testing database" + task :flush do + require 'redis' + r = Redis.new :db => 2 + r.flushdb + end + +end namespace :opentox do @@ -19,8 +31,6 @@ namespace :opentox do @@config[:services].each do |service,uri| dir = File.join(@@config[:base_dir], service) server = @@config[:webserver] - #puts "Starting Redis database" - #puts `redis-server /etc/redis.conf &` case server when /thin|mongrel|webrick/ port = uri.sub(/^.*:/,'').sub(/\/$/,'') diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index 14326fe..7b46d43 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -1,10 +1,10 @@ :base_dir: /home/ch/webservices :webserver: thin :services: -# make sure to provide a full uri (including training slash) - opentox-feature: "http://localhost:5000/" - opentox-compound: "http://localhost:5001/" - opentox-dataset: "http://localhost:5002/" - opentox-fminer: "http://localhost:5003/" - opentox-similarity: "http://localhost:5004/" - opentox-lazar: "http://localhost:5005/" +# make sure to enter a full uri (including training slash) + opentox-compound: "http://localhost:4000/" + opentox-feature: "http://localhost:4001/" + opentox-dataset: "http://localhost:4002/" + opentox-algorithm: "http://localhost:4003/" + opentox-model: "http://localhost:4004/" + #opentox-task: "http://localhost:4005/" diff --git a/lib/utils.rb b/lib/utils.rb index 2716f45..cccb5ea 100644 --- a/lib/utils.rb +++ b/lib/utils.rb @@ -1,11 +1,9 @@ module OpenTox module Utils - # gauss kernel def self.gauss(sim, sigma = 0.3) x = 1.0 - sim Math.exp(-(x*x)/(2*sigma*sigma)) end - end end diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index fd8094f..aa23416 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.0.0" + s.version = "1.1.0" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-09-11} + s.date = %q{2009-10-06} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.extra_rdoc_files = [ @@ -31,27 +31,20 @@ Gem::Specification.new do |s| "lib/opentox-ruby-api-wrapper.rb", "lib/opentox.rb", "lib/spork.rb", + "lib/task.rb", "lib/tasks/opentox.rb", + "lib/tasks/redis.rb", "lib/templates/config.ru", "lib/templates/config.ru", "lib/templates/config.yaml", "lib/templates/config.yaml", - "lib/utils.rb", - "test/hamster_carcinogenicity.csv", - "test/opentox-ruby-api-wrapper_test.rb", - "test/start-local-webservices.rb", - "test/test_helper.rb" + "lib/utils.rb" ] s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} s.rdoc_options = ["--charset=UTF-8"] s.require_paths = ["lib"] s.rubygems_version = %q{1.3.5} s.summary = %q{Ruby wrapper for the OpenTox REST API} - s.test_files = [ - "test/test_helper.rb", - "test/opentox-ruby-api-wrapper_test.rb", - "test/start-local-webservices.rb" - ] if s.respond_to? :specification_version then current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION diff --git a/test/hamster_carcinogenicity.csv b/test/hamster_carcinogenicity.csv deleted file mode 100644 index 009808f..0000000 --- a/test/hamster_carcinogenicity.csv +++ /dev/null @@ -1,85 +0,0 @@ -CC=O,true -C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,true -O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,true -C1(N=CNN=1)N,false -Br(=O)(=O)[O-].[K+],true -[Cl-].[Cd+2].[Cl-],false -O=S(=O)([O-])[O-].[Cd+2],false -ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,false -ClCOC,true -C=C(Cl)C=C,false -Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,false -O=C1OC2=C(C=CC=C2)C=C1,false -ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,true -ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,false -C=CCN(CC=C)N=O,true -Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,false -O=C(N(C)C)Cl,true -CN(C)N,true -N(NC)C.[H]Cl.[H]Cl,true -CCO,false -O=C(N(CC)N=O)NCCO,true -O=C(N(CC)N=O)NCC(=O)C,true -C=O,false -[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,true -O=CC1=CC=CO1,false -OCC1CO1,true -O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,false -ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,true -NN,true -OS(=O)(=O)O.NN,true -CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,true -OCCNN,false -O=C(C1=CC=NC=C1)NN,false -OC(=O)C1=CC=NC=C1,false -O=C(NC1=CC=CC(=C1)Cl)OC(C)C,false -O=C(NC1=CC=CC=C1)OC(C)C,false -[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],false -CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,false -NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,false -CN(N)C=O,true -O=C(C(=C)C)OC,false -CNN,true -O=C(C1=CC=CN=C1)CCCN(N=O)C,false -CC1=CC(=O)NC(=S)N1,true -CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,false -O=N[O-].[Na+],false -[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,true -[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,true -O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],false -N(CC(CO)O)(CC(O)C)N=O,true -N(CC(CO)O)(CC(C)=O)N=O,true -N(CC(CO)O)(CCO)N=O,false -O=C(C)CN(N=O)CCO,true -C1C(N(C(CN1N=O)C)C)C,true -N(CC(C)=O)(CC=C)N=O,true -N(CC(CO)O)(C)N=O,true -O=NN1CCOCC1,true -N1C=CC=C(C=1)C2N(N=O)CCC2,true -C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,false -O=NN1CCCCC1,true -O=NN1CCCC1,true -O=C(N(CC(C)=O)N=O)NCCCl,true -N(C(=O)N)(N=O)CC(C)=O,true -C1(CCN=C=S)=CC=CC=C1,false -O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,false -C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,false -O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,false -C1(=CC(=C(O)C=C1)O)C(O)=O,false -O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,false -C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,false -C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,false -OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,false -ClC(=CCl)Cl,false -NC(=O)OCC,true -C=CCl,true -N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,false -C1(CN(CC(N1N=O)C)N=O)C,true -N(CCN(C)C)(C)N=O,true -C1(CN(N=O)CC(O1)C)C,true -O1C(N(CC1C)N=O)=O,true -CCOC(=O)N(C)N=O,true -C1N(COC1)N=O,true -O=C(N(CCC1=CC=CC=C1)N=O)N,true -O=NN1CCC1,true -F[B-](F)(F)F.[Na+],false diff --git a/test/opentox-ruby-api-wrapper_test.rb b/test/opentox-ruby-api-wrapper_test.rb deleted file mode 100644 index 0a394e2..0000000 --- a/test/opentox-ruby-api-wrapper_test.rb +++ /dev/null @@ -1,47 +0,0 @@ -require File.join(File.dirname(__FILE__), 'test_helper.rb') - -class OpentoxRubyApiWrapperTest < Test::Unit::TestCase - - def setup - if ENV['LOCAL'] - port = 5000 - [ "opentox-compound", "opentox-feature" , "opentox-dataset" , "opentox-fminer" , "opentox-lazar" ].each do |component| - ENV[component.upcase.gsub(/-/,'_')] = "http://localhost:#{port}/" - port += 1 - end - end - ENV['OPENTOX'] = "test" - end - - def test_create_dataset_and_model_and_make_a_prediction - dataset = OpenTox::Dataset.new :name => "Hamster Carcinogenicity", :filename => "test/hamster_carcinogenicity.csv" - puts dataset.uri - wait_for_completion dataset - assert_match(/#{ENV['OPENTOX_DATASET']}\d+$/,dataset.uri) - assert_equal("Hamster Carcinogenicity",dataset.name) - assert_equal(true,dataset.finished?) - lazar = OpenTox::Lazar.new :dataset_uri => dataset.uri - puts lazar.uri - wait_for_completion lazar - assert_equal(true,lazar.finished?) - assert_match(/#{ENV['OPENTOX_LAZAR']}model\/\d+$/,lazar.uri) - query_structure = OpenTox::Compound.new :smiles => 'c1ccccc1NN' - puts query_structure.uri - prediction = lazar.predict query_structure - puts prediction.uri - wait_for_completion prediction - puts prediction.classification - puts prediction.confidence - puts prediction.neighbors - puts prediction.features - assert_equal(true, prediction.classification) - assert_match(/0\.\d+/, prediction.confidence.to_s) - end - -end - -def wait_for_completion(object) - while (!object.finished?) - sleep 1 - end -end diff --git a/test/start-local-webservices.rb b/test/start-local-webservices.rb deleted file mode 100755 index 66dea29..0000000 --- a/test/start-local-webservices.rb +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env ruby -require 'fileutils' - -port = 5000 -[ "opentox-compound", "opentox-feature" , "opentox-dataset" , "opentox-fminer" , "opentox-lazar" ].each do |component| - ENV[component.upcase.gsub(/-/,'_')] = "http://localhost:#{port}/" - Dir.chdir ENV['HOME'] + '/webservices/' + component - Dir["test.sqlite3"].each { |f| FileUtils.rm_rf(f) } - file = 'application.rb' - pid = fork {`urxvt -title #{component} -e thin --debug --rackup config.ru start -p #{port} -e test`} - Process.detach(pid) - port += 1 -end diff --git a/test/test_helper.rb b/test/test_helper.rb deleted file mode 100644 index 4911cf4..0000000 --- a/test/test_helper.rb +++ /dev/null @@ -1,10 +0,0 @@ -require 'rubygems' -require 'test/unit' - -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) -$LOAD_PATH.unshift(File.dirname(__FILE__)) - -require 'opentox-ruby-api-wrapper' - -class Test::Unit::TestCase -end -- cgit v1.2.3 From 28c8afb3e885da6f5c23a8f0608aff7d4fd6bf1c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 3 Nov 2009 17:54:15 +0100 Subject: redis tasks included, redis:flushall added --- Rakefile | 6 +++++- lib/tasks/opentox.rb | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index 99d2812..ef29218 100644 --- a/Rakefile +++ b/Rakefile @@ -12,9 +12,13 @@ begin gem.authors = ["Christoph Helma"] gem.add_dependency "technoweenie-rest-client" gem.add_dependency "sinatra" + gem.add_dependency "rack" + gem.add_dependency "rack-contrib" + gem.add_dependency "thin" + gem.add_dependency "cucumber" gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] - gem.files.include %w(lib/tasks/opentox.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) + gem.files.include %w(lib/tasks/opentox.rb, lib/tasks/redis.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end rescue LoadError diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb index 4cac9a5..8018fff 100644 --- a/lib/tasks/opentox.rb +++ b/lib/tasks/opentox.rb @@ -7,9 +7,17 @@ namespace :redis do task :flush do require 'redis' r = Redis.new :db => 2 - r.flushdb + r.flush_db end + desc "Flush all Redis databases" + task :flushall do + require 'redis' + r = Redis.new + r.flush_all + end + + end namespace :opentox do -- cgit v1.2.3 From 331d50f69af8f8b8df7f600d3d82533811344bb0 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 10 Nov 2009 15:16:49 +0100 Subject: Installation instructions for openbabel ruby bindings --- Rakefile | 2 +- lib/opentox-ruby-api-wrapper.rb | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index ef29218..cdd29c5 100644 --- a/Rakefile +++ b/Rakefile @@ -16,7 +16,7 @@ begin gem.add_dependency "rack-contrib" gem.add_dependency "thin" gem.add_dependency "cucumber" - + gem.add_dependency "ezmobius-redis-rb" gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] gem.files.include %w(lib/tasks/opentox.rb, lib/tasks/redis.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 3e66528..c01fd7d 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,7 +1,13 @@ -['rubygems', 'sinatra', 'sinatra/url_for', 'redis','builder', 'rest_client', 'yaml', 'cgi', 'openbabel', 'spork', 'environment'].each do |lib| +['rubygems', 'sinatra', 'sinatra/url_for', 'redis','builder', 'rest_client', 'yaml', 'cgi', 'spork', 'environment'].each do |lib| require lib end +begin + require 'openbabel' +rescue + puts "Please install Openbabel with 'rake openbabel:install' in the compound component" +end + ['opentox', 'compound','feature','dataset','algorithm','model','task','utils'].each do |lib| require lib end -- cgit v1.2.3 From e11146fa08303500fbf0bb837960f6c18e2307ed Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 10 Nov 2009 15:40:53 +0100 Subject: openbabel LoadError rescued --- lib/opentox-ruby-api-wrapper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index c01fd7d..c4d9d4e 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -4,7 +4,7 @@ end begin require 'openbabel' -rescue +rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -- cgit v1.2.3 From 7008947d2fe7e90dcf254e081510bea6c718fc30 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 17 Nov 2009 10:54:41 +0100 Subject: new gemspec built --- opentox-ruby-api-wrapper.gemspec | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index aa23416..3f29975 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-10-06} + s.date = %q{2009-11-17} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.extra_rdoc_files = [ @@ -52,10 +52,28 @@ Gem::Specification.new do |s| if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end else s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From 40cc23c8e0f2ae20348a6cdde257dd14fddafd4c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 17 Nov 2009 10:57:04 +0100 Subject: README adjusted --- README.rdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rdoc b/README.rdoc index e4d8a0e..e337907 100644 --- a/README.rdoc +++ b/README.rdoc @@ -14,7 +14,7 @@ Install the gem: == Usage -- set the environment variables OPENTOX_COMPOUNDS, OPENTOX_FEATURES, OPENTOX_DATASETS, OPENTOX_FMINER to the base URI of the OpenTox REST webservices +- adjust the settings in $HOME/.opentox/config - require 'opentox-ruby-api-wrapper' in your ruby application - consult the rdoc API documentation for details -- cgit v1.2.3 From 292b9327a3a9978fbafcdf97c99156e87da51cfb Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 17 Nov 2009 11:41:27 +0100 Subject: Gemcutter task added to Rakefile --- Rakefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Rakefile b/Rakefile index cdd29c5..3d5756a 100644 --- a/Rakefile +++ b/Rakefile @@ -21,6 +21,7 @@ begin gem.files.include %w(lib/tasks/opentox.rb, lib/tasks/redis.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end + Jeweler::GemcutterTasks.new rescue LoadError puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler" end -- cgit v1.2.3 From 616e39016c6b10854c164d81b9267831a93bf604 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 17 Nov 2009 12:50:41 +0100 Subject: more dependencies added --- Rakefile | 4 +++- opentox-ruby-api-wrapper.gemspec | 12 +++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Rakefile b/Rakefile index 3d5756a..2c4322f 100644 --- a/Rakefile +++ b/Rakefile @@ -10,13 +10,15 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - gem.add_dependency "technoweenie-rest-client" + gem.add_dependency "rest-client" gem.add_dependency "sinatra" gem.add_dependency "rack" gem.add_dependency "rack-contrib" gem.add_dependency "thin" gem.add_dependency "cucumber" gem.add_dependency "ezmobius-redis-rb" + gem.add_dependency "emk-sinatra-url-for" + gem.add_dependency "cehoffman-sinatra-respond_to" gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] gem.files.include %w(lib/tasks/opentox.rb, lib/tasks/redis.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 3f29975..9017a4c 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -51,29 +51,35 @@ Gem::Specification.new do |s| s.specification_version = 3 if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then - s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) else - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end else - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From 1d2f54edce58dd270687131f0e1c4a46d3c46eb7 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 17 Nov 2009 12:51:06 +0100 Subject: Version bump to 1.1.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9084fa2..524cb55 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.0 +1.1.1 -- cgit v1.2.3 From 1798d467ddbff849a225690e0d851ba8a9a90c13 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 17 Nov 2009 12:51:25 +0100 Subject: Regenerated gemspec for version 1.1.1 --- opentox-ruby-api-wrapper.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 9017a4c..17be199 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.1.0" + s.version = "1.1.1" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] -- cgit v1.2.3 From 9dadb01e2f973f1f33415e79eaddfd408fa5ae8f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 17 Nov 2009 13:42:49 +0100 Subject: Version bump to 1.1.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 524cb55..45a1b3f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.1 +1.1.2 -- cgit v1.2.3 From c796b25c1a70217a7f542bda4a7a51efb66f5b86 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 17 Nov 2009 13:49:00 +0100 Subject: Passenger (re)start fixed --- Rakefile | 5 +- bin/opentox-install-debian.sh | 105 +++++++++++++++++++++++++++++++++++++++ lib/tasks/opentox.rb | 16 ++---- opentox-ruby-api-wrapper.gemspec | 20 ++++++-- 4 files changed, 129 insertions(+), 17 deletions(-) create mode 100644 bin/opentox-install-debian.sh diff --git a/Rakefile b/Rakefile index 2c4322f..9d042a5 100644 --- a/Rakefile +++ b/Rakefile @@ -15,10 +15,13 @@ begin gem.add_dependency "rack" gem.add_dependency "rack-contrib" gem.add_dependency "thin" - gem.add_dependency "cucumber" gem.add_dependency "ezmobius-redis-rb" gem.add_dependency "emk-sinatra-url-for" gem.add_dependency "cehoffman-sinatra-respond_to" + gem.add_dependency "dm-core" + gem.add_dependency "datamapper" + gem.add_dependency "do_sqlite3" + gem.add_development_dependency "cucumber" gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] gem.files.include %w(lib/tasks/opentox.rb, lib/tasks/redis.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings diff --git a/bin/opentox-install-debian.sh b/bin/opentox-install-debian.sh new file mode 100644 index 0000000..cf173da --- /dev/null +++ b/bin/opentox-install-debian.sh @@ -0,0 +1,105 @@ +#!/bin/bash +#Installation is tested on Debian Lenny Ubuntu 9.04 +#Update the system + +ERRLOG='install_err.log' +INSTALLLOG='install_log.log' +DATE=$(date +%Y/%m/%d\ %H:%M:%S) + +echo "=================================================" +echo "Please enshure that the sudo package is installed" +echo "on your system. " +echo "On Ubuntu Linux sudo is installed by default." +echo "If you are unshure check with it 'sudo ls'" +echo "and installed it with 'apt-get install sudo'" +echo "and add your username with visudo." +echo "=================================================" +echo -n "To continue installation press y: " +read answer +if [ "$answer" != "y" ] +then + echo "exiting the script..." + exit 1 +fi + +echo "opentox webservice install log - " $DATE > $INSTALLLOG +echo "Installing: build-essential" +sudo apt-get install build-essential >> $INSTALLLOG 2>>$ERRLOG +echo "Installing: ruby 1.8 with its dev files" +sudo apt-get install ruby ruby1.8-dev >> $INSTALLLOG 2>>$ERRLOG +echo "Installing: gems rdoc rubygems and rake" +sudo apt-get install gems rdoc rubygems rake >> $INSTALLLOG 2>>$ERRLOG + +echo "Installing rubygems from source. This may take some time" +wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz >> $INSTALLLOG 2>>$ERRLOG +tar xzfv rubygems-1.3.5.tgz 2>>$ERRLOG +cd rubygems-1.3.5 >> $INSTALLLOG 2>>$ERRLOG +sudo ruby setup.rb 2>>$ERRLOG +cd .. + +echo "Adding http://gems.github.com to ruby gem sources" +sudo gem sources -a http://gems.github.com >> $INSTALLLOG 2>>$ERRLOG + +#for debian lenny: +echo "Installing packages: zlib1g-dev tcl curl perl ssh tcl tk8.5" +sudo apt-get install zlib1g-dev tcl curl perl ssh tcl tk8.5 >> $INSTALLLOG 2>>$ERRLOG +echo "Installing git from source" +wget http://www.kernel.org/pub/software/scm/git/git-1.6.5.2.tar.gz >> $INSTALLLOG 2>>$ERRLOG +tar xzfv git-1.6.5.2.tar.gz 2>>$ERRLOG +cd git-1.6.5.2 >> $INSTALLLOG 2>>$ERRLOG +./configure 2>>$ERRLOG +make 2>>$ERRLOG +make install 2>>$ERRLOG + +echo "Installing the opentox webservices" +mkdir webservices >> $INSTALLLOG 2>>$ERRLOG +cd webservices >> $INSTALLLOG 2>>$ERRLOG + +git clone git://github.com/helma/opentox-compound.git >> $INSTALLLOG 2>>$ERRLOG +git clone git://github.com/helma/opentox-feature.git >> $INSTALLLOG 2>>$ERRLOG +git clone git://github.com/helma/opentox-dataset.git >> $INSTALLLOG 2>>$ERRLOG +git clone git://github.com/helma/opentox-algorithm.git >> $INSTALLLOG 2>>$ERRLOG +git clone git://github.com/helma/opentox-model.git >> $INSTALLLOG 2>>$ERRLOG +git clone git://github.com/helma/opentox-test.git >> $INSTALLLOG 2>>$ERRLOG + +cd opentox-compound >> $INSTALLLOG 2>>$ERRLOG +git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG +cd ../opentox-feature >> $INSTALLLOG 2>>$ERRLOG +git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG +cd ../opentox-dataset >> $INSTALLLOG 2>>$ERRLOG +git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG +cd ../opentox-algorithm >> $INSTALLLOG 2>>$ERRLOG +git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG +cd ../opentox-model >> $INSTALLLOG 2>>$ERRLOG +git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG +cd .. >> $INSTALLLOG 2>>$ERRLOG +git clone git://github.com/helma/opentox-ruby-api-wrapper.git >> $INSTALLLOG 2>>$ERRLOG +cd opentox-ruby-api-wrapper >> $INSTALLLOG 2>>$ERRLOG +git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG +rake install >> $INSTALLLOG 2>>$ERRLOG + + +cd ../opentox-compound >> $INSTALLLOG 2>>$ERRLOG +echo "Installing libopenssl-ruby" +sudo apt-get install libopenssl-ruby >> $INSTALLLOG 2>>$ERRLOG +echo "Installing dtach" +rake dtach:install >> $INSTALLLOG 2>>$ERRLOG +echo "Installing openbabel" +rake openbabel:install >> $INSTALLLOG 2>>$ERRLOG + +#debian lenny missed liblink: +ln -s /usr/local/lib/libopenbabel.so.3 /usr/lib/libopenbabel.so.3 >> $INSTALLLOG 2>>$ERRLOG + +rake redis:download >> $INSTALLLOG 2>>$ERRLOG +rake redis:install >> $INSTALLLOG 2>>$ERRLOG +#edit /home/[username]/.opentox/config/test.yaml set :base_dir: /home/[username]/webservices +sudo apt-get install libgsl0-dev >> $INSTALLLOG 2>>$ERRLOG +sudo apt-get install swig >> $INSTALLLOG 2>>$ERRLOG +sudo apt-get install curl >> $INSTALLLOG 2>>$ERRLOG +cd ../opentox-algorithm >> $INSTALLLOG 2>>$ERRLOG +echo "Installing fminer" +rake fminer:install >> $INSTALLLOG 2>>$ERRLOG +sudo apt-get install libsqlite3-dev >> $INSTALLLOG 2>>$ERRLOG + + +mkdir ../opentox-model/db >> $INSTALLLOG 2>>$ERRLOG diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb index 8018fff..38202dd 100644 --- a/lib/tasks/opentox.rb +++ b/lib/tasks/opentox.rb @@ -22,16 +22,6 @@ end namespace :opentox do - desc "Install required gems" - task :install do - puts `sudo gem install #{@gems}` - end - - desc "Update gems" - task :update do - puts `sudo gem update #{@gems}` - end - namespace :services do desc "Run opentox services" @@ -51,7 +41,8 @@ namespace :opentox do puts "Cannot start #{service} on port #{port}." end when 'passenger' - `touch #{File.join(dir, 'tmp/restart.txt')}` + FileUtils.mkdir_p File.join(dir, 'tmp') + FileUtils.touch File.join(dir, 'tmp/restart.txt') puts "#{service} restarted." else puts "not yet implemented" @@ -108,7 +99,8 @@ task :start do puts "Cannot start #{service} on port #{port}." end when 'passenger' - `touch tmp/restart.txt` + FileUtils.mkdir_p File.join(dir, 'tmp') + FileUtils.touch File.join(dir, 'tmp/restart.txt') puts "#{service} restarted." else puts "not yet implemented" diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 17be199..c5b293d 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,13 +5,15 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.1.1" + s.version = "1.1.2" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] s.date = %q{2009-11-17} + s.default_executable = %q{opentox-install-debian.sh} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} + s.executables = ["opentox-install-debian.sh"] s.extra_rdoc_files = [ "LICENSE", "README.rdoc" @@ -21,6 +23,7 @@ Gem::Specification.new do |s| "README.rdoc", "Rakefile", "VERSION", + "bin/opentox-install-debian.sh", "lib/algorithm.rb", "lib/compound.rb", "lib/dataset.rb", @@ -56,20 +59,26 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end else s.add_dependency(%q, [">= 0"]) @@ -77,9 +86,12 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From 5be7c77ca745e04d0051d85268d3544b11f087de Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 17 Nov 2009 13:49:26 +0100 Subject: Version bump to 1.1.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 45a1b3f..781dcb0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.2 +1.1.3 -- cgit v1.2.3 From 7d6ae04f8554e3aadfa9ae490445fe2a71a3307e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 18 Nov 2009 19:37:10 +0100 Subject: brackets for future versions --- lib/model.rb | 4 ++-- opentox-ruby-api-wrapper.gemspec | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index ec4d069..4b36aad 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -48,11 +48,11 @@ module OpenTox end def classification - YAML.load(RestClient.get @uri)[:classification] + YAML.load(RestClient.get(@uri))[:classification] end def confidence - YAML.load(RestClient.get @uri)[:confidence] + YAML.load(RestClient.get(@uri))[:confidence] end def neighbors diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index c5b293d..bb54a0c 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.1.2" + s.version = "1.1.3" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] -- cgit v1.2.3 From adfcc9d572a2122b1b030dc04b3abf46007fb3f7 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 23 Nov 2009 18:17:37 +0100 Subject: RDF support added --- Rakefile | 11 +++--- lib/compound.rb | 6 ++-- lib/dataset.rb | 78 ++++++---------------------------------- lib/environment.rb | 2 ++ lib/feature.rb | 48 ------------------------- lib/opentox-ruby-api-wrapper.rb | 6 ++-- opentox-ruby-api-wrapper.gemspec | 15 +------- 7 files changed, 27 insertions(+), 139 deletions(-) delete mode 100644 lib/feature.rb diff --git a/Rakefile b/Rakefile index 9d042a5..1c79e15 100644 --- a/Rakefile +++ b/Rakefile @@ -15,15 +15,16 @@ begin gem.add_dependency "rack" gem.add_dependency "rack-contrib" gem.add_dependency "thin" - gem.add_dependency "ezmobius-redis-rb" + #gem.add_dependency "ezmobius-redis-rb" gem.add_dependency "emk-sinatra-url-for" gem.add_dependency "cehoffman-sinatra-respond_to" - gem.add_dependency "dm-core" - gem.add_dependency "datamapper" - gem.add_dependency "do_sqlite3" + #gem.add_dependency "dm-core" + #gem.add_dependency "datamapper" + #gem.add_dependency "do_sqlite3" gem.add_development_dependency "cucumber" gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] - gem.files.include %w(lib/tasks/opentox.rb, lib/tasks/redis.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) + #gem.files.include %w(lib/tasks/opentox.rb, lib/tasks/redis.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) + gem.files.include %w(lib/tasks/opentox.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/utils.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end Jeweler::GemcutterTasks.new diff --git a/lib/compound.rb b/lib/compound.rb index c4ba8d9..416acab 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -15,7 +15,7 @@ module OpenTox @inchi = params[:inchi] @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:name] - @inchi = RestClient.get "#{@@cactus_uri}#{params[:name]}/stdinchi" + @inchi = RestClient.get("#{@@cactus_uri}#{params[:name]}/stdinchi").chomp @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:uri] @inchi = params[:uri].sub(/^.*InChI/, 'InChI') @@ -44,8 +44,8 @@ module OpenTox end # Match an array of smarts features, returns matching features - def match(smarts_dataset) - smarts_dataset.all_features.collect{ |uri| uri if self.match?(Feature.new(:uri => uri).name) }.compact + def match(smarts_array) + smarts_array.collect{|s| s if match?(s)}.compact end def smiles2inchi(smiles) diff --git a/lib/dataset.rb b/lib/dataset.rb index 754e7f4..fe49622 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -1,11 +1,5 @@ module OpenTox - # key: /datasets - # set: dataset uris - # key: /dataset/:dataset/compounds - # set: compound uris - # key: /dataset/:dataset/compound/:inchi - # set: feature uris class Dataset < OpenTox # Initialize with :uri => uri or :name => name (creates a new dataset) @@ -13,81 +7,31 @@ module OpenTox super(uri) end - def self.create(params) - uri = RestClient.post @@config[:services]["opentox-dataset"], :name => params[:name] + def self.create(data) + uri = RestClient.post @@config[:services]["opentox-dataset"], data, :content_type => 'application/rdf+xml' Dataset.new(uri.to_s) end - def self.find(params) - begin - if params[:name] - uri = File.join(@@config[:services]["opentox-dataset"], URI.encode(params[:name])) - elsif params[:uri] - uri = params[:uri] - end - RestClient.get uri # check if the resource is available - Dataset.new(uri) if uri - rescue - nil - end - end - - def self.find_or_create(params) - self.create(params) unless self.find(params) + def self.find(uri) + RestClient.get uri # check if the resource is available end def self.base_uri @@config[:services]["opentox-dataset"] end - def import(params) - if params[:csv] - # RestClient seems not to work for file uploads - #RestClient.post @uri + '/import', :compound_format => params[:compound_format], :content_type => "text/csv", :file => File.new(params[:csv]) - `curl -X POST -F "file=@#{params[:csv]};type=text/csv" -F compound_format=#{params[:compound_format]} #{@uri + '/import'}` - end - end - - def add(features) - RestClient.put @uri, :features => features - end - - # Get all compounds from a dataset - def compound_uris - RestClient.get(File.join(@uri, 'compounds')).split("\n") - end - - def compounds - compound_uris.collect{|uri| Compound.new(:uri => uri)} - end - - # Get all features for a compound - def feature_uris(compound) - uri = File.join(@uri, 'compound', CGI.escape(compound.inchi)) # URI.encode does not work here - RestClient.get(uri).split("\n") - end - - # Get all features for a compound - def features(compound) - feature_uris(compound).collect{|uri| Feature.new(:uri => uri)} - end - - def all_features - RestClient.get(File.join(@uri, 'features')).split("\n") - end - # Delete a dataset def delete RestClient.delete @uri end - def tanimoto(dataset) - RestClient.get(File.join(@uri,'tanimoto',dataset.path)) - end - - def weighted_tanimoto(dataset) - RestClient.get(File.join(@uri,'weighted_tanimoto',dataset.path)) - end +# def tanimoto(dataset) +# RestClient.get(File.join(@uri,'tanimoto',dataset.path)) +# end +# +# def weighted_tanimoto(dataset) +# RestClient.get(File.join(@uri,'weighted_tanimoto',dataset.path)) +# end end diff --git a/lib/environment.rb b/lib/environment.rb index 3a9319d..7ce6c7e 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -18,6 +18,7 @@ else end # configure redis database +=begin begin case ENV['RACK_ENV'] when 'production' @@ -31,3 +32,4 @@ begin rescue puts "Redis database not running, please start it with 'rake redis:start'." end +=end diff --git a/lib/feature.rb b/lib/feature.rb deleted file mode 100644 index a3ba333..0000000 --- a/lib/feature.rb +++ /dev/null @@ -1,48 +0,0 @@ -module OpenTox - - # uri: /feature/:name/:property_name/:property_value/... - class Feature < OpenTox - - attr_accessor :name, :values - - def initialize(params) - if params[:uri] - @uri = params[:uri] - items = URI.split(@uri)[5].split(/\//) - @name = items[1] - @values = {} - i = 2 - while i < items.size - @values[items[i]] = items[i+1] - i += 2 - end - else - @name = params[:name] - @values = {} - params.each do |k,v| - @values[k] = v unless k.to_s == 'name' - end - @uri = File.join(@@config[:services]["opentox-feature"],path) - end - end - - def values_path - path = '' - @values.each do |k,v| - path = File.join path, URI.encode(k.to_s), URI.encode(v.to_s) - end - path - end - - def path - File.join(URI.encode(@name),values_path) - end - - def value(property) - items = @uri.split(/\//) - i = items.index(property) - items[i+1] - end - - end -end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index c4d9d4e..a55b59e 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,4 +1,5 @@ -['rubygems', 'sinatra', 'sinatra/url_for', 'redis','builder', 'rest_client', 'yaml', 'cgi', 'spork', 'environment'].each do |lib| +#['rubygems', 'sinatra', 'sinatra/url_for', 'redis','builder', 'rest_client', 'yaml', 'cgi', 'spork', 'environment'].each do |lib| +['rubygems', 'sinatra', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'cgi', 'spork', 'environment'].each do |lib| require lib end @@ -8,6 +9,7 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['opentox', 'compound','feature','dataset','algorithm','model','task','utils'].each do |lib| +#['opentox', 'compound','feature','dataset','algorithm','model','task','utils'].each do |lib| +['opentox', 'compound','dataset','algorithm','model','task','utils'].each do |lib| require lib end diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index bb54a0c..db31db0 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-11-17} + s.date = %q{2009-11-20} s.default_executable = %q{opentox-install-debian.sh} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} @@ -28,7 +28,6 @@ Gem::Specification.new do |s| "lib/compound.rb", "lib/dataset.rb", "lib/environment.rb", - "lib/feature.rb", "lib/helper.rb", "lib/model.rb", "lib/opentox-ruby-api-wrapper.rb", @@ -59,12 +58,8 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) @@ -72,12 +67,8 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end else @@ -86,12 +77,8 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From fc3bda0095ca7e6968edf01bec034a243d294af4 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 14 Dec 2009 09:41:59 +0100 Subject: Initial adaptation to RDF/OWL --- Rakefile | 7 +- lib/algorithm.rb | 52 ++++----- lib/compound.rb | 19 +++- lib/dataset.rb | 239 +++++++++++++++++++++++++++++++++++++--- lib/environment.rb | 6 + lib/model.rb | 66 ++++++++--- lib/opentox-ruby-api-wrapper.rb | 6 +- lib/opentox.rb | 27 ----- lib/owl.rb | 102 +++++++++++++++++ lib/task.rb | 11 +- 10 files changed, 433 insertions(+), 102 deletions(-) delete mode 100644 lib/opentox.rb create mode 100644 lib/owl.rb diff --git a/Rakefile b/Rakefile index 1c79e15..c5cb026 100644 --- a/Rakefile +++ b/Rakefile @@ -15,16 +15,11 @@ begin gem.add_dependency "rack" gem.add_dependency "rack-contrib" gem.add_dependency "thin" - #gem.add_dependency "ezmobius-redis-rb" gem.add_dependency "emk-sinatra-url-for" gem.add_dependency "cehoffman-sinatra-respond_to" - #gem.add_dependency "dm-core" - #gem.add_dependency "datamapper" - #gem.add_dependency "do_sqlite3" gem.add_development_dependency "cucumber" gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] - #gem.files.include %w(lib/tasks/opentox.rb, lib/tasks/redis.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/feature.rb, lib/model.rb, lib/utils.rb, lib/templates/*) - gem.files.include %w(lib/tasks/opentox.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/utils.rb, lib/templates/*) + gem.files.include %w(lib/tasks/owl.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/utils.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end Jeweler::GemcutterTasks.new diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 43f7ede..a32a462 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -1,35 +1,37 @@ module OpenTox module Algorithm - class Fminer < OpenTox - # Create a new dataset with BBRC features - def self.create(params) - puts params[:dataset_uri] - uri = RestClient.post File.join(@@config[:services]["opentox-algorithm"],'fminer'), :dataset_uri => params[:dataset_uri] - print "fminer finsihed " - puts uri - uri - end - end + class Fminer #< OpenTox + include Owl - class Similarity < OpenTox - - def self.tanimoto(dataset1,compound1,dataset2,compound2) - RestClient.get File.join(@@config[:services]["opentox-algorithm"], 'tanimoto/dataset',dataset1.name,compound1.inchi,'dataset',dataset2.name,compound2.inchi) + def initialize + super + self.uri = File.join(@@config[:services]["opentox-algorithm"],'fminer') + self.title = "fminer" + self.source = "http://github.com/amaunz/libfminer" + self.parameters = { + "Dataset URI" => { :scope => "mandatory", :value => "dataset_uri" }, + "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri" } + } end - - def self.weighted_tanimoto(dataset1,compound1,dataset2,compound2) - # URI.escape does not work here - uri = File.join(@@config[:services]["opentox-algorithm"], 'weighted_tanimoto/dataset',CGI.escape(dataset1.name),'compound',CGI.escape(compound1.inchi),'dataset',CGI.escape(dataset2.name),'compound',CGI.escape(compound2.inchi)) - RestClient.get uri - end - end - class Lazar < OpenTox - # Create a new prediction model from a dataset - def self.create(params) - RestClient.post File.join(@@config[:services]["opentox-algorithm"],"lazar_classification"), params + class Lazar #< OpenTox + include Owl + + def initialize + super + self.uri = File.join(@@config[:services]["opentox-algorithm"],'lazar') + self.title = "lazar" + self.source = "http://github.com/helma/opentox-algorithm" + self.parameters = { + "Dataset URI" => + { :scope => "mandatory", :value => "dataset_uri" }, + "Feature URI for dependent variable" => + { :scope => "mandatory", :value => "feature_uri" }, + "Feature generation URI" => + { :scope => "mandatory", :value => "feature_generation_uri" } + } end end diff --git a/lib/compound.rb b/lib/compound.rb index 416acab..9e1cee7 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -1,9 +1,8 @@ module OpenTox - # uri: /compound/:inchi - class Compound < OpenTox + class Compound #< OpenTox - attr_reader :inchi + attr_reader :inchi, :uri # Initialize with :uri => uri, :smiles => smiles or :name => name (name can be also an InChI/InChiKey, CAS number, etc) def initialize(params) @@ -14,6 +13,9 @@ module OpenTox elsif params[:inchi] @inchi = params[:inchi] @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) + elsif params[:sdf] + @inchi = sdf2inchi(params[:sdf]) + @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:name] @inchi = RestClient.get("#{@@cactus_uri}#{params[:name]}/stdinchi").chomp @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) @@ -48,6 +50,10 @@ module OpenTox smarts_array.collect{|s| s if match?(s)}.compact end + def sdf2inchi(sdf) + obconversion(sdf,'sdf','inchi') + end + def smiles2inchi(smiles) obconversion(smiles,'smi','inchi') end @@ -61,7 +67,12 @@ module OpenTox obmol = OpenBabel::OBMol.new obconversion.set_in_and_out_formats input_format, output_format obconversion.read_string obmol, identifier - obconversion.write_string(obmol).gsub(/\s/,'').chomp + case output_format + when /smi|can|inchi/ + obconversion.write_string(obmol).gsub(/\s/,'').chomp + else + obconversion.write_string(obmol) + end end end end diff --git a/lib/dataset.rb b/lib/dataset.rb index fe49622..fad6baa 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -1,23 +1,184 @@ module OpenTox - class Dataset < OpenTox + class Dataset + include Owl - # Initialize with :uri => uri or :name => name (creates a new dataset) - def initialize(uri) - super(uri) + #attr_accessor :model + + def initialize + super + end + + # find or create a new compound and return the resource + def find_or_create_compound(uri) + compound = @model.subject(DC["identifier"], uri) + if compound.nil? + compound = @model.create_resource + @model.add compound, RDF['type'], OT["Compound"] + @model.add compound, DC["identifier"], uri + end + compound + end + + # find or create a new feature and return the resource + def find_or_create_feature(f) + feature = @model.subject(DC["title"], f[:name].to_s) + if feature.nil? + feature = @model.create_resource + @model.add feature, RDF['type'], OT["Feature"] + @model.add feature, DC["identifier"], File.join("feature",feature.to_s.gsub(/[()]/,'')) # relative uri as we don know the final uri + @model.add feature, DC["title"], f[:name].to_s + @model.add feature, OT['hasSource'], f[:source].to_s if f[:source] + end + feature + end + + # find or create a new value and return the resource + def find_or_create_value(v) + value = @model.subject OT["value"], v.to_s + if value.nil? + value = @model.create_resource + @model.add value, RDF['type'], OT["FeatureValue"] + @model.add value, OT["value"], v.to_s + end + value + end + + def tuple?(t) + statements = [] + has_tuple = true + t.each do |name,v| + feature = self.find_or_create_feature(:name => name) + value = self.find_or_create_value(v) + tuple = @model.subject(feature,value) + has_tuple = false if tuple.nil? + statements << [tuple,feature,value] + end + tuples_found = statements.collect{|s| s[0]}.uniq + has_tuple = false unless tuples_found.size == 1 + has_tuple end - def self.create(data) - uri = RestClient.post @@config[:services]["opentox-dataset"], data, :content_type => 'application/rdf+xml' - Dataset.new(uri.to_s) + def create_tuple(t) + tuple = @model.create_resource + @model.add tuple, RDF['type'], OT["Tuple"] + t.each do |name,value| + feature = self.find_or_create_feature(:name => name) + value = self.find_or_create_value(value) + pair = @model.create_resource + @model.add tuple, OT['tuple'], pair + @model.add pair, OT['feature'], feature + @model.add pair, OT['value'], value + end + tuple + end + + def find_or_create_tuple(t) + if self.tuple?(t) + t + else + self.create_tuple(t) + end + end + + def add_data_entry(compound,feature,value) + data_entry = @model.create_resource + @model.add data_entry, RDF['type'], OT["DataEntry"] + @model.add data_entry, OT['compound'], compound + @model.add data_entry, OT['feature'], feature + @model.add data_entry, OT['values'], value + end + + def self.create(data, content_type = 'application/rdf+xml') + uri = RestClient.post @@config[:services]["opentox-dataset"], data, :content_type => content_type + dataset = Dataset.new + dataset.read uri.to_s + dataset end def self.find(uri) - RestClient.get uri # check if the resource is available + begin + RestClient.get uri # check if the resource is available + dataset = Dataset.new + dataset.read uri.to_s + dataset + rescue + nil + end + end + + def features end - def self.base_uri - @@config[:services]["opentox-dataset"] + def feature_values(uri) + features = {} + feature = @model.subject(DC["identifier"],uri) + @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| + compound = @model.object(compound_node, DC["identifier"]).to_s.sub(/^\[(.*)\]$/,'\1') + features[compound] = [] unless features[compound] + @model.subjects(OT['compound'], compound_node).each do |data_entry| + if feature == @model.object(data_entry, OT['feature']) + values_node = @model.object(data_entry, OT['values']) + @model.find(values_node, OT['value'], nil) do |s,p,value| + case value.to_s + when "true" + features[compound] << true + when "false" + features[compound] << false + else + features[compound] << value.to_s + end + end + end + end + end + features + end + + def tuples + tuples = [] + @model.subjects(RDF['type'], OT["Tuple"]).each do |t| + tuple = {} + compounds = [] + @model.subjects(OT['values'], t).each do |data_entry| + compound_node = @model.object(data_entry,OT['compound']) + compounds << @model.object(compound_node, DC["identifier"]).to_s + end + @model.find(t, OT['tuple'],nil) do |s,p,pair| + feature_node = @model.object(pair, OT['feature']) + feature_name = @model.object(feature_node, DC['title']).to_s + value_node = @model.object(pair, OT['value']) + value = @model.object(value_node, OT['value']).to_s + value = value.to_f if value.match(/^[\d\.]+$/) + tuple[feature_name.to_sym] = value + end + tuple[:compounds] = compounds + tuples << tuple + end + tuples + end + + def tuple(compound_uri) + compound_node = @model.subject(DC["identifier"],compound_uri) + #puts compound_uri + @model.subjects(OT['compound'], compound_node).each do |data_entry| + values_node = @model.object(data_entry, OT['values']) + @model.find(values_node, OT['tuple'], nil) do |s,p,tuple| + @model.find(tuple, OT['feature'], nil) do |s,p,feature| + name = @model.object(feature,DC['title']).to_s + #puts name + end + end + #puts values_node + end + end + + def compounds + compounds = [] + @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| + compounds << @model.object(compound_node, DC["identifier"])#.to_s.sub(/^\[(.*)\]$/,'\1') + end + compounds end # Delete a dataset @@ -25,6 +186,15 @@ module OpenTox RestClient.delete @uri end + def save + RestClient.post(@@config[:services]["opentox-dataset"], self.rdf, :content_type => "application/rdf+xml").to_s + end + + end + +end + + # def tanimoto(dataset) # RestClient.get(File.join(@uri,'tanimoto',dataset.path)) # end @@ -32,7 +202,48 @@ module OpenTox # def weighted_tanimoto(dataset) # RestClient.get(File.join(@uri,'weighted_tanimoto',dataset.path)) # end - - end - -end +=begin + def data_entries + data = {} + @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| + compound = @model.object(compound_node, DC["identifier"]).to_s#.sub(/^\[(.*)\]$/,'\1') + #compound = OpenTox::Compound.new(:inchi => compound).smiles + data[compound] = [] unless data[compound] + #puts compound + @model.subjects(OT['compound'], compound_node).each do |data_entry| + feature_node = @model.object(data_entry, OT['feature']) + feature = @model.object(feature_node, DC["identifier"]).to_s + values_node = @model.object(data_entry, OT['values']) + type = @model.object(values_node,RDF['type']).to_s + case type + when /FeatureValue/ + @model.find(values_node, OT['value'], nil) do |s,p,value| + case value.to_s + when "true" + data[compound] << {feature => true} + when "false" + data[compound] << {feature => false} + else + data[compound] << {feature => value.to_s} + end + end + when /Tuple/ # this is really slow + t = {} + @model.find(values_node, OT['tuple'], nil) do |s,p,tuple| + @model.find(tuple, OT['feature'], nil) do |s,p,feature| + @name = @model.object(feature,DC['title']).to_s + end + @model.find(tuple, OT['value'], nil) do |s,p,value| + v = @model.object(value,OT['value']).to_s + t[@name] = v + #print @name + ": " + #puts v + end + end + data[compound] << t + end + end + end + data + end +=end diff --git a/lib/environment.rb b/lib/environment.rb index 7ce6c7e..6100928 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -17,6 +17,12 @@ else exit end +# RDF namespaces +RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' +OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#' +DC = Redland::Namespace.new 'http://purl.org/dc/elements/1.1/' +OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#' + # configure redis database =begin begin diff --git a/lib/model.rb b/lib/model.rb index 4b36aad..50d6bea 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -1,38 +1,69 @@ module OpenTox - - module Model - - class LazarClassification < OpenTox - + module Model + class Lazar + include Owl + # Create a new prediction model from a dataset - def initialize(uri) - super(uri) + def initialize + super end - def self.create(params) - uri = RestClient.post File.join(@@config[:services]["opentox-model"], 'lazar_classification'), params - puts "URI: " + uri - LazarClassification.new(uri.to_s) + def read_yaml(id,yaml) + @lazar = YAML.load yaml + self.identifier = File.join(@@config[:services]["opentox-model"],'lazar',id) + self.title = "lazar model for #{@lazar[:endpoint]}" + self.source = "http://github.com/helma/opentox-model" + self.parameters = { + "Dataset URI" => { :scope => "mandatory", :value => "dataset_uri=#{@lazar[:activity_dataset]}" }, + "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri=#{@lazar[:endpoint]}" }, + "Feature generation URI" => { :scope => "mandatory", :value => "feature_generation_uri=" } #TODO write to yaml + } + self.algorithm = File.join(@@config[:services]["opentox-model"],"lazar") + self.trainingDataset = @lazar[:activity_dataset] + self.dependentVariables = @lazar[:endpoint] + self.predictedVariables = @lazar[:endpoint] + " lazar prediction" end - def self.find(name) - uri = RestClient.get File.join(@@config[:services]["opentox-model"], 'lazar_classification', URI.encode(params[:name])) - LazarClassification.new(uri) + def self.find(uri) + begin + YAML.load(RestClient.get uri) + Lazar.new uri + rescue + halt 404, "Model #{uri} not found." + end end def self.find_all - RestClient.get File.join(@@config[:services]["opentox-model"], 'lazar_classification')#.split("\n") + RestClient.get(@@config[:services]["opentox-model"]).split("\n") end - + # Predict a compound def predict(compound) - LazarPrediction.new(:uri => RestClient.post(@uri, :compound_uri => compound.uri)) + RestClient.post(@uri, :compound_uri => compound.uri) end def self.base_uri @@config[:services]["opentox-model"] end + def self.create(data) + RestClient.post(@@config[:services]["opentox-model"], data, :content_type => "application/x-yaml").to_s + end + + def endpoint + YAML.load(RestClient.get uri)[:endpoint] + end + + end + end + + +=begin + module Model + + class LazarClassification < OpenTox + + end end @@ -68,4 +99,5 @@ module OpenTox end end +=end end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index a55b59e..ca57fc9 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,5 +1,4 @@ -#['rubygems', 'sinatra', 'sinatra/url_for', 'redis','builder', 'rest_client', 'yaml', 'cgi', 'spork', 'environment'].each do |lib| -['rubygems', 'sinatra', 'sinatra/url_for', 'builder', 'rest_client', 'yaml', 'cgi', 'spork', 'environment'].each do |lib| +['rubygems', 'sinatra', 'sinatra/url_for', 'rest_client', 'yaml', 'cgi', 'spork', 'redland', 'rdf/redland', 'rdf/redland/util', 'environment'].each do |lib| require lib end @@ -9,7 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -#['opentox', 'compound','feature','dataset','algorithm','model','task','utils'].each do |lib| -['opentox', 'compound','dataset','algorithm','model','task','utils'].each do |lib| +['owl', 'compound','dataset','algorithm','model','task','utils'].each do |lib| require lib end diff --git a/lib/opentox.rb b/lib/opentox.rb deleted file mode 100644 index 9b1226b..0000000 --- a/lib/opentox.rb +++ /dev/null @@ -1,27 +0,0 @@ -module OpenTox - - class OpenTox - attr_accessor :uri - - def initialize(uri) - @uri = uri - end - - # Get the object name - def name - RestClient.get @uri + '/name' - end - - # Deletes an object - def destroy - RestClient.delete @uri - end - - # Object path without hostname - def path - URI.split(@uri)[5] - end - - end - -end diff --git a/lib/owl.rb b/lib/owl.rb new file mode 100644 index 0000000..c858fec --- /dev/null +++ b/lib/owl.rb @@ -0,0 +1,102 @@ +module OpenTox + + module Owl + + attr_reader :uri, :model + + def initialize + + @model = Redland::Model.new Redland::MemoryStore.new + @parser = Redland::Parser.new + @serializer = Redland::Serializer.ntriples + + # explicit typing + # this should come from http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file (does not pass OWL-DL validation) + @model.add @uri, RDF['type'], OWL['Ontology'] + # annotation properties + @model.add DC['source'], RDF['type'], OWL["AnnotationProperty"] + @model.add DC['identifier'], RDF['type'], OWL["AnnotationProperty"] + @model.add DC['title'], RDF['type'], OWL["AnnotationProperty"] + # object properties + @model.add OT['feature'], RDF['type'], OWL["ObjectProperty"] + @model.add OT['compound'], RDF['type'], OWL["ObjectProperty"] + @model.add OT['values'], RDF['type'], OWL["ObjectProperty"] + @model.add OT['tuple'], RDF['type'], OWL["ObjectProperty"] # added by ch + @model.add OT['parameters'], RDF['type'], OWL["ObjectProperty"] + # datatype properties + @model.add OT['value'], RDF['type'], OWL["DatatypeProperty"] + @model.add OT['paramValue'], RDF['type'], OWL["DatatypeProperty"] + @model.add OT['paramScope'], RDF['type'], OWL["DatatypeProperty"] + @model.add OT['hasSource'], RDF['type'], OWL["DatatypeProperty"] + # classes + @model.add OT['Dataset'], RDF['type'], OWL["Class"] + @model.add OT['FeatureValue'], RDF['type'], OWL["Class"] + @model.add OT['Tuple'], RDF['type'], OWL["Class"] # added by ch + @model.add OT['Feature'], RDF['type'], OWL["Class"] + @model.add OT['Compound'], RDF['type'], OWL["Class"] + @model.add OT['DataEntry'], RDF['type'], OWL["Class"] + @model.add OT['Parameter'], RDF['type'], OWL["Class"] + @model.add OT['Algorithm'], RDF['type'], OWL["Class"] + end + + def owl_class + self.class.to_s.sub(/^OpenTox::/,'') + #@model.subject RDF['type'], OT[self.class.to_s.sub(/^OpenTox::/,'')] + end + + def read(uri) + @parser.parse_into_model(@model,uri) + @uri = uri + end + + def rdf=(rdf) + @uri = '/' unless @uri + @parser.parse_string_into_model(@model,rdf,@uri) + end + + def rdf + @model.to_string + end + + def uri=(uri) + identifier = uri + end + + def to_ntriples + @serializer.model_to_string(Redland::Uri.new(@uri), @model) + end + + def title + puts OT[self.owl_class] + @model.object(OT[self.owl_class], DC['title']).to_s + end + + def parameters=(params) + params.each do |name, settings| + parameter = @model.create_resource + @model.add parameter, RDF['type'], OT['Parameter'] + @model.add parameter, DC['title'], name + @model.add parameter, OT['paramScope'], settings[:scope] + @model.add parameter, OT['paramValue'], settings[:value] + end + end + + def create_owl_statement(name,value) + r = @model.create_resource + @model.add r, RDF['type'], DC[name.gsub(/^[a-z]/) { |a| a.upcase }] # capitalize only the first letter + @model.add r, DC[name], value + end + + def method_missing(name, *args) + # create magic setter methods + if /=/ =~ name.to_s + puts "create_owl_statement #{name.to_s.sub(/=/,'')}, #{args.first}" + create_owl_statement name.to_s.sub(/=/,''), args.first + else + raise "No method #{name}" + end + end + + end + +end diff --git a/lib/task.rb b/lib/task.rb index 74c3fb8..079d387 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,15 +1,16 @@ module OpenTox - class Task < OpenTox - #private :new + class Task #< OpenTox def initialize(uri) super(uri) end - def self.create(params) - uri = RestClient.post @@config[:services]["opentox-task"], :resource_uri => params[:resource_uri] - Task.new uri + #def self.create(uri) + def self.create + puts @@config[:services]["opentox-task"] + uri = RestClient.post @@config[:services]["opentox-task"], ''#, :dataset_uri => uri + Task.new(uri) end def self.find(params) -- cgit v1.2.3 From fd1f87ae2675ec0c613ab2aaa29b5c3ea021d475 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 14 Dec 2009 09:42:31 +0100 Subject: Version bump to 1.2.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 781dcb0..26aaba0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.3 +1.2.0 -- cgit v1.2.3 From 5add2182dcc06911d4595077b2fbd46433a17f3c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 14 Dec 2009 09:46:06 +0100 Subject: gemspec updated --- opentox-ruby-api-wrapper.gemspec | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index db31db0..d157349 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -1,19 +1,18 @@ # Generated by jeweler -# DO NOT EDIT THIS FILE -# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec` +# DO NOT EDIT THIS FILE DIRECTLY +# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command # -*- encoding: utf-8 -*- Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.1.3" + s.version = "1.2.0" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-11-20} - s.default_executable = %q{opentox-install-debian.sh} + s.date = %q{2009-12-14} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} - s.executables = ["opentox-install-debian.sh"] + s.executables = ["opentox-install-debian.sh", "csv2rdf.rb"] s.extra_rdoc_files = [ "LICENSE", "README.rdoc" @@ -23,22 +22,22 @@ Gem::Specification.new do |s| "README.rdoc", "Rakefile", "VERSION", + "bin/csv2rdf.rb", "bin/opentox-install-debian.sh", "lib/algorithm.rb", "lib/compound.rb", "lib/dataset.rb", "lib/environment.rb", + "lib/feature.rb", "lib/helper.rb", "lib/model.rb", "lib/opentox-ruby-api-wrapper.rb", - "lib/opentox.rb", + "lib/owl.rb", "lib/spork.rb", "lib/task.rb", "lib/tasks/opentox.rb", "lib/tasks/redis.rb", "lib/templates/config.ru", - "lib/templates/config.ru", - "lib/templates/config.yaml", "lib/templates/config.yaml", "lib/utils.rb" ] @@ -82,3 +81,4 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) end end + -- cgit v1.2.3 From 89ea016cdb626aaf167ef0edb7be4e75ebac8673 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Dec 2009 12:35:27 +0100 Subject: csv2rdf.rb removed from gemspec --- opentox-ruby-api-wrapper.gemspec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index d157349..76dec1e 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,10 +9,11 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-12-14} + s.date = %q{2009-12-16} + s.default_executable = %q{opentox-install-debian.sh} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} - s.executables = ["opentox-install-debian.sh", "csv2rdf.rb"] + s.executables = ["opentox-install-debian.sh"] s.extra_rdoc_files = [ "LICENSE", "README.rdoc" @@ -22,7 +23,6 @@ Gem::Specification.new do |s| "README.rdoc", "Rakefile", "VERSION", - "bin/csv2rdf.rb", "bin/opentox-install-debian.sh", "lib/algorithm.rb", "lib/compound.rb", -- cgit v1.2.3 From a32dc3b2e2c65e11424f5b695b62062d22f83d6e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Dec 2009 13:54:15 +0100 Subject: OWL from OpenTox website, explicit types for DC classes --- lib/owl.rb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/owl.rb b/lib/owl.rb index c858fec..81f2e57 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -12,6 +12,8 @@ module OpenTox # explicit typing # this should come from http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file (does not pass OWL-DL validation) + @parser.parse_into_model(@model,"http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file") +=begin @model.add @uri, RDF['type'], OWL['Ontology'] # annotation properties @model.add DC['source'], RDF['type'], OWL["AnnotationProperty"] @@ -37,6 +39,7 @@ module OpenTox @model.add OT['DataEntry'], RDF['type'], OWL["Class"] @model.add OT['Parameter'], RDF['type'], OWL["Class"] @model.add OT['Algorithm'], RDF['type'], OWL["Class"] +=end end def owl_class @@ -67,7 +70,7 @@ module OpenTox end def title - puts OT[self.owl_class] + #puts OT[self.owl_class] @model.object(OT[self.owl_class], DC['title']).to_s end @@ -83,14 +86,18 @@ module OpenTox def create_owl_statement(name,value) r = @model.create_resource - @model.add r, RDF['type'], DC[name.gsub(/^[a-z]/) { |a| a.upcase }] # capitalize only the first letter + dc_class = DC[name.gsub(/^[a-z]/) { |a| a.upcase }] # capitalize only the first letter + @model.add dc_class, RDF['type'], OWL["Class"] + @model.add r, RDF['type'], dc_class @model.add r, DC[name], value + #puts r + #puts DC[name.gsub(/^[a-z]/) { |a| a.upcase }] # capitalize only the first letter + #puts DC[name] # capitalize only the first letter end def method_missing(name, *args) # create magic setter methods if /=/ =~ name.to_s - puts "create_owl_statement #{name.to_s.sub(/=/,'')}, #{args.first}" create_owl_statement name.to_s.sub(/=/,''), args.first else raise "No method #{name}" -- cgit v1.2.3 From 887a921e25c3d7778e9e5ce998f52fde41d517f8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Dec 2009 13:55:34 +0100 Subject: Version bump to 1.2.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 26aaba0..6085e94 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.0 +1.2.1 -- cgit v1.2.3 From a5789305534c2a622a658e7ef14b016a1bac4bd6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 17 Dec 2009 13:58:03 +0100 Subject: YAML output for datasets added --- lib/dataset.rb | 72 +++++++++++++++++++++++++++++++++++----- lib/owl.rb | 60 +++++++++++++-------------------- opentox-ruby-api-wrapper.gemspec | 2 +- 3 files changed, 87 insertions(+), 47 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index fad6baa..895c9fc 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -3,8 +3,6 @@ module OpenTox class Dataset include Owl - #attr_accessor :model - def initialize super end @@ -28,7 +26,7 @@ module OpenTox @model.add feature, RDF['type'], OT["Feature"] @model.add feature, DC["identifier"], File.join("feature",feature.to_s.gsub(/[()]/,'')) # relative uri as we don know the final uri @model.add feature, DC["title"], f[:name].to_s - @model.add feature, OT['hasSource'], f[:source].to_s if f[:source] + @model.add feature, DC['source'], f[:source].to_s if f[:source] end feature end @@ -66,9 +64,12 @@ module OpenTox feature = self.find_or_create_feature(:name => name) value = self.find_or_create_value(value) pair = @model.create_resource - @model.add tuple, OT['tuple'], pair + @model.add pair, RDF['type'], OT['FeatureValue'] + @model.add tuple, OT['complexValue'], pair @model.add pair, OT['feature'], feature - @model.add pair, OT['value'], value + @model.add pair, OT['value'], value #FIX + #@model.add tuple, OT['feature'], feature + #@model.add tuple, OT['values'], value end tuple end @@ -98,7 +99,7 @@ module OpenTox def self.find(uri) begin - RestClient.get uri # check if the resource is available + RestClient.get uri, :accept => 'application/rdf+xml' # check if the resource is available dataset = Dataset.new dataset.read uri.to_s dataset @@ -108,11 +109,42 @@ module OpenTox end def features + features = [] + @model.subjects(RDF['type'], OT["Feature"]).each do |feature_node| + features << @model.object(feature_node, DC["identifier"])# + end + features end - def feature_values(uri) + def data_entries + data_entries = {} + self.compounds.each do |compound| + compound_node = @model.subject(DC["identifier"],compound) + compound = compound.to_s.sub(/^\[(.*)\]$/,'\1') + data_entries[compound] = {} unless data_entries[compound] + @model.subjects(OT['compound'], compound_node).each do |data_entry| + feature_node = @model.object(data_entry, OT['feature']) + feature = @model.object(feature_node,DC['identifier']).to_s + values_node = @model.object(data_entry, OT['values']) + data_entries[compound][feature] = [] unless data_entries[compound][feature] + @model.find(values_node, OT['value'], nil) do |s,p,value| + case value.to_s + when "true" + data_entries[compound][feature] << true + when "false" + data_entries[compound][feature] << false + else + data_entries[compound][feature] << value.to_s + end + end + end + end + data_entries + end + + def feature_values(feature_uri) features = {} - feature = @model.subject(DC["identifier"],uri) + feature = @model.subject(DC["identifier"],feature_uri) @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| compound = @model.object(compound_node, DC["identifier"]).to_s.sub(/^\[(.*)\]$/,'\1') features[compound] = [] unless features[compound] @@ -176,7 +208,7 @@ module OpenTox def compounds compounds = [] @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| - compounds << @model.object(compound_node, DC["identifier"])#.to_s.sub(/^\[(.*)\]$/,'\1') + compounds << @model.object(compound_node, DC["identifier"])# end compounds end @@ -190,6 +222,28 @@ module OpenTox RestClient.post(@@config[:services]["opentox-dataset"], self.rdf, :content_type => "application/rdf+xml").to_s end + def to_yaml + #compounds.each do |c| + #end + { + :uri => self.uri, + :opentox_class => self.owl_class, + :title => self.title, + :source => self.source, + :identifier => self.identifier, + :compounds => self.compounds.collect{|c| c.to_s.to_s.sub(/^\[(.*)\]$/,'\1')}, + :features => self.features.collect{|f| f.to_s }, + :data_entries => self.data_entries, +=begin + :tuples => self.compounds.collect{|c| + compound_uri = c.to_s.to_s.sub(/^\[(.*)\]$/,'\1') + {compound_uri => self.tuple(compound_uri)} + }, +=end + #:feature_values => self.features.collect{|f| { f.to_s => self.feature_values(f.to_s)} } + }.to_yaml + end + end end diff --git a/lib/owl.rb b/lib/owl.rb index 81f2e57..d0d3ee0 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -2,7 +2,7 @@ module OpenTox module Owl - attr_reader :uri, :model + attr_reader :uri#, :model def initialize @@ -10,36 +10,10 @@ module OpenTox @parser = Redland::Parser.new @serializer = Redland::Serializer.ntriples - # explicit typing - # this should come from http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file (does not pass OWL-DL validation) - @parser.parse_into_model(@model,"http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file") -=begin - @model.add @uri, RDF['type'], OWL['Ontology'] - # annotation properties - @model.add DC['source'], RDF['type'], OWL["AnnotationProperty"] - @model.add DC['identifier'], RDF['type'], OWL["AnnotationProperty"] - @model.add DC['title'], RDF['type'], OWL["AnnotationProperty"] - # object properties - @model.add OT['feature'], RDF['type'], OWL["ObjectProperty"] - @model.add OT['compound'], RDF['type'], OWL["ObjectProperty"] - @model.add OT['values'], RDF['type'], OWL["ObjectProperty"] - @model.add OT['tuple'], RDF['type'], OWL["ObjectProperty"] # added by ch - @model.add OT['parameters'], RDF['type'], OWL["ObjectProperty"] - # datatype properties - @model.add OT['value'], RDF['type'], OWL["DatatypeProperty"] - @model.add OT['paramValue'], RDF['type'], OWL["DatatypeProperty"] - @model.add OT['paramScope'], RDF['type'], OWL["DatatypeProperty"] - @model.add OT['hasSource'], RDF['type'], OWL["DatatypeProperty"] - # classes - @model.add OT['Dataset'], RDF['type'], OWL["Class"] - @model.add OT['FeatureValue'], RDF['type'], OWL["Class"] - @model.add OT['Tuple'], RDF['type'], OWL["Class"] # added by ch - @model.add OT['Feature'], RDF['type'], OWL["Class"] - @model.add OT['Compound'], RDF['type'], OWL["Class"] - @model.add OT['DataEntry'], RDF['type'], OWL["Class"] - @model.add OT['Parameter'], RDF['type'], OWL["Class"] - @model.add OT['Algorithm'], RDF['type'], OWL["Class"] -=end + # read OT Ontology + #@parser.parse_into_model(@model,"http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file") + @parser.parse_string_into_model(@model,File.read(File.join(File.dirname(__FILE__),"opentox.owl")),'/') + #@model.add OT['ComplexValue'], RDF['type'], OWL["Class"] # added by ch end def owl_class @@ -62,7 +36,11 @@ module OpenTox end def uri=(uri) - identifier = uri + @uri = uri + me = @model.subject(RDF['type'],OT[self.owl_class]) + identifier = @model.object(me, DC['identifier']) + @model.delete me, DC['identifier'], identifier + @model.add me, DC['identifier'], uri end def to_ntriples @@ -70,8 +48,18 @@ module OpenTox end def title - #puts OT[self.owl_class] - @model.object(OT[self.owl_class], DC['title']).to_s + me = @model.subject(RDF['type'],OT[self.owl_class]) + @model.object(me, DC['title']).to_s unless me.nil? + end + + def source + me = @model.subject(RDF['type'],OT[self.owl_class]) + @model.object(me, DC['source']).to_s unless me.nil? + end + + def identifier + me = @model.subject(RDF['type'],OT[self.owl_class]) + @model.object(me, DC['identifier']).to_s unless me.nil? end def parameters=(params) @@ -87,12 +75,10 @@ module OpenTox def create_owl_statement(name,value) r = @model.create_resource dc_class = DC[name.gsub(/^[a-z]/) { |a| a.upcase }] # capitalize only the first letter + #puts "DC:" + name.gsub(/^[a-z]/) { |a| a.upcase } @model.add dc_class, RDF['type'], OWL["Class"] @model.add r, RDF['type'], dc_class @model.add r, DC[name], value - #puts r - #puts DC[name.gsub(/^[a-z]/) { |a| a.upcase }] # capitalize only the first letter - #puts DC[name] # capitalize only the first letter end def method_missing(name, *args) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 76dec1e..827296f 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.2.0" + s.version = "1.2.1" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] -- cgit v1.2.3 From 03b1a477aca26a8ba662474f16c7427052067d4e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 18 Dec 2009 13:29:14 +0100 Subject: assignement of metadata fixed --- lib/dataset.rb | 19 +++++++++---- lib/owl.rb | 90 ++++++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 76 insertions(+), 33 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 895c9fc..b96f3e9 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -7,6 +7,13 @@ module OpenTox super end + def add(compound_uri,feature_uri,value) + c = self.find_or_create_compound compound_uri + f = self.find_or_create_feature feature_uri + v = self.find_or_create_value value + self.add_data_entry(c,f,v) + end + # find or create a new compound and return the resource def find_or_create_compound(uri) compound = @model.subject(DC["identifier"], uri) @@ -19,14 +26,14 @@ module OpenTox end # find or create a new feature and return the resource - def find_or_create_feature(f) - feature = @model.subject(DC["title"], f[:name].to_s) + def find_or_create_feature(uri) + feature = @model.subject(DC["identifier"], uri) if feature.nil? feature = @model.create_resource @model.add feature, RDF['type'], OT["Feature"] - @model.add feature, DC["identifier"], File.join("feature",feature.to_s.gsub(/[()]/,'')) # relative uri as we don know the final uri - @model.add feature, DC["title"], f[:name].to_s - @model.add feature, DC['source'], f[:source].to_s if f[:source] + @model.add feature, DC["identifier"], uri + @model.add feature, DC["title"], File.basename(uri) + @model.add feature, DC['source'], uri end feature end @@ -233,7 +240,7 @@ module OpenTox :identifier => self.identifier, :compounds => self.compounds.collect{|c| c.to_s.to_s.sub(/^\[(.*)\]$/,'\1')}, :features => self.features.collect{|f| f.to_s }, - :data_entries => self.data_entries, + #:data_entries => self.data_entries, =begin :tuples => self.compounds.collect{|c| compound_uri = c.to_s.to_s.sub(/^\[(.*)\]$/,'\1') diff --git a/lib/owl.rb b/lib/owl.rb index d0d3ee0..c42f6ae 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -2,7 +2,7 @@ module OpenTox module Owl - attr_reader :uri#, :model + attr_reader :uri def initialize @@ -13,12 +13,69 @@ module OpenTox # read OT Ontology #@parser.parse_into_model(@model,"http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file") @parser.parse_string_into_model(@model,File.read(File.join(File.dirname(__FILE__),"opentox.owl")),'/') - #@model.add OT['ComplexValue'], RDF['type'], OWL["Class"] # added by ch + # reate an anonymous resource for metadata + # this has to be rewritten with an URI as soon as the resource has been saved at an definitive location + tmp = @model.create_resource + @model.add tmp, RDF['type'], OWL['Ontology'] + @model.add tmp, RDF['type'], OT[self.owl_class] + end + + def uri=(uri) + puts "assigning uri" + @uri = uri + uri = Redland::Uri.new(uri) + # rewrite uri + @model.subjects(RDF['type'],OT[self.owl_class]).each do |me| + @model.delete(me,RDF['type'],OT[self.owl_class]) + @model.add(uri,RDF['type'],OT[self.owl_class]) + id = @model.object(me, DC['identifier']) + @model.delete me, DC['identifier'], id + # find/replace metadata + @model.find(me, nil, nil) do |s,p,o| + @model.delete s,p,o + @model.add uri,p,o + end + @model.add uri, DC['identifier'], @uri + end + end + + def title + me = @model.subject(RDF['type'],OT[self.owl_class]) + @model.object(me, DC['title']).to_s unless me.nil? + end + + def title=(title) + me = @model.subject(RDF['type'],OT[self.owl_class]) + begin + t = @model.object(me, DC['title']) + @model.delete me, DC['title'], t + rescue + end + @model.add me, DC['title'], title + end + + def source + me = @model.subject(RDF['type'],OT[self.owl_class]) + @model.object(me, DC['source']).to_s unless me.nil? + end + + def source=(source) + me = @model.subject(RDF['type'],OT[self.owl_class]) + begin + t = @model.object(me, DC['source']) + @model.delete me, DC['source'], t + rescue + end + @model.add me, DC['source'], source + end + + def identifier + me = @model.subject(RDF['type'],OT[self.owl_class]) + @model.object(me, DC['identifier']).to_s unless me.nil? end def owl_class - self.class.to_s.sub(/^OpenTox::/,'') - #@model.subject RDF['type'], OT[self.class.to_s.sub(/^OpenTox::/,'')] + self.class.to_s.sub(/^OpenTox::/,'').sub(/::.*$/,'') end def read(uri) @@ -35,33 +92,10 @@ module OpenTox @model.to_string end - def uri=(uri) - @uri = uri - me = @model.subject(RDF['type'],OT[self.owl_class]) - identifier = @model.object(me, DC['identifier']) - @model.delete me, DC['identifier'], identifier - @model.add me, DC['identifier'], uri - end - def to_ntriples @serializer.model_to_string(Redland::Uri.new(@uri), @model) end - def title - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.object(me, DC['title']).to_s unless me.nil? - end - - def source - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.object(me, DC['source']).to_s unless me.nil? - end - - def identifier - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.object(me, DC['identifier']).to_s unless me.nil? - end - def parameters=(params) params.each do |name, settings| parameter = @model.create_resource @@ -72,6 +106,7 @@ module OpenTox end end +=begin def create_owl_statement(name,value) r = @model.create_resource dc_class = DC[name.gsub(/^[a-z]/) { |a| a.upcase }] # capitalize only the first letter @@ -89,6 +124,7 @@ module OpenTox raise "No method #{name}" end end +=end end -- cgit v1.2.3 From ca2e240e03a4e458f83281c28b529e44af81d132 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 19 Dec 2009 13:28:55 +0100 Subject: OWL-DL for fminer and datasets fixed --- lib/dataset.rb | 167 +++++------- lib/opentox.owl | 809 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/owl.rb | 8 +- 3 files changed, 885 insertions(+), 99 deletions(-) create mode 100644 lib/opentox.owl diff --git a/lib/dataset.rb b/lib/dataset.rb index b96f3e9..225b900 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -7,17 +7,57 @@ module OpenTox super end - def add(compound_uri,feature_uri,value) - c = self.find_or_create_compound compound_uri - f = self.find_or_create_feature feature_uri - v = self.find_or_create_value value - self.add_data_entry(c,f,v) + # create/add to entry from uris or Redland::Resources + # TODO add tuple + def add(compound,feature,value) + compound = self.find_or_create_compound compound unless compound.class == Redland::Resource + feature = self.find_or_create_feature feature unless feature.class == Redland::Resource + data_entry = @model.subject OT['compound'], compound + if data_entry.nil? + data_entry = @model.create_resource + @model.add data_entry, RDF['type'], OT["DataEntry"] + @model.add data_entry, OT['compound'], compound + end + values = @model.create_resource + @model.add data_entry, OT['values'], values + @model.add values, RDF['type'], OT['FeatureValue'] + @model.add values, OT['feature'], feature + @model.add values, OT['value'], value.to_s + end + + def add_tuple(compound,tuple) + compound = self.find_or_create_compound compound unless compound.class == Redland::Resource + data_entry = @model.subject OT['compound'], compound + if data_entry.nil? + data_entry = @model.create_resource + @model.add data_entry, RDF['type'], OT["DataEntry"] + @model.add data_entry, OT['compound'], compound + end + @model.add data_entry, OT['values'], tuple + end + + def create_tuple(feature,t) + feature = self.find_or_create_feature feature unless feature.class == Redland::Resource + tuple = @model.create_resource + @model.add tuple, RDF['type'], OT["Tuple"] + @model.add tuple, OT['feature'], feature + t.each do |name,value| + f = self.find_or_create_feature name unless name.class == Redland::Resource + complex_value = @model.create_resource + feature = self.find_or_create_feature(name) + @model.add tuple, OT['complexValue'], complex_value + @model.add complex_value, RDF['type'], OT["FeatureValue"] + @model.add complex_value, OT['feature'], f + @model.add complex_value, OT['value'], value.to_s + end + tuple end # find or create a new compound and return the resource def find_or_create_compound(uri) compound = @model.subject(DC["identifier"], uri) if compound.nil? + #puts uri compound = @model.create_resource @model.add compound, RDF['type'], OT["Compound"] @model.add compound, DC["identifier"], uri @@ -32,13 +72,14 @@ module OpenTox feature = @model.create_resource @model.add feature, RDF['type'], OT["Feature"] @model.add feature, DC["identifier"], uri - @model.add feature, DC["title"], File.basename(uri) + @model.add feature, DC["title"], File.basename(uri).split(/#/)[1] @model.add feature, DC['source'], uri end feature end # find or create a new value and return the resource +=begin def find_or_create_value(v) value = @model.subject OT["value"], v.to_s if value.nil? @@ -48,47 +89,9 @@ module OpenTox end value end +=end - def tuple?(t) - statements = [] - has_tuple = true - t.each do |name,v| - feature = self.find_or_create_feature(:name => name) - value = self.find_or_create_value(v) - tuple = @model.subject(feature,value) - has_tuple = false if tuple.nil? - statements << [tuple,feature,value] - end - tuples_found = statements.collect{|s| s[0]}.uniq - has_tuple = false unless tuples_found.size == 1 - has_tuple - end - - def create_tuple(t) - tuple = @model.create_resource - @model.add tuple, RDF['type'], OT["Tuple"] - t.each do |name,value| - feature = self.find_or_create_feature(:name => name) - value = self.find_or_create_value(value) - pair = @model.create_resource - @model.add pair, RDF['type'], OT['FeatureValue'] - @model.add tuple, OT['complexValue'], pair - @model.add pair, OT['feature'], feature - @model.add pair, OT['value'], value #FIX - #@model.add tuple, OT['feature'], feature - #@model.add tuple, OT['values'], value - end - tuple - end - - def find_or_create_tuple(t) - if self.tuple?(t) - t - else - self.create_tuple(t) - end - end - +=begin def add_data_entry(compound,feature,value) data_entry = @model.create_resource @model.add data_entry, RDF['type'], OT["DataEntry"] @@ -96,6 +99,7 @@ module OpenTox @model.add data_entry, OT['feature'], feature @model.add data_entry, OT['values'], value end +=end def self.create(data, content_type = 'application/rdf+xml') uri = RestClient.post @@config[:services]["opentox-dataset"], data, :content_type => content_type @@ -254,57 +258,28 @@ module OpenTox end end - - -# def tanimoto(dataset) -# RestClient.get(File.join(@uri,'tanimoto',dataset.path)) -# end -# -# def weighted_tanimoto(dataset) -# RestClient.get(File.join(@uri,'weighted_tanimoto',dataset.path)) -# end =begin - def data_entries - data = {} - @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| - compound = @model.object(compound_node, DC["identifier"]).to_s#.sub(/^\[(.*)\]$/,'\1') - #compound = OpenTox::Compound.new(:inchi => compound).smiles - data[compound] = [] unless data[compound] - #puts compound - @model.subjects(OT['compound'], compound_node).each do |data_entry| - feature_node = @model.object(data_entry, OT['feature']) - feature = @model.object(feature_node, DC["identifier"]).to_s - values_node = @model.object(data_entry, OT['values']) - type = @model.object(values_node,RDF['type']).to_s - case type - when /FeatureValue/ - @model.find(values_node, OT['value'], nil) do |s,p,value| - case value.to_s - when "true" - data[compound] << {feature => true} - when "false" - data[compound] << {feature => false} - else - data[compound] << {feature => value.to_s} - end - end - when /Tuple/ # this is really slow - t = {} - @model.find(values_node, OT['tuple'], nil) do |s,p,tuple| - @model.find(tuple, OT['feature'], nil) do |s,p,feature| - @name = @model.object(feature,DC['title']).to_s - end - @model.find(tuple, OT['value'], nil) do |s,p,value| - v = @model.object(value,OT['value']).to_s - t[@name] = v - #print @name + ": " - #puts v - end - end - data[compound] << t - end - end + def tuple?(t) + statements = [] + has_tuple = true + t.each do |name,v| + feature = self.find_or_create_feature(:name => name) + value = self.find_or_create_value(v) + tuple = @model.subject(feature,value) + has_tuple = false if tuple.nil? + statements << [tuple,feature,value] + end + tuples_found = statements.collect{|s| s[0]}.uniq + has_tuple = false unless tuples_found.size == 1 + has_tuple + end + + def find_or_create_tuple(t) + if self.tuple?(t) + t + else + self.create_tuple(t) end - data end =end + diff --git a/lib/opentox.owl b/lib/opentox.owl new file mode 100644 index 0000000..4760055 --- /dev/null +++ b/lib/opentox.owl @@ -0,0 +1,809 @@ + + + + http://opentox.org/dev/apis/api-1.1 + 2009-11-22 + martin.guetlein@gmail.com + jeliazkova.nina@gmail.com + OpenTox resource ontology + OpenTox API + OpenTox + + + + http://opentox.org/dev/apis/api-1.1/dataset + + /dataset/{datasetid} + + Original source of the dataset + + + Provides access to chemical compounds and their features (e.g. structural, physical-chemical, biological, toxicological properties) + + + + + + + + + + + + + + + + + + + + + + + + + + + A generic OpenTox resource + name of the resource + URI of the resource + 1.1 + + + + + + + + + TODO: Specify allowed values for model content + The native format of the model content (e.g. PMML, Weka model, etc.) + + + + TODO: Introduce a link to User resource + /model/{modelid} + The model creator (perhaps a link to User resource) + + + The date of model creation + + + A validation corresponds to the validation of a model on a test dataset. The results are stored in another dataset. Parameters with default values are optional. + Datetime + http://opentox.org/dev/apis/api-1.1/Validation + + + + http://opentox.org/dev/apis/api-1.1/Validation#validation-report + + + + TODO: AlgorithmType, or link to Algorithm ontology + 1.1 + Reference + TODO: statistics supported - is it possible to reuse ValidationInfo classes? + /algorithm/{algorithmid} + + http://opentox.org/dev/apis/api-1.1/Algorithm + Name of the algorithm + + + + + + + + + + + + + Provides access to OpenTox algorithms + + + + + + + + + + + + + + + encapsulates validation information + + + + + + + + /compound/{compoundid} + http://opentox.org/dev/apis/api-1.1/structure + + + + + 1.1 + + + + + + + + API for OpenTox compound webservices + + + + + + + + true + + + + [Optional] support for multiple (e.g. 3D) structures per chemical compound (single structure by default) + /compound/{compoundid}/conformer/{conformerid} + + + + + + + + + + + + + + + + 1.1 + + + + /feature/{featureid} + + + + + + + + + + + + + + + + /dataset/{datasetid}/compound/{compoundid}?feature_uri[]=featureuris + + + 1.1 + + Encapsulates a dataset entry - defined by a single Compound (or conformer) and multiple FeatureValues. Could be regarded as "Compound with features" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PredictionDatasetURI + + + + + + + + + + + + + + + + + + + A model can have one or more dependent variables, described as multiple features, specified by this relationship. + + + + + + + + + + + + + + + + Algorithms and Models can have multiple parameters + http://opentox.org/api/1.1 + + + + + + + + + + + + + Test dataset , used in a validation exercise + + + + + + http://opentox.org/api/1.1 + + Variables, holding the predicted values, generated by the model + + + http://opentox.org/api/1.1 + + + A Dataset contains multiple DataEntries. This property specifies the relationship between Dataset and DataEntry. + + + + + + a link to UnscrambledDataset + UnscrambledDatasetURI + + + + http://opentox.org/api/1.1 + A model can have multiple independent variables, described as multiple features, specified by this relationship. + + + + + + Links Validation with Validation Info. One validation exercise may have multiple types of validation informaton + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A DataEntry is defined with a single compound and multiple feature values. This property sets the relationship between a DataEntry and multiple FeatureValues + http://opentox.org/api/1.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cancelled + + + Running + + + Completed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Parameter value + The value of a Parameter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Units + Units for a feature value + TODO: make use of units ontology + + + + + + + + + + + + + + + + + + + + + + + Allows to define "is a" relationships outside of particular class hierarchy + + + + Model used in a validation exercise + + + + + + + + Number incorrect + + + + + + + Percent Correct + + + + + + + RootMeanSquaredError + + + + + + + + YScramblingEnabled + + YScramblingEnabled + + + + + YScramblingSeed + YScramblingSeed + + + + + + + + + + + Has 3D structure + + True, if the compound has 3D structure + + + + + + Literal + + Feature value + + + + + + A model is derived by applying an Algorithm on a training Dataset. + http://opentox.org/api/1.1 + + + + + + + + + + http://opentox.org/api/1.1 + The algorithm, used to create the Model + + + + + + + + + + Number correct + + + + + + + + + + + + + + + + + + specifies if a parameter is optional or mandatory + + + + + + + optional + + mandatory + + + + Parameter scope + + + + + Percentage completed + + + + + http://opentox.org/api/1.1 + + + + A DataEntry is defined with a single compound and multiple feature values. This property sets the relationship between a DataEntry and a Compound + + + + + Percent Incorrect + + + + + + MeanAbsolutError + + + + + + FeatureValue contains a value for specific Feature, specified by this relationship. + + + http://opentox.org/api/1.1 + + + + + + + + + + + + + + diff --git a/lib/owl.rb b/lib/owl.rb index c42f6ae..d9da563 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -21,7 +21,6 @@ module OpenTox end def uri=(uri) - puts "assigning uri" @uri = uri uri = Redland::Uri.new(uri) # rewrite uri @@ -40,8 +39,11 @@ module OpenTox end def title - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.object(me, DC['title']).to_s unless me.nil? + # I have no idea, why 2 subjects are returned + # iterating over all subjects leads to memory allocation problems + # SPARQL queries also do not work + me = @model.subjects(RDF['type'],OT[self.owl_class])[1] + @model.object(me, DC['title']).to_s end def title=(title) -- cgit v1.2.3 From 0d91dcbdb333c89e636d2df85420c5183706036b Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 20 Dec 2009 19:12:40 +0100 Subject: Version bump to 0.0.0 --- VERSION | 2 +- bin/yaml2owl.rb | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100755 bin/yaml2owl.rb diff --git a/VERSION b/VERSION index 6085e94..77d6f4c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.1 +0.0.0 diff --git a/bin/yaml2owl.rb b/bin/yaml2owl.rb new file mode 100755 index 0000000..b259ad1 --- /dev/null +++ b/bin/yaml2owl.rb @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby +require 'rubygems' +require 'opentox-ruby-api-wrapper' + +input = YAML.load_file(ARGV[0]) +dataset = OpenTox::Dataset.new +dataset.title = input[:title] +dataset.source = input[:source] +input[:data].each do |c,f| + f.each do |k,v| + v.each do |value| + dataset.add c,k,value + end + end +end +outfile = File.expand_path(File.join(File.dirname(__FILE__),ARGV[0].sub(/yaml/,'owl'))) +dataset.uri = outfile +File.open(outfile,'w+'){|f| f.puts dataset.rdf} -- cgit v1.2.3 From 70b693b791c59bea18f31ffff4b3e71c0fe11df1 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 20 Dec 2009 19:13:55 +0100 Subject: Version bump to 0.0.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 77d6f4c..8acdd82 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.0 +0.0.1 -- cgit v1.2.3 From 9b3c95a45258279826d95ebfd843e1904f923ca7 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 20 Dec 2009 19:14:06 +0100 Subject: Version bump to 1.0.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8acdd82..3eefcb9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.1 +1.0.0 -- cgit v1.2.3 From 4fd59f0353f74385f7fcd575db340d03eaf9ac86 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 20 Dec 2009 19:14:14 +0100 Subject: Version bump to 1.1.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 3eefcb9..9084fa2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0 +1.1.0 -- cgit v1.2.3 From c29bd67afc551e40dc19f5f5dab7f2a3cdefa824 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 20 Dec 2009 19:14:18 +0100 Subject: Version bump to 1.2.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9084fa2..26aaba0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.0 +1.2.0 -- cgit v1.2.3 From 45c0fee953ec076358122b2ad17958ec60d2bbf6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 20 Dec 2009 19:14:25 +0100 Subject: Version bump to 1.2.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 26aaba0..6085e94 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.0 +1.2.1 -- cgit v1.2.3 From fbee9fbf8ce286a1264ef4ce8f3dfb77d048d067 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 20 Dec 2009 19:14:33 +0100 Subject: Version bump to 1.2.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6085e94..23aa839 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.1 +1.2.2 -- cgit v1.2.3 From 89bc8a67e63cf8e752f3b89aa52f7db87ce7ea7f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 20 Dec 2009 19:16:25 +0100 Subject: model adapted to OWL-DL, dataset predictions added --- lib/algorithm.rb | 22 ++++++ lib/dataset.rb | 133 +++++++++++------------------------ lib/model.rb | 147 ++++++++++++++++++++++++++------------- opentox-ruby-api-wrapper.gemspec | 9 +-- 4 files changed, 166 insertions(+), 145 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index a32a462..7fe08fa 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -14,6 +14,10 @@ module OpenTox "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri" } } end + + def self.create_feature_dataset(params) + RestClient.post params[:feature_generation_uri], :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri] + end end class Lazar #< OpenTox @@ -35,5 +39,23 @@ module OpenTox end end + class Similarity + + def self.weighted_tanimoto(fp_a,fp_b,p) + common_features = fp_a & fp_b + all_features = fp_a + fp_b + common_p_sum = 0.0 + if common_features.size > 0 + common_features.each{|f| common_p_sum += p[f]} + all_p_sum = 0.0 + all_features.each{|f| all_p_sum += p[f]} + common_p_sum/all_p_sum + else + 0.0 + end + end + + end + end end diff --git a/lib/dataset.rb b/lib/dataset.rb index 225b900..30f9644 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -8,7 +8,6 @@ module OpenTox end # create/add to entry from uris or Redland::Resources - # TODO add tuple def add(compound,feature,value) compound = self.find_or_create_compound compound unless compound.class == Redland::Resource feature = self.find_or_create_feature feature unless feature.class == Redland::Resource @@ -57,7 +56,6 @@ module OpenTox def find_or_create_compound(uri) compound = @model.subject(DC["identifier"], uri) if compound.nil? - #puts uri compound = @model.create_resource @model.add compound, RDF['type'], OT["Compound"] @model.add compound, DC["identifier"], uri @@ -78,29 +76,6 @@ module OpenTox feature end - # find or create a new value and return the resource -=begin - def find_or_create_value(v) - value = @model.subject OT["value"], v.to_s - if value.nil? - value = @model.create_resource - @model.add value, RDF['type'], OT["FeatureValue"] - @model.add value, OT["value"], v.to_s - end - value - end -=end - -=begin - def add_data_entry(compound,feature,value) - data_entry = @model.create_resource - @model.add data_entry, RDF['type'], OT["DataEntry"] - @model.add data_entry, OT['compound'], compound - @model.add data_entry, OT['feature'], feature - @model.add data_entry, OT['values'], value - end -=end - def self.create(data, content_type = 'application/rdf+xml') uri = RestClient.post @@config[:services]["opentox-dataset"], data, :content_type => content_type dataset = Dataset.new @@ -127,30 +102,35 @@ module OpenTox features end - def data_entries - data_entries = {} - self.compounds.each do |compound| - compound_node = @model.subject(DC["identifier"],compound) - compound = compound.to_s.sub(/^\[(.*)\]$/,'\1') - data_entries[compound] = {} unless data_entries[compound] - @model.subjects(OT['compound'], compound_node).each do |data_entry| - feature_node = @model.object(data_entry, OT['feature']) - feature = @model.object(feature_node,DC['identifier']).to_s - values_node = @model.object(data_entry, OT['values']) - data_entries[compound][feature] = [] unless data_entries[compound][feature] - @model.find(values_node, OT['value'], nil) do |s,p,value| - case value.to_s - when "true" - data_entries[compound][feature] << true - when "false" - data_entries[compound][feature] << false - else - data_entries[compound][feature] << value.to_s + def data + data = {} + @model.subjects(RDF['type'], OT['DataEntry']).each do |data_entry| + compound_node = @model.object(data_entry, OT['compound']) + @model.find(compound_node, OT['identifier'],nil) {|s,p,o| puts o.to_s} + compound_uri = @model.object(compound_node, DC['identifier']).to_s + data[compound_uri] = [] unless data[compound_uri] + @model.find(data_entry, OT['values'], nil) do |s,p,values| + entry = {} + feature_node = @model.object values, OT['feature'] + feature_uri = @model.object(feature_node, DC['identifier']).to_s + # TODO simple features + type = @model.object(values, RDF['type']) + if type == OT['FeatureValue'] + #entry[feature_uri] = [] unless entry[feature_uri] + entry[feature_uri] = @model.object(values, OT['value']).to_s + elsif type == OT['Tuple'] + entry[feature_uri] = {} unless entry[feature_uri] + @model.find(values, OT['complexValue'],nil) do |s,p,complex_value| + name_node = @model.object complex_value, OT['feature'] + name = @model.object(name_node, DC['title']).to_s + value = @model.object(complex_value, OT['value']).to_s + entry[feature_uri][name] = value end end + data[compound_uri] << entry end end - data_entries + data end def feature_values(feature_uri) @@ -159,18 +139,17 @@ module OpenTox @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| compound = @model.object(compound_node, DC["identifier"]).to_s.sub(/^\[(.*)\]$/,'\1') features[compound] = [] unless features[compound] - @model.subjects(OT['compound'], compound_node).each do |data_entry| - if feature == @model.object(data_entry, OT['feature']) - values_node = @model.object(data_entry, OT['values']) - @model.find(values_node, OT['value'], nil) do |s,p,value| - case value.to_s - when "true" - features[compound] << true - when "false" - features[compound] << false - else - features[compound] << value.to_s - end + data_entry = @model.subject(OT['compound'], compound_node) + @model.find( data_entry, OT['values'], nil ) do |s,p,values| + if feature == @model.object(values, OT['feature']) + value = @model.object(values, OT['value']) + case value.to_s + when "true" + features[compound] << true + when "false" + features[compound] << false + else + features[compound] << value.to_s end end end @@ -178,6 +157,7 @@ module OpenTox features end +=begin def tuples tuples = [] @model.subjects(RDF['type'], OT["Tuple"]).each do |t| @@ -215,11 +195,12 @@ module OpenTox #puts values_node end end +=end def compounds compounds = [] @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| - compounds << @model.object(compound_node, DC["identifier"])# + compounds << @model.object(compound_node, DC["identifier"]).to_s end compounds end @@ -234,8 +215,6 @@ module OpenTox end def to_yaml - #compounds.each do |c| - #end { :uri => self.uri, :opentox_class => self.owl_class, @@ -244,42 +223,10 @@ module OpenTox :identifier => self.identifier, :compounds => self.compounds.collect{|c| c.to_s.to_s.sub(/^\[(.*)\]$/,'\1')}, :features => self.features.collect{|f| f.to_s }, - #:data_entries => self.data_entries, -=begin - :tuples => self.compounds.collect{|c| - compound_uri = c.to_s.to_s.sub(/^\[(.*)\]$/,'\1') - {compound_uri => self.tuple(compound_uri)} - }, -=end - #:feature_values => self.features.collect{|f| { f.to_s => self.feature_values(f.to_s)} } + :data_entries => self.data_entries, }.to_yaml end end end -=begin - def tuple?(t) - statements = [] - has_tuple = true - t.each do |name,v| - feature = self.find_or_create_feature(:name => name) - value = self.find_or_create_value(v) - tuple = @model.subject(feature,value) - has_tuple = false if tuple.nil? - statements << [tuple,feature,value] - end - tuples_found = statements.collect{|s| s[0]}.uniq - has_tuple = false unless tuples_found.size == 1 - has_tuple - end - - def find_or_create_tuple(t) - if self.tuple?(t) - t - else - self.create_tuple(t) - end - end -=end - diff --git a/lib/model.rb b/lib/model.rb index 50d6bea..2f4525a 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -1,16 +1,18 @@ module OpenTox module Model + class Lazar include Owl + + attr_accessor :dataset, :predictions # Create a new prediction model from a dataset - def initialize - super - end - - def read_yaml(id,yaml) - @lazar = YAML.load yaml - self.identifier = File.join(@@config[:services]["opentox-model"],'lazar',id) + def initialize(yaml) + super() + id = File.basename(yaml,'.yaml') + # TODO Untyped Individual: http://localhost:4003/lazar/{id} ???? + @lazar = YAML.load_file yaml + self.uri = File.join(@@config[:services]["opentox-model"],'lazar',id) self.title = "lazar model for #{@lazar[:endpoint]}" self.source = "http://github.com/helma/opentox-model" self.parameters = { @@ -18,19 +20,24 @@ module OpenTox "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri=#{@lazar[:endpoint]}" }, "Feature generation URI" => { :scope => "mandatory", :value => "feature_generation_uri=" } #TODO write to yaml } - self.algorithm = File.join(@@config[:services]["opentox-model"],"lazar") + self.algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") self.trainingDataset = @lazar[:activity_dataset] self.dependentVariables = @lazar[:endpoint] - self.predictedVariables = @lazar[:endpoint] + " lazar prediction" + self.independentVariables = "http://localhost:4002/fminer#BBRC_representative" # TODO read this from dataset + self.predictedVariables = @lazar[:endpoint] #+ " lazar prediction" + @dataset = OpenTox::Dataset.new + @predictions = {} end def self.find(uri) +=begin begin YAML.load(RestClient.get uri) Lazar.new uri rescue halt 404, "Model #{uri} not found." end +=end end def self.find_all @@ -42,6 +49,65 @@ module OpenTox RestClient.post(@uri, :compound_uri => compound.uri) end + def database_activity?(compound_uri) + # find database activities + db_activities = @lazar[:activities][compound_uri] + if db_activities + c = @dataset.find_or_create_compound(compound_uri) + f = @dataset.find_or_create_feature(@lazar[:endpoint]) + v = db_activities.join(',') + @dataset.add c,f,v + @predictions[compound_uri] = { @lazar[:endpoint] => {:measured_activities => db_activities}} + true + else + false + end + end + + def classify(compound_uri) + + compound = OpenTox::Compound.new(:uri => compound_uri) + compound_matches = compound.match @lazar[:features] + + conf = 0.0 + neighbors = [] + classification = nil + + @lazar[:fingerprints].each do |uri,matches| + + sim = OpenTox::Algorithm::Similarity.weighted_tanimoto(compound_matches,matches,@lazar[:p_values]) + if sim > 0.3 + neighbors << uri + @lazar[:activities][uri].each do |act| + case act.to_s + when 'true' + conf += OpenTox::Utils.gauss(sim) + when 'false' + conf -= OpenTox::Utils.gauss(sim) + end + end + end + end + + conf = conf/neighbors.size + if conf > 0.0 + classification = true + elsif conf < 0.0 + classification = false + end + + compound = @dataset.find_or_create_compound(compound_uri) + feature = @dataset.find_or_create_feature(@lazar[:endpoint]) + tuple = @dataset.create_tuple(feature,{ 'lazar#classification' => classification, 'lazar#confidence' => conf}) + @dataset.add_tuple compound,tuple + @predictions[compound_uri] = { @lazar[:endpoint] => { :lazar_prediction => { + :classification => classification, + :confidence => conf, + :neighbors => neighbors, + :features => compound_matches + } } } + end + def self.base_uri @@config[:services]["opentox-model"] end @@ -54,50 +120,35 @@ module OpenTox YAML.load(RestClient.get uri)[:endpoint] end - end - end - - -=begin - module Model - - class LazarClassification < OpenTox - - - end - - end - - module Prediction - - module Classification - - class Lazar < OpenTox - - def initialize(params) - super(params[:uri]) - end - - def classification - YAML.load(RestClient.get(@uri))[:classification] - end - - def confidence - YAML.load(RestClient.get(@uri))[:confidence] - end + def algorithm=(algorithm) + me = @model.subject(RDF['type'],OT[self.owl_class]) + @model.add me, OT['algorithm'], Redland::Uri.new(algorithm) # untyped individual comes from this line, why?? + @model.add Redland::Uri.new(algorithm), RDF['type'], OT['Algorithm'] + end - def neighbors - RestClient.get @uri + '/neighbors' - end + def trainingDataset=(trainingDataset) + me = @model.subject(RDF['type'],OT[self.owl_class]) + @model.add me, OT['trainingDataset'], Redland::Uri.new(trainingDataset) # untyped individual comes from this line, why?? + @model.add Redland::Uri.new(trainingDataset), RDF['type'], OT['Dataset'] + end - def features - RestClient.get @uri + '/features' - end + def dependentVariables=(dependentVariables) + me = @model.subject(RDF['type'],OT[self.owl_class]) + @model.add me, OT['dependentVariables'], Redland::Uri.new(dependentVariables) # untyped individual comes from this line, why?? + @model.add Redland::Uri.new(dependentVariables), RDF['type'], OT['Feature'] + end + def independentVariables=(independentVariables) + me = @model.subject(RDF['type'],OT[self.owl_class]) + @model.add me, OT['independentVariables'], Redland::Uri.new(independentVariables) # untyped individual comes from this line, why?? + @model.add Redland::Uri.new(independentVariables), RDF['type'], OT['Feature'] end + def predictedVariables=(predictedVariables) + me = @model.subject(RDF['type'],OT[self.owl_class]) + @model.add me, OT['predictedVariables'], Redland::Uri.new(predictedVariables) # untyped individual comes from this line, why?? + @model.add Redland::Uri.new(predictedVariables), RDF['type'], OT['Feature'] + end end - end -=end end diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 827296f..41335e9 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,15 +5,14 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.2.1" + s.version = "1.2.2" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-12-16} - s.default_executable = %q{opentox-install-debian.sh} + s.date = %q{2009-12-20} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} - s.executables = ["opentox-install-debian.sh"] + s.executables = ["opentox-install-debian.sh", "yaml2owl.rb"] s.extra_rdoc_files = [ "LICENSE", "README.rdoc" @@ -24,6 +23,7 @@ Gem::Specification.new do |s| "Rakefile", "VERSION", "bin/opentox-install-debian.sh", + "bin/yaml2owl.rb", "lib/algorithm.rb", "lib/compound.rb", "lib/dataset.rb", @@ -32,6 +32,7 @@ Gem::Specification.new do |s| "lib/helper.rb", "lib/model.rb", "lib/opentox-ruby-api-wrapper.rb", + "lib/opentox.owl", "lib/owl.rb", "lib/spork.rb", "lib/task.rb", -- cgit v1.2.3 From 52a39a978bb1c8a6caa5882f12eb1830893563b8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 21 Dec 2009 15:18:43 +0100 Subject: Version bump to 1.2.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 23aa839..0495c4a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.2 +1.2.3 -- cgit v1.2.3 From f178a17d3318082dfa923582715b39d72bd07c32 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 21 Dec 2009 15:20:20 +0100 Subject: Dataset.find fixed, feature.rb removed from gemspec --- lib/dataset.rb | 4 ++-- opentox-ruby-api-wrapper.gemspec | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 30f9644..4d05e73 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -85,9 +85,9 @@ module OpenTox def self.find(uri) begin - RestClient.get uri, :accept => 'application/rdf+xml' # check if the resource is available dataset = Dataset.new - dataset.read uri.to_s + data = RestClient.get uri, :accept => 'application/rdf+xml' # check if the resource is available + dataset.rdf = data dataset rescue nil diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 41335e9..eef00e9 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.2.2" + s.version = "1.2.3" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-12-20} + s.date = %q{2009-12-21} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-debian.sh", "yaml2owl.rb"] @@ -28,7 +28,6 @@ Gem::Specification.new do |s| "lib/compound.rb", "lib/dataset.rb", "lib/environment.rb", - "lib/feature.rb", "lib/helper.rb", "lib/model.rb", "lib/opentox-ruby-api-wrapper.rb", -- cgit v1.2.3 From be07d3be0cc3236a22a47f0905c99f96508c9587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Thu, 7 Jan 2010 08:56:18 +0100 Subject: minor changes: no nil classification, fix create datasets (no my librdf version) --- lib/dataset.rb | 17 +++++++++-------- lib/model.rb | 27 +++++++++++++++------------ opentox-ruby-api-wrapper.gemspec | 15 ++++++++------- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 30f9644..0e7df13 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -47,8 +47,9 @@ module OpenTox @model.add tuple, OT['complexValue'], complex_value @model.add complex_value, RDF['type'], OT["FeatureValue"] @model.add complex_value, OT['feature'], f - @model.add complex_value, OT['value'], value.to_s - end + @model.add complex_value, OT['value'], value.to_s + end + tuple end @@ -77,7 +78,7 @@ module OpenTox end def self.create(data, content_type = 'application/rdf+xml') - uri = RestClient.post @@config[:services]["opentox-dataset"], data, :content_type => content_type + uri = RestClient.post @@config[:services]["opentox-dataset"], data, :content_type => content_type dataset = Dataset.new dataset.read uri.to_s dataset @@ -85,9 +86,10 @@ module OpenTox def self.find(uri) begin - RestClient.get uri, :accept => 'application/rdf+xml' # check if the resource is available - dataset = Dataset.new - dataset.read uri.to_s + data = RestClient.get uri, :accept => 'application/rdf+xml' # check if the resource is available + dataset = Dataset.new + dataset.rdf= data + dataset rescue nil @@ -222,8 +224,7 @@ module OpenTox :source => self.source, :identifier => self.identifier, :compounds => self.compounds.collect{|c| c.to_s.to_s.sub(/^\[(.*)\]$/,'\1')}, - :features => self.features.collect{|f| f.to_s }, - :data_entries => self.data_entries, + :features => self.features.collect{|f| f.to_s } }.to_yaml end diff --git a/lib/model.rb b/lib/model.rb index 2f4525a..cd35f09 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -1,6 +1,6 @@ module OpenTox module Model - + class Lazar include Owl @@ -87,25 +87,28 @@ module OpenTox end end end - end - + end + conf = conf/neighbors.size if conf > 0.0 classification = true elsif conf < 0.0 classification = false end - + compound = @dataset.find_or_create_compound(compound_uri) feature = @dataset.find_or_create_feature(@lazar[:endpoint]) - tuple = @dataset.create_tuple(feature,{ 'lazar#classification' => classification, 'lazar#confidence' => conf}) - @dataset.add_tuple compound,tuple - @predictions[compound_uri] = { @lazar[:endpoint] => { :lazar_prediction => { - :classification => classification, - :confidence => conf, - :neighbors => neighbors, - :features => compound_matches - } } } + + if (classification != nil) + tuple = @dataset.create_tuple(feature,{ 'lazar#classification' => classification, 'lazar#confidence' => conf}) + @dataset.add_tuple compound,tuple + @predictions[compound_uri] = { @lazar[:endpoint] => { :lazar_prediction => { + :classification => classification, + :confidence => conf, + :neighbors => neighbors, + :features => compound_matches + } } } + end end def self.base_uri diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 41335e9..389b08a 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -1,6 +1,6 @@ # Generated by jeweler -# DO NOT EDIT THIS FILE DIRECTLY -# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command +# DO NOT EDIT THIS FILE +# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec` # -*- encoding: utf-8 -*- Gem::Specification.new do |s| @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-12-20} + s.date = %q{2009-12-21} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-debian.sh", "yaml2owl.rb"] @@ -28,7 +28,6 @@ Gem::Specification.new do |s| "lib/compound.rb", "lib/dataset.rb", "lib/environment.rb", - "lib/feature.rb", "lib/helper.rb", "lib/model.rb", "lib/opentox-ruby-api-wrapper.rb", @@ -39,18 +38,21 @@ Gem::Specification.new do |s| "lib/tasks/opentox.rb", "lib/tasks/redis.rb", "lib/templates/config.ru", + "lib/templates/config.ru", + "lib/templates/config.yaml", "lib/templates/config.yaml", "lib/utils.rb" ] + s.has_rdoc = true s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} s.rdoc_options = ["--charset=UTF-8"] s.require_paths = ["lib"] - s.rubygems_version = %q{1.3.5} + s.rubygems_version = %q{1.3.1} s.summary = %q{Ruby wrapper for the OpenTox REST API} if s.respond_to? :specification_version then current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION - s.specification_version = 3 + s.specification_version = 2 if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q, [">= 0"]) @@ -82,4 +84,3 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) end end - -- cgit v1.2.3 From ea3829ca583ea706cd96a9544e22949bd751158b Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 9 Jan 2010 18:22:47 +0100 Subject: tasks added --- Rakefile | 10 ++--- lib/algorithm.rb | 2 - lib/dataset.rb | 40 ------------------- lib/model.rb | 108 ++++++++------------------------------------------- lib/task.rb | 37 +++++++++--------- lib/tasks/opentox.rb | 20 ---------- 6 files changed, 39 insertions(+), 178 deletions(-) diff --git a/Rakefile b/Rakefile index c5cb026..5974a9c 100644 --- a/Rakefile +++ b/Rakefile @@ -10,13 +10,9 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - gem.add_dependency "rest-client" - gem.add_dependency "sinatra" - gem.add_dependency "rack" - gem.add_dependency "rack-contrib" - gem.add_dependency "thin" - gem.add_dependency "emk-sinatra-url-for" - gem.add_dependency "cehoffman-sinatra-respond_to" + ["sinatra", "rest-client", "rack", "rack-contrib", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core"].each do |dep| + gem.add_dependency dep + end gem.add_development_dependency "cucumber" gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] gem.files.include %w(lib/tasks/owl.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/utils.rb, lib/templates/*) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 9918110..c5d162a 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -45,7 +45,6 @@ module OpenTox end class Similarity - def self.weighted_tanimoto(fp_a,fp_b,p) common_features = fp_a & fp_b all_features = fp_a + fp_b @@ -59,7 +58,6 @@ module OpenTox 0.0 end end - end end diff --git a/lib/dataset.rb b/lib/dataset.rb index ad69038..8d1c0c1 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -158,46 +158,6 @@ module OpenTox features end -=begin - def tuples - tuples = [] - @model.subjects(RDF['type'], OT["Tuple"]).each do |t| - tuple = {} - compounds = [] - @model.subjects(OT['values'], t).each do |data_entry| - compound_node = @model.object(data_entry,OT['compound']) - compounds << @model.object(compound_node, DC["identifier"]).to_s - end - @model.find(t, OT['tuple'],nil) do |s,p,pair| - feature_node = @model.object(pair, OT['feature']) - feature_name = @model.object(feature_node, DC['title']).to_s - value_node = @model.object(pair, OT['value']) - value = @model.object(value_node, OT['value']).to_s - value = value.to_f if value.match(/^[\d\.]+$/) - tuple[feature_name.to_sym] = value - end - tuple[:compounds] = compounds - tuples << tuple - end - tuples - end - - def tuple(compound_uri) - compound_node = @model.subject(DC["identifier"],compound_uri) - #puts compound_uri - @model.subjects(OT['compound'], compound_node).each do |data_entry| - values_node = @model.object(data_entry, OT['values']) - @model.find(values_node, OT['tuple'], nil) do |s,p,tuple| - @model.find(tuple, OT['feature'], nil) do |s,p,feature| - name = @model.object(feature,DC['title']).to_s - #puts name - end - end - #puts values_node - end - end -=end - def compounds compounds = [] @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| diff --git a/lib/model.rb b/lib/model.rb index cd35f09..24f6e52 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -4,40 +4,28 @@ module OpenTox class Lazar include Owl - attr_accessor :dataset, :predictions - # Create a new prediction model from a dataset - def initialize(yaml) - super() - id = File.basename(yaml,'.yaml') - # TODO Untyped Individual: http://localhost:4003/lazar/{id} ???? - @lazar = YAML.load_file yaml - self.uri = File.join(@@config[:services]["opentox-model"],'lazar',id) - self.title = "lazar model for #{@lazar[:endpoint]}" + def initialize + super self.source = "http://github.com/helma/opentox-model" - self.parameters = { - "Dataset URI" => { :scope => "mandatory", :value => "dataset_uri=#{@lazar[:activity_dataset]}" }, - "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri=#{@lazar[:endpoint]}" }, - "Feature generation URI" => { :scope => "mandatory", :value => "feature_generation_uri=" } #TODO write to yaml - } self.algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") - self.trainingDataset = @lazar[:activity_dataset] - self.dependentVariables = @lazar[:endpoint] - self.independentVariables = "http://localhost:4002/fminer#BBRC_representative" # TODO read this from dataset - self.predictedVariables = @lazar[:endpoint] #+ " lazar prediction" - @dataset = OpenTox::Dataset.new - @predictions = {} + self.independentVariables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative") # TODO read this from dataset end - def self.find(uri) -=begin - begin - YAML.load(RestClient.get uri) - Lazar.new uri - rescue - halt 404, "Model #{uri} not found." - end -=end + def self.from_yaml(yaml) + yaml = YAML.load yaml + lazar = Lazar.new + lazar.title = "lazar model for #{yaml[:endpoint]}" + lazar.parameters = { + "Dataset URI" => { :scope => "mandatory", :value => "dataset_uri=#{yaml[:activity_dataset]}" }, + "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri=#{yaml[:endpoint]}" }, + "Feature generation URI" => { :scope => "mandatory", :value => "feature_generation_uri=#{File.join(@@config[:services]["opentox-algorithm"],"fminer")}"} #TODO write to yaml + } + lazar.algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") + lazar.trainingDataset = yaml[:activity_dataset] + lazar.dependentVariables = yaml[:endpoint] + lazar.predictedVariables = yaml[:endpoint] #+ " lazar prediction" + lazar end def self.find_all @@ -49,68 +37,6 @@ module OpenTox RestClient.post(@uri, :compound_uri => compound.uri) end - def database_activity?(compound_uri) - # find database activities - db_activities = @lazar[:activities][compound_uri] - if db_activities - c = @dataset.find_or_create_compound(compound_uri) - f = @dataset.find_or_create_feature(@lazar[:endpoint]) - v = db_activities.join(',') - @dataset.add c,f,v - @predictions[compound_uri] = { @lazar[:endpoint] => {:measured_activities => db_activities}} - true - else - false - end - end - - def classify(compound_uri) - - compound = OpenTox::Compound.new(:uri => compound_uri) - compound_matches = compound.match @lazar[:features] - - conf = 0.0 - neighbors = [] - classification = nil - - @lazar[:fingerprints].each do |uri,matches| - - sim = OpenTox::Algorithm::Similarity.weighted_tanimoto(compound_matches,matches,@lazar[:p_values]) - if sim > 0.3 - neighbors << uri - @lazar[:activities][uri].each do |act| - case act.to_s - when 'true' - conf += OpenTox::Utils.gauss(sim) - when 'false' - conf -= OpenTox::Utils.gauss(sim) - end - end - end - end - - conf = conf/neighbors.size - if conf > 0.0 - classification = true - elsif conf < 0.0 - classification = false - end - - compound = @dataset.find_or_create_compound(compound_uri) - feature = @dataset.find_or_create_feature(@lazar[:endpoint]) - - if (classification != nil) - tuple = @dataset.create_tuple(feature,{ 'lazar#classification' => classification, 'lazar#confidence' => conf}) - @dataset.add_tuple compound,tuple - @predictions[compound_uri] = { @lazar[:endpoint] => { :lazar_prediction => { - :classification => classification, - :confidence => conf, - :neighbors => neighbors, - :features => compound_matches - } } } - end - end - def self.base_uri @@config[:services]["opentox-model"] end diff --git a/lib/task.rb b/lib/task.rb index 079d387..8dbd578 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,20 +1,21 @@ module OpenTox - class Task #< OpenTox + class Task + + attr_accessor :uri def initialize(uri) - super(uri) + #super() + @uri = uri end - #def self.create(uri) def self.create - puts @@config[:services]["opentox-task"] - uri = RestClient.post @@config[:services]["opentox-task"], ''#, :dataset_uri => uri + uri = RestClient.post @@config[:services]["opentox-task"], nil Task.new(uri) end - def self.find(params) - Task.new(params[:uri]) + def self.find(uri) + Task.new(uri) end def self.base_uri @@ -22,32 +23,32 @@ module OpenTox end def start - RestClient.put @uri, :status => 'started' + RestClient.put File.join(@uri,'started'), nil end - def stop - RestClient.put @uri, :status => 'stopped' + def cancel + RestClient.put File.join(@uri,'cancelled'), nil end - def completed - RestClient.put @uri, :status => 'completed' + def completed(uri) + RestClient.put File.join(@uri,'completed'), :resource => uri end def status RestClient.get File.join(@uri, 'status') end - - def completed? - self.status == 'completed' + + def resource + RestClient.get File.join(@uri, 'resource') end - def resource - RestClient.get @uri + def completed? + self.status.to_s == 'completed' end def wait_for_completion until self.completed? - sleep 1 + sleep 0.1 end end diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb index 38202dd..e330c87 100644 --- a/lib/tasks/opentox.rb +++ b/lib/tasks/opentox.rb @@ -1,24 +1,4 @@ require File.join(File.dirname(__FILE__), '..', 'opentox-ruby-api-wrapper.rb') -require File.join(File.dirname(__FILE__), 'redis.rb') - -namespace :redis do - - desc "Flush Redis testing database" - task :flush do - require 'redis' - r = Redis.new :db => 2 - r.flush_db - end - - desc "Flush all Redis databases" - task :flushall do - require 'redis' - r = Redis.new - r.flush_all - end - - -end namespace :opentox do -- cgit v1.2.3 From 8fbd42ebeaee639cfa1121f3f754176158d283fb Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 9 Jan 2010 19:56:42 +0100 Subject: Version bump to 1.2.4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0495c4a..e8ea05d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.3 +1.2.4 -- cgit v1.2.3 From 82f814e44651baa561d41ba1226cd7d5b90bd1f5 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 9 Jan 2010 19:58:49 +0100 Subject: gemspec updated --- opentox-ruby-api-wrapper.gemspec | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 424bae9..88bed8f 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -1,15 +1,15 @@ # Generated by jeweler -# DO NOT EDIT THIS FILE -# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec` +# DO NOT EDIT THIS FILE DIRECTLY +# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command # -*- encoding: utf-8 -*- Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.2.3" + s.version = "1.2.4" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2009-12-21} + s.date = %q{2010-01-09} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-debian.sh", "yaml2owl.rb"] @@ -38,49 +38,53 @@ Gem::Specification.new do |s| "lib/tasks/opentox.rb", "lib/tasks/redis.rb", "lib/templates/config.ru", - "lib/templates/config.ru", - "lib/templates/config.yaml", "lib/templates/config.yaml", "lib/utils.rb" ] - s.has_rdoc = true s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} s.rdoc_options = ["--charset=UTF-8"] s.require_paths = ["lib"] - s.rubygems_version = %q{1.3.1} + s.rubygems_version = %q{1.3.5} s.summary = %q{Ruby wrapper for the OpenTox REST API} if s.respond_to? :specification_version then current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION - s.specification_version = 2 + s.specification_version = 3 if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then - s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end else - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end end + -- cgit v1.2.3 From 253e15cae162d88a269cc86608dd3334cab29cf9 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 11 Jan 2010 15:27:45 +0100 Subject: Task creation under passenger fixed --- lib/task.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/task.rb b/lib/task.rb index 8dbd578..e50a982 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -22,12 +22,13 @@ module OpenTox @@config[:services]["opentox-task"] end - def start - RestClient.put File.join(@uri,'started'), nil + def started + #LOGGER.info File.join(@uri,'started') + RestClient.put File.join(@uri,'started'), {} end def cancel - RestClient.put File.join(@uri,'cancelled'), nil + RestClient.put File.join(@uri,'cancelled'), {} end def completed(uri) -- cgit v1.2.3 From c86df1faf22bcd90a8f318632c368d5ce474dbf8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 11 Jan 2010 15:28:22 +0100 Subject: Version bump to 1.2.5 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index e8ea05d..c813fe1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.4 +1.2.5 -- cgit v1.2.3 From 0e7f3c196b123acd9d311f02f09f8b03992cea5f Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 19 Jan 2010 10:02:09 +0100 Subject: move authorization to branch test --- lib/authorization.rb | 24 ++++++++++++++++++++++++ lib/dataset.rb | 9 +++++---- lib/environment.rb | 9 +++++++++ lib/model.rb | 4 ++-- lib/opentox-ruby-api-wrapper.rb | 2 +- lib/templates/users.yaml | 5 +++++ 6 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 lib/authorization.rb create mode 100644 lib/templates/users.yaml diff --git a/lib/authorization.rb b/lib/authorization.rb new file mode 100644 index 0000000..372d52b --- /dev/null +++ b/lib/authorization.rb @@ -0,0 +1,24 @@ +helpers do + + def protected! + response['WWW-Authenticate'] = %(Basic realm="Testing HTTP Auth") and \ + throw(:halt, [401, "Not authorized\n"]) and \ + return unless authorized? + end + + def authorized? + @auth ||= Rack::Auth::Basic::Request.new(request.env) + @auth.provided? && @auth.basic? && @auth.credentials && valid_user? + end + + def valid_user? + users = @@users[:users] + return @auth.credentials == [@auth.username, users.fetch(@auth.username)] if users.has_key?(@auth.username) + return false + end + +end + +before do + protected! unless env['REQUEST_METHOD'] == "GET" +end \ No newline at end of file diff --git a/lib/dataset.rb b/lib/dataset.rb index 8d1c0c1..f4372be 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -78,7 +78,7 @@ module OpenTox end def self.create(data, content_type = 'application/rdf+xml') - uri = RestClient.post @@config[:services]["opentox-dataset"], data, :content_type => content_type + uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => request.username, :password => request.password).post data, :content_type => content_type dataset = Dataset.new dataset.read uri.to_s dataset @@ -168,11 +168,12 @@ module OpenTox # Delete a dataset def delete - RestClient.delete @uri - end + resource = RestClient::Resource.new(@uri, :user => request.username, :password => request.password) + resource.delete + end def save - RestClient.post(@@config[:services]["opentox-dataset"], self.rdf, :content_type => "application/rdf+xml").to_s + RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => request.username, :password => request.password).post(self.rdf, :content_type => "application/rdf+xml").to_s end def to_yaml diff --git a/lib/environment.rb b/lib/environment.rb index 6100928..f7513c5 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -6,6 +6,7 @@ basedir = File.join(ENV['HOME'], ".opentox") config_dir = File.join(basedir, "config") @@tmp_dir = File.join(basedir, "tmp") config_file = File.join(config_dir, "#{ENV['RACK_ENV']}.yaml") +user_file = File.join(config_dir, "users.yaml") if File.exist?(config_file) @@config = YAML.load_file(config_file) @@ -17,6 +18,14 @@ else exit end +if File.exist?(user_file) + @@users = YAML.load_file(user_file) +else + FileUtils.cp(File.join(File.dirname(__FILE__), 'templates/users.yaml'), user_file) + puts "Please edit #{user_file} and restart your application." + exit +end + # RDF namespaces RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#' diff --git a/lib/model.rb b/lib/model.rb index 24f6e52..b86b3fc 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -34,7 +34,7 @@ module OpenTox # Predict a compound def predict(compound) - RestClient.post(@uri, :compound_uri => compound.uri) + RestClient::Resource.new(@uri, :user => request.username, :password => request.password).post(:compound_uri => compound.uri) end def self.base_uri @@ -42,7 +42,7 @@ module OpenTox end def self.create(data) - RestClient.post(@@config[:services]["opentox-model"], data, :content_type => "application/x-yaml").to_s + RestClient::Resource.new(@@config[:services]["opentox-model"], :user => request.username, :password => request.password).post(data, :content_type => "application/x-yaml").to_s end def endpoint diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index ca57fc9..03838e8 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['owl', 'compound','dataset','algorithm','model','task','utils'].each do |lib| +['owl', 'compound','dataset','algorithm','model','task','utils','authorization'].each do |lib| require lib end diff --git a/lib/templates/users.yaml b/lib/templates/users.yaml new file mode 100644 index 0000000..483fd7b --- /dev/null +++ b/lib/templates/users.yaml @@ -0,0 +1,5 @@ +# please insert users and passwords here. +# one user and password each line. uncomment the line. +:users: +# username: "secretpassword" +# exampleuser: "ih9aiTog" \ No newline at end of file -- cgit v1.2.3 From 33237fc34c933123a62bf7d85c824589dc12201c Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 19 Jan 2010 14:30:39 +0100 Subject: authorizaion --- lib/authorization.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 372d52b..6abbc91 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -20,5 +20,5 @@ helpers do end before do - protected! unless env['REQUEST_METHOD'] == "GET" + #protected! unless env['REQUEST_METHOD'] == "GET" end \ No newline at end of file -- cgit v1.2.3 From 4c2ac1a90b686b0e4bc361403770e0756bbfbdf9 Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 19 Jan 2010 14:31:08 +0100 Subject: authorizaion --- .gitignore | 1 + lib/algorithm.rb | 6 ++++-- lib/task.rb | 8 ++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 00c0b86..fedf1b5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ coverage rdoc pkg +*~ diff --git a/lib/algorithm.rb b/lib/algorithm.rb index c5d162a..6ae9e72 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -16,7 +16,8 @@ module OpenTox end def self.create_feature_dataset(params) - RestClient.post params[:feature_generation_uri], :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri] + resource = RestClient::Resource.new(params[:feature_generation_uri], :user => request.username, :password => request.password) + resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri] end end @@ -39,7 +40,8 @@ module OpenTox end def self.create_model(params) - @uri = RestClient.post File.join(@@config[:services]["opentox-algorithm"], "lazar"), :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer") + resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => request.username, :password => request.password) + @uri = resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer") end end diff --git a/lib/task.rb b/lib/task.rb index e50a982..5dd5e4c 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -10,7 +10,7 @@ module OpenTox end def self.create - uri = RestClient.post @@config[:services]["opentox-task"], nil + uri = RestClient::Resource.new(@@config[:services]["opentox-task"], :user => request.username, :password => request.password).post nil Task.new(uri) end @@ -24,15 +24,15 @@ module OpenTox def started #LOGGER.info File.join(@uri,'started') - RestClient.put File.join(@uri,'started'), {} + RestClient::Resource.new(@uri, :user => request.username, :password => request.password).put File.join(@uri,'started'), {} end def cancel - RestClient.put File.join(@uri,'cancelled'), {} + RestClient::Resource.new(@uri, :user => request.username, :password => request.password).put File.join(@uri,'cancelled'), {} end def completed(uri) - RestClient.put File.join(@uri,'completed'), :resource => uri + RestClient::Resource.new(@uri, :user => request.username, :password => request.password).put File.join(@uri,'completed'), :resource => uri end def status -- cgit v1.2.3 From 09974c5a920bbb07475d8e48a725ef3780e60dbe Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 22 Jan 2010 11:16:13 +0100 Subject: central config.ru, generic compound API --- Rakefile | 2 +- lib/compound.rb | 9 +++++++-- lib/model.rb | 8 +++++++- lib/templates/config.ru | 18 ++++-------------- opentox-ruby-api-wrapper.gemspec | 4 ++-- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Rakefile b/Rakefile index 5974a9c..b8bf71c 100644 --- a/Rakefile +++ b/Rakefile @@ -10,7 +10,7 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - ["sinatra", "rest-client", "rack", "rack-contrib", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core"].each do |dep| + ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core"].each do |dep| gem.add_dependency dep end gem.add_development_dependency "cucumber" diff --git a/lib/compound.rb b/lib/compound.rb index 4385a7d..0a90663 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -20,14 +20,19 @@ module OpenTox @inchi = RestClient.get("#{@@cactus_uri}#{params[:name]}/stdinchi").chomp @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:uri] - @inchi = params[:uri].sub(/^.*InChI/, 'InChI') + if params[:uri].match(/InChI/) # shortcut for IST services + @inchi = params[:uri].sub(/^.*InChI/, 'InChI') + else + @inchi = RestClient.get @uri, :accept => 'chemical/x-inchi' + end @uri = params[:uri] end end # Get the (canonical) smiles def smiles - obconversion(@inchi,'inchi','can') + RestClient.get(@uri, :accept => 'chemical/x-daylight-smiles').split(/\s+/).first # fix ambit output + #obconversion(@inchi,'inchi','can') end def sdf diff --git a/lib/model.rb b/lib/model.rb index 24f6e52..c4041f2 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -31,6 +31,12 @@ module OpenTox def self.find_all RestClient.get(@@config[:services]["opentox-model"]).split("\n") end + + def self.find(uri) + puts uri + yaml = RestClient.get(uri, :accept => "application/x-yaml") + OpenTox::Model::Lazar.from_yaml(yaml) + end # Predict a compound def predict(compound) @@ -46,7 +52,7 @@ module OpenTox end def endpoint - YAML.load(RestClient.get uri)[:endpoint] + YAML.load(RestClient.get(uri))[:endpoint] end def algorithm=(algorithm) diff --git a/lib/templates/config.ru b/lib/templates/config.ru index 63dd2ce..81cea9d 100644 --- a/lib/templates/config.ru +++ b/lib/templates/config.ru @@ -1,23 +1,13 @@ require 'rubygems' -require 'sinatra' +require 'opentox-ruby-api-wrapper' require 'application.rb' require 'rack' require 'rack/contrib' -FileUtils.mkdir_p 'log' unless File.exists?('log') -log = File.new("log/#{ENV["RACK_ENV"]}.log", "a") +FileUtils.mkdir_p @@tmp_dir +log = File.new("#{@@tmp_dir}/#{ENV["RACK_ENV"]}.log", "a+") $stdout.reopen(log) $stderr.reopen(log) -if ENV['RACK_ENV'] == 'production' - use Rack::MailExceptions do |mail| - mail.to 'helma@in-silico.ch' - mail.subject '[ERROR] %s' - end -elsif ENV['RACK_ENV'] == 'development' - use Rack::Reloader - use Rack::ShowExceptions -end - +use Rack::ShowExceptions run Sinatra::Application - diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 88bed8f..21879b3 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.2.4" + s.version = "1.2.5" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-01-09} + s.date = %q{2010-01-11} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-debian.sh", "yaml2owl.rb"] -- cgit v1.2.3 From a165822a7bd663916cff9484a76e6bb6bcf9a353 Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 25 Jan 2010 09:29:21 +0100 Subject: internal authorization with first user of users.yaml --- lib/algorithm.rb | 112 ++++++++++++++++++++++++------------------------ lib/authorization.rb | 2 +- lib/dataset.rb | 7 +-- lib/environment.rb | 4 ++ lib/model.rb | 6 ++- lib/task.rb | 14 +++--- lib/templates/config.ru | 4 ++ 7 files changed, 82 insertions(+), 67 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 6ae9e72..d5f85c7 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -1,66 +1,66 @@ module OpenTox - module Algorithm + module Algorithm - class Fminer - include Owl + class Fminer + include Owl - def initialize - super - self.uri = File.join(@@config[:services]["opentox-algorithm"],'fminer') - self.title = "fminer" - self.source = "http://github.com/amaunz/libfminer" - self.parameters = { - "Dataset URI" => { :scope => "mandatory", :value => "dataset_uri" }, - "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri" } - } - end + def initialize + super + self.uri = File.join(@@config[:services]["opentox-algorithm"],'fminer') + self.title = "fminer" + self.source = "http://github.com/amaunz/libfminer" + self.parameters = { + "Dataset URI" => { :scope => "mandatory", :value => "dataset_uri" }, + "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri" } + } + end - def self.create_feature_dataset(params) - resource = RestClient::Resource.new(params[:feature_generation_uri], :user => request.username, :password => request.password) - resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri] - end - end + def self.create_feature_dataset(params) + resource = RestClient::Resource.new(params[:feature_generation_uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri] + end + end - class Lazar - include Owl + class Lazar + include Owl - def initialize - super - self.uri = File.join(@@config[:services]["opentox-algorithm"],'lazar') - self.title = "lazar" - self.source = "http://github.com/helma/opentox-algorithm" - self.parameters = { - "Dataset URI" => - { :scope => "mandatory", :value => "dataset_uri" }, - "Feature URI for dependent variable" => - { :scope => "mandatory", :value => "feature_uri" }, - "Feature generation URI" => - { :scope => "mandatory", :value => "feature_generation_uri" } - } - end - - def self.create_model(params) - resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => request.username, :password => request.password) - @uri = resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer") - end + def initialize + super + self.uri = File.join(@@config[:services]["opentox-algorithm"],'lazar') + self.title = "lazar" + self.source = "http://github.com/helma/opentox-algorithm" + self.parameters = { + "Dataset URI" => + { :scope => "mandatory", :value => "dataset_uri" }, + "Feature URI for dependent variable" => + { :scope => "mandatory", :value => "feature_uri" }, + "Feature generation URI" => + { :scope => "mandatory", :value => "feature_generation_uri" } + } + end + + def self.create_model(params) + resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + @uri = resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer") + end - end + end - class Similarity - def self.weighted_tanimoto(fp_a,fp_b,p) - common_features = fp_a & fp_b - all_features = fp_a + fp_b - common_p_sum = 0.0 - if common_features.size > 0 - common_features.each{|f| common_p_sum += p[f]} - all_p_sum = 0.0 - all_features.each{|f| all_p_sum += p[f]} - common_p_sum/all_p_sum - else - 0.0 - end - end - end + class Similarity + def self.weighted_tanimoto(fp_a,fp_b,p) + common_features = fp_a & fp_b + all_features = fp_a + fp_b + common_p_sum = 0.0 + if common_features.size > 0 + common_features.each{|f| common_p_sum += p[f]} + all_p_sum = 0.0 + all_features.each{|f| all_p_sum += p[f]} + common_p_sum/all_p_sum + else + 0.0 + end + end + end - end + end end diff --git a/lib/authorization.rb b/lib/authorization.rb index 6abbc91..372d52b 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -20,5 +20,5 @@ helpers do end before do - #protected! unless env['REQUEST_METHOD'] == "GET" + protected! unless env['REQUEST_METHOD'] == "GET" end \ No newline at end of file diff --git a/lib/dataset.rb b/lib/dataset.rb index f4372be..1aa3469 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -78,7 +78,8 @@ module OpenTox end def self.create(data, content_type = 'application/rdf+xml') - uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => request.username, :password => request.password).post data, :content_type => content_type + resource = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + uri = resource.post data, :content_type => content_type dataset = Dataset.new dataset.read uri.to_s dataset @@ -168,12 +169,12 @@ module OpenTox # Delete a dataset def delete - resource = RestClient::Resource.new(@uri, :user => request.username, :password => request.password) + resource = RestClient::Resource.new(@uri, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) resource.delete end def save - RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => request.username, :password => request.password).post(self.rdf, :content_type => "application/rdf+xml").to_s + RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.rdf, :content_type => "application/rdf+xml").to_s end def to_yaml diff --git a/lib/environment.rb b/lib/environment.rb index f7513c5..ee36366 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -25,6 +25,10 @@ else puts "Please edit #{user_file} and restart your application." exit end +if @@users.length < 1 or !@@users + puts "Please edit #{user_file} and restart your application." + exit +end # RDF namespaces RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' diff --git a/lib/model.rb b/lib/model.rb index b86b3fc..6bdbfd2 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -34,7 +34,8 @@ module OpenTox # Predict a compound def predict(compound) - RestClient::Resource.new(@uri, :user => request.username, :password => request.password).post(:compound_uri => compound.uri) + resource = RestClient::Resource.new(@uri, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource.post(:compound_uri => compound.uri) end def self.base_uri @@ -42,7 +43,8 @@ module OpenTox end def self.create(data) - RestClient::Resource.new(@@config[:services]["opentox-model"], :user => request.username, :password => request.password).post(data, :content_type => "application/x-yaml").to_s + resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource.post(data, :content_type => "application/x-yaml").to_s end def endpoint diff --git a/lib/task.rb b/lib/task.rb index 5dd5e4c..23795dc 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -10,7 +10,8 @@ module OpenTox end def self.create - uri = RestClient::Resource.new(@@config[:services]["opentox-task"], :user => request.username, :password => request.password).post nil + resource = RestClient::Resource.new(@@config[:services]["opentox-task"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + uri = resource.post(nil) Task.new(uri) end @@ -23,16 +24,19 @@ module OpenTox end def started - #LOGGER.info File.join(@uri,'started') - RestClient::Resource.new(@uri, :user => request.username, :password => request.password).put File.join(@uri,'started'), {} + LOGGER.info File.join(@uri,'started') + resource = RestClient::Resource.new(File.join(@uri,'started'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource.put({}) end def cancel - RestClient::Resource.new(@uri, :user => request.username, :password => request.password).put File.join(@uri,'cancelled'), {} + resource = RestClient::Resource.new(@File.join(@uri,'cancelled'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource.put({}) end def completed(uri) - RestClient::Resource.new(@uri, :user => request.username, :password => request.password).put File.join(@uri,'completed'), :resource => uri + resource = RestClient::Resource.new(File.join(@uri,'completed'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource.put :resource => uri end def status diff --git a/lib/templates/config.ru b/lib/templates/config.ru index 63dd2ce..ffccbc1 100644 --- a/lib/templates/config.ru +++ b/lib/templates/config.ru @@ -8,6 +8,9 @@ FileUtils.mkdir_p 'log' unless File.exists?('log') log = File.new("log/#{ENV["RACK_ENV"]}.log", "a") $stdout.reopen(log) $stderr.reopen(log) +$stdout.sync = true +$stderr.sync = true + if ENV['RACK_ENV'] == 'production' use Rack::MailExceptions do |mail| @@ -21,3 +24,4 @@ end run Sinatra::Application +set :raise_errors, true \ No newline at end of file -- cgit v1.2.3 From 2187b121ddb95a6ef5de59ac1c72427b4294d9be Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 25 Jan 2010 15:24:31 +0100 Subject: ensure that minimum 1 user is in users.yaml --- lib/environment.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index ee36366..354190c 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -25,8 +25,11 @@ else puts "Please edit #{user_file} and restart your application." exit end -if @@users.length < 1 or !@@users - puts "Please edit #{user_file} and restart your application." + +begin + 0 < @@users[:users].keys.length +rescue + puts "Please edit #{user_file} and restart your application. Create at least one user with password." exit end -- cgit v1.2.3 From 492f73257e6c87d84e4b25c49e4a392859d59b1c Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 26 Jan 2010 12:16:59 +0100 Subject: set 'Basic realm' to Opentox Ruby API Wrapper Auth --- lib/authorization.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 372d52b..4e4abe2 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -1,7 +1,7 @@ helpers do def protected! - response['WWW-Authenticate'] = %(Basic realm="Testing HTTP Auth") and \ + response['WWW-Authenticate'] = %(Basic realm="Opentox Ruby API Wrapper Auth") and \ throw(:halt, [401, "Not authorized\n"]) and \ return unless authorized? end -- cgit v1.2.3 From c9d820e767a6baf6ae6fba2bb6b2e3641253b5c4 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 31 Jan 2010 19:09:16 +0100 Subject: Upload facilities added, Ambit disabled --- lib/compound.rb | 9 ++-- lib/dataset.rb | 71 +++++++++++--------------- lib/environment.rb | 31 +++++------- lib/model.rb | 1 - lib/owl.rb | 3 +- lib/task.rb | 19 ++++++- lib/tasks/opentox.rb | 8 +-- lib/tasks/redis.rb | 125 ---------------------------------------------- lib/templates/config.ru | 13 ----- lib/templates/config.yaml | 30 +++++++---- 10 files changed, 90 insertions(+), 220 deletions(-) delete mode 100644 lib/tasks/redis.rb delete mode 100644 lib/templates/config.ru diff --git a/lib/compound.rb b/lib/compound.rb index 0a90663..562baaa 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -20,19 +20,22 @@ module OpenTox @inchi = RestClient.get("#{@@cactus_uri}#{params[:name]}/stdinchi").chomp @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:uri] + @uri = params[:uri] if params[:uri].match(/InChI/) # shortcut for IST services @inchi = params[:uri].sub(/^.*InChI/, 'InChI') else @inchi = RestClient.get @uri, :accept => 'chemical/x-inchi' + # AMBIT does not provide InChIs + #smiles = RestClient.get(@uri, :accept => 'chemical/x-daylight-smiles').split(/\s+/).first # fix ambit output + #@inchi = obconversion(smiles,'smi','inchi') end - @uri = params[:uri] end end # Get the (canonical) smiles def smiles - RestClient.get(@uri, :accept => 'chemical/x-daylight-smiles').split(/\s+/).first # fix ambit output - #obconversion(@inchi,'inchi','can') + #RestClient.get(@uri, :accept => 'chemical/x-daylight-smiles').split(/\s+/).first # fix ambit output + obconversion(@inchi,'inchi','can') end def sdf diff --git a/lib/dataset.rb b/lib/dataset.rb index 8d1c0c1..0a49e87 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -85,14 +85,11 @@ module OpenTox end def self.find(uri) - begin - dataset = Dataset.new - data = RestClient.get uri, :accept => 'application/rdf+xml' # check if the resource is available - dataset.rdf = data - dataset - rescue - nil - end + dataset = Dataset.new + data = `curl "#{uri}"` + #data = RestClient.get uri, :accept => 'application/rdf+xml' # unclear why this does not work for complex uris, Dataset.find works from irb + dataset.rdf = data + dataset end def features @@ -107,57 +104,44 @@ module OpenTox data = {} @model.subjects(RDF['type'], OT['DataEntry']).each do |data_entry| compound_node = @model.object(data_entry, OT['compound']) - @model.find(compound_node, OT['identifier'],nil) {|s,p,o| puts o.to_s} compound_uri = @model.object(compound_node, DC['identifier']).to_s - data[compound_uri] = [] unless data[compound_uri] @model.find(data_entry, OT['values'], nil) do |s,p,values| - entry = {} feature_node = @model.object values, OT['feature'] - feature_uri = @model.object(feature_node, DC['identifier']).to_s - # TODO simple features + feature_uri = @model.object(feature_node, DC['identifier']).to_s.sub(/\^\^.*$/,'') # remove XML datatype type = @model.object(values, RDF['type']) if type == OT['FeatureValue'] - #entry[feature_uri] = [] unless entry[feature_uri] - entry[feature_uri] = @model.object(values, OT['value']).to_s + value = @model.object(values, OT['value']).to_s + case value.to_s + when TRUE_REGEXP # defined in environment.rb + value = true + when FALSE_REGEXP # defined in environment.rb + value = false + else + LOGGER.warn compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri + value = nil + end + data[compound_uri] = {} unless data[compound_uri] + data[compound_uri][feature_uri] = [] unless data[compound_uri][feature_uri] + data[compound_uri][feature_uri] << value unless value.nil? elsif type == OT['Tuple'] - entry[feature_uri] = {} unless entry[feature_uri] + entry = {} + data[compound_uri] = {} unless data[compound_uri] + data[compound_uri][feature_uri] = [] unless data[compound_uri][feature_uri] @model.find(values, OT['complexValue'],nil) do |s,p,complex_value| name_node = @model.object complex_value, OT['feature'] name = @model.object(name_node, DC['title']).to_s value = @model.object(complex_value, OT['value']).to_s - entry[feature_uri][name] = value + v = value.sub(/\^\^.*$/,'') # remove XML datatype + v = v.to_f if v.match(/^[\.|\d]+$/) # guess numeric datatype + entry[name] = v end + data[compound_uri][feature_uri] << entry end - data[compound_uri] << entry end end data end - def feature_values(feature_uri) - features = {} - feature = @model.subject(DC["identifier"],feature_uri) - @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| - compound = @model.object(compound_node, DC["identifier"]).to_s.sub(/^\[(.*)\]$/,'\1') - features[compound] = [] unless features[compound] - data_entry = @model.subject(OT['compound'], compound_node) - @model.find( data_entry, OT['values'], nil ) do |s,p,values| - if feature == @model.object(values, OT['feature']) - value = @model.object(values, OT['value']) - case value.to_s - when "true" - features[compound] << true - when "false" - features[compound] << false - else - features[compound] << value.to_s - end - end - end - end - features - end - def compounds compounds = [] @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| @@ -183,7 +167,8 @@ module OpenTox :source => self.source, :identifier => self.identifier, :compounds => self.compounds.collect{|c| c.to_s.to_s.sub(/^\[(.*)\]$/,'\1')}, - :features => self.features.collect{|f| f.to_s } + :features => self.features.collect{|f| f.to_s }, + :data => self.data }.to_yaml end diff --git a/lib/environment.rb b/lib/environment.rb index 6100928..a9d0797 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -1,21 +1,27 @@ +require 'logger' # set default environment ENV['RACK_ENV'] = 'test' unless ENV['RACK_ENV'] # load configuration basedir = File.join(ENV['HOME'], ".opentox") config_dir = File.join(basedir, "config") -@@tmp_dir = File.join(basedir, "tmp") config_file = File.join(config_dir, "#{ENV['RACK_ENV']}.yaml") +TMP_DIR = File.join(basedir, "tmp") +LOG_DIR = File.join(basedir, "log") + if File.exist?(config_file) @@config = YAML.load_file(config_file) else - FileUtils.mkdir_p config_dir - FileUtils.mkdir_p @@tmp_dir + FileUtils.mkdir_p TMP_DIR + FileUtils.mkdir_p LOG_DIR FileUtils.cp(File.join(File.dirname(__FILE__), 'templates/config.yaml'), config_file) puts "Please edit #{config_file} and restart your application." exit end +logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" +LOGGER = Logger.new(logfile,'daily') # daily rotation +LOGGER.level = Logger::DEBUG # RDF namespaces RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' @@ -23,19 +29,6 @@ OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#' DC = Redland::Namespace.new 'http://purl.org/dc/elements/1.1/' OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#' -# configure redis database -=begin -begin - case ENV['RACK_ENV'] - when 'production' - @@redis = Redis.new :db => 0 - when 'development' - @@redis = Redis.new :db => 1 - when 'test' - @@redis = Redis.new :db => 2 - @@redis.flush_db - end -rescue - puts "Redis database not running, please start it with 'rake redis:start'." -end -=end +# Regular expressions for parsing classification data +TRUE_REGEXP = /^(true|active|1)/ +FALSE_REGEXP = /^(false|inactive|0)/ diff --git a/lib/model.rb b/lib/model.rb index c4041f2..bd9d546 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -33,7 +33,6 @@ module OpenTox end def self.find(uri) - puts uri yaml = RestClient.get(uri, :accept => "application/x-yaml") OpenTox::Model::Lazar.from_yaml(yaml) end diff --git a/lib/owl.rb b/lib/owl.rb index 9cb73f2..a843e59 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -42,7 +42,8 @@ module OpenTox # I have no idea, why 2 subjects are returned # iterating over all subjects leads to memory allocation problems # SPARQL queries also do not work - me = @model.subjects(RDF['type'],OT[self.owl_class])[1] + #me = @model.subjects(RDF['type'],OT[self.owl_class])[1] + me = @model.subject(RDF['type'],OT[self.owl_class]) @model.object(me, DC['title']).to_s end diff --git a/lib/task.rb b/lib/task.rb index e50a982..24bd944 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -22,6 +22,11 @@ module OpenTox @@config[:services]["opentox-task"] end + def self.all + task_uris = RestClient.get(@@config[:services]["opentox-task"]).split(/\n/) + task_uris.collect{|uri| Task.new(uri)} + end + def started #LOGGER.info File.join(@uri,'started') RestClient.put File.join(@uri,'started'), {} @@ -35,6 +40,14 @@ module OpenTox RestClient.put File.join(@uri,'completed'), :resource => uri end + def created_at + RestClient.get File.join(@uri, 'created_at') + end + + def finished_at + RestClient.get File.join(@uri, 'finished_at') + end + def status RestClient.get File.join(@uri, 'status') end @@ -42,6 +55,10 @@ module OpenTox def resource RestClient.get File.join(@uri, 'resource') end + + def pid=(pid) + RestClient.put File.join(@uri, 'pid'), :pid => pid + end def completed? self.status.to_s == 'completed' @@ -49,7 +66,7 @@ module OpenTox def wait_for_completion until self.completed? - sleep 0.1 + sleep 1 end end diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb index e330c87..7fce35b 100644 --- a/lib/tasks/opentox.rb +++ b/lib/tasks/opentox.rb @@ -13,7 +13,7 @@ namespace :opentox do when /thin|mongrel|webrick/ port = uri.sub(/^.*:/,'').sub(/\/$/,'') Dir.chdir dir - pid_file = File.join(@@tmp_dir,"#{service}.pid") + pid_file = File.join(TMP_DIR,"#{service}.pid") begin `#{server} --trace --rackup config.ru start -p #{port} -e #{ENV['RACK_ENV']} -P #{pid_file} -d &` puts "#{service} started on localhost:#{port} in #{ENV['RACK_ENV']} environment with PID file #{pid_file}." @@ -36,7 +36,7 @@ namespace :opentox do if server =~ /thin|mongrel|webrick/ @@config[:services].each do |service,uri| port = uri.sub(/^.*:/,'').sub(/\/$/,'') - pid_file = File.join(@@tmp_dir,"#{service}.pid") + pid_file = File.join(TMP_DIR,"#{service}.pid") begin puts `#{server} stop -P #{pid_file}` puts "#{service} stopped on localhost:#{port}" @@ -71,7 +71,7 @@ task :start do case server when /thin|mongrel|webrick/ port = @@config[:services][service].sub(/^.*:/,'').sub(/\/$/,'') - pid_file = File.join(@@tmp_dir,"#{service}.pid") + pid_file = File.join(TMP_DIR,"#{service}.pid") begin `#{server} --trace --rackup config.ru start -p #{port} -e #{ENV['RACK_ENV']} -P #{pid_file} -d &` puts "#{service} started on localhost:#{port} in #{ENV['RACK_ENV']} environment with PID file #{pid_file}." @@ -93,7 +93,7 @@ task :stop do server = @@config[:webserver] if server =~ /thin|mongrel|webrick/ port = @@config[:services][service].sub(/^.*:/,'').sub(/\/$/,'') - pid_file = File.join(@@tmp_dir,"#{service}.pid") + pid_file = File.join(TMP_DIR,"#{service}.pid") begin puts `thin stop -P #{pid_file}` puts "#{service} stopped on localhost:#{port}" diff --git a/lib/tasks/redis.rb b/lib/tasks/redis.rb deleted file mode 100644 index ed317d3..0000000 --- a/lib/tasks/redis.rb +++ /dev/null @@ -1,125 +0,0 @@ -# Inspired by rabbitmq.rake the Redbox project at http://github.com/rick/redbox/tree/master -require 'fileutils' -require 'open-uri' - -class RedisRunner - - def self.redisdir - "/tmp/redis/" - end - - def self.redisconfdir - '/etc/redis.conf' - end - - def self.dtach_socket - '/tmp/redis.dtach' - end - - # Just check for existance of dtach socket - def self.running? - File.exists? dtach_socket - end - - def self.start - puts 'Detach with Ctrl+\ Re-attach with rake redis:attach' - sleep 3 - exec "dtach -A #{dtach_socket} redis-server #{redisconfdir}" - end - - def self.attach - exec "dtach -a #{dtach_socket}" - end - - def self.stop - sh 'echo "SHUTDOWN" | nc localhost 6379' - end - -end - -namespace :redis do - - desc 'About redis' - task :about do - puts "\nSee http://code.google.com/p/redis/ for information about redis.\n\n" - end - - desc 'Start redis' - task :start do - RedisRunner.start - end - - desc 'Stop redis' - task :stop do - RedisRunner.stop - end - - desc 'Restart redis' - task :restart do - RedisRunner.stop - RedisRunner.start - end - - desc 'Attach to redis dtach socket' - task :attach do - RedisRunner.attach - end - - desc 'Install the lastest verison of Redis from Github (requires git, duh)' - task :install => [:about, :download, :make] do - %w(redis-benchmark redis-cli redis-server).each do |bin| - sh "sudo cp /tmp/redis/#{bin} /usr/bin/" - end - - puts "Installed redis-benchmark, redis-cli and redis-server to /usr/bin/" - - unless File.exists?('/etc/redis.conf') - sh 'sudo cp /tmp/redis/redis.conf /etc/' - puts "Installed redis.conf to /etc/ \n You should look at this file!" - end - end - - task :make do - sh "cd #{RedisRunner.redisdir} && make clean" - sh "cd #{RedisRunner.redisdir} && make" - end - - desc "Download package" - task :download do - sh 'rm -rf /tmp/redis/' if File.exists?("#{RedisRunner.redisdir}/.svn") - sh 'git clone git://github.com/antirez/redis.git /tmp/redis' unless File.exists?(RedisRunner.redisdir) - sh "cd #{RedisRunner.redisdir} && git pull" if File.exists?("#{RedisRunner.redisdir}/.git") - end - -end - -namespace :dtach do - - desc 'About dtach' - task :about do - puts "\nSee http://dtach.sourceforge.net/ for information about dtach.\n\n" - end - - desc 'Install dtach 0.8 from source' - task :install => [:about] do - - Dir.chdir('/tmp/') - unless File.exists?('/tmp/dtach-0.8.tar.gz') - require 'net/http' - - url = 'http://downloads.sourceforge.net/project/dtach/dtach/0.8/dtach-0.8.tar.gz' - open('/tmp/dtach-0.8.tar.gz', 'wb') do |file| file.write(open(url).read) end - end - - unless File.directory?('/tmp/dtach-0.8') - system('tar xzf dtach-0.8.tar.gz') - end - - Dir.chdir('/tmp/dtach-0.8/') - sh 'cd /tmp/dtach-0.8/ && ./configure && make' - sh 'sudo cp /tmp/dtach-0.8/dtach /usr/bin/' - - puts 'Dtach successfully installed to /usr/bin.' - end -end - diff --git a/lib/templates/config.ru b/lib/templates/config.ru deleted file mode 100644 index 81cea9d..0000000 --- a/lib/templates/config.ru +++ /dev/null @@ -1,13 +0,0 @@ -require 'rubygems' -require 'opentox-ruby-api-wrapper' -require 'application.rb' -require 'rack' -require 'rack/contrib' - -FileUtils.mkdir_p @@tmp_dir -log = File.new("#{@@tmp_dir}/#{ENV["RACK_ENV"]}.log", "a+") -$stdout.reopen(log) -$stderr.reopen(log) - -use Rack::ShowExceptions -run Sinatra::Application diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index 7b46d43..ad7c4ab 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -1,10 +1,20 @@ -:base_dir: /home/ch/webservices -:webserver: thin -:services: -# make sure to enter a full uri (including training slash) - opentox-compound: "http://localhost:4000/" - opentox-feature: "http://localhost:4001/" - opentox-dataset: "http://localhost:4002/" - opentox-algorithm: "http://localhost:4003/" - opentox-model: "http://localhost:4004/" - #opentox-task: "http://localhost:4005/" +# Example configuration for OpenTox, please adjust to your settings +# +# Example 1: Using external test services +# +# :services: +# opentox-compound: "http://webservices.in-silico.ch/test/compound/" +# opentox-dataset: "http://webservices.in-silico.ch/test/dataset/" +# opentox-algorithm: "http://webservices.in-silico.ch/test/algorithm/" +# opentox-model: "http://webservices.in-silico.ch/test/model/" +# opentox-task: "http://webservices.in-silico.ch/test/task/" +# +# Example 2: Using local services +# :base_dir: /home/ch/webservices +# :webserver: thin +# :services: +# opentox-compound: "http://localhost:4000/" +# opentox-dataset: "http://localhost:4001/" +# opentox-algorithm: "http://localhost:4002/" +# opentox-model: "http://localhost:4003/" +# opentox-task: "http://localhost:4004/" -- cgit v1.2.3 From 68aa100dbbbbf20da20e6b19f415fad81f0da744 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 31 Jan 2010 19:14:54 +0100 Subject: Version bump to 1.2.6 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c813fe1..3c43790 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.5 +1.2.6 -- cgit v1.2.3 From 3925785d70b541345bdbbbad7a8fce18eeaa01db Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 31 Jan 2010 19:24:07 +0100 Subject: opentox-ruby-api-wrapper version 1.2.6 required --- Rakefile | 2 +- opentox-ruby-api-wrapper.gemspec | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Rakefile b/Rakefile index b8bf71c..ba06640 100644 --- a/Rakefile +++ b/Rakefile @@ -10,7 +10,7 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core"].each do |dep| + ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets"].each do |dep| gem.add_dependency dep end gem.add_development_dependency "cucumber" diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 21879b3..c803a5c 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.2.5" + s.version = "1.2.6" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-01-11} + s.date = %q{2010-01-31} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-debian.sh", "yaml2owl.rb"] @@ -35,9 +35,8 @@ Gem::Specification.new do |s| "lib/owl.rb", "lib/spork.rb", "lib/task.rb", + "lib/tasks/config.rb", "lib/tasks/opentox.rb", - "lib/tasks/redis.rb", - "lib/templates/config.ru", "lib/templates/config.yaml", "lib/utils.rb" ] @@ -56,22 +55,26 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end else @@ -79,11 +82,13 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From 70fef6f3fbf3e629947534949774d93dc5ea7fe2 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 1 Feb 2010 16:19:13 +0100 Subject: central configuration for config.ru added --- lib/tasks/config.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 lib/tasks/config.rb diff --git a/lib/tasks/config.rb b/lib/tasks/config.rb new file mode 100644 index 0000000..3720ef3 --- /dev/null +++ b/lib/tasks/config.rb @@ -0,0 +1,19 @@ +require 'rubygems' +require 'rack' +require 'rack/contrib' +require 'application.rb' + +# log at centralized place +logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" +log = File.new(logfile, "a+") +$stdout.reopen(log) +$stderr.reopen(log) +$stdout.sync = true +$stderr.sync = true +set :raise_errors, true + +['public','tmp'].each do |dir| + FileUtils.mkdir_p dir unless File.exists?(dir) +end + +use Rack::ShowExceptions -- cgit v1.2.3 From 6626ea9e65b09f4c5f3c85556157f42c53e99fea Mon Sep 17 00:00:00 2001 From: David Vorgrimmler Date: Tue, 2 Feb 2010 13:12:08 +0100 Subject: New install-script(tested on Ubuntu 9.10/8.10) --- bin/opentox-install-ubuntu.sh | 363 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 363 insertions(+) create mode 100755 bin/opentox-install-ubuntu.sh diff --git a/bin/opentox-install-ubuntu.sh b/bin/opentox-install-ubuntu.sh new file mode 100755 index 0000000..e038c17 --- /dev/null +++ b/bin/opentox-install-ubuntu.sh @@ -0,0 +1,363 @@ +#!/bin/bash +#Installation is tested on Debian Ubuntu 9.10 +#Update the system + +FAILED=0 +STARTPATH=$PWD +ERRLOG=$PWD/'install_err.log' +INSTALLLOG=$PWD/'install_log.log' +DATE=$(date +%Y/%m/%d\ %H:%M:%S) +BRANCH=$1 +GEMVERSION="1.3.5" +GITVERSION="1.6.5.2" +RAPTORVERSION="1.4.20" +RASQALVERSION="0.9.16" +RASQALVERSION2="0.9.15" +REDLANDVERSION="1.0.7" +REDBINDVERSION="1.0.7.1" + +if [ "$BRANCH" = '' ] +then + echo "Please enter: sudo ./[filename] [brunchtpy]" + exit 1 +fi +echo "=================================================" +echo "Selected branch is: $BRANCH" +echo "=================================================" +echo "Please enshure that the sudo package is installed" +echo "on your system. " +echo "On Ubuntu Linux sudo is installed by default." +echo "If you are unsure check with it 'sudo ls'" +echo "and installed it with 'apt-get install sudo'" +echo "and add your username with visudo." +echo "=================================================" +echo "Some programs and the OpenTox webservices will be installed in the current folder." +echo "=================================================" +echo -n "To continue installation press y: " +read answer +if [ "$answer" != "y" ] +then + echo "exiting the script..." + exit 1 +fi + +echo "opentox webservice install log - " $DATE > $INSTALLLOG +echo "opentox webservice install err log - " $DATE > $ERRLOG +echo "Installing: build-essential" +sudo apt-get install build-essential | tee -a $INSTALLLOG + +echo "Installing: ruby 1.8 with its dev files" +sudo apt-get install ruby ruby1.8-dev | tee -a $INSTALLLOG + +echo "Installing: gems rdoc rubygems libxml-parser-ruby1.8 libxml++2.6-dev libyaml-ruby libzlib-ruby sqlite3 libsqlite3-dev libsqlite3-ruby1.8 and rake" +sudo apt-get install gems rdoc rubygems libxml-parser-ruby1.8 libxml++2.6-dev libyaml-ruby libzlib-ruby rake sqlite3 libsqlite3-dev libsqlite3-ruby1.8 | tee -a $INSTALLLOG + +#RUBYGEMS +echo "Installing rubygems from source. This may take some time" +if [ ! -d $STARTPATH/rubygems-$GEMVERSION ]; +then + wget http://rubyforge.org/frs/download.php/60718/rubygems-$GEMVERSION.tgz >>$INSTALLLOG 2>>$ERRLOG + tar xzfv rubygems-$GEMVERSION.tgz >>$INSTALLLOG 2>>$ERRLOG + cd rubygems-$GEMVERSION + sudo ruby setup.rb >>$INSTALLLOG 2>>$ERRLOG + cd .. + sudo rm rubygems-$GEMVERSION.tgz + CHECKGEM=`gem -v` + if [ "$CHECKGEM" == "$GEMVERSION" ] + then + echo "Adding http://gems.github.com to ruby gem sources" + sudo gem sources -a http://gems.github.com >>$INSTALLLOG 2>>$ERRLOG + + echo "=================================================" + echo "Rubygems version $GEMVERSION successfully installed." + echo "=================================================" + else + echo "Rubygems version $GEMVERSION installation failed." + FAILED=1 + fi +else + echo "rubygems-$GEMVERSION folder already exist. " +fi + +echo "Installing packages: zlib1g-dev tcl curl perl ssh tcl tk8.5 libopenssl-ruby libgsl0-dev swig r-base rinruby" +sudo apt-get install zlib1g-dev tcl curl perl libopenssl-ruby libgsl0-dev r-base | tee -a $INSTALLLOG +sudo apt-get install ssh tcl tk8.5 | tee -a $INSTALLLOG +sudo apt-get install swig | tee -a $INSTALLLOG + +#echo "Installing gems jeweler sinatra emk-sinatra-url-for dm-core cehoffman-sinatra-respond_to rest-client rack-contrib thin cucumber datamapper data_objects do_sqlite3 rinruby" +#sudo gem install jeweler | tee -a $INSTALLLOG +#sudo gem install sinatra | tee -a $INSTALLLOG +#sudo gem install emk-sinatra-url-for -s http://gems.github.com | tee -a $INSTALLLOG +#sudo gem install dm-core | tee -a $INSTALLLOG +#sudo gem install cehoffman-sinatra-respond_to -s http://gems.github.com | tee -a $INSTALLLOG +#sudo gem install rest-client | tee -a $INSTALLLOG +#sudo gem install rack-contrib | tee -a $INSTALLLOG +#sudo gem install thin | tee -a $INSTALLLOG +#sudo gem install cucumber | tee -a $INSTALLLOG +#sudo gem install datamapper | tee -a $INSTALLLOG +#sudo gem install data_objects | tee -a $INSTALLLOG +#sudo gem install do_sqlite3 | tee -a $INSTALLLOG +#sudo gem install rinruby | tee -a $INSTALLLOG +#sudo gem cleanup | tee -a $INSTALLLOG + +echo "Installing LibRDF-ruby" +sudo apt-get install librdf0 librdf-ruby | tee -a $INSTALLLOG + +#GIT +echo "Installing git from source" +echo "This could take a while..." +if [ ! -d $STARTPATH/git-$GITVERSION ]; +then + wget http://www.kernel.org/pub/software/scm/git/git-$GITVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG + tar xzfv git-$GITVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG + cd git-$GITVERSION + ./configure >>$INSTALLLOG 2>>$ERRLOG + make >>$INSTALLLOG 2>>$ERRLOG + sudo make install >>$INSTALLLOG 2>>$ERRLOG + cd .. + sudo rm git-$GITVERSION.tar.gz + CHECKGIT=`git --version` + if [ "$CHECKGIT" == "git version $GITVERSION" ] + then + echo "=================================================" + echo "Git version $GITVERSION successfully installed." + echo "=================================================" + else + echo "Git version $GITVERSION installation failed." + FAILED=1 + fi +else + echo "git-$GITVERSION folder exists." +fi + +#REDLAND +if [ ! -d $STARTPATH/redland ]; +then + echo "Making Redland folder." + mkdir redland >>$INSTALLLOG 2>>$ERRLOG + cd redland + echo "Installing Redland raptor" + if [ ! -d $STARTPATH/redland/raptor-$RAPTORVERSION ]; + then + wget wget http://download.librdf.org/source/raptor-$RAPTORVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG + tar xzfv raptor-$RAPTORVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG + cd raptor-$RAPTORVERSION + ./configure >>$INSTALLLOG 2>>$ERRLOG + sudo make >>$INSTALLLOG 2>>$ERRLOG + sudo make install >>$INSTALLLOG 2>>$ERRLOG + cd .. + sudo rm raptor-$RAPTORVERSION.tar.gz + CHECKRAPTOR=`raptor-config --version` + if [ "$CHECKRAPTOR" == "$RAPTORVERSION" ] + then + echo "=================================================" + echo "Raptor version $RAPTORVERSION successfully installed." + echo "=================================================" + else + echo "Raptor version $RAPTORVERSION installation failed." + FAILED=1 + fi + else + echo "raptor-$RAPTORVERSION folder exists." + fi + + echo "Installing Redland rasqal" + wget wget http://download.librdf.org/source/rasqal-$RASQALVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG + tar xzfv rasqal-$RASQALVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG + cd rasqal-$RASQALVERSION + ./configure >>$INSTALLLOG 2>>$ERRLOG + sudo make >>$INSTALLLOG 2>>$ERRLOG + sudo make install >>$INSTALLLOG 2>>$ERRLOG + cd .. + sudo rm rasqal-$RASQALVERSION.tar.gz + CHECKRASQAL=`rasqal-config --version` + if [ "$CHECKRASQAL" == "$RASQALVERSION2" -o "$CHECKRASQAL" == "$RASQALVERSION" ] + then + echo "=================================================" + echo "Raptor version $RASQALVERSION2 or higher successfully installed." + echo "=================================================" + else + echo "Raptor version $RASQALVERSION2 or higher installation failed." + FAILED=1 + fi + + echo "Installing Redland redland" + wget wget http://download.librdf.org/source/redland-$REDLANDVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG + tar xzfv redland-$REDLANDVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG + cd redland-$REDLANDVERSION + ./configure >>$INSTALLLOG 2>>$ERRLOG + sudo make >>$INSTALLLOG 2>>$ERRLOG + sudo make install >>$INSTALLLOG 2>>$ERRLOG + cd .. + sudo rm redland-$REDLANDVERSION.tar.gz + CHECKREDLAND=`redland-config --version` + if [ "$CHECKREDLAND" == "$REDLANDVERSION" ] + then + echo "=================================================" + echo "Redland version $REDLANDVERSION successfully installed." + echo "=================================================" + else + echo "Redland version $REDLANDVERSION installation failed." + FAILED=1 + fi + + + echo "Installing Redland Bindings with ruby" + wget http://download.librdf.org/source/redland-bindings-$REDBINDVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG + tar xzfv redland-bindings-$REDBINDVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG + cd redland-bindings-$REDBINDVERSION + ./configure --with-ruby >>$INSTALLLOG 2>>$ERRLOG + sudo make >>$INSTALLLOG 2>>$ERRLOG + sudo make install >>$INSTALLLOG 2>>$ERRLOG + cd .. + sudo rm redland-bindings-$REDBINDVERSION.tar.gz + cd .. + #CHECKREDBIND=`??? --version` + #if [ "$CHECKREDBIND" == "$REDBINDVERSION" ] + #then + # echo "=================================================" + # echo "Redland Bindings version $REDBINDVERSION successfully installed." + # echo "=================================================" + #else + # echo "Redland Bindings version $REDBINDVERSION installation failed." + # FAILED=1 + #fi +else + echo "Redland folder exists." +fi + +echo "Installing the opentox webservices" +mkdir webservices +cd webservices + +echo "Install the opentox-ruby-api-wrapper" +echo "This could take a while..." +git clone git://github.com/helma/opentox-ruby-api-wrapper.git >>$INSTALLLOG 2>>$ERRLOG +cd opentox-ruby-api-wrapper +git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG +OTAPIVERSION=`cat VERSION` +sudo rake install | tee -a $INSTALLLOG +cd .. +CHECKOTAPI=`gem list | grep "opentox-ruby-api-wrapper" | grep "$OTAPIVERSION"` +if [ ! "$CHECKOTAPI" = '' ] +then + echo "=================================================" + echo "opentox-ruby-api-wrapper ($OTAPIVERSION) successfully installed." + echo "=================================================" +else + echo "opentox-ruby-api-wrapper ($OTAPIVERSION) installation failed." + FAILED=1 +fi + +echo "Installing the webservices: compound, dataset, algorithm, model, task, feature" +git clone git://github.com/helma/opentox-compound.git >>$INSTALLLOG 2>>$ERRLOG +git clone git://github.com/helma/opentox-dataset.git >>$INSTALLLOG 2>>$ERRLOG +# opentox-algorithem only temporally from davor! +git clone git://github.com/davor/opentox-algorithm.git >>$INSTALLLOG 2>>$ERRLOG +git clone git://github.com/helma/opentox-model.git >>$INSTALLLOG 2>>$ERRLOG +git clone git://github.com/helma/opentox-task.git >>$INSTALLLOG 2>>$ERRLOG +git clone git://github.com/helma/opentox-feature.git >>$INSTALLLOG 2>>$ERRLOG + +cd opentox-compound +git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG +cd ../opentox-dataset +git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG +cd ../opentox-algorithm +git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG +cd ../opentox-model +git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG +cd ../opentox-task +git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG +cd ../opentox-task +git checkout -b development origin/development >>$INSTALLLOG 2>>$ERRLOG +cd .. + +#edit /home/[username]/.opentox/config/test.yaml set :base_dir: /home/[username]/webservices + +echo "Installing the tests" +git clone git://github.com/helma/opentox-test.git >>$INSTALLLOG 2>>$ERRLOG +cd opentox-test +git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG + +echo "Installing openbabel" +cd ../opentox-compound +sudo rake openbabel:install | tee -a $INSTALLLOG +sudo ldconfig >>$INSTALLLOG 2>>$ERRLOG +#VERSION=` --version` +#if [ "$VERSION" == "$RAPTORVERSION" ] +#then +# echo "=================================================" +# echo "Raptor version $RAPTORVERSION successfully installed." +# echo "=================================================" +#else +# echo "Raptor version $RAPTORVERSION installation failed." +# FAILED=1 +#fi + + +#check /webservices/opentox-algorithm/fminer.rb for 1,0/ture,false bug +BUGCHECK1=`grep "@@fminer.AddActivity(true, id)" $STARTPATH/webservices/opentox-algorithm/fminer.rb` +BUGCHECK2=`grep "@@fminer.AddActivity(false, id)" $STARTPATH/webservices/opentox-algorithm/fminer.rb` +if [ -z "$BUGCHECK1$BUGCHECK2" ] +then + echo "fminer.rb is correct." +else + sed -i 's/@@fminer.AddActivity(true, id)/@@fminer.AddActivity(1, id)/g' $STARTPATH/webservices/opentox-algorithm/fminer.rb + sed -i 's/@@fminer.AddActivity(false, id)/@@fminer.AddActivity(0, id)/g' $STARTPATH/webservices/opentox-algorithm/fminer.rb + echo "fminer.rb updated." +fi + +#todo: configure libfminer Makefile (location of ruby.h) +#-> fixed by using davor's repository + + +cd ../opentox-algorithm +echo "Installing fminer" +echo "This could take a while..." +sudo updatedb +sudo rake fminer:install | tee -a $INSTALLLOG +cd .. +FMINERVERSION=`ls $STARTPATH/webservices/opentox-algorithm/libfminer | grep "fminer.so"` +if [ "$FMINERVERSION" == "fminer.so" ] +then + echo "=================================================" + echo "Fminer successfully installed." + echo "=================================================" +else + echo "Fminer installation failed." + FAILED=1 +fi + +if [ $FAILED == 0 ] +then + #get username + echo "Please enter username:" + read USERNAME + + #change rights from root to user + sudo chown -R $USERNAME: $STARTPATH/webservices/ + sudo chown -R $USERNAME: ~/.opentox/ +fi + +if [ "$FAILED" == "1" ] +then + echo "=================================================" + echo "Installation script failed!" + echo "=================================================" + exit 1 +else +echo "=================================================" +echo "opentox-install-script is completed." +echo "=================================================" +echo "Configuration:" +echo "Edit the settings in $HOME/.opentox/config/{development|production|test}.yaml for your environment." +echo "=================================================" +echo "Start the webservices local:" +echo "cd webservices/opentox-test/" +echo "rake opentox:services:start" +echo "=================================================" +echo "Test local webservices:" +echo "rake features" +echo "=================================================" +fi +exit 0 -- cgit v1.2.3 From e42bf74be6c6cd7001307d5df661665218001d2e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 2 Feb 2010 14:19:11 +0100 Subject: Version bump to 1.2.7 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 3c43790..c04c650 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.6 +1.2.7 -- cgit v1.2.3 From 61afba520203c613eb17bb6e6e57d33e4cfb1dca Mon Sep 17 00:00:00 2001 From: David Vorgrimmler Date: Tue, 2 Feb 2010 14:21:02 +0100 Subject: Added postgresql-server-dev-8.2 --- bin/opentox-install-ubuntu.sh | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/bin/opentox-install-ubuntu.sh b/bin/opentox-install-ubuntu.sh index e038c17..f512b71 100755 --- a/bin/opentox-install-ubuntu.sh +++ b/bin/opentox-install-ubuntu.sh @@ -83,22 +83,24 @@ echo "Installing packages: zlib1g-dev tcl curl perl ssh tcl tk8.5 libopenssl-rub sudo apt-get install zlib1g-dev tcl curl perl libopenssl-ruby libgsl0-dev r-base | tee -a $INSTALLLOG sudo apt-get install ssh tcl tk8.5 | tee -a $INSTALLLOG sudo apt-get install swig | tee -a $INSTALLLOG +apt-get install postgresql-server-dev-8.2 | tee -a $INSTALLLOG + #echo "Installing gems jeweler sinatra emk-sinatra-url-for dm-core cehoffman-sinatra-respond_to rest-client rack-contrib thin cucumber datamapper data_objects do_sqlite3 rinruby" -#sudo gem install jeweler | tee -a $INSTALLLOG -#sudo gem install sinatra | tee -a $INSTALLLOG -#sudo gem install emk-sinatra-url-for -s http://gems.github.com | tee -a $INSTALLLOG -#sudo gem install dm-core | tee -a $INSTALLLOG -#sudo gem install cehoffman-sinatra-respond_to -s http://gems.github.com | tee -a $INSTALLLOG -#sudo gem install rest-client | tee -a $INSTALLLOG -#sudo gem install rack-contrib | tee -a $INSTALLLOG -#sudo gem install thin | tee -a $INSTALLLOG -#sudo gem install cucumber | tee -a $INSTALLLOG -#sudo gem install datamapper | tee -a $INSTALLLOG -#sudo gem install data_objects | tee -a $INSTALLLOG -#sudo gem install do_sqlite3 | tee -a $INSTALLLOG -#sudo gem install rinruby | tee -a $INSTALLLOG -#sudo gem cleanup | tee -a $INSTALLLOG +sudo gem install jeweler | tee -a $INSTALLLOG +sudo gem install sinatra | tee -a $INSTALLLOG +sudo gem install emk-sinatra-url-for -s http://gems.github.com | tee -a $INSTALLLOG +sudo gem install dm-core | tee -a $INSTALLLOG +sudo gem install cehoffman-sinatra-respond_to -s http://gems.github.com | tee -a $INSTALLLOG +sudo gem install rest-client | tee -a $INSTALLLOG +sudo gem install rack-contrib | tee -a $INSTALLLOG +sudo gem install thin | tee -a $INSTALLLOG +sudo gem install cucumber | tee -a $INSTALLLOG +sudo gem install datamapper | tee -a $INSTALLLOG +sudo gem install data_objects | tee -a $INSTALLLOG +sudo gem install do_sqlite3 | tee -a $INSTALLLOG +sudo gem install rinruby | tee -a $INSTALLLOG +sudo gem cleanup | tee -a $INSTALLLOG echo "Installing LibRDF-ruby" sudo apt-get install librdf0 librdf-ruby | tee -a $INSTALLLOG -- cgit v1.2.3 From 3d65a42cf68bd5128666d810ec3c29673624ee5d Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 2 Feb 2010 17:00:48 +0100 Subject: centralized database configuration --- Rakefile | 2 +- lib/algorithm.rb | 1 + lib/compound.rb | 10 +++++----- lib/config/config_ru.rb | 19 +++++++++++++++++++ lib/environment.rb | 22 +++++++++++++++++++++- lib/task.rb | 2 +- lib/tasks/config.rb | 19 ------------------- opentox-ruby-api-wrapper.gemspec | 10 ++++++++-- 8 files changed, 56 insertions(+), 29 deletions(-) create mode 100644 lib/config/config_ru.rb delete mode 100644 lib/tasks/config.rb diff --git a/Rakefile b/Rakefile index ba06640..e585ca6 100644 --- a/Rakefile +++ b/Rakefile @@ -10,7 +10,7 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets"].each do |dep| + ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets", "do_sqlite3", "do_postgres"].each do |dep| gem.add_dependency dep end gem.add_development_dependency "cucumber" diff --git a/lib/algorithm.rb b/lib/algorithm.rb index c5d162a..25ae4cb 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -39,6 +39,7 @@ module OpenTox end def self.create_model(params) + LOGGER.debug params @uri = RestClient.post File.join(@@config[:services]["opentox-algorithm"], "lazar"), :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer") end diff --git a/lib/compound.rb b/lib/compound.rb index 562baaa..56646c0 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -21,20 +21,20 @@ module OpenTox @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:uri] @uri = params[:uri] - if params[:uri].match(/InChI/) # shortcut for IST services + case params[:uri] + when /ambit/ # Ambit does not deliver InChIs reliably + smiles = RestClient.get @uri, :accept => 'chemical/x-daylight-smiles' + @inchi = obconversion(smiles,'smi','inchi') + when /InChI/ # shortcut for IST services @inchi = params[:uri].sub(/^.*InChI/, 'InChI') else @inchi = RestClient.get @uri, :accept => 'chemical/x-inchi' - # AMBIT does not provide InChIs - #smiles = RestClient.get(@uri, :accept => 'chemical/x-daylight-smiles').split(/\s+/).first # fix ambit output - #@inchi = obconversion(smiles,'smi','inchi') end end end # Get the (canonical) smiles def smiles - #RestClient.get(@uri, :accept => 'chemical/x-daylight-smiles').split(/\s+/).first # fix ambit output obconversion(@inchi,'inchi','can') end diff --git a/lib/config/config_ru.rb b/lib/config/config_ru.rb new file mode 100644 index 0000000..3720ef3 --- /dev/null +++ b/lib/config/config_ru.rb @@ -0,0 +1,19 @@ +require 'rubygems' +require 'rack' +require 'rack/contrib' +require 'application.rb' + +# log at centralized place +logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" +log = File.new(logfile, "a+") +$stdout.reopen(log) +$stderr.reopen(log) +$stdout.sync = true +$stderr.sync = true +set :raise_errors, true + +['public','tmp'].each do |dir| + FileUtils.mkdir_p dir unless File.exists?(dir) +end + +use Rack::ShowExceptions diff --git a/lib/environment.rb b/lib/environment.rb index a9d0797..fedc3cf 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -2,7 +2,7 @@ require 'logger' # set default environment ENV['RACK_ENV'] = 'test' unless ENV['RACK_ENV'] -# load configuration +# load/setup configuration basedir = File.join(ENV['HOME'], ".opentox") config_dir = File.join(basedir, "config") config_file = File.join(config_dir, "#{ENV['RACK_ENV']}.yaml") @@ -19,6 +19,26 @@ else puts "Please edit #{config_file} and restart your application." exit end + +# database +if @@config[:database] + ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types'].each{|lib| require lib } + case @@config[:database][:adapter] + when /sqlite/i + db_dir = File.join(basedir, "db") + FileUtils.mkdir_p db_dir + DataMapper::setup(:default, "sqlite3://#{db_dir}/opentox.sqlite3") + else + DataMapper.setup(:default, { + :adapter => @@config[:database][:adapter], + :database => @@config[:database][:database], + :username => @@config[:database][:username], + :password => @@config[:database][:password], + :host => @@config[:database][:host]}) + end +end + +# logging logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" LOGGER = Logger.new(logfile,'daily') # daily rotation LOGGER.level = Logger::DEBUG diff --git a/lib/task.rb b/lib/task.rb index 24bd944..9e60c2e 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -10,7 +10,7 @@ module OpenTox end def self.create - uri = RestClient.post @@config[:services]["opentox-task"], nil + uri = RestClient.post @@config[:services]["opentox-task"], {} Task.new(uri) end diff --git a/lib/tasks/config.rb b/lib/tasks/config.rb deleted file mode 100644 index 3720ef3..0000000 --- a/lib/tasks/config.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'rubygems' -require 'rack' -require 'rack/contrib' -require 'application.rb' - -# log at centralized place -logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" -log = File.new(logfile, "a+") -$stdout.reopen(log) -$stderr.reopen(log) -$stdout.sync = true -$stderr.sync = true -set :raise_errors, true - -['public','tmp'].each do |dir| - FileUtils.mkdir_p dir unless File.exists?(dir) -end - -use Rack::ShowExceptions diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index c803a5c..36ae17b 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.2.6" + s.version = "1.2.7" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-01-31} + s.date = %q{2010-02-02} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-debian.sh", "yaml2owl.rb"] @@ -62,6 +62,8 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) @@ -75,6 +77,8 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end else @@ -89,6 +93,8 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From 1ed45e8676b1a2c183fc426afe3d22f63787ddcd Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 2 Feb 2010 17:37:08 +0100 Subject: lib/task --- lib/task.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/task.rb b/lib/task.rb index 8f44dc6..779b87c 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -61,7 +61,8 @@ module OpenTox end def pid=(pid) - RestClient.put File.join(@uri, 'pid'), :pid => pid + resource = RestClient::Resource.new(File.join(@uri,'pid'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource.put :pid => pid end def completed? -- cgit v1.2.3 From 53d755065500701a46b2a3754dc1299febe79c43 Mon Sep 17 00:00:00 2001 From: mr Date: Wed, 3 Feb 2010 15:34:46 +0100 Subject: change Basic realm text for http authentication --- lib/authorization.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 4e4abe2..7cb548e 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -1,7 +1,7 @@ helpers do def protected! - response['WWW-Authenticate'] = %(Basic realm="Opentox Ruby API Wrapper Auth") and \ + response['WWW-Authenticate'] = %(Basic realm="Opentox Webservice Authentication") and \ throw(:halt, [401, "Not authorized\n"]) and \ return unless authorized? end -- cgit v1.2.3 From 96acb35b4357ee4094c2f54384f200b5533d8ad9 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 4 Feb 2010 19:41:23 +0100 Subject: tasks as trees, prediction of database structures, improved error checking --- lib/task.rb | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/lib/task.rb b/lib/task.rb index 9e60c2e..70d22bf 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -26,19 +26,6 @@ module OpenTox task_uris = RestClient.get(@@config[:services]["opentox-task"]).split(/\n/) task_uris.collect{|uri| Task.new(uri)} end - - def started - #LOGGER.info File.join(@uri,'started') - RestClient.put File.join(@uri,'started'), {} - end - - def cancel - RestClient.put File.join(@uri,'cancelled'), {} - end - - def completed(uri) - RestClient.put File.join(@uri,'completed'), :resource => uri - end def created_at RestClient.get File.join(@uri, 'created_at') @@ -55,6 +42,26 @@ module OpenTox def resource RestClient.get File.join(@uri, 'resource') end + + def started + RestClient.put File.join(@uri,'started'), {} + end + + def cancel + RestClient.put File.join(@uri,'cancelled'), {} + end + + def failed + RestClient.put File.join(@uri,'failed'), {} + end + + def parent=(task) + RestClient.put File.join(@uri,'parent'), {:uri => task.uri} + end + + def completed(uri) + RestClient.put File.join(@uri,'completed'), :resource => uri + end def pid=(pid) RestClient.put File.join(@uri, 'pid'), :pid => pid @@ -64,8 +71,12 @@ module OpenTox self.status.to_s == 'completed' end + def failed? + self.status.to_s == 'failed' + end + def wait_for_completion - until self.completed? + until self.completed? or self.failed? sleep 1 end end -- cgit v1.2.3 From 499b05d3d949b2b53b4411d28779d9155cf5bf5e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 8 Feb 2010 10:23:33 +0100 Subject: started to track tasks from model --- lib/dataset.rb | 2 +- lib/model.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 0a49e87..bd523a3 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -87,7 +87,7 @@ module OpenTox def self.find(uri) dataset = Dataset.new data = `curl "#{uri}"` - #data = RestClient.get uri, :accept => 'application/rdf+xml' # unclear why this does not work for complex uris, Dataset.find works from irb + #data = RestClient.get(uri, :accept => 'application/rdf+xml') # unclear why this does not work for complex uris, Dataset.find works from irb dataset.rdf = data dataset end diff --git a/lib/model.rb b/lib/model.rb index bd9d546..a585b59 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -50,6 +50,14 @@ module OpenTox RestClient.post(@@config[:services]["opentox-model"], data, :content_type => "application/x-yaml").to_s end +# def self.create(task) +# @uri = RestClient.post(@@config[:services]["opentox-model"], :task_uri => task.uri) +# end + +# def yaml=(data) +# RestClient.put(@@uri, data, :content_type => "application/x-yaml").to_s +# end + def endpoint YAML.load(RestClient.get(uri))[:endpoint] end -- cgit v1.2.3 From 6ab4b3f02b11e2d3d605d547e841b5469170832f Mon Sep 17 00:00:00 2001 From: David Vorgrimmler Date: Mon, 8 Feb 2010 15:11:45 +0100 Subject: Updating ubuntu script. --- bin/opentox-install-ubuntu.sh | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/bin/opentox-install-ubuntu.sh b/bin/opentox-install-ubuntu.sh index f512b71..b27f9f9 100755 --- a/bin/opentox-install-ubuntu.sh +++ b/bin/opentox-install-ubuntu.sh @@ -74,6 +74,7 @@ then else echo "Rubygems version $GEMVERSION installation failed." FAILED=1 + exit $FAILED fi else echo "rubygems-$GEMVERSION folder already exist. " @@ -83,7 +84,7 @@ echo "Installing packages: zlib1g-dev tcl curl perl ssh tcl tk8.5 libopenssl-rub sudo apt-get install zlib1g-dev tcl curl perl libopenssl-ruby libgsl0-dev r-base | tee -a $INSTALLLOG sudo apt-get install ssh tcl tk8.5 | tee -a $INSTALLLOG sudo apt-get install swig | tee -a $INSTALLLOG -apt-get install postgresql-server-dev-8.2 | tee -a $INSTALLLOG +sudo apt-get install postgresql-server-dev-8.4 | tee -a $INSTALLLOG #echo "Installing gems jeweler sinatra emk-sinatra-url-for dm-core cehoffman-sinatra-respond_to rest-client rack-contrib thin cucumber datamapper data_objects do_sqlite3 rinruby" @@ -127,6 +128,7 @@ then else echo "Git version $GITVERSION installation failed." FAILED=1 + exit $FAILED fi else echo "git-$GITVERSION folder exists." @@ -158,6 +160,7 @@ then else echo "Raptor version $RAPTORVERSION installation failed." FAILED=1 + exit $FAILED fi else echo "raptor-$RAPTORVERSION folder exists." @@ -181,6 +184,7 @@ then else echo "Raptor version $RASQALVERSION2 or higher installation failed." FAILED=1 + exit $FAILED fi echo "Installing Redland redland" @@ -201,6 +205,7 @@ then else echo "Redland version $REDLANDVERSION installation failed." FAILED=1 + exit $FAILED fi @@ -223,6 +228,7 @@ then #else # echo "Redland Bindings version $REDBINDVERSION installation failed." # FAILED=1 + # exit $FAILED #fi else echo "Redland folder exists." @@ -249,6 +255,7 @@ then else echo "opentox-ruby-api-wrapper ($OTAPIVERSION) installation failed." FAILED=1 + exit $FAILED fi echo "Installing the webservices: compound, dataset, algorithm, model, task, feature" @@ -285,6 +292,8 @@ echo "Installing openbabel" cd ../opentox-compound sudo rake openbabel:install | tee -a $INSTALLLOG sudo ldconfig >>$INSTALLLOG 2>>$ERRLOG + +ln -s /usr/local/lib/libopenbabel.so.3 /usr/lib/libopenbabel.so.3 >> $INSTALLLOG 2>>$ERR #VERSION=` --version` #if [ "$VERSION" == "$RAPTORVERSION" ] #then @@ -294,6 +303,7 @@ sudo ldconfig >>$INSTALLLOG 2>>$ERRLOG #else # echo "Raptor version $RAPTORVERSION installation failed." # FAILED=1 +# exit $FAILED #fi @@ -328,6 +338,7 @@ then else echo "Fminer installation failed." FAILED=1 + exit $FAILED fi if [ $FAILED == 0 ] -- cgit v1.2.3 From 51344709fb0d3ee1f74f77bc225eba914e28194c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 8 Feb 2010 16:33:04 +0100 Subject: Regenerated gemspec for version 1.2.7 --- opentox-ruby-api-wrapper.gemspec | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index c803a5c..c8a0c1a 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.2.6" + s.version = "1.2.7" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-01-31} + s.date = %q{2010-02-08} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-debian.sh", "yaml2owl.rb"] @@ -26,6 +26,7 @@ Gem::Specification.new do |s| "bin/yaml2owl.rb", "lib/algorithm.rb", "lib/compound.rb", + "lib/config/database.rb", "lib/dataset.rb", "lib/environment.rb", "lib/helper.rb", @@ -35,7 +36,6 @@ Gem::Specification.new do |s| "lib/owl.rb", "lib/spork.rb", "lib/task.rb", - "lib/tasks/config.rb", "lib/tasks/opentox.rb", "lib/templates/config.yaml", "lib/utils.rb" @@ -62,6 +62,8 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) @@ -75,6 +77,8 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end else @@ -89,6 +93,8 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From 62d4979cb96ca8243a6915c6fa1c3b317a41b041 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 8 Feb 2010 17:41:53 +0100 Subject: jeweler development dependency added --- Rakefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index e585ca6..ffe1f61 100644 --- a/Rakefile +++ b/Rakefile @@ -13,7 +13,9 @@ begin ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets", "do_sqlite3", "do_postgres"].each do |dep| gem.add_dependency dep end - gem.add_development_dependency "cucumber" + ['cucmber','jeweler'].each do |dep| + gem.add_development_dependency dep + end gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] gem.files.include %w(lib/tasks/owl.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/utils.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings -- cgit v1.2.3 From 9b136b483eb826bc25fb60d4e33b1e8128a85559 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 8 Feb 2010 18:03:36 +0100 Subject: data_objects requirements removed --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index ffe1f61..102160f 100644 --- a/Rakefile +++ b/Rakefile @@ -10,7 +10,7 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets", "do_sqlite3", "do_postgres"].each do |dep| + ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets"].each do |dep| gem.add_dependency dep end ['cucmber','jeweler'].each do |dep| -- cgit v1.2.3 From 63172223d1aeadd38850c85de668d1b1b333ceb0 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 9 Feb 2010 12:09:30 +0100 Subject: Dataset service with tasks --- lib/config/config_ru.rb | 1 + lib/dataset.rb | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/config/config_ru.rb b/lib/config/config_ru.rb index 3720ef3..1d32c7e 100644 --- a/lib/config/config_ru.rb +++ b/lib/config/config_ru.rb @@ -10,6 +10,7 @@ $stdout.reopen(log) $stderr.reopen(log) $stdout.sync = true $stderr.sync = true +set :logging, false set :raise_errors, true ['public','tmp'].each do |dir| diff --git a/lib/dataset.rb b/lib/dataset.rb index bd523a3..19572f6 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -156,7 +156,18 @@ module OpenTox end def save - RestClient.post(@@config[:services]["opentox-dataset"], self.rdf, :content_type => "application/rdf+xml").to_s + LOGGER.debug "Saving dataset" + task_uri = RestClient.post(@@config[:services]["opentox-dataset"], self.rdf, :content_type => "application/rdf+xml").to_s + task = OpenTox::Task.find(task_uri) + LOGGER.debug "Waiting for task #{task_uri}" + task.wait_for_completion + LOGGER.debug "Dataset task #{task_uri} completed" + if task.failed? + LOGGER.error "Saving dataset failed" + task.failed + exit + end + task.resource end def to_yaml -- cgit v1.2.3 From e3b3717024d644f17a52f5a49b6b145e53fee503 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 9 Feb 2010 15:56:20 +0100 Subject: Debug messages for Dataset.find --- lib/dataset.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/dataset.rb b/lib/dataset.rb index 19572f6..3971537 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -86,7 +86,9 @@ module OpenTox def self.find(uri) dataset = Dataset.new + LOGGER.debug "Getting data from #{uri}" data = `curl "#{uri}"` + LOGGER.debug data #data = RestClient.get(uri, :accept => 'application/rdf+xml') # unclear why this does not work for complex uris, Dataset.find works from irb dataset.rdf = data dataset -- cgit v1.2.3 From 658a73f4648f179f4f9073e0011e71085ee3e733 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 10 Feb 2010 11:01:33 +0100 Subject: Algorithm component switched back to helma --- bin/opentox-install-ubuntu.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bin/opentox-install-ubuntu.sh b/bin/opentox-install-ubuntu.sh index b27f9f9..75faff7 100755 --- a/bin/opentox-install-ubuntu.sh +++ b/bin/opentox-install-ubuntu.sh @@ -261,8 +261,7 @@ fi echo "Installing the webservices: compound, dataset, algorithm, model, task, feature" git clone git://github.com/helma/opentox-compound.git >>$INSTALLLOG 2>>$ERRLOG git clone git://github.com/helma/opentox-dataset.git >>$INSTALLLOG 2>>$ERRLOG -# opentox-algorithem only temporally from davor! -git clone git://github.com/davor/opentox-algorithm.git >>$INSTALLLOG 2>>$ERRLOG +git clone git://github.com/helma/opentox-algorithm.git >>$INSTALLLOG 2>>$ERRLOG git clone git://github.com/helma/opentox-model.git >>$INSTALLLOG 2>>$ERRLOG git clone git://github.com/helma/opentox-task.git >>$INSTALLLOG 2>>$ERRLOG git clone git://github.com/helma/opentox-feature.git >>$INSTALLLOG 2>>$ERRLOG -- cgit v1.2.3 From bfa1d9f1a85d8c6c5a7132328819d95d29fb07a8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 10 Feb 2010 16:09:24 +0100 Subject: debugging output of owl-dl removed --- lib/dataset.rb | 2 +- opentox-ruby-api-wrapper.gemspec | 21 +++++++++------------ 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 3971537..0ffefdc 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -88,7 +88,7 @@ module OpenTox dataset = Dataset.new LOGGER.debug "Getting data from #{uri}" data = `curl "#{uri}"` - LOGGER.debug data + #LOGGER.debug data #data = RestClient.get(uri, :accept => 'application/rdf+xml') # unclear why this does not work for complex uris, Dataset.find works from irb dataset.rdf = data dataset diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 36ae17b..89de270 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,10 +9,10 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-02-02} + s.date = %q{2010-02-09} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} - s.executables = ["opentox-install-debian.sh", "yaml2owl.rb"] + s.executables = ["yaml2owl.rb", "opentox-install-debian.sh"] s.extra_rdoc_files = [ "LICENSE", "README.rdoc" @@ -26,6 +26,7 @@ Gem::Specification.new do |s| "bin/yaml2owl.rb", "lib/algorithm.rb", "lib/compound.rb", + "lib/config/config_ru.rb", "lib/dataset.rb", "lib/environment.rb", "lib/helper.rb", @@ -35,7 +36,6 @@ Gem::Specification.new do |s| "lib/owl.rb", "lib/spork.rb", "lib/task.rb", - "lib/tasks/config.rb", "lib/tasks/opentox.rb", "lib/templates/config.yaml", "lib/utils.rb" @@ -62,9 +62,8 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -77,9 +76,8 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end else s.add_dependency(%q, [">= 0"]) @@ -93,9 +91,8 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From 33d59523b3340d213b2bee58cde5de9ff4bffe99 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 15 Feb 2010 10:14:43 +0100 Subject: OWL-DL partially fixed according to Ninas suggestions --- lib/dataset.rb | 8 ++++++-- lib/environment.rb | 1 + lib/model.rb | 2 +- lib/owl.rb | 1 - 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 3971537..65e1e6b 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -14,6 +14,8 @@ module OpenTox data_entry = @model.subject OT['compound'], compound if data_entry.nil? data_entry = @model.create_resource + dataset = @model.subject(RDF['type'],OT[self.owl_class]) + @model.add dataset, RDF['dataEntry'], data_entry @model.add data_entry, RDF['type'], OT["DataEntry"] @model.add data_entry, OT['compound'], compound end @@ -29,6 +31,8 @@ module OpenTox data_entry = @model.subject OT['compound'], compound if data_entry.nil? data_entry = @model.create_resource + dataset = @model.subject(RDF['type'],OT[self.owl_class]) + @model.add dataset, RDF['dataEntry'], data_entry @model.add data_entry, RDF['type'], OT["DataEntry"] @model.add data_entry, OT['compound'], compound end @@ -57,7 +61,7 @@ module OpenTox def find_or_create_compound(uri) compound = @model.subject(DC["identifier"], uri) if compound.nil? - compound = @model.create_resource + compound = @model.create_resource(uri) @model.add compound, RDF['type'], OT["Compound"] @model.add compound, DC["identifier"], uri end @@ -68,7 +72,7 @@ module OpenTox def find_or_create_feature(uri) feature = @model.subject(DC["identifier"], uri) if feature.nil? - feature = @model.create_resource + feature = @model.create_resource(uri) @model.add feature, RDF['type'], OT["Feature"] @model.add feature, DC["identifier"], uri @model.add feature, DC["title"], File.basename(uri).split(/#/)[1] diff --git a/lib/environment.rb b/lib/environment.rb index fedc3cf..814e5c0 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -15,6 +15,7 @@ if File.exist?(config_file) else FileUtils.mkdir_p TMP_DIR FileUtils.mkdir_p LOG_DIR + FileUtils.mkdir_p config_dir FileUtils.cp(File.join(File.dirname(__FILE__), 'templates/config.yaml'), config_file) puts "Please edit #{config_file} and restart your application." exit diff --git a/lib/model.rb b/lib/model.rb index a585b59..976efac 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -24,7 +24,7 @@ module OpenTox lazar.algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") lazar.trainingDataset = yaml[:activity_dataset] lazar.dependentVariables = yaml[:endpoint] - lazar.predictedVariables = yaml[:endpoint] #+ " lazar prediction" + lazar.predictedVariables = yaml[:endpoint] + "_lazar_prediction" lazar end diff --git a/lib/owl.rb b/lib/owl.rb index a843e59..82d6e0e 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -16,7 +16,6 @@ module OpenTox # reate an anonymous resource for metadata # this has to be rewritten with an URI as soon as the resource has been saved at an definitive location tmp = @model.create_resource - @model.add tmp, RDF['type'], OWL['Ontology'] @model.add tmp, RDF['type'], OT[self.owl_class] end -- cgit v1.2.3 From 8946f755a1b6063d424263924acefce0d0d9d49e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 16 Feb 2010 16:22:14 +0100 Subject: data_entry linked to dataset --- lib/dataset.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index f8f4a1b..e4e4e9d 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -15,7 +15,7 @@ module OpenTox if data_entry.nil? data_entry = @model.create_resource dataset = @model.subject(RDF['type'],OT[self.owl_class]) - @model.add dataset, RDF['dataEntry'], data_entry + @model.add dataset, OT['dataEntry'], data_entry @model.add data_entry, RDF['type'], OT["DataEntry"] @model.add data_entry, OT['compound'], compound end @@ -32,7 +32,7 @@ module OpenTox if data_entry.nil? data_entry = @model.create_resource dataset = @model.subject(RDF['type'],OT[self.owl_class]) - @model.add dataset, RDF['dataEntry'], data_entry + @model.add dataset, OT['dataEntry'], data_entry @model.add data_entry, RDF['type'], OT["DataEntry"] @model.add data_entry, OT['compound'], compound end -- cgit v1.2.3 From a90f1ea5513997c96492bdf8e92bab39c3fea406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Wed, 17 Feb 2010 10:03:02 +0100 Subject: print annoying curl messages (error stream) to dev/null --- lib/dataset.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 0ffefdc..962a576 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -86,8 +86,8 @@ module OpenTox def self.find(uri) dataset = Dataset.new - LOGGER.debug "Getting data from #{uri}" - data = `curl "#{uri}"` + LOGGER.debug "Getting data from #{uri}" + data = `curl "#{uri}" 2> /dev/null` #LOGGER.debug data #data = RestClient.get(uri, :accept => 'application/rdf+xml') # unclear why this does not work for complex uris, Dataset.find works from irb dataset.rdf = data -- cgit v1.2.3 From fdafd34343b420ad66b8ebf2b29fa4775830f73a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 23 Feb 2010 11:30:25 +0100 Subject: add logging info --- lib/environment.rb | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/environment.rb b/lib/environment.rb index fedc3cf..b796b6d 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -39,8 +39,47 @@ if @@config[:database] end # logging +class MyLogger < Logger + + + def trace() + lines = caller(0) +# puts lines.join("\n") +# puts "-" + line = lines[2] +# puts line +# puts "-" + index = line.rindex(/\/.*\.rb/) +# raise "index = nil" if index==nil + return line if index==nil +# puts "<<< "+line[index..-1].size.to_s+" <<< "+line[index..-1] +# raise "stop" + line[index..-1] + end + + def debug(param) + super trace.ljust(50)+" :: "+param.to_s + end + + def info(param) + super trace.ljust(50)+" :: "+param.to_s + end + + def warn(param) + super trace.ljust(50)+" :: "+param.to_s + end + + def error(param) + super trace.ljust(50)+" :: "+param.to_s + end + +end + logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" -LOGGER = Logger.new(logfile,'daily') # daily rotation + +LOGGER = MyLogger.new(logfile,'daily') # daily rotation +#LOGGER = MyLogger.new(STDOUT) + LOGGER.level = Logger::DEBUG # RDF namespaces -- cgit v1.2.3 From 71b9c5c171a6b179de7e1372264844ad875f9660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 23 Feb 2010 11:53:38 +0100 Subject: modify logging info --- lib/environment.rb | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index b796b6d..c2fbeac 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -46,7 +46,15 @@ class MyLogger < Logger lines = caller(0) # puts lines.join("\n") # puts "-" - line = lines[2] + n = 2 + line = lines[n] + + while (line =~ /spork.rb/ or line =~ /as_task/) + #puts "skip line "+line.to_s + n += 1 + line = lines[n] + end + # puts line # puts "-" index = line.rindex(/\/.*\.rb/) @@ -77,8 +85,8 @@ end logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" -LOGGER = MyLogger.new(logfile,'daily') # daily rotation -#LOGGER = MyLogger.new(STDOUT) +#LOGGER = MyLogger.new(logfile,'daily') # daily rotation +LOGGER = MyLogger.new(STDOUT) LOGGER.level = Logger::DEBUG -- cgit v1.2.3 From ceb2d32650ee20c1874cbd9e880f88b3ac175eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 23 Feb 2010 16:07:15 +0100 Subject: modify logging --- lib/environment.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index c2fbeac..3329089 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -59,10 +59,10 @@ class MyLogger < Logger # puts "-" index = line.rindex(/\/.*\.rb/) # raise "index = nil" if index==nil - return line if index==nil + return line if index==nil || index<4 # puts "<<< "+line[index..-1].size.to_s+" <<< "+line[index..-1] # raise "stop" - line[index..-1] + ".."+line[(index-3)..-1] end def debug(param) @@ -85,9 +85,8 @@ end logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" -#LOGGER = MyLogger.new(logfile,'daily') # daily rotation -LOGGER = MyLogger.new(STDOUT) - +LOGGER = MyLogger.new(logfile,'daily') # daily rotation +#LOGGER = MyLogger.new(STDOUT) LOGGER.level = Logger::DEBUG # RDF namespaces -- cgit v1.2.3 From 1a2116574c356241a55fb0bb7d922a042ffd4465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 23 Feb 2010 17:19:01 +0100 Subject: format logging once again --- lib/environment.rb | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index 3329089..c4de0b5 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -41,6 +41,12 @@ end # logging class MyLogger < Logger + def pwd + path = Dir.pwd.to_s + index = path.rindex(/\//) + return path if index==nil + path[(index+1)..-1] + end def trace() lines = caller(0) @@ -59,26 +65,30 @@ class MyLogger < Logger # puts "-" index = line.rindex(/\/.*\.rb/) # raise "index = nil" if index==nil - return line if index==nil || index<4 + return line if index==nil # puts "<<< "+line[index..-1].size.to_s+" <<< "+line[index..-1] # raise "stop" - ".."+line[(index-3)..-1] + line[index..-1] + end + + def format(msg) + pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace end - def debug(param) - super trace.ljust(50)+" :: "+param.to_s + def debug(msg) + super format(msg) end - def info(param) - super trace.ljust(50)+" :: "+param.to_s + def info(msg) + super format(msg) end - def warn(param) - super trace.ljust(50)+" :: "+param.to_s + def warn(msg) + super format(msg) end - def error(param) - super trace.ljust(50)+" :: "+param.to_s + def error(msg) + super format(msg) end end @@ -87,6 +97,7 @@ logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" LOGGER = MyLogger.new(logfile,'daily') # daily rotation #LOGGER = MyLogger.new(STDOUT) + LOGGER.level = Logger::DEBUG # RDF namespaces -- cgit v1.2.3 From 7b59d1f07bf8cf0e23f3070f97f940af3bfad843 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 23 Feb 2010 17:49:02 +0100 Subject: some test issues resolved --- lib/algorithm.rb | 2 ++ lib/authorization.rb | 4 ++-- lib/compound.rb | 3 ++- lib/model.rb | 8 ++++++++ lib/task.rb | 3 ++- 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index ed7b629..2a781d8 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -16,6 +16,7 @@ module OpenTox end def self.create_feature_dataset(params) + LOGGER.debug File.basename(__FILE__) + ": creating feature dataset" resource = RestClient::Resource.new(params[:feature_generation_uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri] end @@ -41,6 +42,7 @@ module OpenTox def self.create_model(params) LOGGER.debug params + LOGGER.debug File.basename(__FILE__) + ": creating model" #@uri = RestClient.post File.join(@@config[:services]["opentox-algorithm"], "lazar"), :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer") resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) @uri = resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer") diff --git a/lib/authorization.rb b/lib/authorization.rb index 7cb548e..9a1760a 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -20,5 +20,5 @@ helpers do end before do - protected! unless env['REQUEST_METHOD'] == "GET" -end \ No newline at end of file + #protected! unless env['REQUEST_METHOD'] == "GET" +end diff --git a/lib/compound.rb b/lib/compound.rb index 56646c0..0ee853d 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -17,7 +17,8 @@ module OpenTox @inchi = sdf2inchi(params[:sdf]) @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:name] - @inchi = RestClient.get("#{@@cactus_uri}#{params[:name]}/stdinchi").chomp + # paranoid URI encoding to keep SMILES charges and brackets + @inchi = RestClient.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").chomp @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:uri] @uri = params[:uri] diff --git a/lib/model.rb b/lib/model.rb index 8abd040..6c48734 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -39,6 +39,7 @@ module OpenTox # Predict a compound def predict(compound) + # nicht absichern?? resource = RestClient::Resource.new(@uri, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) resource.post(:compound_uri => compound.uri) end @@ -52,6 +53,13 @@ module OpenTox resource.post(data, :content_type => "application/x-yaml").to_s end + def delete + resource = RestClient::Resource.new(self.uri, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource.delete + #RestClient.delete @uri if @uri + #RestClient.delete model.task_uri if model.task_uri + end + # def self.create(task) # @uri = RestClient.post(@@config[:services]["opentox-model"], :task_uri => task.uri) # end diff --git a/lib/task.rb b/lib/task.rb index 97b3c1d..c5cddf7 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -84,7 +84,8 @@ module OpenTox def parent=(task) #RestClient.put File.join(@uri,'parent'), {:uri => task.uri} - resource = RestClient::Resource.new(@File.join(@uri,'parent'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource = RestClient::Resource.new(File.join(@uri,'parent'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + LOGGER.debug "task.rb: #{resource}" resource.put :uri => task.uri end -- cgit v1.2.3 From 40097421ffccc1c20f302e95f82242ccba9a501e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 26 Feb 2010 16:54:37 +0100 Subject: source file added to logger --- lib/algorithm.rb | 2 ++ lib/dataset.rb | 2 ++ lib/task.rb | 2 ++ 3 files changed, 6 insertions(+) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 2a781d8..179a4a2 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -1,3 +1,5 @@ +LOGGER.progname = File.expand_path(__FILE__) + module OpenTox module Algorithm diff --git a/lib/dataset.rb b/lib/dataset.rb index d4e7082..b5b2e06 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -1,3 +1,5 @@ +LOGGER.progname = File.expand_path(__FILE__) + module OpenTox class Dataset diff --git a/lib/task.rb b/lib/task.rb index c5cddf7..f507a22 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,3 +1,5 @@ +LOGGER.progname = File.expand_path(__FILE__) + module OpenTox class Task -- cgit v1.2.3 From 771e8acd790d7c2d5c54c7395ae650a6f4bd3bf0 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 1 Mar 2010 10:17:00 +0100 Subject: Version bump to 1.3.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c04c650..f0bb29e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.7 +1.3.0 -- cgit v1.2.3 From a11d6ddbde79e82888bec072748b1b9dd9e8af60 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 1 Mar 2010 10:21:43 +0100 Subject: wrapper version bumped to 1.3.0 --- lib/algorithm.rb | 8 ++++++++ lib/model.rb | 2 +- lib/opentox-ruby-api-wrapper.rb | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 179a4a2..817340f 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -22,6 +22,10 @@ module OpenTox resource = RestClient::Resource.new(params[:feature_generation_uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri] end + + def self.uri + File.join(@@config[:services]["opentox-algorithm"], "fminer") + end end class Lazar @@ -50,6 +54,10 @@ module OpenTox @uri = resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer") end + def self.uri + File.join(@@config[:services]["opentox-algorithm"], "lazar") + end + end class Similarity diff --git a/lib/model.rb b/lib/model.rb index 6c48734..b5129d7 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -45,7 +45,7 @@ module OpenTox end def self.base_uri - @@config[:services]["opentox-model"] + File.join @@config[:services]["opentox-model"],'lazar' end def self.create(data) diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 03838e8..849043c 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['owl', 'compound','dataset','algorithm','model','task','utils','authorization'].each do |lib| +['owl', 'compound','dataset','algorithm','model','task','validation','utils','authorization'].each do |lib| require lib end -- cgit v1.2.3 From 5ba6fa6748002f4937fb5ac1100313fb904a6229 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 1 Mar 2010 10:49:47 +0100 Subject: validation object added --- lib/validation.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 lib/validation.rb diff --git a/lib/validation.rb b/lib/validation.rb new file mode 100644 index 0000000..6fd5704 --- /dev/null +++ b/lib/validation.rb @@ -0,0 +1,21 @@ +module OpenTox + class Validation + + attr_accessor :uri + + def initialize(params) + resource = RestClient::Resource.new(params[:uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + @uri = resource.post(params).to_s + end + + def self.crossvalidation(params) + params[:uri] = File.join(@@config[:services]['opentox-validation'], "crossvalidation") + params[:num_folds] = 10 unless params[:num_folds] + params[:random_seed] = 2 unless params[:random_seed] + params[:stratified] = false unless params[:stratified] + OpenTox::Validation.new(params) + end + + end +end + -- cgit v1.2.3 From 0e461d0157337c699f2a5c6f0faaa9faeb881da3 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 1 Mar 2010 11:07:26 +0100 Subject: validation.rb added to Rakefile --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 102160f..d2eaf64 100644 --- a/Rakefile +++ b/Rakefile @@ -17,7 +17,7 @@ begin gem.add_development_dependency dep end gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] - gem.files.include %w(lib/tasks/owl.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/utils.rb, lib/templates/*) + gem.files.include %w(lib/tasks/owl.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/utils.rb, lib/validation.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end Jeweler::GemcutterTasks.new -- cgit v1.2.3 From ae14b74076c5050eb737d02387191c3e45aa0067 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 1 Mar 2010 16:48:47 +0100 Subject: thin moved to development dependencies --- Rakefile | 4 ++-- opentox-ruby-api-wrapper.gemspec | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Rakefile b/Rakefile index d2eaf64..caf499e 100644 --- a/Rakefile +++ b/Rakefile @@ -10,10 +10,10 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "thin", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets"].each do |dep| + ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets"].each do |dep| gem.add_dependency dep end - ['cucmber','jeweler'].each do |dep| + ['cucmber','jeweler', "thin"].each do |dep| gem.add_development_dependency dep end gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 9500df4..83e7c59 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -60,7 +60,6 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) @@ -68,13 +67,13 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -82,6 +81,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end else s.add_dependency(%q, [">= 0"]) @@ -89,7 +89,6 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -97,6 +96,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From b8b3f8250dc392ee968eec3f76ec6ea8de3777d8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 1 Mar 2010 17:01:56 +0100 Subject: Rakefile typo fixed --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index caf499e..2dfb2c6 100644 --- a/Rakefile +++ b/Rakefile @@ -13,7 +13,7 @@ begin ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets"].each do |dep| gem.add_dependency dep end - ['cucmber','jeweler', "thin"].each do |dep| + ['cucumber','jeweler', "thin"].each do |dep| gem.add_development_dependency dep end gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] -- cgit v1.2.3 From 854115e9837eebb12ec3f6bc2506e89ef1859966 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 1 Mar 2010 17:04:04 +0100 Subject: gemspec regenerated --- opentox-ruby-api-wrapper.gemspec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 83e7c59..de5515b 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -65,7 +65,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) + s.add_development_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else @@ -79,7 +79,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end @@ -94,7 +94,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end -- cgit v1.2.3 From ff8276f1b382193d8bea3c72be3e2af6526c2463 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 2 Mar 2010 11:12:00 +0100 Subject: typo in task.rb fixed --- lib/task.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/task.rb b/lib/task.rb index f507a22..a6a54d5 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -55,7 +55,7 @@ module OpenTox end def cancel - resource = RestClient::Resource.new(@File.join(@uri,'cancelled'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource = RestClient::Resource.new(File.join(@uri,'cancelled'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) resource.put({}) end @@ -80,7 +80,7 @@ module OpenTox =end def failed #RestClient.put File.join(@uri,'failed'), {} - resource = RestClient::Resource.new(@File.join(@uri,'failed'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource = RestClient::Resource.new(File.join(@uri,'failed'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) resource.put({}) end -- cgit v1.2.3 From 69c83a5598b19bd6055d1c31630805bf6305fd51 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 2 Mar 2010 11:14:00 +0100 Subject: Version bump to 1.3.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f0bb29e..3a3cd8c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.0 +1.3.1 -- cgit v1.2.3 From 12013ba5de1e256afe8dcdd7b95ef4b27a7c9507 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 2 Mar 2010 11:14:58 +0100 Subject: version bumped to 1.3.1 --- opentox-ruby-api-wrapper.gemspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index de5515b..9498187 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.3.0" + s.version = "1.3.1" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-03-01} + s.date = %q{2010-03-02} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "opentox-install-debian.sh", "yaml2owl.rb"] -- cgit v1.2.3 From 711234e3f7926231550e9f05cf35921b54056a06 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 10 Mar 2010 12:00:48 +0100 Subject: newline added to end of uri-lists --- opentox-ruby-api-wrapper.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 9498187..3598a0f 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-03-02} + s.date = %q{2010-03-05} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "opentox-install-debian.sh", "yaml2owl.rb"] -- cgit v1.2.3 From e1cb8e39ca0331ea2db7e633c3bc708aa691b0b3 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 10 Mar 2010 19:17:46 +0100 Subject: owl-dl (temporarily) removed, switched to YAML representation --- lib/algorithm.rb | 2 +- lib/dataset.rb | 79 +++++++++++++++++++++++++++++--------------------------- lib/model.rb | 24 ++++++++++++++++- lib/owl.rb | 2 +- lib/task.rb | 9 +++---- 5 files changed, 70 insertions(+), 46 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 817340f..c17159e 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -51,7 +51,7 @@ module OpenTox LOGGER.debug File.basename(__FILE__) + ": creating model" #@uri = RestClient.post File.join(@@config[:services]["opentox-algorithm"], "lazar"), :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer") resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - @uri = resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer") + @uri = resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer").chomp end def self.uri diff --git a/lib/dataset.rb b/lib/dataset.rb index b5b2e06..5caaa2c 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -3,12 +3,47 @@ LOGGER.progname = File.expand_path(__FILE__) module OpenTox class Dataset - include Owl + #include Owl + + attr_accessor :uri, :title, :source, :identifier, :data, :features, :compounds def initialize - super + @data = {} + @features = [] + @compounds = [] + #super + end + + def self.find(uri) + #dataset = Dataset.new + LOGGER.debug "Getting data from #{uri}" + YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s # unclear why this does not work for complex uris, Dataset.find works from irb + #data = `curl "#{uri}"` + #LOGGER.debug data + #dataset.rdf = data + #dataset + end + + + def save + LOGGER.debug "Saving dataset" + @features.uniq! + @compounds.uniq! + #task_uri = RestClient.post(@@config[:services]["opentox-dataset"], self.rdf, :content_type => "application/rdf+xml").to_s + task_uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s + task = OpenTox::Task.find(task_uri) + LOGGER.debug "Waiting for task #{task_uri}" + task.wait_for_completion + LOGGER.debug "Dataset task #{task_uri} completed" + if task.failed? + LOGGER.error "Saving dataset failed" + task.failed + exit + end + task.resource end +=begin # create/add to entry from uris or Redland::Resources def add(compound,feature,value) compound = self.find_or_create_compound compound unless compound.class == Redland::Resource @@ -87,17 +122,7 @@ module OpenTox resource = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) uri = resource.post data, :content_type => content_type dataset = Dataset.new - dataset.read uri.to_s - dataset - end - - def self.find(uri) - dataset = Dataset.new - LOGGER.debug "Getting data from #{uri}" - data = `curl "#{uri}"` - #LOGGER.debug data - #data = RestClient.get(uri, :accept => 'application/rdf+xml') # unclear why this does not work for complex uris, Dataset.find works from irb - dataset.rdf = data + dataset.read uri.chomp.to_s dataset end @@ -165,35 +190,13 @@ module OpenTox resource.delete end - def save - LOGGER.debug "Saving dataset" - #task_uri = RestClient.post(@@config[:services]["opentox-dataset"], self.rdf, :content_type => "application/rdf+xml").to_s - task_uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.rdf, :content_type => "application/rdf+xml").to_s - task = OpenTox::Task.find(task_uri) - LOGGER.debug "Waiting for task #{task_uri}" - task.wait_for_completion - LOGGER.debug "Dataset task #{task_uri} completed" - if task.failed? - LOGGER.error "Saving dataset failed" - task.failed - exit - end - task.resource + def to_owl end - def to_yaml - { - :uri => self.uri, - :opentox_class => self.owl_class, - :title => self.title, - :source => self.source, - :identifier => self.identifier, - :compounds => self.compounds.collect{|c| c.to_s.to_s.sub(/^\[(.*)\]$/,'\1')}, - :features => self.features.collect{|f| f.to_s }, - :data => self.data - }.to_yaml + def from_owl end +=end end end diff --git a/lib/model.rb b/lib/model.rb index b5129d7..5dcc462 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -2,6 +2,27 @@ module OpenTox module Model class Lazar + + attr_accessor :dependent_variable, :activity_dataset_uri, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features + + def initialize + @source = "http://github.com/helma/opentox-model" + @algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") + #@independent_variables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative") + @features = [] + @effects = {} + @activities = {} + @p_values = {} + @fingerprints = {} + end + + def save + @features.uniq! + resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s + end + +=begin include Owl # Create a new prediction model from a dataset @@ -50,7 +71,7 @@ module OpenTox def self.create(data) resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.post(data, :content_type => "application/x-yaml").to_s + resource.post(data, :content_type => "application/x-yaml").chomp.to_s end def delete @@ -101,6 +122,7 @@ module OpenTox @model.add me, OT['predictedVariables'], Redland::Uri.new(predictedVariables) # untyped individual comes from this line, why?? @model.add Redland::Uri.new(predictedVariables), RDF['type'], OT['Feature'] end +=end end end end diff --git a/lib/owl.rb b/lib/owl.rb index 82d6e0e..f8958cd 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -20,7 +20,7 @@ module OpenTox end def uri=(uri) - @uri = uri + @uri = uri.chomp uri = Redland::Uri.new(uri) # rewrite uri @model.subjects(RDF['type'],OT[self.owl_class]).each do |me| diff --git a/lib/task.rb b/lib/task.rb index a6a54d5..6a80d1a 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -7,16 +7,15 @@ module OpenTox attr_accessor :uri def initialize(uri) - #super() - @uri = uri + @uri = uri.chomp end def self.create #uri = RestClient.post @@config[:services]["opentox-task"], {} resource = RestClient::Resource.new(@@config[:services]["opentox-task"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) #uri = resource.post(nil) - uri = resource.post({}) - Task.new(uri) + uri = resource.post({}).chomp + Task.new(uri.chomp) end def self.find(uri) @@ -28,7 +27,7 @@ module OpenTox end def self.all - task_uris = RestClient.get(@@config[:services]["opentox-task"]).split(/\n/) + task_uris = RestClient.get(@@config[:services]["opentox-task"]).chomp.split(/\n/) task_uris.collect{|uri| Task.new(uri)} end -- cgit v1.2.3 From 8657902cae694470dc316b60a186a8dcc9f84f07 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 15 Mar 2010 09:13:33 +0100 Subject: tests for yaml representation working --- lib/model.rb | 8 ++++---- lib/task.rb | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 5dcc462..d87a006 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -22,6 +22,10 @@ module OpenTox resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s end + + def self.find_all + RestClient.get(@@config[:services]["opentox-model"]).chomp.split("\n") + end =begin include Owl @@ -49,10 +53,6 @@ module OpenTox lazar end - def self.find_all - RestClient.get(@@config[:services]["opentox-model"]).split("\n") - end - def self.find(uri) yaml = RestClient.get(uri, :accept => "application/x-yaml") OpenTox::Model::Lazar.from_yaml(yaml) diff --git a/lib/task.rb b/lib/task.rb index 6a80d1a..87bad21 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -105,7 +105,7 @@ module OpenTox def wait_for_completion until self.completed? or self.failed? - sleep 1 + sleep 0.1 end end -- cgit v1.2.3 From e4a1f0b1c7444cb3fd6218c115e0f414d9b68958 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 15 Mar 2010 13:41:07 +0100 Subject: small modification to internal yaml representation --- lib/dataset.rb | 35 +++++++++++++++-------------------- lib/owl.rb | 2 +- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 5caaa2c..468af04 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -11,17 +11,11 @@ module OpenTox @data = {} @features = [] @compounds = [] - #super end def self.find(uri) - #dataset = Dataset.new - LOGGER.debug "Getting data from #{uri}" - YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s # unclear why this does not work for complex uris, Dataset.find works from irb - #data = `curl "#{uri}"` - #LOGGER.debug data - #dataset.rdf = data - #dataset + #LOGGER.debug "Getting data from #{uri}" + YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s end @@ -29,18 +23,19 @@ module OpenTox LOGGER.debug "Saving dataset" @features.uniq! @compounds.uniq! - #task_uri = RestClient.post(@@config[:services]["opentox-dataset"], self.rdf, :content_type => "application/rdf+xml").to_s - task_uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s - task = OpenTox::Task.find(task_uri) - LOGGER.debug "Waiting for task #{task_uri}" - task.wait_for_completion - LOGGER.debug "Dataset task #{task_uri} completed" - if task.failed? - LOGGER.error "Saving dataset failed" - task.failed - exit - end - task.resource + #task_uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s + uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s + #task = OpenTox::Task.find(task_uri) + #LOGGER.debug "Waiting for task #{task_uri}" + #task.wait_for_completion + #LOGGER.debug "Dataset task #{task_uri} completed" + #if task.failed? + #LOGGER.error "Saving dataset failed" + #task.failed + #exit + #end + #task.resource + uri end =begin diff --git a/lib/owl.rb b/lib/owl.rb index f8958cd..146bce7 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -8,7 +8,7 @@ module OpenTox @model = Redland::Model.new Redland::MemoryStore.new @parser = Redland::Parser.new - @serializer = Redland::Serializer.ntriples + #@serializer = Redland::Serializer.ntriples # read OT Ontology #@parser.parse_into_model(@model,"http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file") -- cgit v1.2.3 From 1c9b874b8db1a2ae27fd97137d7a014188531bc1 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 16 Mar 2010 11:05:40 +0100 Subject: toxcreate adapted for new representation --- lib/algorithm.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index c17159e..11c619d 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -49,9 +49,8 @@ module OpenTox def self.create_model(params) LOGGER.debug params LOGGER.debug File.basename(__FILE__) + ": creating model" - #@uri = RestClient.post File.join(@@config[:services]["opentox-algorithm"], "lazar"), :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer") - resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - @uri = resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer").chomp + resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") + @uri = resource.post(:dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).chomp end def self.uri -- cgit v1.2.3 From 537aea2020a7b75d5b669642c7c3d9a715316a31 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 16 Mar 2010 17:35:34 +0100 Subject: OWL-DL export added --- lib/algorithm.rb | 28 -------- lib/dataset.rb | 16 +---- lib/owl.rb | 200 +++++++++++++++++++++++++++++++++++++------------------ 3 files changed, 137 insertions(+), 107 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 11c619d..8083db2 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -4,18 +4,6 @@ module OpenTox module Algorithm class Fminer - include Owl - - def initialize - super - self.uri = File.join(@@config[:services]["opentox-algorithm"],'fminer') - self.title = "fminer" - self.source = "http://github.com/amaunz/libfminer" - self.parameters = { - "Dataset URI" => { :scope => "mandatory", :value => "dataset_uri" }, - "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri" } - } - end def self.create_feature_dataset(params) LOGGER.debug File.basename(__FILE__) + ": creating feature dataset" @@ -29,22 +17,6 @@ module OpenTox end class Lazar - include Owl - - def initialize - super - self.uri = File.join(@@config[:services]["opentox-algorithm"],'lazar') - self.title = "lazar" - self.source = "http://github.com/helma/opentox-algorithm" - self.parameters = { - "Dataset URI" => - { :scope => "mandatory", :value => "dataset_uri" }, - "Feature URI for dependent variable" => - { :scope => "mandatory", :value => "feature_uri" }, - "Feature generation URI" => - { :scope => "mandatory", :value => "feature_generation_uri" } - } - end def self.create_model(params) LOGGER.debug params diff --git a/lib/dataset.rb b/lib/dataset.rb index 468af04..ab363a9 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -3,7 +3,6 @@ LOGGER.progname = File.expand_path(__FILE__) module OpenTox class Dataset - #include Owl attr_accessor :uri, :title, :source, :identifier, :data, :features, :compounds @@ -14,7 +13,6 @@ module OpenTox end def self.find(uri) - #LOGGER.debug "Getting data from #{uri}" YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s end @@ -23,19 +21,7 @@ module OpenTox LOGGER.debug "Saving dataset" @features.uniq! @compounds.uniq! - #task_uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s - uri = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s - #task = OpenTox::Task.find(task_uri) - #LOGGER.debug "Waiting for task #{task_uri}" - #task.wait_for_completion - #LOGGER.debug "Dataset task #{task_uri} completed" - #if task.failed? - #LOGGER.error "Saving dataset failed" - #task.failed - #exit - #end - #task.resource - uri + RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s end =begin diff --git a/lib/owl.rb b/lib/owl.rb index 146bce7..05152a3 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -1,31 +1,132 @@ module OpenTox - module Owl + class Owl - attr_reader :uri + attr_reader :uri, :ot_class - def initialize - - @model = Redland::Model.new Redland::MemoryStore.new - @parser = Redland::Parser.new - #@serializer = Redland::Serializer.ntriples + def initialize(ot_class,uri) # read OT Ontology #@parser.parse_into_model(@model,"http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file") #@parser.parse_string_into_model(@model,File.read(File.join(File.dirname(__FILE__),"opentox.owl")),'/') - # reate an anonymous resource for metadata - # this has to be rewritten with an URI as soon as the resource has been saved at an definitive location - tmp = @model.create_resource - @model.add tmp, RDF['type'], OT[self.owl_class] + + @model = Redland::Model.new Redland::MemoryStore.new + @parser = Redland::Parser.new + @ot_class = ot_class + @uri = Redland::Uri.new(uri.chomp) + @model.add @uri, RDF['type'], OT[@ot_class] + + end + + def method_missing(name, *args) + methods = ['title', 'source', 'identifier', 'algorithm', 'independentVariables', 'dependentVariable'] + if methods.include? name.to_s.sub(/=/,'') + if /=/ =~ name.to_s # setter + name = name.to_s.sub(/=/,'') + begin # delete existing entry + t = @model.object(@uri, DC[name]) + @model.delete @uri, DC[name], t + rescue + end + @model.add @uri, DC[name], args.first + else # getter + @model.object(@uri, DC['title']).to_s + end + else + raise "Method '#{name.to_s}' not found." + end + end + + def parameters=(params) + params.each do |name, settings| + parameter = @model.create_resource + @model.add parameter, RDF['type'], OT['Parameter'] + @model.add parameter, DC['title'], name + @model.add parameter, OT['paramScope'], settings[:scope] + @model.add parameter, OT['paramValue'], settings[:value] + end + end + + def add_data_entries(compound_uri,features) + # add compound + compound = @model.subject(DC["identifier"], compound_uri) + if compound.nil? + compound = @model.create_resource(compound_uri) + @model.add compound, RDF['type'], OT["Compound"] + @model.add compound, DC["identifier"], compound_uri + end + features.each do |f| + f.each do |feature_uri,value| + # add feature + feature = find_or_create_feature feature_uri + if value.class.to_s == 'Hash' + # create tuple + tuple = @model.create_resource + @model.add tuple, RDF['type'], OT["Tuple"] + @model.add tuple, OT['feature'], feature + value.each do |uri,v| + f = find_or_create_feature uri + complex_value = @model.create_resource + @model.add tuple, OT['complexValue'], complex_value + @model.add complex_value, RDF['type'], OT["FeatureValue"] + @model.add complex_value, OT['feature'], f + @model.add complex_value, OT['value'], v.to_s + end + # add data entry + data_entry = @model.subject OT['compound'], compound + if data_entry.nil? + data_entry = @model.create_resource + @model.add @uri, OT['dataEntry'], data_entry + @model.add data_entry, RDF['type'], OT["DataEntry"] + @model.add data_entry, OT['compound'], compound + end + @model.add data_entry, OT['values'], tuple + else + data_entry = @model.subject OT['compound'], compound + if data_entry.nil? + data_entry = @model.create_resource + @model.add @uri, OT['dataEntry'], data_entry + @model.add data_entry, RDF['type'], OT["DataEntry"] + @model.add data_entry, OT['compound'], compound + end + values = @model.create_resource + @model.add data_entry, OT['values'], values + @model.add values, RDF['type'], OT['FeatureValue'] + @model.add values, OT['feature'], feature + @model.add values, OT['value'], value.to_s + end + end + end + end + + def find_or_create_feature(feature_uri) + feature = @model.subject(DC["identifier"], feature_uri) + if feature.nil? + feature = @model.create_resource(feature_uri) + @model.add feature, RDF['type'], OT["Feature"] + @model.add feature, DC["identifier"], feature_uri + @model.add feature, DC["title"], File.basename(feature_uri).split(/#/)[1] + @model.add feature, DC['source'], feature_uri + end + feature + end + + def rdf + @model.to_string + end + +=begin + + def to_ntriples + @serializer.model_to_string(Redland::Uri.new(@uri), @model) end def uri=(uri) @uri = uri.chomp - uri = Redland::Uri.new(uri) # rewrite uri - @model.subjects(RDF['type'],OT[self.owl_class]).each do |me| - @model.delete(me,RDF['type'],OT[self.owl_class]) - @model.add(uri,RDF['type'],OT[self.owl_class]) + @model.subjects(RDF['type'],OT[@ot_class]).each do |me| + @model.delete(me,RDF['type'],OT[@ot_class]) + @model.add(uri,RDF['type'],OT[@ot_class]) id = @model.object(me, DC['identifier']) @model.delete me, DC['identifier'], id # find/replace metadata @@ -37,17 +138,18 @@ module OpenTox end end - def title - # I have no idea, why 2 subjects are returned - # iterating over all subjects leads to memory allocation problems - # SPARQL queries also do not work - #me = @model.subjects(RDF['type'],OT[self.owl_class])[1] - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.object(me, DC['title']).to_s + def read(uri) + @parser.parse_into_model(@model,uri) + @uri = uri + end + + def identifier + me = @model.subject(RDF['type'],OT[@ot_class]) + @model.object(me, DC['identifier']).to_s unless me.nil? end def title=(title) - me = @model.subject(RDF['type'],OT[self.owl_class]) + me = @model.subject(RDF['type'],OT[@ot_class]) begin t = @model.object(me, DC['title']) @model.delete me, DC['title'], t @@ -56,13 +158,8 @@ module OpenTox @model.add me, DC['title'], title end - def source - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.object(me, DC['source']).to_s unless me.nil? - end - def source=(source) - me = @model.subject(RDF['type'],OT[self.owl_class]) + me = @model.subject(RDF['type'],OT[@ot_class]) begin t = @model.object(me, DC['source']) @model.delete me, DC['source'], t @@ -71,44 +168,19 @@ module OpenTox @model.add me, DC['source'], source end - def identifier - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.object(me, DC['identifier']).to_s unless me.nil? - end - - def owl_class - self.class.to_s.sub(/^OpenTox::/,'').sub(/::.*$/,'') - end - - def read(uri) - @parser.parse_into_model(@model,uri) - @uri = uri - end - - def rdf=(rdf) - @uri = '/' unless @uri - @parser.parse_string_into_model(@model,rdf,@uri) - end - - def rdf - @model.to_string - end - - def to_ntriples - @serializer.model_to_string(Redland::Uri.new(@uri), @model) + def title + # I have no idea, why 2 subjects are returned + # iterating over all subjects leads to memory allocation problems + # SPARQL queries also do not work + #me = @model.subjects(RDF['type'],OT[@ot_class])[1] + me = @model.subject(RDF['type'],OT[@ot_class]) + @model.object(me, DC['title']).to_s end - def parameters=(params) - params.each do |name, settings| - parameter = @model.create_resource - @model.add parameter, RDF['type'], OT['Parameter'] - @model.add parameter, DC['title'], name - @model.add parameter, OT['paramScope'], settings[:scope] - @model.add parameter, OT['paramValue'], settings[:value] - end + def source + me = @model.subject(RDF['type'],OT[@ot_class]) + @model.object(me, DC['source']).to_s unless me.nil? end - -=begin def create_owl_statement(name,value) r = @model.create_resource dc_class = DC[name.gsub(/^[a-z]/) { |a| a.upcase }] # capitalize only the first letter -- cgit v1.2.3 From 3d4e14e6dc69f88b5b37e6469355d93852d0d208 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 16 Mar 2010 19:42:55 +0100 Subject: initial test for dataset prediction added --- lib/dataset.rb | 1 - lib/task.rb | 21 ++------------------- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index ab363a9..dad6403 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -18,7 +18,6 @@ module OpenTox def save - LOGGER.debug "Saving dataset" @features.uniq! @compounds.uniq! RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s diff --git a/lib/task.rb b/lib/task.rb index 87bad21..5591a34 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -11,9 +11,7 @@ module OpenTox end def self.create - #uri = RestClient.post @@config[:services]["opentox-task"], {} resource = RestClient::Resource.new(@@config[:services]["opentox-task"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - #uri = resource.post(nil) uri = resource.post({}).chomp Task.new(uri.chomp) end @@ -63,22 +61,7 @@ module OpenTox resource.put :resource => uri end -=begin - def started - RestClient.put File.join(@uri,'started'), {} - end - - def cancel - RestClient.put File.join(@uri,'cancelled'), {} - end - - def completed(uri) - RestClient.put File.join(@uri,'completed'), :resource => uri - end - -=end def failed - #RestClient.put File.join(@uri,'failed'), {} resource = RestClient::Resource.new(File.join(@uri,'failed'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) resource.put({}) end @@ -103,9 +86,9 @@ module OpenTox self.status.to_s == 'failed' end - def wait_for_completion + def wait_for_completion(dur=0.1) until self.completed? or self.failed? - sleep 0.1 + sleep dur end end -- cgit v1.2.3 From 584f85c067c6c82a1ace9901245a447bb5f1d3eb Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 18 Mar 2010 20:50:23 +0100 Subject: Version bump to 1.4.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 3a3cd8c..88c5fb8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.1 +1.4.0 -- cgit v1.2.3 From 59d50e68b52b207e1a8207e2a7baeb5b986c9784 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 18 Mar 2010 20:54:24 +0100 Subject: more detailed model information in toxcreate --- lib/model.rb | 2 +- lib/owl.rb | 9 ++------- opentox-ruby-api-wrapper.gemspec | 4 ++-- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index d87a006..c8d501b 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -3,7 +3,7 @@ module OpenTox class Lazar - attr_accessor :dependent_variable, :activity_dataset_uri, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features + attr_accessor :dependent_variable, :activity_dataset_uri, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features, :algorithm def initialize @source = "http://github.com/helma/opentox-model" diff --git a/lib/owl.rb b/lib/owl.rb index 05152a3..c247c45 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -5,21 +5,16 @@ module OpenTox attr_reader :uri, :ot_class def initialize(ot_class,uri) - - # read OT Ontology - #@parser.parse_into_model(@model,"http://opentox.org/data/documents/development/RDF%20files/OpenToxOntology/at_download/file") - #@parser.parse_string_into_model(@model,File.read(File.join(File.dirname(__FILE__),"opentox.owl")),'/') - @model = Redland::Model.new Redland::MemoryStore.new @parser = Redland::Parser.new @ot_class = ot_class @uri = Redland::Uri.new(uri.chomp) @model.add @uri, RDF['type'], OT[@ot_class] - + @model.add @uri, DC['identifier'], @uri end def method_missing(name, *args) - methods = ['title', 'source', 'identifier', 'algorithm', 'independentVariables', 'dependentVariable'] + methods = ['title', 'source', 'identifier', 'algorithm', 'independentVariables', 'dependentVariables', 'predictedVariables', 'date','trainingDataset' ] if methods.include? name.to_s.sub(/=/,'') if /=/ =~ name.to_s # setter name = name.to_s.sub(/=/,'') diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 3598a0f..258ee09 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.3.1" + s.version = "1.4.0" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-03-05} + s.date = %q{2010-03-18} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "opentox-install-debian.sh", "yaml2owl.rb"] -- cgit v1.2.3 From 95f6ca7e8c02daea41ae00b85807cae245142092 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 19 Mar 2010 16:24:41 +0100 Subject: owl parsing implemented --- lib/dataset.rb | 61 +++++++--------------- lib/model.rb | 53 +++++++------------ lib/owl.rb | 159 +++++++++++++++++++++++---------------------------------- 3 files changed, 103 insertions(+), 170 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index dad6403..09cafe2 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -13,7 +13,25 @@ module OpenTox end def self.find(uri) - YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s + if uri.match(/webservices.in-silico.ch|localhost/) # try to get YAML first + YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s + else # get default rdf+xml + owl = OpenTox::Owl.from_uri(uri) + @title = owl.title + @source = owl.source + @identifier = owl.identifier.sub(/^\[/,'').sub(/\]$/,'') + @uri = @identifier + @data = owl.data + halt 404, "Dataset #{uri} empty!" if @data.empty? + @data.each do |compound,features| + @compounds << compound + features.each do |f,v| + @features << f + end + end + @compounds.uniq! + @features.uniq! + end end @@ -114,47 +132,6 @@ module OpenTox features end - def data - data = {} - @model.subjects(RDF['type'], OT['DataEntry']).each do |data_entry| - compound_node = @model.object(data_entry, OT['compound']) - compound_uri = @model.object(compound_node, DC['identifier']).to_s - @model.find(data_entry, OT['values'], nil) do |s,p,values| - feature_node = @model.object values, OT['feature'] - feature_uri = @model.object(feature_node, DC['identifier']).to_s.sub(/\^\^.*$/,'') # remove XML datatype - type = @model.object(values, RDF['type']) - if type == OT['FeatureValue'] - value = @model.object(values, OT['value']).to_s - case value.to_s - when TRUE_REGEXP # defined in environment.rb - value = true - when FALSE_REGEXP # defined in environment.rb - value = false - else - LOGGER.warn compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri - value = nil - end - data[compound_uri] = {} unless data[compound_uri] - data[compound_uri][feature_uri] = [] unless data[compound_uri][feature_uri] - data[compound_uri][feature_uri] << value unless value.nil? - elsif type == OT['Tuple'] - entry = {} - data[compound_uri] = {} unless data[compound_uri] - data[compound_uri][feature_uri] = [] unless data[compound_uri][feature_uri] - @model.find(values, OT['complexValue'],nil) do |s,p,complex_value| - name_node = @model.object complex_value, OT['feature'] - name = @model.object(name_node, DC['title']).to_s - value = @model.object(complex_value, OT['value']).to_s - v = value.sub(/\^\^.*$/,'') # remove XML datatype - v = v.to_f if v.match(/^[\.|\d]+$/) # guess numeric datatype - entry[name] = v - end - data[compound_uri][feature_uri] << entry - end - end - end - data - end def compounds compounds = [] diff --git a/lib/model.rb b/lib/model.rb index c8d501b..e6418f0 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -1,10 +1,26 @@ module OpenTox module Model - - class Lazar - attr_accessor :dependent_variable, :activity_dataset_uri, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features, :algorithm + class Generic + + attr_accessor :predicted_variables, :independent_variables, :dependent_variables, :activity_dataset_uri, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features, :algorithm + + def self.find(uri) + owl = OpenTox::Owl.from_uri(uri) + @title = owl.title + @source = owl.source + @identifier = owl.identifier.sub(/^\[/,'').sub(/\]$/,'') + @uri = @identifier + @algorithm = owl.algorithm + @dependent_variables = owl.dependentVariables + @independent_variables = owl.independentVariables + @predicted_variables = owl.predictedVariables + end + end + + class Lazar < Generic + def initialize @source = "http://github.com/helma/opentox-model" @algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") @@ -22,41 +38,10 @@ module OpenTox resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s end - def self.find_all RestClient.get(@@config[:services]["opentox-model"]).chomp.split("\n") end =begin - include Owl - - # Create a new prediction model from a dataset - def initialize - super - self.source = "http://github.com/helma/opentox-model" - self.algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") - self.independentVariables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative") # TODO read this from dataset - end - - def self.from_yaml(yaml) - yaml = YAML.load yaml - lazar = Lazar.new - lazar.title = "lazar model for #{yaml[:endpoint]}" - lazar.parameters = { - "Dataset URI" => { :scope => "mandatory", :value => "dataset_uri=#{yaml[:activity_dataset]}" }, - "Feature URI for dependent variable" => { :scope => "mandatory", :value => "feature_uri=#{yaml[:endpoint]}" }, - "Feature generation URI" => { :scope => "mandatory", :value => "feature_generation_uri=#{File.join(@@config[:services]["opentox-algorithm"],"fminer")}"} #TODO write to yaml - } - lazar.algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") - lazar.trainingDataset = yaml[:activity_dataset] - lazar.dependentVariables = yaml[:endpoint] - lazar.predictedVariables = yaml[:endpoint] + "_lazar_prediction" - lazar - end - - def self.find(uri) - yaml = RestClient.get(uri, :accept => "application/x-yaml") - OpenTox::Model::Lazar.from_yaml(yaml) - end # Predict a compound def predict(compound) diff --git a/lib/owl.rb b/lib/owl.rb index c247c45..1d47d2c 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -2,15 +2,35 @@ module OpenTox class Owl - attr_reader :uri, :ot_class + attr_accessor :uri, :ot_class, :model - def initialize(ot_class,uri) + def initialize @model = Redland::Model.new Redland::MemoryStore.new - @parser = Redland::Parser.new - @ot_class = ot_class - @uri = Redland::Uri.new(uri.chomp) - @model.add @uri, RDF['type'], OT[@ot_class] - @model.add @uri, DC['identifier'], @uri + end + + def self.create(ot_class,uri) + owl = OpenTox::Owl.new + owl.ot_class = ot_class + owl.uri = Redland::Uri.new(uri.chomp) + owl.model.add owl.uri, RDF['type'], OT[owl.ot_class] + owl.model.add owl.uri, DC['identifier'], owl.uri + owl + end + + def self.from_uri(uri) + owl = OpenTox::Owl.new + parser = Redland::Parser.new + begin + parser.parse_into_model(owl.model,uri) + rescue => e + raise "Error parsing #{uri}: #{e.message + e.backtrace}" + end + owl.uri = Redland::Uri.new(uri.chomp) + owl + end + + def rdf + @model.to_string end def method_missing(name, *args) @@ -25,7 +45,7 @@ module OpenTox end @model.add @uri, DC[name], args.first else # getter - @model.object(@uri, DC['title']).to_s + @model.object(@uri, DC[name.to_s]).to_s end else raise "Method '#{name.to_s}' not found." @@ -106,95 +126,46 @@ module OpenTox feature end - def rdf - @model.to_string - end - -=begin - - def to_ntriples - @serializer.model_to_string(Redland::Uri.new(@uri), @model) - end - - def uri=(uri) - @uri = uri.chomp - # rewrite uri - @model.subjects(RDF['type'],OT[@ot_class]).each do |me| - @model.delete(me,RDF['type'],OT[@ot_class]) - @model.add(uri,RDF['type'],OT[@ot_class]) - id = @model.object(me, DC['identifier']) - @model.delete me, DC['identifier'], id - # find/replace metadata - @model.find(me, nil, nil) do |s,p,o| - @model.delete s,p,o - @model.add uri,p,o + def data + data = {} + @model.subjects(RDF['type'], OT['DataEntry']).each do |data_entry| + compound_node = @model.object(data_entry, OT['compound']) + compound_uri = @model.object(compound_node, DC['identifier']).to_s + @model.find(data_entry, OT['values'], nil) do |s,p,values| + feature_node = @model.object values, OT['feature'] + feature_uri = @model.object(feature_node, DC['identifier']).to_s.sub(/\^\^.*$/,'') # remove XML datatype + type = @model.object(values, RDF['type']) + if type == OT['FeatureValue'] + value = @model.object(values, OT['value']).to_s + case value.to_s + when TRUE_REGEXP # defined in environment.rb + value = true + when FALSE_REGEXP # defined in environment.rb + value = false + else + LOGGER.warn compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri + value = nil + end + data[compound_uri] = [] unless data[compound_uri] + data[compound_uri] << {feature_uri => value} unless value.nil? + elsif type == OT['Tuple'] + entry = {} + data[compound_uri] = [] unless data[compound_uri] + #data[compound_uri][feature_uri] = [] unless data[compound_uri][feature_uri] + @model.find(values, OT['complexValue'],nil) do |s,p,complex_value| + name_node = @model.object complex_value, OT['feature'] + name = @model.object(name_node, DC['title']).to_s + value = @model.object(complex_value, OT['value']).to_s + v = value.sub(/\^\^.*$/,'') # remove XML datatype + v = v.to_f if v.match(/^[\.|\d]+$/) # guess numeric datatype + entry[name] = v + end + data[compound_uri] << {feature_uri => entry} unless entry.empty? + end end - @model.add uri, DC['identifier'], @uri end + data end - def read(uri) - @parser.parse_into_model(@model,uri) - @uri = uri - end - - def identifier - me = @model.subject(RDF['type'],OT[@ot_class]) - @model.object(me, DC['identifier']).to_s unless me.nil? - end - - def title=(title) - me = @model.subject(RDF['type'],OT[@ot_class]) - begin - t = @model.object(me, DC['title']) - @model.delete me, DC['title'], t - rescue - end - @model.add me, DC['title'], title - end - - def source=(source) - me = @model.subject(RDF['type'],OT[@ot_class]) - begin - t = @model.object(me, DC['source']) - @model.delete me, DC['source'], t - rescue - end - @model.add me, DC['source'], source - end - - def title - # I have no idea, why 2 subjects are returned - # iterating over all subjects leads to memory allocation problems - # SPARQL queries also do not work - #me = @model.subjects(RDF['type'],OT[@ot_class])[1] - me = @model.subject(RDF['type'],OT[@ot_class]) - @model.object(me, DC['title']).to_s - end - - def source - me = @model.subject(RDF['type'],OT[@ot_class]) - @model.object(me, DC['source']).to_s unless me.nil? - end - def create_owl_statement(name,value) - r = @model.create_resource - dc_class = DC[name.gsub(/^[a-z]/) { |a| a.upcase }] # capitalize only the first letter - #puts "DC:" + name.gsub(/^[a-z]/) { |a| a.upcase } - @model.add dc_class, RDF['type'], OWL["Class"] - @model.add r, RDF['type'], dc_class - @model.add r, DC[name], value - end - - def method_missing(name, *args) - # create magic setter methods - if /=/ =~ name.to_s - create_owl_statement name.to_s.sub(/=/,''), args.first - else - raise "No method #{name}" - end - end -=end - end - end -- cgit v1.2.3 From 54d1c336501dd34785ca29a3393a9fd347097482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 23 Mar 2010 13:00:55 +0100 Subject: added amit dataset parsing, static lazar feature modifier --- lib/dataset.rb | 10 ++++++++++ lib/environment.rb | 3 +-- lib/model.rb | 14 +++++++++----- lib/spork.rb | 2 ++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index bbadd2d..2d49829 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -123,6 +123,16 @@ module OpenTox value = true when FALSE_REGEXP # defined in environment.rb value = false + when /.*\^\^<.*XMLSchema#.*>/ + case value.to_s + when /XMLSchema#string/ + value = value.to_s[0..(value.to_s.index("^^")-1)] + when /XMLSchema#double/ + value = value.to_s[0..(value.to_s.index("^^")-1)].to_f + else + LOGGER.warn " ILLEGAL TYPE "+compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri + value = nil + end else LOGGER.warn compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri value = nil diff --git a/lib/environment.rb b/lib/environment.rb index 27da072..4c501b4 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -113,8 +113,7 @@ end begin 0 < @@users[:users].keys.length rescue - puts "Please edit #{user_file} and restart your application. Create at least one user with password." - exit + raise "Please edit #{user_file} and restart your application. Create at least one user with password." end # RDF namespaces diff --git a/lib/model.rb b/lib/model.rb index 6c48734..b4ef86c 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -2,7 +2,9 @@ module OpenTox module Model class Lazar - include Owl + include Owl + + PREDICTION_FEATURE_MODIFIER = "_lazar_prediction" # Create a new prediction model from a dataset def initialize @@ -24,7 +26,7 @@ module OpenTox lazar.algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") lazar.trainingDataset = yaml[:activity_dataset] lazar.dependentVariables = yaml[:endpoint] - lazar.predictedVariables = yaml[:endpoint] + "_lazar_prediction" + lazar.predictedVariables = yaml[:endpoint] + PREDICTION_FEATURE_MODIFIER lazar end @@ -35,7 +37,8 @@ module OpenTox def self.find(uri) yaml = RestClient.get(uri, :accept => "application/x-yaml") OpenTox::Model::Lazar.from_yaml(yaml) - end + end + # Predict a compound def predict(compound) @@ -80,7 +83,7 @@ module OpenTox def trainingDataset=(trainingDataset) me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.add me, OT['trainingDataset'], Redland::Uri.new(trainingDataset) # untyped individual comes from this line, why?? + @model.add me, OT['trainingDataset'], Redland::Uri.new(trainingDataset) # untyped individual comes from this line, why?? @model.add Redland::Uri.new(trainingDataset), RDF['type'], OT['Dataset'] end @@ -100,7 +103,8 @@ module OpenTox me = @model.subject(RDF['type'],OT[self.owl_class]) @model.add me, OT['predictedVariables'], Redland::Uri.new(predictedVariables) # untyped individual comes from this line, why?? @model.add Redland::Uri.new(predictedVariables), RDF['type'], OT['Feature'] - end + end + end end end diff --git a/lib/spork.rb b/lib/spork.rb index 5b43281..e8cf37f 100644 --- a/lib/spork.rb +++ b/lib/spork.rb @@ -37,6 +37,7 @@ module Spork def self.spork(options={}) logger = options[:logger] logger.debug "spork> parent PID = #{Process.pid}" if logger + child = fork do begin start = Time.now @@ -52,6 +53,7 @@ module Spork yield rescue => ex + raise ex logger.error "spork> Exception in child[#{Process.pid}] - #{ex.class}: #{ex.message}" if logger ensure logger.info "spork> child[#{Process.pid}] took #{Time.now - start} sec" if logger -- cgit v1.2.3 From 0230d687322bab8c0fd24cf41e33a28554a364db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Thu, 25 Mar 2010 19:39:29 +0100 Subject: wrapper adjustments for validation --- lib/dataset.rb | 169 ++++++++++++++++++++-------------------- lib/environment.rb | 6 +- lib/model.rb | 51 +++++++++++- lib/opentox-ruby-api-wrapper.rb | 2 +- lib/owl.rb | 13 ++-- lib/spork.rb | 2 +- lib/task.rb | 32 +++++++- lib/utils.rb | 19 ++++- 8 files changed, 195 insertions(+), 99 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index f416921..c472d84 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -1,7 +1,7 @@ LOGGER.progname = File.expand_path(__FILE__) module OpenTox - + class Dataset attr_accessor :uri, :title, :source, :identifier, :data, :features, :compounds @@ -13,26 +13,96 @@ module OpenTox end def self.find(uri) - if uri.match(/webservices.in-silico.ch|localhost/) # try to get YAML first - YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s + + if uri.match(/webservices.in-silico.ch|localhost|ot.dataset.de/) # try to get YAML first + d = YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s else # get default rdf+xml owl = OpenTox::Owl.from_uri(uri) - @title = owl.title - @source = owl.source - @identifier = owl.identifier.sub(/^\[/,'').sub(/\]$/,'') - @uri = @identifier - @data = owl.data - halt 404, "Dataset #{uri} empty!" if @data.empty? - @data.each do |compound,features| - @compounds << compound + + d = Dataset.new + d.title = owl.title + d.source = owl.source + d.identifier = owl.identifier.sub(/^\[/,'').sub(/\]$/,'') + d.uri = d.identifier + d.data = owl.data + halt 404, "Dataset #{uri} empty!" if d.data.empty? + d.data.each do |compound,features| + d.compounds << compound features.each do |f,v| - @features << f + d.features << f end end - @compounds.uniq! - @features.uniq! - end + d.compounds.uniq! + d.features.uniq! + end + return d end + + # creates a new dataset, using only those compounsd specified in new_compounds + # returns uri of new dataset + def create_new_dataset( new_compounds, new_title, new_source ) + + dataset = OpenTox::Dataset.new + dataset.title = new_title + dataset.source = new_source + dataset.features = @features + dataset.compounds = new_compounds + new_compounds.each do |c| + dataset.data[c] = @data[c] + end + return dataset.save + end + + # returns classification value + def get_predicted_class(compound, feature) + v = get_value(compound, feature) + if v.is_a?(Hash) + if v.has_key?(:classification) + return v[:classification] + else + return "no classification key" + end + else + raise "invalid value type" + end + + end + + # returns prediction confidence if available + def get_prediction_confidence(compound, feature) + v = get_value(compound, feature) + if v.is_a?(Hash) + if v.has_key?(:confidence) + return v[:confidence].abs + else + # PENDING: return nil isntead of raising an exception + raise "no confidence key" + end + else + raise "invalid value type" + end + end + + # return compound-feature value + def get_value(compound, feature) + v = @data[compound] + raise "no values for compound "+compound.to_s if v==nil + if v.is_a?(Array) + # PENDING: why using an array here? + v.each do |e| + if e.is_a?(Hash) + if e.has_key?(feature) + return e[feature] + end + else + raise "invalid internal value type" + end + end + raise "feature value no found: "+feature.to_s + else + raise "invalid value type" + end + end def save @@ -120,21 +190,7 @@ module OpenTox resource = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) uri = resource.post data, :content_type => content_type dataset = Dataset.new -<<<<<<< HEAD - dataset.read uri.to_s - dataset - end - - def self.find(uri) - dataset = Dataset.new - LOGGER.debug "Getting data from #{uri}" - data = `curl "#{uri}" 2> /dev/null` - #LOGGER.debug data - #data = RestClient.get(uri, :accept => 'application/rdf+xml') # unclear why this does not work for complex uris, Dataset.find works from irb - dataset.rdf = data -======= dataset.read uri.chomp.to_s ->>>>>>> helma/development dataset end @@ -146,61 +202,6 @@ module OpenTox features end -<<<<<<< HEAD - def data - data = {} - @model.subjects(RDF['type'], OT['DataEntry']).each do |data_entry| - compound_node = @model.object(data_entry, OT['compound']) - compound_uri = @model.object(compound_node, DC['identifier']).to_s - @model.find(data_entry, OT['values'], nil) do |s,p,values| - feature_node = @model.object values, OT['feature'] - feature_uri = @model.object(feature_node, DC['identifier']).to_s.sub(/\^\^.*$/,'') # remove XML datatype - type = @model.object(values, RDF['type']) - if type == OT['FeatureValue'] - value = @model.object(values, OT['value']).to_s - case value.to_s - when TRUE_REGEXP # defined in environment.rb - value = true - when FALSE_REGEXP # defined in environment.rb - value = false - when /.*\^\^<.*XMLSchema#.*>/ - case value.to_s - when /XMLSchema#string/ - value = value.to_s[0..(value.to_s.index("^^")-1)] - when /XMLSchema#double/ - value = value.to_s[0..(value.to_s.index("^^")-1)].to_f - else - LOGGER.warn " ILLEGAL TYPE "+compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri - value = nil - end - else - LOGGER.warn compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri - value = nil - end - data[compound_uri] = {} unless data[compound_uri] - data[compound_uri][feature_uri] = [] unless data[compound_uri][feature_uri] - data[compound_uri][feature_uri] << value unless value.nil? - elsif type == OT['Tuple'] - entry = {} - data[compound_uri] = {} unless data[compound_uri] - data[compound_uri][feature_uri] = [] unless data[compound_uri][feature_uri] - @model.find(values, OT['complexValue'],nil) do |s,p,complex_value| - name_node = @model.object complex_value, OT['feature'] - name = @model.object(name_node, DC['title']).to_s - value = @model.object(complex_value, OT['value']).to_s - v = value.sub(/\^\^.*$/,'') # remove XML datatype - v = v.to_f if v.match(/^[\.|\d]+$/) # guess numeric datatype - entry[name] = v - end - data[compound_uri][feature_uri] << entry - end - end - end - data - end -======= ->>>>>>> helma/development - def compounds compounds = [] @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| diff --git a/lib/environment.rb b/lib/environment.rb index 4c501b4..2838c29 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -95,12 +95,14 @@ class MyLogger < Logger end -logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" +logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" LOGGER = MyLogger.new(logfile,'daily') # daily rotation + #LOGGER = MyLogger.new(STDOUT) +#LOGGER.datetime_format = "%Y-%m-%d %H:%M:%S " -LOGGER.level = Logger::DEBUG +#LOGGER.level = Logger::DEBUG if File.exist?(user_file) @@users = YAML.load_file(user_file) diff --git a/lib/model.rb b/lib/model.rb index 8877b84..e8eee09 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -3,11 +3,16 @@ module OpenTox class Generic - attr_accessor :predicted_variables, :independent_variables, :dependent_variables, :activity_dataset_uri, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features, :algorithm + attr_accessor :uri, :title, :source, :identifier, :predicted_variables, :independent_variables, :dependent_variables, :activity_dataset_uri, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features, :algorithm def self.find(uri) owl = OpenTox::Owl.from_uri(uri) - @title = owl.title + return self.new(owl) + end + + protected + def initialize(owl) + @title = owl.title @source = owl.source @identifier = owl.identifier.sub(/^\[/,'').sub(/\]$/,'') @uri = @identifier @@ -16,8 +21,46 @@ module OpenTox @independent_variables = owl.independentVariables @predicted_variables = owl.predictedVariables end - - end + end + + + class PredictionModel < Generic + + def self.build( algorithm_uri, algorithm_params ) + + LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.to_s + uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s + uri = OpenTox::Task.find(uri).wait_for_resource.to_s if Utils.task_uri?(uri) + return PredictionModel.find(uri) + end + + def predict_dataset( dataset_uri ) + + LOGGER.debug "Predict dataset: "+dataset_uri.to_s+" with model "+@uri.to_s + + #HACK using curl + uri = "" + IO.popen("curl -X POST -d dataset_uri='"+dataset_uri+"' "+@uri.to_s+" 2> /dev/null") do |f| + while line = f.gets + uri += line + end + end + uri = OpenTox::Task.find(uri).wait_for_resource.to_s if Utils.task_uri?(uri) + return uri if Utils.dataset_uri?(uri) + raise "not sure about prediction result: "+uri.to_s + end + + def classification? + #HACK replace with request to ontology server + case @title + when /lazar classification/ + return true + else + raise "unknown model: "+@title.to_s + end + end + end + class Lazar < Generic diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 849043c..c795ca8 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['owl', 'compound','dataset','algorithm','model','task','validation','utils','authorization'].each do |lib| +['owl', 'compound','dataset','algorithm','model','task','validation','utils','authorization','features'].each do |lib| require lib end diff --git a/lib/owl.rb b/lib/owl.rb index 1d47d2c..2cd89c4 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -15,15 +15,18 @@ module OpenTox owl.model.add owl.uri, RDF['type'], OT[owl.ot_class] owl.model.add owl.uri, DC['identifier'], owl.uri owl - end - + end + def self.from_uri(uri) owl = OpenTox::Owl.new parser = Redland::Parser.new begin - parser.parse_into_model(owl.model,uri) - rescue => e - raise "Error parsing #{uri}: #{e.message + e.backtrace}" + data = RestClient.get(uri,:accept => "application/rdf+xml").to_s + parser.parse_string_into_model(owl.model, data, uri) + #parser.parse_into_model(owl.model,uri) + rescue => e + raise "Error parsing #{uri}: "+e.message + #raise "Error parsing #{uri}: #{e.message.to_s + e.backtrace.to_s}" end owl.uri = Redland::Uri.new(uri.chomp) owl diff --git a/lib/spork.rb b/lib/spork.rb index e8cf37f..c77b5b5 100644 --- a/lib/spork.rb +++ b/lib/spork.rb @@ -53,7 +53,7 @@ module Spork yield rescue => ex - raise ex + #raise ex logger.error "spork> Exception in child[#{Process.pid}] - #{ex.class}: #{ex.message}" if logger ensure logger.info "spork> child[#{Process.pid}] took #{Time.now - start} sec" if logger diff --git a/lib/task.rb b/lib/task.rb index 5591a34..75cc2d2 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -90,7 +90,37 @@ module OpenTox until self.completed? or self.failed? sleep dur end - end + end + + def self.as_task + task = OpenTox::Task.create + LOGGER.debug "Starting task" + pid = Spork.spork(:logger => LOGGER) do + task.started + LOGGER.debug "Task #{task.uri} started #{Time.now}" + begin + result = yield + task.completed(result) + rescue => ex + raise ex + LOGGER.error ex.message + task.failed + end + raise "Invalid task state" unless task.completed? || task.failed? + end + LOGGER.debug "task PID: " + pid.to_s + task.pid = pid + task.uri + end + + def wait_for_resource + wait_for_completion + if failed? + LOGGER.error "task failed: "+uri.to_s + return nil + end + return resource + end end diff --git a/lib/utils.rb b/lib/utils.rb index cccb5ea..bbb750d 100644 --- a/lib/utils.rb +++ b/lib/utils.rb @@ -4,6 +4,23 @@ module OpenTox def self.gauss(sim, sigma = 0.3) x = 1.0 - sim Math.exp(-(x*x)/(2*sigma*sigma)) - end + end + + def self.task_uri?(uri) + is_uri?(uri) && uri.to_s =~ /task/ + end + + def self.dataset_uri?(uri) + is_uri?(uri) && uri.to_s =~ /dataset/ + end + + def self.is_uri?(uri) + begin + URI::parse(uri) + rescue URI::InvalidURIError + false + end + end + end end -- cgit v1.2.3 From 7b8d85cb91c0a0a6ec530fc527be6ec67f70df99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Fri, 26 Mar 2010 11:23:15 +0100 Subject: changes related to feature-encode-problem --- lib/environment.rb | 10 +++++++++- lib/model.rb | 4 +++- lib/utils.rb | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index 2838c29..e784777 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -40,6 +40,14 @@ if @@config[:database] end end +class Sinatra::Base + # overwriting halt to log halts (!= 202) + def halt(status,msg) + LOGGER.error "halt "+status.to_s+" "+msg.to_s if (status != 202) + throw :halt, [status, msg] + end +end + # logging class MyLogger < Logger @@ -57,7 +65,7 @@ class MyLogger < Logger n = 2 line = lines[n] - while (line =~ /spork.rb/ or line =~ /as_task/) + while (line =~ /spork.rb/ or line =~ /as_task/ or line =~ /environment.rb/) #puts "skip line "+line.to_s n += 1 line = lines[n] diff --git a/lib/model.rb b/lib/model.rb index e8eee09..9f03c4b 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -20,6 +20,8 @@ module OpenTox @dependent_variables = owl.dependentVariables @independent_variables = owl.independentVariables @predicted_variables = owl.predictedVariables + + raise "invalid model: "+self.to_yaml unless @dependent_variables.to_s.size>0 && @independent_variables.to_s.size>0 && @predicted_variables.to_s.size>0 end end @@ -28,7 +30,7 @@ module OpenTox def self.build( algorithm_uri, algorithm_params ) - LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.to_s + LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s uri = OpenTox::Task.find(uri).wait_for_resource.to_s if Utils.task_uri?(uri) return PredictionModel.find(uri) diff --git a/lib/utils.rb b/lib/utils.rb index bbb750d..ed35563 100644 --- a/lib/utils.rb +++ b/lib/utils.rb @@ -22,5 +22,56 @@ module OpenTox end end - end +end + + + module RestClientWrapper + + def self.get(uri, headers=nil) + execute( "get", uri, nil, headers ) + end + + def self.post(uri, payload=nil, headers=nil) + execute( "post", uri, payload, headers ) + end + + def self.delete(uri, headers=nil) + execute( "delete", uri, nil, headers ) + end + + private + def self.execute( rest_call, uri, payload, headers ) + + do_halt 400,"uri is null",uri,payload,headers unless uri + begin + if payload + RestClient.send(rest_call, uri, payload, headers) + else + RestClient.send(rest_call, uri, headers) + end + rescue RestClient::RequestFailed, RestClient::RequestTimeout => ex + do_halt 502,ex.message,uri,payload,headers + rescue SocketError, RestClient::ResourceNotFound => ex + do_halt 400,"X"+ex.message,uri,payload,headers + rescue Exception => ex + do_halt 500,"add error '"+ex.class.to_s+"'' to rescue in OpenTox::RestClientWrapper::execute(), msg: '"+ex.message.to_s+"'",uri,payload,headers + end + end + + def self.do_halt(status, msg, uri, payload, headers) + + message = msg+"" + message += ", uri: '"+uri.to_s+"'" if uri + message += ", payload: '"+payload.inspect+"'" if payload + message += ", headers: '"+headers.inspect+"'" if headers + + if defined?(halt) + halt(status,message) + elsif defined?($sinatra) + $sinatra.halt(status,message) + else + raise "halt '"+status.to_s+"' '"+message+"'" + end + end + end end -- cgit v1.2.3 From 79e5b48a59e9f2178f94f07788e93932bdad816f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Fri, 26 Mar 2010 17:08:15 +0100 Subject: adding ambit/ntua hacks --- lib/dataset.rb | 11 ++++++++++- lib/model.rb | 35 +++++++++++++++++++++++++++-------- lib/owl.rb | 58 ++++++++++++++++++++++++++++++++++++++++++---------------- 3 files changed, 79 insertions(+), 25 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index c472d84..0baec2f 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -29,11 +29,20 @@ module OpenTox d.data.each do |compound,features| d.compounds << compound features.each do |f,v| - d.features << f + d.features << f.keys[0] end end d.compounds.uniq! d.features.uniq! + + #PENDING: remove debug checks + d.data.each do |c,f| + f.each do |ff,v| + raise "illegal data: feature is no string "+ff.inspect unless ff.is_a?(Hash) + end + end + raise "illedal dataset data\n"+d.data.inspect+"\n" unless d.data.is_a?(Hash) and d.data.values.is_a?(Array) + raise "illegal dataset features:\n"+d.features.inspect+"\n" unless d.features.size>0 and d.features[0].is_a?(String) end return d end diff --git a/lib/model.rb b/lib/model.rb index 9f03c4b..d8d751b 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -15,13 +15,13 @@ module OpenTox @title = owl.title @source = owl.source @identifier = owl.identifier.sub(/^\[/,'').sub(/\]$/,'') - @uri = @identifier + @uri = owl.uri.to_s #@identifier @algorithm = owl.algorithm @dependent_variables = owl.dependentVariables @independent_variables = owl.independentVariables @predicted_variables = owl.predictedVariables - raise "invalid model: "+self.to_yaml unless @dependent_variables.to_s.size>0 && @independent_variables.to_s.size>0 && @predicted_variables.to_s.size>0 + raise "invalid model:\n"+self.to_yaml+"\n" unless Utils.is_uri?(@uri) && @dependent_variables.to_s.size>0 && @independent_variables.to_s.size>0 && @predicted_variables.to_s.size>0 end end @@ -47,18 +47,37 @@ module OpenTox uri += line end end - uri = OpenTox::Task.find(uri).wait_for_resource.to_s if Utils.task_uri?(uri) - return uri if Utils.dataset_uri?(uri) - raise "not sure about prediction result: "+uri.to_s + + if uri.to_s =~ /ambit.*task/ + #HACK handle redirect + LOGGER.debug "AMBIT TASK "+uri.to_s + redirect = "" + while (redirect.size == 0) + IO.popen("bin/redirect.sh "+uri.to_s) do |f| + while line = f.gets + redirect += line.chomp + end + end + sleep 0.3 + end + LOGGER.debug "REDIRECT to: "+redirect.to_s + raise "invalid redirect result" unless redirect =~ /ambit.*dataset/ + return uri + else + uri = OpenTox::Task.find(uri).wait_for_resource.to_s if Utils.task_uri?(uri) + return uri if Utils.dataset_uri?(uri) + raise "not sure about prediction result: "+uri.to_s + end end def classification? #HACK replace with request to ontology server - case @title - when /lazar classification/ + if @title =~ /lazar classification/ return true + elsif @uri =~/ntua/ and @title =~ /mlr/ + return false else - raise "unknown model: "+@title.to_s + raise "unknown model, uri:"+@uri.to_s+" title:"+@title.to_s end end end diff --git a/lib/owl.rb b/lib/owl.rb index 2cd89c4..11da4d0 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -15,29 +15,34 @@ module OpenTox owl.model.add owl.uri, RDF['type'], OT[owl.ot_class] owl.model.add owl.uri, DC['identifier'], owl.uri owl - end + end - def self.from_uri(uri) - owl = OpenTox::Owl.new - parser = Redland::Parser.new - begin - data = RestClient.get(uri,:accept => "application/rdf+xml").to_s - parser.parse_string_into_model(owl.model, data, uri) - #parser.parse_into_model(owl.model,uri) - rescue => e - raise "Error parsing #{uri}: "+e.message - #raise "Error parsing #{uri}: #{e.message.to_s + e.backtrace.to_s}" - end - owl.uri = Redland::Uri.new(uri.chomp) - owl + def self.from_data(data,uri) + owl = OpenTox::Owl.new + parser = Redland::Parser.new + begin + parser.parse_string_into_model(owl.model, data, uri) + rescue => e + raise "Error parsing #{uri}: "+e.message + end + owl.uri = Redland::Uri.new(uri.chomp) + owl + end + + def self.from_uri(uri) + return from_data(RestClient.get(uri,:accept => "application/rdf+xml").to_s, uri) end def rdf @model.to_string end + #def predictedVariables + # + #end + def method_missing(name, *args) - methods = ['title', 'source', 'identifier', 'algorithm', 'independentVariables', 'dependentVariables', 'predictedVariables', 'date','trainingDataset' ] + methods = ['title', 'source', 'identifier', 'algorithm', 'independentVariables', 'dependentVariables', 'predictedVariables', 'date','trainingDataset', 'hasStatus', "percentageCompleted" ] if methods.include? name.to_s.sub(/=/,'') if /=/ =~ name.to_s # setter name = name.to_s.sub(/=/,'') @@ -48,6 +53,16 @@ module OpenTox end @model.add @uri, DC[name], args.first else # getter + #HACK for reading Panteli's models + if @uri.to_s =~ /ntua.*model/ and !["title", "source", "identifier"].include?(name.to_s) + me = @model.subject(RDF['type'],OT['Model']) + #puts "going for "+name.to_s + return @model.object(me, OT[name.to_s]).uri.to_s + elsif @uri.to_s =~ /ambit.*task/ and ["hasStatus", "percentageCompleted"].include?(name.to_s) + me = @model.subject(RDF['type'],OT['Task']) + return @model.object(me, OT[name.to_s]).literal.value.to_s + end + #raise "stop there "+name.to_s @model.object(@uri, DC[name.to_s]).to_s end else @@ -145,8 +160,19 @@ module OpenTox value = true when FALSE_REGEXP # defined in environment.rb value = false + when /.*\^\^<.*XMLSchema#.*>/ + #HACK for reading ambit datasets + case value.to_s + when /XMLSchema#string/ + value = value.to_s[0..(value.to_s.index("^^")-1)] + when /XMLSchema#double/ + value = value.to_s[0..(value.to_s.index("^^")-1)].to_f + else + LOGGER.warn " ILLEGAL TYPE "+compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri + value = nil + end else - LOGGER.warn compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri + LOGGER.warn compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri value = nil end data[compound_uri] = [] unless data[compound_uri] -- cgit v1.2.3 From 97966482d9e021ac5792b0c563f0438df113921f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Fri, 26 Mar 2010 17:41:30 +0100 Subject: add features.rb --- lib/features.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 lib/features.rb diff --git a/lib/features.rb b/lib/features.rb new file mode 100644 index 0000000..c56f3e4 --- /dev/null +++ b/lib/features.rb @@ -0,0 +1,15 @@ +module OpenTox + + module Feature + + def self.domain( feature_uri ) + #TODO + if feature_uri =~ /ambit/ + return nil + else + return ["true", "false"] + end + end + + end +end \ No newline at end of file -- cgit v1.2.3 From a2d29a1063fa07695714d9b5034f29dd82c1e79f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Mon, 29 Mar 2010 08:35:40 +0200 Subject: add ortona to dataset-yaml-list --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 0baec2f..70edf1c 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -14,7 +14,7 @@ module OpenTox def self.find(uri) - if uri.match(/webservices.in-silico.ch|localhost|ot.dataset.de/) # try to get YAML first + if uri.match(/webservices.in-silico.ch|localhost|ot.dataset.de|opentox.informatik.uni-freiburg.de/) # try to get YAML first d = YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s else # get default rdf+xml owl = OpenTox::Owl.from_uri(uri) -- cgit v1.2.3 From cd299b6508c0a83463c1f8f00ccaff45b6b8a476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Mon, 29 Mar 2010 08:42:40 +0200 Subject: dataset fix --- lib/dataset.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/dataset.rb b/lib/dataset.rb index 70edf1c..abc2d6c 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -17,6 +17,7 @@ module OpenTox if uri.match(/webservices.in-silico.ch|localhost|ot.dataset.de|opentox.informatik.uni-freiburg.de/) # try to get YAML first d = YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s else # get default rdf+xml + LOGGER.error "no yaml uri match: "+uri.to_s owl = OpenTox::Owl.from_uri(uri) d = Dataset.new -- cgit v1.2.3 From f93e03baaa9833cb3f329c9b342825b7527e1b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Mon, 29 Mar 2010 11:44:47 +0200 Subject: added tum models --- lib/dataset.rb | 1 - lib/model.rb | 55 +++++++++++++++++++++++++++++++++++++------------------ lib/owl.rb | 2 +- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index abc2d6c..70edf1c 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -17,7 +17,6 @@ module OpenTox if uri.match(/webservices.in-silico.ch|localhost|ot.dataset.de|opentox.informatik.uni-freiburg.de/) # try to get YAML first d = YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s else # get default rdf+xml - LOGGER.error "no yaml uri match: "+uri.to_s owl = OpenTox::Owl.from_uri(uri) d = Dataset.new diff --git a/lib/model.rb b/lib/model.rb index d8d751b..1f5f27d 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -21,7 +21,8 @@ module OpenTox @independent_variables = owl.independentVariables @predicted_variables = owl.predictedVariables - raise "invalid model:\n"+self.to_yaml+"\n" unless Utils.is_uri?(@uri) && @dependent_variables.to_s.size>0 && @independent_variables.to_s.size>0 && @predicted_variables.to_s.size>0 + raise "invalid model:\n"+self.to_yaml+"\n" unless Utils.is_uri?(@uri) && @dependent_variables.to_s.size>0 && + @independent_variables.to_s.size>0 && @predicted_variables.to_s.size>0 if ENV['RACK_ENV'] =~ /test|debug/ end end @@ -32,9 +33,36 @@ module OpenTox LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s - uri = OpenTox::Task.find(uri).wait_for_resource.to_s if Utils.task_uri?(uri) + + if uri.to_s =~ /ambit.*task|tu-muenchen.*task/ + uri = PredictionModel.redirect_task(uri) + elsif Utils.task_uri?(uri) + uri = OpenTox::Task.find(uri).wait_for_resource.to_s + end + raise "invalid build model result: "+uri.to_s unless uri =~ /model/ return PredictionModel.find(uri) end + + def self.redirect_task( uri ) + raise "no redirect task uri: "+uri.to_s unless uri.to_s =~ /ambit.*task|tu-muenchen.*task/ + + while (uri.to_s =~ /ambit.*task|tu-muenchen.*task/) + #HACK handle redirect + LOGGER.debug "REDIRECT TASK: "+uri.to_s + redirect = "" + while (redirect.size == 0) + IO.popen("bin/redirect.sh "+uri.to_s) do |f| + while line = f.gets + redirect += line.chomp + end + end + sleep 0.3 + end + uri = redirect + LOGGER.debug "REDIRECT TO: "+uri.to_s + end + return uri + end def predict_dataset( dataset_uri ) @@ -47,21 +75,10 @@ module OpenTox uri += line end end - - if uri.to_s =~ /ambit.*task/ - #HACK handle redirect - LOGGER.debug "AMBIT TASK "+uri.to_s - redirect = "" - while (redirect.size == 0) - IO.popen("bin/redirect.sh "+uri.to_s) do |f| - while line = f.gets - redirect += line.chomp - end - end - sleep 0.3 - end - LOGGER.debug "REDIRECT to: "+redirect.to_s - raise "invalid redirect result" unless redirect =~ /ambit.*dataset/ + + if uri.to_s =~ /ambit.*task|tu-muenchen.*task/ + uri = PredictionModel.redirect_task(uri) + raise "invalid redirect result: " unless uri =~ /ambit.*dataset/ return uri else uri = OpenTox::Task.find(uri).wait_for_resource.to_s if Utils.task_uri?(uri) @@ -76,8 +93,10 @@ module OpenTox return true elsif @uri =~/ntua/ and @title =~ /mlr/ return false + elsif @uri =~/tu-muenchen/ and @title =~ /regression/ + return false else - raise "unknown model, uri:"+@uri.to_s+" title:"+@title.to_s + raise "unknown model, uri:'"+@uri.to_s+"' title:'"+@title.to_s+"'" end end end diff --git a/lib/owl.rb b/lib/owl.rb index 11da4d0..bf665fc 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -54,7 +54,7 @@ module OpenTox @model.add @uri, DC[name], args.first else # getter #HACK for reading Panteli's models - if @uri.to_s =~ /ntua.*model/ and !["title", "source", "identifier"].include?(name.to_s) + if @uri.to_s =~ /ntua.*model|tu-muenchen.*model/ and !["title", "source", "identifier"].include?(name.to_s) me = @model.subject(RDF['type'],OT['Model']) #puts "going for "+name.to_s return @model.object(me, OT[name.to_s]).uri.to_s -- cgit v1.2.3 From 5465f726b972c0c5430cce958a220bc0736f1bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Mon, 29 Mar 2010 17:14:17 +0200 Subject: fix read owl data --- lib/environment.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index e784777..dc3bad9 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -133,5 +133,5 @@ DC = Redland::Namespace.new 'http://purl.org/dc/elements/1.1/' OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#' # Regular expressions for parsing classification data -TRUE_REGEXP = /^(true|active|1)/ -FALSE_REGEXP = /^(false|inactive|0)/ +TRUE_REGEXP = /^(true|active|$1^)/ +FALSE_REGEXP = /^(false|inactive|$0^)/ -- cgit v1.2.3 From 483b89ab23449372582e8754b3b9b481d338654f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 30 Mar 2010 16:44:22 +0200 Subject: munich services --- lib/dataset.rb | 2 +- lib/model.rb | 3 ++- lib/owl.rb | 10 ++++++++-- lib/utils.rb | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 70edf1c..ee92a56 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -15,7 +15,7 @@ module OpenTox def self.find(uri) if uri.match(/webservices.in-silico.ch|localhost|ot.dataset.de|opentox.informatik.uni-freiburg.de/) # try to get YAML first - d = YAML.load RestClient.get(uri, :accept => 'application/x-yaml').to_s + d = YAML.load RestClientWrapper.get(uri, :accept => 'application/x-yaml').to_s else # get default rdf+xml owl = OpenTox::Owl.from_uri(uri) diff --git a/lib/model.rb b/lib/model.rb index 1f5f27d..5ca3914 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -56,6 +56,7 @@ module OpenTox redirect += line.chomp end end + raise "TASK ERROR" if $?!=0 sleep 0.3 end uri = redirect @@ -93,7 +94,7 @@ module OpenTox return true elsif @uri =~/ntua/ and @title =~ /mlr/ return false - elsif @uri =~/tu-muenchen/ and @title =~ /regression/ + elsif @uri =~/tu-muenchen/ and @title =~ /regression|M5P|GaussP/ return false else raise "unknown model, uri:'"+@uri.to_s+"' title:'"+@title.to_s+"'" diff --git a/lib/owl.rb b/lib/owl.rb index bf665fc..f09ee01 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -160,7 +160,7 @@ module OpenTox value = true when FALSE_REGEXP # defined in environment.rb value = false - when /.*\^\^<.*XMLSchema#.*>/ + when /.*\^\^<.*XMLSchema#.*>/ #HACK for reading ambit datasets case value.to_s when /XMLSchema#string/ @@ -174,7 +174,13 @@ module OpenTox else LOGGER.warn compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri value = nil - end + end + LOGGER.debug "converting owl to yaml, #compounds: "+(data.keys.size+1).to_s if (data.keys.size+1)%10==0 && !data.has_key?(compound_uri) + #return data if (data.keys.size+1)%2==0 && !data.has_key?(compound_uri) + #puts "c "+compound_uri.to_s + #puts "f "+feature_uri.to_s + #puts "v "+value.to_s + #puts "" data[compound_uri] = [] unless data[compound_uri] data[compound_uri] << {feature_uri => value} unless value.nil? elsif type == OT['Tuple'] diff --git a/lib/utils.rb b/lib/utils.rb index ed35563..a31e405 100644 --- a/lib/utils.rb +++ b/lib/utils.rb @@ -52,7 +52,7 @@ end rescue RestClient::RequestFailed, RestClient::RequestTimeout => ex do_halt 502,ex.message,uri,payload,headers rescue SocketError, RestClient::ResourceNotFound => ex - do_halt 400,"X"+ex.message,uri,payload,headers + do_halt 400,ex.message,uri,payload,headers rescue Exception => ex do_halt 500,"add error '"+ex.class.to_s+"'' to rescue in OpenTox::RestClientWrapper::execute(), msg: '"+ex.message.to_s+"'",uri,payload,headers end -- cgit v1.2.3 From ef9d136c275f86147fea116c9351190489ff41c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Wed, 14 Apr 2010 11:30:58 +0200 Subject: performance tweaking for owl dataset loading --- lib/dataset.rb | 77 ++++++++++++++------ lib/owl.rb | 225 +++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 232 insertions(+), 70 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index ee92a56..d6e0b39 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -24,40 +24,46 @@ module OpenTox d.source = owl.source d.identifier = owl.identifier.sub(/^\[/,'').sub(/\]$/,'') d.uri = d.identifier - d.data = owl.data - halt 404, "Dataset #{uri} empty!" if d.data.empty? - d.data.each do |compound,features| - d.compounds << compound - features.each do |f,v| - d.features << f.keys[0] - end - end - d.compounds.uniq! - d.features.uniq! - #PENDING: remove debug checks - d.data.each do |c,f| - f.each do |ff,v| - raise "illegal data: feature is no string "+ff.inspect unless ff.is_a?(Hash) - end - end - raise "illedal dataset data\n"+d.data.inspect+"\n" unless d.data.is_a?(Hash) and d.data.values.is_a?(Array) - raise "illegal dataset features:\n"+d.features.inspect+"\n" unless d.features.size>0 and d.features[0].is_a?(String) + # when loading a dataset from owl, only compound- and feature-uris are loaded + owl.load_data_compounds_and_features(d.compounds, d.features) + # all features are marked as dirty, loaded dynamically later + d.init_dirty_features(owl) + + d.compounds.uniq! + d.features.uniq! end return d end # creates a new dataset, using only those compounsd specified in new_compounds # returns uri of new dataset - def create_new_dataset( new_compounds, new_title, new_source ) + def create_new_dataset( new_compounds, new_features, new_title, new_source ) + + # load require features + if ((defined? @dirty_features) && (@dirty_features - new_features).size > 0) + (@dirty_features - new_features).each{|f| load_feature_values(f)} + end dataset = OpenTox::Dataset.new dataset.title = new_title dataset.source = new_source - dataset.features = @features + dataset.features = new_features dataset.compounds = new_compounds + + # Ccopy dataset data for compounds and features + # PENDING: why storing feature values in an array? new_compounds.each do |c| - dataset.data[c] = @data[c] + data_c = [] + @data[c].each do |d| + m = {} + new_features.each do |f| + m[f] = d[f] + end + data_c << m + end + + dataset.data[c] = data_c end return dataset.save end @@ -94,6 +100,10 @@ module OpenTox # return compound-feature value def get_value(compound, feature) + if (defined? @dirty_features) && @dirty_features.include?(feature) + load_feature_values(feature) + end + v = @data[compound] raise "no values for compound "+compound.to_s if v==nil if v.is_a?(Array) @@ -113,8 +123,25 @@ module OpenTox end end + # loads specified feature and removes dirty-flag, loads all features if feature is nil + def load_feature_values(feature=nil) + if feature + raise "feature already loaded" unless @dirty_features.include?(feature) + @owl.load_data_compounds_and_features(@compounds, @data, feature) + @dirty_features.delete(feature) + else + @data = {} + @owl.load_dataset_feature_values(@compounds, @data) + @dirty_features.clear + end + end def save + # loads all features before loading + if ((defined? @dirty_features) && @dirty_features.size > 0) + load_feature_values() + end + @features.uniq! @compounds.uniq! RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s @@ -232,6 +259,12 @@ module OpenTox end =end - end + + def init_dirty_features(owl) + @dirty_features = @features + @owl = owl + end + end + end diff --git a/lib/owl.rb b/lib/owl.rb index f09ee01..374c1e6 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -1,3 +1,14 @@ +class Redland::Literal + + # the literal node of the ruby swig api provdides the 'value' of a literal but not the 'datatype' + # found solution in mailing list + def datatype() + uri = Redland.librdf_node_get_literal_value_datatype_uri(self.node) + return Redland.librdf_uri_to_string(uri) if uri + end + +end + module OpenTox class Owl @@ -18,6 +29,7 @@ module OpenTox end def self.from_data(data,uri) + owl = OpenTox::Owl.new parser = Redland::Parser.new begin @@ -37,10 +49,6 @@ module OpenTox @model.to_string end - #def predictedVariables - # - #end - def method_missing(name, *args) methods = ['title', 'source', 'identifier', 'algorithm', 'independentVariables', 'dependentVariables', 'predictedVariables', 'date','trainingDataset', 'hasStatus', "percentageCompleted" ] if methods.include? name.to_s.sub(/=/,'') @@ -142,25 +150,143 @@ module OpenTox @model.add feature, DC['source'], feature_uri end feature - end + end + + # feature values are not loaded for performance reasons + # loading compounds and features into arrays that are given as params + def load_dataset( compounds, features ) + ot_compound = OT['compound'] + dc_identifier = DC['identifier'] + @model.subjects(RDF['type'], OT['DataEntry']).each do |data_entry| + compound_node = @model.object(data_entry, ot_compound) + compound_uri = @model.object(compound_node, dc_identifier).to_s + compounds << compound_uri + end + @model.subjects(RDF['type'], OT['Feature']).each do |feature| + feature_literal = @model.object(feature, dc_identifier) + raise "feature is no literal" unless feature_literal.is_a?(Redland::Literal) + # PENDING: to be able to recreate literal nodes for features, the datatype is stored + @@feature_datatype = feature_literal.datatype + features << feature_literal.value + end + LOGGER.debug "loaded "+compounds.size.to_s+" compounds and "+features.size.to_s+" features" + end + + # loading feature values for the specified feature + # if feature is nil, all feature values are loaded + # + # general remark on the rdf loading (found out with some testing): + # the search methods (subjects/find) are fast, the time consuming parts is creating resources, + # which cannot be avoided in general (implemented some performance tweaks with uri storing when loading all features) + def load_dataset_feature_values( compounds, data, feature_uri=nil ) + + LOGGER.debug("load feature values"+ ( (feature_uri!=nil)?(" for feature: "+feature_uri):"") ) + + # values are stored in the data-hash, hash has a key for each compound + compounds.each{|c| data[c] = [] unless data[c]} + + ot_values = OT['values'] + ot_feature = OT['feature'] + ot_compound = OT['compound'] + dc_identifier = DC['identifier'] + ot_value = OT['value'] + rdf_type = RDF['type'] + ot_feature_value = OT['FeatureValue'] + + load_all_features = feature_uri==nil + feature_node = nil + + # create feature node for feature uri if specified + unless load_all_features + feature_literal = Redland::Literal.new(feature_uri,nil,Redland::Uri.new(@@feature_datatype)) + feature_node = @model.subject(dc_identifier, feature_literal) + # remark: solution without creating the literal node: + #@model.subjects(RDF['type'], OT['Feature']).each do |feature| + # f_uri = @model.object(feature, dc_identifier).value + # if feature_uri==f_uri + # feature_node = feature + # break + # end + #end + raise "feature node not found" unless feature_node + end + + count = 0 + + # preformance tweak: store uirs to save some resource init time + compound_uri_store = {} + feature_uri_store = {} + + # search for all feature_value_node with property 'ot_feature' + # feature_node is either nil, i.e. a wildcard or specified + @model.find(nil, ot_feature, feature_node) do |feature_value_node,p,o| + + # get compound_uri by "backtracking" to values node (property is 'ot_values'), then get compound_node via 'ot_compound' + value_nodes = @model.subjects(ot_values,feature_value_node) + raise "more than one value node "+value_nodes.size.to_s unless value_nodes.size==1 + value_node = value_nodes[0] + compound_node = @model.object(value_node, ot_compound) + compound_uri = compound_uri_store[compound_node.to_s] + unless compound_uri + compound_uri = @model.object(compound_node, dc_identifier).to_s + compound_uri_store[compound_node.to_s] = compound_uri + end + + if load_all_features + # if load all features, feautre_uri is not specified, derieve from feature_node + feature_uri = feature_uri_store[o.to_s] + unless feature_uri + feature_literal = @model.object(o, dc_identifier) + raise "feature is no literal" unless feature_literal.is_a?(Redland::Literal) + feature_uri = feature_literal.value + feature_uri_store[o.to_s] = feature_uri + end + end + + value_node_type = @model.object(feature_value_node, rdf_type) + if (value_node_type == ot_feature_value) + value_literal = @model.object( feature_value_node, ot_value) + raise "feature value no literal" unless value_literal.is_a?(Redland::Literal) + + case value_literal.datatype + when /XMLSchema#double/ + data[compound_uri] << {feature_uri => value_literal.value.to_f } + when /XMLSchema#string/ + data[compound_uri] << {feature_uri => value_literal.value } + else + raise "feature value datatype undefined: "+value_literal.datatype + end + else + raise "feature value type not yet implemented "+value_node_type.to_s + end + count += 1 + LOGGER.debug "loaded "+count.to_s+" feature values" if (count%500 == 0) + break if count == 1000 + end + + LOGGER.debug "loaded "+count.to_s+" feature values" + end - def data - data = {} - @model.subjects(RDF['type'], OT['DataEntry']).each do |data_entry| - compound_node = @model.object(data_entry, OT['compound']) - compound_uri = @model.object(compound_node, DC['identifier']).to_s - @model.find(data_entry, OT['values'], nil) do |s,p,values| - feature_node = @model.object values, OT['feature'] - feature_uri = @model.object(feature_node, DC['identifier']).to_s.sub(/\^\^.*$/,'') # remove XML datatype - type = @model.object(values, RDF['type']) - if type == OT['FeatureValue'] - value = @model.object(values, OT['value']).to_s - case value.to_s - when TRUE_REGEXP # defined in environment.rb - value = true - when FALSE_REGEXP # defined in environment.rb - value = false - when /.*\^\^<.*XMLSchema#.*>/ +=begin + def data + LOGGER.debug("getting data from model") + + data = {} + @model.subjects(RDF['type'], OT['DataEntry']).each do |data_entry| + compound_node = @model.object(data_entry, OT['compound']) + compound_uri = @model.object(compound_node, DC['identifier']).to_s + @model.find(data_entry, OT['values'], nil) do |s,p,values| + feature_node = @model.object values, OT['feature'] + feature_uri = @model.object(feature_node, DC['identifier']).to_s.sub(/\^\^.*$/,'') # remove XML datatype + type = @model.object(values, RDF['type']) + if type == OT['FeatureValue'] + value = @model.object(values, OT['value']).to_s + case value.to_s + when TRUE_REGEXP # defined in environment.rb + value = true + when FALSE_REGEXP # defined in environment.rb + value = false + when /.*\^\^<.*XMLSchema#.*>/ #HACK for reading ambit datasets case value.to_s when /XMLSchema#string/ @@ -171,36 +297,39 @@ module OpenTox LOGGER.warn " ILLEGAL TYPE "+compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri value = nil end - else - LOGGER.warn compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri - value = nil - end + else + LOGGER.warn compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri + value = nil + end LOGGER.debug "converting owl to yaml, #compounds: "+(data.keys.size+1).to_s if (data.keys.size+1)%10==0 && !data.has_key?(compound_uri) - #return data if (data.keys.size+1)%2==0 && !data.has_key?(compound_uri) + + return data if (data.keys.size)>9 && !data.has_key?(compound_uri) + #puts "c "+compound_uri.to_s #puts "f "+feature_uri.to_s #puts "v "+value.to_s #puts "" - data[compound_uri] = [] unless data[compound_uri] - data[compound_uri] << {feature_uri => value} unless value.nil? - elsif type == OT['Tuple'] - entry = {} - data[compound_uri] = [] unless data[compound_uri] - #data[compound_uri][feature_uri] = [] unless data[compound_uri][feature_uri] - @model.find(values, OT['complexValue'],nil) do |s,p,complex_value| - name_node = @model.object complex_value, OT['feature'] - name = @model.object(name_node, DC['title']).to_s - value = @model.object(complex_value, OT['value']).to_s - v = value.sub(/\^\^.*$/,'') # remove XML datatype - v = v.to_f if v.match(/^[\.|\d]+$/) # guess numeric datatype - entry[name] = v - end - data[compound_uri] << {feature_uri => entry} unless entry.empty? - end - end - end - data - end + data[compound_uri] = [] unless data[compound_uri] + data[compound_uri] << {feature_uri => value} unless value.nil? + elsif type == OT['Tuple'] + entry = {} + data[compound_uri] = [] unless data[compound_uri] + #data[compound_uri][feature_uri] = [] unless data[compound_uri][feature_uri] + @model.find(values, OT['complexValue'],nil) do |s,p,complex_value| + name_node = @model.object complex_value, OT['feature'] + name = @model.object(name_node, DC['title']).to_s + value = @model.object(complex_value, OT['value']).to_s + v = value.sub(/\^\^.*$/,'') # remove XML datatype + v = v.to_f if v.match(/^[\.|\d]+$/) # guess numeric datatype + entry[name] = v + end + data[compound_uri] << {feature_uri => entry} unless entry.empty? + end + end + end + data + end +=end - end + end end -- cgit v1.2.3 From 3c52741e6c304ee48881ea67aa79039de8a9849a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Wed, 14 Apr 2010 11:40:48 +0200 Subject: remove debug code --- lib/owl.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/owl.rb b/lib/owl.rb index 374c1e6..c410f76 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -261,7 +261,6 @@ module OpenTox end count += 1 LOGGER.debug "loaded "+count.to_s+" feature values" if (count%500 == 0) - break if count == 1000 end LOGGER.debug "loaded "+count.to_s+" feature values" -- cgit v1.2.3 From 7386c1b50448ad338b84628e1d585cefb05006f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Mon, 19 Apr 2010 13:55:15 +0200 Subject: lib/owl.rb --- lib/dataset.rb | 26 ++++++++++++++++++----- lib/model.rb | 67 +++++++++++++++------------------------------------------- 2 files changed, 38 insertions(+), 55 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index d6e0b39..4c3f103 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -26,13 +26,14 @@ module OpenTox d.uri = d.identifier # when loading a dataset from owl, only compound- and feature-uris are loaded - owl.load_data_compounds_and_features(d.compounds, d.features) + owl.load_dataset(d.compounds, d.features) # all features are marked as dirty, loaded dynamically later d.init_dirty_features(owl) d.compounds.uniq! d.features.uniq! end + d.uri = uri unless d.uri return d end @@ -78,7 +79,12 @@ module OpenTox return "no classification key" end else - raise "invalid value type" + raise "predicted class value is not a hash\n"+ + "value "+v.to_s+"\n"+ + "value-class "+v.class.to_s+"\n"+ + "dataset "+@uri.to_s+"\n"+ + "compound "+compound.to_s+"\n"+ + "feature "+feature.to_s+"\n" end end @@ -94,7 +100,12 @@ module OpenTox raise "no confidence key" end else - raise "invalid value type" + raise "prediction confidence value is not a hash value\n"+ + "value "+v.to_s+"\n"+ + "value-class "+v.class.to_s+"\n"+ + "dataset "+@uri.to_s+"\n"+ + "compound "+compound.to_s+"\n"+ + "feature "+feature.to_s+"\n" end end @@ -119,7 +130,12 @@ module OpenTox end raise "feature value no found: "+feature.to_s else - raise "invalid value type" + raise "value is not an array\n"+ + "value "+v.to_s+"\n"+ + "value-class "+v.class.to_s+"\n"+ + "dataset "+@uri.to_s+"\n"+ + "compound "+compound.to_s+"\n"+ + "feature "+feature.to_s+"\n" end end @@ -127,7 +143,7 @@ module OpenTox def load_feature_values(feature=nil) if feature raise "feature already loaded" unless @dirty_features.include?(feature) - @owl.load_data_compounds_and_features(@compounds, @data, feature) + @owl.load_dataset_feature_values(@compounds, @data, feature) @dirty_features.delete(feature) else @data = {} diff --git a/lib/model.rb b/lib/model.rb index 5ca3914..8674311 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -21,8 +21,10 @@ module OpenTox @independent_variables = owl.independentVariables @predicted_variables = owl.predictedVariables - raise "invalid model:\n"+self.to_yaml+"\n" unless Utils.is_uri?(@uri) && @dependent_variables.to_s.size>0 && - @independent_variables.to_s.size>0 && @predicted_variables.to_s.size>0 if ENV['RACK_ENV'] =~ /test|debug/ + raise "invalid model:\n"+self.to_yaml+"\n" unless Utils.is_uri?(@uri) && + #@dependent_variables.to_s.size>0 && + #@independent_variables.to_s.size>0 && + @predicted_variables.to_s.size>0 if ENV['RACK_ENV'] =~ /test|debug/ end end @@ -31,61 +33,24 @@ module OpenTox def self.build( algorithm_uri, algorithm_params ) - LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s - uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s - - if uri.to_s =~ /ambit.*task|tu-muenchen.*task/ - uri = PredictionModel.redirect_task(uri) - elsif Utils.task_uri?(uri) - uri = OpenTox::Task.find(uri).wait_for_resource.to_s + if algorithm_uri =~ /ambit2/ + LOGGER.warn "Ambit hack, replacing 'prediction_feature' with 'target'" + algorithm_params[:target] = algorithm_params[:prediction_feature] + algorithm_params.delete(:prediction_feature) end - raise "invalid build model result: "+uri.to_s unless uri =~ /model/ - return PredictionModel.find(uri) - end - - def self.redirect_task( uri ) - raise "no redirect task uri: "+uri.to_s unless uri.to_s =~ /ambit.*task|tu-muenchen.*task/ - while (uri.to_s =~ /ambit.*task|tu-muenchen.*task/) - #HACK handle redirect - LOGGER.debug "REDIRECT TASK: "+uri.to_s - redirect = "" - while (redirect.size == 0) - IO.popen("bin/redirect.sh "+uri.to_s) do |f| - while line = f.gets - redirect += line.chomp - end - end - raise "TASK ERROR" if $?!=0 - sleep 0.3 - end - uri = redirect - LOGGER.debug "REDIRECT TO: "+uri.to_s - end - return uri + LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s + uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params, nil, true).to_s + raise "Invalid build model result: "+uri.to_s unless uri =~ /model/ + return PredictionModel.find(uri) end def predict_dataset( dataset_uri ) LOGGER.debug "Predict dataset: "+dataset_uri.to_s+" with model "+@uri.to_s - - #HACK using curl - uri = "" - IO.popen("curl -X POST -d dataset_uri='"+dataset_uri+"' "+@uri.to_s+" 2> /dev/null") do |f| - while line = f.gets - uri += line - end - end - - if uri.to_s =~ /ambit.*task|tu-muenchen.*task/ - uri = PredictionModel.redirect_task(uri) - raise "invalid redirect result: " unless uri =~ /ambit.*dataset/ - return uri - else - uri = OpenTox::Task.find(uri).wait_for_resource.to_s if Utils.task_uri?(uri) - return uri if Utils.dataset_uri?(uri) - raise "not sure about prediction result: "+uri.to_s - end + uri = RestClientWrapper.post(@uri, {:dataset_uri=>dataset_uri}, nil, true) + raise "Prediciton result no dataset uri: "+uri.to_s unless Utils.dataset_uri?(uri) + uri end def classification? @@ -96,6 +61,8 @@ module OpenTox return false elsif @uri =~/tu-muenchen/ and @title =~ /regression|M5P|GaussP/ return false + elsif @uri =~/ambit2/ and @title =~ /pKa/ + return false else raise "unknown model, uri:'"+@uri.to_s+"' title:'"+@title.to_s+"'" end -- cgit v1.2.3 From f4234893c238d298c09e921208c5431287899f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Mon, 19 Apr 2010 14:03:29 +0200 Subject: improved error handling --- lib/opentox-ruby-api-wrapper.rb | 2 +- lib/owl.rb | 19 +++-- lib/rest_client_wrapper.rb | 155 ++++++++++++++++++++++++++++++++++++++++ lib/task.rb | 43 ++++++----- lib/utils.rb | 52 -------------- 5 files changed, 195 insertions(+), 76 deletions(-) create mode 100644 lib/rest_client_wrapper.rb diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index c795ca8..16c23fe 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['owl', 'compound','dataset','algorithm','model','task','validation','utils','authorization','features'].each do |lib| +['owl', 'compound','dataset','algorithm','model','task','validation','utils','authorization','features', 'rest_client_wrapper'].each do |lib| require lib end diff --git a/lib/owl.rb b/lib/owl.rb index c410f76..ec8c699 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -62,16 +62,25 @@ module OpenTox @model.add @uri, DC[name], args.first else # getter #HACK for reading Panteli's models - if @uri.to_s =~ /ntua.*model|tu-muenchen.*model/ and !["title", "source", "identifier"].include?(name.to_s) - me = @model.subject(RDF['type'],OT['Model']) - #puts "going for "+name.to_s - return @model.object(me, OT[name.to_s]).uri.to_s + if @uri.to_s =~ /194.141.0.136.*model|ambit2.*model|ntua.*model|tu-muenchen.*model/ and !["title", "source", "identifier"].include?(name.to_s) + begin + me = @model.subject(RDF['type'],OT['Model']) + return @model.object(me, OT[name.to_s]).uri.to_s + rescue + LOGGER.warn "cannot get "+name.to_s+" from model" + return nil + end elsif @uri.to_s =~ /ambit.*task/ and ["hasStatus", "percentageCompleted"].include?(name.to_s) me = @model.subject(RDF['type'],OT['Task']) return @model.object(me, OT[name.to_s]).literal.value.to_s end #raise "stop there "+name.to_s - @model.object(@uri, DC[name.to_s]).to_s + val = @model.object(@uri, DC[name.to_s]) + if val.is_a?(Redland::Literal) + return val.value + else + return val.to_s + end end else raise "Method '#{name.to_s}' not found." diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb new file mode 100644 index 0000000..1532a79 --- /dev/null +++ b/lib/rest_client_wrapper.rb @@ -0,0 +1,155 @@ +module OpenTox + + #PENDING: implement ot error api, move to own file + class Error + + attr_accessor :code, :body, :uri, :payload, :headers + + def initialize(code, body, uri, payload, headers) + self.code = code + self.body = body + self.uri = uri + self.payload = payload + self.headers = headers + end + + def self.parse(error_array_string) + begin + err = YAML.load(error_array_string) + if err.is_a?(Array) and err.size>0 and err[0].is_a?(Error) + return err + else + return nil + end + rescue + return nil + end + end + + end + + module RestClientWrapper + + # PENDING: remove as soon as redirect tasks are remove from partner webservices + def self.redirect_task( uri ) + raise "no redirect task uri: "+uri.to_s unless uri.to_s =~ /194.141.0.136|ambit.*task|tu-muenchen.*task/ + + while (uri.to_s =~ /194.141.0.136|ambit.*task|tu-muenchen.*task/) + #HACK handle redirect + LOGGER.debug "REDIRECT TASK: "+uri.to_s + redirect = "" + while (redirect.size == 0) + IO.popen("bin/redirect.sh "+uri.to_s) do |f| + while line = f.gets + redirect += line.chomp + end + end + raise "TASK ERROR" if $?!=0 + sleep 0.3 + end + uri = redirect + LOGGER.debug "REDIRECT TO: "+uri.to_s + end + return uri + end + + def self.get(uri, headers=nil, wait_for_task=false, curl_hack=false) + execute( "get", uri, nil, headers, wait_for_task, curl_hack ) + end + + def self.post(uri, payload=nil, headers=nil, wait_for_task=false, curl_hack=false) + execute( "post", uri, payload, headers, wait_for_task, curl_hack ) + end + + def self.delete(uri, headers=nil, wait_for_task=false, curl_hack=false) + execute( "delete", uri, nil, headers, wait_for_task, curl_hack ) + end + + private + def self.execute( rest_call, uri, payload, headers, wait_for_task=false, curl_hack=false ) + + do_halt 400,"uri is null",uri,payload,headers unless uri + begin + + payload.each{ |k,v| payload.delete(k) if v==nil } if payload #remove keys with empty values, as this can cause problems + unless curl_hack + if payload + result = RestClient.send(rest_call, uri, payload, headers) + else + result = RestClient.send(rest_call, uri, headers) + end + else + result = "" + cmd = " curl -v -X "+rest_call.upcase+" "+payload.collect{|k,v| "-d "+k.to_s+"='"+v.to_s+"' "}.join("")+" "+uri.to_s + LOGGER.debug "CURL HACK: "+cmd + IO.popen(cmd+" 2> /dev/null") do |f| + while line = f.gets + result += line + end + end + result.chomp!("\n") + LOGGER.debug "CURL -> "+result.to_s + raise "curl call failed "+result if $?!=0 + #raise "STOP "+result + end + + if wait_for_task + if result.to_s =~ /ambit.*task|tu-muenchen.*task/ + result = redirect_task(result) + elsif Utils.task_uri?(result) + task = OpenTox::Task.find(result) + task.wait_for_completion + raise task.description if task.failed? + result = task.resource + end + end + return result + + rescue RestClient::RequestFailed => ex + do_halt ex.http_code,ex.http_body,uri,payload,headers + rescue RestClient::RequestTimeout => ex + do_halt 408,ex.message,uri,payload,headers + rescue => ex + begin + code = ex.http_code + msg = ex.http_body + rescue + code = 500 + msg = ex.to_s + end + do_halt code,msg,uri,payload,headers + end + end + + def self.do_halt( code, body, uri, payload, headers ) + + #build error + causing_errors = Error.parse(body) + if causing_errors + error = causing_errors + [Error.new(code, "subsequent error", uri, payload, headers)] + else + error = [Error.new(code, body, uri, payload, headers)] + end + +# debug utility: write error to file +# error_dir = "/tmp/ot_errors" +# FileUtils.mkdir(error_dir) unless File.exist?(error_dir) +# raise "could not create error dir" unless File.exist?(error_dir) and File.directory?(error_dir) +# file_name = "error" +# time=Time.now.strftime("%m.%d.%Y-%H:%M:%S") +# count = 1 +# count+=1 while File.exist?(File.join(error_dir,file_name+"_"+time+"_"+count.to_s)) +# File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body) + + # return error (by halting, halts should be logged) + # PENDING always return yaml for now + if defined?(halt) + halt(502,error.to_yaml) + elsif defined?($sinatra) + $sinatra.halt(502,error.to_yaml) + else + raise error.to_yaml + end + end + end +end diff --git a/lib/task.rb b/lib/task.rb index 75cc2d2..8b1ab5d 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -35,8 +35,12 @@ module OpenTox def finished_at RestClient.get File.join(@uri, 'finished_at') - end - + end + + def description + RestClient.get File.join(@uri, 'description') + end + def status RestClient.get File.join(@uri, 'status') end @@ -61,9 +65,10 @@ module OpenTox resource.put :resource => uri end - def failed + def failed(description) resource = RestClient::Resource.new(File.join(@uri,'failed'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.put({}) + resource.put :description => description + #resource.put({}) end def parent=(task) @@ -92,19 +97,30 @@ module OpenTox end end - def self.as_task + def self.as_task(parent_task=nil) + #return yield + task = OpenTox::Task.create + task.parent = parent_task if parent_task LOGGER.debug "Starting task" pid = Spork.spork(:logger => LOGGER) do task.started LOGGER.debug "Task #{task.uri} started #{Time.now}" begin - result = yield + result = catch(:halt) do + yield task + end + if result && result.is_a?(Array) && result.size==2 && result[0]>202 + # halted while executing task + LOGGER.error "task was halted: "+result.inspect + task.failed(result[1]) + throw :halt,result + end task.completed(result) rescue => ex - raise ex - LOGGER.error ex.message - task.failed + #raise ex + LOGGER.error "task failed: "+ex.message + task.failed(ex.message) end raise "Invalid task state" unless task.completed? || task.failed? end @@ -113,15 +129,6 @@ module OpenTox task.uri end - def wait_for_resource - wait_for_completion - if failed? - LOGGER.error "task failed: "+uri.to_s - return nil - end - return resource - end - end end diff --git a/lib/utils.rb b/lib/utils.rb index a31e405..fa61a28 100644 --- a/lib/utils.rb +++ b/lib/utils.rb @@ -21,57 +21,5 @@ module OpenTox false end end - -end - - - module RestClientWrapper - - def self.get(uri, headers=nil) - execute( "get", uri, nil, headers ) - end - - def self.post(uri, payload=nil, headers=nil) - execute( "post", uri, payload, headers ) - end - - def self.delete(uri, headers=nil) - execute( "delete", uri, nil, headers ) - end - - private - def self.execute( rest_call, uri, payload, headers ) - - do_halt 400,"uri is null",uri,payload,headers unless uri - begin - if payload - RestClient.send(rest_call, uri, payload, headers) - else - RestClient.send(rest_call, uri, headers) - end - rescue RestClient::RequestFailed, RestClient::RequestTimeout => ex - do_halt 502,ex.message,uri,payload,headers - rescue SocketError, RestClient::ResourceNotFound => ex - do_halt 400,ex.message,uri,payload,headers - rescue Exception => ex - do_halt 500,"add error '"+ex.class.to_s+"'' to rescue in OpenTox::RestClientWrapper::execute(), msg: '"+ex.message.to_s+"'",uri,payload,headers - end - end - - def self.do_halt(status, msg, uri, payload, headers) - - message = msg+"" - message += ", uri: '"+uri.to_s+"'" if uri - message += ", payload: '"+payload.inspect+"'" if payload - message += ", headers: '"+headers.inspect+"'" if headers - - if defined?(halt) - halt(status,message) - elsif defined?($sinatra) - $sinatra.halt(status,message) - else - raise "halt '"+status.to_s+"' '"+message+"'" - end - end end end -- cgit v1.2.3 From 429a21a3aed47afa63a1c6963d41efc4322a3e5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Mon, 19 Apr 2010 17:48:45 +0200 Subject: make sure halt is caught --- lib/rest_client_wrapper.rb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 1532a79..a70da98 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -143,11 +143,15 @@ module OpenTox # return error (by halting, halts should be logged) # PENDING always return yaml for now - if defined?(halt) - halt(502,error.to_yaml) - elsif defined?($sinatra) - $sinatra.halt(502,error.to_yaml) - else + begin + if defined?(halt) + halt(502,error.to_yaml) + elsif defined?($sinatra) + $sinatra.halt(502,error.to_yaml) + else + raise "" + end + rescue raise error.to_yaml end end -- cgit v1.2.3 From f051bd1f965a7d487e630c5df440998b8e9acdd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Mon, 19 Apr 2010 17:59:49 +0200 Subject: make sure that result is a string! --- lib/rest_client_wrapper.rb | 50 +++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index a70da98..53cdf06 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -74,36 +74,36 @@ module OpenTox payload.each{ |k,v| payload.delete(k) if v==nil } if payload #remove keys with empty values, as this can cause problems unless curl_hack if payload - result = RestClient.send(rest_call, uri, payload, headers) + result = RestClient.send(rest_call, uri, payload, headers).to_s else - result = RestClient.send(rest_call, uri, headers) + result = RestClient.send(rest_call, uri, headers).to_s end else - result = "" - cmd = " curl -v -X "+rest_call.upcase+" "+payload.collect{|k,v| "-d "+k.to_s+"='"+v.to_s+"' "}.join("")+" "+uri.to_s - LOGGER.debug "CURL HACK: "+cmd - IO.popen(cmd+" 2> /dev/null") do |f| - while line = f.gets - result += line - end - end - result.chomp!("\n") - LOGGER.debug "CURL -> "+result.to_s - raise "curl call failed "+result if $?!=0 - #raise "STOP "+result - end + result = "" + cmd = " curl -v -X "+rest_call.upcase+" "+payload.collect{|k,v| "-d "+k.to_s+"='"+v.to_s+"' "}.join("")+" "+uri.to_s + LOGGER.debug "CURL HACK: "+cmd + IO.popen(cmd+" 2> /dev/null") do |f| + while line = f.gets + result += line + end + end + result.chomp!("\n") + LOGGER.debug "CURL -> "+result.to_s + raise "curl call failed "+result if $?!=0 + #raise "STOP "+result + end - if wait_for_task - if result.to_s =~ /ambit.*task|tu-muenchen.*task/ - result = redirect_task(result) - elsif Utils.task_uri?(result) - task = OpenTox::Task.find(result) - task.wait_for_completion - raise task.description if task.failed? - result = task.resource + if wait_for_task + if result.to_s =~ /ambit.*task|tu-muenchen.*task/ + result = redirect_task(result) + elsif Utils.task_uri?(result) + task = OpenTox::Task.find(result) + task.wait_for_completion + raise task.description if task.failed? + result = task.resource + end end - end - return result + return result rescue RestClient::RequestFailed => ex do_halt ex.http_code,ex.http_body,uri,payload,headers -- cgit v1.2.3 From 7b68e9c00542c383871fc78ec3bb2b0297bba4cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 20 Apr 2010 16:04:47 +0200 Subject: adding error msg if redirect task fails --- lib/rest_client_wrapper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 53cdf06..725ac55 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -44,7 +44,7 @@ module OpenTox redirect += line.chomp end end - raise "TASK ERROR" if $?!=0 + raise redirect!=nil && redirect.size>0 ? redirect : "TASK ERROR" if $?!=0 sleep 0.3 end uri = redirect -- cgit v1.2.3 From bc8c59c41bee5283bc67fc56809c865babbed08f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Wed, 21 Apr 2010 16:25:57 +0200 Subject: rest client wrapper: changed method signature, added timeout --- lib/environment.rb | 10 +----- lib/model.rb | 8 ++--- lib/rest_client_wrapper.rb | 86 +++++++++++++++++++++++++++------------------- lib/task.rb | 2 +- lib/utils.rb | 5 +++ 5 files changed, 61 insertions(+), 50 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index dc3bad9..27235c3 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -60,29 +60,21 @@ class MyLogger < Logger def trace() lines = caller(0) -# puts lines.join("\n") -# puts "-" n = 2 line = lines[n] while (line =~ /spork.rb/ or line =~ /as_task/ or line =~ /environment.rb/) - #puts "skip line "+line.to_s n += 1 line = lines[n] end -# puts line -# puts "-" index = line.rindex(/\/.*\.rb/) -# raise "index = nil" if index==nil return line if index==nil -# puts "<<< "+line[index..-1].size.to_s+" <<< "+line[index..-1] -# raise "stop" line[index..-1] end def format(msg) - pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace + pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace+" :: "+ENV['REMOTE_ADDR'].to_s end def debug(msg) diff --git a/lib/model.rb b/lib/model.rb index 8674311..3aae652 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -40,16 +40,16 @@ module OpenTox end LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s - uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params, nil, true).to_s - raise "Invalid build model result: "+uri.to_s unless uri =~ /model/ + uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s + RestClientWrapper.illegal_result("Invalid build model result: "+uri.to_s, algorithm_uri, algorithm_params ) unless Utils.model_uri?(uri) return PredictionModel.find(uri) end def predict_dataset( dataset_uri ) LOGGER.debug "Predict dataset: "+dataset_uri.to_s+" with model "+@uri.to_s - uri = RestClientWrapper.post(@uri, {:dataset_uri=>dataset_uri}, nil, true) - raise "Prediciton result no dataset uri: "+uri.to_s unless Utils.dataset_uri?(uri) + uri = RestClientWrapper.post(@uri, {:dataset_uri=>dataset_uri}) + RestClientWrapper.illegal_result("Prediciton result no dataset uri: "+uri.to_s, @uri, {:dataset_uri=>dataset_uri} ) unless Utils.dataset_uri?(uri) uri end diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 725ac55..b0af8ca 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -16,7 +16,7 @@ module OpenTox def self.parse(error_array_string) begin err = YAML.load(error_array_string) - if err.is_a?(Array) and err.size>0 and err[0].is_a?(Error) + if err and err.is_a?(Array) and err.size>0 and err[0].is_a?(Error) return err else return nil @@ -27,7 +27,7 @@ module OpenTox end end - + module RestClientWrapper # PENDING: remove as soon as redirect tasks are remove from partner webservices @@ -53,30 +53,45 @@ module OpenTox return uri end - def self.get(uri, headers=nil, wait_for_task=false, curl_hack=false) - execute( "get", uri, nil, headers, wait_for_task, curl_hack ) + def self.get(uri, headers=nil, curl_hack=false) + execute( "get", uri, headers, nil, curl_hack ) end - def self.post(uri, payload=nil, headers=nil, wait_for_task=false, curl_hack=false) - execute( "post", uri, payload, headers, wait_for_task, curl_hack ) + def self.post(uri, headers, payload=nil, curl_hack=false) + raise "payload and headers switched" if payload.is_a?(Hash) and headers==nil + raise "illegal headers" unless headers==nil || headers.is_a?(Hash) + execute( "post", uri, headers, payload, curl_hack ) end - def self.delete(uri, headers=nil, wait_for_task=false, curl_hack=false) - execute( "delete", uri, nil, headers, wait_for_task, curl_hack ) + def self.delete(uri, headers=nil, curl_hack=false) + execute( "delete", uri, headers, nil, curl_hack ) end + def self.illegal_result(error_msg, uri, headers, payload=nil) + do_halt( "-", error_msg, uri, headers, payload ) + end + private - def self.execute( rest_call, uri, payload, headers, wait_for_task=false, curl_hack=false ) + def self.execute( rest_call, uri, headers, payload=nil, curl_hack=false ) + + do_halt 400,"uri is null",uri,headers,payload unless uri + do_halt 400,"not an uri",uri,headers,payload unless Utils.is_uri?(uri) + do_halt 400,"headers are no hash",uri,headers,payload unless headers==nil or headers.is_a?(Hash) + headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems - do_halt 400,"uri is null",uri,payload,headers unless uri begin - - payload.each{ |k,v| payload.delete(k) if v==nil } if payload #remove keys with empty values, as this can cause problems unless curl_hack + + LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect + resource = RestClient::Resource.new(uri, :timeout => 60) if payload - result = RestClient.send(rest_call, uri, payload, headers).to_s - else - result = RestClient.send(rest_call, uri, headers).to_s + result = resource.send(rest_call, payload, headers).to_s + #result = RestClient.send(rest_call, uri, payload, headers).to_s + elsif headers + #result = RestClient.send(rest_call, uri, headers).to_s + result = resource.send(rest_call, headers).to_s + else + result = resource.send(rest_call).to_s end else result = "" @@ -93,23 +108,22 @@ module OpenTox #raise "STOP "+result end - if wait_for_task - if result.to_s =~ /ambit.*task|tu-muenchen.*task/ - result = redirect_task(result) - elsif Utils.task_uri?(result) - task = OpenTox::Task.find(result) - task.wait_for_completion - raise task.description if task.failed? - result = task.resource - end + if result.to_s =~ /ambit.*task|tu-muenchen.*task/ + result = redirect_task(result) + elsif Utils.task_uri?(result) + task = OpenTox::Task.find(result) + task.wait_for_completion + raise task.description if task.failed? + result = task.resource end return result rescue RestClient::RequestFailed => ex - do_halt ex.http_code,ex.http_body,uri,payload,headers + do_halt ex.http_code,ex.http_body,uri,headers,payload rescue RestClient::RequestTimeout => ex - do_halt 408,ex.message,uri,payload,headers + do_halt 408,ex.message,uri,headers,payload rescue => ex + #raise ex begin code = ex.http_code msg = ex.http_body @@ -117,11 +131,11 @@ module OpenTox code = 500 msg = ex.to_s end - do_halt code,msg,uri,payload,headers + do_halt code,msg,uri,headers,payload end end - def self.do_halt( code, body, uri, payload, headers ) + def self.do_halt( code, body, uri, headers, payload=nil ) #build error causing_errors = Error.parse(body) @@ -132,14 +146,14 @@ module OpenTox end # debug utility: write error to file -# error_dir = "/tmp/ot_errors" -# FileUtils.mkdir(error_dir) unless File.exist?(error_dir) -# raise "could not create error dir" unless File.exist?(error_dir) and File.directory?(error_dir) -# file_name = "error" -# time=Time.now.strftime("%m.%d.%Y-%H:%M:%S") -# count = 1 -# count+=1 while File.exist?(File.join(error_dir,file_name+"_"+time+"_"+count.to_s)) -# File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body) + #error_dir = "/tmp/ot_errors" + #FileUtils.mkdir(error_dir) unless File.exist?(error_dir) + #raise "could not create error dir" unless File.exist?(error_dir) and File.directory?(error_dir) + #file_name = "error" + #time=Time.now.strftime("%m.%d.%Y-%H:%M:%S") + #count = 1 + #count+=1 while File.exist?(File.join(error_dir,file_name+"_"+time+"_"+count.to_s)) + #File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body) # return error (by halting, halts should be logged) # PENDING always return yaml for now diff --git a/lib/task.rb b/lib/task.rb index 8b1ab5d..29fb4fe 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -98,7 +98,7 @@ module OpenTox end def self.as_task(parent_task=nil) - #return yield + #return yield nil task = OpenTox::Task.create task.parent = parent_task if parent_task diff --git a/lib/utils.rb b/lib/utils.rb index fa61a28..629404c 100644 --- a/lib/utils.rb +++ b/lib/utils.rb @@ -13,6 +13,11 @@ module OpenTox def self.dataset_uri?(uri) is_uri?(uri) && uri.to_s =~ /dataset/ end + + def self.model_uri?(uri) + is_uri?(uri) && uri.to_s =~ /model/ + end + def self.is_uri?(uri) begin -- cgit v1.2.3 From 1926e43b9e2716e7f7248fe183a4d43da1209a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Wed, 21 Apr 2010 16:27:00 +0200 Subject: minor change --- lib/rest_client_wrapper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index b0af8ca..eaf6616 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -82,7 +82,7 @@ module OpenTox begin unless curl_hack - LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect + #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect resource = RestClient::Resource.new(uri, :timeout => 60) if payload result = resource.send(rest_call, payload, headers).to_s -- cgit v1.2.3 From ad974c419a2efe4c0ceaa1f3e2346906b5783e52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Fri, 23 Apr 2010 14:20:40 +0200 Subject: adjusted task to api, new owl --- lib/model.rb | 27 ++--- lib/owl.rb | 251 ++++++++++++++++++++++++++------------------- lib/rest_client_wrapper.rb | 109 +++++++++++--------- lib/task.rb | 144 ++++++++++++++------------ 4 files changed, 294 insertions(+), 237 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 3aae652..8b275ed 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -3,7 +3,7 @@ module OpenTox class Generic - attr_accessor :uri, :title, :source, :identifier, :predicted_variables, :independent_variables, :dependent_variables, :activity_dataset_uri, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features, :algorithm + attr_accessor :uri, :title, :creator, :date, :format, :identifier, :predictedVariables, :independentVariables, :dependentVariables, :trainingDataset, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features, :algorithm def self.find(uri) owl = OpenTox::Owl.from_uri(uri) @@ -12,23 +12,16 @@ module OpenTox protected def initialize(owl) - @title = owl.title - @source = owl.source - @identifier = owl.identifier.sub(/^\[/,'').sub(/\]$/,'') - @uri = owl.uri.to_s #@identifier - @algorithm = owl.algorithm - @dependent_variables = owl.dependentVariables - @independent_variables = owl.independentVariables - @predicted_variables = owl.predictedVariables - - raise "invalid model:\n"+self.to_yaml+"\n" unless Utils.is_uri?(@uri) && - #@dependent_variables.to_s.size>0 && - #@independent_variables.to_s.size>0 && - @predicted_variables.to_s.size>0 if ENV['RACK_ENV'] =~ /test|debug/ + [:uri, :date, :creator, :title, :format, :identifier, :algorithm, + :dependentVariables, :independentVariables, :predictedVariables, :trainingDataset].each do |a| + self.send("#{a.to_s}=".to_sym, owl.get(a.to_s)) + end + RestClientWrapper.raise_uri_error "invalid model:\n"+ + self.to_yaml+"\n",@uri.to_s unless (Utils.is_uri?(@uri) and + @dependentVariables and @independentVariables and @predictedVariables) if ENV['RACK_ENV'] =~ /test|debug/ end end - class PredictionModel < Generic def self.build( algorithm_uri, algorithm_params ) @@ -41,7 +34,7 @@ module OpenTox LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s - RestClientWrapper.illegal_result("Invalid build model result: "+uri.to_s, algorithm_uri, algorithm_params ) unless Utils.model_uri?(uri) + RestClientWrapper.raise_uri_error("Invalid build model result: "+uri.to_s, algorithm_uri, algorithm_params ) unless Utils.model_uri?(uri) return PredictionModel.find(uri) end @@ -49,7 +42,7 @@ module OpenTox LOGGER.debug "Predict dataset: "+dataset_uri.to_s+" with model "+@uri.to_s uri = RestClientWrapper.post(@uri, {:dataset_uri=>dataset_uri}) - RestClientWrapper.illegal_result("Prediciton result no dataset uri: "+uri.to_s, @uri, {:dataset_uri=>dataset_uri} ) unless Utils.dataset_uri?(uri) + RestClientWrapper.raise_uri_error("Prediciton result no dataset uri: "+uri.to_s, @uri, {:dataset_uri=>dataset_uri} ) unless Utils.dataset_uri?(uri) uri end diff --git a/lib/owl.rb b/lib/owl.rb index ec8c699..40cd00d 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -1,5 +1,9 @@ class Redland::Literal + def self.create(value, datatype) + Redland::Literal.new(value,nil,Redland::Uri.new(datatype)) + end + # the literal node of the ruby swig api provdides the 'value' of a literal but not the 'datatype' # found solution in mailing list def datatype() @@ -12,33 +16,61 @@ end module OpenTox class Owl - - attr_accessor :uri, :ot_class, :model + + # ot_class is the class of the object, e.g. "Model","Dataset", ... + # root_node is the root-object node in the rdf + # identifier is the uri of the object + attr_accessor :ot_class, :root_node, :identifier, :model def initialize @model = Redland::Model.new Redland::MemoryStore.new end - def self.create(ot_class,uri) + def self.create( ot_class, uri ) owl = OpenTox::Owl.new - owl.ot_class = ot_class - owl.uri = Redland::Uri.new(uri.chomp) - owl.model.add owl.uri, RDF['type'], OT[owl.ot_class] - owl.model.add owl.uri, DC['identifier'], owl.uri + owl.ot_class = ot_class + owl.root_node = Redland::Resource.new(uri.chomp+"XYZ") + owl.identifier = uri.chomp + owl.set("type",owl.ot_class) + owl.set('identifier', owl.identifier, "xsd:anyURI") owl end - def self.from_data(data,uri) + def self.from_data(data,base_uri) owl = OpenTox::Owl.new parser = Redland::Parser.new + begin - parser.parse_string_into_model(owl.model, data, uri) + parser.parse_string_into_model(owl.model, data, base_uri) + + # getting object-(root)-node and identifier via identifier property + # PENDING easier solution? + owl.identifier = nil + owl.model.find(nil, owl.node('identifier'), nil) do |s,p,o| + #LOGGER.debug "ID Statements "+s.to_s+" . "+p.to_s+" -> "+o.to_s + root_id = true + owl.model.find(nil, nil, s) do |ss,pp,oo| + root_id = false + break + end + if root_id + if o.is_a?(Redland::Literal) + raise "cannot derieve object uri from rdf, more than one identifier" if owl.identifier + owl.root_node = s + owl.identifier = o.value + else + raise "illegal identifier, not a literal: "+o.to_s + end + end + end + raise "Illegal RDF: root identifier missing" unless owl.identifier + owl.ot_class = owl.get("type") + LOGGER.debug "RDF loaded, uri/identifier:"+owl.identifier+", ot-class: "+owl.ot_class.to_s+", root-node:"+owl.root_node.to_s + owl rescue => e - raise "Error parsing #{uri}: "+e.message + RestClientWrapper.raise_uri_error(e.message, base_uri) end - owl.uri = Redland::Uri.new(uri.chomp) - owl end def self.from_uri(uri) @@ -47,53 +79,49 @@ module OpenTox def rdf @model.to_string - end - - def method_missing(name, *args) - methods = ['title', 'source', 'identifier', 'algorithm', 'independentVariables', 'dependentVariables', 'predictedVariables', 'date','trainingDataset', 'hasStatus', "percentageCompleted" ] - if methods.include? name.to_s.sub(/=/,'') - if /=/ =~ name.to_s # setter - name = name.to_s.sub(/=/,'') - begin # delete existing entry - t = @model.object(@uri, DC[name]) - @model.delete @uri, DC[name], t - rescue - end - @model.add @uri, DC[name], args.first - else # getter - #HACK for reading Panteli's models - if @uri.to_s =~ /194.141.0.136.*model|ambit2.*model|ntua.*model|tu-muenchen.*model/ and !["title", "source", "identifier"].include?(name.to_s) - begin - me = @model.subject(RDF['type'],OT['Model']) - return @model.object(me, OT[name.to_s]).uri.to_s - rescue - LOGGER.warn "cannot get "+name.to_s+" from model" - return nil - end - elsif @uri.to_s =~ /ambit.*task/ and ["hasStatus", "percentageCompleted"].include?(name.to_s) - me = @model.subject(RDF['type'],OT['Task']) - return @model.object(me, OT[name.to_s]).literal.value.to_s - end - #raise "stop there "+name.to_s - val = @model.object(@uri, DC[name.to_s]) - if val.is_a?(Redland::Literal) - return val.value - else - return val.to_s - end - end - else - raise "Method '#{name.to_s}' not found." - end - end + end + + def uri + @identifier + end + + def get(name) + property_node = node(name.to_s) + raise "Method '#{name.to_s}' not found." unless property_node + val = @model.object(@root_node, property_node) + return nil unless val + if val.is_a?(Redland::Literal) + return val.value + else + return val.uri.to_s + end + end + + def set(name, value, datatype=nil) + property_node = node(name.to_s) + raise "Method '#{name.to_s}' not found." unless property_node + begin # delete existing entry + t = @model.object(@root_node, property_node) + @model.delete @root_node, property_node, t + rescue + end + if value.first.is_a?(Redland::Node) + raise "not nil datatype not allowed when setting redland node as value" if datatype + @model.add @root_node, property_node, value + elsif datatype + @model.add @root_node, property_node, Redland::Literal.create(value, datatype) + else + @model.add @root_node, property_node, value + end + end def parameters=(params) params.each do |name, settings| parameter = @model.create_resource - @model.add parameter, RDF['type'], OT['Parameter'] - @model.add parameter, DC['title'], name - @model.add parameter, OT['paramScope'], settings[:scope] - @model.add parameter, OT['paramValue'], settings[:value] + @model.add parameter, node('type'), node('Parameter') + @model.add parameter, node('title'), name + @model.add parameter, node('paramScope'), settings[:scope] + @model.add parameter, node('paramValue'), settings[:value] end end @@ -102,8 +130,8 @@ module OpenTox compound = @model.subject(DC["identifier"], compound_uri) if compound.nil? compound = @model.create_resource(compound_uri) - @model.add compound, RDF['type'], OT["Compound"] - @model.add compound, DC["identifier"], compound_uri + @model.add compound, node('type'), node("Compound") + @model.add compound, node("identifier"), compound_uri end features.each do |f| f.each do |feature_uri,value| @@ -112,51 +140,51 @@ module OpenTox if value.class.to_s == 'Hash' # create tuple tuple = @model.create_resource - @model.add tuple, RDF['type'], OT["Tuple"] - @model.add tuple, OT['feature'], feature + @model.add tuple, node('type'), node("Tuple") + @model.add tuple, node('feature'), feature value.each do |uri,v| f = find_or_create_feature uri complex_value = @model.create_resource - @model.add tuple, OT['complexValue'], complex_value - @model.add complex_value, RDF['type'], OT["FeatureValue"] - @model.add complex_value, OT['feature'], f - @model.add complex_value, OT['value'], v.to_s + @model.add tuple, node('complexValue'), complex_value + @model.add complex_value, node('type'), node("FeatureValue") + @model.add complex_value, node('feature'), f + @model.add complex_value, node('value'), v.to_s end # add data entry - data_entry = @model.subject OT['compound'], compound + data_entry = @model.subject node('compound'), compound if data_entry.nil? data_entry = @model.create_resource - @model.add @uri, OT['dataEntry'], data_entry - @model.add data_entry, RDF['type'], OT["DataEntry"] - @model.add data_entry, OT['compound'], compound + @model.add @root_node, node('dataEntry'), data_entry + @model.add data_entry, node('type'), node("DataEntry") + @model.add data_entry, node('compound'), compound end - @model.add data_entry, OT['values'], tuple + @model.add data_entry, node('values'), tuple else - data_entry = @model.subject OT['compound'], compound + data_entry = @model.subject node('compound'), compound if data_entry.nil? data_entry = @model.create_resource - @model.add @uri, OT['dataEntry'], data_entry - @model.add data_entry, RDF['type'], OT["DataEntry"] - @model.add data_entry, OT['compound'], compound + @model.add @root_node, node('dataEntry'), data_entry + @model.add data_entry,node('type'), node("DataEntry") + @model.add data_entry, node('compound'), compound end values = @model.create_resource - @model.add data_entry, OT['values'], values - @model.add values, RDF['type'], OT['FeatureValue'] - @model.add values, OT['feature'], feature - @model.add values, OT['value'], value.to_s + @model.add data_entry, node('values'), values + @model.add values, node('type'), node('FeatureValue') + @model.add values, node('feature'), feature + @model.add values, node('value'), value.to_s end end end end def find_or_create_feature(feature_uri) - feature = @model.subject(DC["identifier"], feature_uri) + feature = @model.subject(node("identifier"), feature_uri) if feature.nil? feature = @model.create_resource(feature_uri) - @model.add feature, RDF['type'], OT["Feature"] - @model.add feature, DC["identifier"], feature_uri - @model.add feature, DC["title"], File.basename(feature_uri).split(/#/)[1] - @model.add feature, DC['source'], feature_uri + @model.add feature, node('type'), node("Feature") + @model.add feature, node("identifier"), feature_uri + @model.add feature, node("title"), File.basename(feature_uri).split(/#/)[1] + @model.add feature, node('creator'), feature_uri end feature end @@ -164,15 +192,13 @@ module OpenTox # feature values are not loaded for performance reasons # loading compounds and features into arrays that are given as params def load_dataset( compounds, features ) - ot_compound = OT['compound'] - dc_identifier = DC['identifier'] - @model.subjects(RDF['type'], OT['DataEntry']).each do |data_entry| - compound_node = @model.object(data_entry, ot_compound) - compound_uri = @model.object(compound_node, dc_identifier).to_s + @model.subjects(node('type'), node('DataEntry')).each do |data_entry| + compound_node = @model.object(data_entry, node('compound')) + compound_uri = @model.object(compound_node, node('identifier')).to_s compounds << compound_uri end - @model.subjects(RDF['type'], OT['Feature']).each do |feature| - feature_literal = @model.object(feature, dc_identifier) + @model.subjects(node('type'), node('Feature')).each do |feature| + feature_literal = @model.object(feature, node('identifier')) raise "feature is no literal" unless feature_literal.is_a?(Redland::Literal) # PENDING: to be able to recreate literal nodes for features, the datatype is stored @@feature_datatype = feature_literal.datatype @@ -194,24 +220,16 @@ module OpenTox # values are stored in the data-hash, hash has a key for each compound compounds.each{|c| data[c] = [] unless data[c]} - ot_values = OT['values'] - ot_feature = OT['feature'] - ot_compound = OT['compound'] - dc_identifier = DC['identifier'] - ot_value = OT['value'] - rdf_type = RDF['type'] - ot_feature_value = OT['FeatureValue'] - load_all_features = feature_uri==nil feature_node = nil # create feature node for feature uri if specified unless load_all_features feature_literal = Redland::Literal.new(feature_uri,nil,Redland::Uri.new(@@feature_datatype)) - feature_node = @model.subject(dc_identifier, feature_literal) + feature_node = @model.subject(node('identifier'), feature_literal) # remark: solution without creating the literal node: #@model.subjects(RDF['type'], OT['Feature']).each do |feature| - # f_uri = @model.object(feature, dc_identifier).value + # f_uri = @model.object(feature, node('identifier')).value # if feature_uri==f_uri # feature_node = feature # break @@ -230,14 +248,14 @@ module OpenTox # feature_node is either nil, i.e. a wildcard or specified @model.find(nil, ot_feature, feature_node) do |feature_value_node,p,o| - # get compound_uri by "backtracking" to values node (property is 'ot_values'), then get compound_node via 'ot_compound' - value_nodes = @model.subjects(ot_values,feature_value_node) + # get compound_uri by "backtracking" to values node (property is 'values'), then get compound_node via 'compound' + value_nodes = @model.subjects(node('values'),feature_value_node) raise "more than one value node "+value_nodes.size.to_s unless value_nodes.size==1 value_node = value_nodes[0] - compound_node = @model.object(value_node, ot_compound) + compound_node = @model.object(value_node, node('compound')) compound_uri = compound_uri_store[compound_node.to_s] unless compound_uri - compound_uri = @model.object(compound_node, dc_identifier).to_s + compound_uri = @model.object(compound_node, node('identifier')).to_s compound_uri_store[compound_node.to_s] = compound_uri end @@ -245,16 +263,16 @@ module OpenTox # if load all features, feautre_uri is not specified, derieve from feature_node feature_uri = feature_uri_store[o.to_s] unless feature_uri - feature_literal = @model.object(o, dc_identifier) + feature_literal = @model.object(o, node('identifier')) raise "feature is no literal" unless feature_literal.is_a?(Redland::Literal) feature_uri = feature_literal.value feature_uri_store[o.to_s] = feature_uri end end - value_node_type = @model.object(feature_value_node, rdf_type) - if (value_node_type == ot_feature_value) - value_literal = @model.object( feature_value_node, ot_value) + value_node_type = @model.object(feature_value_node, node('type')) + if (value_node_type == node('FeatureValue')) + value_literal = @model.object( feature_value_node, node('value')) raise "feature value no literal" unless value_literal.is_a?(Redland::Literal) case value_literal.datatype @@ -273,7 +291,27 @@ module OpenTox end LOGGER.debug "loaded "+count.to_s+" feature values" + end + + @@property_nodes = { "type" => RDF["type"], + "title" => DC["title"], + "creator" => DC["creator"], + "uri" => DC["identifier"], + "identifier" => DC["identifier"], + "date" => DC["date"], + "format" => DC["format"]} + + # this method has to purposes: + # * distinguishing ot-properties from dc- and rdf- properties + # * caching nodes, as creating nodes is costly + def node(name) + n = @@property_nodes[name] + unless n + n = OT[name] + @@property_nodes[name] = n end + return n + end =begin def data @@ -341,3 +379,4 @@ module OpenTox end end + diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index eaf6616..5a6362b 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -1,3 +1,5 @@ + + module OpenTox #PENDING: implement ot error api, move to own file @@ -28,7 +30,11 @@ module OpenTox end - module RestClientWrapper + class WrapperResult < String + attr_accessor :content_type + end + + class RestClientWrapper # PENDING: remove as soon as redirect tasks are remove from partner webservices def self.redirect_task( uri ) @@ -53,77 +59,88 @@ module OpenTox return uri end - def self.get(uri, headers=nil, curl_hack=false) - execute( "get", uri, headers, nil, curl_hack ) + def self.get(uri, headers=nil) + execute( "get", uri, headers) end - def self.post(uri, headers, payload=nil, curl_hack=false) - raise "payload and headers switched" if payload.is_a?(Hash) and headers==nil - raise "illegal headers" unless headers==nil || headers.is_a?(Hash) - execute( "post", uri, headers, payload, curl_hack ) + def self.post(uri, headers, payload=nil, wait=true) + execute( "post", uri, headers, payload, wait ) + end + + def self.put(uri, headers, payload=nil ) + execute( "put", uri, headers, payload ) end - def self.delete(uri, headers=nil, curl_hack=false) - execute( "delete", uri, headers, nil, curl_hack ) + def self.delete(uri, headers=nil) + execute( "delete", uri, headers, nil) end - def self.illegal_result(error_msg, uri, headers, payload=nil) + def self.raise_uri_error(error_msg, uri, headers=nil, payload=nil) do_halt( "-", error_msg, uri, headers, payload ) end private - def self.execute( rest_call, uri, headers, payload=nil, curl_hack=false ) + def self.execute( rest_call, uri, headers, payload=nil, wait=true ) do_halt 400,"uri is null",uri,headers,payload unless uri - do_halt 400,"not an uri",uri,headers,payload unless Utils.is_uri?(uri) + do_halt 400,"not a uri",uri,headers,payload unless Utils.is_uri?(uri) do_halt 400,"headers are no hash",uri,headers,payload unless headers==nil or headers.is_a?(Hash) headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems begin - unless curl_hack - - #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect - resource = RestClient::Resource.new(uri, :timeout => 60) - if payload - result = resource.send(rest_call, payload, headers).to_s - #result = RestClient.send(rest_call, uri, payload, headers).to_s - elsif headers - #result = RestClient.send(rest_call, uri, headers).to_s - result = resource.send(rest_call, headers).to_s - else - result = resource.send(rest_call).to_s - end + #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect + resource = RestClient::Resource.new(uri,{:timeout => 60, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]}) + if payload + result = resource.send(rest_call, payload, headers) + elsif headers + result = resource.send(rest_call, headers) else - result = "" - cmd = " curl -v -X "+rest_call.upcase+" "+payload.collect{|k,v| "-d "+k.to_s+"='"+v.to_s+"' "}.join("")+" "+uri.to_s - LOGGER.debug "CURL HACK: "+cmd - IO.popen(cmd+" 2> /dev/null") do |f| - while line = f.gets - result += line - end + result = resource.send(rest_call) + end + + # result is a string, with the additional filed content_type + res = WrapperResult.new(result.to_s) + res.content_type = result.headers[:content_type] + + # get result cannot be a task + return res if rest_call=="get" or !wait + return res if res.strip.size==0 + + # try to load task from result (maybe task-uri, or task-object) + task = nil + case res.content_type + when /application\/rdf\+xml|text\/x-yaml/ + task = OpenTox::Task.from_data(res, res.content_type, uri) + when /text\// + return res if res.content_type=~/text\/uri-list/ and + res.split("\n").size > 1 #if uri list contains more then one uri, its not a task + # HACK for redirect tasks + if res =~ /ambit.*task|tu-muenchen.*task/ + res = WrapperResult.new(redirect_task(res)) + res.content_type = "text/uri-list" + return res end - result.chomp!("\n") - LOGGER.debug "CURL -> "+result.to_s - raise "curl call failed "+result if $?!=0 - #raise "STOP "+result + task = OpenTox::Task.find(res) if Utils.task_uri?(res) + else + raise "unknown content-type when checking for task: "+res.content_type+" content: "+res[0..200] end - - if result.to_s =~ /ambit.*task|tu-muenchen.*task/ - result = redirect_task(result) - elsif Utils.task_uri?(result) - task = OpenTox::Task.find(result) + + # task could be loaded, wait for task to finish + if task + LOGGER.debug "result is a task "+task.uri.to_s+", wait for completion" task.wait_for_completion - raise task.description if task.failed? - result = task.resource + raise task.description if task.error? + res = WrapperResult.new(task.resultURI) + res.content_type = "text/uri-list" end - return result + return res rescue RestClient::RequestFailed => ex do_halt ex.http_code,ex.http_body,uri,headers,payload rescue RestClient::RequestTimeout => ex do_halt 408,ex.message,uri,headers,payload rescue => ex - #raise ex + #raise ex.message+" uri: "+uri.to_s begin code = ex.http_code msg = ex.http_body @@ -145,7 +162,7 @@ module OpenTox error = [Error.new(code, body, uri, payload, headers)] end -# debug utility: write error to file + ##debug utility: write error to file #error_dir = "/tmp/ot_errors" #FileUtils.mkdir(error_dir) unless File.exist?(error_dir) #raise "could not create error dir" unless File.exist?(error_dir) and File.directory?(error_dir) diff --git a/lib/task.rb b/lib/task.rb index 29fb4fe..dee8a86 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -4,96 +4,105 @@ module OpenTox class Task - attr_accessor :uri + TASK_ATTRIBS = [ :uri, :date, :title, :creator, :title, :description, :hasStatus, :percentageCompleted, :resultURI ] + TASK_ATTRIBS.each{ |a| attr_accessor(a) } - def initialize(uri) - @uri = uri.chomp - end - - def self.create - resource = RestClient::Resource.new(@@config[:services]["opentox-task"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - uri = resource.post({}).chomp - Task.new(uri.chomp) + private + def initialize(uri) + @uri = uri + end + + public + def self.create + task_uri = RestClientWrapper.post(@@config[:services]["opentox-task"], nil, nil, false).to_s + Task.find(task_uri.chomp) end def self.find(uri) - Task.new(uri) - end - - def self.base_uri - @@config[:services]["opentox-task"] - end - - def self.all - task_uris = RestClient.get(@@config[:services]["opentox-task"]).chomp.split(/\n/) - task_uris.collect{|uri| Task.new(uri)} - end - - def created_at - RestClient.get File.join(@uri, 'created_at') - end - - def finished_at - RestClient.get File.join(@uri, 'finished_at') - end - - def description - RestClient.get File.join(@uri, 'description') + task = Task.new(uri) + task.reload + return task end - def status - RestClient.get File.join(@uri, 'status') - end - - def resource - RestClient.get File.join(@uri, 'resource') - end - - def started - LOGGER.info File.join(@uri,'started') - resource = RestClient::Resource.new(File.join(@uri,'started'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.put({}) - end + def self.from_data(data, content_type, base_uri) + begin + task = Task.new(nil) + task.reload_from_data(data, content_type, base_uri) + return task + rescue + return nil + end + end + + def reload + result = RestClientWrapper.get(uri) + reload_from_data(result, result.content_type) + end + + def reload_from_data( data=nil, content_type=nil, base_uri=nil ) + case content_type + when /text\/x-yaml/ + task = YAML.load data + raise "yaml data is no task" if task.is_a?(Task) + TASK_ATTRIBS.each{ |a| send("#{a.to_s}=".to_sym,task[a]) } + when /application\/rdf\+xml/ + base_uri = uri unless base_uri + owl = OpenTox::Owl.from_data(data,base_uri) + raise "not a task" if owl.ot_class=="Task" + TASK_ATTRIBS.each{|a| self.send("#{a.to_s}=".to_sym, owl.get(a.to_s))} + else + raise "content type for tasks not supported: "+content_type.to_s + end + end + + + # invalid: getters in task.rb should work for non-internal tasks as well + # + #def self.base_uri + # @@config[:services]["opentox-task"] + #end + #def self.all + # task_uris = RestClientWrapper.get(@@config[:services]["opentox-task"]).chomp.split(/\n/) + # task_uris.collect{|uri| Task.new(uri)} + #end def cancel - resource = RestClient::Resource.new(File.join(@uri,'cancelled'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.put({}) + RestClientWrapper.put(File.join(@uri,'Cancelled')) + reload end def completed(uri) - resource = RestClient::Resource.new(File.join(@uri,'completed'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.put :resource => uri + RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) + reload end - def failed(description) - resource = RestClient::Resource.new(File.join(@uri,'failed'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.put :description => description - #resource.put({}) + def error(description) + RestClientWrapper.put(File.join(@uri,'Error'),{:description => description}) + reload end def parent=(task) - #RestClient.put File.join(@uri,'parent'), {:uri => task.uri} - resource = RestClient::Resource.new(File.join(@uri,'parent'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - LOGGER.debug "task.rb: #{resource}" - resource.put :uri => task.uri + RestClientWrapper.put(File.join(@uri,'parent'), {:uri => task.uri}) + reload end def pid=(pid) - resource = RestClient::Resource.new(File.join(@uri,'pid'), :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.put :pid => pid + RestClientWrapper.put(File.join(@uri,'pid'), {:pid => pid}) + reload end def completed? - self.status.to_s == 'completed' + @hasStatus.to_s == 'Completed' end - def failed? - self.status.to_s == 'failed' + def error? + @hasStatus.to_s == 'Error' end def wait_for_completion(dur=0.1) - until self.completed? or self.failed? + until self.completed? or self.error? sleep dur + reload end end @@ -102,29 +111,28 @@ module OpenTox task = OpenTox::Task.create task.parent = parent_task if parent_task - LOGGER.debug "Starting task" pid = Spork.spork(:logger => LOGGER) do - task.started LOGGER.debug "Task #{task.uri} started #{Time.now}" begin result = catch(:halt) do yield task + LOGGER.debug "Task #{task.uri} done #{Time.now}" end if result && result.is_a?(Array) && result.size==2 && result[0]>202 # halted while executing task LOGGER.error "task was halted: "+result.inspect - task.failed(result[1]) + task.error(result[1]) throw :halt,result end task.completed(result) rescue => ex #raise ex LOGGER.error "task failed: "+ex.message - task.failed(ex.message) + task.error(ex.message) end - raise "Invalid task state" unless task.completed? || task.failed? + raise "Invalid task state" unless task.completed? || task.error? end - LOGGER.debug "task PID: " + pid.to_s + LOGGER.debug "Started task with PID: " + pid.to_s task.pid = pid task.uri end -- cgit v1.2.3 From 08232976c35511086fe6787c6c8c098c63ef0818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Fri, 23 Apr 2010 14:45:48 +0200 Subject: minor fixes --- lib/rest_client_wrapper.rb | 5 ++++- lib/task.rb | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 5a6362b..86ee890 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -85,6 +85,7 @@ module OpenTox do_halt 400,"uri is null",uri,headers,payload unless uri do_halt 400,"not a uri",uri,headers,payload unless Utils.is_uri?(uri) do_halt 400,"headers are no hash",uri,headers,payload unless headers==nil or headers.is_a?(Hash) + do_halt 400,"nil headers for post not allowed, use {}",uri,headers,payload if rest_call=="post" and headers==nil headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems begin @@ -131,6 +132,7 @@ module OpenTox task.wait_for_completion raise task.description if task.error? res = WrapperResult.new(task.resultURI) + LOGGER.debug "task resultURI "+res.to_s res.content_type = "text/uri-list" end return res @@ -140,7 +142,8 @@ module OpenTox rescue RestClient::RequestTimeout => ex do_halt 408,ex.message,uri,headers,payload rescue => ex - #raise ex.message+" uri: "+uri.to_s + #raise ex + #raise "'"+ex.message+"' uri: "+uri.to_s begin code = ex.http_code msg = ex.http_body diff --git a/lib/task.rb b/lib/task.rb index dee8a86..99d8f13 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -14,7 +14,7 @@ module OpenTox public def self.create - task_uri = RestClientWrapper.post(@@config[:services]["opentox-task"], nil, nil, false).to_s + task_uri = RestClientWrapper.post(@@config[:services]["opentox-task"], {}, nil, false).to_s Task.find(task_uri.chomp) end @@ -116,7 +116,6 @@ module OpenTox begin result = catch(:halt) do yield task - LOGGER.debug "Task #{task.uri} done #{Time.now}" end if result && result.is_a?(Array) && result.size==2 && result[0]>202 # halted while executing task @@ -124,6 +123,7 @@ module OpenTox task.error(result[1]) throw :halt,result end + LOGGER.debug "Task #{task.uri} done #{Time.now} -> "+result.to_s task.completed(result) rescue => ex #raise ex -- cgit v1.2.3 From afa31803afd167c19c9ba95e73d311c9e2b8b43a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Fri, 23 Apr 2010 18:47:37 +0200 Subject: changing owl once again --- bin/yaml2owl.rb | 2 +- lib/dataset.rb | 19 +++++----- lib/model.rb | 9 +++-- lib/owl.rb | 94 +++++++++++++++++++++++++--------------------- lib/rest_client_wrapper.rb | 24 ++++++------ lib/task.rb | 38 +++++++++++-------- 6 files changed, 101 insertions(+), 85 deletions(-) diff --git a/bin/yaml2owl.rb b/bin/yaml2owl.rb index b259ad1..1002912 100755 --- a/bin/yaml2owl.rb +++ b/bin/yaml2owl.rb @@ -5,7 +5,7 @@ require 'opentox-ruby-api-wrapper' input = YAML.load_file(ARGV[0]) dataset = OpenTox::Dataset.new dataset.title = input[:title] -dataset.source = input[:source] +dataset.creator = input[:source] input[:data].each do |c,f| f.each do |k,v| v.each do |value| diff --git a/lib/dataset.rb b/lib/dataset.rb index 4c3f103..c513463 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -4,7 +4,7 @@ module OpenTox class Dataset - attr_accessor :uri, :title, :source, :identifier, :data, :features, :compounds + attr_accessor :uri, :title, :creator, :data, :features, :compounds def initialize @data = {} @@ -15,15 +15,15 @@ module OpenTox def self.find(uri) if uri.match(/webservices.in-silico.ch|localhost|ot.dataset.de|opentox.informatik.uni-freiburg.de/) # try to get YAML first - d = YAML.load RestClientWrapper.get(uri, :accept => 'application/x-yaml').to_s + d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s + d.uri = uri unless d.uri else # get default rdf+xml - owl = OpenTox::Owl.from_uri(uri) + owl = OpenTox::Owl.from_uri(uri.to_s.strip, "Dataset") d = Dataset.new - d.title = owl.title - d.source = owl.source - d.identifier = owl.identifier.sub(/^\[/,'').sub(/\]$/,'') - d.uri = d.identifier + d.title = owl.get("title") + d.creator = owl.get("creator") + d.uri = owl.uri # when loading a dataset from owl, only compound- and feature-uris are loaded owl.load_dataset(d.compounds, d.features) @@ -33,13 +33,12 @@ module OpenTox d.compounds.uniq! d.features.uniq! end - d.uri = uri unless d.uri return d end # creates a new dataset, using only those compounsd specified in new_compounds # returns uri of new dataset - def create_new_dataset( new_compounds, new_features, new_title, new_source ) + def create_new_dataset( new_compounds, new_features, new_title, new_creator ) # load require features if ((defined? @dirty_features) && (@dirty_features - new_features).size > 0) @@ -48,7 +47,7 @@ module OpenTox dataset = OpenTox::Dataset.new dataset.title = new_title - dataset.source = new_source + dataset.creator = new_creator dataset.features = new_features dataset.compounds = new_compounds diff --git a/lib/model.rb b/lib/model.rb index 8b275ed..236de84 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -3,19 +3,20 @@ module OpenTox class Generic - attr_accessor :uri, :title, :creator, :date, :format, :identifier, :predictedVariables, :independentVariables, :dependentVariables, :trainingDataset, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features, :algorithm + attr_accessor :uri, :title, :creator, :date, :format, :predictedVariables, :independentVariables, :dependentVariables, :trainingDataset, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features, :algorithm def self.find(uri) - owl = OpenTox::Owl.from_uri(uri) + owl = OpenTox::Owl.from_uri(uri, "Model") return self.new(owl) end protected def initialize(owl) - [:uri, :date, :creator, :title, :format, :identifier, :algorithm, - :dependentVariables, :independentVariables, :predictedVariables, :trainingDataset].each do |a| + [:date, :creator, :title, :format, :algorithm, :dependentVariables, + :independentVariables, :predictedVariables, :trainingDataset].each do |a| self.send("#{a.to_s}=".to_sym, owl.get(a.to_s)) end + @uri = owl.uri RestClientWrapper.raise_uri_error "invalid model:\n"+ self.to_yaml+"\n",@uri.to_s unless (Utils.is_uri?(@uri) and @dependentVariables and @independentVariables and @predictedVariables) if ENV['RACK_ENV'] =~ /test|debug/ diff --git a/lib/owl.rb b/lib/owl.rb index 40cd00d..17adb15 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -19,24 +19,24 @@ module OpenTox # ot_class is the class of the object, e.g. "Model","Dataset", ... # root_node is the root-object node in the rdf - # identifier is the uri of the object - attr_accessor :ot_class, :root_node, :identifier, :model + # uri the uri of the object + attr_accessor :ot_class, :root_node, :uri, :model def initialize @model = Redland::Model.new Redland::MemoryStore.new end def self.create( ot_class, uri ) + owl = OpenTox::Owl.new owl.ot_class = ot_class - owl.root_node = Redland::Resource.new(uri.chomp+"XYZ") - owl.identifier = uri.chomp - owl.set("type",owl.ot_class) - owl.set('identifier', owl.identifier, "xsd:anyURI") + owl.root_node = Redland::Resource.new(uri.to_s.strip) + owl.set("type",owl.node(owl.ot_class)) owl end - def self.from_data(data,base_uri) + # loads owl from data + def self.from_data(data, base_uri, ot_class, no_wrong_class_exception=false ) owl = OpenTox::Owl.new parser = Redland::Parser.new @@ -44,50 +44,56 @@ module OpenTox begin parser.parse_string_into_model(owl.model, data, base_uri) - # getting object-(root)-node and identifier via identifier property - # PENDING easier solution? - owl.identifier = nil - owl.model.find(nil, owl.node('identifier'), nil) do |s,p,o| - #LOGGER.debug "ID Statements "+s.to_s+" . "+p.to_s+" -> "+o.to_s - root_id = true + # now loading root_node and uri + owl.model.find(nil, owl.node("type"), owl.node(ot_class)) do |s,p,o| + #LOGGER.debug "about statements "+s.to_s+" . "+p.to_s+" -> "+o.to_s + is_root = true owl.model.find(nil, nil, s) do |ss,pp,oo| - root_id = false + is_root = false break end - if root_id - if o.is_a?(Redland::Literal) - raise "cannot derieve object uri from rdf, more than one identifier" if owl.identifier - owl.root_node = s - owl.identifier = o.value - else - raise "illegal identifier, not a literal: "+o.to_s - end + if is_root + raise "cannot derieve root object from rdf, more than one object specified" if owl.uri + raise "illegal root node type, no uri specified\n"+data.to_s if s.blank? + owl.uri = s.uri.to_s + owl.root_node = s + end + end + + # handle error if no root node was found + unless owl.root_node + types = [] + owl.model.find(nil, owl.node("type"), nil){ |s,p,o| types << o.to_s } + msg = "root node for class '"+ot_class+"' not found (available type nodes: "+types.inspect+")" + if no_wrong_class_exception + LOGGER.debug "suppressing error: "+msg + return nil + else + raise msg end end - raise "Illegal RDF: root identifier missing" unless owl.identifier - owl.ot_class = owl.get("type") - LOGGER.debug "RDF loaded, uri/identifier:"+owl.identifier+", ot-class: "+owl.ot_class.to_s+", root-node:"+owl.root_node.to_s + + raise "no uri in rdf: '"+owl.uri+"'" unless owl.uri and Utils.is_uri?(owl.uri) + owl.ot_class = ot_class owl rescue => e RestClientWrapper.raise_uri_error(e.message, base_uri) end end - def self.from_uri(uri) - return from_data(RestClient.get(uri,:accept => "application/rdf+xml").to_s, uri) + def self.from_uri(uri, ot_class) + return from_data(RestClient.get(uri,:accept => "application/rdf+xml").to_s, uri, ot_class) end def rdf @model.to_string end - def uri - @identifier - end - def get(name) + #PENDING remove debug checks + raise "get identifier deprecated, use uri instead" if name=="identifier" + raise "uri is no prop, use owl.uri instead" if name=="uri" property_node = node(name.to_s) - raise "Method '#{name.to_s}' not found." unless property_node val = @model.object(@root_node, property_node) return nil unless val if val.is_a?(Redland::Literal) @@ -98,20 +104,22 @@ module OpenTox end def set(name, value, datatype=nil) + #PENDING remove debug checks + raise "set identifier deprecated, use uri instead" if name=="identifier" + raise "uri is no prop, cannot set uri" if name=="uri" property_node = node(name.to_s) - raise "Method '#{name.to_s}' not found." unless property_node - begin # delete existing entry - t = @model.object(@root_node, property_node) - @model.delete @root_node, property_node, t - rescue + begin # delete existing entry + t = @model.object(@root_node, property_node) + @model.delete @root_node, property_node, t + rescue end - if value.first.is_a?(Redland::Node) + if value.is_a?(Redland::Node) raise "not nil datatype not allowed when setting redland node as value" if datatype @model.add @root_node, property_node, value elsif datatype - @model.add @root_node, property_node, Redland::Literal.create(value, datatype) + @model.add @root_node, property_node, Redland::Literal.create(value.to_s, datatype) else - @model.add @root_node, property_node, value + @model.add @root_node, property_node, value.to_s end end @@ -122,7 +130,8 @@ module OpenTox @model.add parameter, node('title'), name @model.add parameter, node('paramScope'), settings[:scope] @model.add parameter, node('paramValue'), settings[:value] - end + @model.add @root_node, node('parameters'), parameter + end end def add_data_entries(compound_uri,features) @@ -246,7 +255,7 @@ module OpenTox # search for all feature_value_node with property 'ot_feature' # feature_node is either nil, i.e. a wildcard or specified - @model.find(nil, ot_feature, feature_node) do |feature_value_node,p,o| + @model.find(nil, node('feature'), feature_node) do |feature_value_node,p,o| # get compound_uri by "backtracking" to values node (property is 'values'), then get compound_node via 'compound' value_nodes = @model.subjects(node('values'),feature_value_node) @@ -294,6 +303,7 @@ module OpenTox end @@property_nodes = { "type" => RDF["type"], + "about" => RDF["about"], "title" => DC["title"], "creator" => DC["creator"], "uri" => DC["identifier"], diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 86ee890..0219f51 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -111,7 +111,7 @@ module OpenTox task = nil case res.content_type when /application\/rdf\+xml|text\/x-yaml/ - task = OpenTox::Task.from_data(res, res.content_type, uri) + task = OpenTox::Task.from_data(res, res.content_type, uri, true) when /text\// return res if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task @@ -121,14 +121,14 @@ module OpenTox res.content_type = "text/uri-list" return res end - task = OpenTox::Task.find(res) if Utils.task_uri?(res) + task = OpenTox::Task.find(res.to_s) if Utils.task_uri?(res) else raise "unknown content-type when checking for task: "+res.content_type+" content: "+res[0..200] end # task could be loaded, wait for task to finish if task - LOGGER.debug "result is a task "+task.uri.to_s+", wait for completion" + LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" task.wait_for_completion raise task.description if task.error? res = WrapperResult.new(task.resultURI) @@ -165,15 +165,15 @@ module OpenTox error = [Error.new(code, body, uri, payload, headers)] end - ##debug utility: write error to file - #error_dir = "/tmp/ot_errors" - #FileUtils.mkdir(error_dir) unless File.exist?(error_dir) - #raise "could not create error dir" unless File.exist?(error_dir) and File.directory?(error_dir) - #file_name = "error" - #time=Time.now.strftime("%m.%d.%Y-%H:%M:%S") - #count = 1 - #count+=1 while File.exist?(File.join(error_dir,file_name+"_"+time+"_"+count.to_s)) - #File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body) +# #debug utility: write error to file +# error_dir = "/tmp/ot_errors" +# FileUtils.mkdir(error_dir) unless File.exist?(error_dir) +# raise "could not create error dir" unless File.exist?(error_dir) and File.directory?(error_dir) +# file_name = "error" +# time=Time.now.strftime("%m.%d.%Y-%H:%M:%S") +# count = 1 +# count+=1 while File.exist?(File.join(error_dir,file_name+"_"+time+"_"+count.to_s)) +# File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body) # return error (by halting, halts should be logged) # PENDING always return yaml for now diff --git a/lib/task.rb b/lib/task.rb index 99d8f13..4b147d7 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -9,7 +9,7 @@ module OpenTox private def initialize(uri) - @uri = uri + @uri = uri.to_s.strip end public @@ -24,38 +24,44 @@ module OpenTox return task end - def self.from_data(data, content_type, base_uri) - begin - task = Task.new(nil) - task.reload_from_data(data, content_type, base_uri) - return task - rescue + # test_if_task = true -> error suppressed if data is no task, nil is returned + def self.from_data(data, content_type, base_uri, test_if_task) + task = Task.new(nil) + task.reload_from_data(data, content_type, base_uri, test_if_task) + if test_if_task and (!task.uri or task.uri.strip.size==0) return nil + else + return task end end def reload result = RestClientWrapper.get(uri) - reload_from_data(result, result.content_type) + reload_from_data(result, result.content_type, uri, false) end - def reload_from_data( data=nil, content_type=nil, base_uri=nil ) + # test_if_task = true -> error suppressed if data is no task, empty task is returned + def reload_from_data( data, content_type, base_uri, test_if_task ) case content_type when /text\/x-yaml/ task = YAML.load data - raise "yaml data is no task" if task.is_a?(Task) - TASK_ATTRIBS.each{ |a| send("#{a.to_s}=".to_sym,task[a]) } + if task.is_a?(Task) + TASK_ATTRIBS.each{ |a| send("#{a.to_s}=".to_sym,task[a]) } + else + raise "yaml data is no task: "+task.class.to_s unless test_if_task + end when /application\/rdf\+xml/ - base_uri = uri unless base_uri - owl = OpenTox::Owl.from_data(data,base_uri) - raise "not a task" if owl.ot_class=="Task" - TASK_ATTRIBS.each{|a| self.send("#{a.to_s}=".to_sym, owl.get(a.to_s))} + owl = OpenTox::Owl.from_data(data,base_uri,"Task",test_if_task) + if owl + self.uri = owl.uri + (TASK_ATTRIBS-[:uri]).each{|a| self.send("#{a.to_s}=".to_sym, owl.get(a.to_s))} + end else raise "content type for tasks not supported: "+content_type.to_s end + raise "uri is null after loading" unless @uri and @uri.to_s.strip.size>0 unless test_if_task end - # invalid: getters in task.rb should work for non-internal tasks as well # #def self.base_uri -- cgit v1.2.3 From ac5a07c294bba699d6517d5be1548a33455b87c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 27 Apr 2010 12:00:39 +0200 Subject: change tasks: remove tree structure, add max wait time --- lib/environment.rb | 3 ++ lib/rest_client_wrapper.rb | 58 ++++++++------------------------ lib/task.rb | 83 +++++++++++++++++++++++----------------------- 3 files changed, 59 insertions(+), 85 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index 27235c3..c86d2be 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -40,6 +40,9 @@ if @@config[:database] end end +# hack: store sinatra in global var to make url_for and halt methods accessible +before {$sinatra = self unless $sinatra} + class Sinatra::Base # overwriting halt to log halts (!= 202) def halt(status,msg) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 0219f51..194a742 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -36,29 +36,6 @@ module OpenTox class RestClientWrapper - # PENDING: remove as soon as redirect tasks are remove from partner webservices - def self.redirect_task( uri ) - raise "no redirect task uri: "+uri.to_s unless uri.to_s =~ /194.141.0.136|ambit.*task|tu-muenchen.*task/ - - while (uri.to_s =~ /194.141.0.136|ambit.*task|tu-muenchen.*task/) - #HACK handle redirect - LOGGER.debug "REDIRECT TASK: "+uri.to_s - redirect = "" - while (redirect.size == 0) - IO.popen("bin/redirect.sh "+uri.to_s) do |f| - while line = f.gets - redirect += line.chomp - end - end - raise redirect!=nil && redirect.size>0 ? redirect : "TASK ERROR" if $?!=0 - sleep 0.3 - end - uri = redirect - LOGGER.debug "REDIRECT TO: "+uri.to_s - end - return uri - end - def self.get(uri, headers=nil) execute( "get", uri, headers) end @@ -81,7 +58,7 @@ module OpenTox private def self.execute( rest_call, uri, headers, payload=nil, wait=true ) - + do_halt 400,"uri is null",uri,headers,payload unless uri do_halt 400,"not a uri",uri,headers,payload unless Utils.is_uri?(uri) do_halt 400,"headers are no hash",uri,headers,payload unless headers==nil or headers.is_a?(Hash) @@ -112,15 +89,9 @@ module OpenTox case res.content_type when /application\/rdf\+xml|text\/x-yaml/ task = OpenTox::Task.from_data(res, res.content_type, uri, true) - when /text\// + when /text\// return res if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task - # HACK for redirect tasks - if res =~ /ambit.*task|tu-muenchen.*task/ - res = WrapperResult.new(redirect_task(res)) - res.content_type = "text/uri-list" - return res - end task = OpenTox::Task.find(res.to_s) if Utils.task_uri?(res) else raise "unknown content-type when checking for task: "+res.content_type+" content: "+res[0..200] @@ -130,7 +101,7 @@ module OpenTox if task LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" task.wait_for_completion - raise task.description if task.error? + raise task.description unless task.completed? res = WrapperResult.new(task.resultURI) LOGGER.debug "task resultURI "+res.to_s res.content_type = "text/uri-list" @@ -175,18 +146,17 @@ module OpenTox # count+=1 while File.exist?(File.join(error_dir,file_name+"_"+time+"_"+count.to_s)) # File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body) - # return error (by halting, halts should be logged) - # PENDING always return yaml for now - begin - if defined?(halt) - halt(502,error.to_yaml) - elsif defined?($sinatra) - $sinatra.halt(502,error.to_yaml) - else - raise "" - end - rescue - raise error.to_yaml + # handle error + # we are either in a task, or in sinatra + # PENDING: always return yaml for now + + + if $self_task #this global var in Task.as_task to mark that the current process is running in a task + raise error.to_yaml # the error is caught, logged, and task state is set to error in Task.as_task + elsif $sinatra #else halt sinatra + $sinatra.halt(502,error.to_yaml) + else + raise "internal error" end end end diff --git a/lib/task.rb b/lib/task.rb index 4b147d7..178f744 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,10 +1,16 @@ LOGGER.progname = File.expand_path(__FILE__) +DEFAULT_TASK_MAX_DURATION = 120 +EXTERNAL_TASK_MAX_DURATION = 60 + +$self_task=nil + module OpenTox class Task - TASK_ATTRIBS = [ :uri, :date, :title, :creator, :title, :description, :hasStatus, :percentageCompleted, :resultURI ] + # due_to_time is only set in local tasks + TASK_ATTRIBS = [ :uri, :date, :title, :creator, :title, :description, :hasStatus, :percentageCompleted, :resultURI, :due_to_time ] TASK_ATTRIBS.each{ |a| attr_accessor(a) } private @@ -12,12 +18,13 @@ module OpenTox @uri = uri.to_s.strip end - public - def self.create - task_uri = RestClientWrapper.post(@@config[:services]["opentox-task"], {}, nil, false).to_s + # create is private now, use OpenTox::Task.as_task + def self.create(max_duration) + task_uri = RestClientWrapper.post(@@config[:services]["opentox-task"], {:max_duration => max_duration}, nil, false).to_s Task.find(task_uri.chomp) end + public def self.find(uri) task = Task.new(uri) task.reload @@ -36,7 +43,7 @@ module OpenTox end def reload - result = RestClientWrapper.get(uri) + result = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'})#'text/x-yaml'}) reload_from_data(result, result.content_type, uri, false) end @@ -45,10 +52,9 @@ module OpenTox case content_type when /text\/x-yaml/ task = YAML.load data - if task.is_a?(Task) - TASK_ATTRIBS.each{ |a| send("#{a.to_s}=".to_sym,task[a]) } - else - raise "yaml data is no task: "+task.class.to_s unless test_if_task + TASK_ATTRIBS.each do |a| + raise "task yaml data invalid, key missing: "+a.to_s unless task.has_key?(a) + send("#{a.to_s}=".to_sym,task[a]) end when /application\/rdf\+xml/ owl = OpenTox::Owl.from_data(data,base_uri,"Task",test_if_task) @@ -62,16 +68,6 @@ module OpenTox raise "uri is null after loading" unless @uri and @uri.to_s.strip.size>0 unless test_if_task end - # invalid: getters in task.rb should work for non-internal tasks as well - # - #def self.base_uri - # @@config[:services]["opentox-task"] - #end - #def self.all - # task_uris = RestClientWrapper.get(@@config[:services]["opentox-task"]).chomp.split(/\n/) - # task_uris.collect{|uri| Task.new(uri)} - #end - def cancel RestClientWrapper.put(File.join(@uri,'Cancelled')) reload @@ -87,15 +83,9 @@ module OpenTox reload end - def parent=(task) - RestClientWrapper.put(File.join(@uri,'parent'), {:uri => task.uri}) - reload - end - - def pid=(pid) - RestClientWrapper.put(File.join(@uri,'pid'), {:pid => pid}) - reload - end + def running? + @hasStatus.to_s == 'Running' + end def completed? @hasStatus.to_s == 'Completed' @@ -105,44 +95,55 @@ module OpenTox @hasStatus.to_s == 'Error' end - def wait_for_completion(dur=0.1) - until self.completed? or self.error? + # waits for a task, unless time exceeds or state is no longer running + def wait_for_completion(dur=0.3) + + if (@uri.match(@@config[:services]["opentox-task"])) + due_to_time = Time.parse(@due_to_time) + else + # the date of the external task cannot be trusted, offest to local time might be to big + due_to_time = Time.new + EXTERNAL_TASK_MAX_DURATION + end + LOGGER.debug "start waiting for task "+@uri.to_s+" at: "+Time.new.to_s+", waiting at least until "+due_to_time.to_s + while self.running? sleep dur reload + if (Time.new > due_to_time) + raise "max waiting time exceeded, task seems to be stalled, task: '"+@uri.to_s+"'" + end end end - def self.as_task(parent_task=nil) + # returns the task uri + # catches halts and exceptions, task state is set to error then + def self.as_task(max_duration=DEFAULT_TASK_MAX_DURATION) #return yield nil - task = OpenTox::Task.create - task.parent = parent_task if parent_task - pid = Spork.spork(:logger => LOGGER) do + task = OpenTox::Task.create(max_duration) + Spork.spork(:logger => LOGGER) do LOGGER.debug "Task #{task.uri} started #{Time.now}" + $self_task = task + begin result = catch(:halt) do yield task end + # catching halt, set task state to error if result && result.is_a?(Array) && result.size==2 && result[0]>202 - # halted while executing task LOGGER.error "task was halted: "+result.inspect task.error(result[1]) - throw :halt,result + return end LOGGER.debug "Task #{task.uri} done #{Time.now} -> "+result.to_s task.completed(result) rescue => ex - #raise ex LOGGER.error "task failed: "+ex.message task.error(ex.message) end - raise "Invalid task state" unless task.completed? || task.error? end - LOGGER.debug "Started task with PID: " + pid.to_s - task.pid = pid + LOGGER.debug "Started task: "+task.uri.to_s task.uri end - end end -- cgit v1.2.3 From 9f61630a6fadb0f4050eff8912f6c250924f6055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 27 Apr 2010 12:18:35 +0200 Subject: readded pid for tasks --- lib/task.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/task.rb b/lib/task.rb index 178f744..03d5330 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -82,6 +82,10 @@ module OpenTox RestClientWrapper.put(File.join(@uri,'Error'),{:description => description}) reload end + + def pid=(pid) + RestClientWrapper.put(File.join(@uri,'pid'), {:pid => pid}) + end def running? @hasStatus.to_s == 'Running' @@ -120,7 +124,7 @@ module OpenTox #return yield nil task = OpenTox::Task.create(max_duration) - Spork.spork(:logger => LOGGER) do + task_pid = Spork.spork(:logger => LOGGER) do LOGGER.debug "Task #{task.uri} started #{Time.now}" $self_task = task @@ -141,6 +145,7 @@ module OpenTox task.error(ex.message) end end + task.pid = task_pid LOGGER.debug "Started task: "+task.uri.to_s task.uri end -- cgit v1.2.3 From 60ee47624583411db004bf3601491320dabe588e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 27 Apr 2010 14:57:25 +0200 Subject: check for invalid result_uri --- lib/rest_client_wrapper.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 194a742..7b3e148 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -102,6 +102,8 @@ module OpenTox LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" task.wait_for_completion raise task.description unless task.completed? + do_halt 502,"task resultURI is invalid: '"+task.resultURI.to_s+ + "'",task.uri,nil unless task.resultURI and Utils.is_uri?(task.resultURI) res = WrapperResult.new(task.resultURI) LOGGER.debug "task resultURI "+res.to_s res.content_type = "text/uri-list" -- cgit v1.2.3 From 8439bb9b337bded4a54018c03500a15082bce6b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Wed, 28 Apr 2010 10:21:35 +0200 Subject: adjust to new task api (201) --- lib/environment.rb | 8 ++++-- lib/model.rb | 4 +-- lib/owl.rb | 13 +++------ lib/rest_client_wrapper.rb | 72 ++++++++++++++++++++++++---------------------- lib/task.rb | 63 ++++++++++++++++++++++++++-------------- 5 files changed, 90 insertions(+), 70 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index c86d2be..b46bf19 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -45,9 +45,11 @@ before {$sinatra = self unless $sinatra} class Sinatra::Base # overwriting halt to log halts (!= 202) - def halt(status,msg) - LOGGER.error "halt "+status.to_s+" "+msg.to_s if (status != 202) - throw :halt, [status, msg] + def halt(*response) + LOGGER.error "halt "+response.first.to_s+" "+(response.size>1 ? response[1].to_s : "") if response.first >= 300 + # orig sinatra code: + response = response.first if response.length == 1 + throw :halt, response end end diff --git a/lib/model.rb b/lib/model.rb index 236de84..dfd5886 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -14,7 +14,7 @@ module OpenTox def initialize(owl) [:date, :creator, :title, :format, :algorithm, :dependentVariables, :independentVariables, :predictedVariables, :trainingDataset].each do |a| - self.send("#{a.to_s}=".to_sym, owl.get(a.to_s)) + self.send("#{a.to_s}=".to_sym, owl.get(a.to_s)) end @uri = owl.uri RestClientWrapper.raise_uri_error "invalid model:\n"+ @@ -35,7 +35,7 @@ module OpenTox LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s - RestClientWrapper.raise_uri_error("Invalid build model result: "+uri.to_s, algorithm_uri, algorithm_params ) unless Utils.model_uri?(uri) + RestClientWrapper.raise_uri_error("Invalid build model result: '"+uri.to_s+"'", algorithm_uri, algorithm_params ) unless Utils.model_uri?(uri) return PredictionModel.find(uri) end diff --git a/lib/owl.rb b/lib/owl.rb index 17adb15..43d034d 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -36,7 +36,7 @@ module OpenTox end # loads owl from data - def self.from_data(data, base_uri, ot_class, no_wrong_class_exception=false ) + def self.from_data(data, base_uri, ot_class) owl = OpenTox::Owl.new parser = Redland::Parser.new @@ -64,15 +64,8 @@ module OpenTox unless owl.root_node types = [] owl.model.find(nil, owl.node("type"), nil){ |s,p,o| types << o.to_s } - msg = "root node for class '"+ot_class+"' not found (available type nodes: "+types.inspect+")" - if no_wrong_class_exception - LOGGER.debug "suppressing error: "+msg - return nil - else - raise msg - end + raise "root node for class '"+ot_class+"' not found (available type nodes: "+types.inspect+")" end - raise "no uri in rdf: '"+owl.uri+"'" unless owl.uri and Utils.is_uri?(owl.uri) owl.ot_class = ot_class owl @@ -98,6 +91,8 @@ module OpenTox return nil unless val if val.is_a?(Redland::Literal) return val.value + elsif val.blank? + return nil else return val.uri.to_s end diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 7b3e148..f917e35 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -31,13 +31,13 @@ module OpenTox end class WrapperResult < String - attr_accessor :content_type + attr_accessor :content_type, :code end class RestClientWrapper - def self.get(uri, headers=nil) - execute( "get", uri, headers) + def self.get(uri, headers=nil, wait=true) + execute( "get", uri, headers, nil, wait) end def self.post(uri, headers, payload=nil, wait=true) @@ -79,35 +79,14 @@ module OpenTox # result is a string, with the additional filed content_type res = WrapperResult.new(result.to_s) res.content_type = result.headers[:content_type] + res.code = result.code - # get result cannot be a task - return res if rest_call=="get" or !wait - return res if res.strip.size==0 + return res if res.code==200 || !wait - # try to load task from result (maybe task-uri, or task-object) - task = nil - case res.content_type - when /application\/rdf\+xml|text\/x-yaml/ - task = OpenTox::Task.from_data(res, res.content_type, uri, true) - when /text\// - return res if res.content_type=~/text\/uri-list/ and - res.split("\n").size > 1 #if uri list contains more then one uri, its not a task - task = OpenTox::Task.find(res.to_s) if Utils.task_uri?(res) - else - raise "unknown content-type when checking for task: "+res.content_type+" content: "+res[0..200] - end - - # task could be loaded, wait for task to finish - if task - LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" - task.wait_for_completion - raise task.description unless task.completed? - do_halt 502,"task resultURI is invalid: '"+task.resultURI.to_s+ - "'",task.uri,nil unless task.resultURI and Utils.is_uri?(task.resultURI) - res = WrapperResult.new(task.resultURI) - LOGGER.debug "task resultURI "+res.to_s - res.content_type = "text/uri-list" + while (res.code==201 || res.code==202) + res = wait_for_task(res, uri) end + raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200 return res rescue RestClient::RequestFailed => ex @@ -128,6 +107,30 @@ module OpenTox end end + def self.wait_for_task( res, base_uri ) + + task = nil + case res.content_type + when /application\/rdf\+xml|text\/x-yaml/ + task = OpenTox::Task.from_data(res, res.content_type, res.code, base_uri) + when /text\// + raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and + res.split("\n").size > 1 #if uri list contains more then one uri, its not a task + task = OpenTox::Task.find(res.to_s) if Utils.task_uri?(res) + else + raise "unknown content-type for task: "+res.content_type+" content: "+res[0..200] + end + + LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" + task.wait_for_completion + raise task.description unless task.completed? # maybe task was cancelled / error + + res = WrapperResult.new task.resultURI + res.code = task.http_code + res.content_type = "text/uri-list" + return res + end + def self.do_halt( code, body, uri, headers, payload=nil ) #build error @@ -152,13 +155,14 @@ module OpenTox # we are either in a task, or in sinatra # PENDING: always return yaml for now - if $self_task #this global var in Task.as_task to mark that the current process is running in a task raise error.to_yaml # the error is caught, logged, and task state is set to error in Task.as_task - elsif $sinatra #else halt sinatra - $sinatra.halt(502,error.to_yaml) - else - raise "internal error" + #elsif $sinatra #else halt sinatra + #$sinatra.halt(502,error.to_yaml) + elsif defined?(halt) + halt(502,error.to_yaml) + else #for testing purposes (if classes used directly) + raise error.to_yaml end end end diff --git a/lib/task.rb b/lib/task.rb index 03d5330..b686d24 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,7 +1,7 @@ LOGGER.progname = File.expand_path(__FILE__) -DEFAULT_TASK_MAX_DURATION = 120 -EXTERNAL_TASK_MAX_DURATION = 60 +DEFAULT_TASK_MAX_DURATION = 360 +EXTERNAL_TASK_MAX_DURATION = 120 $self_task=nil @@ -12,7 +12,8 @@ module OpenTox # due_to_time is only set in local tasks TASK_ATTRIBS = [ :uri, :date, :title, :creator, :title, :description, :hasStatus, :percentageCompleted, :resultURI, :due_to_time ] TASK_ATTRIBS.each{ |a| attr_accessor(a) } - + attr_accessor :http_code + private def initialize(uri) @uri = uri.to_s.strip @@ -31,24 +32,20 @@ module OpenTox return task end - # test_if_task = true -> error suppressed if data is no task, nil is returned - def self.from_data(data, content_type, base_uri, test_if_task) + def self.from_data(data, content_type, code, base_uri) task = Task.new(nil) - task.reload_from_data(data, content_type, base_uri, test_if_task) - if test_if_task and (!task.uri or task.uri.strip.size==0) - return nil - else - return task - end + task.http_code = code + task.reload_from_data(data, content_type, base_uri) + return task end def reload - result = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'})#'text/x-yaml'}) - reload_from_data(result, result.content_type, uri, false) + result = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, false)#'text/x-yaml'}) + @http_code = result.code + reload_from_data(result, result.content_type, uri) end - # test_if_task = true -> error suppressed if data is no task, empty task is returned - def reload_from_data( data, content_type, base_uri, test_if_task ) + def reload_from_data( data, content_type, base_uri ) case content_type when /text\/x-yaml/ task = YAML.load data @@ -57,15 +54,13 @@ module OpenTox send("#{a.to_s}=".to_sym,task[a]) end when /application\/rdf\+xml/ - owl = OpenTox::Owl.from_data(data,base_uri,"Task",test_if_task) - if owl - self.uri = owl.uri - (TASK_ATTRIBS-[:uri]).each{|a| self.send("#{a.to_s}=".to_sym, owl.get(a.to_s))} - end + owl = OpenTox::Owl.from_data(data,base_uri,"Task") + self.uri = owl.uri + (TASK_ATTRIBS-[:uri]).each{|a| self.send("#{a.to_s}=".to_sym, owl.get(a.to_s))} else raise "content type for tasks not supported: "+content_type.to_s end - raise "uri is null after loading" unless @uri and @uri.to_s.strip.size>0 unless test_if_task + raise "uri is null after loading" unless @uri and @uri.to_s.strip.size>0 end def cancel @@ -104,20 +99,44 @@ module OpenTox if (@uri.match(@@config[:services]["opentox-task"])) due_to_time = Time.parse(@due_to_time) + running_time = due_to_time - Time.parse(@date) else # the date of the external task cannot be trusted, offest to local time might be to big due_to_time = Time.new + EXTERNAL_TASK_MAX_DURATION + running_time = EXTERNAL_TASK_MAX_DURATION end LOGGER.debug "start waiting for task "+@uri.to_s+" at: "+Time.new.to_s+", waiting at least until "+due_to_time.to_s + while self.running? sleep dur reload + check_state if (Time.new > due_to_time) - raise "max waiting time exceeded, task seems to be stalled, task: '"+@uri.to_s+"'" + raise "max wait time exceeded ("+running_time.to_s+"sec), task: '"+@uri.to_s+"'" end end + + LOGGER.debug "task no longer running: "+@uri.to_s+", result: "+@resultURI.to_s end + def check_state + begin + raise "illegal task state, task is completed, resultURI is no URI: '"+@resultURI.to_s+ + "'" unless @resultURI and Utils.is_uri?(@resultURI) if completed? + + if @http_code == 202 + raise "illegal task state, code is 202, but hasStatus is not Running: '"+@hasStatus+"'" unless running? + elsif @http_code == 201 + raise "illegal task state, code is 201, but hasStatus is not Completed: '"+@hasStatus+"'" unless completed? + raise "illegal task state, code is 201, resultURI is no task-URI: '"+@resultURI.to_s+ + "'" unless @resultURI and Utils.task_uri?(@resultURI) + end + rescue => ex + RestClientWrapper.raise_uri_error(ex.message, @uri) + end + + end + # returns the task uri # catches halts and exceptions, task state is set to error then def self.as_task(max_duration=DEFAULT_TASK_MAX_DURATION) -- cgit v1.2.3 From 9e356d0d94ea4fe210ea7cefce5d4c1179cb63cd Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 6 May 2010 11:32:05 +0200 Subject: major change: using literal datatypes in owl --- lib/algorithm.rb | 2 +- lib/compound.rb | 8 +- lib/dataset.rb | 21 +++- lib/environment.rb | 1 + lib/model.rb | 40 ++++-- lib/owl.rb | 306 ++++++++++++++++++++++++++------------------- lib/rest_client_wrapper.rb | 9 +- lib/task.rb | 4 +- lib/utils.rb | 15 ++- 9 files changed, 251 insertions(+), 155 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 8083db2..7a25408 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -21,7 +21,7 @@ module OpenTox def self.create_model(params) LOGGER.debug params LOGGER.debug File.basename(__FILE__) + ": creating model" - resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") + resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "text/x-yaml") @uri = resource.post(:dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).chomp end diff --git a/lib/compound.rb b/lib/compound.rb index 0ee853d..cc29fc5 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -18,18 +18,18 @@ module OpenTox @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:name] # paranoid URI encoding to keep SMILES charges and brackets - @inchi = RestClient.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").chomp + @inchi = RestClientWrapper.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").chomp @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:uri] @uri = params[:uri] case params[:uri] when /ambit/ # Ambit does not deliver InChIs reliably - smiles = RestClient.get @uri, :accept => 'chemical/x-daylight-smiles' + smiles = RestClientWrapper.get @uri, :accept => 'chemical/x-daylight-smiles' @inchi = obconversion(smiles,'smi','inchi') when /InChI/ # shortcut for IST services @inchi = params[:uri].sub(/^.*InChI/, 'InChI') else - @inchi = RestClient.get @uri, :accept => 'chemical/x-inchi' + @inchi = RestClientWrapper.get @uri, :accept => 'chemical/x-inchi' end end end @@ -44,7 +44,7 @@ module OpenTox end def image - RestClient.get("#{@@cactus_uri}#{@inchi}/image") + RestClientWrapper.get("#{@@cactus_uri}#{@inchi}/image") end def image_uri diff --git a/lib/dataset.rb b/lib/dataset.rb index c513463..ff07a6f 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -12,12 +12,21 @@ module OpenTox @compounds = [] end - def self.find(uri) + def self.find(uri, accept_header=nil) - if uri.match(/webservices.in-silico.ch|localhost|ot.dataset.de|opentox.informatik.uni-freiburg.de/) # try to get YAML first - d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s + unless accept_header + if uri.match(@@config[:services]["opentox-dataset"]) + accept_header = 'text/x-yaml' + else + accept_header = "application/rdf+xml" + end + end + + case accept_header + when "text/x-yaml" + d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'text/x-yaml').to_s d.uri = uri unless d.uri - else # get default rdf+xml + when "application/rdf+xml" owl = OpenTox::Owl.from_uri(uri.to_s.strip, "Dataset") d = Dataset.new @@ -32,6 +41,8 @@ module OpenTox d.compounds.uniq! d.features.uniq! + else + raise "cannot get datset with accept header: "+accept_header.to_s end return d end @@ -159,7 +170,7 @@ module OpenTox @features.uniq! @compounds.uniq! - RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]).post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s + OpenTox::RestClientWrapper.post(@@config[:services]["opentox-dataset"],{:content_type => "text/x-yaml"},self.to_yaml).strip end =begin diff --git a/lib/environment.rb b/lib/environment.rb index b46bf19..f89a758 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -128,6 +128,7 @@ RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#' DC = Redland::Namespace.new 'http://purl.org/dc/elements/1.1/' OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#' +XML = Redland::Namespace.new 'http://www.w3.org/2001/XMLSchema#' # Regular expressions for parsing classification data TRUE_REGEXP = /^(true|active|$1^)/ diff --git a/lib/model.rb b/lib/model.rb index dfd5886..684873b 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -3,13 +3,22 @@ module OpenTox class Generic - attr_accessor :uri, :title, :creator, :date, :format, :predictedVariables, :independentVariables, :dependentVariables, :trainingDataset, :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features, :algorithm + MODEL_ATTRIBS = [:uri, :title, :creator, :date, :format, :predictedVariables, :independentVariables, :dependentVariables, :trainingDataset, :algorithm] + MODEL_ATTRIBS.each{ |a| attr_accessor(a) } def self.find(uri) owl = OpenTox::Owl.from_uri(uri, "Model") return self.new(owl) end + def self.to_rdf(model) + owl = OpenTox::Owl.create 'Model', model.uri + (MODEL_ATTRIBS - [:uri]).each do |a| + owl.set(a.to_s,model.send(a.to_s)) + end + owl.rdf + end + protected def initialize(owl) [:date, :creator, :title, :format, :algorithm, :dependentVariables, @@ -17,9 +26,17 @@ module OpenTox self.send("#{a.to_s}=".to_sym, owl.get(a.to_s)) end @uri = owl.uri - RestClientWrapper.raise_uri_error "invalid model:\n"+ - self.to_yaml+"\n",@uri.to_s unless (Utils.is_uri?(@uri) and - @dependentVariables and @independentVariables and @predictedVariables) if ENV['RACK_ENV'] =~ /test|debug/ + if ENV['RACK_ENV'] =~ /test|debug/ + begin + raise "uri invalid" unless Utils.is_uri?(@uri) + raise "no algorithm" unless @algorithm and @algorithm.size>0 + raise "no dependent variables" unless @dependentVariables and @dependentVariables.size>0 + raise "no indenpendent variables" unless @independentVariables + raise "no predicted variables" unless @predictedVariables and @predictedVariables.size>0 + rescue => ex + RestClientWrapper.raise_uri_error "invalid model: '"+ex.message+"'\n"+self.to_yaml+"\n",@uri.to_s + end + end end end @@ -35,6 +52,7 @@ module OpenTox LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s + LOGGER.debug "Build model done: "+uri.to_s RestClientWrapper.raise_uri_error("Invalid build model result: '"+uri.to_s+"'", algorithm_uri, algorithm_params ) unless Utils.model_uri?(uri) return PredictionModel.find(uri) end @@ -57,6 +75,8 @@ module OpenTox return false elsif @uri =~/ambit2/ and @title =~ /pKa/ return false + elsif @uri =~/majority/ + return @uri =~ /class/ else raise "unknown model, uri:'"+@uri.to_s+"' title:'"+@title.to_s+"'" end @@ -65,7 +85,9 @@ module OpenTox class Lazar < Generic - + + attr_accessor :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features + def initialize @source = "http://github.com/helma/opentox-model" @algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") @@ -80,11 +102,11 @@ module OpenTox def save @features.uniq! resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s + resource.post(self.to_yaml, :content_type => "text/x-yaml").chomp.to_s end def self.find_all - RestClient.get(@@config[:services]["opentox-model"]).chomp.split("\n") + RestClientWrapper.get(@@config[:services]["opentox-model"]).chomp.split("\n") end =begin @@ -101,7 +123,7 @@ module OpenTox def self.create(data) resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.post(data, :content_type => "application/x-yaml").chomp.to_s + resource.post(data, :content_type => "text/x-yaml").chomp.to_s end def delete @@ -116,7 +138,7 @@ module OpenTox # end # def yaml=(data) -# RestClient.put(@@uri, data, :content_type => "application/x-yaml").to_s +# RestClient.put(@@uri, data, :content_type => "text/x-yaml").to_s # end def endpoint diff --git a/lib/owl.rb b/lib/owl.rb index 43d034d..671220b 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -1,16 +1,83 @@ class Redland::Literal - def self.create(value, datatype) - Redland::Literal.new(value,nil,Redland::Uri.new(datatype)) + def self.create(value, datatype=nil) + if datatype + if datatype.is_a?(Redland::Uri) + Redland::Literal.new(value.to_s,nil,datatype) + else + Redland::Literal.new(value.to_s,nil,Redland::Uri.new(datatype.to_s)) + end + else + Redland::Literal.new(value.to_s,nil,Redland::Literal.parse_datatype_uri(value)) + end end # the literal node of the ruby swig api provdides the 'value' of a literal but not the 'datatype' # found solution in mailing list - def datatype() + def datatype uri = Redland.librdf_node_get_literal_value_datatype_uri(self.node) return Redland.librdf_uri_to_string(uri) if uri end + # gets value of literal, value class is se according to literal datatype + def get_value + Redland::Literal.parse_value( self.value, self.datatype ) + end + + private + @@type_string = XML["string"].uri + @@type_uri = XML["anyURI"].uri + @@type_float = XML["float"].uri + @@type_double = XML["double"].uri + @@type_date = XML["date"].uri + @@type_boolean = XML["boolean"].uri + @@type_datetime = XML["dateTime"].uri + + # parses value according to datatype uri + def self.parse_value(string_value, datatype_uri) + if (datatype_uri==nil || datatype_uri.size==0) + LOGGER.warn("empty datatype for literal with value: "+string_value) + return string_value + end + case datatype_uri + when @@type_string.to_s + return string_value + when @@type_uri.to_s + return string_value #PENDING uri as string? + when @@type_float.to_s + return string_value.to_f + when @@type_double.to_s + return string_value.to_f + when @@type_boolean.to_s + return string_value.upcase=="TRUE" + when @@type_date.to_s + return string_value #PENDING date as string? + when @@type_datetime.to_s + return string_value #PENDING date as string? + else + raise "unknown literal datatype: '"+datatype_uri.to_s+"', value is "+string_value + end + end + + # parse datatype uri accoring to value class + def self.parse_datatype_uri(value) + if value==nil + raise "illegal datatype: value is nil" + elsif value.is_a?(String) + # PENDING: uri check too slow? + if OpenTox::Utils.is_uri?(value) + return @@type_uri + else + return @@type_string + end + elsif value.is_a?(Float) + return @@type_float + elsif value.is_a?(TrueClass) or value.is_a?(FalseClass) + return @@type_boolean + else + raise "illegal datatype: "+value.class.to_s+" "+value.to_s + end + end end module OpenTox @@ -75,7 +142,7 @@ module OpenTox end def self.from_uri(uri, ot_class) - return from_data(RestClient.get(uri,:accept => "application/rdf+xml").to_s, uri, ot_class) + return from_data(RestClientWrapper.get(uri,:accept => "application/rdf+xml").to_s, uri, ot_class) end def rdf @@ -83,24 +150,25 @@ module OpenTox end def get(name) - #PENDING remove debug checks - raise "get identifier deprecated, use uri instead" if name=="identifier" raise "uri is no prop, use owl.uri instead" if name=="uri" property_node = node(name.to_s) - val = @model.object(@root_node, property_node) - return nil unless val - if val.is_a?(Redland::Literal) - return val.value - elsif val.blank? + return get_value( @model.object(@root_node, property_node) ) + end + + private + def get_value( node ) + return nil unless node + if node.is_a?(Redland::Literal) + return node.get_value + elsif node.blank? return nil else - return val.uri.to_s + return node.uri.to_s end end + public def set(name, value, datatype=nil) - #PENDING remove debug checks - raise "set identifier deprecated, use uri instead" if name=="identifier" raise "uri is no prop, cannot set uri" if name=="uri" property_node = node(name.to_s) begin # delete existing entry @@ -111,10 +179,8 @@ module OpenTox if value.is_a?(Redland::Node) raise "not nil datatype not allowed when setting redland node as value" if datatype @model.add @root_node, property_node, value - elsif datatype + else # if value is no node, a literal is created @model.add @root_node, property_node, Redland::Literal.create(value.to_s, datatype) - else - @model.add @root_node, property_node, value.to_s end end @@ -135,7 +201,6 @@ module OpenTox if compound.nil? compound = @model.create_resource(compound_uri) @model.add compound, node('type'), node("Compound") - @model.add compound, node("identifier"), compound_uri end features.each do |f| f.each do |feature_uri,value| @@ -152,7 +217,7 @@ module OpenTox @model.add tuple, node('complexValue'), complex_value @model.add complex_value, node('type'), node("FeatureValue") @model.add complex_value, node('feature'), f - @model.add complex_value, node('value'), v.to_s + @model.add complex_value, node('value'), Redland::Literal.create(v) end # add data entry data_entry = @model.subject node('compound'), compound @@ -175,134 +240,118 @@ module OpenTox @model.add data_entry, node('values'), values @model.add values, node('type'), node('FeatureValue') @model.add values, node('feature'), feature - @model.add values, node('value'), value.to_s + @model.add values, node('value'), Redland::Literal.create(value) end end end - end + end + + private + def find_feature(feature_uri) + # PENDING: more efficiently get feature node? + @model.subjects(RDF['type'], OT['Feature']).each do |feature| + return feature if feature_uri==get_value(feature) + end + return nil + end - def find_or_create_feature(feature_uri) - feature = @model.subject(node("identifier"), feature_uri) - if feature.nil? - feature = @model.create_resource(feature_uri) - @model.add feature, node('type'), node("Feature") - @model.add feature, node("identifier"), feature_uri - @model.add feature, node("title"), File.basename(feature_uri).split(/#/)[1] - @model.add feature, node('creator'), feature_uri - end - feature - end + public + def find_or_create_feature(feature_uri) + feature = find_feature(feature_uri) + unless feature + feature = @model.create_resource(feature_uri) + @model.add feature, node('type'), node("Feature") + @model.add feature, node("title"), File.basename(feature_uri).split(/#/)[1] + @model.add feature, node('creator'), feature_uri + end + feature + end - # feature values are not loaded for performance reasons - # loading compounds and features into arrays that are given as params - def load_dataset( compounds, features ) - @model.subjects(node('type'), node('DataEntry')).each do |data_entry| - compound_node = @model.object(data_entry, node('compound')) - compound_uri = @model.object(compound_node, node('identifier')).to_s - compounds << compound_uri - end - @model.subjects(node('type'), node('Feature')).each do |feature| - feature_literal = @model.object(feature, node('identifier')) - raise "feature is no literal" unless feature_literal.is_a?(Redland::Literal) - # PENDING: to be able to recreate literal nodes for features, the datatype is stored - @@feature_datatype = feature_literal.datatype - features << feature_literal.value - end - LOGGER.debug "loaded "+compounds.size.to_s+" compounds and "+features.size.to_s+" features" + # feature values are not loaded for performance reasons + # loading compounds and features into arrays that are given as params + def load_dataset( compounds, features ) + + @model.subjects(node('type'), node('Compound')).each do |compound| + compounds << get_value(compound) + end + @model.subjects(node('type'), node('Feature')).each do |feature| + features << get_value(feature) end + LOGGER.debug "loaded "+compounds.size.to_s+" compounds and "+features.size.to_s+" features" + end - # loading feature values for the specified feature - # if feature is nil, all feature values are loaded - # - # general remark on the rdf loading (found out with some testing): - # the search methods (subjects/find) are fast, the time consuming parts is creating resources, - # which cannot be avoided in general (implemented some performance tweaks with uri storing when loading all features) - def load_dataset_feature_values( compounds, data, feature_uri=nil ) - - LOGGER.debug("load feature values"+ ( (feature_uri!=nil)?(" for feature: "+feature_uri):"") ) + # loading feature values for the specified feature + # if feature is nil, all feature values are loaded + # + # general remark on the rdf loading (found out with some testing): + # the search methods (subjects/find) are fast, the time consuming parts is creating resources, + # which cannot be avoided in general (implemented some performance tweaks with uri storing when loading all features) + def load_dataset_feature_values( compounds, data, feature_uri=nil ) + + LOGGER.debug("load feature values"+ ( (feature_uri!=nil)?(" for feature: "+feature_uri):"") ) - # values are stored in the data-hash, hash has a key for each compound - compounds.each{|c| data[c] = [] unless data[c]} - - load_all_features = feature_uri==nil - feature_node = nil - - # create feature node for feature uri if specified - unless load_all_features - feature_literal = Redland::Literal.new(feature_uri,nil,Redland::Uri.new(@@feature_datatype)) - feature_node = @model.subject(node('identifier'), feature_literal) - # remark: solution without creating the literal node: - #@model.subjects(RDF['type'], OT['Feature']).each do |feature| - # f_uri = @model.object(feature, node('identifier')).value - # if feature_uri==f_uri - # feature_node = feature - # break - # end - #end - raise "feature node not found" unless feature_node + # values are stored in the data-hash, hash has a key for each compound + compounds.each{|c| data[c] = [] unless data[c]} + + load_all_features = feature_uri==nil + feature_node = nil + + # create feature node for feature uri if specified + unless load_all_features + feature_node = find_feature(feature_uri) + raise "feature node not found" unless feature_node + end + + count = 0 + + # preformance tweak: store uirs to save some resource init time + compound_uri_store = {} + feature_uri_store = {} + + # search for all feature_value_node with property 'ot_feature' + # feature_node is either nil, i.e. a wildcard or specified + @model.find(nil, node('feature'), feature_node) do |feature_value_node,p,o| + + # get compound_uri by "backtracking" to values node (property is 'values'), then get compound_node via 'compound' + value_nodes = @model.subjects(node('values'),feature_value_node) + raise "more than one value node "+value_nodes.size.to_s unless value_nodes.size==1 + value_node = value_nodes[0] + compound_node = @model.object(value_node, node('compound')) + compound_uri = compound_uri_store[compound_node.to_s] + unless compound_uri + compound_uri = get_value(compound_node) + compound_uri_store[compound_node.to_s] = compound_uri end - count = 0 - - # preformance tweak: store uirs to save some resource init time - compound_uri_store = {} - feature_uri_store = {} - - # search for all feature_value_node with property 'ot_feature' - # feature_node is either nil, i.e. a wildcard or specified - @model.find(nil, node('feature'), feature_node) do |feature_value_node,p,o| - - # get compound_uri by "backtracking" to values node (property is 'values'), then get compound_node via 'compound' - value_nodes = @model.subjects(node('values'),feature_value_node) - raise "more than one value node "+value_nodes.size.to_s unless value_nodes.size==1 - value_node = value_nodes[0] - compound_node = @model.object(value_node, node('compound')) - compound_uri = compound_uri_store[compound_node.to_s] - unless compound_uri - compound_uri = @model.object(compound_node, node('identifier')).to_s - compound_uri_store[compound_node.to_s] = compound_uri - end - - if load_all_features - # if load all features, feautre_uri is not specified, derieve from feature_node - feature_uri = feature_uri_store[o.to_s] - unless feature_uri - feature_literal = @model.object(o, node('identifier')) - raise "feature is no literal" unless feature_literal.is_a?(Redland::Literal) - feature_uri = feature_literal.value - feature_uri_store[o.to_s] = feature_uri - end + if load_all_features + # if load all features, feautre_uri is not specified, derieve from feature_node + feature_uri = feature_uri_store[o.to_s] + unless feature_uri + feature_uri = get_value(o) + feature_uri_store[o.to_s] = feature_uri end - - value_node_type = @model.object(feature_value_node, node('type')) - if (value_node_type == node('FeatureValue')) - value_literal = @model.object( feature_value_node, node('value')) - raise "feature value no literal" unless value_literal.is_a?(Redland::Literal) - - case value_literal.datatype - when /XMLSchema#double/ - data[compound_uri] << {feature_uri => value_literal.value.to_f } - when /XMLSchema#string/ - data[compound_uri] << {feature_uri => value_literal.value } - else - raise "feature value datatype undefined: "+value_literal.datatype - end - else - raise "feature value type not yet implemented "+value_node_type.to_s - end - count += 1 - LOGGER.debug "loaded "+count.to_s+" feature values" if (count%500 == 0) end - LOGGER.debug "loaded "+count.to_s+" feature values" + value_node_type = @model.object(feature_value_node, node('type')) + if (value_node_type == node('FeatureValue')) + value_literal = @model.object( feature_value_node, node('value')) + raise "feature value no literal" unless value_literal.is_a?(Redland::Literal) + data[compound_uri] << {feature_uri => value_literal.get_value } + else + raise "feature value type not yet implemented "+value_node_type.to_s + end + count += 1 + LOGGER.debug "loaded "+count.to_s+" feature values" if (count%500 == 0) + end + + LOGGER.debug "loaded "+count.to_s+" feature values" end @@property_nodes = { "type" => RDF["type"], "about" => RDF["about"], "title" => DC["title"], "creator" => DC["creator"], - "uri" => DC["identifier"], - "identifier" => DC["identifier"], + #"identifier" => DC["identifier"], identifier is deprecated "date" => DC["date"], "format" => DC["format"]} @@ -310,6 +359,7 @@ module OpenTox # * distinguishing ot-properties from dc- and rdf- properties # * caching nodes, as creating nodes is costly def node(name) + raise "dc[identifier] deprecated, use owl.uri" if name=="identifier" n = @@property_nodes[name] unless n n = OT[name] diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index f917e35..187f3a9 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -67,7 +67,7 @@ module OpenTox begin #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect - resource = RestClient::Resource.new(uri,{:timeout => 60, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]}) + resource = RestClient::Resource.new(uri,{:timeout => 60}) #, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]}) if payload result = resource.send(rest_call, payload, headers) elsif headers @@ -76,9 +76,10 @@ module OpenTox result = resource.send(rest_call) end - # result is a string, with the additional filed content_type - res = WrapperResult.new(result.to_s) + # result is a string, with the additional fields content_type and code + res = WrapperResult.new(result.body) res.content_type = result.headers[:content_type] + raise "content-type not set" unless res.content_type res.code = result.code return res if res.code==200 || !wait @@ -118,7 +119,7 @@ module OpenTox res.split("\n").size > 1 #if uri list contains more then one uri, its not a task task = OpenTox::Task.find(res.to_s) if Utils.task_uri?(res) else - raise "unknown content-type for task: "+res.content_type+" content: "+res[0..200] + raise "unknown content-type for task: '"+res.content_type.to_s+"'" #+"' content: "+res[0..200].to_s end LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" diff --git a/lib/task.rb b/lib/task.rb index b686d24..9cfba88 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -10,7 +10,7 @@ module OpenTox class Task # due_to_time is only set in local tasks - TASK_ATTRIBS = [ :uri, :date, :title, :creator, :title, :description, :hasStatus, :percentageCompleted, :resultURI, :due_to_time ] + TASK_ATTRIBS = [ :uri, :date, :title, :creator, :description, :hasStatus, :percentageCompleted, :resultURI, :due_to_time ] TASK_ATTRIBS.each{ |a| attr_accessor(a) } attr_accessor :http_code @@ -134,7 +134,6 @@ module OpenTox rescue => ex RestClientWrapper.raise_uri_error(ex.message, @uri) end - end # returns the task uri @@ -161,6 +160,7 @@ module OpenTox task.completed(result) rescue => ex LOGGER.error "task failed: "+ex.message + #LOGGER.error ": "+ex.backtrace.join("\n") task.error(ex.message) end end diff --git a/lib/utils.rb b/lib/utils.rb index 629404c..6b32421 100644 --- a/lib/utils.rb +++ b/lib/utils.rb @@ -20,11 +20,22 @@ module OpenTox def self.is_uri?(uri) + return false if uri==nil || uri.to_s.size==0 begin - URI::parse(uri) + u = URI::parse(uri) + return (u.scheme!=nil and u.host!=nil) rescue URI::InvalidURIError - false + return false end end end + +# ['rubygems', 'rest_client'].each do |r| +# require r +# end +# ["bla", "google.de", "http://google.de"].each do |u| +# puts u+"? "+Utils.is_uri?(u).to_s +# end + end + -- cgit v1.2.3 From 2911ebe2c818a33513d263654f3a0c609e631404 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 6 May 2010 17:18:15 +0200 Subject: adding ch's test service to yaml --- lib/dataset.rb | 6 ++++-- lib/model.rb | 2 +- lib/task.rb | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index ff07a6f..9304eec 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -15,7 +15,7 @@ module OpenTox def self.find(uri, accept_header=nil) unless accept_header - if uri.match(@@config[:services]["opentox-dataset"]) + if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ accept_header = 'text/x-yaml' else accept_header = "application/rdf+xml" @@ -51,6 +51,8 @@ module OpenTox # returns uri of new dataset def create_new_dataset( new_compounds, new_features, new_title, new_creator ) + raise "no new compounds selected" unless new_compounds and new_compounds.size>0 + # load require features if ((defined? @dirty_features) && (@dirty_features - new_features).size > 0) (@dirty_features - new_features).each{|f| load_feature_values(f)} @@ -62,7 +64,7 @@ module OpenTox dataset.features = new_features dataset.compounds = new_compounds - # Ccopy dataset data for compounds and features + # Copy dataset data for compounds and features # PENDING: why storing feature values in an array? new_compounds.each do |c| data_c = [] diff --git a/lib/model.rb b/lib/model.rb index 684873b..74bb598 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -76,7 +76,7 @@ module OpenTox elsif @uri =~/ambit2/ and @title =~ /pKa/ return false elsif @uri =~/majority/ - return @uri =~ /class/ + return (@uri =~ /class/) != nil else raise "unknown model, uri:'"+@uri.to_s+"' title:'"+@title.to_s+"'" end diff --git a/lib/task.rb b/lib/task.rb index 9cfba88..181b895 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -160,7 +160,7 @@ module OpenTox task.completed(result) rescue => ex LOGGER.error "task failed: "+ex.message - #LOGGER.error ": "+ex.backtrace.join("\n") + LOGGER.error ": "+ex.backtrace.join("\n") task.error(ex.message) end end -- cgit v1.2.3 From d262dbc79c9f5d8e2d74647df52a9c44e1af511d Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 6 May 2010 17:42:03 +0200 Subject: martins modifications merged and adjusted --- Rakefile | 2 +- lib/algorithm.rb | 3 ++- lib/dataset.rb | 4 +++- lib/environment.rb | 2 +- lib/validation.rb | 10 ++++++++-- opentox-ruby-api-wrapper.gemspec | 9 ++++----- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Rakefile b/Rakefile index 2dfb2c6..4c9e00a 100644 --- a/Rakefile +++ b/Rakefile @@ -13,7 +13,7 @@ begin ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets"].each do |dep| gem.add_dependency dep end - ['cucumber','jeweler', "thin"].each do |dep| + ['cucumber','jeweler'].each do |dep| gem.add_development_dependency dep end gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 8083db2..eaf1f7e 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -21,8 +21,9 @@ module OpenTox def self.create_model(params) LOGGER.debug params LOGGER.debug File.basename(__FILE__) + ": creating model" + LOGGER.debug File.join(@@config[:services]["opentox-algorithm"], "lazar") resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") - @uri = resource.post(:dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).chomp + @uri = resource.post(:dataset_uri => params[:dataset_uri], :prediction_feature => params[:prediction_feature], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).body.chomp end def self.uri diff --git a/lib/dataset.rb b/lib/dataset.rb index c513463..3cfe639 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -14,9 +14,10 @@ module OpenTox def self.find(uri) - if uri.match(/webservices.in-silico.ch|localhost|ot.dataset.de|opentox.informatik.uni-freiburg.de/) # try to get YAML first + #if uri.match(/webservices.in-silico.ch|localhost|ot.dataset.de|opentox.informatik.uni-freiburg.de/) # try to get YAML first d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s d.uri = uri unless d.uri +=begin else # get default rdf+xml owl = OpenTox::Owl.from_uri(uri.to_s.strip, "Dataset") @@ -33,6 +34,7 @@ module OpenTox d.compounds.uniq! d.features.uniq! end +=end return d end diff --git a/lib/environment.rb b/lib/environment.rb index b46bf19..29dcbdb 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -46,7 +46,7 @@ before {$sinatra = self unless $sinatra} class Sinatra::Base # overwriting halt to log halts (!= 202) def halt(*response) - LOGGER.error "halt "+response.first.to_s+" "+(response.size>1 ? response[1].to_s : "") if response.first >= 300 + LOGGER.error "halt "+response.first.to_s+" "+(response.size>1 ? response[1].to_s : "") if response and response.first and response.first >= 300 # orig sinatra code: response = response.first if response.length == 1 throw :halt, response diff --git a/lib/validation.rb b/lib/validation.rb index 6fd5704..97aafc4 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -4,8 +4,14 @@ module OpenTox attr_accessor :uri def initialize(params) - resource = RestClient::Resource.new(params[:uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - @uri = resource.post(params).to_s + #resource = RestClient::Resource.new(params[:uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + #@uri = resource.post(params).to_s + call = "curl -X POST " + params.each do |k,v| + call += " -d "+k.to_s+"=\""+v.to_s+"\"" unless k == :uri + end + call += " "+params[:uri] + LOGGER.debug call end def self.crossvalidation(params) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 258ee09..e30b56f 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,10 +9,10 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-03-18} + s.date = %q{2010-05-04} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} - s.executables = ["opentox-install-ubuntu.sh", "opentox-install-debian.sh", "yaml2owl.rb"] + s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] s.extra_rdoc_files = [ "LICENSE", "README.rdoc" @@ -31,11 +31,13 @@ Gem::Specification.new do |s| "lib/config/config_ru.rb", "lib/dataset.rb", "lib/environment.rb", + "lib/features.rb", "lib/helper.rb", "lib/model.rb", "lib/opentox-ruby-api-wrapper.rb", "lib/opentox.owl", "lib/owl.rb", + "lib/rest_client_wrapper.rb", "lib/spork.rb", "lib/task.rb", "lib/tasks/opentox.rb", @@ -67,7 +69,6 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -81,7 +82,6 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) end else s.add_dependency(%q, [">= 0"]) @@ -96,7 +96,6 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From 35eb04149930d4e24fcbd4966d2253465d088860 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 10 May 2010 13:26:58 +0200 Subject: better log message for not running tasks --- lib/task.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/task.rb b/lib/task.rb index 181b895..a907192 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -116,7 +116,7 @@ module OpenTox end end - LOGGER.debug "task no longer running: "+@uri.to_s+", result: "+@resultURI.to_s + LOGGER.debug "Task '"+@hasStatus+"': "+@uri.to_s+", Result: "+@resultURI.to_s end def check_state -- cgit v1.2.3 From 0cf1fbcfae7f618f188f8b44051e5fc0724f8728 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 10 May 2010 18:45:22 +0200 Subject: Validation service integrated --- lib/dataset.rb | 2 +- lib/task.rb | 4 ++-- lib/validation.rb | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 9304eec..e21ccce 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -15,7 +15,7 @@ module OpenTox def self.find(uri, accept_header=nil) unless accept_header - if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ + if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /informatik/ accept_header = 'text/x-yaml' else accept_header = "application/rdf+xml" diff --git a/lib/task.rb b/lib/task.rb index 181b895..8f87f45 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,7 +1,7 @@ LOGGER.progname = File.expand_path(__FILE__) -DEFAULT_TASK_MAX_DURATION = 360 -EXTERNAL_TASK_MAX_DURATION = 120 +DEFAULT_TASK_MAX_DURATION = 3600 +EXTERNAL_TASK_MAX_DURATION = 1200 $self_task=nil diff --git a/lib/validation.rb b/lib/validation.rb index 97aafc4..bd38488 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -5,13 +5,15 @@ module OpenTox def initialize(params) #resource = RestClient::Resource.new(params[:uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - #@uri = resource.post(params).to_s + #@uri = resource.post(params).body + #LOGGER.debug "VALIDATION URI: " + @uri.to_s call = "curl -X POST " params.each do |k,v| - call += " -d "+k.to_s+"=\""+v.to_s+"\"" unless k == :uri + call += " -d "+k.to_s+"=\""+URI.encode(v.to_s)+"\"" unless k == :uri end call += " "+params[:uri] LOGGER.debug call + @uri = `#{call}` end def self.crossvalidation(params) -- cgit v1.2.3 From b5a5b7aab800f1268b675683b345042e901e75e2 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 11 May 2010 15:34:36 +0200 Subject: return pure string when saving --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 9304eec..4099e5e 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -172,7 +172,7 @@ module OpenTox @features.uniq! @compounds.uniq! - OpenTox::RestClientWrapper.post(@@config[:services]["opentox-dataset"],{:content_type => "text/x-yaml"},self.to_yaml).strip + OpenTox::RestClientWrapper.post(@@config[:services]["opentox-dataset"],{:content_type => "text/x-yaml"},self.to_yaml).strip.to_s end =begin -- cgit v1.2.3 From 73d2b2159347d5d2fe4cf9f4a5af0c598707993b Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 11 May 2010 16:30:20 +0200 Subject: fix ip logging, increase task runtime --- lib/environment.rb | 4 ++-- lib/task.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index f89a758..3d4cd69 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -41,7 +41,7 @@ if @@config[:database] end # hack: store sinatra in global var to make url_for and halt methods accessible -before {$sinatra = self unless $sinatra} +before{ $sinatra = self unless $sinatra } class Sinatra::Base # overwriting halt to log halts (!= 202) @@ -79,7 +79,7 @@ class MyLogger < Logger end def format(msg) - pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace+" :: "+ENV['REMOTE_ADDR'].to_s + pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace+" :: "+($sinatra ? $sinatra.request.env['REMOTE_ADDR'] : nil).to_s end def debug(msg) diff --git a/lib/task.rb b/lib/task.rb index a907192..125c0d1 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,6 +1,6 @@ LOGGER.progname = File.expand_path(__FILE__) -DEFAULT_TASK_MAX_DURATION = 360 +DEFAULT_TASK_MAX_DURATION = 480 EXTERNAL_TASK_MAX_DURATION = 120 $self_task=nil -- cgit v1.2.3 From 8db020dc98a2a32b8f6fd69e05019ebc19fcb8f9 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 12 May 2010 10:10:22 +0200 Subject: add ambit regression model --- lib/model.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/model.rb b/lib/model.rb index 74bb598..8c4614f 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -73,7 +73,7 @@ module OpenTox return false elsif @uri =~/tu-muenchen/ and @title =~ /regression|M5P|GaussP/ return false - elsif @uri =~/ambit2/ and @title =~ /pKa/ + elsif @uri =~/ambit2/ and @title =~ /pKa/ || @title =~ /Regression/ return false elsif @uri =~/majority/ return (@uri =~ /class/) != nil -- cgit v1.2.3 From 34e9a01d740780112ff5ce836754f7f51521e969 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 12 May 2010 11:10:26 +0200 Subject: increase time timeout --- lib/task.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/task.rb b/lib/task.rb index 125c0d1..53a5376 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,7 +1,7 @@ LOGGER.progname = File.expand_path(__FILE__) -DEFAULT_TASK_MAX_DURATION = 480 -EXTERNAL_TASK_MAX_DURATION = 120 +DEFAULT_TASK_MAX_DURATION = 500 +EXTERNAL_TASK_MAX_DURATION = 480 $self_task=nil -- cgit v1.2.3 From 1d0c46a9711050e116147437fbb334bd800324f3 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 12 May 2010 12:31:39 +0200 Subject: Modification for new RestClient: body instead of to_s --- Rakefile | 2 +- lib/algorithm.rb | 2 +- lib/config/config_ru.rb | 13 +++-- lib/dataset.rb | 124 +++------------------------------------------- lib/environment.rb | 8 ++- lib/model.rb | 69 +------------------------- lib/task.rb | 7 +-- lib/templates/config.yaml | 58 ++++++++++++++++++++-- 8 files changed, 78 insertions(+), 205 deletions(-) diff --git a/Rakefile b/Rakefile index 4c9e00a..c00a13f 100644 --- a/Rakefile +++ b/Rakefile @@ -10,7 +10,7 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets"].each do |dep| + ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "sinatra-url-for", "sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets","tmail"].each do |dep| gem.add_dependency dep end ['cucumber','jeweler'].each do |dep| diff --git a/lib/algorithm.rb b/lib/algorithm.rb index b573ea3..cc06032 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -22,7 +22,7 @@ module OpenTox LOGGER.debug params LOGGER.debug File.basename(__FILE__) + ": creating model" LOGGER.debug File.join(@@config[:services]["opentox-algorithm"], "lazar") - #resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "text/x-yaml") + #resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") #@uri = resource.post(:dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).chomp @uri = resource.post(:dataset_uri => params[:dataset_uri], :prediction_feature => params[:prediction_feature], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).body.chomp diff --git a/lib/config/config_ru.rb b/lib/config/config_ru.rb index 8470f0e..09fba3b 100644 --- a/lib/config/config_ru.rb +++ b/lib/config/config_ru.rb @@ -18,8 +18,11 @@ set :raise_errors, true end use Rack::ShowExceptions -#use Rack::MailExceptions do |mail| -# mail.to '...@example.com' -# mail.subject '[ERROR] %s' -# mail.smtp MAIL -#end +#if MAIL +# use Rack::MailExceptions do |mail| +# mail.to 'helma@in-silico.ch' +# mail.subject '[ERROR] %s' +# mail.from "toxcreate@in-silico.ch" +# mail.smtp MAIL +# end +#end diff --git a/lib/dataset.rb b/lib/dataset.rb index e21ccce..17f0997 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -15,16 +15,17 @@ module OpenTox def self.find(uri, accept_header=nil) unless accept_header - if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /informatik/ - accept_header = 'text/x-yaml' + #if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /informatik/ + if !@@config[:accept_headers]["opentox-dataset"].grep(/yaml/).empty? + accept_header = 'application/x-yaml' else accept_header = "application/rdf+xml" end end case accept_header - when "text/x-yaml" - d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'text/x-yaml').to_s + when "application/x-yaml" + d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s d.uri = uri unless d.uri when "application/rdf+xml" owl = OpenTox::Owl.from_uri(uri.to_s.strip, "Dataset") @@ -172,122 +173,9 @@ module OpenTox @features.uniq! @compounds.uniq! - OpenTox::RestClientWrapper.post(@@config[:services]["opentox-dataset"],{:content_type => "text/x-yaml"},self.to_yaml).strip + OpenTox::RestClientWrapper.post(@@config[:services]["opentox-dataset"],{:content_type => "application/x-yaml"},self.to_yaml).strip end -=begin - # create/add to entry from uris or Redland::Resources - def add(compound,feature,value) - compound = self.find_or_create_compound compound unless compound.class == Redland::Resource - feature = self.find_or_create_feature feature unless feature.class == Redland::Resource - data_entry = @model.subject OT['compound'], compound - if data_entry.nil? - data_entry = @model.create_resource - dataset = @model.subject(RDF['type'],OT[self.owl_class]) - @model.add dataset, OT['dataEntry'], data_entry - @model.add data_entry, RDF['type'], OT["DataEntry"] - @model.add data_entry, OT['compound'], compound - end - values = @model.create_resource - @model.add data_entry, OT['values'], values - @model.add values, RDF['type'], OT['FeatureValue'] - @model.add values, OT['feature'], feature - @model.add values, OT['value'], value.to_s - end - - def add_tuple(compound,tuple) - compound = self.find_or_create_compound compound unless compound.class == Redland::Resource - data_entry = @model.subject OT['compound'], compound - if data_entry.nil? - data_entry = @model.create_resource - dataset = @model.subject(RDF['type'],OT[self.owl_class]) - @model.add dataset, OT['dataEntry'], data_entry - @model.add data_entry, RDF['type'], OT["DataEntry"] - @model.add data_entry, OT['compound'], compound - end - @model.add data_entry, OT['values'], tuple - end - - def create_tuple(feature,t) - feature = self.find_or_create_feature feature unless feature.class == Redland::Resource - tuple = @model.create_resource - @model.add tuple, RDF['type'], OT["Tuple"] - @model.add tuple, OT['feature'], feature - t.each do |name,value| - f = self.find_or_create_feature name unless name.class == Redland::Resource - complex_value = @model.create_resource - feature = self.find_or_create_feature(name) - @model.add tuple, OT['complexValue'], complex_value - @model.add complex_value, RDF['type'], OT["FeatureValue"] - @model.add complex_value, OT['feature'], f - @model.add complex_value, OT['value'], value.to_s - end - - tuple - end - - # find or create a new compound and return the resource - def find_or_create_compound(uri) - compound = @model.subject(DC["identifier"], uri) - if compound.nil? - compound = @model.create_resource(uri) - @model.add compound, RDF['type'], OT["Compound"] - @model.add compound, DC["identifier"], uri - end - compound - end - - # find or create a new feature and return the resource - def find_or_create_feature(uri) - feature = @model.subject(DC["identifier"], uri) - if feature.nil? - feature = @model.create_resource(uri) - @model.add feature, RDF['type'], OT["Feature"] - @model.add feature, DC["identifier"], uri - @model.add feature, DC["title"], File.basename(uri).split(/#/)[1] - @model.add feature, DC['source'], uri - end - feature - end - - def self.create(data, content_type = 'application/rdf+xml') - resource = RestClient::Resource.new(@@config[:services]["opentox-dataset"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - uri = resource.post data, :content_type => content_type - dataset = Dataset.new - dataset.read uri.chomp.to_s - dataset - end - - def features - features = [] - @model.subjects(RDF['type'], OT["Feature"]).each do |feature_node| - features << @model.object(feature_node, DC["identifier"])# - end - features - end - - def compounds - compounds = [] - @model.subjects(RDF['type'], OT["Compound"]).each do |compound_node| - compounds << @model.object(compound_node, DC["identifier"]).to_s - end - compounds - end - - # Delete a dataset - def delete - resource = RestClient::Resource.new(@uri, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.delete - end - - def to_owl - end - - def from_owl - end - -=end - def init_dirty_features(owl) @dirty_features = @features @owl = owl diff --git a/lib/environment.rb b/lib/environment.rb index 44efd6e..c112669 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -40,8 +40,8 @@ if @@config[:database] end end -# mail -#load File.join config_dir,"mail.rb" +# mail for error messages +load File.join config_dir,"mail.rb" if File.exists?(File.join config_dir,"mail.rb") # hack: store sinatra in global var to make url_for and halt methods accessible before {$sinatra = self unless $sinatra} @@ -136,3 +136,7 @@ XML = Redland::Namespace.new 'http://www.w3.org/2001/XMLSchema#' # Regular expressions for parsing classification data TRUE_REGEXP = /^(true|active|$1^)/ FALSE_REGEXP = /^(false|inactive|$0^)/ + +# Task durations +DEFAULT_TASK_MAX_DURATION = @@config[:default_task_max_duration] +EXTERNAL_TASK_MAX_DURATION = @@config[:external_task_max_duration] diff --git a/lib/model.rb b/lib/model.rb index 74bb598..3fb713f 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -102,79 +102,12 @@ module OpenTox def save @features.uniq! resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.post(self.to_yaml, :content_type => "text/x-yaml").chomp.to_s + resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s end def self.find_all RestClientWrapper.get(@@config[:services]["opentox-model"]).chomp.split("\n") end -=begin - - # Predict a compound - def predict(compound) - # nicht absichern?? - resource = RestClient::Resource.new(@uri, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.post(:compound_uri => compound.uri) - end - - def self.base_uri - File.join @@config[:services]["opentox-model"],'lazar' - end - - def self.create(data) - resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.post(data, :content_type => "text/x-yaml").chomp.to_s - end - - def delete - resource = RestClient::Resource.new(self.uri, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.delete - #RestClient.delete @uri if @uri - #RestClient.delete model.task_uri if model.task_uri - end - -# def self.create(task) -# @uri = RestClient.post(@@config[:services]["opentox-model"], :task_uri => task.uri) -# end - -# def yaml=(data) -# RestClient.put(@@uri, data, :content_type => "text/x-yaml").to_s -# end - - def endpoint - YAML.load(RestClient.get(uri))[:endpoint] - end - - def algorithm=(algorithm) - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.add me, OT['algorithm'], Redland::Uri.new(algorithm) # untyped individual comes from this line, why?? - @model.add Redland::Uri.new(algorithm), RDF['type'], OT['Algorithm'] - end - - def trainingDataset=(trainingDataset) - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.add me, OT['trainingDataset'], Redland::Uri.new(trainingDataset) # untyped individual comes from this line, why?? - @model.add Redland::Uri.new(trainingDataset), RDF['type'], OT['Dataset'] - end - - def dependentVariables=(dependentVariables) - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.add me, OT['dependentVariables'], Redland::Uri.new(dependentVariables) # untyped individual comes from this line, why?? - @model.add Redland::Uri.new(dependentVariables), RDF['type'], OT['Feature'] - end - - def independentVariables=(independentVariables) - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.add me, OT['independentVariables'], Redland::Uri.new(independentVariables) # untyped individual comes from this line, why?? - @model.add Redland::Uri.new(independentVariables), RDF['type'], OT['Feature'] - end - - def predictedVariables=(predictedVariables) - me = @model.subject(RDF['type'],OT[self.owl_class]) - @model.add me, OT['predictedVariables'], Redland::Uri.new(predictedVariables) # untyped individual comes from this line, why?? - @model.add Redland::Uri.new(predictedVariables), RDF['type'], OT['Feature'] - end -=end end end end diff --git a/lib/task.rb b/lib/task.rb index 8f87f45..66d39f4 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,8 +1,5 @@ LOGGER.progname = File.expand_path(__FILE__) -DEFAULT_TASK_MAX_DURATION = 3600 -EXTERNAL_TASK_MAX_DURATION = 1200 - $self_task=nil module OpenTox @@ -40,14 +37,14 @@ module OpenTox end def reload - result = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, false)#'text/x-yaml'}) + result = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, false)#'application/x-yaml'}) @http_code = result.code reload_from_data(result, result.content_type, uri) end def reload_from_data( data, content_type, base_uri ) case content_type - when /text\/x-yaml/ + when /yaml/ task = YAML.load data TASK_ATTRIBS.each do |a| raise "task yaml data invalid, key missing: "+a.to_s unless task.has_key?(a) diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index ad7c4ab..e8084bd 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -1,13 +1,25 @@ # Example configuration for OpenTox, please adjust to your settings # +# Database setup: +# +# Example MySql: +# +# :database: +# :adapter: mysql +# :database: production +# :username: production +# :password: your_password +# :host: localhost +# # Example 1: Using external test services # # :services: -# opentox-compound: "http://webservices.in-silico.ch/test/compound/" -# opentox-dataset: "http://webservices.in-silico.ch/test/dataset/" -# opentox-algorithm: "http://webservices.in-silico.ch/test/algorithm/" -# opentox-model: "http://webservices.in-silico.ch/test/model/" -# opentox-task: "http://webservices.in-silico.ch/test/task/" +# opentox-compound: "http://webservices.in-silico.ch/compound/" +# opentox-dataset: "http://webservices.in-silico.ch/dataset/" +# opentox-algorithm: "http://webservices.in-silico.ch/algorithm/" +# opentox-model: "http://webservices.in-silico.ch/model/" +# opentox-task: "http://webservices.in-silico.ch/task/" +# opentox-validation: "http://opentox.informatik.uni-freiburg.de/validation/" # # Example 2: Using local services # :base_dir: /home/ch/webservices @@ -18,3 +30,39 @@ # opentox-algorithm: "http://localhost:4002/" # opentox-model: "http://localhost:4003/" # opentox-task: "http://localhost:4004/" +# opentox-validation: "http://opentox.informatik.uni-freiburg.de/validation/" +# +# Accept headers: +# +# :accept_headers: +# opentox-compound: +# - "chemical/x-daylight-smiles" +# - "chemical/x-inchi" +# - "chemical/x-mdl-sdfile" +# - "image/gif" +# - "text/plain" +# opentox-dataset: +# - "application/x-yaml" +# - "text/x-yaml" +# - "application/rdf+xml" +# opentox-algorithm: +# - "application/x-yaml" +# - "text/x-yaml" +# - "application/rdf+xml" +# opentox-model: +# - "application/x-yaml" +# - "text/x-yaml" +# - "application/rdf+xml" +# opentox-task: +# - "application/x-yaml" +# - "text/x-yaml" +# - "application/rdf+xml" +# opentox-validation: +# - "application/x-yaml" +# - "text/x-yaml" +# - "application/rdf+xml" + +# Timeouts: +# +# :default_task_max_duration: 3600 +# :external_task_max_duration: 3600 -- cgit v1.2.3 From 8d008b855f8c98ea076340586250f6eb061b2920 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 12 May 2010 12:38:09 +0200 Subject: github gems removed --- bin/opentox-install-ubuntu.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/opentox-install-ubuntu.sh b/bin/opentox-install-ubuntu.sh index 75faff7..8bab138 100755 --- a/bin/opentox-install-ubuntu.sh +++ b/bin/opentox-install-ubuntu.sh @@ -90,9 +90,9 @@ sudo apt-get install postgresql-server-dev-8.4 | tee -a $INSTALLLOG #echo "Installing gems jeweler sinatra emk-sinatra-url-for dm-core cehoffman-sinatra-respond_to rest-client rack-contrib thin cucumber datamapper data_objects do_sqlite3 rinruby" sudo gem install jeweler | tee -a $INSTALLLOG sudo gem install sinatra | tee -a $INSTALLLOG -sudo gem install emk-sinatra-url-for -s http://gems.github.com | tee -a $INSTALLLOG +sudo gem install sinatra-url-for | tee -a $INSTALLLOG sudo gem install dm-core | tee -a $INSTALLLOG -sudo gem install cehoffman-sinatra-respond_to -s http://gems.github.com | tee -a $INSTALLLOG +sudo gem install sinatra-respond_to | tee -a $INSTALLLOG sudo gem install rest-client | tee -a $INSTALLLOG sudo gem install rack-contrib | tee -a $INSTALLLOG sudo gem install thin | tee -a $INSTALLLOG -- cgit v1.2.3 From 188a48d022fe9f518dd8a42fbef7c565cbcf9fe7 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 12 May 2010 12:38:55 +0200 Subject: Version bump to 1.5.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 88c5fb8..bc80560 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4.0 +1.5.0 -- cgit v1.2.3 From 729c84cec1b4c32b69417e8d55762c698cc1bcd6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 12 May 2010 12:41:43 +0200 Subject: new gemspec generated --- opentox-ruby-api-wrapper.gemspec | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index e30b56f..c905d77 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.4.0" + s.version = "1.5.0" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-05-04} + s.date = %q{2010-05-12} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] @@ -62,11 +62,12 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else @@ -75,11 +76,12 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end @@ -89,11 +91,12 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end -- cgit v1.2.3 From 684e7ef922bcd4f442f20141b8265b8ff034d7a5 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 12 May 2010 13:09:17 +0200 Subject: emk-sinatra-url-for reintroduced (not available on gemcutter) --- Rakefile | 2 +- bin/opentox-install-ubuntu.sh | 2 +- opentox-ruby-api-wrapper.gemspec | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Rakefile b/Rakefile index c00a13f..4948efe 100644 --- a/Rakefile +++ b/Rakefile @@ -10,7 +10,7 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "sinatra-url-for", "sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets","tmail"].each do |dep| + ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets","tmail"].each do |dep| gem.add_dependency dep end ['cucumber','jeweler'].each do |dep| diff --git a/bin/opentox-install-ubuntu.sh b/bin/opentox-install-ubuntu.sh index 8bab138..ae4807d 100755 --- a/bin/opentox-install-ubuntu.sh +++ b/bin/opentox-install-ubuntu.sh @@ -90,7 +90,7 @@ sudo apt-get install postgresql-server-dev-8.4 | tee -a $INSTALLLOG #echo "Installing gems jeweler sinatra emk-sinatra-url-for dm-core cehoffman-sinatra-respond_to rest-client rack-contrib thin cucumber datamapper data_objects do_sqlite3 rinruby" sudo gem install jeweler | tee -a $INSTALLLOG sudo gem install sinatra | tee -a $INSTALLLOG -sudo gem install sinatra-url-for | tee -a $INSTALLLOG +sudo gem install emk-sinatra-url-for -s http://gems.github.com | tee -a $INSTALLLOG sudo gem install dm-core | tee -a $INSTALLLOG sudo gem install sinatra-respond_to | tee -a $INSTALLLOG sudo gem install rest-client | tee -a $INSTALLLOG diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index c905d77..de5a50b 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -49,7 +49,7 @@ Gem::Specification.new do |s| s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} s.rdoc_options = ["--charset=UTF-8"] s.require_paths = ["lib"] - s.rubygems_version = %q{1.3.5} + s.rubygems_version = %q{1.3.6} s.summary = %q{Ruby wrapper for the OpenTox REST API} if s.respond_to? :specification_version then @@ -62,7 +62,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) @@ -76,7 +76,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -91,7 +91,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) -- cgit v1.2.3 From cec1def5fb3e9c726dde0a69328540806b214fbf Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 12 May 2010 16:31:25 +0200 Subject: add integer and datetime conversion to literals --- lib/owl.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/owl.rb b/lib/owl.rb index 671220b..e9ddcbf 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -32,6 +32,7 @@ class Redland::Literal @@type_date = XML["date"].uri @@type_boolean = XML["boolean"].uri @@type_datetime = XML["dateTime"].uri + @@type_integer = XML["integer"].uri # parses value according to datatype uri def self.parse_value(string_value, datatype_uri) @@ -54,6 +55,8 @@ class Redland::Literal return string_value #PENDING date as string? when @@type_datetime.to_s return string_value #PENDING date as string? + when @@type_integer.to_s + return string_value.to_i else raise "unknown literal datatype: '"+datatype_uri.to_s+"', value is "+string_value end @@ -74,6 +77,10 @@ class Redland::Literal return @@type_float elsif value.is_a?(TrueClass) or value.is_a?(FalseClass) return @@type_boolean + elsif value.is_a?(Integer) + return @@type_integer + elsif value.is_a?(DateTime) + return @@type_datetime else raise "illegal datatype: "+value.class.to_s+" "+value.to_s end -- cgit v1.2.3 From a266f6e2ec0e083d9c42be4ec6f6e35c5bf2d137 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 12 May 2010 18:07:49 +0200 Subject: make error handling easier --- lib/rest_client_wrapper.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 187f3a9..8e1beb4 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -90,8 +90,6 @@ module OpenTox raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200 return res - rescue RestClient::RequestFailed => ex - do_halt ex.http_code,ex.http_body,uri,headers,payload rescue RestClient::RequestTimeout => ex do_halt 408,ex.message,uri,headers,payload rescue => ex -- cgit v1.2.3 From 61475e273035cb1128033d57ff464a00585281f2 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 14 May 2010 11:25:03 +0200 Subject: remove ambit hack, add accept-header for model prediction --- lib/model.rb | 8 +------- lib/owl.rb | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 8c4614f..9573450 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -44,12 +44,6 @@ module OpenTox def self.build( algorithm_uri, algorithm_params ) - if algorithm_uri =~ /ambit2/ - LOGGER.warn "Ambit hack, replacing 'prediction_feature' with 'target'" - algorithm_params[:target] = algorithm_params[:prediction_feature] - algorithm_params.delete(:prediction_feature) - end - LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s LOGGER.debug "Build model done: "+uri.to_s @@ -60,7 +54,7 @@ module OpenTox def predict_dataset( dataset_uri ) LOGGER.debug "Predict dataset: "+dataset_uri.to_s+" with model "+@uri.to_s - uri = RestClientWrapper.post(@uri, {:dataset_uri=>dataset_uri}) + uri = RestClientWrapper.post(@uri, {:accept => "text/uri-list", :dataset_uri=>dataset_uri}) RestClientWrapper.raise_uri_error("Prediciton result no dataset uri: "+uri.to_s, @uri, {:dataset_uri=>dataset_uri} ) unless Utils.dataset_uri?(uri) uri end diff --git a/lib/owl.rb b/lib/owl.rb index e9ddcbf..d58c8c3 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -362,7 +362,7 @@ module OpenTox "date" => DC["date"], "format" => DC["format"]} - # this method has to purposes: + # this method has two purposes: # * distinguishing ot-properties from dc- and rdf- properties # * caching nodes, as creating nodes is costly def node(name) -- cgit v1.2.3 From 5d0d82a2d8eaf1f13db84ba8b5beffaede5bc50a Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 14 May 2010 12:08:16 +0200 Subject: add model to classfication? hack --- lib/model.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/model.rb b/lib/model.rb index 9573450..3553919 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -67,7 +67,7 @@ module OpenTox return false elsif @uri =~/tu-muenchen/ and @title =~ /regression|M5P|GaussP/ return false - elsif @uri =~/ambit2/ and @title =~ /pKa/ || @title =~ /Regression/ + elsif @uri =~/ambit2/ and @title =~ /pKa/ || @title =~ /Regression|Caco/ return false elsif @uri =~/majority/ return (@uri =~ /class/) != nil -- cgit v1.2.3 From cee11eff66938cb65b817ab9595f4386ce5a8eeb Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 14 May 2010 17:44:35 +0200 Subject: debug hacks --- lib/utils.rb | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/utils.rb b/lib/utils.rb index 6b32421..3279c29 100644 --- a/lib/utils.rb +++ b/lib/utils.rb @@ -28,8 +28,26 @@ module OpenTox return false end end - end + def self.try_again(times=5) + count = 0 + while (true) + begin + return yield + rescue => ex + count += 1 + if count Date: Sun, 16 May 2010 17:16:05 +0200 Subject: add check for data when creating new dataset --- lib/dataset.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 4099e5e..aea12b5 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -51,6 +51,7 @@ module OpenTox # returns uri of new dataset def create_new_dataset( new_compounds, new_features, new_title, new_creator ) + LOGGER.debug "create new dataset with "+new_compounds.size.to_s+"/"+compounds.size.to_s+" compounds" raise "no new compounds selected" unless new_compounds and new_compounds.size>0 # load require features @@ -68,6 +69,7 @@ module OpenTox # PENDING: why storing feature values in an array? new_compounds.each do |c| data_c = [] + raise "no data for compound '"+c.to_s+"'" if @data[c]==nil @data[c].each do |d| m = {} new_features.each do |f| @@ -75,7 +77,6 @@ module OpenTox end data_c << m end - dataset.data[c] = data_c end return dataset.save -- cgit v1.2.3 From 6b8e7eed61c4f8e2585062c92a57a04b02b0d00e Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 17 May 2010 12:00:32 +0200 Subject: get dataset as yaml --- lib/dataset.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index aea12b5..e506305 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -15,13 +15,12 @@ module OpenTox def self.find(uri, accept_header=nil) unless accept_header - if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ + if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /in-silico.ch/ accept_header = 'text/x-yaml' else accept_header = "application/rdf+xml" end end - case accept_header when "text/x-yaml" d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'text/x-yaml').to_s -- cgit v1.2.3 From fff8f16567766a6abbf77b734c194e563891542d Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 17 May 2010 17:56:01 +0200 Subject: increase timeout --- lib/task.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/task.rb b/lib/task.rb index 53a5376..f637588 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,7 +1,7 @@ LOGGER.progname = File.expand_path(__FILE__) -DEFAULT_TASK_MAX_DURATION = 500 -EXTERNAL_TASK_MAX_DURATION = 480 +DEFAULT_TASK_MAX_DURATION = 36000 #10h +EXTERNAL_TASK_MAX_DURATION = 36000 #10h $self_task=nil @@ -40,7 +40,11 @@ module OpenTox end def reload - result = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, false)#'text/x-yaml'}) + if uri=~ /188.40.32.88/ || uri=~/in-silico.ch/ + result = RestClientWrapper.get(uri, {:accept => 'text/x-yaml'}, false) + else + result = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, false) + end @http_code = result.code reload_from_data(result, result.content_type, uri) end -- cgit v1.2.3 From ea568efec0da52767016dea7f3b56f7747eafe7d Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 18 May 2010 11:42:39 +0200 Subject: new configuration template --- lib/templates/config.yaml | 88 +++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index e8084bd..3b97983 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -4,12 +4,12 @@ # # Example MySql: # -# :database: -# :adapter: mysql -# :database: production -# :username: production -# :password: your_password -# :host: localhost + :database: + :adapter: mysql + :database: production + :username: root + :password: opentox + :host: localhost # # Example 1: Using external test services # @@ -22,47 +22,47 @@ # opentox-validation: "http://opentox.informatik.uni-freiburg.de/validation/" # # Example 2: Using local services -# :base_dir: /home/ch/webservices -# :webserver: thin -# :services: -# opentox-compound: "http://localhost:4000/" -# opentox-dataset: "http://localhost:4001/" -# opentox-algorithm: "http://localhost:4002/" -# opentox-model: "http://localhost:4003/" -# opentox-task: "http://localhost:4004/" -# opentox-validation: "http://opentox.informatik.uni-freiburg.de/validation/" + :base_dir: /home/ist/webservices + :webserver: passenger + :services: + opentox-compound: "http://localhost/compound/" + opentox-dataset: "http://localhost/dataset/" + opentox-algorithm: "http://localhost/algorithm/" + opentox-model: "http://localhost/model/" + opentox-task: "http://localhost/task/" + opentox-validation: "http://opentox.informatik.uni-freiburg.de/validation/" # # Accept headers: # -# :accept_headers: -# opentox-compound: -# - "chemical/x-daylight-smiles" -# - "chemical/x-inchi" -# - "chemical/x-mdl-sdfile" -# - "image/gif" -# - "text/plain" -# opentox-dataset: -# - "application/x-yaml" -# - "text/x-yaml" -# - "application/rdf+xml" -# opentox-algorithm: -# - "application/x-yaml" -# - "text/x-yaml" -# - "application/rdf+xml" -# opentox-model: -# - "application/x-yaml" -# - "text/x-yaml" -# - "application/rdf+xml" -# opentox-task: -# - "application/x-yaml" -# - "text/x-yaml" -# - "application/rdf+xml" -# opentox-validation: -# - "application/x-yaml" -# - "text/x-yaml" -# - "application/rdf+xml" + :accept_headers: + opentox-compound: + - "chemical/x-daylight-smiles" + - "chemical/x-inchi" + - "chemical/x-mdl-sdfile" + - "image/gif" + - "text/plain" + opentox-dataset: + - "application/x-yaml" + - "text/x-yaml" + - "application/rdf+xml" + opentox-algorithm: + - "application/x-yaml" + - "text/x-yaml" + - "application/rdf+xml" + opentox-model: + - "application/x-yaml" + - "text/x-yaml" + - "application/rdf+xml" + opentox-task: + - "application/x-yaml" + - "text/x-yaml" + - "application/rdf+xml" + opentox-validation: + - "application/x-yaml" + - "text/x-yaml" + - "application/rdf+xml" # Timeouts: # -# :default_task_max_duration: 3600 -# :external_task_max_duration: 3600 + :default_task_max_duration: 3600 + :external_task_max_duration: 3600 -- cgit v1.2.3 From 290e8a4f50009c45f9e5f30269c92899edc619b7 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 18 May 2010 11:48:49 +0200 Subject: Version bump to 1.5.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index bc80560..26ca594 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.0 +1.5.1 -- cgit v1.2.3 From 27228581298dc17a8adf83318fd824b3c5131b80 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 18 May 2010 11:49:41 +0200 Subject: new gemspec --- opentox-ruby-api-wrapper.gemspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index de5a50b..4a2e55f 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.5.0" + s.version = "1.5.1" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-05-12} + s.date = %q{2010-05-18} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] -- cgit v1.2.3 From df1c59a593a9ec3aa6defe170ee8b05fdbd7ece3 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 20 May 2010 10:30:19 +0200 Subject: Version bump to 1.5.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 26ca594..4cda8f1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.1 +1.5.2 -- cgit v1.2.3 From 0cfb74221070254f9814680487cd392f1e65ae35 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 20 May 2010 10:31:35 +0200 Subject: roo and google-spreadshett-ruby dependencies added --- Rakefile | 2 +- opentox-ruby-api-wrapper.gemspec | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Rakefile b/Rakefile index 4948efe..0fe329f 100644 --- a/Rakefile +++ b/Rakefile @@ -10,7 +10,7 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets","tmail"].each do |dep| + ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets","tmail","roo","spreadsheet", "google-spreadsheet-ruby"].each do |dep| gem.add_dependency dep end ['cucumber','jeweler'].each do |dep| diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 4a2e55f..8ddb705 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.5.1" + s.version = "1.5.2" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-05-18} + s.date = %q{2010-05-20} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] @@ -68,6 +68,9 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else @@ -82,6 +85,9 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end @@ -97,6 +103,9 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end -- cgit v1.2.3 From 26056e7e835e3aff7fb0ed342ca8c58a2bfe6562 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 20 May 2010 17:14:29 +0200 Subject: missing gem dependencies added --- Rakefile | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 0fe329f..1d9a184 100644 --- a/Rakefile +++ b/Rakefile @@ -10,7 +10,28 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets","tmail","roo","spreadsheet", "google-spreadsheet-ruby"].each do |dep| + [ "sinatra", + "emk-sinatra-url-for", + "sinatra-respond_to", + "sinatra-static-assets", + "dm-more", + "dm-core", + "rest-client", + "rack", + "rack-contrib", + "rack-flash", + "nokogiri", + "rubyzip", + "builder", + "do_mysql", + "data_objects", + "roo", + "spreadsheet", + "google-spreadsheet-ruby", + "tmail", + "haml" + + ].each do |dep| gem.add_dependency dep end ['cucumber','jeweler'].each do |dep| -- cgit v1.2.3 From e16ce8cd18712dc0653ff05018d5d4b4085102c7 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 21 May 2010 12:38:30 +0200 Subject: exception mailer added --- lib/config/config_ru.rb | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/lib/config/config_ru.rb b/lib/config/config_ru.rb index 09fba3b..8de82cb 100644 --- a/lib/config/config_ru.rb +++ b/lib/config/config_ru.rb @@ -18,11 +18,33 @@ set :raise_errors, true end use Rack::ShowExceptions -#if MAIL -# use Rack::MailExceptions do |mail| -# mail.to 'helma@in-silico.ch' -# mail.subject '[ERROR] %s' -# mail.from "toxcreate@in-silico.ch" -# mail.smtp MAIL -# end -#end +if MAIL + + # monkeypatch with the original method + # strangely enough my mailserver returns "Connection refused - connect(2)" errors without this patch + module Rack + class MailExceptions + + def send_notification(exception, env) + mail = generate_mail(exception, env) + smtp = config[:smtp] + env['mail.sent'] = true + return if smtp[:server] == 'example.com' + + Net::SMTP.start smtp[:server], smtp[:port], smtp[:domain], smtp[:user_name], smtp[:password], smtp[:authentication] do |server| + mail.to.each do |recipient| + server.send_message mail.to_s, mail.from, recipient + end + end + end + end + end + + + use Rack::MailExceptions do |mail| + mail.to 'helma@in-silico.ch' + mail.subject '[ERROR] %s' + mail.from "toxcreate@in-silico.ch" + mail.smtp MAIL + end +end -- cgit v1.2.3 From 0bb14a5a6a9d3da6fef4f7f0f7d7f0ad69d7d1ab Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 21 May 2010 12:38:53 +0200 Subject: Version bump to 1.5.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 4cda8f1..8af85be 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.2 +1.5.3 -- cgit v1.2.3 From 147a45ce7336959777639d15a4c37fbe24375d97 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 21 May 2010 12:42:08 +0200 Subject: opentox-ruby-api-wrapper bumped to 1.5.3 --- opentox-ruby-api-wrapper.gemspec | 58 ++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 8ddb705..5578558 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.5.2" + s.version = "1.5.3" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-05-20} + s.date = %q{2010-05-21} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] @@ -58,54 +58,72 @@ Gem::Specification.new do |s| if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end else s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end -- cgit v1.2.3 From d5eea102ff343804dde1ccd254bc570596341a89 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 21 May 2010 15:55:17 +0200 Subject: dynamic From: address from mailer --- lib/compound.rb | 4 +++- lib/config/config_ru.rb | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index cc29fc5..6ab78e0 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -18,7 +18,9 @@ module OpenTox @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:name] # paranoid URI encoding to keep SMILES charges and brackets - @inchi = RestClientWrapper.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").chomp + @inchi = RestClient.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").body.chomp + # this was too hard for me to debug and leads to additional errors (ch) + #@inchi = RestClientWrapper.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").chomp @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:uri] @uri = params[:uri] diff --git a/lib/config/config_ru.rb b/lib/config/config_ru.rb index 8de82cb..34dfdf1 100644 --- a/lib/config/config_ru.rb +++ b/lib/config/config_ru.rb @@ -41,10 +41,11 @@ if MAIL end + require "socket" use Rack::MailExceptions do |mail| - mail.to 'helma@in-silico.ch' + mail.to MAIL[:user_name] mail.subject '[ERROR] %s' - mail.from "toxcreate@in-silico.ch" + mail.from "#{Socket.gethostname}@#{MAIL[:domain]}" mail.smtp MAIL end end -- cgit v1.2.3 From 8666a0723af4f8c6ba8e9f7f78463cc08b31de50 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 21 May 2010 16:42:17 +0200 Subject: Version bump to 1.5.4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8af85be..94fe62c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.3 +1.5.4 -- cgit v1.2.3 From b68b7d4d4902dd844d5ebb8e0afc0165f134f5e2 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 21 May 2010 16:47:50 +0200 Subject: opentox-api-wrapper bumped to 1.5.4 --- opentox-ruby-api-wrapper.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 5578558..a6e64f0 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.5.3" + s.version = "1.5.4" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] -- cgit v1.2.3 From ae96cc17613281d053cea06f4adbb98c1a3afe8f Mon Sep 17 00:00:00 2001 From: ch Date: Fri, 21 May 2010 17:42:54 +0200 Subject: check for MAIL constant fixed --- lib/config/config_ru.rb | 2 +- opentox-ruby-api-wrapper.gemspec | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/config/config_ru.rb b/lib/config/config_ru.rb index 34dfdf1..3d8dce2 100644 --- a/lib/config/config_ru.rb +++ b/lib/config/config_ru.rb @@ -18,7 +18,7 @@ set :raise_errors, true end use Rack::ShowExceptions -if MAIL +if defined?(MAIL) # monkeypatch with the original method # strangely enough my mailserver returns "Connection refused - connect(2)" errors without this patch diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index a6e64f0..a0841eb 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -12,7 +12,7 @@ Gem::Specification.new do |s| s.date = %q{2010-05-21} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} - s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] + s.executables = ["opentox-install-debian.sh", "opentox-install-ubuntu.sh", "yaml2owl.rb"] s.extra_rdoc_files = [ "LICENSE", "README.rdoc" @@ -49,7 +49,7 @@ Gem::Specification.new do |s| s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} s.rdoc_options = ["--charset=UTF-8"] s.require_paths = ["lib"] - s.rubygems_version = %q{1.3.6} + s.rubygems_version = %q{1.3.5} s.summary = %q{Ruby wrapper for the OpenTox REST API} if s.respond_to? :specification_version then -- cgit v1.2.3 From 8cef3d17122acb24913a6c29fa1829e0f84e0284 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 21 May 2010 18:46:19 +0200 Subject: Version bump to 1.5.5 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 94fe62c..9075be4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.4 +1.5.5 -- cgit v1.2.3 From af7bf8b2845de787fb9d571054fb1ad3b6522dbf Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 21 May 2010 18:46:23 +0200 Subject: opentox-api-wrapper bumped to 1.5.5 --- opentox-ruby-api-wrapper.gemspec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index a0841eb..0eb96d8 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,14 +5,14 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.5.4" + s.version = "1.5.5" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] s.date = %q{2010-05-21} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} - s.executables = ["opentox-install-debian.sh", "opentox-install-ubuntu.sh", "yaml2owl.rb"] + s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] s.extra_rdoc_files = [ "LICENSE", "README.rdoc" @@ -49,7 +49,7 @@ Gem::Specification.new do |s| s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} s.rdoc_options = ["--charset=UTF-8"] s.require_paths = ["lib"] - s.rubygems_version = %q{1.3.5} + s.rubygems_version = %q{1.3.6} s.summary = %q{Ruby wrapper for the OpenTox REST API} if s.respond_to? :specification_version then -- cgit v1.2.3 From 0b108ef887cc014cf5cc4fa25bba40bced1172d6 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 26 May 2010 14:26:42 +0200 Subject: replacing dm-more and dm-core with datamapper --- lib/environment.rb | 4 +++- opentox-ruby-api-wrapper.gemspec | 15 +++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index 3d4cd69..81c7ea2 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -24,7 +24,8 @@ end # database if @@config[:database] - ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types'].each{|lib| require lib } + #['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types'].each{|lib| require lib } + ['datamapper'].each{|lib| require lib } case @@config[:database][:adapter] when /sqlite/i db_dir = File.join(basedir, "db") @@ -128,6 +129,7 @@ RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#' DC = Redland::Namespace.new 'http://purl.org/dc/elements/1.1/' OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#' +#OT = Redland::Namespace.new 'http://ortona.informatik.uni-freiburg.de/opentox.owl#' XML = Redland::Namespace.new 'http://www.w3.org/2001/XMLSchema#' # Regular expressions for parsing classification data diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 258ee09..dffefa6 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,10 +9,10 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-03-18} + s.date = %q{2010-05-26} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} - s.executables = ["opentox-install-ubuntu.sh", "opentox-install-debian.sh", "yaml2owl.rb"] + s.executables = ["yaml2owl.rb", "opentox-install-ubuntu.sh", "opentox-install-debian.sh"] s.extra_rdoc_files = [ "LICENSE", "README.rdoc" @@ -31,11 +31,13 @@ Gem::Specification.new do |s| "lib/config/config_ru.rb", "lib/dataset.rb", "lib/environment.rb", + "lib/features.rb", "lib/helper.rb", "lib/model.rb", "lib/opentox-ruby-api-wrapper.rb", "lib/opentox.owl", "lib/owl.rb", + "lib/rest_client_wrapper.rb", "lib/spork.rb", "lib/task.rb", "lib/tasks/opentox.rb", @@ -62,8 +64,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) @@ -76,8 +77,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -91,8 +91,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) -- cgit v1.2.3 From d6b16d5853fa03094604db7b548c18ca43c07c01 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 26 May 2010 14:30:28 +0200 Subject: replacing dm-more and dm-core with datamapper --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 2dfb2c6..219bc4d 100644 --- a/Rakefile +++ b/Rakefile @@ -10,7 +10,7 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "dm-more", "dm-core", "sinatra-static-assets"].each do |dep| + ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "datamapper", "sinatra-static-assets"].each do |dep| gem.add_dependency dep end ['cucumber','jeweler', "thin"].each do |dep| -- cgit v1.2.3 From 1b659b288d64292f5bb41a75c9ddbda1d93a55f4 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 26 May 2010 14:53:31 +0200 Subject: reduce external task time --- lib/task.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/task.rb b/lib/task.rb index f637588..0b366b1 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,7 +1,7 @@ LOGGER.progname = File.expand_path(__FILE__) -DEFAULT_TASK_MAX_DURATION = 36000 #10h -EXTERNAL_TASK_MAX_DURATION = 36000 #10h +DEFAULT_TASK_MAX_DURATION = 10*60*60 +EXTERNAL_TASK_MAX_DURATION = 10*60 $self_task=nil -- cgit v1.2.3 From 02b7ade5edd63dfc007b46f1f7bfa340538701d2 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 26 May 2010 15:38:17 +0200 Subject: adding rubygems to require in env --- lib/environment.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/environment.rb b/lib/environment.rb index 81c7ea2..75fdc7e 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -25,7 +25,7 @@ end # database if @@config[:database] #['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types'].each{|lib| require lib } - ['datamapper'].each{|lib| require lib } + ['rubygems', 'datamapper'].each{|lib| require lib } case @@config[:database][:adapter] when /sqlite/i db_dir = File.join(basedir, "db") -- cgit v1.2.3 From 487bed8235064411d15129a797c91bd3b3bda99c Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 26 May 2010 20:04:28 +0200 Subject: increased try agains --- lib/utils.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/utils.rb b/lib/utils.rb index 3279c29..28e114e 100644 --- a/lib/utils.rb +++ b/lib/utils.rb @@ -29,7 +29,7 @@ module OpenTox end end - def self.try_again(times=5) + def self.try_again(times=25) count = 0 while (true) begin @@ -37,7 +37,7 @@ module OpenTox rescue => ex count += 1 if count Date: Thu, 27 May 2010 13:59:32 +0200 Subject: rest task wait time --- lib/environment.rb | 1 + lib/task.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/environment.rb b/lib/environment.rb index 75fdc7e..d24c37d 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -13,6 +13,7 @@ LOG_DIR = File.join(basedir, "log") if File.exist?(config_file) @@config = YAML.load_file(config_file) + raise "could not load config, config file: "+config_file.to_s unless @@config else FileUtils.mkdir_p TMP_DIR FileUtils.mkdir_p LOG_DIR diff --git a/lib/task.rb b/lib/task.rb index 0b366b1..aace2be 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,7 +1,7 @@ LOGGER.progname = File.expand_path(__FILE__) DEFAULT_TASK_MAX_DURATION = 10*60*60 -EXTERNAL_TASK_MAX_DURATION = 10*60 +EXTERNAL_TASK_MAX_DURATION = 10*60*60 $self_task=nil -- cgit v1.2.3 From efca5a3b1b418dab73a914f52ab241c8472d2f4c Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 28 May 2010 10:05:07 +0200 Subject: new wrapper version, remove try_again --- VERSION | 2 +- lib/utils.rb | 17 ----------------- opentox-ruby-api-wrapper.gemspec | 4 ++-- 3 files changed, 3 insertions(+), 20 deletions(-) diff --git a/VERSION b/VERSION index 88c5fb8..d527ad5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4.0 +1.4.4.4 diff --git a/lib/utils.rb b/lib/utils.rb index 28e114e..741fbd6 100644 --- a/lib/utils.rb +++ b/lib/utils.rb @@ -29,23 +29,6 @@ module OpenTox end end - def self.try_again(times=25) - count = 0 - while (true) - begin - return yield - rescue => ex - count += 1 - if count= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-05-26} + s.date = %q{2010-05-27} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["yaml2owl.rb", "opentox-install-ubuntu.sh", "opentox-install-debian.sh"] -- cgit v1.2.3 From bf0a8faa9c08a2c1897545aa7d7150e236d6cdfe Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 31 May 2010 17:26:30 +0200 Subject: remove respond to from dependencies --- Rakefile | 2 +- opentox-ruby-api-wrapper.gemspec | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Rakefile b/Rakefile index 219bc4d..6c7c164 100644 --- a/Rakefile +++ b/Rakefile @@ -10,7 +10,7 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" gem.authors = ["Christoph Helma"] - ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "cehoffman-sinatra-respond_to", "datamapper", "sinatra-static-assets"].each do |dep| + ["sinatra", "rest-client", "rack", "rack-contrib", "rack-flash", "emk-sinatra-url-for", "datamapper", "sinatra-static-assets"].each do |dep| gem.add_dependency dep end ['cucumber','jeweler', "thin"].each do |dep| diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index faff253..18dc1df 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma"] - s.date = %q{2010-05-27} + s.date = %q{2010-05-28} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["yaml2owl.rb", "opentox-install-ubuntu.sh", "opentox-install-debian.sh"] @@ -63,7 +63,6 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) @@ -76,7 +75,6 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -90,7 +88,6 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) -- cgit v1.2.3 From 593ab333363318ffddb00003ac846e8cfa8e6f44 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 1 Jun 2010 10:49:28 +0200 Subject: adjust error handling for big error msgs --- lib/rest_client_wrapper.rb | 18 +++++++++--------- lib/task.rb | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 8e1beb4..83089d0 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -140,15 +140,15 @@ module OpenTox error = [Error.new(code, body, uri, payload, headers)] end -# #debug utility: write error to file -# error_dir = "/tmp/ot_errors" -# FileUtils.mkdir(error_dir) unless File.exist?(error_dir) -# raise "could not create error dir" unless File.exist?(error_dir) and File.directory?(error_dir) -# file_name = "error" -# time=Time.now.strftime("%m.%d.%Y-%H:%M:%S") -# count = 1 -# count+=1 while File.exist?(File.join(error_dir,file_name+"_"+time+"_"+count.to_s)) -# File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body) + #debug utility: write error to file + error_dir = "/tmp/ot_errors" + FileUtils.mkdir(error_dir) unless File.exist?(error_dir) + raise "could not create error dir" unless File.exist?(error_dir) and File.directory?(error_dir) + file_name = "error" + time=Time.now.strftime("%m.%d.%Y-%H:%M:%S") + count = 1 + count+=1 while File.exist?(File.join(error_dir,file_name+"_"+time+"_"+count.to_s)) + File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body) # handle error # we are either in a task, or in sinatra diff --git a/lib/task.rb b/lib/task.rb index aace2be..1d2c4c2 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -78,6 +78,7 @@ module OpenTox end def error(description) + description = description[0..999] if description.to_s.size>1000 RestClientWrapper.put(File.join(@uri,'Error'),{:description => description}) reload end -- cgit v1.2.3 From 0a6f578f5f4a9e3503541dc6b5b9f1c0cfb9e8e0 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 2 Jun 2010 15:45:49 +0200 Subject: change error size restriction --- lib/rest_client_wrapper.rb | 2 +- lib/task.rb | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 83089d0..4f8b0ee 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -9,7 +9,7 @@ module OpenTox def initialize(code, body, uri, payload, headers) self.code = code - self.body = body + self.body = body.to_s[0..1000] self.uri = uri self.payload = payload self.headers = headers diff --git a/lib/task.rb b/lib/task.rb index 1d2c4c2..60c1159 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -78,8 +78,7 @@ module OpenTox end def error(description) - description = description[0..999] if description.to_s.size>1000 - RestClientWrapper.put(File.join(@uri,'Error'),{:description => description}) + RestClientWrapper.put(File.join(@uri,'Error'),{:description => description.to_s[0..2000]}) reload end -- cgit v1.2.3 From f5c6063e757c3728b84cfd61783a9fd616f09c9a Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 9 Jun 2010 13:32:44 +0200 Subject: add time to literal datatypes --- lib/owl.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/owl.rb b/lib/owl.rb index d58c8c3..d6f9cea 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -81,6 +81,8 @@ class Redland::Literal return @@type_integer elsif value.is_a?(DateTime) return @@type_datetime + elsif value.is_a?(Time) + return @@type_datetime else raise "illegal datatype: "+value.class.to_s+" "+value.to_s end -- cgit v1.2.3 From 4902d7d4c2d45ef98d20d5a6269e0dbf3bd01cc4 Mon Sep 17 00:00:00 2001 From: ist Date: Fri, 11 Jun 2010 17:35:10 +0200 Subject: Added occurrence function 'match_all' --- lib/compound.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/compound.rb b/lib/compound.rb index 6ab78e0..7c7c3d8 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -69,6 +69,12 @@ module OpenTox smarts_array.collect{|s| s if match?(s)}.compact end + # AM + # Match an array of smarts features, returns (0)1 for (non)matching features at each pos + def match_all(smarts_array) + smarts_array.collect{|s| match?(s) ? 1 : 0 } + end + def sdf2inchi(sdf) obconversion(sdf,'sdf','inchi') end -- cgit v1.2.3 From 8f3018db36335a22bc72caa3c7a96aac2a95e57c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 15 Jun 2010 16:48:17 +0200 Subject: Version bump to 1.5.6 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9075be4..eac1e0a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.5 +1.5.6 -- cgit v1.2.3 From ba287d744cdc929df7e3ed3986151b813ddf8fb1 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 15 Jun 2010 17:15:35 +0200 Subject: updated for datamapper > 1 --- Rakefile | 27 ++++++++++++----------- lib/environment.rb | 3 ++- opentox-ruby-api-wrapper.gemspec | 46 +++++++++++++++++++++++----------------- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/Rakefile b/Rakefile index 1d9a184..39ec349 100644 --- a/Rakefile +++ b/Rakefile @@ -9,13 +9,12 @@ begin gem.description = %Q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" - gem.authors = ["Christoph Helma"] + gem.authors = ["Christoph Helma, Martin Guetlein"] + # dependencies [ "sinatra", "emk-sinatra-url-for", "sinatra-respond_to", "sinatra-static-assets", - "dm-more", - "dm-core", "rest-client", "rack", "rack-contrib", @@ -23,20 +22,20 @@ begin "nokogiri", "rubyzip", "builder", - "do_mysql", - "data_objects", "roo", "spreadsheet", "google-spreadsheet-ruby", - "tmail", - "haml" - - ].each do |dep| - gem.add_dependency dep - end - ['cucumber','jeweler'].each do |dep| - gem.add_development_dependency dep - end + "tmail" + ].each { |dep| gem.add_dependency dep } + [ "dm-core", + 'dm-serializer', + 'dm-timestamps', + 'dm-types', + 'dm-migrations', + "dm-mysql-adapter" + ].each {|dep| gem.add_dependency dep, ">= 1" } + gem.add_dependency "haml", ">=3" + ['cucumber','jeweler'].each { |dep| gem.add_development_dependency dep } gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] gem.files.include %w(lib/tasks/owl.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/utils.rb, lib/validation.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings diff --git a/lib/environment.rb b/lib/environment.rb index c112669..105f443 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -24,7 +24,7 @@ end # database if @@config[:database] - ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types'].each{|lib| require lib } + ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types', 'dm-migrations' ].each{|lib| require lib } case @@config[:database][:adapter] when /sqlite/i db_dir = File.join(basedir, "db") @@ -106,6 +106,7 @@ end logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" LOGGER = MyLogger.new(logfile,'daily') # daily rotation +LOGGER.level = Logger::WARN if ENV["RACK_ENV"] == 'production' #LOGGER = MyLogger.new(STDOUT) #LOGGER.datetime_format = "%Y-%m-%d %H:%M:%S " diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 0eb96d8..9a7c0c3 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.5.5" + s.version = "1.5.6" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= - s.authors = ["Christoph Helma"] - s.date = %q{2010-05-21} + s.authors = ["Christoph Helma, Martin Guetlein"] + s.date = %q{2010-06-15} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] @@ -49,20 +49,18 @@ Gem::Specification.new do |s| s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} s.rdoc_options = ["--charset=UTF-8"] s.require_paths = ["lib"] - s.rubygems_version = %q{1.3.6} + s.rubygems_version = %q{1.3.7} s.summary = %q{Ruby wrapper for the OpenTox REST API} if s.respond_to? :specification_version then current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION s.specification_version = 3 - if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) @@ -70,13 +68,17 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 3"]) s.add_development_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) else @@ -84,8 +86,6 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -93,13 +93,17 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 3"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end @@ -108,8 +112,6 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -117,13 +119,17 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 3"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) end -- cgit v1.2.3 From e5838e7607533b5087a89949fea15f694f184b17 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 22 Jun 2010 16:18:31 +0200 Subject: inital changes to owl to add type (still outcommented) --- lib/owl.rb | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/owl.rb b/lib/owl.rb index d6f9cea..700e6ee 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -107,7 +107,7 @@ module OpenTox owl = OpenTox::Owl.new owl.ot_class = ot_class owl.root_node = Redland::Resource.new(uri.to_s.strip) - owl.set("type",owl.node(owl.ot_class)) + owl.set("type",owl.node(owl.ot_class)) #,true)) owl end @@ -178,8 +178,9 @@ module OpenTox public def set(name, value, datatype=nil) + raise "uri is no prop, cannot set uri" if name=="uri" - property_node = node(name.to_s) + property_node = node(name.to_s) #, true) begin # delete existing entry t = @model.object(@root_node, property_node) @model.delete @root_node, property_node, t @@ -364,16 +365,30 @@ module OpenTox "date" => DC["date"], "format" => DC["format"]} +# @object_prop = OWL["ObjectProperty"] +# @@type = { "Validation" => OWL["Class"], +# "Model" => OWL["Class"], +# "title" => OWL["AnnotationProperty"], +# "creator" => OWL["AnnotationProperty"], +# "date" => OWL["AnnotationProperty"], +# "format" => OWL["AnnotationProperty"], +# "predictedVariables" => @object_prop} + # this method has two purposes: # * distinguishing ot-properties from dc- and rdf- properties # * caching nodes, as creating nodes is costly - def node(name) + def node(name) #, write_type_to_model=false) raise "dc[identifier] deprecated, use owl.uri" if name=="identifier" n = @@property_nodes[name] unless n n = OT[name] @@property_nodes[name] = n end + +# if write_type_to_model and name!="type" +# raise "no type defined for '"+name+"'" unless @@type[name] +# @model.add n,RDF['type'],@@type[name] +# end return n end -- cgit v1.2.3 From d505f1b33bb823be23728178175c799d2f30fcca Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 25 Jun 2010 20:14:50 +0200 Subject: regression initially working --- lib/environment.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index 105f443..7036951 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -106,12 +106,16 @@ end logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" LOGGER = MyLogger.new(logfile,'daily') # daily rotation -LOGGER.level = Logger::WARN if ENV["RACK_ENV"] == 'production' +case `hostname` +when /ot-dev/ + LOGGER.level = Logger::DEBUG +else + LOGGER.level = Logger::WARN +end #LOGGER = MyLogger.new(STDOUT) #LOGGER.datetime_format = "%Y-%m-%d %H:%M:%S " -#LOGGER.level = Logger::DEBUG if File.exist?(user_file) @@users = YAML.load_file(user_file) -- cgit v1.2.3 From 6fb9ec6db40d25d2892d4d1bb9de33e56979a945 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 28 Jun 2010 17:15:59 +0200 Subject: new wrapper version --- VERSION | 2 +- lib/rest_client_wrapper.rb | 2 +- opentox-ruby-api-wrapper.gemspec | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index eac1e0a..f01291b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.6 +1.5.7 diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 4f8b0ee..1282bee 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -110,7 +110,7 @@ module OpenTox task = nil case res.content_type - when /application\/rdf\+xml|text\/x-yaml/ + when /application\/rdf\+xml|application\/x-yaml/ task = OpenTox::Task.from_data(res, res.content_type, res.code, base_uri) when /text\// raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index d158479..221d53d 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.5.6" + s.version = "1.5.7" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein"] - s.date = %q{2010-06-25} + s.date = %q{2010-06-28} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["yaml2owl.rb", "opentox-install-ubuntu.sh", "opentox-install-debian.sh"] -- cgit v1.2.3 From 818e97b33178f5fe0a0b02b6db26e0b1bcb4a7ec Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 29 Jun 2010 13:24:03 +0200 Subject: enhance model title parsing --- lib/model.rb | 4 +++- lib/templates/config.yaml | 5 ----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index e3ddeb0..b6cef46 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -61,8 +61,10 @@ module OpenTox def classification? #HACK replace with request to ontology server - if @title =~ /lazar classification/ + if @title =~ /(?i)classification/ return true + elsif @title =~ /(?i)regression/ + return false elsif @uri =~/ntua/ and @title =~ /mlr/ return false elsif @uri =~/tu-muenchen/ and @title =~ /regression|M5P|GaussP/ diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index 3b97983..dba0bf3 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -43,23 +43,18 @@ - "text/plain" opentox-dataset: - "application/x-yaml" - - "text/x-yaml" - "application/rdf+xml" opentox-algorithm: - "application/x-yaml" - - "text/x-yaml" - "application/rdf+xml" opentox-model: - "application/x-yaml" - - "text/x-yaml" - "application/rdf+xml" opentox-task: - "application/x-yaml" - - "text/x-yaml" - "application/rdf+xml" opentox-validation: - "application/x-yaml" - - "text/x-yaml" - "application/rdf+xml" # Timeouts: -- cgit v1.2.3 From c024c22038eb2eb16d946132eca908412515c656 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 1 Jul 2010 10:05:36 +0200 Subject: log level moved to config, model type detection updated --- lib/dataset.rb | 10 +++++++--- lib/environment.rb | 11 +++-------- lib/model.rb | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 1254992..fc4502a 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -86,8 +86,10 @@ module OpenTox def get_predicted_class(compound, feature) v = get_value(compound, feature) if v.is_a?(Hash) - if v.has_key?(:classification) - return v[:classification] + k = v.keys.grep("classification") + unless k.empty? + #if v.has_key?(:classification) + return v[k] else return "no classification key" end @@ -107,7 +109,9 @@ module OpenTox def get_prediction_confidence(compound, feature) v = get_value(compound, feature) if v.is_a?(Hash) - if v.has_key?(:confidence) + k = v.keys.grep("confidence") + unless k.empty? + #if v.has_key?(:confidence) return v[:confidence].abs else # PENDING: return nil isntead of raising an exception diff --git a/lib/environment.rb b/lib/environment.rb index ceb3ef8..e37463b 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -107,17 +107,12 @@ end logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" LOGGER = MyLogger.new(logfile,'daily') # daily rotation -case `hostname` -when /ot-dev/ +if @@config[:logger] and @@config[:logger] == "debug" LOGGER.level = Logger::DEBUG else LOGGER.level = Logger::WARN end -#LOGGER = MyLogger.new(STDOUT) -#LOGGER.datetime_format = "%Y-%m-%d %H:%M:%S " - - if File.exist?(user_file) @@users = YAML.load_file(user_file) else @@ -141,8 +136,8 @@ OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#' XML = Redland::Namespace.new 'http://www.w3.org/2001/XMLSchema#' # Regular expressions for parsing classification data -TRUE_REGEXP = /^(true|active|$1^)/ -FALSE_REGEXP = /^(false|inactive|$0^)/ +TRUE_REGEXP = /^(true|active|1|1.0)$/i +FALSE_REGEXP = /^(false|inactive|0|0.0)$/i # Task durations DEFAULT_TASK_MAX_DURATION = @@config[:default_task_max_duration] diff --git a/lib/model.rb b/lib/model.rb index e3ddeb0..f2d7ba5 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -61,7 +61,7 @@ module OpenTox def classification? #HACK replace with request to ontology server - if @title =~ /lazar classification/ + if @title =~ /classification/ return true elsif @uri =~/ntua/ and @title =~ /mlr/ return false -- cgit v1.2.3 From 94363088babbc613f8f49bae587775fde4c72392 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 12 Jul 2010 16:51:07 +0200 Subject: reset formater to undo active-record changes to the logger --- lib/environment.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/environment.rb b/lib/environment.rb index abc7287..312eec4 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -107,6 +107,7 @@ end logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" LOGGER = MyLogger.new(logfile,'daily') # daily rotation +LOGGER.formatter = Logger::Formatter.new #this is neccessary to restore the formating in case active-record is loaded if @@config[:logger] and @@config[:logger] == "debug" LOGGER.level = Logger::DEBUG else -- cgit v1.2.3 From 3fe0e8c735abd2cacc138f075b5a4af0c6359724 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 14 Jul 2010 13:56:50 +0200 Subject: model creation working, validation report generation fails for large datasets --- Rakefile | 3 ++- lib/compound.rb | 13 ++++++++++--- lib/templates/config.yaml | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Rakefile b/Rakefile index 39ec349..b6c6939 100644 --- a/Rakefile +++ b/Rakefile @@ -25,7 +25,8 @@ begin "roo", "spreadsheet", "google-spreadsheet-ruby", - "tmail" + "tmail", + "rinruby" ].each { |dep| gem.add_dependency dep } [ "dm-core", 'dm-serializer', diff --git a/lib/compound.rb b/lib/compound.rb index 7c7c3d8..a293df0 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -1,3 +1,6 @@ +@@cactus_uri="http://cactus.nci.nih.gov/chemical/structure/" +@@ambit_uri="http://ambit.uni-plovdiv.bg:8080/ambit2/depict/cdk?search=" + module OpenTox class Compound #< OpenTox @@ -6,7 +9,6 @@ module OpenTox # Initialize with :uri => uri, :smiles => smiles or :name => name (name can be also an InChI/InChiKey, CAS number, etc) def initialize(params) - @@cactus_uri="http://cactus.nci.nih.gov/chemical/structure/" if params[:smiles] @inchi = smiles2inchi(params[:smiles]) @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) @@ -45,12 +47,17 @@ module OpenTox obconversion(@inchi,'inchi','sdf') end - def image + def gif RestClientWrapper.get("#{@@cactus_uri}#{@inchi}/image") end + def png + RestClientWrapper.get("#{@@ambit_uri}#{smiles}") + end + def image_uri - "#{@@cactus_uri}#{@inchi}/image" + "#{@@ambit_uri}#{smiles}" + #"#{@@cactus_uri}#{@inchi}/image" end # Matchs a smarts string diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index dba0bf3..b367af3 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -30,7 +30,7 @@ opentox-algorithm: "http://localhost/algorithm/" opentox-model: "http://localhost/model/" opentox-task: "http://localhost/task/" - opentox-validation: "http://opentox.informatik.uni-freiburg.de/validation/" + opentox-validation: "http://localhost/validation/" # # Accept headers: # -- cgit v1.2.3 From 947253467e1f3d4968e9b2da2024a18338dfb5d5 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 19 Jul 2010 12:18:17 +0200 Subject: Version bump to 1.6.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f01291b..dc1e644 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.7 +1.6.0 -- cgit v1.2.3 From 16e91c217eab6ebe31834c76429ce10fe15c39ef Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 19 Jul 2010 12:20:37 +0200 Subject: opentox-api-wrapper bumped to 1.6.0 --- opentox-ruby-api-wrapper.gemspec | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 221d53d..6edb865 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,14 +5,14 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.5.7" + s.version = "1.6.0" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein"] - s.date = %q{2010-06-28} + s.date = %q{2010-07-19} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} - s.executables = ["yaml2owl.rb", "opentox-install-ubuntu.sh", "opentox-install-debian.sh"] + s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] s.extra_rdoc_files = [ "LICENSE", "README.rdoc" @@ -72,6 +72,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 1"]) s.add_runtime_dependency(%q, [">= 1"]) s.add_runtime_dependency(%q, [">= 1"]) @@ -97,6 +98,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) @@ -123,6 +125,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) -- cgit v1.2.3 From ecbee16d255010afae8d99a9c70e186eb462c4a8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 19 Jul 2010 17:54:42 +0200 Subject: rjb added to api wrapper, cnonfig template fixed --- Rakefile | 3 +- lib/templates/config.yaml | 82 ++++++++++++++++++++++++----------------------- 2 files changed, 44 insertions(+), 41 deletions(-) diff --git a/Rakefile b/Rakefile index b6c6939..41832bb 100644 --- a/Rakefile +++ b/Rakefile @@ -26,7 +26,8 @@ begin "spreadsheet", "google-spreadsheet-ruby", "tmail", - "rinruby" + "rinruby", + "rjb" ].each { |dep| gem.add_dependency dep } [ "dm-core", 'dm-serializer', diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index b367af3..a833030 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -4,12 +4,12 @@ # # Example MySql: # - :database: - :adapter: mysql - :database: production - :username: root - :password: opentox - :host: localhost +:database: + :adapter: mysql + :database: production + :username: root + :password: opentox + :host: localhost # # Example 1: Using external test services # @@ -22,42 +22,44 @@ # opentox-validation: "http://opentox.informatik.uni-freiburg.de/validation/" # # Example 2: Using local services - :base_dir: /home/ist/webservices - :webserver: passenger - :services: - opentox-compound: "http://localhost/compound/" - opentox-dataset: "http://localhost/dataset/" - opentox-algorithm: "http://localhost/algorithm/" - opentox-model: "http://localhost/model/" - opentox-task: "http://localhost/task/" - opentox-validation: "http://localhost/validation/" +:base_dir: /home/ist/webservices +:webserver: passenger +:services: + opentox-compound: "http://localhost/compound/" + opentox-dataset: "http://localhost/dataset/" + opentox-algorithm: "http://localhost/algorithm/" + opentox-model: "http://localhost/model/" + opentox-task: "http://localhost/task/" + opentox-validation: "http://localhost/validation/" # # Accept headers: # - :accept_headers: - opentox-compound: - - "chemical/x-daylight-smiles" - - "chemical/x-inchi" - - "chemical/x-mdl-sdfile" - - "image/gif" - - "text/plain" - opentox-dataset: - - "application/x-yaml" - - "application/rdf+xml" - opentox-algorithm: - - "application/x-yaml" - - "application/rdf+xml" - opentox-model: - - "application/x-yaml" - - "application/rdf+xml" - opentox-task: - - "application/x-yaml" - - "application/rdf+xml" - opentox-validation: - - "application/x-yaml" - - "application/rdf+xml" +:accept_headers: + opentox-compound: + - "chemical/x-daylight-smiles" + - "chemical/x-inchi" + - "chemical/x-mdl-sdfile" + - "image/gif" + - "text/plain" + opentox-dataset: + - "application/x-yaml" + - "application/rdf+xml" + opentox-algorithm: + - "application/x-yaml" + - "application/rdf+xml" + opentox-model: + - "application/x-yaml" + - "application/rdf+xml" + opentox-task: + - "application/x-yaml" + - "application/rdf+xml" + opentox-validation: + - "application/x-yaml" + - "application/rdf+xml" # Timeouts: -# - :default_task_max_duration: 3600 - :external_task_max_duration: 3600 +:default_task_max_duration: 3600 +:external_task_max_duration: 3600 + +# Uncomment for verbose logging +# :logger: debug -- cgit v1.2.3 From e6ba5d3268827cb065762ee7bd5a1646ef26c770 Mon Sep 17 00:00:00 2001 From: David Vorgrimmler Date: Wed, 21 Jul 2010 10:35:33 +0200 Subject: Added median function --- lib/utils.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/utils.rb b/lib/utils.rb index 741fbd6..a0e0cbe 100644 --- a/lib/utils.rb +++ b/lib/utils.rb @@ -28,6 +28,13 @@ module OpenTox return false end end + + def self.median(array) + return nil if array.empty? + array.sort! + m_pos = array.size / 2 + return array.size % 2 == 1 ? array[m_pos] : (array[m_pos-1] + array[m_pos])/2 + end end -- cgit v1.2.3 From 05084b1127f0d2498240472cca8a475f48f1fcc4 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 22 Jul 2010 10:23:53 +0200 Subject: modifications from first code review meeting --- lib/algorithm.rb | 14 +++--- lib/compound.rb | 8 ++-- lib/dataset.rb | 6 +-- lib/environment.rb | 95 ++++++----------------------------------- lib/model.rb | 8 ++-- lib/opentox-ruby-api-wrapper.rb | 2 +- lib/owl.rb | 8 ++++ lib/task.rb | 4 +- lib/tasks/opentox.rb | 22 +++++----- lib/validation.rb | 2 +- 10 files changed, 54 insertions(+), 115 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index cc06032..de5902b 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -12,7 +12,7 @@ module OpenTox end def self.uri - File.join(@@config[:services]["opentox-algorithm"], "fminer") + File.join(CONFIG[:services]["opentox-algorithm"], "fminer") end end @@ -21,15 +21,15 @@ module OpenTox def self.create_model(params) LOGGER.debug params LOGGER.debug File.basename(__FILE__) + ": creating model" - LOGGER.debug File.join(@@config[:services]["opentox-algorithm"], "lazar") - #resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") - resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") - #@uri = resource.post(:dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).chomp - @uri = resource.post(:dataset_uri => params[:dataset_uri], :prediction_feature => params[:prediction_feature], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).body.chomp + LOGGER.debug File.join(CONFIG[:services]["opentox-algorithm"], "lazar") + #resource = RestClient::Resource.new(File.join(CONFIG[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") + resource = RestClient::Resource.new(File.join(CONFIG[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") + #@uri = resource.post(:dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(CONFIG[:services]["opentox-algorithm"], "fminer")).chomp + @uri = resource.post(:dataset_uri => params[:dataset_uri], :prediction_feature => params[:prediction_feature], :feature_generation_uri => File.join(CONFIG[:services]["opentox-algorithm"], "fminer")).body.chomp end def self.uri - File.join(@@config[:services]["opentox-algorithm"], "lazar") + File.join(CONFIG[:services]["opentox-algorithm"], "lazar") end end diff --git a/lib/compound.rb b/lib/compound.rb index a293df0..45b96b8 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -11,19 +11,19 @@ module OpenTox def initialize(params) if params[:smiles] @inchi = smiles2inchi(params[:smiles]) - @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) + @uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:inchi] @inchi = params[:inchi] - @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) + @uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:sdf] @inchi = sdf2inchi(params[:sdf]) - @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) + @uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:name] # paranoid URI encoding to keep SMILES charges and brackets @inchi = RestClient.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").body.chomp # this was too hard for me to debug and leads to additional errors (ch) #@inchi = RestClientWrapper.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").chomp - @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) + @uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:uri] @uri = params[:uri] case params[:uri] diff --git a/lib/dataset.rb b/lib/dataset.rb index af72403..776a55b 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -15,8 +15,8 @@ module OpenTox def self.find(uri, accept_header=nil) unless accept_header - #if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /informatik/ - if !@@config[:accept_headers]["opentox-dataset"].grep(/yaml/).empty? + #if uri.match(CONFIG[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /informatik/ + if !CONFIG[:accept_headers]["opentox-dataset"].grep(/yaml/).empty? accept_header = 'application/x-yaml' else accept_header = "application/rdf+xml" @@ -203,7 +203,7 @@ module OpenTox @features.uniq! @compounds.uniq! - OpenTox::RestClientWrapper.post(@@config[:services]["opentox-dataset"],{:content_type => "application/x-yaml"},self.to_yaml).strip + OpenTox::RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{:content_type => "application/x-yaml"},self.to_yaml).strip end def init_dirty_features(owl) diff --git a/lib/environment.rb b/lib/environment.rb index 312eec4..46f8933 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -1,6 +1,6 @@ require 'logger' # set default environment -ENV['RACK_ENV'] = 'test' unless ENV['RACK_ENV'] +ENV['RACK_ENV'] = 'production' unless ENV['RACK_ENV'] # load/setup configuration basedir = File.join(ENV['HOME'], ".opentox") @@ -12,8 +12,8 @@ TMP_DIR = File.join(basedir, "tmp") LOG_DIR = File.join(basedir, "log") if File.exist?(config_file) - @@config = YAML.load_file(config_file) - raise "could not load config, config file: "+config_file.to_s unless @@config + CONFIG = YAML.load_file(config_file) + raise "could not load config, config file: "+config_file.to_s unless CONFIG else FileUtils.mkdir_p TMP_DIR FileUtils.mkdir_p LOG_DIR @@ -24,91 +24,30 @@ else end # database -if @@config[:database] +if CONFIG[:database] ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types', 'dm-migrations' ].each{|lib| require lib } - case @@config[:database][:adapter] + case CONFIG[:database][:adapter] when /sqlite/i db_dir = File.join(basedir, "db") FileUtils.mkdir_p db_dir DataMapper::setup(:default, "sqlite3://#{db_dir}/opentox.sqlite3") else DataMapper.setup(:default, { - :adapter => @@config[:database][:adapter], - :database => @@config[:database][:database], - :username => @@config[:database][:username], - :password => @@config[:database][:password], - :host => @@config[:database][:host]}) + :adapter => CONFIG[:database][:adapter], + :database => CONFIG[:database][:database], + :username => CONFIG[:database][:username], + :password => CONFIG[:database][:password], + :host => CONFIG[:database][:host]}) end end # load mail settings for error messages load File.join config_dir,"mail.rb" if File.exists?(File.join config_dir,"mail.rb") -# hack: store sinatra in global var to make url_for and halt methods accessible -before{ $sinatra = self unless $sinatra } - -class Sinatra::Base - # overwriting halt to log halts (!= 202) - def halt(*response) - LOGGER.error "halt "+response.first.to_s+" "+(response.size>1 ? response[1].to_s : "") if response and response.first and response.first >= 300 - # orig sinatra code: - response = response.first if response.length == 1 - throw :halt, response - end -end - -# logging -class MyLogger < Logger - - def pwd - path = Dir.pwd.to_s - index = path.rindex(/\//) - return path if index==nil - path[(index+1)..-1] - end - - def trace() - lines = caller(0) - n = 2 - line = lines[n] - - while (line =~ /spork.rb/ or line =~ /as_task/ or line =~ /environment.rb/) - n += 1 - line = lines[n] - end - - index = line.rindex(/\/.*\.rb/) - return line if index==nil - line[index..-1] - end - - def format(msg) - pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace+" :: "+($sinatra ? $sinatra.request.env['REMOTE_ADDR'] : nil).to_s - end - - def debug(msg) - super format(msg) - end - - def info(msg) - super format(msg) - end - - def warn(msg) - super format(msg) - end - - def error(msg) - super format(msg) - end - -end - - logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" LOGGER = MyLogger.new(logfile,'daily') # daily rotation LOGGER.formatter = Logger::Formatter.new #this is neccessary to restore the formating in case active-record is loaded -if @@config[:logger] and @@config[:logger] == "debug" +if CONFIG[:logger] and CONFIG[:logger] == "debug" LOGGER.level = Logger::DEBUG else LOGGER.level = Logger::WARN @@ -128,18 +67,10 @@ rescue raise "Please edit #{user_file} and restart your application. Create at least one user with password." end -# RDF namespaces -RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' -OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#' -DC = Redland::Namespace.new 'http://purl.org/dc/elements/1.1/' -OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#' -#OT = Redland::Namespace.new 'http://ortona.informatik.uni-freiburg.de/opentox.owl#' -XML = Redland::Namespace.new 'http://www.w3.org/2001/XMLSchema#' - # Regular expressions for parsing classification data TRUE_REGEXP = /^(true|active|1|1.0)$/i FALSE_REGEXP = /^(false|inactive|0|0.0)$/i # Task durations -DEFAULT_TASK_MAX_DURATION = @@config[:default_task_max_duration] -EXTERNAL_TASK_MAX_DURATION = @@config[:external_task_max_duration] +DEFAULT_TASK_MAX_DURATION = CONFIG[:default_task_max_duration] +EXTERNAL_TASK_MAX_DURATION = CONFIG[:external_task_max_duration] diff --git a/lib/model.rb b/lib/model.rb index b6cef46..db9efd4 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -86,8 +86,8 @@ module OpenTox def initialize @source = "http://github.com/helma/opentox-model" - @algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") - #@independent_variables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative") + @algorithm = File.join(CONFIG[:services]["opentox-algorithm"],"lazar") + #@independent_variables = File.join(CONFIG[:services]["opentox-algorithm"],"fminer#BBRC_representative") @features = [] @effects = {} @activities = {} @@ -97,12 +97,12 @@ module OpenTox def save @features.uniq! - resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource = RestClient::Resource.new(CONFIG[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s end def self.find_all - RestClientWrapper.get(@@config[:services]["opentox-model"]).chomp.split("\n") + RestClientWrapper.get(CONFIG[:services]["opentox-model"]).chomp.split("\n") end end end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 16c23fe..4a6f811 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['owl', 'compound','dataset','algorithm','model','task','validation','utils','authorization','features', 'rest_client_wrapper'].each do |lib| +['owl', 'compound','dataset','algorithm','model','task','validation','utils','authorization','features', 'logger', 'overwrite', 'rest_client_wrapper'].each do |lib| require lib end diff --git a/lib/owl.rb b/lib/owl.rb index 700e6ee..a3000e4 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -1,3 +1,11 @@ +# RDF namespaces +RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' +OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#' +DC = Redland::Namespace.new 'http://purl.org/dc/elements/1.1/' +OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#' +#OT = Redland::Namespace.new 'http://ortona.informatik.uni-freiburg.de/opentox.owl#' +XML = Redland::Namespace.new 'http://www.w3.org/2001/XMLSchema#' + class Redland::Literal def self.create(value, datatype=nil) diff --git a/lib/task.rb b/lib/task.rb index 88bcb71..e1c1cb5 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -18,7 +18,7 @@ module OpenTox # create is private now, use OpenTox::Task.as_task def self.create(max_duration) - task_uri = RestClientWrapper.post(@@config[:services]["opentox-task"], {:max_duration => max_duration}, nil, false).to_s + task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], {:max_duration => max_duration}, nil, false).to_s Task.find(task_uri.chomp) end @@ -94,7 +94,7 @@ module OpenTox # waits for a task, unless time exceeds or state is no longer running def wait_for_completion(dur=0.3) - if (@uri.match(@@config[:services]["opentox-task"])) + if (@uri.match(CONFIG[:services]["opentox-task"])) due_to_time = Time.parse(@due_to_time) running_time = due_to_time - Time.parse(@date) else diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb index 7fce35b..6962407 100644 --- a/lib/tasks/opentox.rb +++ b/lib/tasks/opentox.rb @@ -6,9 +6,9 @@ namespace :opentox do desc "Run opentox services" task :start do - @@config[:services].each do |service,uri| - dir = File.join(@@config[:base_dir], service) - server = @@config[:webserver] + CONFIG[:services].each do |service,uri| + dir = File.join(CONFIG[:base_dir], service) + server = CONFIG[:webserver] case server when /thin|mongrel|webrick/ port = uri.sub(/^.*:/,'').sub(/\/$/,'') @@ -32,9 +32,9 @@ namespace :opentox do desc "Stop opentox services" task :stop do - server = @@config[:webserver] + server = CONFIG[:webserver] if server =~ /thin|mongrel|webrick/ - @@config[:services].each do |service,uri| + CONFIG[:services].each do |service,uri| port = uri.sub(/^.*:/,'').sub(/\/$/,'') pid_file = File.join(TMP_DIR,"#{service}.pid") begin @@ -54,8 +54,8 @@ namespace :opentox do desc "Run all OpenTox tests" task :test do - @@config[:services].each do |service,uri| - dir = File.join(@@config[:base_dir], service) + CONFIG[:services].each do |service,uri| + dir = File.join(CONFIG[:base_dir], service) Dir.chdir dir puts "Running tests in #{dir}" `rake test -t 1>&2` @@ -67,10 +67,10 @@ end desc "Start service in current directory" task :start do service = File.basename(Dir.pwd).intern - server = @@config[:webserver] + server = CONFIG[:webserver] case server when /thin|mongrel|webrick/ - port = @@config[:services][service].sub(/^.*:/,'').sub(/\/$/,'') + port = CONFIG[:services][service].sub(/^.*:/,'').sub(/\/$/,'') pid_file = File.join(TMP_DIR,"#{service}.pid") begin `#{server} --trace --rackup config.ru start -p #{port} -e #{ENV['RACK_ENV']} -P #{pid_file} -d &` @@ -90,9 +90,9 @@ end desc "Stop service in current directory" task :stop do service = File.basename(Dir.pwd).intern - server = @@config[:webserver] + server = CONFIG[:webserver] if server =~ /thin|mongrel|webrick/ - port = @@config[:services][service].sub(/^.*:/,'').sub(/\/$/,'') + port = CONFIG[:services][service].sub(/^.*:/,'').sub(/\/$/,'') pid_file = File.join(TMP_DIR,"#{service}.pid") begin puts `thin stop -P #{pid_file}` diff --git a/lib/validation.rb b/lib/validation.rb index bd38488..f1cc987 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -17,7 +17,7 @@ module OpenTox end def self.crossvalidation(params) - params[:uri] = File.join(@@config[:services]['opentox-validation'], "crossvalidation") + params[:uri] = File.join(CONFIG[:services]['opentox-validation'], "crossvalidation") params[:num_folds] = 10 unless params[:num_folds] params[:random_seed] = 2 unless params[:random_seed] params[:stratified] = false unless params[:stratified] -- cgit v1.2.3 From 34a7b50fb278fc37c937f2fe170b86332eb054c5 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 22 Jul 2010 17:12:51 +0200 Subject: CONFIG reverted to @@config --- lib/algorithm.rb | 14 ++++++------ lib/compound.rb | 11 +++++----- lib/dataset.rb | 6 +++--- lib/environment.rb | 26 +++++++++++----------- lib/model.rb | 8 +++---- lib/opentox-ruby-api-wrapper.rb | 2 +- lib/ot-logger.rb | 48 +++++++++++++++++++++++++++++++++++++++++ lib/overwrite.rb | 14 ++++++++++++ lib/task.rb | 4 ++-- lib/tasks/opentox.rb | 22 +++++++++---------- lib/validation.rb | 2 +- 11 files changed, 110 insertions(+), 47 deletions(-) create mode 100644 lib/ot-logger.rb create mode 100644 lib/overwrite.rb diff --git a/lib/algorithm.rb b/lib/algorithm.rb index de5902b..cc06032 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -12,7 +12,7 @@ module OpenTox end def self.uri - File.join(CONFIG[:services]["opentox-algorithm"], "fminer") + File.join(@@config[:services]["opentox-algorithm"], "fminer") end end @@ -21,15 +21,15 @@ module OpenTox def self.create_model(params) LOGGER.debug params LOGGER.debug File.basename(__FILE__) + ": creating model" - LOGGER.debug File.join(CONFIG[:services]["opentox-algorithm"], "lazar") - #resource = RestClient::Resource.new(File.join(CONFIG[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") - resource = RestClient::Resource.new(File.join(CONFIG[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") - #@uri = resource.post(:dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(CONFIG[:services]["opentox-algorithm"], "fminer")).chomp - @uri = resource.post(:dataset_uri => params[:dataset_uri], :prediction_feature => params[:prediction_feature], :feature_generation_uri => File.join(CONFIG[:services]["opentox-algorithm"], "fminer")).body.chomp + LOGGER.debug File.join(@@config[:services]["opentox-algorithm"], "lazar") + #resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") + resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") + #@uri = resource.post(:dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).chomp + @uri = resource.post(:dataset_uri => params[:dataset_uri], :prediction_feature => params[:prediction_feature], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).body.chomp end def self.uri - File.join(CONFIG[:services]["opentox-algorithm"], "lazar") + File.join(@@config[:services]["opentox-algorithm"], "lazar") end end diff --git a/lib/compound.rb b/lib/compound.rb index 45b96b8..9366db4 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -11,19 +11,19 @@ module OpenTox def initialize(params) if params[:smiles] @inchi = smiles2inchi(params[:smiles]) - @uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(@inchi)) + @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:inchi] @inchi = params[:inchi] - @uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(@inchi)) + @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:sdf] @inchi = sdf2inchi(params[:sdf]) - @uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(@inchi)) + @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:name] # paranoid URI encoding to keep SMILES charges and brackets @inchi = RestClient.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").body.chomp # this was too hard for me to debug and leads to additional errors (ch) #@inchi = RestClientWrapper.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").chomp - @uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(@inchi)) + @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) elsif params[:uri] @uri = params[:uri] case params[:uri] @@ -56,7 +56,8 @@ module OpenTox end def image_uri - "#{@@ambit_uri}#{smiles}" + File.join @uri, "image" + #"#{@@ambit_uri}#{smiles}" #"#{@@cactus_uri}#{@inchi}/image" end diff --git a/lib/dataset.rb b/lib/dataset.rb index 776a55b..af72403 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -15,8 +15,8 @@ module OpenTox def self.find(uri, accept_header=nil) unless accept_header - #if uri.match(CONFIG[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /informatik/ - if !CONFIG[:accept_headers]["opentox-dataset"].grep(/yaml/).empty? + #if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /informatik/ + if !@@config[:accept_headers]["opentox-dataset"].grep(/yaml/).empty? accept_header = 'application/x-yaml' else accept_header = "application/rdf+xml" @@ -203,7 +203,7 @@ module OpenTox @features.uniq! @compounds.uniq! - OpenTox::RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{:content_type => "application/x-yaml"},self.to_yaml).strip + OpenTox::RestClientWrapper.post(@@config[:services]["opentox-dataset"],{:content_type => "application/x-yaml"},self.to_yaml).strip end def init_dirty_features(owl) diff --git a/lib/environment.rb b/lib/environment.rb index 46f8933..917011d 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -1,4 +1,4 @@ -require 'logger' +require "ot-logger" # set default environment ENV['RACK_ENV'] = 'production' unless ENV['RACK_ENV'] @@ -12,8 +12,8 @@ TMP_DIR = File.join(basedir, "tmp") LOG_DIR = File.join(basedir, "log") if File.exist?(config_file) - CONFIG = YAML.load_file(config_file) - raise "could not load config, config file: "+config_file.to_s unless CONFIG + @@config = YAML.load_file(config_file) + raise "could not load config, config file: "+config_file.to_s unless @@config else FileUtils.mkdir_p TMP_DIR FileUtils.mkdir_p LOG_DIR @@ -24,20 +24,20 @@ else end # database -if CONFIG[:database] +if @@config[:database] ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types', 'dm-migrations' ].each{|lib| require lib } - case CONFIG[:database][:adapter] + case @@config[:database][:adapter] when /sqlite/i db_dir = File.join(basedir, "db") FileUtils.mkdir_p db_dir DataMapper::setup(:default, "sqlite3://#{db_dir}/opentox.sqlite3") else DataMapper.setup(:default, { - :adapter => CONFIG[:database][:adapter], - :database => CONFIG[:database][:database], - :username => CONFIG[:database][:username], - :password => CONFIG[:database][:password], - :host => CONFIG[:database][:host]}) + :adapter => @@config[:database][:adapter], + :database => @@config[:database][:database], + :username => @@config[:database][:username], + :password => @@config[:database][:password], + :host => @@config[:database][:host]}) end end @@ -47,7 +47,7 @@ load File.join config_dir,"mail.rb" if File.exists?(File.join config_dir,"mail.r logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" LOGGER = MyLogger.new(logfile,'daily') # daily rotation LOGGER.formatter = Logger::Formatter.new #this is neccessary to restore the formating in case active-record is loaded -if CONFIG[:logger] and CONFIG[:logger] == "debug" +if @@config[:logger] and @@config[:logger] == "debug" LOGGER.level = Logger::DEBUG else LOGGER.level = Logger::WARN @@ -72,5 +72,5 @@ TRUE_REGEXP = /^(true|active|1|1.0)$/i FALSE_REGEXP = /^(false|inactive|0|0.0)$/i # Task durations -DEFAULT_TASK_MAX_DURATION = CONFIG[:default_task_max_duration] -EXTERNAL_TASK_MAX_DURATION = CONFIG[:external_task_max_duration] +DEFAULT_TASK_MAX_DURATION = @@config[:default_task_max_duration] +EXTERNAL_TASK_MAX_DURATION = @@config[:external_task_max_duration] diff --git a/lib/model.rb b/lib/model.rb index db9efd4..b6cef46 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -86,8 +86,8 @@ module OpenTox def initialize @source = "http://github.com/helma/opentox-model" - @algorithm = File.join(CONFIG[:services]["opentox-algorithm"],"lazar") - #@independent_variables = File.join(CONFIG[:services]["opentox-algorithm"],"fminer#BBRC_representative") + @algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") + #@independent_variables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative") @features = [] @effects = {} @activities = {} @@ -97,12 +97,12 @@ module OpenTox def save @features.uniq! - resource = RestClient::Resource.new(CONFIG[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s end def self.find_all - RestClientWrapper.get(CONFIG[:services]["opentox-model"]).chomp.split("\n") + RestClientWrapper.get(@@config[:services]["opentox-model"]).chomp.split("\n") end end end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 4a6f811..45a3428 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['owl', 'compound','dataset','algorithm','model','task','validation','utils','authorization','features', 'logger', 'overwrite', 'rest_client_wrapper'].each do |lib| +['owl', 'compound','dataset','algorithm','model','task','validation','utils','authorization','features', 'ot-logger', 'overwrite', 'rest_client_wrapper'].each do |lib| require lib end diff --git a/lib/ot-logger.rb b/lib/ot-logger.rb new file mode 100644 index 0000000..6c35ed2 --- /dev/null +++ b/lib/ot-logger.rb @@ -0,0 +1,48 @@ +require 'logger' +# logging +class MyLogger < Logger + + def pwd + path = Dir.pwd.to_s + index = path.rindex(/\//) + return path if index==nil + path[(index+1)..-1] + end + + def trace() + lines = caller(0) + n = 2 + line = lines[n] + + while (line =~ /spork.rb/ or line =~ /as_task/ or line =~ /environment.rb/) + n += 1 + line = lines[n] + end + + index = line.rindex(/\/.*\.rb/) + return line if index==nil + line[index..-1] + end + + def format(msg) + pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace+" :: "+($sinatra ? $sinatra.request.env['REMOTE_ADDR'] : nil).to_s + end + + def debug(msg) + super format(msg) + end + + def info(msg) + super format(msg) + end + + def warn(msg) + super format(msg) + end + + def error(msg) + super format(msg) + end + +end + diff --git a/lib/overwrite.rb b/lib/overwrite.rb new file mode 100644 index 0000000..1d0161b --- /dev/null +++ b/lib/overwrite.rb @@ -0,0 +1,14 @@ +# class overwrites aka monkey patches +# hack: store sinatra in global var to make url_for and halt methods accessible +before{ $sinatra = self unless $sinatra } + +class Sinatra::Base + # overwriting halt to log halts (!= 202) + def halt(*response) + LOGGER.error "halt "+response.first.to_s+" "+(response.size>1 ? response[1].to_s : "") if response and response.first and response.first >= 300 + # orig sinatra code: + response = response.first if response.length == 1 + throw :halt, response + end +end + diff --git a/lib/task.rb b/lib/task.rb index e1c1cb5..88bcb71 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -18,7 +18,7 @@ module OpenTox # create is private now, use OpenTox::Task.as_task def self.create(max_duration) - task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], {:max_duration => max_duration}, nil, false).to_s + task_uri = RestClientWrapper.post(@@config[:services]["opentox-task"], {:max_duration => max_duration}, nil, false).to_s Task.find(task_uri.chomp) end @@ -94,7 +94,7 @@ module OpenTox # waits for a task, unless time exceeds or state is no longer running def wait_for_completion(dur=0.3) - if (@uri.match(CONFIG[:services]["opentox-task"])) + if (@uri.match(@@config[:services]["opentox-task"])) due_to_time = Time.parse(@due_to_time) running_time = due_to_time - Time.parse(@date) else diff --git a/lib/tasks/opentox.rb b/lib/tasks/opentox.rb index 6962407..7fce35b 100644 --- a/lib/tasks/opentox.rb +++ b/lib/tasks/opentox.rb @@ -6,9 +6,9 @@ namespace :opentox do desc "Run opentox services" task :start do - CONFIG[:services].each do |service,uri| - dir = File.join(CONFIG[:base_dir], service) - server = CONFIG[:webserver] + @@config[:services].each do |service,uri| + dir = File.join(@@config[:base_dir], service) + server = @@config[:webserver] case server when /thin|mongrel|webrick/ port = uri.sub(/^.*:/,'').sub(/\/$/,'') @@ -32,9 +32,9 @@ namespace :opentox do desc "Stop opentox services" task :stop do - server = CONFIG[:webserver] + server = @@config[:webserver] if server =~ /thin|mongrel|webrick/ - CONFIG[:services].each do |service,uri| + @@config[:services].each do |service,uri| port = uri.sub(/^.*:/,'').sub(/\/$/,'') pid_file = File.join(TMP_DIR,"#{service}.pid") begin @@ -54,8 +54,8 @@ namespace :opentox do desc "Run all OpenTox tests" task :test do - CONFIG[:services].each do |service,uri| - dir = File.join(CONFIG[:base_dir], service) + @@config[:services].each do |service,uri| + dir = File.join(@@config[:base_dir], service) Dir.chdir dir puts "Running tests in #{dir}" `rake test -t 1>&2` @@ -67,10 +67,10 @@ end desc "Start service in current directory" task :start do service = File.basename(Dir.pwd).intern - server = CONFIG[:webserver] + server = @@config[:webserver] case server when /thin|mongrel|webrick/ - port = CONFIG[:services][service].sub(/^.*:/,'').sub(/\/$/,'') + port = @@config[:services][service].sub(/^.*:/,'').sub(/\/$/,'') pid_file = File.join(TMP_DIR,"#{service}.pid") begin `#{server} --trace --rackup config.ru start -p #{port} -e #{ENV['RACK_ENV']} -P #{pid_file} -d &` @@ -90,9 +90,9 @@ end desc "Stop service in current directory" task :stop do service = File.basename(Dir.pwd).intern - server = CONFIG[:webserver] + server = @@config[:webserver] if server =~ /thin|mongrel|webrick/ - port = CONFIG[:services][service].sub(/^.*:/,'').sub(/\/$/,'') + port = @@config[:services][service].sub(/^.*:/,'').sub(/\/$/,'') pid_file = File.join(TMP_DIR,"#{service}.pid") begin puts `thin stop -P #{pid_file}` diff --git a/lib/validation.rb b/lib/validation.rb index f1cc987..bd38488 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -17,7 +17,7 @@ module OpenTox end def self.crossvalidation(params) - params[:uri] = File.join(CONFIG[:services]['opentox-validation'], "crossvalidation") + params[:uri] = File.join(@@config[:services]['opentox-validation'], "crossvalidation") params[:num_folds] = 10 unless params[:num_folds] params[:random_seed] = 2 unless params[:random_seed] params[:stratified] = false unless params[:stratified] -- cgit v1.2.3 From 5f54e69f9ed332bfb73e30bb6daed24955fe90f6 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 28 Jul 2010 10:15:04 +0200 Subject: new owl version (should be backwards compatible), fix dirty features bug in dataset --- lib/dataset.rb | 3 +- lib/owl.rb | 652 +++++++++++++++++++++++++++++---------------------------- lib/task.rb | 12 +- 3 files changed, 338 insertions(+), 329 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index af72403..e43ce96 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -22,6 +22,7 @@ module OpenTox accept_header = "application/rdf+xml" end end + case accept_header when "application/x-yaml" d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s @@ -207,7 +208,7 @@ module OpenTox end def init_dirty_features(owl) - @dirty_features = @features + @dirty_features = @features.dclone @owl = owl end end diff --git a/lib/owl.rb b/lib/owl.rb index 700e6ee..fe96a6b 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -1,22 +1,22 @@ + +# overriding literal to give nice access to datatype +# and to access the stored value as correct ruby type class Redland::Literal - def self.create(value, datatype=nil) - if datatype - if datatype.is_a?(Redland::Uri) - Redland::Literal.new(value.to_s,nil,datatype) - else - Redland::Literal.new(value.to_s,nil,Redland::Uri.new(datatype.to_s)) - end + def self.create(value, datatype) + raise "literal datatype may not be nil" unless datatype + if datatype.is_a?(Redland::Uri) + Redland::Literal.new(value.to_s,nil,datatype) else - Redland::Literal.new(value.to_s,nil,Redland::Literal.parse_datatype_uri(value)) + Redland::Literal.new(value.to_s,nil,Redland::Uri.new(datatype.to_s)) end end # the literal node of the ruby swig api provdides the 'value' of a literal but not the 'datatype' # found solution in mailing list def datatype - uri = Redland.librdf_node_get_literal_value_datatype_uri(self.node) - return Redland.librdf_uri_to_string(uri) if uri + uri = Redland.librdf_node_get_literal_value_datatype_uri(self.node) + return Redland.librdf_uri_to_string(uri) if uri end # gets value of literal, value class is se according to literal datatype @@ -25,66 +25,33 @@ class Redland::Literal end private - @@type_string = XML["string"].uri - @@type_uri = XML["anyURI"].uri - @@type_float = XML["float"].uri - @@type_double = XML["double"].uri - @@type_date = XML["date"].uri - @@type_boolean = XML["boolean"].uri - @@type_datetime = XML["dateTime"].uri - @@type_integer = XML["integer"].uri - # parses value according to datatype uri def self.parse_value(string_value, datatype_uri) + if (datatype_uri==nil || datatype_uri.size==0) - LOGGER.warn("empty datatype for literal with value: "+string_value) + LOGGER.warn("empty datatype for literal with value: '"+string_value+"'") return string_value end case datatype_uri - when @@type_string.to_s + when OpenTox::Owl::LITERAL_DATATYPE_STRING.to_s return string_value - when @@type_uri.to_s + when OpenTox::Owl::LITERAL_DATATYPE_URI.to_s return string_value #PENDING uri as string? - when @@type_float.to_s + when OpenTox::Owl::LITERAL_DATATYPE_FLOAT.to_s return string_value.to_f - when @@type_double.to_s + when OpenTox::Owl::LITERAL_DATATYPE_DOUBLE.to_s return string_value.to_f - when @@type_boolean.to_s + when OpenTox::Owl::LITERAL_DATATYPE_BOOLEAN.to_s return string_value.upcase=="TRUE" - when @@type_date.to_s - return string_value #PENDING date as string? - when @@type_datetime.to_s - return string_value #PENDING date as string? - when @@type_integer.to_s + when OpenTox::Owl::LITERAL_DATATYPE_DATE.to_s + return Time.parse(string_value) + when OpenTox::Owl::LITERAL_DATATYPE_DATETIME.to_s + return Time.parse(string_value) + when OpenTox::Owl::LITERAL_DATATYPE_INTEGER.to_s return string_value.to_i else - raise "unknown literal datatype: '"+datatype_uri.to_s+"', value is "+string_value - end - end - - # parse datatype uri accoring to value class - def self.parse_datatype_uri(value) - if value==nil - raise "illegal datatype: value is nil" - elsif value.is_a?(String) - # PENDING: uri check too slow? - if OpenTox::Utils.is_uri?(value) - return @@type_uri - else - return @@type_string - end - elsif value.is_a?(Float) - return @@type_float - elsif value.is_a?(TrueClass) or value.is_a?(FalseClass) - return @@type_boolean - elsif value.is_a?(Integer) - return @@type_integer - elsif value.is_a?(DateTime) - return @@type_datetime - elsif value.is_a?(Time) - return @@type_datetime - else - raise "illegal datatype: "+value.class.to_s+" "+value.to_s + raise "unknown literal datatype: '"+datatype_uri.to_s+"' (value is "+string_value+ + "), please specify new OpenTox::Owl::LITERAL_DATATYPE" end end end @@ -92,8 +59,93 @@ end module OpenTox class Owl + + # to get correct owl-dl, properties and objects have to be typed + # i.e. the following triple is insufficient: + # ModelXY,ot:algorithm,AlgorithmXY + # furhter needed: + # ot:algorithm,rdf:type,owl:ObjectProperty + # AlgorithmXY,rdf:type,ot:Algorithm + # ot:Algorithm,rdf:type,owl:Class + # + # therefore OpentoxOwl needs info about the opentox-ontology + # the info is stored in OBJECT_PROPERTY_CLASS and LITERAL_TYPES + + # contains all owl:ObjectProperty as keys, and the respective classes as value + OBJECT_PROPERTY_CLASS = {} + [ "model" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Model"} + [ "algorithm" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Algorithm"} + [ "trainingDataset", "testTargetDataset", "predictionDataset", + "testDataset", "dataset" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Dataset"} + [ "feature", "dependentVariables", "independentVariables", + "predictedVariables", "predictionFeature" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Feature"} + [ "parameters" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Parameter"} + [ "compound" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Compound"} + [ "dataEntry" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "DataEntry"} + [ "values" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "FeatureValue"} + [ "classificationStatistics" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ClassificationStatistics"} + [ "classValueStatistics" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ClassValueStatistics"} + [ "confusionMatrix" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ConfusionMatrix"} + [ "confusionMatrixCell" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ConfusionMatrixCell"} + [ "regressionStatistics" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "RegressionStatistics"} + [ "validation" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Validation"} + [ "crossvalidationInfo" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "CrossvalidationInfo"} + [ "crossvalidation" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Crossvalidation"} + + # literals point to primitive values (not to other resources) + # the literal datatype is encoded is uri: + LITERAL_DATATYPE_STRING = XML["string"].uri + LITERAL_DATATYPE_URI = XML["anyURI"].uri + LITERAL_DATATYPE_FLOAT = XML["float"].uri + LITERAL_DATATYPE_DOUBLE = XML["double"].uri + LITERAL_DATATYPE_DATE = XML["date"].uri + LITERAL_DATATYPE_BOOLEAN = XML["boolean"].uri + LITERAL_DATATYPE_DATETIME = XML["dateTime"].uri + LITERAL_DATATYPE_INTEGER = XML["integer"].uri + + # list all literals (to distinguish from objectProperties) as keys, datatype as values + # (do not add dc-identifier, deprecated, object are identified over via name=uri) + LITERAL_TYPES = {} + [ "title", "creator", "format", "description", "hasStatus", "paramScope", "paramValue", + "value", "classValue", "reportType", "confusionMatrixActual", + "confusionMatrixPredicted" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_STRING } + [ "date", "due_to_time" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_DATE } + [ "percentageCompleted", "truePositiveRate", "fMeasure", "falseNegativeRate", + "areaUnderRoc", "falsePositiveRate", "trueNegativeRate", "precision", "recall", + "percentCorrect", "percentIncorrect", "weightedAreaUnderRoc", "numCorrect", + "percentIncorrect", "percentUnpredicted", "realRuntime", + "percentWithoutClass", "rootMeanSquaredError", "meanAbsoluteError", "rSquare", + "targetVarianceActual", "targetVariancePredicted", "sumSquaredError", + "sampleCorrelationCoefficient" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_DOUBLE } + [ "numTrueNegatives", "numWithoutClass", "numFalseNegatives", "numTruePositives", + "numFalsePositives", "numIncorrect", "numInstances", "numUnpredicted", + "randomSeed", "numFolds", "confusionMatrixValue", + "crossvalidationFold" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_INTEGER } + [ "resultURI" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_URI } + [ "stratified" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_BOOLEAN } + + # constants for often used redland-resources + OWL_TYPE_LITERAL = OWL["AnnotationProperty"] + OWL_TYPE_CLASS = OWL["Class"] + OWL_TYPE_OBJECT_PROPERTY = OWL["ObjectProperty"] + RDF_TYPE = RDF['type'] + + # store redland:resources (=nodes) to: + # * separate namespaces (OT from RDF and DC) + # * save time, as generating resources is timeconsuming in redland + @@nodes = {} + [ "type", "about"].each{ |l| @@nodes[l] = RDF[l] } + [ "title", "creator", "date", "format" ].each{ |l| @@nodes[l] = DC[l] } + + def node(property) + raise "can only create node for non-empty-string, but given "+property.class.to_s+" (value: "+ + property.to_s+")" unless property.is_a?(String) and property.size>0 + raise "dc[identifier] deprecated, use owl.uri" if property=="identifier" + @@nodes[property] = OT[property] unless @@nodes.has_key?(property) + return @@nodes[property] + end - # ot_class is the class of the object, e.g. "Model","Dataset", ... + # ot_class is the class of the object as string, e.g. "Model","Dataset", ... # root_node is the root-object node in the rdf # uri the uri of the object attr_accessor :ot_class, :root_node, :uri, :model @@ -102,12 +154,16 @@ module OpenTox @model = Redland::Model.new Redland::MemoryStore.new end + # build new owl object + # ot_class is the class of this object, should be a string like "Model", "Task", ... + # uri is name and identifier of this object def self.create( ot_class, uri ) - owl = OpenTox::Owl.new + owl = OpenTox::Owl.new owl.ot_class = ot_class owl.root_node = Redland::Resource.new(uri.to_s.strip) - owl.set("type",owl.node(owl.ot_class)) #,true)) + owl.set("type",owl.ot_class) + owl.uri = uri owl end @@ -121,7 +177,7 @@ module OpenTox parser.parse_string_into_model(owl.model, data, base_uri) # now loading root_node and uri - owl.model.find(nil, owl.node("type"), owl.node(ot_class)) do |s,p,o| + owl.model.find(nil, RDF_TYPE, owl.node(ot_class)) do |s,p,o| #LOGGER.debug "about statements "+s.to_s+" . "+p.to_s+" -> "+o.to_s is_root = true owl.model.find(nil, nil, s) do |ss,pp,oo| @@ -129,8 +185,10 @@ module OpenTox break end if is_root + # handle error if root is already set raise "cannot derieve root object from rdf, more than one object specified" if owl.uri raise "illegal root node type, no uri specified\n"+data.to_s if s.blank? + #store root note and uri owl.uri = s.uri.to_s owl.root_node = s end @@ -139,7 +197,7 @@ module OpenTox # handle error if no root node was found unless owl.root_node types = [] - owl.model.find(nil, owl.node("type"), nil){ |s,p,o| types << o.to_s } + owl.model.find(nil, RDF_TYPE, nil){ |s,p,o| types << o.to_s } raise "root node for class '"+ot_class+"' not found (available type nodes: "+types.inspect+")" end raise "no uri in rdf: '"+owl.uri+"'" unless owl.uri and Utils.is_uri?(owl.uri) @@ -158,13 +216,33 @@ module OpenTox @model.to_string end - def get(name) - raise "uri is no prop, use owl.uri instead" if name=="uri" - property_node = node(name.to_s) - return get_value( @model.object(@root_node, property_node) ) + # returns the first object for subject:root_node and property + # (sufficient for accessing simple, root-node properties) + def get( property ) + raise "uri is no prop, use owl.uri instead" if property=="uri" + return get_value( @model.object( @root_node, node(property.to_s)) ) + end + + # returns an array of objects (not only the first one) that fit for the property + # accepts array of properties to access not-root-node vaules + # i.e. validation_owl.get_nested( [ "confusionMatrix", "confusionMatrixCell", "confusionMatrixValue" ] + # returns an array of all confusionMatrixValues + def get_nested( property_array ) + n = [ @root_node ] + property_array.each do |p| + new_nodes = [] + n.each do |nn| + @model.find( nn, node(p), nil ) do |sub,pred,obj| + new_nodes << obj + end + end + n = new_nodes + end + return n.collect{|nn| get_value( nn )} end private + # returns node-value def get_value( node ) return nil unless node if node.is_a?(Redland::Literal) @@ -177,285 +255,215 @@ module OpenTox end public - def set(name, value, datatype=nil) + # sets values of current_node, by default root_node + def set(predicate, object, current_node=@root_node) - raise "uri is no prop, cannot set uri" if name=="uri" - property_node = node(name.to_s) #, true) - begin # delete existing entry - t = @model.object(@root_node, property_node) - @model.delete @root_node, property_node, t - rescue + pred = predicate.to_s + raise "uri is no prop, cannot set uri" if pred=="uri" + raise "dc[identifier] deprecated, use owl.uri" if pred=="identifier" + unless object && object.to_s.size>0 + # set only not-nil values + LOGGER.warn "skipping (not setting) empty value in rdf for property: '"+pred+"'" + return end - if value.is_a?(Redland::Node) - raise "not nil datatype not allowed when setting redland node as value" if datatype - @model.add @root_node, property_node, value - else # if value is no node, a literal is created - @model.add @root_node, property_node, Redland::Literal.create(value.to_s, datatype) + + if pred=="type" + # predicat is type, set class of current node + @model.add current_node, RDF_TYPE, node(object) + @model.add node(object), RDF_TYPE, OWL_TYPE_CLASS + # example-triples: + # model_xy,rdf:type,ot:Model + # ot:Model,rdf:type,owl:Class + elsif LITERAL_TYPES.has_key?(pred) + # predicate is literal + predicate_node = node(pred) + @model.add current_node, predicate_node, Redland::Literal.create(object, LITERAL_TYPES[pred]) + @model.add predicate_node, RDF_TYPE, OWL_TYPE_LITERAL + # example-triples: + # model_xy,ot:description,bla..bla^^xml:string + # ot:description,rdf:type,owl:Literal + elsif OBJECT_PROPERTY_CLASS.has_key?(pred) + # predicte is objectProperty, object is another resource + predicate_node = node(pred) + object_node = Redland::Resource.new(object) + @model.add current_node, predicate_node, object_node + @model.add predicate_node, RDF_TYPE, OWL_TYPE_OBJECT_PROPERTY + object_class_node = node(OBJECT_PROPERTY_CLASS[pred]) + @model.add object_node, RDF_TYPE, object_class_node + @model.add object_class_node, RDF_TYPE, OWL_TYPE_CLASS + # example-triples: + # model_xy,ot:algorithm,algorihtm_xy + # ot:algorithm,rdf:type,owl:ObjectProperty + # algorihtm_xy,rdf:type,ot:Algorithm + # ot:Algorithm,rdf:type,owl:Class + else + raise "unkonwn rdf-property, please add: '"+pred+"' to OpenTox::OWL.OBJECT_PROPERTY_CLASS or OpenTox::OWL.LITERAL_TYPES" end end - def parameters=(params) - params.each do |name, settings| - parameter = @model.create_resource - @model.add parameter, node('type'), node('Parameter') - @model.add parameter, node('title'), name - @model.add parameter, node('paramScope'), settings[:scope] - @model.add parameter, node('paramValue'), settings[:value] - @model.add @root_node, node('parameters'), parameter - end - end - - def add_data_entries(compound_uri,features) - # add compound - compound = @model.subject(DC["identifier"], compound_uri) - if compound.nil? - compound = @model.create_resource(compound_uri) - @model.add compound, node('type'), node("Compound") - end - features.each do |f| - f.each do |feature_uri,value| - # add feature - feature = find_or_create_feature feature_uri - if value.class.to_s == 'Hash' - # create tuple - tuple = @model.create_resource - @model.add tuple, node('type'), node("Tuple") - @model.add tuple, node('feature'), feature - value.each do |uri,v| - f = find_or_create_feature uri - complex_value = @model.create_resource - @model.add tuple, node('complexValue'), complex_value - @model.add complex_value, node('type'), node("FeatureValue") - @model.add complex_value, node('feature'), f - @model.add complex_value, node('value'), Redland::Literal.create(v) - end - # add data entry - data_entry = @model.subject node('compound'), compound - if data_entry.nil? - data_entry = @model.create_resource - @model.add @root_node, node('dataEntry'), data_entry - @model.add data_entry, node('type'), node("DataEntry") - @model.add data_entry, node('compound'), compound - end - @model.add data_entry, node('values'), tuple - else - data_entry = @model.subject node('compound'), compound - if data_entry.nil? - data_entry = @model.create_resource - @model.add @root_node, node('dataEntry'), data_entry - @model.add data_entry,node('type'), node("DataEntry") - @model.add data_entry, node('compound'), compound - end - values = @model.create_resource - @model.add data_entry, node('values'), values - @model.add values, node('type'), node('FeatureValue') - @model.add values, node('feature'), feature - @model.add values, node('value'), Redland::Literal.create(value) - end - end - end - end - - private - def find_feature(feature_uri) - # PENDING: more efficiently get feature node? - @model.subjects(RDF['type'], OT['Feature']).each do |feature| - return feature if feature_uri==get_value(feature) + # this is (a recursiv method) to set not only simple properties but nested-data via hashes + # example (for a dataset) + # { :description => "bla", + # :compound => { :uri => "compound_uri", + # :dataEntry: => { :values => [ { :feature => "feat1", + # :value => 42 }, + # { :feature => "feat2", + # :value => 43 } ] } } } + def set_data(hash, current_node=@root_node) + + hash.each do |k,v| + if v.is_a?(Hash) + # value is again a hash + prop = k.to_s + raise "hash key must be a object-property, please add '"+prop.to_s+ + "' to OpenTox::OWL.OBJECT_PROPERTY_CLASS" unless OBJECT_PROPERTY_CLASS[prop] + # the new node is a class node + if v["uri"] + # identifier is either a specified uri + class_node = Redland::Resource.new(v.delete("uri")) + else + # or a new uri, make up internal uri with increment + class_node = new_class_node(OBJECT_PROPERTY_CLASS[prop],current_node) + end + set(prop,class_node,current_node) + # recursivly call set_data method with new node + set_data(v,class_node) + elsif v.is_a?(Array) + # value is an array, each array element is added with current key as predicate + v.each do |value| + set_data( { k => value }, current_node ) + end + else + # neither hash nor array, call simple set-method + set( k, v, current_node ) + end + end end - return nil - end - - public - def find_or_create_feature(feature_uri) - feature = find_feature(feature_uri) - unless feature - feature = @model.create_resource(feature_uri) - @model.add feature, node('type'), node("Feature") - @model.add feature, node("title"), File.basename(feature_uri).split(/#/)[1] - @model.add feature, node('creator'), feature_uri - end - feature - end - - # feature values are not loaded for performance reasons - # loading compounds and features into arrays that are given as params - def load_dataset( compounds, features ) - @model.subjects(node('type'), node('Compound')).each do |compound| - compounds << get_value(compound) - end - @model.subjects(node('type'), node('Feature')).each do |feature| - features << get_value(feature) + # create a new (internal class) node with unique, uri-like name + def new_class_node(name, current_node=@root_node) + # to avoid anonymous nodes, make up uris for sub-objects + # use counter to make sure each uri is unique + # for example we will get ../confusion_matrix_cell/1, ../confusion_matrix_cell/2, ... + count = 1 + while (true) + res = Redland::Resource.new( File.join(current_node.uri.to_s,name.to_s,count.to_s) ) + match = false + @model.find(nil, nil, res) do |s,p,o| + match = true + break + end + if match + count += 1 + else + break + end + end + return res end - LOGGER.debug "loaded "+compounds.size.to_s+" compounds and "+features.size.to_s+" features" - end - - # loading feature values for the specified feature - # if feature is nil, all feature values are loaded - # - # general remark on the rdf loading (found out with some testing): - # the search methods (subjects/find) are fast, the time consuming parts is creating resources, - # which cannot be avoided in general (implemented some performance tweaks with uri storing when loading all features) - def load_dataset_feature_values( compounds, data, feature_uri=nil ) - - LOGGER.debug("load feature values"+ ( (feature_uri!=nil)?(" for feature: "+feature_uri):"") ) - # values are stored in the data-hash, hash has a key for each compound - compounds.each{|c| data[c] = [] unless data[c]} - - load_all_features = feature_uri==nil - feature_node = nil - - # create feature node for feature uri if specified - unless load_all_features - feature_node = find_feature(feature_uri) - raise "feature node not found" unless feature_node - end - - count = 0 - - # preformance tweak: store uirs to save some resource init time - compound_uri_store = {} - feature_uri_store = {} - - # search for all feature_value_node with property 'ot_feature' - # feature_node is either nil, i.e. a wildcard or specified - @model.find(nil, node('feature'), feature_node) do |feature_value_node,p,o| - - # get compound_uri by "backtracking" to values node (property is 'values'), then get compound_node via 'compound' - value_nodes = @model.subjects(node('values'),feature_value_node) - raise "more than one value node "+value_nodes.size.to_s unless value_nodes.size==1 - value_node = value_nodes[0] - compound_node = @model.object(value_node, node('compound')) - compound_uri = compound_uri_store[compound_node.to_s] - unless compound_uri - compound_uri = get_value(compound_node) - compound_uri_store[compound_node.to_s] = compound_uri + # for "backwards-compatiblity" + # better use directly: + # set_data( { "parameters" => [ { "title" => , "paramScope" => , "paramValue" => } ] ) + def parameters=(params) + + converted_params = [] + params.each do |name, settings| + converted_params << { :title => name, :paramScope => settings[:scope], :paramValue => settings[:value] } end + set_data( :parameters => converted_params ) + end + + + # this is for dataset.to_owl + # adds feautre value for a single compound + def add_data_entries(compound_uri,features) - if load_all_features - # if load all features, feautre_uri is not specified, derieve from feature_node - feature_uri = feature_uri_store[o.to_s] - unless feature_uri - feature_uri = get_value(o) - feature_uri_store[o.to_s] = feature_uri + data_entry_values = [] + features.each do |f| + f.each do |feature_uri,value| + if value.is_a?(Hash) + complex_values = [] + value.each do |uri,v| + complex_values << { :feature => uri, :value => v } + end + data_entry_values << { :feature => feature_uri, :complexValue => complex_values } + else + data_entry_values << { :feature => feature_uri, :value => value } + end end end + set_data( :compound => { :uri => compound_uri, :dataEntry => { :values => data_entry_values } } ) + end + + # feature values are not loaded for performance reasons + # loading compounds and features into arrays that are given as params + def load_dataset( compounds, features ) - value_node_type = @model.object(feature_value_node, node('type')) - if (value_node_type == node('FeatureValue')) - value_literal = @model.object( feature_value_node, node('value')) - raise "feature value no literal" unless value_literal.is_a?(Redland::Literal) - data[compound_uri] << {feature_uri => value_literal.get_value } - else - raise "feature value type not yet implemented "+value_node_type.to_s + @model.subjects(RDF_TYPE, node('Compound')).each do |compound| + compounds << get_value(compound) end - count += 1 - LOGGER.debug "loaded "+count.to_s+" feature values" if (count%500 == 0) + @model.subjects(RDF_TYPE, node('Feature')).each do |feature| + features << get_value(feature) + end + LOGGER.debug "loaded "+compounds.size.to_s+" compounds and "+features.size.to_s+" features" end - - LOGGER.debug "loaded "+count.to_s+" feature values" - end - @@property_nodes = { "type" => RDF["type"], - "about" => RDF["about"], - "title" => DC["title"], - "creator" => DC["creator"], - #"identifier" => DC["identifier"], identifier is deprecated - "date" => DC["date"], - "format" => DC["format"]} - -# @object_prop = OWL["ObjectProperty"] -# @@type = { "Validation" => OWL["Class"], -# "Model" => OWL["Class"], -# "title" => OWL["AnnotationProperty"], -# "creator" => OWL["AnnotationProperty"], -# "date" => OWL["AnnotationProperty"], -# "format" => OWL["AnnotationProperty"], -# "predictedVariables" => @object_prop} + # loading feature values for the specified feature + # if feature is nil, all feature values are loaded + # + # general remark on the rdf loading (found out with some testing): + # the search methods (subjects/find) are fast, the time consuming parts is creating resources, + # which cannot be avoided in general + def load_dataset_feature_values( compounds, data, feature_uri=nil ) + + LOGGER.debug("load feature values"+ ( (feature_uri!=nil)?(" for feature: "+feature_uri):"") ) - # this method has two purposes: - # * distinguishing ot-properties from dc- and rdf- properties - # * caching nodes, as creating nodes is costly - def node(name) #, write_type_to_model=false) - raise "dc[identifier] deprecated, use owl.uri" if name=="identifier" - n = @@property_nodes[name] - unless n - n = OT[name] - @@property_nodes[name] = n - end - -# if write_type_to_model and name!="type" -# raise "no type defined for '"+name+"'" unless @@type[name] -# @model.add n,RDF['type'],@@type[name] -# end - return n - end - -=begin - def data - LOGGER.debug("getting data from model") + # values are stored in the data-hash, hash has a key for each compound + compounds.each{|c| data[c] = [] unless data[c]} - data = {} - @model.subjects(RDF['type'], OT['DataEntry']).each do |data_entry| - compound_node = @model.object(data_entry, OT['compound']) - compound_uri = @model.object(compound_node, DC['identifier']).to_s - @model.find(data_entry, OT['values'], nil) do |s,p,values| - feature_node = @model.object values, OT['feature'] - feature_uri = @model.object(feature_node, DC['identifier']).to_s.sub(/\^\^.*$/,'') # remove XML datatype - type = @model.object(values, RDF['type']) - if type == OT['FeatureValue'] - value = @model.object(values, OT['value']).to_s - case value.to_s - when TRUE_REGEXP # defined in environment.rb - value = true - when FALSE_REGEXP # defined in environment.rb - value = false - when /.*\^\^<.*XMLSchema#.*>/ - #HACK for reading ambit datasets - case value.to_s - when /XMLSchema#string/ - value = value.to_s[0..(value.to_s.index("^^")-1)] - when /XMLSchema#double/ - value = value.to_s[0..(value.to_s.index("^^")-1)].to_f - else - LOGGER.warn " ILLEGAL TYPE "+compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri - value = nil - end - else - LOGGER.warn compound_uri + " has value '" + value.to_s + "' for feature " + feature_uri - value = nil - end - LOGGER.debug "converting owl to yaml, #compounds: "+(data.keys.size+1).to_s if (data.keys.size+1)%10==0 && !data.has_key?(compound_uri) - - return data if (data.keys.size)>9 && !data.has_key?(compound_uri) - - #puts "c "+compound_uri.to_s - #puts "f "+feature_uri.to_s - #puts "v "+value.to_s - #puts "" - data[compound_uri] = [] unless data[compound_uri] - data[compound_uri] << {feature_uri => value} unless value.nil? - elsif type == OT['Tuple'] - entry = {} - data[compound_uri] = [] unless data[compound_uri] - #data[compound_uri][feature_uri] = [] unless data[compound_uri][feature_uri] - @model.find(values, OT['complexValue'],nil) do |s,p,complex_value| - name_node = @model.object complex_value, OT['feature'] - name = @model.object(name_node, DC['title']).to_s - value = @model.object(complex_value, OT['value']).to_s - v = value.sub(/\^\^.*$/,'') # remove XML datatype - v = v.to_f if v.match(/^[\.|\d]+$/) # guess numeric datatype - entry[name] = v - end - data[compound_uri] << {feature_uri => entry} unless entry.empty? + load_all_features = feature_uri==nil + feature_node = nil + + # create feature node for feature uri if specified + unless load_all_features + @model.subjects(RDF_TYPE, OT['Feature']).each do |feature| + if feature_uri==get_value(feature) + feature_node = feature + break end end + raise "feature node not found" unless feature_node end - data + + count = 0 + + # search for all feature_value_node with property 'ot_feature' + # feature_node is either nil, i.e. a wildcard or specified + @model.find(nil, node('feature'), feature_node) do |feature_value_node,p,o| + + # get compound_uri by "backtracking" to values node (property is 'values'), then get compound_node via 'compound' + value_nodes = @model.subjects(node('values'),feature_value_node) + raise "more than one value node "+value_nodes.size.to_s unless value_nodes.size==1 + value_node = value_nodes[0] + + compound_uri = get_value( @model.object(value_node, node('compound')) ) + # if load all features, feautre_uri is not specified, derieve from feature_node + feature_uri = get_value(o) if load_all_features + + value_node_type = @model.object(feature_value_node, RDF_TYPE) + if (value_node_type == node('FeatureValue')) + value_literal = @model.object( feature_value_node, node('value')) + raise "feature value no literal" unless value_literal.is_a?(Redland::Literal) + data[compound_uri] << {feature_uri => value_literal.get_value } + else + raise "feature value type not yet implemented "+value_node_type.to_s + end + count += 1 + LOGGER.debug "loaded "+count.to_s+" feature values" if (count%500 == 0) + end + LOGGER.debug "loaded "+count.to_s+" feature values" end -=end - end end diff --git a/lib/task.rb b/lib/task.rb index 88bcb71..b563fe6 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -23,9 +23,9 @@ module OpenTox end public - def self.find(uri) + def self.find( uri, accept_header='application/rdf+xml' ) task = Task.new(uri) - task.reload + task.reload( accept_header ) return task end @@ -36,8 +36,8 @@ module OpenTox return task end - def reload - result = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, false)#'application/x-yaml'}) + def reload( accept_header='application/rdf+xml' ) + result = RestClientWrapper.get(uri, {:accept => accept_header}, false)#'application/x-yaml'}) @http_code = result.code reload_from_data(result, result.content_type, uri) end @@ -95,8 +95,8 @@ module OpenTox def wait_for_completion(dur=0.3) if (@uri.match(@@config[:services]["opentox-task"])) - due_to_time = Time.parse(@due_to_time) - running_time = due_to_time - Time.parse(@date) + due_to_time = (@due_to_time.is_a?(Time) ? @due_to_time : Time.parse(@due_to_time)) + running_time = due_to_time - (@date.is_a?(Time) ? @date : Time.parse(@date)) else # the date of the external task cannot be trusted, offest to local time might be to big due_to_time = Time.new + EXTERNAL_TASK_MAX_DURATION -- cgit v1.2.3 From 92bb08ac2e9e21a7bade2c272740fe3a1691cb85 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 30 Jul 2010 15:35:14 +0200 Subject: fix dataset.find to not request yaml from ambit --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index e43ce96..3efff7d 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -16,7 +16,7 @@ module OpenTox unless accept_header #if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /informatik/ - if !@@config[:accept_headers]["opentox-dataset"].grep(/yaml/).empty? + if uri.match(@@config[:services]["opentox-dataset"]) && !@@config[:accept_headers]["opentox-dataset"].grep(/yaml/).empty? accept_header = 'application/x-yaml' else accept_header = "application/rdf+xml" -- cgit v1.2.3 From 87c815a3eedd87d08f7dc74c3dbfdaf9867103a6 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 2 Aug 2010 15:20:44 +0200 Subject: handle missing features, some more documentation for owl --- lib/dataset.rb | 4 ++-- lib/owl.rb | 33 +++++++++++++++++++++------------ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 3efff7d..257cc17 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -25,7 +25,7 @@ module OpenTox case accept_header when "application/x-yaml" - d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s + d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s d.uri = uri unless d.uri when "application/rdf+xml" owl = OpenTox::Owl.from_uri(uri.to_s.strip, "Dataset") @@ -172,7 +172,7 @@ module OpenTox raise "invalid internal value type" end end - raise "feature value no found: "+feature.to_s + return nil #missing value else raise "value is not an array\n"+ "value "+v.to_s+"\n"+ diff --git a/lib/owl.rb b/lib/owl.rb index fe96a6b..6d50d69 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -93,7 +93,7 @@ module OpenTox [ "crossvalidation" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Crossvalidation"} # literals point to primitive values (not to other resources) - # the literal datatype is encoded is uri: + # the literal datatype is encoded via uri: LITERAL_DATATYPE_STRING = XML["string"].uri LITERAL_DATATYPE_URI = XML["anyURI"].uri LITERAL_DATATYPE_FLOAT = XML["float"].uri @@ -104,7 +104,7 @@ module OpenTox LITERAL_DATATYPE_INTEGER = XML["integer"].uri # list all literals (to distinguish from objectProperties) as keys, datatype as values - # (do not add dc-identifier, deprecated, object are identified over via name=uri) + # (do not add dc-identifier, deprecated, object are identified via name=uri) LITERAL_TYPES = {} [ "title", "creator", "format", "description", "hasStatus", "paramScope", "paramValue", "value", "classValue", "reportType", "confusionMatrixActual", @@ -150,6 +150,7 @@ module OpenTox # uri the uri of the object attr_accessor :ot_class, :root_node, :uri, :model + private def initialize @model = Redland::Model.new Redland::MemoryStore.new end @@ -157,6 +158,7 @@ module OpenTox # build new owl object # ot_class is the class of this object, should be a string like "Model", "Task", ... # uri is name and identifier of this object + public def self.create( ot_class, uri ) owl = OpenTox::Owl.new @@ -255,7 +257,15 @@ module OpenTox end public - # sets values of current_node, by default root_node + # sets values of current_node (by default root_node) + # + # note: this does not delete existing triples + # * there can be several triples for the same subject and predicate + # ( e.g. after set("description","bla1") and set("description","bla2") + # both descriptions are in the model, + # but the get("description") will give you only one object (by chance) + # * this does not matter in pratice (only dataset uses this -> load_dataset-methods) + # * identical values appear only once in rdf def set(predicate, object, current_node=@root_node) pred = predicate.to_s @@ -268,10 +278,10 @@ module OpenTox end if pred=="type" - # predicat is type, set class of current node + # predicate is type, set class of current node @model.add current_node, RDF_TYPE, node(object) @model.add node(object), RDF_TYPE, OWL_TYPE_CLASS - # example-triples: + # example-triples for setting rdf-type to model: # model_xy,rdf:type,ot:Model # ot:Model,rdf:type,owl:Class elsif LITERAL_TYPES.has_key?(pred) @@ -279,7 +289,7 @@ module OpenTox predicate_node = node(pred) @model.add current_node, predicate_node, Redland::Literal.create(object, LITERAL_TYPES[pred]) @model.add predicate_node, RDF_TYPE, OWL_TYPE_LITERAL - # example-triples: + # example-triples for setting description of a model: # model_xy,ot:description,bla..bla^^xml:string # ot:description,rdf:type,owl:Literal elsif OBJECT_PROPERTY_CLASS.has_key?(pred) @@ -291,7 +301,7 @@ module OpenTox object_class_node = node(OBJECT_PROPERTY_CLASS[pred]) @model.add object_node, RDF_TYPE, object_class_node @model.add object_class_node, RDF_TYPE, OWL_TYPE_CLASS - # example-triples: + # example-triples for setting algorithm property of a model: # model_xy,ot:algorithm,algorihtm_xy # ot:algorithm,rdf:type,owl:ObjectProperty # algorihtm_xy,rdf:type,ot:Algorithm @@ -301,7 +311,7 @@ module OpenTox end end - # this is (a recursiv method) to set not only simple properties but nested-data via hashes + # this is (a recursiv method) to set nested-data via hashes (not only simple properties) # example (for a dataset) # { :description => "bla", # :compound => { :uri => "compound_uri", @@ -406,7 +416,7 @@ module OpenTox @model.subjects(RDF_TYPE, node('Feature')).each do |feature| features << get_value(feature) end - LOGGER.debug "loaded "+compounds.size.to_s+" compounds and "+features.size.to_s+" features" + LOGGER.debug "loaded "+compounds.size.to_s+" compounds and "+features.size.to_s+" features from dataset "+uri.to_s end # loading feature values for the specified feature @@ -460,10 +470,9 @@ module OpenTox raise "feature value type not yet implemented "+value_node_type.to_s end count += 1 - LOGGER.debug "loaded "+count.to_s+" feature values" if (count%500 == 0) + LOGGER.debug "loading feature values ("+count.to_s+")" if (count%1000 == 0) end LOGGER.debug "loaded "+count.to_s+" feature values" end end -end - +end \ No newline at end of file -- cgit v1.2.3 From ff2a7af228fd6d0d23d29ef249422890841b526c Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 3 Aug 2010 08:54:09 +0200 Subject: fix dataset rdf support --- lib/owl.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/owl.rb b/lib/owl.rb index 6d50d69..62ef5d2 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -81,6 +81,7 @@ module OpenTox "predictedVariables", "predictionFeature" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Feature"} [ "parameters" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Parameter"} [ "compound" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Compound"} + [ "complexValue" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Tuple"} [ "dataEntry" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "DataEntry"} [ "values" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "FeatureValue"} [ "classificationStatistics" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ClassificationStatistics"} @@ -92,6 +93,7 @@ module OpenTox [ "crossvalidationInfo" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "CrossvalidationInfo"} [ "crossvalidation" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Crossvalidation"} + # literals point to primitive values (not to other resources) # the literal datatype is encoded via uri: LITERAL_DATATYPE_STRING = XML["string"].uri @@ -328,9 +330,9 @@ module OpenTox raise "hash key must be a object-property, please add '"+prop.to_s+ "' to OpenTox::OWL.OBJECT_PROPERTY_CLASS" unless OBJECT_PROPERTY_CLASS[prop] # the new node is a class node - if v["uri"] + if v[:uri] # identifier is either a specified uri - class_node = Redland::Resource.new(v.delete("uri")) + class_node = Redland::Resource.new(v.delete(:uri)) else # or a new uri, make up internal uri with increment class_node = new_class_node(OBJECT_PROPERTY_CLASS[prop],current_node) -- cgit v1.2.3 From 9d2f25cdfc340bc7d9df7a041a5b23c1552c7d53 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 4 Aug 2010 10:55:48 +0200 Subject: dataset to/from rdf now working again --- lib/dataset.rb | 16 ++-- lib/owl.rb | 254 +++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 162 insertions(+), 108 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 257cc17..4ce9ffe 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -16,7 +16,7 @@ module OpenTox unless accept_header #if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /informatik/ - if uri.match(@@config[:services]["opentox-dataset"]) && !@@config[:accept_headers]["opentox-dataset"].grep(/yaml/).empty? + if (uri.match(@@config[:services]["opentox-dataset"]) || uri =~ /in-silico.ch/) && !@@config[:accept_headers]["opentox-dataset"].grep(/yaml/).empty? accept_header = 'application/x-yaml' else accept_header = "application/rdf+xml" @@ -144,12 +144,6 @@ module OpenTox else LOGGER.warn "no confidence for compound: "+compound.to_s+", feature: "+feature.to_s return 1 -# raise "prediction confidence value is not a hash value\n"+ -# "value "+v.to_s+"\n"+ -# "value-class "+v.class.to_s+"\n"+ -# "dataset "+@uri.to_s+"\n"+ -# "compound "+compound.to_s+"\n"+ -# "feature "+feature.to_s+"\n" end end @@ -160,7 +154,7 @@ module OpenTox end v = @data[compound] - raise "no values for compound "+compound.to_s if v==nil + return nil if v == nil # missing values for all features if v.is_a?(Array) # PENDING: why using an array here? v.each do |e| @@ -187,11 +181,11 @@ module OpenTox def load_feature_values(feature=nil) if feature raise "feature already loaded" unless @dirty_features.include?(feature) - @owl.load_dataset_feature_values(@compounds, @data, feature) + @owl.load_dataset_feature_values(@compounds, @data, [feature]) @dirty_features.delete(feature) else - @data = {} - @owl.load_dataset_feature_values(@compounds, @data) + @data = {} unless @data + @owl.load_dataset_feature_values(@compounds, @data, @dirty_features) @dirty_features.clear end end diff --git a/lib/owl.rb b/lib/owl.rb index 62ef5d2..7447ce6 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -3,12 +3,14 @@ # and to access the stored value as correct ruby type class Redland::Literal - def self.create(value, datatype) - raise "literal datatype may not be nil" unless datatype - if datatype.is_a?(Redland::Uri) - Redland::Literal.new(value.to_s,nil,datatype) + def self.create(value, type) + raise "literal datatype may not be nil" unless type + type = parse_datatype_uri(value) if OpenTox::Owl::PARSE_LITERAL_TYPE==type + + if type.is_a?(Redland::Uri) + Redland::Literal.new(value.to_s,nil,type) else - Redland::Literal.new(value.to_s,nil,Redland::Uri.new(datatype.to_s)) + Redland::Literal.new(value.to_s,nil,Redland::Uri.new(type.to_s)) end end @@ -54,6 +56,32 @@ class Redland::Literal "), please specify new OpenTox::Owl::LITERAL_DATATYPE" end end + + # parse datatype uri accoring to value class + def self.parse_datatype_uri(value) + if value==nil + raise "illegal datatype: value is nil" + elsif value.is_a?(String) + # PENDING: uri check too slow? + if OpenTox::Utils.is_uri?(value) + return OpenTox::Owl::LITERAL_DATATYPE_URI + else + return OpenTox::Owl::LITERAL_DATATYPE_STRING + end + elsif value.is_a?(Float) + return OpenTox::Owl::LITERAL_DATATYPE_FLOAT + elsif value.is_a?(TrueClass) or value.is_a?(FalseClass) + return OpenTox::Owl::LITERAL_DATATYPE_BOOLEAN + elsif value.is_a?(Integer) + return OpenTox::Owl::LITERAL_DATATYPE_INTEGER + elsif value.is_a?(DateTime) + return OpenTox::Owl::LITERAL_DATATYPE_DATETIME + elsif value.is_a?(Time) + return OpenTox::Owl::LITERAL_DATATYPE_DATETIME + else + raise "illegal datatype: "+value.class.to_s+" "+value.to_s + end + end end module OpenTox @@ -63,15 +91,17 @@ module OpenTox # to get correct owl-dl, properties and objects have to be typed # i.e. the following triple is insufficient: # ModelXY,ot:algorithm,AlgorithmXY - # furhter needed: + # further needed: # ot:algorithm,rdf:type,owl:ObjectProperty # AlgorithmXY,rdf:type,ot:Algorithm # ot:Algorithm,rdf:type,owl:Class # # therefore OpentoxOwl needs info about the opentox-ontology # the info is stored in OBJECT_PROPERTY_CLASS and LITERAL_TYPES - + # contains all owl:ObjectProperty as keys, and the respective classes as value + # some object properties link to objects from different classes (e.g. "values can be "Tuple", or "FeatureValue") + # in this case, use set_object_property() (instead of set()) and specify class manually OBJECT_PROPERTY_CLASS = {} [ "model" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Model"} [ "algorithm" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Algorithm"} @@ -81,9 +111,8 @@ module OpenTox "predictedVariables", "predictionFeature" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Feature"} [ "parameters" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Parameter"} [ "compound" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Compound"} - [ "complexValue" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Tuple"} [ "dataEntry" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "DataEntry"} - [ "values" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "FeatureValue"} + [ "complexValue" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "FeatureValue"} [ "classificationStatistics" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ClassificationStatistics"} [ "classValueStatistics" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ClassValueStatistics"} [ "confusionMatrix" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ConfusionMatrix"} @@ -93,7 +122,6 @@ module OpenTox [ "crossvalidationInfo" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "CrossvalidationInfo"} [ "crossvalidation" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Crossvalidation"} - # literals point to primitive values (not to other resources) # the literal datatype is encoded via uri: LITERAL_DATATYPE_STRING = XML["string"].uri @@ -109,7 +137,7 @@ module OpenTox # (do not add dc-identifier, deprecated, object are identified via name=uri) LITERAL_TYPES = {} [ "title", "creator", "format", "description", "hasStatus", "paramScope", "paramValue", - "value", "classValue", "reportType", "confusionMatrixActual", + "classValue", "reportType", "confusionMatrixActual", "confusionMatrixPredicted" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_STRING } [ "date", "due_to_time" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_DATE } [ "percentageCompleted", "truePositiveRate", "fMeasure", "falseNegativeRate", @@ -125,6 +153,9 @@ module OpenTox "crossvalidationFold" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_INTEGER } [ "resultURI" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_URI } [ "stratified" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_BOOLEAN } + # some literals can have different types, parse from ruby type + PARSE_LITERAL_TYPE = "PARSE_LITERAL_TYPE" + [ "value" ].each{ |l| LITERAL_TYPES[l] = PARSE_LITERAL_TYPE } # constants for often used redland-resources OWL_TYPE_LITERAL = OWL["AnnotationProperty"] @@ -268,12 +299,12 @@ module OpenTox # but the get("description") will give you only one object (by chance) # * this does not matter in pratice (only dataset uses this -> load_dataset-methods) # * identical values appear only once in rdf - def set(predicate, object, current_node=@root_node) + def set(predicate, object, current_node=@root_node ) pred = predicate.to_s raise "uri is no prop, cannot set uri" if pred=="uri" raise "dc[identifier] deprecated, use owl.uri" if pred=="identifier" - unless object && object.to_s.size>0 + if (object.is_a?(Redland::Node) and object.blank?) or nil==object or object.to_s.size==0 # set only not-nil values LOGGER.warn "skipping (not setting) empty value in rdf for property: '"+pred+"'" return @@ -281,63 +312,78 @@ module OpenTox if pred=="type" # predicate is type, set class of current node - @model.add current_node, RDF_TYPE, node(object) - @model.add node(object), RDF_TYPE, OWL_TYPE_CLASS - # example-triples for setting rdf-type to model: - # model_xy,rdf:type,ot:Model - # ot:Model,rdf:type,owl:Class + set_type(object, current_node) elsif LITERAL_TYPES.has_key?(pred) # predicate is literal - predicate_node = node(pred) - @model.add current_node, predicate_node, Redland::Literal.create(object, LITERAL_TYPES[pred]) - @model.add predicate_node, RDF_TYPE, OWL_TYPE_LITERAL - # example-triples for setting description of a model: - # model_xy,ot:description,bla..bla^^xml:string - # ot:description,rdf:type,owl:Literal + set_literal(pred,object,LITERAL_TYPES[pred],current_node) elsif OBJECT_PROPERTY_CLASS.has_key?(pred) # predicte is objectProperty, object is another resource - predicate_node = node(pred) - object_node = Redland::Resource.new(object) - @model.add current_node, predicate_node, object_node - @model.add predicate_node, RDF_TYPE, OWL_TYPE_OBJECT_PROPERTY - object_class_node = node(OBJECT_PROPERTY_CLASS[pred]) - @model.add object_node, RDF_TYPE, object_class_node - @model.add object_class_node, RDF_TYPE, OWL_TYPE_CLASS - # example-triples for setting algorithm property of a model: - # model_xy,ot:algorithm,algorihtm_xy - # ot:algorithm,rdf:type,owl:ObjectProperty - # algorihtm_xy,rdf:type,ot:Algorithm - # ot:Algorithm,rdf:type,owl:Class + set_object_property(pred,object,OBJECT_PROPERTY_CLASS[pred],current_node) else raise "unkonwn rdf-property, please add: '"+pred+"' to OpenTox::OWL.OBJECT_PROPERTY_CLASS or OpenTox::OWL.LITERAL_TYPES" end end + + # example-triples for setting rdf-type to model: + # model_xy,rdf:type,ot:Model + # ot:Model,rdf:type,owl:Class + def set_type(ot_class, current_node=@root_node) + @model.add current_node, RDF_TYPE, node(ot_class) + @model.add node(ot_class), RDF_TYPE, OWL_TYPE_CLASS + end + + # example-triples for setting description of a model: + # model_xy,ot:description,bla..bla^^xml:string + # ot:description,rdf:type,owl:Literal + def set_literal(literal_name, literal_value, literal_datatype, current_node=@root_node) + @model.add current_node, node(literal_name), Redland::Literal.create(literal_value, literal_datatype) + @model.add node(literal_name), RDF_TYPE, OWL_TYPE_LITERAL + end + + # example-triples for setting algorithm property of a model: + # model_xy,ot:algorithm,algorihtm_xy + # ot:algorithm,rdf:type,owl:ObjectProperty + # algorihtm_xy,rdf:type,ot:Algorithm + # ot:Algorithm,rdf:type,owl:Class + def set_object_property(property, object, object_class, current_node=@root_node) + object_node = Redland::Resource.new(object) + @model.add current_node, node(property), object_node + @model.add node(property), RDF_TYPE, OWL_TYPE_OBJECT_PROPERTY + @model.add object_node, RDF_TYPE, node(object_class) + @model.add node(object_class), RDF_TYPE, OWL_TYPE_CLASS + end # this is (a recursiv method) to set nested-data via hashes (not only simple properties) # example (for a dataset) # { :description => "bla", - # :compound => { :uri => "compound_uri", - # :dataEntry: => { :values => [ { :feature => "feat1", - # :value => 42 }, - # { :feature => "feat2", - # :value => 43 } ] } } } + # :dataEntry => { :compound => "compound_uri", + # :values => [ { :class => "FeatureValue" + # :feature => "feat1", + # :value => 42 }, + # { :class => "FeatureValue" + # :feature => "feat2", + # :value => 123 } ] } } def set_data(hash, current_node=@root_node) hash.each do |k,v| if v.is_a?(Hash) # value is again a hash prop = k.to_s + + # :class is a special key to specify the class value, if not defined in OBJECT_PROPERTY_CLASS + object_class = v.has_key?(:class) ? v.delete(:class) : OBJECT_PROPERTY_CLASS[prop] raise "hash key must be a object-property, please add '"+prop.to_s+ - "' to OpenTox::OWL.OBJECT_PROPERTY_CLASS" unless OBJECT_PROPERTY_CLASS[prop] - # the new node is a class node + "' to OpenTox::OWL.OBJECT_PROPERTY_CLASS or specify :class value" unless object_class + + # the new node is a class node, to specify the uri of the resource use key :uri if v[:uri] # identifier is either a specified uri class_node = Redland::Resource.new(v.delete(:uri)) else # or a new uri, make up internal uri with increment - class_node = new_class_node(OBJECT_PROPERTY_CLASS[prop],current_node) + class_node = new_class_node(object_class,current_node) end - set(prop,class_node,current_node) + set_object_property(prop,class_node,object_class,current_node) # recursivly call set_data method with new node set_data(v,class_node) elsif v.is_a?(Array) @@ -386,28 +432,33 @@ module OpenTox set_data( :parameters => converted_params ) end - + # PENDING move to dataset.rb # this is for dataset.to_owl # adds feautre value for a single compound def add_data_entries(compound_uri,features) - data_entry_values = [] - features.each do |f| - f.each do |feature_uri,value| - if value.is_a?(Hash) - complex_values = [] - value.each do |uri,v| - complex_values << { :feature => uri, :value => v } + data_entry = { :compound => compound_uri } + if features + feature_values = [] + features.each do |f| + f.each do |feature_uri,value| + if value.is_a?(Hash) + complex_values = [] + value.each do |uri,v| + complex_values << { :feature => uri, :value => v } + end + feature_values << { :class => "Tuple", :feature => feature_uri, :complexValue => complex_values } + else + feature_values << { :class => "FeatureValue", :feature => feature_uri, :value => value } end - data_entry_values << { :feature => feature_uri, :complexValue => complex_values } - else - data_entry_values << { :feature => feature_uri, :value => value } end end + data_entry[:values] = feature_values end - set_data( :compound => { :uri => compound_uri, :dataEntry => { :values => data_entry_values } } ) + set_data( :dataEntry => data_entry ) end + # PENDING move to dataset.rb # feature values are not loaded for performance reasons # loading compounds and features into arrays that are given as params def load_dataset( compounds, features ) @@ -415,66 +466,75 @@ module OpenTox @model.subjects(RDF_TYPE, node('Compound')).each do |compound| compounds << get_value(compound) end + @model.subjects(RDF_TYPE, node('Feature')).each do |feature| - features << get_value(feature) + feature_value_found=false + @model.find(nil, node("feature"), feature) do |potential_feature_value,p,o| + @model.find(nil, node("values"), potential_feature_value) do |s,p,o| + feature_value_found=true + break + end + break if feature_value_found + end + features << get_value(feature) if feature_value_found end LOGGER.debug "loaded "+compounds.size.to_s+" compounds and "+features.size.to_s+" features from dataset "+uri.to_s end + # PENDING move to dataset.rb # loading feature values for the specified feature # if feature is nil, all feature values are loaded # # general remark on the rdf loading (found out with some testing): # the search methods (subjects/find) are fast, the time consuming parts is creating resources, # which cannot be avoided in general - def load_dataset_feature_values( compounds, data, feature_uri=nil ) + def load_dataset_feature_values( compounds, data, feature_uris ) - LOGGER.debug("load feature values"+ ( (feature_uri!=nil)?(" for feature: "+feature_uri):"") ) + raise "no feature-uri array" unless feature_uris.is_a?(Array) # values are stored in the data-hash, hash has a key for each compound compounds.each{|c| data[c] = [] unless data[c]} - load_all_features = feature_uri==nil - feature_node = nil - - # create feature node for feature uri if specified - unless load_all_features - @model.subjects(RDF_TYPE, OT['Feature']).each do |feature| - if feature_uri==get_value(feature) - feature_node = feature - break - end - end - raise "feature node not found" unless feature_node - end - count = 0 - - # search for all feature_value_node with property 'ot_feature' - # feature_node is either nil, i.e. a wildcard or specified - @model.find(nil, node('feature'), feature_node) do |feature_value_node,p,o| - - # get compound_uri by "backtracking" to values node (property is 'values'), then get compound_node via 'compound' - value_nodes = @model.subjects(node('values'),feature_value_node) - raise "more than one value node "+value_nodes.size.to_s unless value_nodes.size==1 - value_node = value_nodes[0] - - compound_uri = get_value( @model.object(value_node, node('compound')) ) - # if load all features, feautre_uri is not specified, derieve from feature_node - feature_uri = get_value(o) if load_all_features + + feature_uris.each do |feature_uri| + LOGGER.debug("load feature values for feature: "+feature_uri ) + feature_node = Redland::Resource.new(feature_uri) - value_node_type = @model.object(feature_value_node, RDF_TYPE) - if (value_node_type == node('FeatureValue')) - value_literal = @model.object( feature_value_node, node('value')) - raise "feature value no literal" unless value_literal.is_a?(Redland::Literal) - data[compound_uri] << {feature_uri => value_literal.get_value } - else - raise "feature value type not yet implemented "+value_node_type.to_s + # search for all feature_value_node with property 'ot_feature' and the feature we are looking for + @model.find(nil, node('feature'), feature_node) do |feature_value_node,p,o| + + # get compound_uri by "backtracking" to values node (property is 'values'), then get compound_node via 'compound' + value_nodes = @model.subjects(node('values'),feature_value_node) + if value_nodes.size>0 + raise "more than one value node "+value_nodes.size.to_s if value_nodes.size>1 + value_node = value_nodes[0] + + compound_uri = get_value( @model.object(value_node, node('compound')) ) + + value_node_type = @model.object(feature_value_node, RDF_TYPE) + if (value_node_type == node('FeatureValue')) + value_literal = @model.object( feature_value_node, node('value')) + raise "plain feature value no literal: "+value_literal.to_s unless value_literal.is_a?(Redland::Literal) + data[compound_uri] << {feature_uri => value_literal.get_value } + elsif (value_node_type == node('Tuple')) + complex_values = {} + @model.find(feature_value_node,node('complexValue'),nil) do |p,s,complex_value| + complex_value_type = @model.object(complex_value, RDF_TYPE) + raise "complex feature value no feature value: "+complex_value.to_s unless complex_value_type==node('FeatureValue') + complex_feature_uri = get_value(@model.object( complex_value, node('feature'))) + complex_value = @model.object( complex_value, node('value')) + raise "complex value no literal: "+complex_value.to_s unless complex_value.is_a?(Redland::Literal) + complex_values[ complex_feature_uri ] = complex_value.get_value + end + data[compound_uri] << { feature_uri => complex_values } if complex_values.size>0 + end + count += 1 + LOGGER.debug "loading feature values ("+count.to_s+")" if (count%1000 == 0) + end end - count += 1 - LOGGER.debug "loading feature values ("+count.to_s+")" if (count%1000 == 0) + LOGGER.debug "loaded "+count.to_s+" feature values for feature "+feature_node.to_s end - LOGGER.debug "loaded "+count.to_s+" feature values" end end end \ No newline at end of file -- cgit v1.2.3 From a161416cf82c2365094b041981a7a495eb268911 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 6 Aug 2010 13:33:40 +0200 Subject: log rotation disabled --- lib/environment.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/environment.rb b/lib/environment.rb index 917011d..1551448 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -45,7 +45,8 @@ end load File.join config_dir,"mail.rb" if File.exists?(File.join config_dir,"mail.rb") logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" -LOGGER = MyLogger.new(logfile,'daily') # daily rotation +#LOGGER = MyLogger.new(logfile,'daily') # daily rotation +LOGGER = MyLogger.new(logfile) # no rotation LOGGER.formatter = Logger::Formatter.new #this is neccessary to restore the formating in case active-record is loaded if @@config[:logger] and @@config[:logger] == "debug" LOGGER.level = Logger::DEBUG -- cgit v1.2.3 From 1a9cea692cca412038a39fea38dcf2542f10305e Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 6 Aug 2010 16:50:48 +0200 Subject: add owl_to_yaml to dataset.rb, add more comments to datset.rb --- lib/dataset.rb | 111 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 63 insertions(+), 48 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 4ce9ffe..c0f54fc 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -2,17 +2,33 @@ LOGGER.progname = File.expand_path(__FILE__) module OpenTox - class Dataset + class Dataset - attr_accessor :uri, :title, :creator, :data, :features, :compounds + attr_accessor :uri, :title, :creator, :data, :features, :compounds - def initialize - @data = {} - @features = [] - @compounds = [] - end - - def self.find(uri, accept_header=nil) + def initialize( owl=nil ) + @data = {} + @features = [] + @compounds = [] + + # creates dataset object from Opentox::Owl object + # use Dataset.find( ) to load dataset from rdf-supporting datasetservice + # note: does not load all feature values, as this is time consuming + if owl + raise "invalid param" unless owl.is_a?(OpenTox::Owl) + @title = owl.get("title") + @creator = owl.get("creator") + @uri = owl.uri + # when loading a dataset from owl, only compound- and feature-uris are loaded + owl.load_dataset(@compounds, @features) + # all features are marked as dirty + # as soon as a feature-value is requested all values for this feature are loaded from the rdf + @dirty_features = @features.dclone + @owl = owl + end + end + + def self.find(uri, accept_header=nil) unless accept_header #if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /informatik/ @@ -27,26 +43,23 @@ module OpenTox when "application/x-yaml" d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s d.uri = uri unless d.uri - when "application/rdf+xml" - owl = OpenTox::Owl.from_uri(uri.to_s.strip, "Dataset") - - d = Dataset.new - d.title = owl.get("title") - d.creator = owl.get("creator") - d.uri = owl.uri - - # when loading a dataset from owl, only compound- and feature-uris are loaded - owl.load_dataset(d.compounds, d.features) - # all features are marked as dirty, loaded dynamically later - d.init_dirty_features(owl) - - d.compounds.uniq! - d.features.uniq! + when "application/rdf+xml" + owl = OpenTox::Owl.from_uri(uri.to_s.strip, "Dataset") + d = Dataset.new(owl) else raise "cannot get datset with accept header: "+accept_header.to_s - end - return d - end + end + d + end + + # converts a dataset represented in owl to yaml + # (uses a temporary dataset) + # note: to_yaml is overwritten, loads complete owl dataset values + def self.owl_to_yaml( owl_data, uri) + owl = OpenTox::Owl.from_data(owl_data, uri, "Dataset") + d = Dataset.new(owl) + d.to_yaml + end # creates a new dataset, using only those compounsd specified in new_compounds # returns uri of new dataset @@ -87,8 +100,8 @@ module OpenTox def get_predicted_class(compound, feature) v = get_value(compound, feature) if v.is_a?(Hash) - k = v.keys.grep(/classification/).first - unless k.empty? + k = v.keys.grep(/classification/).first + unless k.empty? #if v.has_key?(:classification) return v[k] else @@ -110,8 +123,8 @@ module OpenTox def get_predicted_regression(compound, feature) v = get_value(compound, feature) if v.is_a?(Hash) - k = v.keys.grep(/regression/).first - unless k.empty? + k = v.keys.grep(/regression/).first + unless k.empty? return v[k] else return "no regression key" @@ -132,11 +145,11 @@ module OpenTox def get_prediction_confidence(compound, feature) v = get_value(compound, feature) if v.is_a?(Hash) - k = v.keys.grep(/confidence/).first - unless k.empty? + k = v.keys.grep(/confidence/).first + unless k.empty? #if v.has_key?(:confidence) return v[k].abs - #return v["http://ot-dev.in-silico.ch/model/lazar#confidence"].abs + #return v["http://ot-dev.in-silico.ch/model/lazar#confidence"].abs else # PENDING: return nil isntead of raising an exception raise "no confidence key" @@ -189,23 +202,25 @@ module OpenTox @dirty_features.clear end end - - def save - # loads all features before loading + + # overwrite to yaml: + # in case dataset is loaded from owl: + # * load all values + # * set @owl to nil (not necessary in yaml) + def to_yaml + # loads all features if ((defined? @dirty_features) && @dirty_features.size > 0) - load_feature_values() + load_feature_values end - - @features.uniq! - @compounds.uniq! - OpenTox::RestClientWrapper.post(@@config[:services]["opentox-dataset"],{:content_type => "application/x-yaml"},self.to_yaml).strip - end + @owl = nil + super.to_yaml + end - def init_dirty_features(owl) - @dirty_features = @features.dclone - @owl = owl + # saves (changes) as new dataset in dataset service + # returns uri + # uses to yaml method (which is overwritten) + def save + OpenTox::RestClientWrapper.post(@@config[:services]["opentox-dataset"],{:content_type => "application/x-yaml"},self.to_yaml).strip end end - - end -- cgit v1.2.3 From a1e2344d3ceab4435288c6b6e5718f0f5d6f0b9f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 9 Aug 2010 10:03:07 +0200 Subject: Version bump to 1.6.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index dc1e644..9c6d629 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.0 +1.6.1 -- cgit v1.2.3 From 4d3edfda36a6bdc349c93162463dc5cac9157ef9 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 9 Aug 2010 10:03:11 +0200 Subject: opentox-api-wrapper bumped to 1.6.1 --- opentox-ruby-api-wrapper.gemspec | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 6edb865..64d3b7c 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.6.0" + s.version = "1.6.1" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein"] - s.date = %q{2010-07-19} + s.date = %q{2010-08-09} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] @@ -36,11 +36,12 @@ Gem::Specification.new do |s| "lib/model.rb", "lib/opentox-ruby-api-wrapper.rb", "lib/opentox.owl", + "lib/ot-logger.rb", + "lib/overwrite.rb", "lib/owl.rb", "lib/rest_client_wrapper.rb", "lib/spork.rb", "lib/task.rb", - "lib/tasks/opentox.rb", "lib/templates/config.yaml", "lib/templates/users.yaml", "lib/utils.rb", @@ -73,6 +74,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 1"]) s.add_runtime_dependency(%q, [">= 1"]) s.add_runtime_dependency(%q, [">= 1"]) @@ -99,6 +101,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) @@ -126,6 +129,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) -- cgit v1.2.3 From abe51eed641a8cb3532eb7f7c4addfadeb77eb0f Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 9 Aug 2010 14:19:42 +0200 Subject: remove double to_yaml --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index c0f54fc..84b1ec0 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -213,7 +213,7 @@ module OpenTox load_feature_values end @owl = nil - super.to_yaml + super end # saves (changes) as new dataset in dataset service -- cgit v1.2.3 From fa07e898dbc53f2f3cd9c5740ecbb2ebd29bd649 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 9 Aug 2010 17:37:26 +0200 Subject: configuration simplified --- lib/dataset.rb | 3 +-- lib/environment.rb | 4 ++-- lib/templates/config.yaml | 30 +++--------------------------- 3 files changed, 6 insertions(+), 31 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index c0f54fc..ca252a1 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -31,8 +31,7 @@ module OpenTox def self.find(uri, accept_header=nil) unless accept_header - #if uri.match(@@config[:services]["opentox-dataset"]) || uri=~ /188.40.32.88/ || uri =~ /informatik/ - if (uri.match(@@config[:services]["opentox-dataset"]) || uri =~ /in-silico.ch/) && !@@config[:accept_headers]["opentox-dataset"].grep(/yaml/).empty? + if (@@config[:yaml_hosts].include?(URI.parse(uri).host)) accept_header = 'application/x-yaml' else accept_header = "application/rdf+xml" diff --git a/lib/environment.rb b/lib/environment.rb index 1551448..80899c5 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -73,5 +73,5 @@ TRUE_REGEXP = /^(true|active|1|1.0)$/i FALSE_REGEXP = /^(false|inactive|0|0.0)$/i # Task durations -DEFAULT_TASK_MAX_DURATION = @@config[:default_task_max_duration] -EXTERNAL_TASK_MAX_DURATION = @@config[:external_task_max_duration] +DEFAULT_TASK_MAX_DURATION = 3600 +EXTERNAL_TASK_MAX_DURATION = 3600 diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index a833030..00c00cb 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -32,34 +32,10 @@ opentox-task: "http://localhost/task/" opentox-validation: "http://localhost/validation/" # -# Accept headers: +# Yaml capable hosts (faster than OWL-DL) # -:accept_headers: - opentox-compound: - - "chemical/x-daylight-smiles" - - "chemical/x-inchi" - - "chemical/x-mdl-sdfile" - - "image/gif" - - "text/plain" - opentox-dataset: - - "application/x-yaml" - - "application/rdf+xml" - opentox-algorithm: - - "application/x-yaml" - - "application/rdf+xml" - opentox-model: - - "application/x-yaml" - - "application/rdf+xml" - opentox-task: - - "application/x-yaml" - - "application/rdf+xml" - opentox-validation: - - "application/x-yaml" - - "application/rdf+xml" - -# Timeouts: -:default_task_max_duration: 3600 -:external_task_max_duration: 3600 +:yaml_hosts: + - "localhost" # Uncomment for verbose logging # :logger: debug -- cgit v1.2.3 From 9cddbf1ff98ba1bfda2087d9cc66134d0582c91e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 9 Aug 2010 17:47:56 +0200 Subject: Version bump to 1.6.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9c6d629..fdd3be6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.1 +1.6.2 -- cgit v1.2.3 From 44d05cec5a612f50f8a61ccd762c8176a0b8fd68 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 9 Aug 2010 17:47:58 +0200 Subject: opentox-api-wrapper bumped to 1.6.2 --- opentox-ruby-api-wrapper.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 64d3b7c..ea49791 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.6.1" + s.version = "1.6.2" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein"] -- cgit v1.2.3 From 2806bfff8a01f75351f31c5bd676b25b2fb36017 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 11 Aug 2010 08:46:45 +0200 Subject: add generic algorithm object --- lib/algorithm.rb | 19 +++++++++++++++++++ lib/model.rb | 5 ++--- lib/owl.rb | 4 ++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index cc06032..30a41e0 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -2,6 +2,25 @@ LOGGER.progname = File.expand_path(__FILE__) module OpenTox module Algorithm + + + class Generic + + attr_accessor :uri, :title, :date + + def self.find(uri) + owl = OpenTox::Owl.from_uri(uri, "Algorithm") + return self.new(owl) + end + + protected + def initialize(owl) + @title = owl.get("title") + @date = owl.get("date") + @uri = owl.uri + end + + end class Fminer diff --git a/lib/model.rb b/lib/model.rb index b6cef46..25266e3 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -21,9 +21,8 @@ module OpenTox protected def initialize(owl) - [:date, :creator, :title, :format, :algorithm, :dependentVariables, - :independentVariables, :predictedVariables, :trainingDataset].each do |a| - self.send("#{a.to_s}=".to_sym, owl.get(a.to_s)) + MODEL_ATTRIBS.each do |a| + self.send("#{a.to_s}=".to_sym, owl.get(a.to_s)) unless a==:uri end @uri = owl.uri if ENV['RACK_ENV'] =~ /test|debug/ diff --git a/lib/owl.rb b/lib/owl.rb index 7447ce6..245dcc7 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -233,7 +233,7 @@ module OpenTox unless owl.root_node types = [] owl.model.find(nil, RDF_TYPE, nil){ |s,p,o| types << o.to_s } - raise "root node for class '"+ot_class+"' not found (available type nodes: "+types.inspect+")" + raise "root node for class '"+owl.node(ot_class).to_s+"' not found (available type nodes: "+types.inspect+")" end raise "no uri in rdf: '"+owl.uri+"'" unless owl.uri and Utils.is_uri?(owl.uri) owl.ot_class = ot_class @@ -244,7 +244,7 @@ module OpenTox end def self.from_uri(uri, ot_class) - return from_data(RestClientWrapper.get(uri,:accept => "application/rdf+xml").to_s, uri, ot_class) + return from_data(RestClientWrapper.get(uri,:accept => "application/rdf+xml").to_s, uri, ot_class) end def rdf -- cgit v1.2.3 From 87d5cbe58fb6841227ba2a098c150a9ef400d820 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 11 Aug 2010 10:54:00 +0200 Subject: remove prognames to shorten log --- lib/algorithm.rb | 1 - lib/dataset.rb | 2 -- lib/ot-logger.rb | 2 +- lib/task.rb | 2 -- 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 9d87c7a..2fde0eb 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -1,4 +1,3 @@ -LOGGER.progname = File.expand_path(__FILE__) module OpenTox module Algorithm diff --git a/lib/dataset.rb b/lib/dataset.rb index 654a275..0be804c 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -1,5 +1,3 @@ -LOGGER.progname = File.expand_path(__FILE__) - module OpenTox class Dataset diff --git a/lib/ot-logger.rb b/lib/ot-logger.rb index 6c35ed2..df38d77 100644 --- a/lib/ot-logger.rb +++ b/lib/ot-logger.rb @@ -14,7 +14,7 @@ class MyLogger < Logger n = 2 line = lines[n] - while (line =~ /spork.rb/ or line =~ /as_task/ or line =~ /environment.rb/) + while (line =~ /spork.rb/ or line =~ /as_task/ or line =~ /ot-logger.rb/) n += 1 line = lines[n] end diff --git a/lib/task.rb b/lib/task.rb index b563fe6..971478f 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,5 +1,3 @@ -LOGGER.progname = File.expand_path(__FILE__) - $self_task=nil module OpenTox -- cgit v1.2.3 From 179a7f39b564c19b279bdee2356e5bdb6289a40a Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 18 Aug 2010 19:52:05 +0200 Subject: Version bump to 1.6.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index fdd3be6..266146b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.2 +1.6.3 -- cgit v1.2.3 From 58074217b21441ef596c12ca0f9597a65708079b Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 18 Aug 2010 19:52:09 +0200 Subject: opentox-api-wrapper bumped to 1.6.3 --- opentox-ruby-api-wrapper.gemspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index ea49791..4240e51 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.6.2" + s.version = "1.6.3" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein"] - s.date = %q{2010-08-09} + s.date = %q{2010-08-18} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] -- cgit v1.2.3 From e8188766495356ef156c957316ab2fea368dd271 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 19 Aug 2010 11:21:39 +0200 Subject: as_task: title and creator required, fix create_new_dataset from owl dataset --- lib/dataset.rb | 4 ++-- lib/task.rb | 66 ++++++++++++++++++++++++++++++++-------------------------- 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 0be804c..ef5b97f 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -66,8 +66,8 @@ module OpenTox raise "no new compounds selected" unless new_compounds and new_compounds.size>0 # load require features - if ((defined? @dirty_features) && (@dirty_features - new_features).size > 0) - (@dirty_features - new_features).each{|f| load_feature_values(f)} + if ((defined? @dirty_features) && (@dirty_features & new_features).size > 0) + (@dirty_features & new_features).each{|f| load_feature_values(f)} end dataset = OpenTox::Dataset.new diff --git a/lib/task.rb b/lib/task.rb index 971478f..1ab3893 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -2,7 +2,7 @@ $self_task=nil module OpenTox - class Task + class Task # due_to_time is only set in local tasks TASK_ATTRIBS = [ :uri, :date, :title, :creator, :description, :hasStatus, :percentageCompleted, :resultURI, :due_to_time ] @@ -15,13 +15,13 @@ module OpenTox end # create is private now, use OpenTox::Task.as_task - def self.create(max_duration) - task_uri = RestClientWrapper.post(@@config[:services]["opentox-task"], {:max_duration => max_duration}, nil, false).to_s - Task.find(task_uri.chomp) - end - + def self.create( params ) + task_uri = RestClientWrapper.post(@@config[:services]["opentox-task"], params, nil, false).to_s + Task.find(task_uri.chomp) + end + public - def self.find( uri, accept_header='application/rdf+xml' ) + def self.find( uri, accept_header=nil ) task = Task.new(uri) task.reload( accept_header ) return task @@ -34,7 +34,14 @@ module OpenTox return task end - def reload( accept_header='application/rdf+xml' ) + def reload( accept_header=nil ) + unless accept_header + if (@@config[:yaml_hosts].include?(URI.parse(uri).host)) + accept_header = "application/x-yaml" + else + accept_header = 'application/rdf+xml' + end + end result = RestClientWrapper.get(uri, {:accept => accept_header}, false)#'application/x-yaml'}) @http_code = result.code reload_from_data(result, result.content_type, uri) @@ -58,20 +65,20 @@ module OpenTox raise "uri is null after loading" unless @uri and @uri.to_s.strip.size>0 end - def cancel + def cancel RestClientWrapper.put(File.join(@uri,'Cancelled')) reload - end + end - def completed(uri) - RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) + def completed(uri) + RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) reload - end + end - def error(description) + def error(description) RestClientWrapper.put(File.join(@uri,'Error'),{:description => description.to_s[0..2000]}) reload - end + end def pid=(pid) RestClientWrapper.put(File.join(@uri,'pid'), {:pid => pid}) @@ -81,16 +88,16 @@ module OpenTox @hasStatus.to_s == 'Running' end - def completed? - @hasStatus.to_s == 'Completed' - end + def completed? + @hasStatus.to_s == 'Completed' + end - def error? - @hasStatus.to_s == 'Error' - end + def error? + @hasStatus.to_s == 'Error' + end # waits for a task, unless time exceeds or state is no longer running - def wait_for_completion(dur=0.3) + def wait_for_completion(dur=0.3) if (@uri.match(@@config[:services]["opentox-task"])) due_to_time = (@due_to_time.is_a?(Time) ? @due_to_time : Time.parse(@due_to_time)) @@ -102,17 +109,17 @@ module OpenTox end LOGGER.debug "start waiting for task "+@uri.to_s+" at: "+Time.new.to_s+", waiting at least until "+due_to_time.to_s - while self.running? - sleep dur + while self.running? + sleep dur reload check_state if (Time.new > due_to_time) raise "max wait time exceeded ("+running_time.to_s+"sec), task: '"+@uri.to_s+"'" end - end + end LOGGER.debug "Task '"+@hasStatus+"': "+@uri.to_s+", Result: "+@resultURI.to_s - end + end def check_state begin @@ -133,10 +140,11 @@ module OpenTox # returns the task uri # catches halts and exceptions, task state is set to error then - def self.as_task(max_duration=DEFAULT_TASK_MAX_DURATION) + def self.as_task( title, creator, max_duration=DEFAULT_TASK_MAX_DURATION, description=nil ) #return yield nil - task = OpenTox::Task.create(max_duration) + params = {:title=>title, :creator=>creator, :max_duration=>max_duration, :description=>description } + task = OpenTox::Task.create(params) task_pid = Spork.spork(:logger => LOGGER) do LOGGER.debug "Task #{task.uri} started #{Time.now}" $self_task = task @@ -163,6 +171,6 @@ module OpenTox LOGGER.debug "Started task: "+task.uri.to_s task.uri end - end + end end -- cgit v1.2.3 From 8634a68f2eb77a9e73917bb2097d97eb207a544c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 20 Aug 2010 10:14:47 +0200 Subject: Version bump to 1.6.4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 266146b..9edc58b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.3 +1.6.4 -- cgit v1.2.3 From b06b7c7d3312e6b913ee9e6c35d0cfe93137756c Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 23 Aug 2010 15:49:04 +0200 Subject: owl-fix for nil-compounds --- lib/model.rb | 6 +++--- lib/owl.rb | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index e8f6048..fb25126 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -28,13 +28,13 @@ module OpenTox if ENV['RACK_ENV'] =~ /test|debug/ begin raise "uri invalid" unless Utils.is_uri?(@uri) - raise "no algorithm" unless @algorithm and @algorithm.size>0 - raise "no dependent variables" unless @dependentVariables and @dependentVariables.size>0 - raise "no indenpendent variables" unless @independentVariables raise "no predicted variables" unless @predictedVariables and @predictedVariables.size>0 rescue => ex RestClientWrapper.raise_uri_error "invalid model: '"+ex.message+"'\n"+self.to_yaml+"\n",@uri.to_s end + LOGGER.warn "model has no dependent variable" unless @dependentVariables and @dependentVariables.size>0 + LOGGER.warn "model has no algorithm" unless @algorithm and @algorithm.size>0 + LOGGER.warn "model has no indenpendent variables" unless @independentVariables end end end diff --git a/lib/owl.rb b/lib/owl.rb index a4c2e68..dcf26a5 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -518,6 +518,11 @@ module OpenTox value_node = value_nodes[0] compound_uri = get_value( @model.object(value_node, node('compound')) ) + unless compound_uri + LOGGER.warn "'compound' missing for data-entry of feature "+feature_uri.to_s+ + ", value: "+@model.object(feature_value_node,node("value")).to_s + next + end value_node_type = @model.object(feature_value_node, RDF_TYPE) if (value_node_type == node('FeatureValue')) -- cgit v1.2.3 From 7da48f4e8ab43e5fbc5379eae133dd9aa929ac55 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 23 Aug 2010 16:12:57 +0200 Subject: lib/dataset.rb --- lib/dataset.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index ef5b97f..2eb2206 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -202,16 +202,19 @@ module OpenTox # overwrite to yaml: # in case dataset is loaded from owl: - # * load all values - # * set @owl to nil (not necessary in yaml) + # * load all values def to_yaml # loads all features if ((defined? @dirty_features) && @dirty_features.size > 0) load_feature_values end - @owl = nil super end + + # * remove @owl from yaml, not necessary + def to_yaml_properties + super - ["@owl"] + end # saves (changes) as new dataset in dataset service # returns uri -- cgit v1.2.3 From df3ae4a9b84b12cb668e717d5f1c30891d5a2562 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 24 Aug 2010 13:58:49 +0200 Subject: add dm-validations to dependencies --- Rakefile | 3 ++- lib/environment.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index 41832bb..3846bd1 100644 --- a/Rakefile +++ b/Rakefile @@ -34,7 +34,8 @@ begin 'dm-timestamps', 'dm-types', 'dm-migrations', - "dm-mysql-adapter" + "dm-mysql-adapter", + "dm-validations", ].each {|dep| gem.add_dependency dep, ">= 1" } gem.add_dependency "haml", ">=3" ['cucumber','jeweler'].each { |dep| gem.add_development_dependency dep } diff --git a/lib/environment.rb b/lib/environment.rb index 80899c5..cfc875d 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -25,7 +25,7 @@ end # database if @@config[:database] - ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types', 'dm-migrations' ].each{|lib| require lib } + ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types', 'dm-migrations', 'dm-validations' ].each{|lib| require lib } case @@config[:database][:adapter] when /sqlite/i db_dir = File.join(basedir, "db") -- cgit v1.2.3 From 7cbb2402a4d01abcbfd3850650f9687b46804723 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 24 Aug 2010 17:52:33 +0200 Subject: initial lazar version for quantitative descriptors --- lib/algorithm.rb | 12 +++ lib/model.rb | 162 +++++++++++++++++++++++---------------- lib/validation.rb | 11 +-- opentox-ruby-api-wrapper.gemspec | 4 +- 4 files changed, 111 insertions(+), 78 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 2fde0eb..d7b57af 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -64,6 +64,18 @@ module OpenTox 0.0 end end + def self.euclidean(prop_a,prop_b) + common_properties = prop_a.keys & prop_b.keys + if common_properties.size > 1 + dist_sum = 0 + common_properties.each do |p| + dist_sum += (prop_a[p] - prop_b[p])**2 + end + 1/(1+Math.sqrt(dist_sum)) + else + nil + end + end end end diff --git a/lib/model.rb b/lib/model.rb index e8f6048..1cc0825 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -1,13 +1,13 @@ module OpenTox - module Model + module Model - class Generic + class Generic MODEL_ATTRIBS = [:uri, :title, :creator, :date, :format, :predictedVariables, :independentVariables, :dependentVariables, :trainingDataset, :algorithm] MODEL_ATTRIBS.each{ |a| attr_accessor(a) } - def self.find(uri) - owl = OpenTox::Owl.from_uri(uri, "Model") + def self.find(uri) + owl = OpenTox::Owl.from_uri(uri, "Model") return self.new(owl) end @@ -36,78 +36,108 @@ module OpenTox RestClientWrapper.raise_uri_error "invalid model: '"+ex.message+"'\n"+self.to_yaml+"\n",@uri.to_s end end - end - end + end + end - class PredictionModel < Generic + class PredictionModel < Generic + + def self.build( algorithm_uri, algorithm_params ) + + LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s + uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s + LOGGER.debug "Build model done: "+uri.to_s + RestClientWrapper.raise_uri_error("Invalid build model result: '"+uri.to_s+"'", algorithm_uri, algorithm_params ) unless Utils.model_uri?(uri) + return PredictionModel.find(uri) + end - def self.build( algorithm_uri, algorithm_params ) - - LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s - uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s - LOGGER.debug "Build model done: "+uri.to_s - RestClientWrapper.raise_uri_error("Invalid build model result: '"+uri.to_s+"'", algorithm_uri, algorithm_params ) unless Utils.model_uri?(uri) - return PredictionModel.find(uri) - end - - def predict_dataset( dataset_uri ) - - LOGGER.debug "Predict dataset: "+dataset_uri.to_s+" with model "+@uri.to_s - uri = RestClientWrapper.post(@uri, {:accept => "text/uri-list", :dataset_uri=>dataset_uri}) - RestClientWrapper.raise_uri_error("Prediciton result no dataset uri: "+uri.to_s, @uri, {:dataset_uri=>dataset_uri} ) unless Utils.dataset_uri?(uri) - uri - end - - def classification? - #HACK replace with request to ontology server - if @title =~ /(?i)classification/ - return true - elsif @title =~ /(?i)regression/ - return false - elsif @uri =~/ntua/ and @title =~ /mlr/ - return false - elsif @uri =~/tu-muenchen/ and @title =~ /regression|M5P|GaussP/ - return false - elsif @uri =~/ambit2/ and @title =~ /pKa/ || @title =~ /Regression|Caco/ - return false - elsif @uri =~/majority/ - return (@uri =~ /class/) != nil - else - raise "unknown model, uri:'"+@uri.to_s+"' title:'"+@title.to_s+"'" - end - end - end - + def predict_dataset( dataset_uri ) + + LOGGER.debug "Predict dataset: "+dataset_uri.to_s+" with model "+@uri.to_s + uri = RestClientWrapper.post(@uri, {:accept => "text/uri-list", :dataset_uri=>dataset_uri}) + RestClientWrapper.raise_uri_error("Prediciton result no dataset uri: "+uri.to_s, @uri, {:dataset_uri=>dataset_uri} ) unless Utils.dataset_uri?(uri) + uri + end + + def classification? + #HACK replace with request to ontology server + if @title =~ /(?i)classification/ + return true + elsif @title =~ /(?i)regression/ + return false + elsif @uri =~/ntua/ and @title =~ /mlr/ + return false + elsif @uri =~/tu-muenchen/ and @title =~ /regression|M5P|GaussP/ + return false + elsif @uri =~/ambit2/ and @title =~ /pKa/ || @title =~ /Regression|Caco/ + return false + elsif @uri =~/majority/ + return (@uri =~ /class/) != nil + else + raise "unknown model, uri:'"+@uri.to_s+"' title:'"+@title.to_s+"'" + end + end + end - class Lazar < Generic + class Lazar < Generic attr_accessor :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features - def initialize - @source = "http://github.com/helma/opentox-model" - @algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") - #@independent_variables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative") - @features = [] - @effects = {} - @activities = {} - @p_values = {} - @fingerprints = {} - end + def initialize + @source = "http://github.com/helma/opentox-model" + @algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") + #@independent_variables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative") + @features = [] + @effects = {} + @activities = {} + @p_values = {} + @fingerprints = {} + end + + def save + @features.uniq! + resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s + end + + def self.find_all + RestClientWrapper.get(@@config[:services]["opentox-model"]).chomp.split("\n") + end + + def self.predict(compound_uri,model_uri) + #RestClientWrapper.post(model_uri,{:compound_uri => compound_uri, :accept => 'application/x-yaml'}) + `curl -X POST -d 'compound_uri=#{compound_uri}' -H 'Accept:application/x-yaml' #{model_uri}` + end + end + + class PropertyLazar < Generic + + attr_accessor :feature_dataset_uri, :properties, :features, :activities#, :effects, :p_values + + def initialize + @source = "http://github.com/helma/opentox-model" + @algorithm = File.join(@@config[:services]["opentox-algorithm"],"property_lazar") + #@independent_variables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative") + @features = [] + #@effects = {} + @activities = {} + #@p_values = {} + @properties = {} + end - def save - @features.uniq! - resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s - end + def save + @features.uniq! + resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s + end - def self.find_all - RestClientWrapper.get(@@config[:services]["opentox-model"]).chomp.split("\n") - end + def self.find_all + RestClientWrapper.get(@@config[:services]["opentox-model"]).chomp.split("\n") + end def self.predict(compound_uri,model_uri) #RestClientWrapper.post(model_uri,{:compound_uri => compound_uri, :accept => 'application/x-yaml'}) - `curl -X POST -d 'compound_uri=#{compound_uri}' -H 'Accept:application/x-yaml' #{model_uri}` + `curl -X POST -d 'compound_uri=#{compound_uri}' -H 'Accept:application/x-yaml' #{model_uri}` end - end - end + end + end end diff --git a/lib/validation.rb b/lib/validation.rb index bd38488..89a2a0c 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -4,16 +4,7 @@ module OpenTox attr_accessor :uri def initialize(params) - #resource = RestClient::Resource.new(params[:uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) - #@uri = resource.post(params).body - #LOGGER.debug "VALIDATION URI: " + @uri.to_s - call = "curl -X POST " - params.each do |k,v| - call += " -d "+k.to_s+"=\""+URI.encode(v.to_s)+"\"" unless k == :uri - end - call += " "+params[:uri] - LOGGER.debug call - @uri = `#{call}` + @uri = OpenTox::RestClientWrapper.post(File.join(@@config[:services]["opentox-validation"],"/crossvalidation"),params,nil,false) end def self.crossvalidation(params) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 4240e51..1a487b0 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.6.3" + s.version = "1.6.4" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein"] - s.date = %q{2010-08-18} + s.date = %q{2010-08-20} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] -- cgit v1.2.3 From c82f2d63755393a37e156c5e40d8da0c08568364 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 25 Aug 2010 12:34:52 +0200 Subject: Regenerated gemspec for version 1.6.4 --- opentox-ruby-api-wrapper.gemspec | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 4240e51..37f3d17 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.6.3" + s.version = "1.6.4" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein"] - s.date = %q{2010-08-18} + s.date = %q{2010-08-25} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] @@ -81,6 +81,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 1"]) s.add_runtime_dependency(%q, [">= 1"]) s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) s.add_runtime_dependency(%q, [">= 3"]) s.add_development_dependency(%q, [">= 0"]) s.add_development_dependency(%q, [">= 0"]) @@ -108,6 +109,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 3"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -136,6 +138,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 3"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) -- cgit v1.2.3 From 4015327e7ab738bca0dfcfb08fd73f10c6cce067 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 25 Aug 2010 12:44:19 +0200 Subject: Version bump to 1.6.5 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9edc58b..9f05f9f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.4 +1.6.5 -- cgit v1.2.3 From 9c70b649c4090b47c12030cedf60cd9612159955 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 25 Aug 2010 12:50:22 +0200 Subject: Version bump to 1.6.6 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9f05f9f..ec70f75 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.5 +1.6.6 -- cgit v1.2.3 From fb084d809703a0de21ee2451f7caa1436ddcc018 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 25 Aug 2010 12:56:04 +0200 Subject: opentox-api-wrapper bumped to 1.6.5 --- VERSION | 2 +- opentox-ruby-api-wrapper.gemspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index ec70f75..9f05f9f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.6 +1.6.5 diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 37f3d17..f0a0816 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.6.4" + s.version = "1.6.5" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein"] -- cgit v1.2.3 From 48d044219674a96ba0d387311612c9fb95949e05 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 25 Aug 2010 14:49:25 +0200 Subject: Version bump to 1.6.6 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9f05f9f..ec70f75 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.5 +1.6.6 -- cgit v1.2.3 From 6a560290805ff49d7d43842dd8119a2e2bb06b4a Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 2 Sep 2010 13:09:19 +0200 Subject: old user authentification removed --- lib/algorithm.rb | 4 ++-- lib/authorization.rb | 24 ------------------------ lib/environment.rb | 14 -------------- lib/model.rb | 4 ++-- lib/opentox-ruby-api-wrapper.rb | 2 +- lib/rest_client_wrapper.rb | 2 +- lib/templates/users.yaml | 5 ----- opentox-ruby-api-wrapper.gemspec | 2 +- 8 files changed, 7 insertions(+), 50 deletions(-) delete mode 100644 lib/authorization.rb delete mode 100644 lib/templates/users.yaml diff --git a/lib/algorithm.rb b/lib/algorithm.rb index d7b57af..4d9156a 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -25,7 +25,7 @@ module OpenTox def self.create_feature_dataset(params) LOGGER.debug File.basename(__FILE__) + ": creating feature dataset" - resource = RestClient::Resource.new(params[:feature_generation_uri], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource = RestClient::Resource.new(params[:feature_generation_uri]) resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri] end @@ -40,7 +40,7 @@ module OpenTox LOGGER.debug params LOGGER.debug File.basename(__FILE__) + ": creating model" LOGGER.debug File.join(@@config[:services]["opentox-algorithm"], "lazar") - resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :user => @@users[:users].keys[0], :password => @@users[:users].values[0], :content_type => "application/x-yaml") + resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :content_type => "application/x-yaml") @uri = resource.post(:dataset_uri => params[:dataset_uri], :prediction_feature => params[:prediction_feature], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).body.chomp end diff --git a/lib/authorization.rb b/lib/authorization.rb deleted file mode 100644 index 9a1760a..0000000 --- a/lib/authorization.rb +++ /dev/null @@ -1,24 +0,0 @@ -helpers do - - def protected! - response['WWW-Authenticate'] = %(Basic realm="Opentox Webservice Authentication") and \ - throw(:halt, [401, "Not authorized\n"]) and \ - return unless authorized? - end - - def authorized? - @auth ||= Rack::Auth::Basic::Request.new(request.env) - @auth.provided? && @auth.basic? && @auth.credentials && valid_user? - end - - def valid_user? - users = @@users[:users] - return @auth.credentials == [@auth.username, users.fetch(@auth.username)] if users.has_key?(@auth.username) - return false - end - -end - -before do - #protected! unless env['REQUEST_METHOD'] == "GET" -end diff --git a/lib/environment.rb b/lib/environment.rb index cfc875d..c662e8b 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -54,20 +54,6 @@ else LOGGER.level = Logger::WARN end -if File.exist?(user_file) - @@users = YAML.load_file(user_file) -else - FileUtils.cp(File.join(File.dirname(__FILE__), 'templates/users.yaml'), user_file) - puts "Please edit #{user_file} and restart your application." - exit -end - -begin - 0 < @@users[:users].keys.length -rescue - raise "Please edit #{user_file} and restart your application. Create at least one user with password." -end - # Regular expressions for parsing classification data TRUE_REGEXP = /^(true|active|1|1.0)$/i FALSE_REGEXP = /^(false|inactive|0|0.0)$/i diff --git a/lib/model.rb b/lib/model.rb index e36b538..3ecd61c 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -95,7 +95,7 @@ module OpenTox def save @features.uniq! - resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource = RestClient::Resource.new(@@config[:services]["opentox-model"]) resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s end @@ -126,7 +126,7 @@ module OpenTox def save @features.uniq! - resource = RestClient::Resource.new(@@config[:services]["opentox-model"], :user => @@users[:users].keys[0], :password => @@users[:users].values[0]) + resource = RestClient::Resource.new(@@config[:services]["opentox-model"]) resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 45a3428..bae1155 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['owl', 'compound','dataset','algorithm','model','task','validation','utils','authorization','features', 'ot-logger', 'overwrite', 'rest_client_wrapper'].each do |lib| +['owl', 'compound','dataset','algorithm','model','task','validation','utils','features', 'ot-logger', 'overwrite', 'rest_client_wrapper'].each do |lib| require lib end diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 1282bee..82836d9 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -67,7 +67,7 @@ module OpenTox begin #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect - resource = RestClient::Resource.new(uri,{:timeout => 60}) #, :user => @@users[:users].keys[0], :password => @@users[:users].values[0]}) + resource = RestClient::Resource.new(uri,{:timeout => 60}) if payload result = resource.send(rest_call, payload, headers) elsif headers diff --git a/lib/templates/users.yaml b/lib/templates/users.yaml deleted file mode 100644 index 483fd7b..0000000 --- a/lib/templates/users.yaml +++ /dev/null @@ -1,5 +0,0 @@ -# please insert users and passwords here. -# one user and password each line. uncomment the line. -:users: -# username: "secretpassword" -# exampleuser: "ih9aiTog" \ No newline at end of file diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index f0a0816..8217240 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.6.5" + s.version = "1.6.6" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein"] -- cgit v1.2.3 From b032c1cef9afd1720235b7d6d121f292e8c77d1e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 7 Sep 2010 11:08:14 +0200 Subject: tabs expanded --- lib/owl.rb | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/owl.rb b/lib/owl.rb index dcf26a5..48a115f 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -93,7 +93,7 @@ end module OpenTox - class Owl + class Owl # to get correct owl-dl, properties and objects have to be typed # i.e. the following triple is insufficient: @@ -188,26 +188,26 @@ module OpenTox # ot_class is the class of the object as string, e.g. "Model","Dataset", ... # root_node is the root-object node in the rdf # uri the uri of the object - attr_accessor :ot_class, :root_node, :uri, :model + attr_accessor :ot_class, :root_node, :uri, :model private - def initialize - @model = Redland::Model.new Redland::MemoryStore.new - end + def initialize + @model = Redland::Model.new Redland::MemoryStore.new + end # build new owl object # ot_class is the class of this object, should be a string like "Model", "Task", ... # uri is name and identifier of this object public - def self.create( ot_class, uri ) + def self.create( ot_class, uri ) owl = OpenTox::Owl.new owl.ot_class = ot_class owl.root_node = Redland::Resource.new(uri.to_s.strip) owl.set("type",owl.ot_class) owl.uri = uri - owl - end + owl + end # loads owl from data def self.from_data(data, base_uri, ot_class) @@ -250,13 +250,13 @@ module OpenTox end end - def self.from_uri(uri, ot_class) + def self.from_uri(uri, ot_class) return from_data(RestClientWrapper.get(uri,:accept => "application/rdf+xml").to_s, uri, ot_class) - end + end - def rdf - @model.to_string - end + def rdf + @model.to_string + end # returns the first object for subject:root_node and property # (sufficient for accessing simple, root-node properties) @@ -430,14 +430,14 @@ module OpenTox # for "backwards-compatiblity" # better use directly: # set_data( { "parameters" => [ { "title" => , "paramScope" => , "paramValue" => } ] ) - def parameters=(params) + def parameters=(params) converted_params = [] params.each do |name, settings| converted_params << { :title => name, :paramScope => settings[:scope], :paramValue => settings[:value] } end set_data( :parameters => converted_params ) - end + end # PENDING move to dataset.rb # this is for dataset.to_owl -- cgit v1.2.3 From 3c3b13f024a7d5e5b94c772be9ca4d9b99988743 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 7 Sep 2010 13:06:32 +0200 Subject: initial ntriples serialisation --- lib/owl.rb | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/lib/owl.rb b/lib/owl.rb index 48a115f..1a0d27c 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -188,11 +188,12 @@ module OpenTox # ot_class is the class of the object as string, e.g. "Model","Dataset", ... # root_node is the root-object node in the rdf # uri the uri of the object - attr_accessor :ot_class, :root_node, :uri, :model + attr_accessor :ot_class, :root_node, :uri, :model, :triples private def initialize @model = Redland::Model.new Redland::MemoryStore.new + @triples = "" end # build new owl object @@ -255,7 +256,8 @@ module OpenTox end def rdf - @model.to_string + #@model.to_string + @triples end # returns the first object for subject:root_node and property @@ -335,16 +337,23 @@ module OpenTox # model_xy,rdf:type,ot:Model # ot:Model,rdf:type,owl:Class def set_type(ot_class, current_node=@root_node) - @model.add current_node, RDF_TYPE, node(ot_class) - @model.add node(ot_class), RDF_TYPE, OWL_TYPE_CLASS + #@triples += "#{ot_class.to_s} #{RDF_TYPE.to_s} #{current_node.to_s}" + @triples += "#{current_node} #{RDF_TYPE} #{node(ot_class).to_s}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + @triples += "#{node(ot_class).to_s} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + #@model.add current_node, RDF_TYPE, node(ot_class) + #@model.add node(ot_class), RDF_TYPE, OWL_TYPE_CLASS end # example-triples for setting description of a model: # model_xy,ot:description,bla..bla^^xml:string # ot:description,rdf:type,owl:Literal def set_literal(literal_name, literal_value, literal_datatype, current_node=@root_node) - @model.add current_node, node(literal_name), Redland::Literal.create(literal_value, literal_datatype) - @model.add node(literal_name), RDF_TYPE, OWL_TYPE_LITERAL + #@triples += "#{current_node} #{node(literal_name)} #{Redland::Literal.create(literal_value, literal_datatype)}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + #TODO: add datatype + @triples += "#{current_node} #{node(literal_name)} \"#{literal_value}\".\n".gsub(/\[/,'<').gsub(/\]/,'>') + @triples += "#{node(literal_name)} #{RDF_TYPE} #{OWL_TYPE_LITERAL}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + #@model.add current_node, node(literal_name), Redland::Literal.create(literal_value, literal_datatype) + #@model.add node(literal_name), RDF_TYPE, OWL_TYPE_LITERAL end # example-triples for setting algorithm property of a model: @@ -353,11 +362,15 @@ module OpenTox # algorihtm_xy,rdf:type,ot:Algorithm # ot:Algorithm,rdf:type,owl:Class def set_object_property(property, object, object_class, current_node=@root_node) - object_node = Redland::Resource.new(object) - @model.add current_node, node(property), object_node - @model.add node(property), RDF_TYPE, OWL_TYPE_OBJECT_PROPERTY - @model.add object_node, RDF_TYPE, node(object_class) - @model.add node(object_class), RDF_TYPE, OWL_TYPE_CLASS +# object_node = Redland::Resource.new(object) +# @triples += "#{current_node} #{node(property)} #{object_node}.\n".gsub(/\[/,'<').gsub(/\]/,'>') +# @triples += "#{node(property)} #{RDF_TYPE} #{OWL_TYPE_OBJECT_PROPERTY}.\n".gsub(/\[/,'<').gsub(/\]/,'>') +# @triples += "#{object_node} #{RDF_TYPE} #{node(object_class)}.\n".gsub(/\[/,'<').gsub(/\]/,'>') +# @triples += "#{node(object_class)} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + #@model.add current_node, node(property), object_node + #@model.add node(property), RDF_TYPE, OWL_TYPE_OBJECT_PROPERTY + #@model.add object_node, RDF_TYPE, node(object_class) + #@model.add node(object_class), RDF_TYPE, OWL_TYPE_CLASS end # this is (a recursiv method) to set nested-data via hashes (not only simple properties) -- cgit v1.2.3 From da9582a7d176358cf4240972a423a011cbaac132 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 8 Sep 2010 14:03:32 +0200 Subject: string concatination with << instead of +=, speeds things up for order of magnitudes --- lib/owl.rb | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/owl.rb b/lib/owl.rb index 1a0d27c..c505f5c 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -1,3 +1,4 @@ +require 'open3' # RDF namespaces RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#' @@ -257,7 +258,11 @@ module OpenTox def rdf #@model.to_string - @triples + #stdin, stdout, stderr = Open3.popen3('rapper -I test.org -i ntriples -o rdfxml -') + #stdin.puts @triples + #stdout + File.open("/tmp/d","w+") {|f| f.puts @triples} + `rapper -i ntriples -o rdfxml /tmp/d` end # returns the first object for subject:root_node and property @@ -338,8 +343,8 @@ module OpenTox # ot:Model,rdf:type,owl:Class def set_type(ot_class, current_node=@root_node) #@triples += "#{ot_class.to_s} #{RDF_TYPE.to_s} #{current_node.to_s}" - @triples += "#{current_node} #{RDF_TYPE} #{node(ot_class).to_s}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - @triples += "#{node(ot_class).to_s} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + @triples << "#{current_node} #{RDF_TYPE} #{node(ot_class).to_s}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + @triples << "#{node(ot_class).to_s} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') #@model.add current_node, RDF_TYPE, node(ot_class) #@model.add node(ot_class), RDF_TYPE, OWL_TYPE_CLASS end @@ -350,8 +355,8 @@ module OpenTox def set_literal(literal_name, literal_value, literal_datatype, current_node=@root_node) #@triples += "#{current_node} #{node(literal_name)} #{Redland::Literal.create(literal_value, literal_datatype)}.\n".gsub(/\[/,'<').gsub(/\]/,'>') #TODO: add datatype - @triples += "#{current_node} #{node(literal_name)} \"#{literal_value}\".\n".gsub(/\[/,'<').gsub(/\]/,'>') - @triples += "#{node(literal_name)} #{RDF_TYPE} #{OWL_TYPE_LITERAL}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + @triples << "#{current_node} #{node(literal_name)} \"#{literal_value}\".\n".gsub(/\[/,'<').gsub(/\]/,'>') + @triples << "#{node(literal_name)} #{RDF_TYPE} #{OWL_TYPE_LITERAL}.\n".gsub(/\[/,'<').gsub(/\]/,'>') #@model.add current_node, node(literal_name), Redland::Literal.create(literal_value, literal_datatype) #@model.add node(literal_name), RDF_TYPE, OWL_TYPE_LITERAL end @@ -362,11 +367,11 @@ module OpenTox # algorihtm_xy,rdf:type,ot:Algorithm # ot:Algorithm,rdf:type,owl:Class def set_object_property(property, object, object_class, current_node=@root_node) -# object_node = Redland::Resource.new(object) -# @triples += "#{current_node} #{node(property)} #{object_node}.\n".gsub(/\[/,'<').gsub(/\]/,'>') -# @triples += "#{node(property)} #{RDF_TYPE} #{OWL_TYPE_OBJECT_PROPERTY}.\n".gsub(/\[/,'<').gsub(/\]/,'>') -# @triples += "#{object_node} #{RDF_TYPE} #{node(object_class)}.\n".gsub(/\[/,'<').gsub(/\]/,'>') -# @triples += "#{node(object_class)} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + object_node = Redland::Resource.new(object) + @triples << "#{current_node} #{node(property)} #{object_node}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + @triples << "#{node(property)} #{RDF_TYPE} #{OWL_TYPE_OBJECT_PROPERTY}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + @triples << "#{object_node} #{RDF_TYPE} #{node(object_class)}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + @triples << "#{node(object_class)} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') #@model.add current_node, node(property), object_node #@model.add node(property), RDF_TYPE, OWL_TYPE_OBJECT_PROPERTY #@model.add object_node, RDF_TYPE, node(object_class) -- cgit v1.2.3 From ea33651026aeb6868e7c675304a08eccd7b5e695 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 8 Sep 2010 15:49:07 +0200 Subject: initial attempts to switch to rdfxml --- lib/owl.rb | 55 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/lib/owl.rb b/lib/owl.rb index c505f5c..4f3a5da 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -1,4 +1,7 @@ require 'open3' +require 'rdf' +require 'rdf/raptor' +include RDF # RDF namespaces RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#' @@ -193,8 +196,9 @@ module OpenTox private def initialize + @triples = [] @model = Redland::Model.new Redland::MemoryStore.new - @triples = "" + #@triples = "" end # build new owl object @@ -261,8 +265,15 @@ module OpenTox #stdin, stdout, stderr = Open3.popen3('rapper -I test.org -i ntriples -o rdfxml -') #stdin.puts @triples #stdout - File.open("/tmp/d","w+") {|f| f.puts @triples} - `rapper -i ntriples -o rdfxml /tmp/d` + #File.open("/tmp/d","w+") {|f| f.puts @triples} + #`rapper -i ntriples -o rdfxml /tmp/d` + #@triples + output = RDF::Writer.for(:rdfxml).buffer do |writer| + #@triples.each do |statement| + #writer << statement + #end + end + #output end # returns the first object for subject:root_node and property @@ -343,10 +354,10 @@ module OpenTox # ot:Model,rdf:type,owl:Class def set_type(ot_class, current_node=@root_node) #@triples += "#{ot_class.to_s} #{RDF_TYPE.to_s} #{current_node.to_s}" - @triples << "#{current_node} #{RDF_TYPE} #{node(ot_class).to_s}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - @triples << "#{node(ot_class).to_s} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - #@model.add current_node, RDF_TYPE, node(ot_class) - #@model.add node(ot_class), RDF_TYPE, OWL_TYPE_CLASS + #@triples << "#{current_node} #{RDF_TYPE} #{node(ot_class).to_s}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + #@triples << "#{node(ot_class).to_s} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + add current_node, RDF_TYPE, node(ot_class) + add node(ot_class), RDF_TYPE, OWL_TYPE_CLASS end # example-triples for setting description of a model: @@ -355,10 +366,10 @@ module OpenTox def set_literal(literal_name, literal_value, literal_datatype, current_node=@root_node) #@triples += "#{current_node} #{node(literal_name)} #{Redland::Literal.create(literal_value, literal_datatype)}.\n".gsub(/\[/,'<').gsub(/\]/,'>') #TODO: add datatype - @triples << "#{current_node} #{node(literal_name)} \"#{literal_value}\".\n".gsub(/\[/,'<').gsub(/\]/,'>') - @triples << "#{node(literal_name)} #{RDF_TYPE} #{OWL_TYPE_LITERAL}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - #@model.add current_node, node(literal_name), Redland::Literal.create(literal_value, literal_datatype) - #@model.add node(literal_name), RDF_TYPE, OWL_TYPE_LITERAL + #@triples << "#{current_node} #{node(literal_name)} \"#{literal_value}\".\n".gsub(/\[/,'<').gsub(/\]/,'>') + #@triples << "#{node(literal_name)} #{RDF_TYPE} #{OWL_TYPE_LITERAL}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + add current_node, node(literal_name), Redland::Literal.create(literal_value, literal_datatype) + add node(literal_name), RDF_TYPE, OWL_TYPE_LITERAL end # example-triples for setting algorithm property of a model: @@ -368,14 +379,20 @@ module OpenTox # ot:Algorithm,rdf:type,owl:Class def set_object_property(property, object, object_class, current_node=@root_node) object_node = Redland::Resource.new(object) - @triples << "#{current_node} #{node(property)} #{object_node}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - @triples << "#{node(property)} #{RDF_TYPE} #{OWL_TYPE_OBJECT_PROPERTY}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - @triples << "#{object_node} #{RDF_TYPE} #{node(object_class)}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - @triples << "#{node(object_class)} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - #@model.add current_node, node(property), object_node - #@model.add node(property), RDF_TYPE, OWL_TYPE_OBJECT_PROPERTY - #@model.add object_node, RDF_TYPE, node(object_class) - #@model.add node(object_class), RDF_TYPE, OWL_TYPE_CLASS + #@triples << "#{current_node} #{node(property)} #{object_node}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + #@triples << "#{node(property)} #{RDF_TYPE} #{OWL_TYPE_OBJECT_PROPERTY}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + #@triples << "#{object_node} #{RDF_TYPE} #{node(object_class)}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + #@triples << "#{node(object_class)} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + add current_node, node(property), object_node + add node(property), RDF_TYPE, OWL_TYPE_OBJECT_PROPERTY + add object_node, RDF_TYPE, node(object_class) + add node(object_class), RDF_TYPE, OWL_TYPE_CLASS + end + + def add(s,p,o) + #@triples << "#{s} #{p} #{o}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + @triples << [s,p,o] + #@model.add s,p,o end # this is (a recursiv method) to set nested-data via hashes (not only simple properties) -- cgit v1.2.3 From 5bb39ea69d1875306c640ad17f515f21edc1cda4 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 8 Sep 2010 15:52:15 +0200 Subject: initial attempts to switch to rdfxml --- lib/owl.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/owl.rb b/lib/owl.rb index 4f3a5da..6fb457a 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -1,4 +1,3 @@ -require 'open3' require 'rdf' require 'rdf/raptor' include RDF @@ -268,10 +267,11 @@ module OpenTox #File.open("/tmp/d","w+") {|f| f.puts @triples} #`rapper -i ntriples -o rdfxml /tmp/d` #@triples - output = RDF::Writer.for(:rdfxml).buffer do |writer| - #@triples.each do |statement| - #writer << statement - #end + #output = RDF::Writer.for(:rdfxml).buffer do |writer| + RDF::Writer.for(:ntriples).buffer do |writer| + @triples.each do |statement| + writer << statement + end end #output end -- cgit v1.2.3 From 0e69de27fca7c1a13e3f38dd52d625e6b6e31758 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 8 Sep 2010 16:21:19 +0200 Subject: initial attempts to switch to rdfxml --- lib/owl.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/owl.rb b/lib/owl.rb index 6fb457a..08041b6 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -1,8 +1,9 @@ require 'rdf' +require 'rdf/ntriples' require 'rdf/raptor' include RDF # RDF namespaces -RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' +#RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#' DC = Redland::Namespace.new 'http://purl.org/dc/elements/1.1/' OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#' @@ -268,7 +269,7 @@ module OpenTox #`rapper -i ntriples -o rdfxml /tmp/d` #@triples #output = RDF::Writer.for(:rdfxml).buffer do |writer| - RDF::Writer.for(:ntriples).buffer do |writer| + RDF::Writer.for(:rdfxml).buffer do |writer| @triples.each do |statement| writer << statement end @@ -391,7 +392,7 @@ module OpenTox def add(s,p,o) #@triples << "#{s} #{p} #{o}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - @triples << [s,p,o] + @triples << [s.to_s.sub(/\[/,'').sub(/\]/,''),p.to_s.sub(/\[/,'').sub(/\]/,''),o.to_s.sub(/\[/,'').sub(/\]/,'')] #@model.add s,p,o end -- cgit v1.2.3 From a05eefb79f82b79d609448e44d0ab533d2593a0f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 13 Sep 2010 17:09:37 +0200 Subject: intermediary commit for new owl serializer --- lib/opentox-ruby-api-wrapper.rb | 2 +- lib/owl-serializer.rb | 313 ++++++++++++++++++++++++++++++++++++++++ lib/owl.rb | 7 +- 3 files changed, 320 insertions(+), 2 deletions(-) create mode 100644 lib/owl-serializer.rb diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index bae1155..d9db4ac 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['owl', 'compound','dataset','algorithm','model','task','validation','utils','features', 'ot-logger', 'overwrite', 'rest_client_wrapper'].each do |lib| +['owl-serializer', 'compound','dataset','algorithm','model','task','validation','utils','features', 'ot-logger', 'overwrite', 'rest_client_wrapper'].each do |lib| require lib end diff --git a/lib/owl-serializer.rb b/lib/owl-serializer.rb new file mode 100644 index 0000000..8257b78 --- /dev/null +++ b/lib/owl-serializer.rb @@ -0,0 +1,313 @@ +require 'rdf' +require 'rdf/raptor' +require 'rdf/ntriples' + +# RDF namespaces +include RDF +OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' + +module OpenTox + + class OwlSerializer + + # to get correct owl-dl, properties and objects have to be typed + # i.e. the following triple is insufficient: + # ModelXY,ot:algorithm,AlgorithmXY + # further needed: + # ot:algorithm,rdf:type,owl:ObjectProperty + # AlgorithmXY,rdf:type,ot:Algorithm + # ot:Algorithm,rdf:type,owl:Class DONE + attr_accessor :model + + def initialize(klass,uri) + @model = RDF::Graph.new(uri) + @model << [ RDF::URI.new(uri), RDF.type, OT[klass] ] + @model << [ OT[klass], RDF.type, OWL.Class ] + # add class statements from OT +=begin + RDF::Reader.open('http://www.opentox.org/api/1.1#', :format => :rdfxml).each_statement do |statement| + @model << statement if statement.predicate == RDF.type #and statement.object == OWL.class + end +=end + end + + # build new owl object + # klass is the class of this object, should be a string like "Model", "Task", ... + # uri is name and identifier of this object + + def self.create( klass, uri ) + OpenTox::OwlSerializer.new(klass,uri) + end + + def rdf + RDF::Writer.for(:rdfxml).buffer do |writer| + writer << @model + #@model.each do |statement| + #writer << statement + #end + end + end + + # sets values of current_node (by default root_node) + # + # note: this does not delete existing triples + # * there can be several triples for the same subject and predicate + # ( e.g. after set("description","bla1") and set("description","bla2") + # both descriptions are in the model, + # but the get("description") will give you only one object (by chance) + # * this does not matter in pratice (only dataset uses this -> load_dataset-methods) + # * identical values appear only once in rdf + def annotate(predicate, object) + @model << [ @model.to_uri, DC[predicate], RDF::Literal.new(object, :datatype => XSD.String) ] + @model << [ DC[predicate], RDF.type, OWL.AnnotationProperty ] + end +=begin + def set(predicate, object, current_node=@root_node ) + + pred = predicate.to_s + raise "uri is no prop, cannot set uri" if pred=="uri" + raise "dc[identifier] deprecated, use owl.uri" if pred=="identifier" + if (object.is_a?(Redland::Node) and object.blank?) or nil==object or object.to_s.size==0 + # set only not-nil values + LOGGER.warn "skipping (not setting) empty value in rdf for property: '"+pred+"'" + return + end + + if pred=="type" + # predicate is type, set class of current node + set_type(object, current_node) + elsif LITERAL_TYPES.has_key?(pred) + # predicate is literal + set_literal(pred,object,LITERAL_TYPES[pred],current_node) + elsif OBJECT_PROPERTY_CLASS.has_key?(pred) + # predicte is objectProperty, object is another resource + set_object_property(pred,object,OBJECT_PROPERTY_CLASS[pred],current_node) + else + raise "unkonwn rdf-property, please add: '"+pred+"' to OpenTox::OWL.OBJECT_PROPERTY_CLASS or OpenTox::OWL.LITERAL_TYPES" + end + end + + # example-triples for setting rdf-type to model: + # model_xy,rdf:type,ot:Model + # ot:Model,rdf:type,owl:Class + def set_type(ot_class, current_node=@root_node) + add current_node, RDF.type, node(ot_class) + add node(ot_class), RDF_TYPE, OWL_TYPE_CLASS + end + + # example-triples for setting description of a model: + # model_xy,ot:description,bla..bla^^xml:string + # ot:description,rdf:type,owl:Literal + def set_literal(literal_name, literal_value, literal_datatype, current_node=@root_node) + add current_node, node(literal_name), literal_value# TODO add literal_datatype + add node(literal_name), RDF_TYPE, OWL_TYPE_LITERAL + end + + # example-triples for setting algorithm property of a model: + # model_xy,ot:algorithm,algorihtm_xy + # ot:algorithm,rdf:type,owl:ObjectProperty + # algorihtm_xy,rdf:type,ot:Algorithm + # ot:Algorithm,rdf:type,owl:Class + def set_object_property(property, object, object_class, current_node=@root_node) + object_node = Redland::Resource.new(object) + add current_node, node(property), object_node + add node(property), RDF_TYPE, OWL_TYPE_OBJECT_PROPERTY + add object_node, RDF_TYPE, node(object_class) + add node(object_class), RDF_TYPE, OWL_TYPE_CLASS + end + + def add(s,p,o) + @triples << "#{s} #{p} #{o}.\n".gsub(/\[/,'<').gsub(/\]/,'>') + end + + # this is (a recursiv method) to set nested-data via hashes (not only simple properties) + # example (for a dataset) + # { :description => "bla", + # :dataEntry => { :compound => "compound_uri", + # :values => [ { :class => "FeatureValue" + # :feature => "feat1", + # :value => 42 }, + # { :class => "FeatureValue" + # :feature => "feat2", + # :value => 123 } ] } } + def set_data(hash, current_node=@root_node) + + hash.each do |k,v| + if v.is_a?(Hash) + # value is again a hash + prop = k.to_s + + # :class is a special key to specify the class value, if not defined in OBJECT_PROPERTY_CLASS + object_class = v.has_key?(:class) ? v.delete(:class) : OBJECT_PROPERTY_CLASS[prop] + raise "hash key must be a object-property, please add '"+prop.to_s+ + "' to OpenTox::OWL.OBJECT_PROPERTY_CLASS or specify :class value" unless object_class + + # the new node is a class node, to specify the uri of the resource use key :uri + if v[:uri] + # identifier is either a specified uri + class_node = Redland::Resource.new(v.delete(:uri)) + else + # or a new uri, make up internal uri with increment + class_node = new_class_node(object_class,current_node) + end + set_object_property(prop,class_node,object_class,current_node) + # recursivly call set_data method with new node + set_data(v,class_node) + elsif v.is_a?(Array) + # value is an array, each array element is added with current key as predicate + v.each do |value| + set_data( { k => value }, current_node ) + end + else + # neither hash nor array, call simple set-method + set( k, v, current_node ) + end + end + end + + # create a new (internal class) node with unique, uri-like name + def new_class_node(name, current_node=@root_node) + # to avoid anonymous nodes, make up uris for sub-objects + # use counter to make sure each uri is unique + # for example we will get ../confusion_matrix_cell/1, ../confusion_matrix_cell/2, ... + count = 1 + while (true) + res = Redland::Resource.new( File.join(current_node.uri.to_s,name.to_s,count.to_s) ) + match = false + @model.find(nil, nil, res) do |s,p,o| + match = true + break + end + if match + count += 1 + else + break + end + end + return res + end + + # for "backwards-compatiblity" + # better use directly: + # set_data( { "parameters" => [ { "title" => , "paramScope" => , "paramValue" => } ] ) + def parameters=(params) + + converted_params = [] + params.each do |name, settings| + converted_params << { :title => name, :paramScope => settings[:scope], :paramValue => settings[:value] } + end + set_data( :parameters => converted_params ) + end +=end + + # PENDING move to dataset.rb + # this is for dataset.to_owl + # adds feautre value for a single compound + def add_data_entries(compound_uri,features) + + data_entry = { :compound => compound_uri } + if features + feature_values = [] + features.each do |f| + f.each do |feature_uri,value| + if value.is_a?(Hash) + complex_values = [] + value.each do |uri,v| + complex_values << { :feature => uri, :value => v } + end + feature_values << { :class => "Tuple", :feature => feature_uri, :complexValue => complex_values } + else + feature_values << { :class => "FeatureValue", :feature => feature_uri, :value => value } + end + end + end + data_entry[:values] = feature_values + end + set_data( :dataEntry => data_entry ) + end + + # PENDING move to dataset.rb + # feature values are not loaded for performance reasons + # loading compounds and features into arrays that are given as params + def load_dataset( compounds, features ) + + @model.subjects(RDF_TYPE, node('Compound')).each do |compound| + compounds << get_value(compound) + end + + @model.subjects(RDF_TYPE, node('Feature')).each do |feature| + feature_value_found=false + @model.find(nil, node("feature"), feature) do |potential_feature_value,p,o| + @model.find(nil, node("values"), potential_feature_value) do |s,p,o| + feature_value_found=true + break + end + break if feature_value_found + end + features << get_value(feature) if feature_value_found + end + LOGGER.debug "loaded "+compounds.size.to_s+" compounds and "+features.size.to_s+" features from dataset "+uri.to_s + end + + # PENDING move to dataset.rb + # loading feature values for the specified feature + # if feature is nil, all feature values are loaded + # + # general remark on the rdf loading (found out with some testing): + # the search methods (subjects/find) are fast, the time consuming parts is creating resources, + # which cannot be avoided in general + def load_dataset_feature_values( compounds, data, feature_uris ) + + raise "no feature-uri array" unless feature_uris.is_a?(Array) + + # values are stored in the data-hash, hash has a key for each compound + compounds.each{|c| data[c] = [] unless data[c]} + + count = 0 + + feature_uris.each do |feature_uri| + LOGGER.debug("load feature values for feature: "+feature_uri ) + feature_node = Redland::Resource.new(feature_uri) + + # search for all feature_value_node with property 'ot_feature' and the feature we are looking for + @model.find(nil, node('feature'), feature_node) do |feature_value_node,p,o| + + # get compound_uri by "backtracking" to values node (property is 'values'), then get compound_node via 'compound' + value_nodes = @model.subjects(node('values'),feature_value_node) + if value_nodes.size>0 + raise "more than one value node "+value_nodes.size.to_s if value_nodes.size>1 + value_node = value_nodes[0] + + compound_uri = get_value( @model.object(value_node, node('compound')) ) + unless compound_uri + LOGGER.warn "'compound' missing for data-entry of feature "+feature_uri.to_s+ + ", value: "+@model.object(feature_value_node,node("value")).to_s + next + end + + value_node_type = @model.object(feature_value_node, RDF_TYPE) + if (value_node_type == node('FeatureValue')) + value_literal = @model.object( feature_value_node, node('value')) + raise "plain feature value no literal: "+value_literal.to_s unless value_literal.is_a?(Redland::Literal) + data[compound_uri] << {feature_uri => value_literal.get_value } + elsif (value_node_type == node('Tuple')) + complex_values = {} + @model.find(feature_value_node,node('complexValue'),nil) do |p,s,complex_value| + complex_value_type = @model.object(complex_value, RDF_TYPE) + raise "complex feature value no feature value: "+complex_value.to_s unless complex_value_type==node('FeatureValue') + complex_feature_uri = get_value(@model.object( complex_value, node('feature'))) + complex_value = @model.object( complex_value, node('value')) + raise "complex value no literal: "+complex_value.to_s unless complex_value.is_a?(Redland::Literal) + complex_values[ complex_feature_uri ] = complex_value.get_value + end + data[compound_uri] << { feature_uri => complex_values } if complex_values.size>0 + end + count += 1 + LOGGER.debug "loading feature values ("+count.to_s+")" if (count%1000 == 0) + end + end + LOGGER.debug "loaded "+count.to_s+" feature values for feature "+feature_node.to_s + end + end + end +end diff --git a/lib/owl.rb b/lib/owl.rb index 08041b6..f4128ee 100644 --- a/lib/owl.rb +++ b/lib/owl.rb @@ -271,7 +271,12 @@ module OpenTox #output = RDF::Writer.for(:rdfxml).buffer do |writer| RDF::Writer.for(:rdfxml).buffer do |writer| @triples.each do |statement| + begin writer << statement + rescue => e + LOGGER.error e + LOGGER.info statement.inspect + end end end #output @@ -392,7 +397,7 @@ module OpenTox def add(s,p,o) #@triples << "#{s} #{p} #{o}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - @triples << [s.to_s.sub(/\[/,'').sub(/\]/,''),p.to_s.sub(/\[/,'').sub(/\]/,''),o.to_s.sub(/\[/,'').sub(/\]/,'')] + @triples << [RDF::URI.new(s.to_s.sub(/\[/,'').sub(/\]/,'')),RDF::URI.new(p.to_s.sub(/\[/,'').sub(/\]/,'')),o.to_s.sub(/\[/,'').sub(/\]/,'')] #@model.add s,p,o end -- cgit v1.2.3 From 3dd19c461d0b205ff504a85785f0c6e55114cd4e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 14 Sep 2010 20:52:03 +0200 Subject: simplified version of OwlSerializer, RDF/XML for algorithm/lazar, RDF/XML for annotations,compounds, features in dataset --- lib/environment.rb | 4 +- lib/owl-serializer.rb | 310 ++++----------------------------------- opentox-ruby-api-wrapper.gemspec | 9 +- 3 files changed, 39 insertions(+), 284 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index c662e8b..0c62113 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -59,5 +59,5 @@ TRUE_REGEXP = /^(true|active|1|1.0)$/i FALSE_REGEXP = /^(false|inactive|0|0.0)$/i # Task durations -DEFAULT_TASK_MAX_DURATION = 3600 -EXTERNAL_TASK_MAX_DURATION = 3600 +DEFAULT_TASK_MAX_DURATION = 36000 +EXTERNAL_TASK_MAX_DURATION = 36000 diff --git a/lib/owl-serializer.rb b/lib/owl-serializer.rb index 8257b78..8965bf2 100644 --- a/lib/owl-serializer.rb +++ b/lib/owl-serializer.rb @@ -9,304 +9,56 @@ OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' module OpenTox class OwlSerializer - - # to get correct owl-dl, properties and objects have to be typed - # i.e. the following triple is insufficient: - # ModelXY,ot:algorithm,AlgorithmXY - # further needed: - # ot:algorithm,rdf:type,owl:ObjectProperty - # AlgorithmXY,rdf:type,ot:Algorithm - # ot:Algorithm,rdf:type,owl:Class DONE - attr_accessor :model def initialize(klass,uri) + @model = RDF::Graph.new(uri) - @model << [ RDF::URI.new(uri), RDF.type, OT[klass] ] - @model << [ OT[klass], RDF.type, OWL.Class ] - # add class statements from OT -=begin - RDF::Reader.open('http://www.opentox.org/api/1.1#', :format => :rdfxml).each_statement do |statement| - @model << statement if statement.predicate == RDF.type #and statement.object == OWL.class - end -=end - end - # build new owl object - # klass is the class of this object, should be a string like "Model", "Task", ... - # uri is name and identifier of this object + @triples = [] + @triples << [ OT[klass], RDF.type, OWL.Class ] + @triples << [ RDF::URI.new(uri), RDF.type, OT[klass] ] + + @classes = [ OT[klass] ] + @object_properties = [] + @annotation_properties = [] + @objects = [ uri ] + + end - def self.create( klass, uri ) + def self.create(klass, uri) OpenTox::OwlSerializer.new(klass,uri) end def rdf + @triples.each { |statement| @model << statement } RDF::Writer.for(:rdfxml).buffer do |writer| writer << @model - #@model.each do |statement| - #writer << statement - #end - end - end - - # sets values of current_node (by default root_node) - # - # note: this does not delete existing triples - # * there can be several triples for the same subject and predicate - # ( e.g. after set("description","bla1") and set("description","bla2") - # both descriptions are in the model, - # but the get("description") will give you only one object (by chance) - # * this does not matter in pratice (only dataset uses this -> load_dataset-methods) - # * identical values appear only once in rdf - def annotate(predicate, object) - @model << [ @model.to_uri, DC[predicate], RDF::Literal.new(object, :datatype => XSD.String) ] - @model << [ DC[predicate], RDF.type, OWL.AnnotationProperty ] - end -=begin - def set(predicate, object, current_node=@root_node ) - - pred = predicate.to_s - raise "uri is no prop, cannot set uri" if pred=="uri" - raise "dc[identifier] deprecated, use owl.uri" if pred=="identifier" - if (object.is_a?(Redland::Node) and object.blank?) or nil==object or object.to_s.size==0 - # set only not-nil values - LOGGER.warn "skipping (not setting) empty value in rdf for property: '"+pred+"'" - return - end - - if pred=="type" - # predicate is type, set class of current node - set_type(object, current_node) - elsif LITERAL_TYPES.has_key?(pred) - # predicate is literal - set_literal(pred,object,LITERAL_TYPES[pred],current_node) - elsif OBJECT_PROPERTY_CLASS.has_key?(pred) - # predicte is objectProperty, object is another resource - set_object_property(pred,object,OBJECT_PROPERTY_CLASS[pred],current_node) - else - raise "unkonwn rdf-property, please add: '"+pred+"' to OpenTox::OWL.OBJECT_PROPERTY_CLASS or OpenTox::OWL.LITERAL_TYPES" - end - end - - # example-triples for setting rdf-type to model: - # model_xy,rdf:type,ot:Model - # ot:Model,rdf:type,owl:Class - def set_type(ot_class, current_node=@root_node) - add current_node, RDF.type, node(ot_class) - add node(ot_class), RDF_TYPE, OWL_TYPE_CLASS - end - - # example-triples for setting description of a model: - # model_xy,ot:description,bla..bla^^xml:string - # ot:description,rdf:type,owl:Literal - def set_literal(literal_name, literal_value, literal_datatype, current_node=@root_node) - add current_node, node(literal_name), literal_value# TODO add literal_datatype - add node(literal_name), RDF_TYPE, OWL_TYPE_LITERAL - end - - # example-triples for setting algorithm property of a model: - # model_xy,ot:algorithm,algorihtm_xy - # ot:algorithm,rdf:type,owl:ObjectProperty - # algorihtm_xy,rdf:type,ot:Algorithm - # ot:Algorithm,rdf:type,owl:Class - def set_object_property(property, object, object_class, current_node=@root_node) - object_node = Redland::Resource.new(object) - add current_node, node(property), object_node - add node(property), RDF_TYPE, OWL_TYPE_OBJECT_PROPERTY - add object_node, RDF_TYPE, node(object_class) - add node(object_class), RDF_TYPE, OWL_TYPE_CLASS - end - - def add(s,p,o) - @triples << "#{s} #{p} #{o}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - end - - # this is (a recursiv method) to set nested-data via hashes (not only simple properties) - # example (for a dataset) - # { :description => "bla", - # :dataEntry => { :compound => "compound_uri", - # :values => [ { :class => "FeatureValue" - # :feature => "feat1", - # :value => 42 }, - # { :class => "FeatureValue" - # :feature => "feat2", - # :value => 123 } ] } } - def set_data(hash, current_node=@root_node) - - hash.each do |k,v| - if v.is_a?(Hash) - # value is again a hash - prop = k.to_s - - # :class is a special key to specify the class value, if not defined in OBJECT_PROPERTY_CLASS - object_class = v.has_key?(:class) ? v.delete(:class) : OBJECT_PROPERTY_CLASS[prop] - raise "hash key must be a object-property, please add '"+prop.to_s+ - "' to OpenTox::OWL.OBJECT_PROPERTY_CLASS or specify :class value" unless object_class - - # the new node is a class node, to specify the uri of the resource use key :uri - if v[:uri] - # identifier is either a specified uri - class_node = Redland::Resource.new(v.delete(:uri)) - else - # or a new uri, make up internal uri with increment - class_node = new_class_node(object_class,current_node) - end - set_object_property(prop,class_node,object_class,current_node) - # recursivly call set_data method with new node - set_data(v,class_node) - elsif v.is_a?(Array) - # value is an array, each array element is added with current key as predicate - v.each do |value| - set_data( { k => value }, current_node ) - end - else - # neither hash nor array, call simple set-method - set( k, v, current_node ) - end end end - - # create a new (internal class) node with unique, uri-like name - def new_class_node(name, current_node=@root_node) - # to avoid anonymous nodes, make up uris for sub-objects - # use counter to make sure each uri is unique - # for example we will get ../confusion_matrix_cell/1, ../confusion_matrix_cell/2, ... - count = 1 - while (true) - res = Redland::Resource.new( File.join(current_node.uri.to_s,name.to_s,count.to_s) ) - match = false - @model.find(nil, nil, res) do |s,p,o| - match = true - break - end - if match - count += 1 - else - break - end - end - return res - end - # for "backwards-compatiblity" - # better use directly: - # set_data( { "parameters" => [ { "title" => , "paramScope" => , "paramValue" => } ] ) - def parameters=(params) - - converted_params = [] - params.each do |name, settings| - converted_params << { :title => name, :paramScope => settings[:scope], :paramValue => settings[:value] } + def object_property(subject,predicate,object,object_class) + s = [ RDF::URI.new(subject), predicate, RDF::URI.new(object) ] # + @triples << s unless @triples.include? s + unless @object_properties.include? predicate + @triples << [ predicate, RDF.type, OWL.ObjectProperty ] + @object_properties << predicate end - set_data( :parameters => converted_params ) - end -=end - - # PENDING move to dataset.rb - # this is for dataset.to_owl - # adds feautre value for a single compound - def add_data_entries(compound_uri,features) - - data_entry = { :compound => compound_uri } - if features - feature_values = [] - features.each do |f| - f.each do |feature_uri,value| - if value.is_a?(Hash) - complex_values = [] - value.each do |uri,v| - complex_values << { :feature => uri, :value => v } - end - feature_values << { :class => "Tuple", :feature => feature_uri, :complexValue => complex_values } - else - feature_values << { :class => "FeatureValue", :feature => feature_uri, :value => value } - end - end - end - data_entry[:values] = feature_values - end - set_data( :dataEntry => data_entry ) - end - - # PENDING move to dataset.rb - # feature values are not loaded for performance reasons - # loading compounds and features into arrays that are given as params - def load_dataset( compounds, features ) - - @model.subjects(RDF_TYPE, node('Compound')).each do |compound| - compounds << get_value(compound) + unless @objects.include? object + @triples << [ RDF::URI.new(object), RDF.type, object_class ] + @objects << object end - - @model.subjects(RDF_TYPE, node('Feature')).each do |feature| - feature_value_found=false - @model.find(nil, node("feature"), feature) do |potential_feature_value,p,o| - @model.find(nil, node("values"), potential_feature_value) do |s,p,o| - feature_value_found=true - break - end - break if feature_value_found - end - features << get_value(feature) if feature_value_found + unless @classes.include? object_class + @triples << [ object_class, RDF.type, OWL.Class ] + @classes << object_class end - LOGGER.debug "loaded "+compounds.size.to_s+" compounds and "+features.size.to_s+" features from dataset "+uri.to_s end - - # PENDING move to dataset.rb - # loading feature values for the specified feature - # if feature is nil, all feature values are loaded - # - # general remark on the rdf loading (found out with some testing): - # the search methods (subjects/find) are fast, the time consuming parts is creating resources, - # which cannot be avoided in general - def load_dataset_feature_values( compounds, data, feature_uris ) - - raise "no feature-uri array" unless feature_uris.is_a?(Array) - - # values are stored in the data-hash, hash has a key for each compound - compounds.each{|c| data[c] = [] unless data[c]} - - count = 0 - feature_uris.each do |feature_uri| - LOGGER.debug("load feature values for feature: "+feature_uri ) - feature_node = Redland::Resource.new(feature_uri) - - # search for all feature_value_node with property 'ot_feature' and the feature we are looking for - @model.find(nil, node('feature'), feature_node) do |feature_value_node,p,o| - - # get compound_uri by "backtracking" to values node (property is 'values'), then get compound_node via 'compound' - value_nodes = @model.subjects(node('values'),feature_value_node) - if value_nodes.size>0 - raise "more than one value node "+value_nodes.size.to_s if value_nodes.size>1 - value_node = value_nodes[0] - - compound_uri = get_value( @model.object(value_node, node('compound')) ) - unless compound_uri - LOGGER.warn "'compound' missing for data-entry of feature "+feature_uri.to_s+ - ", value: "+@model.object(feature_value_node,node("value")).to_s - next - end - - value_node_type = @model.object(feature_value_node, RDF_TYPE) - if (value_node_type == node('FeatureValue')) - value_literal = @model.object( feature_value_node, node('value')) - raise "plain feature value no literal: "+value_literal.to_s unless value_literal.is_a?(Redland::Literal) - data[compound_uri] << {feature_uri => value_literal.get_value } - elsif (value_node_type == node('Tuple')) - complex_values = {} - @model.find(feature_value_node,node('complexValue'),nil) do |p,s,complex_value| - complex_value_type = @model.object(complex_value, RDF_TYPE) - raise "complex feature value no feature value: "+complex_value.to_s unless complex_value_type==node('FeatureValue') - complex_feature_uri = get_value(@model.object( complex_value, node('feature'))) - complex_value = @model.object( complex_value, node('value')) - raise "complex value no literal: "+complex_value.to_s unless complex_value.is_a?(Redland::Literal) - complex_values[ complex_feature_uri ] = complex_value.get_value - end - data[compound_uri] << { feature_uri => complex_values } if complex_values.size>0 - end - count += 1 - LOGGER.debug "loading feature values ("+count.to_s+")" if (count%1000 == 0) - end - end - LOGGER.debug "loaded "+count.to_s+" feature values for feature "+feature_node.to_s + def annotation_property(subject, predicate, value, datatype) + s = [ RDF::URI.new(subject), predicate, RDF::Literal.new(value, :datatype => datatype) ] + @triples << s unless @triples.include? s + unless @annotation_properties.include? predicate + @triples << [ predicate, RDF.type, OWL.AnnotationProperty ] + @annotation_properties << predicate end end end diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 8217240..58f0b46 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein"] - s.date = %q{2010-08-25} + s.date = %q{2010-09-14} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] @@ -26,7 +26,6 @@ Gem::Specification.new do |s| "bin/opentox-install-ubuntu.sh", "bin/yaml2owl.rb", "lib/algorithm.rb", - "lib/authorization.rb", "lib/compound.rb", "lib/config/config_ru.rb", "lib/dataset.rb", @@ -38,12 +37,16 @@ Gem::Specification.new do |s| "lib/opentox.owl", "lib/ot-logger.rb", "lib/overwrite.rb", + "lib/owl-serializer.rb", "lib/owl.rb", + "lib/owl.rb.RDF", + "lib/owl.rb.nt", + "lib/owl.rb.rdfxml.initial", + "lib/owl.rb.redland", "lib/rest_client_wrapper.rb", "lib/spork.rb", "lib/task.rb", "lib/templates/config.yaml", - "lib/templates/users.yaml", "lib/utils.rb", "lib/validation.rb" ] -- cgit v1.2.3 From d6811507c1c1339cc4fe7cdb429b9b34b97dc422 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 22 Oct 2010 17:45:19 +0200 Subject: new API with support for external services (initial version) --- Rakefile | 2 + lib/algorithm.rb | 41 ++- lib/compound.rb | 184 ++++++++----- lib/dataset.rb | 273 ++++++++++++++++-- lib/environment.rb | 20 +- lib/feature.rb | 7 + lib/features.rb | 19 -- lib/model.rb | 16 +- lib/opentox-ruby-api-wrapper.rb | 4 +- lib/opentox.rb | 79 ++++++ lib/owl-serializer.rb | 65 ----- lib/owl.rb | 593 ---------------------------------------- lib/parser.rb | 191 +++++++++++++ lib/serializer.rb | 297 ++++++++++++++++++++ lib/task.rb | 8 +- lib/validation.rb | 4 +- 16 files changed, 981 insertions(+), 822 deletions(-) create mode 100644 lib/feature.rb delete mode 100644 lib/features.rb create mode 100644 lib/opentox.rb delete mode 100644 lib/owl-serializer.rb delete mode 100644 lib/owl.rb create mode 100644 lib/parser.rb create mode 100644 lib/serializer.rb diff --git a/Rakefile b/Rakefile index 3846bd1..8dd1088 100644 --- a/Rakefile +++ b/Rakefile @@ -27,6 +27,8 @@ begin "google-spreadsheet-ruby", "tmail", "rinruby", + "rdf", + "rdf-raptor", "rjb" ].each { |dep| gem.add_dependency dep } [ "dm-core", diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 4d9156a..e1d369a 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -1,27 +1,22 @@ - module OpenTox + module Algorithm - - - class Generic - - attr_accessor :uri, :title, :date - - def self.find(uri) - owl = OpenTox::Owl.from_uri(uri, "Algorithm") - return self.new(owl) - end - + + include OtObject + + class Generic + include Algorithm + #include OtObject protected - def initialize(owl) - @title = owl.get("title") - @date = owl.get("date") - @uri = owl.uri - end +# def initialize(owl) +# @title = owl.get("title") +# @date = owl.get("date") +# @uri = owl.uri +# end end - class Fminer + class Fminer < Generic def self.create_feature_dataset(params) LOGGER.debug File.basename(__FILE__) + ": creating feature dataset" @@ -30,7 +25,7 @@ module OpenTox end def self.uri - File.join(@@config[:services]["opentox-algorithm"], "fminer") + File.join(CONFIG[:services]["opentox-algorithm"], "fminer") end end @@ -39,13 +34,13 @@ module OpenTox def self.create_model(params) LOGGER.debug params LOGGER.debug File.basename(__FILE__) + ": creating model" - LOGGER.debug File.join(@@config[:services]["opentox-algorithm"], "lazar") - resource = RestClient::Resource.new(File.join(@@config[:services]["opentox-algorithm"], "lazar"), :content_type => "application/x-yaml") - @uri = resource.post(:dataset_uri => params[:dataset_uri], :prediction_feature => params[:prediction_feature], :feature_generation_uri => File.join(@@config[:services]["opentox-algorithm"], "fminer")).body.chomp + LOGGER.debug File.join(CONFIG[:services]["opentox-algorithm"], "lazar") + resource = RestClient::Resource.new(File.join(CONFIG[:services]["opentox-algorithm"], "lazar"), :content_type => "application/x-yaml") + @uri = resource.post(:dataset_uri => params[:dataset_uri], :prediction_feature => params[:prediction_feature], :feature_generation_uri => File.join(CONFIG[:services]["opentox-algorithm"], "fminer")).body.chomp end def self.uri - File.join(@@config[:services]["opentox-algorithm"], "lazar") + File.join(CONFIG[:services]["opentox-algorithm"], "lazar") end end diff --git a/lib/compound.rb b/lib/compound.rb index 49c166f..699e4c1 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -3,82 +3,120 @@ module OpenTox - class Compound #< OpenTox - - attr_reader :inchi, :uri - - # Initialize with :uri => uri, :smiles => smiles or :name => name (name can be also an InChI/InChiKey, CAS number, etc) - def initialize(params) - if params[:smiles] - @inchi = smiles2inchi(params[:smiles]) - @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) - elsif params[:inchi] - @inchi = params[:inchi] - @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) - elsif params[:sdf] - @inchi = sdf2inchi(params[:sdf]) - @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) - elsif params[:name] - # paranoid URI encoding to keep SMILES charges and brackets - @inchi = RestClient.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").body.chomp - # this was too hard for me to debug and leads to additional errors (ch) - #@inchi = RestClientWrapper.get("#{@@cactus_uri}#{URI.encode(params[:name], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").chomp - @uri = File.join(@@config[:services]["opentox-compound"],URI.escape(@inchi)) - elsif params[:uri] - @uri = params[:uri] - case params[:uri] - when /ambit/ # Ambit does not deliver InChIs reliably - smiles = RestClientWrapper.get @uri, :accept => 'chemical/x-daylight-smiles' - @inchi = obconversion(smiles,'smi','inchi') - when /InChI/ # shortcut for IST services - @inchi = params[:uri].sub(/^.*InChI/, 'InChI') - else - @inchi = RestClientWrapper.get @uri, :accept => 'chemical/x-inchi' - end - end - end + # Ruby wrapper for OpenTox Compound Webservices (http://opentox.org/dev/apis/api-1.2/structure). + # + # Examples: + # require "opentox-ruby-api-wrapper" + # + # # Creating compounds + # + # # from smiles string + # compound = OpenTox::Compound.from_smiles("c1ccccc1") + # # from name + # compound = OpenTox::Compound.from_name("Benzene") + # # from uri + # compound = OpenTox::Compound.new("http://webservices.in-silico.ch/compound/InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H"") + # + # # Getting compound representations + # + # # get InChI + # inchi = compound.inchi + # # get all compound names + # names = compound.names + # # get png image + # image = compound.png + # # get uri + # uri = compound.uri + # + # # SMARTS matching + # + # # match a smarts string + # compound.match?("cN") # returns false + # # match an array of smarts strings + # compound.match(['cc','cN']) # returns ['cc'] + class Compound + + attr_accessor :inchi, :uri + + # Create compound with optional uri + def initialize(uri=nil) + @uri = uri + case @uri + when /InChI/ # shortcut for IST services + @inchi = @uri.sub(/^.*InChI/, 'InChI') + else + @inchi = RestClientWrapper.get(@uri, :accept => 'chemical/x-inchi').to_s.chomp if @uri + end + end - # Get the (canonical) smiles + # Create a compound from smiles string + def self.from_smiles(smiles) + c = Compound.new + c.inchi = Compound.smiles2inchi(smiles) + c.uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(c.inchi)) + c + end + + # Create a compound from inchi string + def self.from_inchi(inchi) + c = Compound.new + c.inchi = inchi + c.uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(c.inchi)) + c + end + + # Create a compound from sdf string + def self.from_sdf(sdf) + c = Compound.new + c.inchi = Compound.sdf2inchi(sdf) + c.uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(c.inchi)) + c + end + + # Create a compound from name (name can be also an InChI/InChiKey, CAS number, etc) + def self.from_name(name) + c = Compound.new + # paranoid URI encoding to keep SMILES charges and brackets + c.inchi = RestClientWrapper.get("#{@@cactus_uri}#{URI.encode(name, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").to_s.chomp + c.uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(c.inchi)) + c + end + + # Get (canonical) smiles def smiles - obconversion(@inchi,'inchi','can') + Compound.obconversion(@inchi,'inchi','can') end + # Get sdf def sdf - obconversion(@inchi,'inchi','sdf') + Compound.obconversion(@inchi,'inchi','sdf') end + # Get gif image def gif RestClientWrapper.get("#{@@cactus_uri}#{@inchi}/image") end + # Get png image def png RestClientWrapper.get(File.join @uri, "image") end + # Get URI of compound image + def image_uri + File.join @uri, "image" + end + + # Get all known compound names def names begin - RestClientWrapper.get("#{@@cactus_uri}#{@inchi}/names") + RestClientWrapper.get("#{@@cactus_uri}#{@inchi}/names").split("\n") rescue "not available" end end - def display_smarts_uri(activating, deactivating, highlight = nil) - LOGGER.debug activating.to_yaml unless activating.nil? - activating_smarts = URI.encode "\"#{activating.join("\"/\"")}\"" - deactivating_smarts = URI.encode "\"#{deactivating.join("\"/\"")}\"" - if highlight.nil? - File.join @@config[:services]["opentox-compound"], "smiles", URI.encode(smiles), "smarts/activating", URI.encode(activating_smarts),"deactivating", URI.encode(deactivating_smarts) - else - File.join @@config[:services]["opentox-compound"], "smiles", URI.encode(smiles), "smarts/activating", URI.encode(activating_smarts),"deactivating", URI.encode(deactivating_smarts), "highlight", URI.encode(highlight) - end - end - - def image_uri - File.join @uri, "image" - end - - # Matchs a smarts string + # Match a smarts string def match?(smarts) obconversion = OpenBabel::OBConversion.new obmol = OpenBabel::OBMol.new @@ -89,30 +127,42 @@ module OpenTox smarts_pattern.match(obmol) end - # Match an array of smarts features, returns matching features + # Match an array of smarts strings, returns array with matching smarts def match(smarts_array) smarts_array.collect{|s| s if match?(s)}.compact end - # AM - # Match an array of smarts features, returns (0)1 for (non)matching features at each pos - def match_all(smarts_array) - smarts_array.collect{|s| match?(s) ? 1 : 0 } - end + # Get URI of compound image with highlighted fragments + def matching_smarts_image_uri(activating, deactivating, highlight = nil) + activating_smarts = URI.encode "\"#{activating.join("\"/\"")}\"" + deactivating_smarts = URI.encode "\"#{deactivating.join("\"/\"")}\"" + if highlight.nil? + File.join CONFIG[:services]["opentox-compound"], "smiles", URI.encode(smiles), "smarts/activating", URI.encode(activating_smarts),"deactivating", URI.encode(deactivating_smarts) + else + File.join CONFIG[:services]["opentox-compound"], "smiles", URI.encode(smiles), "smarts/activating", URI.encode(activating_smarts),"deactivating", URI.encode(deactivating_smarts), "highlight", URI.encode(highlight) + end + end + + + private - def sdf2inchi(sdf) - obconversion(sdf,'sdf','inchi') + # Convert sdf to inchi + def self.sdf2inchi(sdf) + Compound.obconversion(sdf,'sdf','inchi') end - def smiles2inchi(smiles) - obconversion(smiles,'smi','inchi') + # Convert smiles to inchi + def self.smiles2inchi(smiles) + Compound.obconversion(smiles,'smi','inchi') end - def smiles2cansmi(smiles) - obconversion(smiles,'smi','can') + # Convert smiles to canonical smiles + def self.smiles2cansmi(smiles) + Compound.obconversion(smiles,'smi','can') end - def obconversion(identifier,input_format,output_format) + # Convert identifier from OpenBabel input_format to OpenBabel output_format + def self.obconversion(identifier,input_format,output_format) obconversion = OpenBabel::OBConversion.new obmol = OpenBabel::OBMol.new obconversion.set_in_and_out_formats input_format, output_format diff --git a/lib/dataset.rb b/lib/dataset.rb index 2eb2206..7c8ce24 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -1,35 +1,253 @@ module OpenTox + # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). + # + # Examples: + # require "opentox-ruby-api-wrapper" + # + # # Creating datasets + # + # # create an empty dataset + # dataset = OpenTox::Dataset.new + # # create an empty dataset with URI + # # this does not load data from the dataset service - use one of the load_* methods + # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") + # # create new dataset and sav it to obtain a URI + # dataset = OpenTox::Dataset.create + # # create a new dataset from yaml representation + # dataset = OpenTox::Dataset.from_yaml + # # create a new dataset from CSV string + # csv_string = "SMILES, Toxicity\nc1ccccc1N, true" + # dataset = OpenTox::Dataset.from_csv(csv_string) + # + # # Loading data + # # Datasets created with OpenTox::Dataset.new(uri) are empty by default + # # Invoking one of the following functions will load data into the object + # + # # create an empty dataset with URI + # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") + # # loads (and returns) only metadata + # dataset.load_metadata + # # loads (and returns) only compounds + # dataset.load_compounds + # # loads (and returns) only features + # dataset.load_features + # # load all data from URI + # dataset.load_all + # + # # Getting dataset representations + # + # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") + # dataset.load_all + # # OWL-DL (RDF/XML) + # dataset.rdfxml + # # OWL-DL (Ntriples) + # dataset.ntriples + # # YAML + # dataset.yaml + # # CSV + # dataset.csv + # + # # Modifying datasets + # + # # insert a statement (compound_uri,feature_uri,value) + # dataset.add "http://webservices.in-silico.ch/compound/InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9", "http://webservices.in-silico.ch/dataset/1/feature/hamster_carcinogenicity", true + # + # + # # Saving datasets + # # save dataset at dataset service + # dataset.save + # + # # Deleting datasets + # # delete dataset (also at dataset service) + # dataset.delete class Dataset - attr_accessor :uri, :title, :creator, :data, :features, :compounds + include OtObject - def initialize( owl=nil ) - @data = {} - @features = [] + attr_reader :features, :compounds, :data_entries, :metadata + attr_writer :metadata + + # Create dataset with optional URI + def initialize(uri=nil) + super uri + @features = {} @compounds = [] - + @data_entries = {} + end + + # Create and save an empty dataset (assigns URI to dataset) + def self.create(uri=CONFIG[:services]["opentox-dataset"]) + dataset = Dataset.new + dataset.uri = RestClientWrapper.post(uri,{}).to_s.chomp + dataset + end + + # Get all datasets from a service +# def self.all(uri=CONFIG[:services]["opentox-dataset"]) +# RestClientWrapper.get(uri,:accept => "text/uri-list").to_s.each_line.collect{|u| Dataset.new(u)} +# end + + # Create a dataset from YAML string + def self.from_yaml(yaml) + dataset = Dataset.create + dataset.copy YAML.load(yaml) + dataset + end + + # Create dataset from CSV string (format specification: http://toxcreate.org/help) + # - loads data_entries, compounds, features + # - sets metadata (warnings) for parser errors + # - you will have to set remaining metadata manually + def self.from_csv(csv) + dataset = Dataset.create + Parser::Spreadsheet.new(dataset).load_csv(csv) + dataset + end + + # Create dataset from Spreadsheet book (created with roo gem http://roo.rubyforge.org/, excel format specification: http://toxcreate.org/help)) + # - loads data_entries, compounds, features + # - sets metadata (warnings) for parser errors + # - you will have to set remaining metadata manually + def self.from_spreadsheet(book) + dataset = Dataset.create + Parser::Spreadsheet.new(dataset).load_excel(book) + dataset + end + + # Load and return metadata of a Dataset object + def load_metadata + #if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) + #add_metadata YAML.load(RestClientWrapper.get(File.join(@uri,"metadata"), :accept => "application/x-yaml")) + #else + add_metadata Parser::Owl::Dataset.new(@uri).metadata + #end + self.uri = @uri if @uri # keep uri + @metadata + end + + # Load all data (metadata, data_entries, compounds and features) from URI + def load_all + if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) + copy YAML.load(RestClientWrapper.get(@uri, :accept => "application/x-yaml")) + else + parser = Parser::Owl::Dataset.new(@uri) + copy parser.load_uri + end + end + + # Load and return all compound URIs + def load_compounds + RestClientWrapper.get(File.join(uri,"compounds"),:accept=> "text/uri-list").to_s.each_line do |compound_uri| + @compounds << compound_uri.chomp + end + @compounds.uniq! + end + + # Load all feature URIs + def load_features + RestClientWrapper.get(File.join(uri,"features"),:accept=> "text/uri-list").to_s.each_line do |feature_uri| + @features[feature_uri.chomp] = Feature.new(feature_uri.chomp).load_metadata + end + @features + end + + # Get YAML representation + def yaml + self.to_yaml + end + + # Get Excel representation, returns a Spreadsheet::Workbook which can be written with the 'spreadsheet' gem (data_entries only, metadata will ) + def excel + Serializer::Spreadsheets.new(self).excel + end + + # Get CSV string representation (data_entries only, metadata will be discarded) + def csv + Serializer::Spreadsheets.new(self).csv + end + + # Get OWL-DL in ntriples format + def ntriples + s = Serializer::Owl.new + s.add_dataset(self) + s.ntriples + end + + # Get OWL-DL in RDF/XML format + def rdfxml + s = Serializer::Owl.new + s.add_dataset(self) + s.rdfxml + end + + # Insert a statement (compound_uri,feature_uri,value) + def add (compound,feature,value) + @compounds << compound unless @compounds.include? compound + @features[feature] = {} unless @features[feature] + @data_entries[compound] = {} unless @data_entries[compound] + @data_entries[compound][feature] = [] unless @data_entries[compound][feature] + @data_entries[compound][feature] << value + end + + # Add metadata (hash with predicate_uri => value) + def add_metadata(metadata) + metadata.each { |k,v| @metadata[k] = v } + end + + # Copy a dataset (rewrites URI) + def copy(dataset) + @metadata = dataset.metadata + @data_entries = dataset.data_entries + @compounds = dataset.compounds + @features = dataset.features + if @uri + self.uri = @uri + else + @uri = dataset.metadata[XSD.anyUri] + end + end + + # save dataset (overwrites existing dataset) + def save + # TODO: rewrite feature URI's ?? + # create dataset if uri empty + @compounds.uniq! + RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) + end + + # Delete dataset at the dataset service + def delete + RestClientWrapper.delete @uri + end + end +end + + ######################################################### + # kept for backward compatibility, may have to be fixed # + ######################################################### + +=begin + def from_owl(owl) # creates dataset object from Opentox::Owl object # use Dataset.find( ) to load dataset from rdf-supporting datasetservice # note: does not load all feature values, as this is time consuming - if owl - raise "invalid param" unless owl.is_a?(OpenTox::Owl) - @title = owl.get("title") - @creator = owl.get("creator") - @uri = owl.uri - # when loading a dataset from owl, only compound- and feature-uris are loaded - owl.load_dataset(@compounds, @features) - # all features are marked as dirty - # as soon as a feature-value is requested all values for this feature are loaded from the rdf - @dirty_features = @features.dclone - @owl = owl - end + raise "invalid param" unless owl.is_a?(OpenTox::Owl) + @metadata[DC.title] = owl.get("title") + @metadata[DC.creator] = owl.get("creator") + @metadata[XSD.anyUri] = owl.uri + # when loading a dataset from owl, only compound- and feature-uris are loaded + owl.load_dataset(@compounds, @features) + # all features are marked as dirty + # as soon as a feature-value is requested all values for this feature are loaded from the rdf + @dirty_features = @features.dclone + @owl = owl end def self.find(uri, accept_header=nil) unless accept_header - if (@@config[:yaml_hosts].include?(URI.parse(uri).host)) + if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) accept_header = 'application/x-yaml' else accept_header = "application/rdf+xml" @@ -38,8 +256,10 @@ module OpenTox case accept_header when "application/x-yaml" + LOGGER.debug "DATASET: "+ uri + LOGGER.debug RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s - d.uri = uri unless d.uri + #d.uri = @metadata[XSD.anyUri] unless d.uri when "application/rdf+xml" owl = OpenTox::Owl.from_uri(uri.to_s.strip, "Dataset") d = Dataset.new(owl) @@ -48,7 +268,7 @@ module OpenTox end d end - + # converts a dataset represented in owl to yaml # (uses a temporary dataset) # note: to_yaml is overwritten, loads complete owl dataset values @@ -108,7 +328,7 @@ module OpenTox raise "predicted class value is an array\n"+ "value "+v.to_s+"\n"+ "value-class "+v.class.to_s+"\n"+ - "dataset "+@uri.to_s+"\n"+ + "dataset "+self.uri.to_s+"\n"+ "compound "+compound.to_s+"\n"+ "feature "+feature.to_s+"\n" else @@ -130,7 +350,7 @@ module OpenTox raise "predicted regression value is an array\n"+ "value "+v.to_s+"\n"+ "value-class "+v.class.to_s+"\n"+ - "dataset "+@uri.to_s+"\n"+ + "dataset "+self.uri.to_s+"\n"+ "compound "+compound.to_s+"\n"+ "feature "+feature.to_s+"\n" else @@ -181,7 +401,7 @@ module OpenTox raise "value is not an array\n"+ "value "+v.to_s+"\n"+ "value-class "+v.class.to_s+"\n"+ - "dataset "+@uri.to_s+"\n"+ + "dataset "+self.uri.to_s+"\n"+ "compound "+compound.to_s+"\n"+ "feature "+feature.to_s+"\n" end @@ -216,11 +436,6 @@ module OpenTox super - ["@owl"] end - # saves (changes) as new dataset in dataset service - # returns uri - # uses to yaml method (which is overwritten) - def save - OpenTox::RestClientWrapper.post(@@config[:services]["opentox-dataset"],{:content_type => "application/x-yaml"},self.to_yaml).strip - end end end +=end diff --git a/lib/environment.rb b/lib/environment.rb index 0c62113..b16b62f 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -12,8 +12,8 @@ TMP_DIR = File.join(basedir, "tmp") LOG_DIR = File.join(basedir, "log") if File.exist?(config_file) - @@config = YAML.load_file(config_file) - raise "could not load config, config file: "+config_file.to_s unless @@config + CONFIG = YAML.load_file(config_file) + raise "could not load config, config file: "+config_file.to_s unless CONFIG else FileUtils.mkdir_p TMP_DIR FileUtils.mkdir_p LOG_DIR @@ -24,20 +24,20 @@ else end # database -if @@config[:database] +if CONFIG[:database] ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types', 'dm-migrations', 'dm-validations' ].each{|lib| require lib } - case @@config[:database][:adapter] + case CONFIG[:database][:adapter] when /sqlite/i db_dir = File.join(basedir, "db") FileUtils.mkdir_p db_dir DataMapper::setup(:default, "sqlite3://#{db_dir}/opentox.sqlite3") else DataMapper.setup(:default, { - :adapter => @@config[:database][:adapter], - :database => @@config[:database][:database], - :username => @@config[:database][:username], - :password => @@config[:database][:password], - :host => @@config[:database][:host]}) + :adapter => CONFIG[:database][:adapter], + :database => CONFIG[:database][:database], + :username => CONFIG[:database][:username], + :password => CONFIG[:database][:password], + :host => CONFIG[:database][:host]}) end end @@ -48,7 +48,7 @@ logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" #LOGGER = MyLogger.new(logfile,'daily') # daily rotation LOGGER = MyLogger.new(logfile) # no rotation LOGGER.formatter = Logger::Formatter.new #this is neccessary to restore the formating in case active-record is loaded -if @@config[:logger] and @@config[:logger] == "debug" +if CONFIG[:logger] and CONFIG[:logger] == "debug" LOGGER.level = Logger::DEBUG else LOGGER.level = Logger::WARN diff --git a/lib/feature.rb b/lib/feature.rb new file mode 100644 index 0000000..9616135 --- /dev/null +++ b/lib/feature.rb @@ -0,0 +1,7 @@ +module OpenTox + + class Feature + include OtObject + end + +end diff --git a/lib/features.rb b/lib/features.rb deleted file mode 100644 index 0fa1cf0..0000000 --- a/lib/features.rb +++ /dev/null @@ -1,19 +0,0 @@ -# CH: should go into validation service -# - not a complete OT object -# - only used twice -# - what about ./validation/validation/validation_service.rb:241: value = OpenTox::Feature.new(:uri => a.uri).value(prediction_feature).to_s -module OpenTox - - module Feature - - def self.domain( feature_uri ) - #TODO - if feature_uri =~ /ambit/ - return nil - else - return ["true", "false"] - end - end - - end -end diff --git a/lib/model.rb b/lib/model.rb index 3ecd61c..d0d6703 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -84,8 +84,8 @@ module OpenTox def initialize @source = "http://github.com/helma/opentox-model" - @algorithm = File.join(@@config[:services]["opentox-algorithm"],"lazar") - #@independent_variables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative") + @algorithm = File.join(CONFIG[:services]["opentox-algorithm"],"lazar") + #@independent_variables = File.join(CONFIG[:services]["opentox-algorithm"],"fminer#BBRC_representative") @features = [] @effects = {} @activities = {} @@ -95,12 +95,12 @@ module OpenTox def save @features.uniq! - resource = RestClient::Resource.new(@@config[:services]["opentox-model"]) + resource = RestClient::Resource.new(CONFIG[:services]["opentox-model"]) resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s end def self.find_all - RestClientWrapper.get(@@config[:services]["opentox-model"]).chomp.split("\n") + RestClientWrapper.get(CONFIG[:services]["opentox-model"]).chomp.split("\n") end def self.predict(compound_uri,model_uri) @@ -115,8 +115,8 @@ module OpenTox def initialize @source = "http://github.com/helma/opentox-model" - @algorithm = File.join(@@config[:services]["opentox-algorithm"],"property_lazar") - #@independent_variables = File.join(@@config[:services]["opentox-algorithm"],"fminer#BBRC_representative") + @algorithm = File.join(CONFIG[:services]["opentox-algorithm"],"property_lazar") + #@independent_variables = File.join(CONFIG[:services]["opentox-algorithm"],"fminer#BBRC_representative") @features = [] #@effects = {} @activities = {} @@ -126,12 +126,12 @@ module OpenTox def save @features.uniq! - resource = RestClient::Resource.new(@@config[:services]["opentox-model"]) + resource = RestClient::Resource.new(CONFIG[:services]["opentox-model"]) resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s end def self.find_all - RestClientWrapper.get(@@config[:services]["opentox-model"]).chomp.split("\n") + RestClientWrapper.get(CONFIG[:services]["opentox-model"]).chomp.split("\n") end def self.predict(compound_uri,model_uri) diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index d9db4ac..2749899 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,4 +1,4 @@ -['rubygems', 'sinatra', 'sinatra/url_for', 'rest_client', 'yaml', 'cgi', 'spork', 'redland', 'rdf/redland', 'rdf/redland/util', 'environment'].each do |lib| +['rubygems', 'sinatra', 'sinatra/url_for', 'rest_client', 'yaml', 'cgi', 'spork', 'environment'].each do |lib| require lib end @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['owl-serializer', 'compound','dataset','algorithm','model','task','validation','utils','features', 'ot-logger', 'overwrite', 'rest_client_wrapper'].each do |lib| +['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','utils','feature', 'ot-logger', 'overwrite', 'rest_client_wrapper'].each do |lib| require lib end diff --git a/lib/opentox.rb b/lib/opentox.rb new file mode 100644 index 0000000..453ca66 --- /dev/null +++ b/lib/opentox.rb @@ -0,0 +1,79 @@ +module OpenTox + + # Generic OpenTox class + module OtObject + + attr_reader :uri + attr_accessor :metadata + + # Initialize OpenTox object with optional uri + def initialize(uri=nil) + @metadata = {} + self.uri = uri if uri + end + + # Set URI + def uri=(uri) + @uri = uri + @metadata[XSD.anyUri] = uri + end + + # Get title + def title + load_metadata unless @metadata[DC.title] + @metadata[DC.title] + end + + # Set title + def title=(title) + @metadata[DC.title] = title + end + + # Get all objects from a service + def self.all(uri) + #def OtObject.all(uri) + RestClientWrapper.get(uri,:accept => "text/uri-list").to_s.split(/\n/) + end + + # Load metadata from URI + def load_metadata + #if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) + # TODO: fix metadata retrie + #@metadata = YAML.load(RestClientWrapper.get(@uri, :accept => "application/x-yaml")) + #else + @metadata = Parser::Owl::Generic.new(@uri).metadata + #end + @metadata + #Parser::Owl::Generic.new(@uri).metadata + end + + end + + module Owl + + class Namespace + + def initialize(uri) + @uri = uri + end + + def [](property) + @uri+property.to_s + end + + def method_missing(property) + @uri+property.to_s + end + + end + end + +end +# +# OWL Namespaces +RDF = OpenTox::Owl::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' +OWL = OpenTox::Owl::Namespace.new 'http://www.w3.org/2002/07/owl#' +DC = OpenTox::Owl::Namespace.new 'http://purl.org/dc/elements/1.1/' +OT = OpenTox::Owl::Namespace.new 'http://www.opentox.org/api/1.1#' +XSD = OpenTox::Owl::Namespace.new 'http://www.w3.org/2001/XMLSchema#' + diff --git a/lib/owl-serializer.rb b/lib/owl-serializer.rb deleted file mode 100644 index 8965bf2..0000000 --- a/lib/owl-serializer.rb +++ /dev/null @@ -1,65 +0,0 @@ -require 'rdf' -require 'rdf/raptor' -require 'rdf/ntriples' - -# RDF namespaces -include RDF -OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' - -module OpenTox - - class OwlSerializer - - def initialize(klass,uri) - - @model = RDF::Graph.new(uri) - - @triples = [] - @triples << [ OT[klass], RDF.type, OWL.Class ] - @triples << [ RDF::URI.new(uri), RDF.type, OT[klass] ] - - @classes = [ OT[klass] ] - @object_properties = [] - @annotation_properties = [] - @objects = [ uri ] - - end - - def self.create(klass, uri) - OpenTox::OwlSerializer.new(klass,uri) - end - - def rdf - @triples.each { |statement| @model << statement } - RDF::Writer.for(:rdfxml).buffer do |writer| - writer << @model - end - end - - def object_property(subject,predicate,object,object_class) - s = [ RDF::URI.new(subject), predicate, RDF::URI.new(object) ] # - @triples << s unless @triples.include? s - unless @object_properties.include? predicate - @triples << [ predicate, RDF.type, OWL.ObjectProperty ] - @object_properties << predicate - end - unless @objects.include? object - @triples << [ RDF::URI.new(object), RDF.type, object_class ] - @objects << object - end - unless @classes.include? object_class - @triples << [ object_class, RDF.type, OWL.Class ] - @classes << object_class - end - end - - def annotation_property(subject, predicate, value, datatype) - s = [ RDF::URI.new(subject), predicate, RDF::Literal.new(value, :datatype => datatype) ] - @triples << s unless @triples.include? s - unless @annotation_properties.include? predicate - @triples << [ predicate, RDF.type, OWL.AnnotationProperty ] - @annotation_properties << predicate - end - end - end -end diff --git a/lib/owl.rb b/lib/owl.rb deleted file mode 100644 index f4128ee..0000000 --- a/lib/owl.rb +++ /dev/null @@ -1,593 +0,0 @@ -require 'rdf' -require 'rdf/ntriples' -require 'rdf/raptor' -include RDF -# RDF namespaces -#RDF = Redland::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' -OWL = Redland::Namespace.new 'http://www.w3.org/2002/07/owl#' -DC = Redland::Namespace.new 'http://purl.org/dc/elements/1.1/' -OT = Redland::Namespace.new 'http://www.opentox.org/api/1.1#' -#OT = Redland::Namespace.new 'http://ortona.informatik.uni-freiburg.de/opentox.owl#' -XML = Redland::Namespace.new 'http://www.w3.org/2001/XMLSchema#' - -# overriding literal to give nice access to datatype -# and to access the stored value as correct ruby type -class Redland::Literal - - def self.create(value, type) - raise "literal datatype may not be nil" unless type - type = parse_datatype_uri(value) if OpenTox::Owl::PARSE_LITERAL_TYPE==type - - if type.is_a?(Redland::Uri) - Redland::Literal.new(value.to_s,nil,type) - else - Redland::Literal.new(value.to_s,nil,Redland::Uri.new(type.to_s)) - end - end - - # the literal node of the ruby swig api provdides the 'value' of a literal but not the 'datatype' - # found solution in mailing list - def datatype - uri = Redland.librdf_node_get_literal_value_datatype_uri(self.node) - return Redland.librdf_uri_to_string(uri) if uri - end - - # gets value of literal, value class is se according to literal datatype - def get_value - Redland::Literal.parse_value( self.value, self.datatype ) - end - - private - # parses value according to datatype uri - def self.parse_value(string_value, datatype_uri) - - if (datatype_uri==nil || datatype_uri.size==0) - LOGGER.warn("empty datatype for literal with value: '"+string_value+"'") - return string_value - end - case datatype_uri - when OpenTox::Owl::LITERAL_DATATYPE_STRING.to_s - return string_value - when OpenTox::Owl::LITERAL_DATATYPE_URI.to_s - return string_value #PENDING uri as string? - when OpenTox::Owl::LITERAL_DATATYPE_FLOAT.to_s - return string_value.to_f - when OpenTox::Owl::LITERAL_DATATYPE_DOUBLE.to_s - return string_value.to_f - when OpenTox::Owl::LITERAL_DATATYPE_BOOLEAN.to_s - return string_value.upcase=="TRUE" - when OpenTox::Owl::LITERAL_DATATYPE_DATE.to_s - return Time.parse(string_value) - when OpenTox::Owl::LITERAL_DATATYPE_DATETIME.to_s - return Time.parse(string_value) - when OpenTox::Owl::LITERAL_DATATYPE_INTEGER.to_s - return string_value.to_i - else - raise "unknown literal datatype: '"+datatype_uri.to_s+"' (value is "+string_value+ - "), please specify new OpenTox::Owl::LITERAL_DATATYPE" - end - end - - # parse datatype uri accoring to value class - def self.parse_datatype_uri(value) - if value==nil - raise "illegal datatype: value is nil" - elsif value.is_a?(String) - # PENDING: uri check too slow? - if OpenTox::Utils.is_uri?(value) - return OpenTox::Owl::LITERAL_DATATYPE_URI - else - return OpenTox::Owl::LITERAL_DATATYPE_STRING - end - elsif value.is_a?(Float) - return OpenTox::Owl::LITERAL_DATATYPE_FLOAT - elsif value.is_a?(TrueClass) or value.is_a?(FalseClass) - return OpenTox::Owl::LITERAL_DATATYPE_BOOLEAN - elsif value.is_a?(Integer) - return OpenTox::Owl::LITERAL_DATATYPE_INTEGER - elsif value.is_a?(DateTime) - return OpenTox::Owl::LITERAL_DATATYPE_DATETIME - elsif value.is_a?(Time) - return OpenTox::Owl::LITERAL_DATATYPE_DATETIME - else - raise "illegal datatype: "+value.class.to_s+" "+value.to_s - end - end -end - -module OpenTox - - class Owl - - # to get correct owl-dl, properties and objects have to be typed - # i.e. the following triple is insufficient: - # ModelXY,ot:algorithm,AlgorithmXY - # further needed: - # ot:algorithm,rdf:type,owl:ObjectProperty - # AlgorithmXY,rdf:type,ot:Algorithm - # ot:Algorithm,rdf:type,owl:Class - # - # therefore OpentoxOwl needs info about the opentox-ontology - # the info is stored in OBJECT_PROPERTY_CLASS and LITERAL_TYPES - - # contains all owl:ObjectProperty as keys, and the respective classes as value - # some object properties link to objects from different classes (e.g. "values can be "Tuple", or "FeatureValue") - # in this case, use set_object_property() (instead of set()) and specify class manually - OBJECT_PROPERTY_CLASS = {} - [ "model" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Model"} - [ "algorithm" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Algorithm"} - [ "trainingDataset", "testTargetDataset", "predictionDataset", - "testDataset", "dataset" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Dataset"} - [ "feature", "dependentVariables", "independentVariables", - "predictedVariables", "predictionFeature" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Feature"} - [ "parameters" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Parameter"} - [ "compound" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Compound"} - [ "dataEntry" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "DataEntry"} - [ "complexValue" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "FeatureValue"} - [ "classificationStatistics" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ClassificationStatistics"} - [ "classValueStatistics" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ClassValueStatistics"} - [ "confusionMatrix" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ConfusionMatrix"} - [ "confusionMatrixCell" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "ConfusionMatrixCell"} - [ "regressionStatistics" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "RegressionStatistics"} - [ "validation" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Validation"} - [ "crossvalidationInfo" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "CrossvalidationInfo"} - [ "crossvalidation" ].each{ |c| OBJECT_PROPERTY_CLASS[c] = "Crossvalidation"} - - # literals point to primitive values (not to other resources) - # the literal datatype is encoded via uri: - LITERAL_DATATYPE_STRING = XML["string"].uri - LITERAL_DATATYPE_URI = XML["anyURI"].uri - LITERAL_DATATYPE_FLOAT = XML["float"].uri - LITERAL_DATATYPE_DOUBLE = XML["double"].uri - LITERAL_DATATYPE_DATE = XML["date"].uri - LITERAL_DATATYPE_BOOLEAN = XML["boolean"].uri - LITERAL_DATATYPE_DATETIME = XML["dateTime"].uri - LITERAL_DATATYPE_INTEGER = XML["integer"].uri - - # list all literals (to distinguish from objectProperties) as keys, datatype as values - # (do not add dc-identifier, deprecated, object are identified via name=uri) - LITERAL_TYPES = {} - [ "title", "creator", "format", "description", "hasStatus", "paramScope", "paramValue", - "classValue", "reportType", "confusionMatrixActual", - "confusionMatrixPredicted" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_STRING } - [ "date", "due_to_time" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_DATE } - [ "percentageCompleted", "truePositiveRate", "fMeasure", "falseNegativeRate", - "areaUnderRoc", "falsePositiveRate", "trueNegativeRate", "precision", "recall", - "percentCorrect", "percentIncorrect", "weightedAreaUnderRoc", "numCorrect", - "percentIncorrect", "percentUnpredicted", "realRuntime", - "percentWithoutClass", "rootMeanSquaredError", "meanAbsoluteError", "rSquare", - "targetVarianceActual", "targetVariancePredicted", "sumSquaredError", - "sampleCorrelationCoefficient" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_DOUBLE } - [ "numTrueNegatives", "numWithoutClass", "numFalseNegatives", "numTruePositives", - "numFalsePositives", "numIncorrect", "numInstances", "numUnpredicted", - "randomSeed", "numFolds", "confusionMatrixValue", - "crossvalidationFold" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_INTEGER } - [ "resultURI" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_URI } - [ "stratified" ].each{ |l| LITERAL_TYPES[l] = LITERAL_DATATYPE_BOOLEAN } - # some literals can have different types, parse from ruby type - PARSE_LITERAL_TYPE = "PARSE_LITERAL_TYPE" - [ "value" ].each{ |l| LITERAL_TYPES[l] = PARSE_LITERAL_TYPE } - - # constants for often used redland-resources - OWL_TYPE_LITERAL = OWL["AnnotationProperty"] - OWL_TYPE_CLASS = OWL["Class"] - OWL_TYPE_OBJECT_PROPERTY = OWL["ObjectProperty"] - RDF_TYPE = RDF['type'] - - # store redland:resources (=nodes) to: - # * separate namespaces (OT from RDF and DC) - # * save time, as generating resources is timeconsuming in redland - @@nodes = {} - [ "type", "about"].each{ |l| @@nodes[l] = RDF[l] } - [ "title", "creator", "date", "format" ].each{ |l| @@nodes[l] = DC[l] } - - def node(property) - raise "can only create node for non-empty-string, but given "+property.class.to_s+" (value: "+ - property.to_s+")" unless property.is_a?(String) and property.size>0 - raise "dc[identifier] deprecated, use owl.uri" if property=="identifier" - @@nodes[property] = OT[property] unless @@nodes.has_key?(property) - return @@nodes[property] - end - - # ot_class is the class of the object as string, e.g. "Model","Dataset", ... - # root_node is the root-object node in the rdf - # uri the uri of the object - attr_accessor :ot_class, :root_node, :uri, :model, :triples - - private - def initialize - @triples = [] - @model = Redland::Model.new Redland::MemoryStore.new - #@triples = "" - end - - # build new owl object - # ot_class is the class of this object, should be a string like "Model", "Task", ... - # uri is name and identifier of this object - public - def self.create( ot_class, uri ) - - owl = OpenTox::Owl.new - owl.ot_class = ot_class - owl.root_node = Redland::Resource.new(uri.to_s.strip) - owl.set("type",owl.ot_class) - owl.uri = uri - owl - end - - # loads owl from data - def self.from_data(data, base_uri, ot_class) - - owl = OpenTox::Owl.new - parser = Redland::Parser.new - - begin - parser.parse_string_into_model(owl.model, data, base_uri) - - # now loading root_node and uri - owl.model.find(nil, RDF_TYPE, owl.node(ot_class)) do |s,p,o| - #LOGGER.debug "about statements "+s.to_s+" . "+p.to_s+" -> "+o.to_s - is_root = true - owl.model.find(nil, nil, s) do |ss,pp,oo| - is_root = false - break - end - if is_root - # handle error if root is already set - raise "cannot derieve root object from rdf, more than one object specified" if owl.uri - raise "illegal root node type, no uri specified\n"+data.to_s if s.blank? - #store root note and uri - owl.uri = s.uri.to_s - owl.root_node = s - end - end - - # handle error if no root node was found - unless owl.root_node - types = [] - owl.model.find(nil, RDF_TYPE, nil){ |s,p,o| types << o.to_s } - raise "root node for class '"+owl.node(ot_class).to_s+"' not found (available type nodes: "+types.inspect+")" - end - raise "no uri in rdf: '"+owl.uri+"'" unless owl.uri and Utils.is_uri?(owl.uri) - owl.ot_class = ot_class - owl - rescue => e - RestClientWrapper.raise_uri_error(e.message, base_uri) - end - end - - def self.from_uri(uri, ot_class) - return from_data(RestClientWrapper.get(uri,:accept => "application/rdf+xml").to_s, uri, ot_class) - end - - def rdf - #@model.to_string - #stdin, stdout, stderr = Open3.popen3('rapper -I test.org -i ntriples -o rdfxml -') - #stdin.puts @triples - #stdout - #File.open("/tmp/d","w+") {|f| f.puts @triples} - #`rapper -i ntriples -o rdfxml /tmp/d` - #@triples - #output = RDF::Writer.for(:rdfxml).buffer do |writer| - RDF::Writer.for(:rdfxml).buffer do |writer| - @triples.each do |statement| - begin - writer << statement - rescue => e - LOGGER.error e - LOGGER.info statement.inspect - end - end - end - #output - end - - # returns the first object for subject:root_node and property - # (sufficient for accessing simple, root-node properties) - def get( property ) - raise "uri is no prop, use owl.uri instead" if property=="uri" - return get_value( @model.object( @root_node, node(property.to_s)) ) - end - - # returns an array of objects (not only the first one) that fit for the property - # accepts array of properties to access not-root-node vaules - # i.e. validation_owl.get_nested( [ "confusionMatrix", "confusionMatrixCell", "confusionMatrixValue" ] - # returns an array of all confusionMatrixValues - def get_nested( property_array ) - n = [ @root_node ] - property_array.each do |p| - new_nodes = [] - n.each do |nn| - @model.find( nn, node(p), nil ) do |sub,pred,obj| - new_nodes << obj - end - end - n = new_nodes - end - return n.collect{|nn| get_value( nn )} - end - - private - # returns node-value - def get_value( node ) - return nil unless node - if node.is_a?(Redland::Literal) - return node.get_value - elsif node.blank? - return nil - else - return node.uri.to_s - end - end - - public - # sets values of current_node (by default root_node) - # - # note: this does not delete existing triples - # * there can be several triples for the same subject and predicate - # ( e.g. after set("description","bla1") and set("description","bla2") - # both descriptions are in the model, - # but the get("description") will give you only one object (by chance) - # * this does not matter in pratice (only dataset uses this -> load_dataset-methods) - # * identical values appear only once in rdf - def set(predicate, object, current_node=@root_node ) - - pred = predicate.to_s - raise "uri is no prop, cannot set uri" if pred=="uri" - raise "dc[identifier] deprecated, use owl.uri" if pred=="identifier" - if (object.is_a?(Redland::Node) and object.blank?) or nil==object or object.to_s.size==0 - # set only not-nil values - LOGGER.warn "skipping (not setting) empty value in rdf for property: '"+pred+"'" - return - end - - if pred=="type" - # predicate is type, set class of current node - set_type(object, current_node) - elsif LITERAL_TYPES.has_key?(pred) - # predicate is literal - set_literal(pred,object,LITERAL_TYPES[pred],current_node) - elsif OBJECT_PROPERTY_CLASS.has_key?(pred) - # predicte is objectProperty, object is another resource - set_object_property(pred,object,OBJECT_PROPERTY_CLASS[pred],current_node) - else - raise "unkonwn rdf-property, please add: '"+pred+"' to OpenTox::OWL.OBJECT_PROPERTY_CLASS or OpenTox::OWL.LITERAL_TYPES" - end - end - - # example-triples for setting rdf-type to model: - # model_xy,rdf:type,ot:Model - # ot:Model,rdf:type,owl:Class - def set_type(ot_class, current_node=@root_node) - #@triples += "#{ot_class.to_s} #{RDF_TYPE.to_s} #{current_node.to_s}" - #@triples << "#{current_node} #{RDF_TYPE} #{node(ot_class).to_s}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - #@triples << "#{node(ot_class).to_s} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - add current_node, RDF_TYPE, node(ot_class) - add node(ot_class), RDF_TYPE, OWL_TYPE_CLASS - end - - # example-triples for setting description of a model: - # model_xy,ot:description,bla..bla^^xml:string - # ot:description,rdf:type,owl:Literal - def set_literal(literal_name, literal_value, literal_datatype, current_node=@root_node) - #@triples += "#{current_node} #{node(literal_name)} #{Redland::Literal.create(literal_value, literal_datatype)}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - #TODO: add datatype - #@triples << "#{current_node} #{node(literal_name)} \"#{literal_value}\".\n".gsub(/\[/,'<').gsub(/\]/,'>') - #@triples << "#{node(literal_name)} #{RDF_TYPE} #{OWL_TYPE_LITERAL}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - add current_node, node(literal_name), Redland::Literal.create(literal_value, literal_datatype) - add node(literal_name), RDF_TYPE, OWL_TYPE_LITERAL - end - - # example-triples for setting algorithm property of a model: - # model_xy,ot:algorithm,algorihtm_xy - # ot:algorithm,rdf:type,owl:ObjectProperty - # algorihtm_xy,rdf:type,ot:Algorithm - # ot:Algorithm,rdf:type,owl:Class - def set_object_property(property, object, object_class, current_node=@root_node) - object_node = Redland::Resource.new(object) - #@triples << "#{current_node} #{node(property)} #{object_node}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - #@triples << "#{node(property)} #{RDF_TYPE} #{OWL_TYPE_OBJECT_PROPERTY}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - #@triples << "#{object_node} #{RDF_TYPE} #{node(object_class)}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - #@triples << "#{node(object_class)} #{RDF_TYPE} #{OWL_TYPE_CLASS}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - add current_node, node(property), object_node - add node(property), RDF_TYPE, OWL_TYPE_OBJECT_PROPERTY - add object_node, RDF_TYPE, node(object_class) - add node(object_class), RDF_TYPE, OWL_TYPE_CLASS - end - - def add(s,p,o) - #@triples << "#{s} #{p} #{o}.\n".gsub(/\[/,'<').gsub(/\]/,'>') - @triples << [RDF::URI.new(s.to_s.sub(/\[/,'').sub(/\]/,'')),RDF::URI.new(p.to_s.sub(/\[/,'').sub(/\]/,'')),o.to_s.sub(/\[/,'').sub(/\]/,'')] - #@model.add s,p,o - end - - # this is (a recursiv method) to set nested-data via hashes (not only simple properties) - # example (for a dataset) - # { :description => "bla", - # :dataEntry => { :compound => "compound_uri", - # :values => [ { :class => "FeatureValue" - # :feature => "feat1", - # :value => 42 }, - # { :class => "FeatureValue" - # :feature => "feat2", - # :value => 123 } ] } } - def set_data(hash, current_node=@root_node) - - hash.each do |k,v| - if v.is_a?(Hash) - # value is again a hash - prop = k.to_s - - # :class is a special key to specify the class value, if not defined in OBJECT_PROPERTY_CLASS - object_class = v.has_key?(:class) ? v.delete(:class) : OBJECT_PROPERTY_CLASS[prop] - raise "hash key must be a object-property, please add '"+prop.to_s+ - "' to OpenTox::OWL.OBJECT_PROPERTY_CLASS or specify :class value" unless object_class - - # the new node is a class node, to specify the uri of the resource use key :uri - if v[:uri] - # identifier is either a specified uri - class_node = Redland::Resource.new(v.delete(:uri)) - else - # or a new uri, make up internal uri with increment - class_node = new_class_node(object_class,current_node) - end - set_object_property(prop,class_node,object_class,current_node) - # recursivly call set_data method with new node - set_data(v,class_node) - elsif v.is_a?(Array) - # value is an array, each array element is added with current key as predicate - v.each do |value| - set_data( { k => value }, current_node ) - end - else - # neither hash nor array, call simple set-method - set( k, v, current_node ) - end - end - end - - # create a new (internal class) node with unique, uri-like name - def new_class_node(name, current_node=@root_node) - # to avoid anonymous nodes, make up uris for sub-objects - # use counter to make sure each uri is unique - # for example we will get ../confusion_matrix_cell/1, ../confusion_matrix_cell/2, ... - count = 1 - while (true) - res = Redland::Resource.new( File.join(current_node.uri.to_s,name.to_s,count.to_s) ) - match = false - @model.find(nil, nil, res) do |s,p,o| - match = true - break - end - if match - count += 1 - else - break - end - end - return res - end - - # for "backwards-compatiblity" - # better use directly: - # set_data( { "parameters" => [ { "title" => , "paramScope" => , "paramValue" => } ] ) - def parameters=(params) - - converted_params = [] - params.each do |name, settings| - converted_params << { :title => name, :paramScope => settings[:scope], :paramValue => settings[:value] } - end - set_data( :parameters => converted_params ) - end - - # PENDING move to dataset.rb - # this is for dataset.to_owl - # adds feautre value for a single compound - def add_data_entries(compound_uri,features) - - data_entry = { :compound => compound_uri } - if features - feature_values = [] - features.each do |f| - f.each do |feature_uri,value| - if value.is_a?(Hash) - complex_values = [] - value.each do |uri,v| - complex_values << { :feature => uri, :value => v } - end - feature_values << { :class => "Tuple", :feature => feature_uri, :complexValue => complex_values } - else - feature_values << { :class => "FeatureValue", :feature => feature_uri, :value => value } - end - end - end - data_entry[:values] = feature_values - end - set_data( :dataEntry => data_entry ) - end - - # PENDING move to dataset.rb - # feature values are not loaded for performance reasons - # loading compounds and features into arrays that are given as params - def load_dataset( compounds, features ) - - @model.subjects(RDF_TYPE, node('Compound')).each do |compound| - compounds << get_value(compound) - end - - @model.subjects(RDF_TYPE, node('Feature')).each do |feature| - feature_value_found=false - @model.find(nil, node("feature"), feature) do |potential_feature_value,p,o| - @model.find(nil, node("values"), potential_feature_value) do |s,p,o| - feature_value_found=true - break - end - break if feature_value_found - end - features << get_value(feature) if feature_value_found - end - LOGGER.debug "loaded "+compounds.size.to_s+" compounds and "+features.size.to_s+" features from dataset "+uri.to_s - end - - # PENDING move to dataset.rb - # loading feature values for the specified feature - # if feature is nil, all feature values are loaded - # - # general remark on the rdf loading (found out with some testing): - # the search methods (subjects/find) are fast, the time consuming parts is creating resources, - # which cannot be avoided in general - def load_dataset_feature_values( compounds, data, feature_uris ) - - raise "no feature-uri array" unless feature_uris.is_a?(Array) - - # values are stored in the data-hash, hash has a key for each compound - compounds.each{|c| data[c] = [] unless data[c]} - - count = 0 - - feature_uris.each do |feature_uri| - LOGGER.debug("load feature values for feature: "+feature_uri ) - feature_node = Redland::Resource.new(feature_uri) - - # search for all feature_value_node with property 'ot_feature' and the feature we are looking for - @model.find(nil, node('feature'), feature_node) do |feature_value_node,p,o| - - # get compound_uri by "backtracking" to values node (property is 'values'), then get compound_node via 'compound' - value_nodes = @model.subjects(node('values'),feature_value_node) - if value_nodes.size>0 - raise "more than one value node "+value_nodes.size.to_s if value_nodes.size>1 - value_node = value_nodes[0] - - compound_uri = get_value( @model.object(value_node, node('compound')) ) - unless compound_uri - LOGGER.warn "'compound' missing for data-entry of feature "+feature_uri.to_s+ - ", value: "+@model.object(feature_value_node,node("value")).to_s - next - end - - value_node_type = @model.object(feature_value_node, RDF_TYPE) - if (value_node_type == node('FeatureValue')) - value_literal = @model.object( feature_value_node, node('value')) - raise "plain feature value no literal: "+value_literal.to_s unless value_literal.is_a?(Redland::Literal) - data[compound_uri] << {feature_uri => value_literal.get_value } - elsif (value_node_type == node('Tuple')) - complex_values = {} - @model.find(feature_value_node,node('complexValue'),nil) do |p,s,complex_value| - complex_value_type = @model.object(complex_value, RDF_TYPE) - raise "complex feature value no feature value: "+complex_value.to_s unless complex_value_type==node('FeatureValue') - complex_feature_uri = get_value(@model.object( complex_value, node('feature'))) - complex_value = @model.object( complex_value, node('value')) - raise "complex value no literal: "+complex_value.to_s unless complex_value.is_a?(Redland::Literal) - complex_values[ complex_feature_uri ] = complex_value.get_value - end - data[compound_uri] << { feature_uri => complex_values } if complex_values.size>0 - end - count += 1 - LOGGER.debug "loading feature values ("+count.to_s+")" if (count%1000 == 0) - end - end - LOGGER.debug "loaded "+count.to_s+" feature values for feature "+feature_node.to_s - end - end - end -end diff --git a/lib/parser.rb b/lib/parser.rb new file mode 100644 index 0000000..e623bf5 --- /dev/null +++ b/lib/parser.rb @@ -0,0 +1,191 @@ +require 'spreadsheet' +require 'roo' +module OpenTox + + module Parser + + module Owl + + def initialize(uri) + @uri = uri + @metadata = {} + end + + def metadata + # TODO: load parameters + if @dataset + uri = File.join(@uri,"metadata") + else + uri = @uri + end + statements = [] + `rapper -i rdfxml -o ntriples #{uri}`.each_line do |line| + triple = line.chomp.split('> ') + statements << triple.collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} + end + statements.each do |triple| + @metadata[triple[1]] = triple[2].split('^^').first if triple[0] == @uri and triple[1] != RDF['type'] + end + @metadata + end + + class Generic + include Owl + end + + class Dataset + + include Owl + + def initialize(uri) + super uri + @dataset = ::OpenTox::Dataset.new(@uri) + end + + def load_uri + data = {} + feature_values = {} + feature = {} + other_statements = {} + ntriples = `rapper -i rdfxml -o ntriples #{@uri}` + ntriples.each_line do |line| + triple = line.chomp.split(' ',3) + triple = triple[0..2].collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} + case triple[1] # Ambit namespaces are case insensitive + when /#{OT.values}/i + data[triple[0]] = {:compound => "", :values => []} unless data[triple[0]] + data[triple[0]][:values] << triple[2] + when /#{OT.value}/i + feature_values[triple[0]] = triple[2] + when /#{OT.compound}/i + data[triple[0]] = {:compound => "", :values => []} unless data[triple[0]] + data[triple[0]][:compound] = triple[2] + when /#{OT.feature}/i + feature[triple[0]] = triple[2] + else + end + end + data.each do |id,entry| + entry[:values].each do |value_id| + value = feature_values[value_id].split(/\^\^/).first # remove XSD.type + @dataset.add entry[:compound],feature[value_id],value + end + end + load_features + @dataset.metadata = metadata + @dataset + end + + def load_features + @dataset.features.keys.each do |feature| + @dataset.features[feature] = Parser::Owl::Generic.new(feature).metadata + end + end + end + + end + + class Spreadsheet + + def initialize(dataset) + @dataset = dataset + @format_errors = "" + @smiles_errors = [] + @activity_errors = [] + @duplicates = {} + @nr_compounds = 0 + @data = [] + @activities = [] + @type = "classification" + end + + def load_excel(book) + book.default_sheet = 0 + 1.upto(book.last_row) do |row| + if row == 1 + @feature = File.join(@dataset.uri,"feature",book.cell(row,2)) + else + add( book.cell(row,1), book.cell(row,2), row ) # smiles, activity + end + end + parse + end + + def load_csv(csv) + row = 0 + csv.each_line do |line| + row += 1 + raise "Invalid CSV format at line #{row}: #{line.chomp}" unless line.chomp.match(/^.+[,;].*$/) # check CSV format + items = line.chomp.gsub(/["']/,'').split(/\s*[,;]\s*/) # remove quotes + if row == 1 + @feature = File.join(@dataset.uri,"feature",items[1]) + else + add(items[0], items[1], row) + end + end + parse + end + + def parse + + # create dataset + @data.each do |items| + case @type + when "classification" + case items[1].to_s + when TRUE_REGEXP + @dataset.add(items[0], @feature, true ) + when FALSE_REGEXP + @dataset.add(items[0], @feature, false) + end + when "regression" + if items[1].to_f == 0 + @activity_errors << "Row #{items[2]}: Zero values not allowed for regression datasets - entry ignored." + else + @dataset.add items[0], @feature, items[1].to_f + end + end + end + + warnings = '' + warnings += "

Incorrect Smiles structures (ignored):

" + @smiles_errors.join("
") unless @smiles_errors.empty? + warnings += "

Irregular activities (ignored):

" + @activity_errors.join("
") unless @activity_errors.empty? + duplicate_warnings = '' + @duplicates.each {|inchi,lines| duplicate_warnings << "

#{lines.join('
')}

" if lines.size > 1 } + warnings += "

Duplicated structures (all structures/activities used for model building, please make sure, that the results were obtained from independent experiments):

" + duplicate_warnings unless duplicate_warnings.empty? + + @dataset.metadata[OT.Warnings] = warnings + + @dataset + + end + + def add(smiles, act, row) + compound = Compound.from_smiles(smiles) + if compound.nil? or compound.inchi.nil? or compound.inchi == "" + @smiles_errors << "Row #{row}: " + [smiles,act].join(", ") + return false + end + unless numeric?(act) or classification?(act) + @activity_errors << "Row #{row}: " + [smiles,act].join(", ") + return false + end + @duplicates[compound.inchi] = [] unless @duplicates[compound.inchi] + @duplicates[compound.inchi] << "Row #{row}: " + [smiles, act].join(", ") + @type = "regression" unless classification?(act) + # TODO: set OT.NumericalFeature, ... + @nr_compounds += 1 + @data << [ compound.uri, act , row ] + end + + def numeric?(object) + true if Float(object) rescue false + end + + def classification?(object) + !object.to_s.strip.match(TRUE_REGEXP).nil? or !object.to_s.strip.match(FALSE_REGEXP).nil? + end + + end + end +end diff --git a/lib/serializer.rb b/lib/serializer.rb new file mode 100644 index 0000000..3def252 --- /dev/null +++ b/lib/serializer.rb @@ -0,0 +1,297 @@ +require 'spreadsheet' +require 'yajl' + +module OpenTox + + module Serializer + + # modelled according to to http://n2.talis.com/wiki/RDF_JSON_Specification + class Owl + + attr_accessor :object + + def initialize + + @object = { + # this should come from opntox.owl + OT.Compound => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.Feature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.NominalFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.NumericFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.StringFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.Dataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.DataEntry => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.FeatureValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.Algorithm => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.Parameter => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + + OT.compound => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.feature => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.dataEntry => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.acceptValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.values => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + #XSD.anyUri => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.algorithm => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.parameters => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + + DC.title => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + DC.identifier => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + DC.contributor => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + DC.creator => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.isA => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + + OT.hasSource => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , + OT.value => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , + OT.paramScope => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , + OT.paramValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , + + #Untyped Individual: http://localhost/algorithm + } + + @data_entries = {} + @values_id = 0 + @parameter_id = 0 + + @classes = Set.new + @object_properties = Set.new + @annotation_properties = Set.new + @datatype_properties = Set.new + + @objects = Set.new + end + + def add_compound(uri) + #@classes << OT.Compound unless @classes.include? OT.Compound + @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Compound }] } + end + + def add_feature(uri,metadata) + #@classes << OT.Feature unless @classes.include? OT.Feature + #@classes << OT.NominalFeature unless @classes.include? OT.NominalFeature + #@classes << OT.NumericFeature unless @classes.include? OT.NumericFeature + #@classes << OT.StringFeature unless @classes.include? OT.StringFeature + @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Feature }] } + add_metadata uri, metadata + end + + def add_dataset(dataset) + + @dataset = dataset.uri + + @object[dataset.uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Dataset }] } + + add_metadata dataset.uri, dataset.metadata + + dataset.compounds.each { |compound| add_compound compound } + + dataset.features.each { |feature,metadata| add_feature feature,metadata } + + dataset.data_entries.each do |compound,entry| + entry.each do |feature,values| + values.each { |value| add_data_entry compound,feature,value } + end + end + + end + + def add_algorithm(uri,metadata,parameters) + @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } + add_metadata uri, metadata + add_parameters uri, parameters + #metadata.each { |u,v| @object[uri][u] = [{"type" => type(v), "value" => v }] } + end + + def add_model(uri,metadata) + end + + def add_metadata(uri,metadata) + #@object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT[type] }] } + metadata.each do |u,v| + @object[uri][u] = [{"type" => type(v), "value" => v }] + end + end + + def add_parameters(uri,parameters) + #@object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT[type] }] } + @object[uri][OT.parameters] = [] unless @object[uri][OT.parameters] + parameters.each do |p| + parameter = "_:parameter#{@parameter_id}" + @parameter_id += 1 + @object[uri][OT.parameters] << {"type" => "bnode", "value" => parameter} + @object[parameter] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Parameter }] } + add_metadata parameter, p + end + end + + def add_data_entry(compound,feature,value) + add_compound(compound) unless @object[compound] + add_feature(feature,{}) unless @object[feature] + unless data_entry = @data_entries[compound] + data_entry = "_:dataentry#{@data_entries.size}" + @data_entries[compound] = data_entry + @object[@dataset][OT.dataEntry] = [] unless @object[@dataset][OT.dataEntry] + @object[@dataset][OT.dataEntry] << {"type" => "bnode", "value" => data_entry} + @object[data_entry] = { + RDF["type"] => [{ "type" => "uri", "value" => OT.DataEntry }], + OT.compound => [{ "type" => "uri", "value" => compound }], + OT.values => [], + } + end + values = "_:values#{@values_id}" + @values_id += 1 + @object[data_entry][OT.values] << {"type" => "bnode", "value" => values} + case type(value) + when "uri" + v = [{ "type" => "uri", "value" => value}] + when "literal" + v = [{ "type" => "literal", "value" => value, "datatype" => datatype(value) }] + else + raise "Illegal type #{type(value)} for #{value}." + end + @object[values] = { + RDF["type"] => [{ "type" => "uri", "value" => OT.FeatureValue }], + OT.feature => [{ "type" => "uri", "value" => feature }], + OT.value => v + } + @object[feature][RDF["type"]] << { "type" => "uri", "value" => featuretype(value) } + end + + # Serializers + + def ntriples + + #rdf_types + @triples = Set.new + @object.each do |s,entry| + s = url(s) if type(s) == "uri" + entry.each do |p,objects| + p = url(p) + objects.each do |o| + case o["type"] + when "uri" + o = url(o["value"]) + when "literal" + o = literal(o["value"],datatype(o["value"])) + when "bnode" + o = o["value"] + end + @triples << [s,p,o] + end + end + end + @triples.sort.collect{ |s| s.join(' ').concat(" .") }.join("\n")+"\n" + end + + def rdfxml + Tempfile.open("owl-serializer"){|f| f.write(ntriples); @path = f.path} + `rapper -i ntriples -o rdfxml #{@path}` + end + + def json + #rdf_types + Yajl::Encoder.encode(@object) + end + + # Helpers for type detection + private + + def datatype(value) + if value.is_a? TrueClass or value.is_a? FalseClass + XSD.boolean + elsif value.is_a? Float + XSD.float + else + XSD.string + end + end + + def featuretype(value) + if value.is_a? TrueClass or value.is_a? FalseClass + datatype = OT.NominalFeature + elsif value.is_a? Float + datatype = OT.NumericFeature + else + datatype = OT.StringFeature + end + end + + def type(value) + begin + uri = URI.parse(value) + if uri.class == URI::HTTP or uri.class == URI::HTTPS + "uri" + elsif value.match(/^_/) + "bnode" + else + "literal" + end + rescue + "literal" + end + end + + def literal(value,type) + # concat and << are faster string concatination operators than + + '"'.concat(value.to_s).concat('"^^<').concat(type).concat('>') + end + + def url(uri) + # concat and << are faster string concatination operators than + + '<'.concat(uri).concat('>') + end + + def rdf_types + @classes.each { |c| @object[c] = { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } } + @object_properties.each { |p| @object[p] = { RDF["type"] => [{ "type" => "uri", "value" => OWL['ObjectProperty'] }] } } + @annotation_properties.each { |a| @object[a] = { RDF["type"] => [{ "type" => "uri", "value" => OWL['AnnotationProperty'] }] } } + @datatype_properties.each { |d| @object[d] = { RDF["type"] => [{ "type" => "uri", "value" => OWL['DatatypeProperty'] }] } } + end + + end + + class Spreadsheets # to avoid nameclash with Spreadsheet gem + + def initialize(dataset) + @rows = [] + @rows << ["SMILES"] + features = dataset.features.keys + @rows.first << features + @rows.first.flatten! + dataset.data_entries.each do |compound,entries| + smiles = Compound.new(compound).smiles + row = Array.new(@rows.first.size) + row[0] = smiles + entries.each do |feature, values| + i = features.index(feature)+1 + values.each do |value| + row[i] = value #TODO overwrites duplicated values + end + end + @rows << row + end + end + + def csv + @rows.collect{|r| r.join(", ")}.join("\n") + end + + def excel + Spreadsheet.client_encoding = 'UTF-8' + book = Spreadsheet::Workbook.new + sheet = book.create_worksheet(:name => '') + sheet.column(0).width = 100 + i = 0 + @rows.each do |row| + row.each do |c| + sheet.row(i).push c + end + i+=1 + end + book + end + + end + + + end +end diff --git a/lib/task.rb b/lib/task.rb index 1ab3893..50f0347 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -16,7 +16,7 @@ module OpenTox # create is private now, use OpenTox::Task.as_task def self.create( params ) - task_uri = RestClientWrapper.post(@@config[:services]["opentox-task"], params, nil, false).to_s + task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, nil, false).to_s Task.find(task_uri.chomp) end @@ -36,7 +36,7 @@ module OpenTox def reload( accept_header=nil ) unless accept_header - if (@@config[:yaml_hosts].include?(URI.parse(uri).host)) + if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) accept_header = "application/x-yaml" else accept_header = 'application/rdf+xml' @@ -99,7 +99,7 @@ module OpenTox # waits for a task, unless time exceeds or state is no longer running def wait_for_completion(dur=0.3) - if (@uri.match(@@config[:services]["opentox-task"])) + if (@uri.match(CONFIG[:services]["opentox-task"])) due_to_time = (@due_to_time.is_a?(Time) ? @due_to_time : Time.parse(@due_to_time)) running_time = due_to_time - (@date.is_a?(Time) ? @date : Time.parse(@date)) else @@ -144,7 +144,7 @@ module OpenTox #return yield nil params = {:title=>title, :creator=>creator, :max_duration=>max_duration, :description=>description } - task = OpenTox::Task.create(params) + task = ::OpenTox::Task.create(params) task_pid = Spork.spork(:logger => LOGGER) do LOGGER.debug "Task #{task.uri} started #{Time.now}" $self_task = task diff --git a/lib/validation.rb b/lib/validation.rb index 89a2a0c..340332a 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -4,11 +4,11 @@ module OpenTox attr_accessor :uri def initialize(params) - @uri = OpenTox::RestClientWrapper.post(File.join(@@config[:services]["opentox-validation"],"/crossvalidation"),params,nil,false) + @uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/crossvalidation"),params,nil,false) end def self.crossvalidation(params) - params[:uri] = File.join(@@config[:services]['opentox-validation'], "crossvalidation") + params[:uri] = File.join(CONFIG[:services]['opentox-validation'], "crossvalidation") params[:num_folds] = 10 unless params[:num_folds] params[:random_seed] = 2 unless params[:random_seed] params[:stratified] = false unless params[:stratified] -- cgit v1.2.3 From b93002b4ea50ff7e357da08abd10577347ce2d5f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 11 Nov 2010 09:31:27 +0100 Subject: first steps towards version 2.0, yard documentation started, passes compound, dataset, feature, algorithm, fminer tests --- Rakefile | 8 +- lib/algorithm.rb | 127 +++++++---- lib/compound.rb | 105 +++++---- lib/dataset.rb | 482 ++++++++++++--------------------------- lib/environment.rb | 29 +++ lib/feature.rb | 4 +- lib/model.rb | 485 +++++++++++++++++++++++++++++++--------- lib/opentox-ruby-api-wrapper.rb | 2 +- lib/opentox.rb | 106 ++++----- lib/overwrite.rb | 22 ++ lib/parser.rb | 208 +++++++++++------ lib/rest_client_wrapper.rb | 6 +- lib/serializer.rb | 69 +++--- lib/task.rb | 6 +- lib/utils.rb | 50 ----- 15 files changed, 944 insertions(+), 765 deletions(-) delete mode 100644 lib/utils.rb diff --git a/Rakefile b/Rakefile index 8dd1088..18f24bd 100644 --- a/Rakefile +++ b/Rakefile @@ -21,14 +21,14 @@ begin "rack-flash", "nokogiri", "rubyzip", - "builder", + #"builder", "roo", "spreadsheet", "google-spreadsheet-ruby", "tmail", "rinruby", - "rdf", - "rdf-raptor", + #"rdf", + #"rdf-raptor", "rjb" ].each { |dep| gem.add_dependency dep } [ "dm-core", @@ -42,7 +42,7 @@ begin gem.add_dependency "haml", ">=3" ['cucumber','jeweler'].each { |dep| gem.add_development_dependency dep } gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] - gem.files.include %w(lib/tasks/owl.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/utils.rb, lib/validation.rb, lib/templates/*) + gem.files.include %w(lib/tasks/owl.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/validation.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end Jeweler::GemcutterTasks.new diff --git a/lib/algorithm.rb b/lib/algorithm.rb index e1d369a..711f63b 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -1,77 +1,122 @@ module OpenTox + # Wrapper for OpenTox Algorithms module Algorithm - include OtObject + include OpenTox + # Execute algorithm with parameters, please consult the OpenTox API and the webservice documentation for acceptable parameters + def run(params=nil) + RestClientWrapper.post(@uri, params) + end + + # Get OWL-DL representation in RDF/XML format + # @return [application/rdf+xml] RDF/XML representation + def to_rdfxml + s = Serializer::Owl.new + s.add_algorithm(@uri,@metadata) + s.to_rdfxml + end + + # Generic Algorithm class, should work with all OpenTox webservices class Generic include Algorithm - #include OtObject - protected -# def initialize(owl) -# @title = owl.get("title") -# @date = owl.get("date") -# @uri = owl.uri -# end - end - class Fminer < Generic + module Fminer + include Algorithm - def self.create_feature_dataset(params) - LOGGER.debug File.basename(__FILE__) + ": creating feature dataset" - resource = RestClient::Resource.new(params[:feature_generation_uri]) - resource.post :dataset_uri => params[:dataset_uri], :feature_uri => params[:feature_uri] + class BBRC + include Fminer + # Initialize bbrc algorithm + def initialize + super File.join(CONFIG[:services]["opentox-algorithm"], "fminer/bbrc") + load_metadata + end + end + + class LAST + include Fminer + # Initialize last algorithm + def initialize + super File.join(CONFIG[:services]["opentox-algorithm"], "fminer/last") + load_metadata + end end - def self.uri - File.join(CONFIG[:services]["opentox-algorithm"], "fminer") - end end - class Lazar - - def self.create_model(params) - LOGGER.debug params - LOGGER.debug File.basename(__FILE__) + ": creating model" - LOGGER.debug File.join(CONFIG[:services]["opentox-algorithm"], "lazar") - resource = RestClient::Resource.new(File.join(CONFIG[:services]["opentox-algorithm"], "lazar"), :content_type => "application/x-yaml") - @uri = resource.post(:dataset_uri => params[:dataset_uri], :prediction_feature => params[:prediction_feature], :feature_generation_uri => File.join(CONFIG[:services]["opentox-algorithm"], "fminer")).body.chomp - end + # Create lazar prediction model + class Lazar + include Algorithm + # Initialize lazar algorithm + def initialize + super File.join(CONFIG[:services]["opentox-algorithm"], "lazar") + load_metadata + end + end - def self.uri - File.join(CONFIG[:services]["opentox-algorithm"], "lazar") - end + # Utility methods without dedicated webservices - end + module Similarity + include Algorithm - class Similarity - def self.weighted_tanimoto(fp_a,fp_b,p) - common_features = fp_a & fp_b - all_features = (fp_a + fp_b).uniq + # Tanimoto similarity + # + # @param [Array] features_a Features of first compound + # @param [Array] features_b Features of second compound + # @param [optional, Hash] weights Weights for all features + # @return [Float] (Wighted) tanimoto similarity + def self.tanimoto(features_a,features_b,weights=nil) + common_features = features_a & features_b + all_features = (features_a + features_b).uniq common_p_sum = 0.0 if common_features.size > 0 - common_features.each{|f| common_p_sum += OpenTox::Utils.gauss(p[f])} - all_p_sum = 0.0 - all_features.each{|f| all_p_sum += OpenTox::Utils.gauss(p[f])} - common_p_sum/all_p_sum + if weights + common_features.each{|f| common_p_sum += Algorithm.gauss(weights[f])} + all_p_sum = 0.0 + all_features.each{|f| all_p_sum += Algorithm.gauss(weights[f])} + common_p_sum/all_p_sum + else + common_features.to_f/all_features + end else 0.0 end end - def self.euclidean(prop_a,prop_b) + + # Euclidean similarity + def self.euclidean(prop_a,prop_b,weights=nil) common_properties = prop_a.keys & prop_b.keys if common_properties.size > 1 dist_sum = 0 common_properties.each do |p| - dist_sum += (prop_a[p] - prop_b[p])**2 + if weights + dist_sum += ( (prop_a[p] - prop_b[p]) * Algorithm.gauss(weights[p]) )**2 + else + dist_sum += (prop_a[p] - prop_b[p])**2 + end end 1/(1+Math.sqrt(dist_sum)) else - nil + 0.0 end end end + + # Gauss kernel + def self.gauss(sim, sigma = 0.3) + x = 1.0 - sim + Math.exp(-(x*x)/(2*sigma*sigma)) + end + + # Median of an array + def self.median(array) + return nil if array.empty? + array.sort! + m_pos = array.size / 2 + return array.size % 2 == 1 ? array[m_pos] : (array[m_pos-1] + array[m_pos])/2 + end end end diff --git a/lib/compound.rb b/lib/compound.rb index 699e4c1..6834860 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -4,41 +4,15 @@ module OpenTox # Ruby wrapper for OpenTox Compound Webservices (http://opentox.org/dev/apis/api-1.2/structure). - # - # Examples: - # require "opentox-ruby-api-wrapper" - # - # # Creating compounds - # - # # from smiles string - # compound = OpenTox::Compound.from_smiles("c1ccccc1") - # # from name - # compound = OpenTox::Compound.from_name("Benzene") - # # from uri - # compound = OpenTox::Compound.new("http://webservices.in-silico.ch/compound/InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H"") - # - # # Getting compound representations - # - # # get InChI - # inchi = compound.inchi - # # get all compound names - # names = compound.names - # # get png image - # image = compound.png - # # get uri - # uri = compound.uri - # - # # SMARTS matching - # - # # match a smarts string - # compound.match?("cN") # returns false - # # match an array of smarts strings - # compound.match(['cc','cN']) # returns ['cc'] class Compound attr_accessor :inchi, :uri # Create compound with optional uri + # @example + # compound = OpenTox::Compound.new("http://webservices.in-silico.ch/compound/InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H"") + # @param [optional, String] uri Compound URI + # @return [OpenTox::Compound] Compound def initialize(uri=nil) @uri = uri case @uri @@ -50,6 +24,10 @@ module OpenTox end # Create a compound from smiles string + # @example + # compound = OpenTox::Compound.from_smiles("c1ccccc1") + # @param [String] smiles Smiles string + # @return [OpenTox::Compound] Compound def self.from_smiles(smiles) c = Compound.new c.inchi = Compound.smiles2inchi(smiles) @@ -58,6 +36,8 @@ module OpenTox end # Create a compound from inchi string + # @param [String] smiles InChI string + # @return [OpenTox::Compound] Compound def self.from_inchi(inchi) c = Compound.new c.inchi = inchi @@ -66,6 +46,8 @@ module OpenTox end # Create a compound from sdf string + # @param [String] smiles SDF string + # @return [OpenTox::Compound] Compound def self.from_sdf(sdf) c = Compound.new c.inchi = Compound.sdf2inchi(sdf) @@ -73,7 +55,11 @@ module OpenTox c end - # Create a compound from name (name can be also an InChI/InChiKey, CAS number, etc) + # Create a compound from name. Relies on an external service for name lookups. + # @example + # compound = OpenTox::Compound.from_name("Benzene") + # @param [String] name name can be also an InChI/InChiKey, CAS number, etc + # @return [OpenTox::Compound] Compound def self.from_name(name) c = Compound.new # paranoid URI encoding to keep SMILES charges and brackets @@ -83,32 +69,42 @@ module OpenTox end # Get (canonical) smiles - def smiles + # @return [String] Smiles string + def to_smiles Compound.obconversion(@inchi,'inchi','can') end # Get sdf - def sdf + # @return [String] SDF string + def to_sdf Compound.obconversion(@inchi,'inchi','sdf') end # Get gif image - def gif + # @return [image/gif] Image data + def to_gif RestClientWrapper.get("#{@@cactus_uri}#{@inchi}/image") end # Get png image - def png + # @example + # image = compound.to_png + # @return [image/png] Image data + def to_png RestClientWrapper.get(File.join @uri, "image") end # Get URI of compound image - def image_uri + # @return [String] Compound image URI + def to_image_uri File.join @uri, "image" end - # Get all known compound names - def names + # Get all known compound names. Relies on an external service for name lookups. + # @example + # names = compound.to_names + # @return [String] Compound names + def to_names begin RestClientWrapper.get("#{@@cactus_uri}#{@inchi}/names").split("\n") rescue @@ -117,6 +113,10 @@ module OpenTox end # Match a smarts string + # @example + # compound = OpenTox::Compound.from_name("Benzene") + # compound.match?("cN") # returns false + # @param [String] smarts Smarts string def match?(smarts) obconversion = OpenBabel::OBConversion.new obmol = OpenBabel::OBMol.new @@ -128,19 +128,34 @@ module OpenTox end # Match an array of smarts strings, returns array with matching smarts + # @example + # compound = OpenTox::Compound.from_name("Benzene") + # compound.match(['cc','cN']) # returns ['cc'] + # @param [Array] smarts_array Array with Smarts strings + # @return [Array] Array with matching Smarts strings def match(smarts_array) - smarts_array.collect{|s| s if match?(s)}.compact + # avoid recreation of OpenBabel objects + obconversion = OpenBabel::OBConversion.new + obmol = OpenBabel::OBMol.new + obconversion.set_in_format('inchi') + obconversion.read_string(obmol,@inchi) + smarts_pattern = OpenBabel::OBSmartsPattern.new + smarts_array.collect do |smarts| + smarts_pattern.init(smarts) + smarts if smarts_pattern.match(obmol) + end.compact + #smarts_array.collect { |s| s if match?(s)}.compact end # Get URI of compound image with highlighted fragments - def matching_smarts_image_uri(activating, deactivating, highlight = nil) + # + # @param [Array] activating Array with activating Smarts strings + # @param [Array] deactivating Array with deactivating Smarts strings + # @return [String] URI for compound image with highlighted fragments + def matching_smarts_image_uri(activating, deactivating) activating_smarts = URI.encode "\"#{activating.join("\"/\"")}\"" deactivating_smarts = URI.encode "\"#{deactivating.join("\"/\"")}\"" - if highlight.nil? - File.join CONFIG[:services]["opentox-compound"], "smiles", URI.encode(smiles), "smarts/activating", URI.encode(activating_smarts),"deactivating", URI.encode(deactivating_smarts) - else - File.join CONFIG[:services]["opentox-compound"], "smiles", URI.encode(smiles), "smarts/activating", URI.encode(activating_smarts),"deactivating", URI.encode(deactivating_smarts), "highlight", URI.encode(highlight) - end + File.join @uri, "smarts/activating", URI.encode(activating_smarts),"deactivating", URI.encode(deactivating_smarts) end diff --git a/lib/dataset.rb b/lib/dataset.rb index 7c8ce24..05b2ed3 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -1,74 +1,19 @@ module OpenTox # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). - # - # Examples: - # require "opentox-ruby-api-wrapper" - # - # # Creating datasets - # - # # create an empty dataset - # dataset = OpenTox::Dataset.new - # # create an empty dataset with URI - # # this does not load data from the dataset service - use one of the load_* methods - # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") - # # create new dataset and sav it to obtain a URI - # dataset = OpenTox::Dataset.create - # # create a new dataset from yaml representation - # dataset = OpenTox::Dataset.from_yaml - # # create a new dataset from CSV string - # csv_string = "SMILES, Toxicity\nc1ccccc1N, true" - # dataset = OpenTox::Dataset.from_csv(csv_string) - # - # # Loading data - # # Datasets created with OpenTox::Dataset.new(uri) are empty by default - # # Invoking one of the following functions will load data into the object - # - # # create an empty dataset with URI - # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") - # # loads (and returns) only metadata - # dataset.load_metadata - # # loads (and returns) only compounds - # dataset.load_compounds - # # loads (and returns) only features - # dataset.load_features - # # load all data from URI - # dataset.load_all - # - # # Getting dataset representations - # - # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") - # dataset.load_all - # # OWL-DL (RDF/XML) - # dataset.rdfxml - # # OWL-DL (Ntriples) - # dataset.ntriples - # # YAML - # dataset.yaml - # # CSV - # dataset.csv - # - # # Modifying datasets - # - # # insert a statement (compound_uri,feature_uri,value) - # dataset.add "http://webservices.in-silico.ch/compound/InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9", "http://webservices.in-silico.ch/dataset/1/feature/hamster_carcinogenicity", true - # - # - # # Saving datasets - # # save dataset at dataset service - # dataset.save - # - # # Deleting datasets - # # delete dataset (also at dataset service) - # dataset.delete class Dataset - include OtObject + include OpenTox attr_reader :features, :compounds, :data_entries, :metadata - attr_writer :metadata - # Create dataset with optional URI + # Create dataset with optional URI. Does not load data into the dataset - you will need to execute one of the load_* methods to pull data from a service or to insert it from other representations. + # @example Create an empty dataset + # dataset = OpenTox::Dataset.new + # @example Create an empty dataset with URI + # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") + # @param [optional, String] uri Dataset URI + # @return [OpenTox::Dataset] Dataset object def initialize(uri=nil) super uri @features = {} @@ -76,52 +21,79 @@ module OpenTox @data_entries = {} end - # Create and save an empty dataset (assigns URI to dataset) + # Create an empty dataset and save it at the dataset service (assigns URI to dataset) + # @example Create new dataset and save it to obtain a URI + # dataset = OpenTox::Dataset.create + # @param [optional, String] uri Dataset URI + # @return [OpenTox::Dataset] Dataset object def self.create(uri=CONFIG[:services]["opentox-dataset"]) dataset = Dataset.new - dataset.uri = RestClientWrapper.post(uri,{}).to_s.chomp + dataset.save + dataset + end + + # Find a dataset and load all data. This can be time consuming, use Dataset.new together with one of the load_* methods for a fine grained control over data loading. + # @param [String] uri Dataset URI + # @return [OpenTox::Dataset] Dataset object with all data + def self.find(uri) + dataset = Dataset.new(uri) + dataset.load_all dataset end # Get all datasets from a service -# def self.all(uri=CONFIG[:services]["opentox-dataset"]) -# RestClientWrapper.get(uri,:accept => "text/uri-list").to_s.each_line.collect{|u| Dataset.new(u)} -# end + # @param [optional,String] uri URI of the dataset service, defaults to service specified in configuration + # @return [Array] Array of dataset object with all data + def self.all(uri=CONFIG[:services]["opentox-dataset"]) + RestClientWrapper.get(uri,:accept => "text/uri-list").to_s.each_line.collect{|u| Dataset.new(u)} + end - # Create a dataset from YAML string - def self.from_yaml(yaml) - dataset = Dataset.create - dataset.copy YAML.load(yaml) - dataset + # Load YAML representation into the dataset + # @param [String] yaml YAML representation of the dataset + # @return [OpenTox::Dataset] Dataset object with YAML data + def load_yaml(yaml) + copy YAML.load(yaml) + end + + # Load RDF/XML representation from a file + # @param [String] file File with RDF/XML representation of the dataset + # @return [OpenTox::Dataset] Dataset object with RDF/XML data + def load_rdfxml_file(file) + parser = Parser::Owl::Dataset.new @uri + parser.uri = file.path + copy parser.load_uri end - # Create dataset from CSV string (format specification: http://toxcreate.org/help) + # Load CSV string (format specification: http://toxcreate.org/help) # - loads data_entries, compounds, features # - sets metadata (warnings) for parser errors # - you will have to set remaining metadata manually - def self.from_csv(csv) - dataset = Dataset.create - Parser::Spreadsheet.new(dataset).load_csv(csv) - dataset + # @param [String] csv CSV representation of the dataset + # @return [OpenTox::Dataset] Dataset object with CSV data + def load_csv(csv) + save unless @uri # get a uri for creating features + parser = Parser::Spreadsheets.new + parser.dataset = self + parser.load_csv(csv) end - # Create dataset from Spreadsheet book (created with roo gem http://roo.rubyforge.org/, excel format specification: http://toxcreate.org/help)) + # Load Spreadsheet book (created with roo gem http://roo.rubyforge.org/, excel format specification: http://toxcreate.org/help)) # - loads data_entries, compounds, features # - sets metadata (warnings) for parser errors # - you will have to set remaining metadata manually - def self.from_spreadsheet(book) - dataset = Dataset.create - Parser::Spreadsheet.new(dataset).load_excel(book) - dataset + # @param [Excel] book Excel workbook object (created with roo gem) + # @return [OpenTox::Dataset] Dataset object with Excel data + def load_spreadsheet(book) + save unless @uri # get a uri for creating features + parser = Parser::Spreadsheets.new + parser.dataset = self + parser.load_excel(book) end - # Load and return metadata of a Dataset object + # Load and return only metadata of a Dataset object + # @return [Hash] Metadata of the dataset def load_metadata - #if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - #add_metadata YAML.load(RestClientWrapper.get(File.join(@uri,"metadata"), :accept => "application/x-yaml")) - #else - add_metadata Parser::Owl::Dataset.new(@uri).metadata - #end + add_metadata Parser::Owl::Dataset.new(@uri).metadata self.uri = @uri if @uri # keep uri @metadata end @@ -136,7 +108,8 @@ module OpenTox end end - # Load and return all compound URIs + # Load and return only compound URIs from the dataset service + # @return [Array] Compound URIs in the dataset def load_compounds RestClientWrapper.get(File.join(uri,"compounds"),:accept=> "text/uri-list").to_s.each_line do |compound_uri| @compounds << compound_uri.chomp @@ -144,44 +117,75 @@ module OpenTox @compounds.uniq! end - # Load all feature URIs + # Load and return only features from the dataset service + # @return [Hash] Features of the dataset def load_features - RestClientWrapper.get(File.join(uri,"features"),:accept=> "text/uri-list").to_s.each_line do |feature_uri| - @features[feature_uri.chomp] = Feature.new(feature_uri.chomp).load_metadata - end + parser = Parser::Owl::Dataset.new(@uri) + @features = parser.load_features @features end - # Get YAML representation - def yaml - self.to_yaml + # Detect feature type(s) in the dataset + # @return [String] `classification", "regression", "mixed" or unknown` + def feature_type + feature_types = @features.collect{|f,metadata| metadata[OT.isA]}.uniq + LOGGER.debug "FEATURES" + LOGGER.debug feature_types.inspect + if feature_types.size > 1 + "mixed" + else + case feature_types.first + when /NominalFeature/ + "classification" + when /NumericFeature/ + "regression" + else + "unknown" + end + end end - # Get Excel representation, returns a Spreadsheet::Workbook which can be written with the 'spreadsheet' gem (data_entries only, metadata will ) - def excel - Serializer::Spreadsheets.new(self).excel + # Get Excel representation + # @return [Spreadsheet::Workbook] Workbook which can be written with the spreadsheet gem (data_entries only, metadata will will be discarded)) + def to_xls + Serializer::Spreadsheets.new(self).to_xls end # Get CSV string representation (data_entries only, metadata will be discarded) - def csv - Serializer::Spreadsheets.new(self).csv + # @return [String] CSV representation + def to_csv + Serializer::Spreadsheets.new(self).to_csv end # Get OWL-DL in ntriples format - def ntriples + # @return [String] N-Triples representation + def to_ntriples s = Serializer::Owl.new s.add_dataset(self) - s.ntriples + s.to_ntriples end # Get OWL-DL in RDF/XML format - def rdfxml + # @return [String] RDF/XML representation + def to_rdfxml s = Serializer::Owl.new s.add_dataset(self) - s.rdfxml + s.to_rdfxml + end + + # Get name (DC.title) of a feature + # @param [String] feature Feature URI + # @return [String] Feture title + def feature_name(feature) + @features[feature][DC.title] end # Insert a statement (compound_uri,feature_uri,value) + # @example Insert a statement (compound_uri,feature_uri,value) + # dataset.add "http://webservices.in-silico.ch/compound/InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9", "http://webservices.in-silico.ch/dataset/1/feature/hamster_carcinogenicity", true + # @param [String] compound Compound URI + # @param [String] feature Compound URI + # @param [Boolean,Float] value Feature value def add (compound,feature,value) @compounds << compound unless @compounds.include? compound @features[feature] = {} unless @features[feature] @@ -190,252 +194,62 @@ module OpenTox @data_entries[compound][feature] << value end - # Add metadata (hash with predicate_uri => value) + # Add/modify metadata, existing entries will be overwritten + # @example + # dataset.add_metadata({DC.title => "any_title", DC.creator => "my_email"}) + # @param [Hash] metadata Hash mapping predicate_uris to values def add_metadata(metadata) metadata.each { |k,v| @metadata[k] = v } end - # Copy a dataset (rewrites URI) - def copy(dataset) - @metadata = dataset.metadata - @data_entries = dataset.data_entries - @compounds = dataset.compounds - @features = dataset.features - if @uri - self.uri = @uri - else - @uri = dataset.metadata[XSD.anyUri] - end + # Add a feature + # @param [String] feature Feature URI + # @param [Hash] metadata Hash with feature metadata + def add_feature(feature,metadata={}) + @features[feature] = metadata end - # save dataset (overwrites existing dataset) + # Add/modify metadata for a feature + # @param [String] feature Feature URI + # @param [Hash] metadata Hash with feature metadata + def add_feature_metadata(feature,metadata) + metadata.each { |k,v| @features[feature][k] = v } + end + + # Save dataset at the dataset service + # - creates a new dataset if uri is not set + # - overwrites dataset if uri exists + # @return [String] Dataset URI def save # TODO: rewrite feature URI's ?? - # create dataset if uri empty @compounds.uniq! - RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) + if @uri + RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) + else + # create dataset if uri is empty + self.uri = RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{}).to_s.chomp + RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) + end + @uri end # Delete dataset at the dataset service def delete RestClientWrapper.delete @uri end - end -end - - ######################################################### - # kept for backward compatibility, may have to be fixed # - ######################################################### - -=begin - def from_owl(owl) - # creates dataset object from Opentox::Owl object - # use Dataset.find( ) to load dataset from rdf-supporting datasetservice - # note: does not load all feature values, as this is time consuming - raise "invalid param" unless owl.is_a?(OpenTox::Owl) - @metadata[DC.title] = owl.get("title") - @metadata[DC.creator] = owl.get("creator") - @metadata[XSD.anyUri] = owl.uri - # when loading a dataset from owl, only compound- and feature-uris are loaded - owl.load_dataset(@compounds, @features) - # all features are marked as dirty - # as soon as a feature-value is requested all values for this feature are loaded from the rdf - @dirty_features = @features.dclone - @owl = owl - end - - def self.find(uri, accept_header=nil) - - unless accept_header - if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) - accept_header = 'application/x-yaml' - else - accept_header = "application/rdf+xml" - end - end - - case accept_header - when "application/x-yaml" - LOGGER.debug "DATASET: "+ uri - LOGGER.debug RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s - d = YAML.load RestClientWrapper.get(uri.to_s.strip, :accept => 'application/x-yaml').to_s - #d.uri = @metadata[XSD.anyUri] unless d.uri - when "application/rdf+xml" - owl = OpenTox::Owl.from_uri(uri.to_s.strip, "Dataset") - d = Dataset.new(owl) - else - raise "cannot get datset with accept header: "+accept_header.to_s - end - d - end - # converts a dataset represented in owl to yaml - # (uses a temporary dataset) - # note: to_yaml is overwritten, loads complete owl dataset values - def self.owl_to_yaml( owl_data, uri) - owl = OpenTox::Owl.from_data(owl_data, uri, "Dataset") - d = Dataset.new(owl) - d.to_yaml - end - - # creates a new dataset, using only those compounsd specified in new_compounds - # returns uri of new dataset - def create_new_dataset( new_compounds, new_features, new_title, new_creator ) - - LOGGER.debug "create new dataset with "+new_compounds.size.to_s+"/"+compounds.size.to_s+" compounds" - raise "no new compounds selected" unless new_compounds and new_compounds.size>0 - - # load require features - if ((defined? @dirty_features) && (@dirty_features & new_features).size > 0) - (@dirty_features & new_features).each{|f| load_feature_values(f)} - end - - dataset = OpenTox::Dataset.new - dataset.title = new_title - dataset.creator = new_creator - dataset.features = new_features - dataset.compounds = new_compounds - - # Copy dataset data for compounds and features - # PENDING: why storing feature values in an array? - new_compounds.each do |c| - data_c = [] - raise "no data for compound '"+c.to_s+"'" if @data[c]==nil - @data[c].each do |d| - m = {} - new_features.each do |f| - m[f] = d[f] - end - data_c << m - end - dataset.data[c] = data_c - end - return dataset.save - end - - # returns classification value - def get_predicted_class(compound, feature) - v = get_value(compound, feature) - if v.is_a?(Hash) - k = v.keys.grep(/classification/).first - unless k.empty? - #if v.has_key?(:classification) - return v[k] - else - return "no classification key" - end - elsif v.is_a?(Array) - raise "predicted class value is an array\n"+ - "value "+v.to_s+"\n"+ - "value-class "+v.class.to_s+"\n"+ - "dataset "+self.uri.to_s+"\n"+ - "compound "+compound.to_s+"\n"+ - "feature "+feature.to_s+"\n" - else - return v - end - end - - # returns regression value - def get_predicted_regression(compound, feature) - v = get_value(compound, feature) - if v.is_a?(Hash) - k = v.keys.grep(/regression/).first - unless k.empty? - return v[k] - else - return "no regression key" - end - elsif v.is_a?(Array) - raise "predicted regression value is an array\n"+ - "value "+v.to_s+"\n"+ - "value-class "+v.class.to_s+"\n"+ - "dataset "+self.uri.to_s+"\n"+ - "compound "+compound.to_s+"\n"+ - "feature "+feature.to_s+"\n" - else - return v - end - end - - # returns prediction confidence if available - def get_prediction_confidence(compound, feature) - v = get_value(compound, feature) - if v.is_a?(Hash) - k = v.keys.grep(/confidence/).first - unless k.empty? - #if v.has_key?(:confidence) - return v[k].abs - #return v["http://ot-dev.in-silico.ch/model/lazar#confidence"].abs - else - # PENDING: return nil isntead of raising an exception - raise "no confidence key" - end - else - LOGGER.warn "no confidence for compound: "+compound.to_s+", feature: "+feature.to_s - return 1 - end - end - - # return compound-feature value - def get_value(compound, feature) - if (defined? @dirty_features) && @dirty_features.include?(feature) - load_feature_values(feature) - end - - v = @data[compound] - return nil if v == nil # missing values for all features - if v.is_a?(Array) - # PENDING: why using an array here? - v.each do |e| - if e.is_a?(Hash) - if e.has_key?(feature) - return e[feature] - end - else - raise "invalid internal value type" - end - end - return nil #missing value - else - raise "value is not an array\n"+ - "value "+v.to_s+"\n"+ - "value-class "+v.class.to_s+"\n"+ - "dataset "+self.uri.to_s+"\n"+ - "compound "+compound.to_s+"\n"+ - "feature "+feature.to_s+"\n" - end - end - - # loads specified feature and removes dirty-flag, loads all features if feature is nil - def load_feature_values(feature=nil) - if feature - raise "feature already loaded" unless @dirty_features.include?(feature) - @owl.load_dataset_feature_values(@compounds, @data, [feature]) - @dirty_features.delete(feature) + private + # Copy a dataset (rewrites URI) + def copy(dataset) + @metadata = dataset.metadata + @data_entries = dataset.data_entries + @compounds = dataset.compounds + @features = dataset.features + if @uri + self.uri = @uri else - @data = {} unless @data - @owl.load_dataset_feature_values(@compounds, @data, @dirty_features) - @dirty_features.clear + @uri = dataset.metadata[XSD.anyURI] end end - - # overwrite to yaml: - # in case dataset is loaded from owl: - # * load all values - def to_yaml - # loads all features - if ((defined? @dirty_features) && @dirty_features.size > 0) - load_feature_values - end - super - end - - # * remove @owl from yaml, not necessary - def to_yaml_properties - super - ["@owl"] - end - end end -=end diff --git a/lib/environment.rb b/lib/environment.rb index b16b62f..d66b062 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -61,3 +61,32 @@ FALSE_REGEXP = /^(false|inactive|0|0.0)$/i # Task durations DEFAULT_TASK_MAX_DURATION = 36000 EXTERNAL_TASK_MAX_DURATION = 36000 + +# OWL Namespaces +class OwlNamespace + + def initialize(uri) + @uri = uri + end + + def [](property) + @uri+property.to_s + end + + def type # for RDF.type + "#{@uri}type" + end + + def method_missing(property) + @uri+property.to_s + end + +end + +RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' +OWL = OwlNamespace.new 'http://www.w3.org/2002/07/owl#' +DC = OwlNamespace.new 'http://purl.org/dc/elements/1.1/' +OT = OwlNamespace.new 'http://www.opentox.org/api/1.1#' +OTA = OwlNamespace.new 'http://www.opentox.org/algorithmTypes.owl#' +XSD = OwlNamespace.new 'http://www.w3.org/2001/XMLSchema#' + diff --git a/lib/feature.rb b/lib/feature.rb index 9616135..13d97a2 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -1,7 +1,5 @@ module OpenTox - class Feature - include OtObject + include OpenTox end - end diff --git a/lib/model.rb b/lib/model.rb index d0d6703..63013cb 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -1,143 +1,410 @@ module OpenTox + module Model + include OpenTox + + def run(params) + if CONFIG[:yaml_hosts].include?(URI.parse(@uri).host) + accept = 'application/x-yaml' + else + accept = 'application/rdf+xml' + end + begin + params[:acccept] = accept + #TODO fix: REstClientWrapper does not accept accept header + #RestClientWrapper.post(@uri,params)#,{:accept => accept}) + `curl -X POST -H "Accept:#{accept}" #{params.collect{|k,v| "-d #{k}=#{v}"}.join(" ")} #{@uri}`.to_s.chomp + rescue => e + LOGGER.error "Failed to run #{@uri} with #{params.inspect} (#{e.inspect})" + raise "Failed to run #{@uri} with #{params.inspect}" + end + end + +=begin + def classification? + #TODO replace with request to ontology server + if @metadata[DC.title] =~ /(?i)classification/ + return true + elsif @metadata[DC.title] =~ /(?i)regression/ + return false + elsif @uri =~/ntua/ and @metadata[DC.title] =~ /mlr/ + return false + elsif @uri =~/tu-muenchen/ and @metadata[DC.title] =~ /regression|M5P|GaussP/ + return false + elsif @uri =~/ambit2/ and @metadata[DC.title] =~ /pKa/ || @metadata[DC.title] =~ /Regression|Caco/ + return false + elsif @uri =~/majority/ + return (@uri =~ /class/) != nil + else + raise "unknown model, uri:'"+@uri+"' title:'"+@metadata[DC.title]+"'" + end + end +=end + class Generic + include Model + end + + class Lazar + + include Model + + #attr_accessor :prediction_type, :feature_type, :features, :effects, :activities, :p_values, :fingerprints, :parameters + attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :parameters, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm + + def initialize(uri=nil) + + if uri + super uri + else + super CONFIG[:services]["opentox-model"] + end + + # TODO: fix metadata, add parameters + @metadata[OT.algorithm] = File.join(CONFIG[:services]["opentox-algorithm"],"lazar") + + @features = [] + @effects = {} + @activities = {} + @p_values = {} + @fingerprints = {} + + @feature_calculation_algorithm = "substructure_match" + @similarity_algorithm = "weighted_tanimoto" + @prediction_algorithm = "weighted_majority_vote" - MODEL_ATTRIBS = [:uri, :title, :creator, :date, :format, :predictedVariables, :independentVariables, :dependentVariables, :trainingDataset, :algorithm] - MODEL_ATTRIBS.each{ |a| attr_accessor(a) } + @min_sim = 0.3 + + end def self.find(uri) - owl = OpenTox::Owl.from_uri(uri, "Model") - return self.new(owl) - end - - def self.to_rdf(model) - owl = OpenTox::Owl.create 'Model', model.uri - (MODEL_ATTRIBS - [:uri]).each do |a| - owl.set(a.to_s,model.send(a.to_s)) + YAML.load RestClientWrapper.get(uri,:content_type => 'application/x-yaml') + end + + def self.create_from_dataset(dataset_uri,feature_dataset_uri,prediction_feature=nil) + training_activities = OpenTox::Dataset.find(dataset_uri) + training_features = OpenTox::Dataset.find(feature_dataset_uri) + unless prediction_feature # try to read prediction_feature from dataset + raise "#{training_activities.features.size} features in dataset #{dataset_uri}. Please provide a prediction_feature parameter." unless training_activities.features.size == 1 + prediction_feature = training_activities.features.keys.first + params[:prediction_feature] = prediction_feature + end + lazar = Lazar.new + training_features = OpenTox::Dataset.new(feature_dataset_uri) + case training_features.feature_type + when "classification" + lazar.similarity_algorithm = "weighted_tanimoto" + when "regression" + lazar.similarity_algorithm = "weighted_euclid" end - owl.rdf end - - protected - def initialize(owl) - MODEL_ATTRIBS.each do |a| - self.send("#{a.to_s}=".to_sym, owl.get(a.to_s)) unless a==:uri + + def self.create(dataset_uri,prediction_feature=nil,feature_generation_uri=File.join(CONFIG[:services]["opentox-algorithm"],"fminer/bbrc"),params=nil) + + training_activities = OpenTox::Dataset.find(dataset_uri) + + unless prediction_feature # try to read prediction_feature from dataset + raise "#{training_activities.features.size} features in dataset #{dataset_uri}. Please provide a prediction_feature parameter." unless training_activities.features.size == 1 + prediction_feature = training_activities.features.keys.first + params[:prediction_feature] = prediction_feature end - @uri = owl.uri - if ENV['RACK_ENV'] =~ /test|debug/ - begin - raise "uri invalid" unless Utils.is_uri?(@uri) - raise "no predicted variables" unless @predictedVariables and @predictedVariables.size>0 - rescue => ex - RestClientWrapper.raise_uri_error "invalid model: '"+ex.message+"'\n"+self.to_yaml+"\n",@uri.to_s + + lazar = Lazar.new + params[:feature_generation_uri] = feature_generation_uri + feature_dataset_uri = OpenTox::Algorithm::Generic.new(feature_generation_uri).run(params).to_s + training_features = OpenTox::Dataset.find(feature_dataset_uri) + raise "Dataset #{feature_dataset_uri} not found or empty." if training_features.nil? + + # sorted features for index lookups + lazar.features = training_features.features.sort if training_features.feature_type == "regression" + + training_features.data_entries.each do |compound,entry| + lazar.fingerprints[compound] = [] unless lazar.fingerprints[compound] + entry.keys.each do |feature| + case training_features.feature_type + when "fminer" + # fingerprints are sets + smarts = training_features.features[feature][OT.smarts] + lazar.fingerprints[compound] << smarts + unless lazar.features.include? smarts + lazar.features << smarts + lazar.p_values[smarts] = training_features.features[feature][OT.p_value] + lazar.effects[smarts] = training_features.features[feature][OT.effect] + end + when "classification" + # fingerprints are sets + if entry[feature].flatten.size == 1 + lazar.fingerprints[compound] << feature if entry[feature].flatten.first.match(TRUE_REGEXP) + lazar.features << feature unless lazar.features.include? feature + else + LOGGER.warn "More than one entry (#{entry[feature].inspect}) for compound #{compound}, feature #{feature}" + end + when "regression" + # fingerprints are arrays + if entry[feature].flatten.size == 1 + lazar.fingerprints[compound][lazar.features.index(feature)] = entry[feature].flatten.first + else + LOGGER.warn "More than one entry (#{entry[feature].inspect}) for compound #{compound}, feature #{feature}" + end + end + end + + lazar.activities[compound] = [] unless lazar.activities[compound] + training_activities.data_entries[compound][params[:prediction_feature]].each do |value| + case value.to_s + when "true" + lazar.activities[compound] << true + when "false" + lazar.activities[compound] << false + else + lazar.activities[compound] << value.to_f + lazar.prediction_type = "regression" + end end - LOGGER.warn "model has no dependent variable" unless @dependentVariables and @dependentVariables.size>0 - LOGGER.warn "model has no algorithm" unless @algorithm and @algorithm.size>0 - LOGGER.warn "model has no indenpendent variables" unless @independentVariables end + + if feature_generation_uri.match(/fminer/) + lazar.feature_calculation_algorithm = "substructure_match" + else + halt 404, "External feature generation services not yet supported" + end + + lazar.metadata[OT.dependentVariables] = params[:prediction_feature] + lazar.metadata[OT.trainingDataset] = dataset_uri + lazar.metadata[OT.featureDataset] = feature_dataset_uri + + lazar.parameters = { + "dataset_uri" => dataset_uri, + "prediction_feature" => prediction_feature, + "feature_generation_uri" => feature_generation_uri + } + + model_uri = lazar.save + LOGGER.info model_uri + " created #{Time.now}" + model_uri end - end - - class PredictionModel < Generic - - def self.build( algorithm_uri, algorithm_params ) - - LOGGER.debug "Build model, algorithm_uri:"+algorithm_uri.to_s+", algorithm_parms: "+algorithm_params.inspect.to_s - uri = OpenTox::RestClientWrapper.post(algorithm_uri,algorithm_params).to_s - LOGGER.debug "Build model done: "+uri.to_s - RestClientWrapper.raise_uri_error("Invalid build model result: '"+uri.to_s+"'", algorithm_uri, algorithm_params ) unless Utils.model_uri?(uri) - return PredictionModel.find(uri) - end - - def predict_dataset( dataset_uri ) - - LOGGER.debug "Predict dataset: "+dataset_uri.to_s+" with model "+@uri.to_s - uri = RestClientWrapper.post(@uri, {:accept => "text/uri-list", :dataset_uri=>dataset_uri}) - RestClientWrapper.raise_uri_error("Prediciton result no dataset uri: "+uri.to_s, @uri, {:dataset_uri=>dataset_uri} ) unless Utils.dataset_uri?(uri) - uri - end - - def classification? - #HACK replace with request to ontology server - if @title =~ /(?i)classification/ - return true - elsif @title =~ /(?i)regression/ - return false - elsif @uri =~/ntua/ and @title =~ /mlr/ - return false - elsif @uri =~/tu-muenchen/ and @title =~ /regression|M5P|GaussP/ - return false - elsif @uri =~/ambit2/ and @title =~ /pKa/ || @title =~ /Regression|Caco/ - return false - elsif @uri =~/majority/ - return (@uri =~ /class/) != nil + + def predict_dataset(dataset_uri) + @prediction_dataset = Dataset.create + @prediction_dataset.add_metadata({ + OT.hasSource => @lazar.uri, + DC.creator => @lazar.uri, + DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )) + }) + @prediction_dataset.add_parameters({"dataset_uri" => dataset_uri}) + Dataset.new(dataset_uri).load_compounds.each do |compound_uri| + predict(compound_uri,false) + end + @prediction_dataset.save + @prediction_dataset.uri + end + + def predict(compound_uri,verbose=false) + + @compound = Compound.new compound_uri + + unless @prediction_dataset + @prediction_dataset = Dataset.create + @prediction_dataset.add_metadata( { + OT.hasSource => @lazar.uri, + DC.creator => @lazar.uri, + DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )) + } ) + @prediction_dataset.add_parameters( {"compound_uri" => compound_uri} ) + end + + neighbors + eval @prediction_algorithm + + if @prediction + + feature_uri = File.join( @prediction_dataset.uri, "feature", @prediction_dataset.compounds.size) + @prediction_dataset.add @compound.uri, feature_uri, @prediction + + feature_metadata = @prediction_dataset.metadata + feature_metadata[DC.title] = File.basename(@metadata[OT.dependentVariables]) + feature_metadata[OT.prediction] = @prediction + feature_metadata[OT.confidence] = @confidence + @prediction_dataset.add_feature(feature_uri, feature_metadata) + + if verbose + if @compound_features + @compound_features.each do |feature| + @prediction_dataset.add @compound.uri, feature, true + end + end + n = 0 + @neighbors.sort{|a,b| a[:similarity] <=> b[:similarity]}.each do |neighbor| + neighbor_uri = File.join( @prediction_dataset.uri, "feature/neighbor", n ) + @prediction_dataset.add @compound.uri, neighbor_uri, true + @prediction_dataset.add_feature(neighbor, { + OT.compound => neighbor[:compound], + OT.similarity => neighbor[:similarity], + OT.activity => neighbor[:activity] + }) + n+=1 + end + end + end + @prediction_dataset.save + @prediction_dataset.uri + end + + def weighted_majority_vote + conf = 0.0 + @neighbors.each do |neighbor| + case neighbor[:activity].to_s + when 'true' + conf += OpenTox::Algorithm.gauss(neighbor[:similarity]) + when 'false' + conf -= OpenTox::Algorithm.gauss(neighbor[:similarity]) + end + end + if conf > 0.0 + @prediction = true + elsif conf < 0.0 + @prediction = false else - raise "unknown model, uri:'"+@uri.to_s+"' title:'"+@title.to_s+"'" + @prediction = nil end + @confidence = conf/@neighbors.size if @neighbors.size > 0 end - end - - class Lazar < Generic - - attr_accessor :feature_dataset_uri, :effects, :activities, :p_values, :fingerprints, :features - - def initialize - @source = "http://github.com/helma/opentox-model" - @algorithm = File.join(CONFIG[:services]["opentox-algorithm"],"lazar") - #@independent_variables = File.join(CONFIG[:services]["opentox-algorithm"],"fminer#BBRC_representative") - @features = [] - @effects = {} - @activities = {} - @p_values = {} - @fingerprints = {} + + def local_svm_regression + sims = @neighbors.collect{ |n| n[:similarity] } # similarity values between query and neighbors + conf = sims.inject{|sum,x| sum + x } + acts = @neighbors.collect do |n| + act = n[:activity] + # TODO: check this in model creation + raise "0 values not allowed in training dataset. log10 is calculated internally." if act.to_f == 0 + Math.log10(act.to_f) + end # activities of neighbors for supervised learning + + neighbor_matches = @neighbors.collect{ |n| n[:features] } # as in classification: URIs of matches + gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel + if neighbor_matches.size == 0 + raise "No neighbors found" + else + # gram matrix + (0..(neighbor_matches.length-1)).each do |i| + gram_matrix[i] = [] + # lower triangle + (0..(i-1)).each do |j| + sim = OpenTox::Algorithm.weighted_tanimoto(neighbor_matches[i], neighbor_matches[j], @lazar.p_values) + gram_matrix[i] << OpenTox::Algorithm.gauss(sim) + end + # diagonal element + gram_matrix[i][i] = 1.0 + # upper triangle + ((i+1)..(neighbor_matches.length-1)).each do |j| + sim = OpenTox::Algorithm.weighted_tanimoto(neighbor_matches[i], neighbor_matches[j], @lazar.p_values) # double calculation? + gram_matrix[i] << OpenTox::Algorithm.gauss(sim) + end + end + + @r = RinRuby.new(false,false) # global R instance leads to Socket errors after a large number of requests + @r.eval "library('kernlab')" # this requires R package "kernlab" to be installed + LOGGER.debug "Setting R data ..." + # set data + @r.gram_matrix = gram_matrix.flatten + @r.n = neighbor_matches.size + @r.y = acts + @r.sims = sims + + LOGGER.debug "Preparing R data ..." + # prepare data + @r.eval "y<-as.vector(y)" + @r.eval "gram_matrix<-as.kernelMatrix(matrix(gram_matrix,n,n))" + @r.eval "sims<-as.vector(sims)" + + # model + support vectors + LOGGER.debug "Creating SVM model ..." + @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-svr\", nu=0.8)" + @r.eval "sv<-as.vector(SVindex(model))" + @r.eval "sims<-sims[sv]" + @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" + LOGGER.debug "Predicting ..." + @r.eval "p<-predict(model,sims)[1,1]" + @prediction = 10**(@r.p.to_f) + LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + @r.quit # free R + end + @confidence = conf/@neighbors.size if @neighbors.size > 0 + end - def save - @features.uniq! - resource = RestClient::Resource.new(CONFIG[:services]["opentox-model"]) - resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s + def neighbors + + @compound_features = eval(@feature_calculation_algorithm) if @feature_calculation_algorithm + + @neighbors = {} + @activities.each do |training_compound,activities| + @training_compound = training_compound + sim = eval(@similarity_algorithm) + if sim > @min_sim + activities.each do |act| + @neighbors << { + :compound => @training_compound, + :similarity => sim, + :features => @fingerprints[@training_compound], + :activity => act + } + end + end + end + end - def self.find_all - RestClientWrapper.get(CONFIG[:services]["opentox-model"]).chomp.split("\n") + def tanimoto + OpenTox::Algorithm.tanimoto(@compound_features,@fingerprints[@training_compound]) end - def self.predict(compound_uri,model_uri) - #RestClientWrapper.post(model_uri,{:compound_uri => compound_uri, :accept => 'application/x-yaml'}) - `curl -X POST -d 'compound_uri=#{compound_uri}' -H 'Accept:application/x-yaml' #{model_uri}` + def weighted_tanimoto + OpenTox::Algorithm.tanimoto(@compound_features,@fingerprints[@training_compound],@p_values) end - end - - class PropertyLazar < Generic - - attr_accessor :feature_dataset_uri, :properties, :features, :activities#, :effects, :p_values - - def initialize - @source = "http://github.com/helma/opentox-model" - @algorithm = File.join(CONFIG[:services]["opentox-algorithm"],"property_lazar") - #@independent_variables = File.join(CONFIG[:services]["opentox-algorithm"],"fminer#BBRC_representative") - @features = [] - #@effects = {} - @activities = {} - #@p_values = {} - @properties = {} + + def euclid + OpenTox::Algorithm.tanimoto(@compound_features,@fingerprints[@training_compound]) + end + + def weighted_euclid + OpenTox::Algorithm.tanimoto(@compound_features,@fingerprints[@training_compound],@p_values) + end + + def substructure_match + @compound.match(@features) + end + + def database_search + #TODO add features method to dataset + Dataset.new(@metadata[OT.featureDataset]).features(@compound.uri) + end + + def database_activity(compound_uri) + prediction = OpenTox::Dataset.new + # find database activities + if @activities[compound_uri] + @activities[compound_uri].each { |act| prediction.add compound_uri, @metadata[OT.dependentVariables], act } + prediction.add_metadata(OT.hasSource => @metadata[OT.trainingDataset]) + prediction + else + nil + end end def save - @features.uniq! - resource = RestClient::Resource.new(CONFIG[:services]["opentox-model"]) - resource.post(self.to_yaml, :content_type => "application/x-yaml").chomp.to_s + RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) end - def self.find_all - RestClientWrapper.get(CONFIG[:services]["opentox-model"]).chomp.split("\n") + def self.all + RestClientWrapper.get(CONFIG[:services]["opentox-model"]).to_s.split("\n") end - def self.predict(compound_uri,model_uri) - #RestClientWrapper.post(model_uri,{:compound_uri => compound_uri, :accept => 'application/x-yaml'}) - `curl -X POST -d 'compound_uri=#{compound_uri}' -H 'Accept:application/x-yaml' #{model_uri}` + def delete + RestClientWrapper.delete @uri unless @uri == CONFIG[:services]["opentox-model"] end + end end end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 2749899..9dc1372 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','utils','feature', 'ot-logger', 'overwrite', 'rest_client_wrapper'].each do |lib| +['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'ot-logger', 'overwrite', 'rest_client_wrapper'].each do |lib| require lib end diff --git a/lib/opentox.rb b/lib/opentox.rb index 453ca66..7e1deec 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -1,79 +1,49 @@ module OpenTox - # Generic OpenTox class - module OtObject - - attr_reader :uri - attr_accessor :metadata - - # Initialize OpenTox object with optional uri - def initialize(uri=nil) - @metadata = {} - self.uri = uri if uri - end - - # Set URI - def uri=(uri) - @uri = uri - @metadata[XSD.anyUri] = uri - end - - # Get title - def title - load_metadata unless @metadata[DC.title] - @metadata[DC.title] - end - - # Set title - def title=(title) - @metadata[DC.title] = title - end - - # Get all objects from a service - def self.all(uri) - #def OtObject.all(uri) - RestClientWrapper.get(uri,:accept => "text/uri-list").to_s.split(/\n/) - end - - # Load metadata from URI - def load_metadata - #if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - # TODO: fix metadata retrie - #@metadata = YAML.load(RestClientWrapper.get(@uri, :accept => "application/x-yaml")) - #else - @metadata = Parser::Owl::Generic.new(@uri).metadata - #end - @metadata - #Parser::Owl::Generic.new(@uri).metadata - end - + attr_reader :uri + attr_accessor :metadata, :parameters + + # Initialize OpenTox object with optional uri + # @param [optional, String] URI + def initialize(uri=nil) + @metadata = {} + self.uri = uri if uri end - module Owl - - class Namespace - - def initialize(uri) - @uri = uri - end + # Set URI + # @param [String] URI + def uri=(uri) + @uri = uri + @metadata[XSD.anyURI] = uri + end - def [](property) - @uri+property.to_s - end + # Get all objects from a service + # @return [Array] List of available URIs + def self.all(uri) + RestClientWrapper.get(uri,:accept => "text/uri-list").to_s.split(/\n/) + end - def method_missing(property) - @uri+property.to_s - end + # Load (and return) metadata from object URI + # @return [Hash] Metadata + def load_metadata + @metadata = Parser::Owl::Generic.new(@uri).metadata + @metadata + end - end + # Load parameters from URI + #def load_parameters + #@parameters = Parser::Owl::Generic.new(@uri).parameters + #@parameters + #end + + # Get OWL-DL representation in RDF/XML format + # @return [application/rdf+xml] RDF/XML representation + def to_rdfxml + s = Serializer::Owl.new + s.add_metadata(@uri,@metadata) + #s.add_parameters(@uri,@parameters) if @parameters + s.to_rdfxml end end -# -# OWL Namespaces -RDF = OpenTox::Owl::Namespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' -OWL = OpenTox::Owl::Namespace.new 'http://www.w3.org/2002/07/owl#' -DC = OpenTox::Owl::Namespace.new 'http://purl.org/dc/elements/1.1/' -OT = OpenTox::Owl::Namespace.new 'http://www.opentox.org/api/1.1#' -XSD = OpenTox::Owl::Namespace.new 'http://www.w3.org/2001/XMLSchema#' diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 1d0161b..2e4c396 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -12,3 +12,25 @@ class Sinatra::Base end end +class String + def task_uri? + self.uri? && !self.match(/task/).nil? + end + + def dataset_uri? + self.uri? && !self.match(/dataset/).nil? + end + + def self.model_uri? + self.uri? && !self.match(/model/).nil? + end + + def uri? + begin + u = URI::parse(self) + return (u.scheme!=nil and u.host!=nil) + rescue URI::InvalidURIError + return false + end + end +end diff --git a/lib/parser.rb b/lib/parser.rb index e623bf5..8c173f9 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -1,5 +1,14 @@ require 'spreadsheet' require 'roo' + +class String + + def to_triple + self.chomp.split(' ',3).collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} + end + +end + module OpenTox module Parser @@ -12,19 +21,28 @@ module OpenTox end def metadata - # TODO: load parameters + if @dataset uri = File.join(@uri,"metadata") else uri = @uri end + statements = [] - `rapper -i rdfxml -o ntriples #{uri}`.each_line do |line| - triple = line.chomp.split('> ') - statements << triple.collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} - end - statements.each do |triple| + parameter_ids = [] + `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| + triple = line.to_triple @metadata[triple[1]] = triple[2].split('^^').first if triple[0] == @uri and triple[1] != RDF['type'] + statements << triple + parameter_ids << triple[2] if triple[1] == OT.parameters + end + unless parameter_ids.empty? + @metadata[OT.parameters] = [] + parameter_ids.each do |p| + parameter = {} + statements.each{ |t| parameter[t[1]] = t[2] if t[0] == p and t[1] != RDF['type']} + @metadata[OT.parameters] << parameter + end end @metadata end @@ -37,6 +55,8 @@ module OpenTox include Owl + attr_writer :uri + def initialize(uri) super uri @dataset = ::OpenTox::Dataset.new(@uri) @@ -47,11 +67,10 @@ module OpenTox feature_values = {} feature = {} other_statements = {} - ntriples = `rapper -i rdfxml -o ntriples #{@uri}` - ntriples.each_line do |line| + `rapper -i rdfxml -o ntriples #{@uri} 2>/dev/null`.each_line do |line| triple = line.chomp.split(' ',3) triple = triple[0..2].collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} - case triple[1] # Ambit namespaces are case insensitive + case triple[1] when /#{OT.values}/i data[triple[0]] = {:compound => "", :values => []} unless data[triple[0]] data[triple[0]][:values] << triple[2] @@ -77,76 +96,84 @@ module OpenTox end def load_features - @dataset.features.keys.each do |feature| - @dataset.features[feature] = Parser::Owl::Generic.new(feature).metadata + uri = File.join(@uri,"features") + statements = [] + features = Set.new + `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| + triple = line.chomp.split('> ').collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')}[0..2] + statements << triple + features << triple[0] if triple[1] == RDF['type'] and triple[2] == OT.Feature + end + statements.each do |triple| + if features.include? triple[0] + @dataset.features[triple[0]] = {} unless @dataset.features[triple[0]] + @dataset.features[triple[0]][triple[1]] = triple[2].split('^^').first + end end + @dataset.features end + end end - class Spreadsheet + class Spreadsheets + # TODO: expand for multiple columns + + attr_accessor :dataset + def initialize + + # TODO: fix 2 datasets created + #@dataset = Dataset.create + #@dataset.save # get uri + + @data = [] + @features = [] + @feature_types = {} - def initialize(dataset) - @dataset = dataset @format_errors = "" @smiles_errors = [] @activity_errors = [] @duplicates = {} - @nr_compounds = 0 - @data = [] - @activities = [] - @type = "classification" end def load_excel(book) book.default_sheet = 0 - 1.upto(book.last_row) do |row| - if row == 1 - @feature = File.join(@dataset.uri,"feature",book.cell(row,2)) - else - add( book.cell(row,1), book.cell(row,2), row ) # smiles, activity - end - end - parse + add_features book.row(1) + 2.upto(book.last_row) { |i| add_values book.row(i) } + warnings + @dataset end def load_csv(csv) row = 0 - csv.each_line do |line| - row += 1 - raise "Invalid CSV format at line #{row}: #{line.chomp}" unless line.chomp.match(/^.+[,;].*$/) # check CSV format - items = line.chomp.gsub(/["']/,'').split(/\s*[,;]\s*/) # remove quotes - if row == 1 - @feature = File.join(@dataset.uri,"feature",items[1]) - else - add(items[0], items[1], row) - end - end - parse + input = csv.split("\n") + add_features split_row(input.shift) + input.each { |row| add_values split_row(row) } + warnings + @dataset end - def parse + private - # create dataset - @data.each do |items| - case @type - when "classification" - case items[1].to_s - when TRUE_REGEXP - @dataset.add(items[0], @feature, true ) - when FALSE_REGEXP - @dataset.add(items[0], @feature, false) - end - when "regression" - if items[1].to_f == 0 - @activity_errors << "Row #{items[2]}: Zero values not allowed for regression datasets - entry ignored." - else - @dataset.add items[0], @feature, items[1].to_f - end + def warnings + + info = '' + @feature_types.each do |feature,types| + if types.uniq.size > 1 + type = OT.NumericFeature + else + type = types.first end + @dataset.add_feature_metadata(feature,{OT.isA => type}) + info += "\"#{@dataset.feature_name(feature)}\" detected as #{type.split('#').last}." + + # TODO: rewrite feature values + # TODO if value.to_f == 0 @activity_errors << "#{smiles} Zero values not allowed for regression datasets - entry ignored." end + @dataset.metadata[OT.Info] = info + warnings = '' warnings += "

Incorrect Smiles structures (ignored):

" + @smiles_errors.join("
") unless @smiles_errors.empty? warnings += "

Irregular activities (ignored):

" + @activity_errors.join("
") unless @activity_errors.empty? @@ -156,34 +183,75 @@ module OpenTox @dataset.metadata[OT.Warnings] = warnings - @dataset + end + def add_features(row) + row.shift # get rid of smiles entry + row.each do |feature_name| + feature_uri = File.join(@dataset.uri,"feature",URI.encode(feature_name)) + @feature_types[feature_uri] = [] + @features << feature_uri + @dataset.add_feature(feature_uri,{DC.title => feature_name}) + end end - def add(smiles, act, row) + def add_values(row) + + smiles = row.shift compound = Compound.from_smiles(smiles) if compound.nil? or compound.inchi.nil? or compound.inchi == "" - @smiles_errors << "Row #{row}: " + [smiles,act].join(", ") - return false - end - unless numeric?(act) or classification?(act) - @activity_errors << "Row #{row}: " + [smiles,act].join(", ") + @smiles_errors << smiles+", "+row.join(", ") return false end @duplicates[compound.inchi] = [] unless @duplicates[compound.inchi] - @duplicates[compound.inchi] << "Row #{row}: " + [smiles, act].join(", ") - @type = "regression" unless classification?(act) - # TODO: set OT.NumericalFeature, ... - @nr_compounds += 1 - @data << [ compound.uri, act , row ] + @duplicates[compound.inchi] << smiles+", "+row.join(", ") + + row.each_index do |i| + value = row[i] + feature = @features[i] + type = feature_type(value) + + @feature_types[feature] << type + + case type + when OT.NominalFeature + case value.to_s + when TRUE_REGEXP + @dataset.add(compound.uri, feature, true ) + when FALSE_REGEXP + @dataset.add(compound.uri, feature, false ) + end + when OT.NumericFeature + @dataset.add compound.uri, feature, value.to_f + when OT.StringFeature + # TODO: insert ?? + @dataset.add compound.uri, feature, value.to_s + @activity_errors << smiles+", "+row.join(", ") + #return false + end + end + end + + def numeric?(value) + true if Float(value) rescue false end - def numeric?(object) - true if Float(object) rescue false + def classification?(value) + !value.to_s.strip.match(TRUE_REGEXP).nil? or !value.to_s.strip.match(FALSE_REGEXP).nil? + end + + def feature_type(value) + if classification? value + return OT.NominalFeature + elsif numeric? value + return OT.NumericFeature + else + return OT.StringFeature + end end - def classification?(object) - !object.to_s.strip.match(TRUE_REGEXP).nil? or !object.to_s.strip.match(FALSE_REGEXP).nil? + def split_row(row) + row.chomp.gsub(/["']/,'').split(/\s*[,;]\s*/) # remove quotes end end diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 82836d9..49549b5 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -1,5 +1,3 @@ - - module OpenTox #PENDING: implement ot error api, move to own file @@ -60,7 +58,7 @@ module OpenTox def self.execute( rest_call, uri, headers, payload=nil, wait=true ) do_halt 400,"uri is null",uri,headers,payload unless uri - do_halt 400,"not a uri",uri,headers,payload unless Utils.is_uri?(uri) + do_halt 400,"not a uri",uri,headers,payload unless uri.to_s.uri? do_halt 400,"headers are no hash",uri,headers,payload unless headers==nil or headers.is_a?(Hash) do_halt 400,"nil headers for post not allowed, use {}",uri,headers,payload if rest_call=="post" and headers==nil headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems @@ -115,7 +113,7 @@ module OpenTox when /text\// raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task - task = OpenTox::Task.find(res.to_s) if Utils.task_uri?(res) + task = OpenTox::Task.find(res.to_s) if res.to_s.uri? else raise "unknown content-type for task: '"+res.content_type.to_s+"'" #+"' content: "+res[0..200].to_s end diff --git a/lib/serializer.rb b/lib/serializer.rb index 3def252..3a9cb60 100644 --- a/lib/serializer.rb +++ b/lib/serializer.rb @@ -30,7 +30,6 @@ module OpenTox OT.dataEntry => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.acceptValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.values => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - #XSD.anyUri => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.algorithm => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.parameters => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , @@ -38,14 +37,15 @@ module OpenTox DC.identifier => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , DC.contributor => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , DC.creator => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + DC.description => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.isA => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.Warnings => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + XSD.anyURI => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.hasSource => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , OT.value => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , OT.paramScope => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , OT.paramValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , - - #Untyped Individual: http://localhost/algorithm } @data_entries = {} @@ -61,15 +61,10 @@ module OpenTox end def add_compound(uri) - #@classes << OT.Compound unless @classes.include? OT.Compound @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Compound }] } end def add_feature(uri,metadata) - #@classes << OT.Feature unless @classes.include? OT.Feature - #@classes << OT.NominalFeature unless @classes.include? OT.NominalFeature - #@classes << OT.NumericFeature unless @classes.include? OT.NumericFeature - #@classes << OT.StringFeature unless @classes.include? OT.StringFeature @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Feature }] } add_metadata uri, metadata end @@ -94,32 +89,37 @@ module OpenTox end - def add_algorithm(uri,metadata,parameters) + def add_algorithm(uri,metadata) @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } + LOGGER.debug @object[uri] add_metadata uri, metadata - add_parameters uri, parameters - #metadata.each { |u,v| @object[uri][u] = [{"type" => type(v), "value" => v }] } + LOGGER.debug @object[uri] end - def add_model(uri,metadata) + def add_model(uri,metadata,parameters) + @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Model }] } + add_metadata uri, metadata + add_parameters uri, parameters end def add_metadata(uri,metadata) - #@object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT[type] }] } + id = 0 metadata.each do |u,v| - @object[uri][u] = [{"type" => type(v), "value" => v }] - end - end - - def add_parameters(uri,parameters) - #@object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT[type] }] } - @object[uri][OT.parameters] = [] unless @object[uri][OT.parameters] - parameters.each do |p| - parameter = "_:parameter#{@parameter_id}" - @parameter_id += 1 - @object[uri][OT.parameters] << {"type" => "bnode", "value" => parameter} - @object[parameter] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Parameter }] } - add_metadata parameter, p + if v.is_a? String + @object[uri] = {} unless @object[uri] + @object[uri][u] = [{"type" => type(v), "value" => v }] + elsif v.is_a? Array and u == OT.parameters + @object[uri][u] = [] unless @object[uri][u] + v.each do |value| + id+=1 + genid = "_:genid#{id}" + @object[uri][u] << {"type" => "bnode", "value" => genid} + @object[genid] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Parameter}] } + value.each do |name,entry| + @object[genid][name] = [{"type" => type(entry), "value" => entry }] + end + end + end end end @@ -158,10 +158,11 @@ module OpenTox # Serializers - def ntriples + def to_ntriples #rdf_types @triples = Set.new + #LOGGER.debug @object.to_yaml @object.each do |s,entry| s = url(s) if type(s) == "uri" entry.each do |p,objects| @@ -182,12 +183,12 @@ module OpenTox @triples.sort.collect{ |s| s.join(' ').concat(" .") }.join("\n")+"\n" end - def rdfxml - Tempfile.open("owl-serializer"){|f| f.write(ntriples); @path = f.path} - `rapper -i ntriples -o rdfxml #{@path}` + def to_rdfxml + Tempfile.open("owl-serializer"){|f| f.write(self.to_ntriples); @path = f.path} + `rapper -i ntriples -o rdfxml #{@path} 2>/dev/null` end - def json + def to_json #rdf_types Yajl::Encoder.encode(@object) end @@ -258,7 +259,7 @@ module OpenTox @rows.first << features @rows.first.flatten! dataset.data_entries.each do |compound,entries| - smiles = Compound.new(compound).smiles + smiles = Compound.new(compound).to_smiles row = Array.new(@rows.first.size) row[0] = smiles entries.each do |feature, values| @@ -271,11 +272,11 @@ module OpenTox end end - def csv + def to_csv @rows.collect{|r| r.join(", ")}.join("\n") end - def excel + def to_xls Spreadsheet.client_encoding = 'UTF-8' book = Spreadsheet::Workbook.new sheet = book.create_worksheet(:name => '') diff --git a/lib/task.rb b/lib/task.rb index 50f0347..96ee719 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -3,6 +3,7 @@ $self_task=nil module OpenTox class Task + attr_accessor :uri, :date, :title, :creator, :description, :hasStatus, :percentageCompleted, :resultURI, :due_to_time, :http_code # due_to_time is only set in local tasks TASK_ATTRIBS = [ :uri, :date, :title, :creator, :description, :hasStatus, :percentageCompleted, :resultURI, :due_to_time ] @@ -124,14 +125,14 @@ module OpenTox def check_state begin raise "illegal task state, task is completed, resultURI is no URI: '"+@resultURI.to_s+ - "'" unless @resultURI and Utils.is_uri?(@resultURI) if completed? + "'" unless @resultURI and @resultURI.to_s.uri? if completed? if @http_code == 202 raise "illegal task state, code is 202, but hasStatus is not Running: '"+@hasStatus+"'" unless running? elsif @http_code == 201 raise "illegal task state, code is 201, but hasStatus is not Completed: '"+@hasStatus+"'" unless completed? raise "illegal task state, code is 201, resultURI is no task-URI: '"+@resultURI.to_s+ - "'" unless @resultURI and Utils.task_uri?(@resultURI) + "'" unless @resultURI and @resultURI.to_s.uri? end rescue => ex RestClientWrapper.raise_uri_error(ex.message, @uri) @@ -171,6 +172,7 @@ module OpenTox LOGGER.debug "Started task: "+task.uri.to_s task.uri end + end end diff --git a/lib/utils.rb b/lib/utils.rb deleted file mode 100644 index a0e0cbe..0000000 --- a/lib/utils.rb +++ /dev/null @@ -1,50 +0,0 @@ -module OpenTox - module Utils - # gauss kernel - def self.gauss(sim, sigma = 0.3) - x = 1.0 - sim - Math.exp(-(x*x)/(2*sigma*sigma)) - end - - def self.task_uri?(uri) - is_uri?(uri) && uri.to_s =~ /task/ - end - - def self.dataset_uri?(uri) - is_uri?(uri) && uri.to_s =~ /dataset/ - end - - def self.model_uri?(uri) - is_uri?(uri) && uri.to_s =~ /model/ - end - - - def self.is_uri?(uri) - return false if uri==nil || uri.to_s.size==0 - begin - u = URI::parse(uri) - return (u.scheme!=nil and u.host!=nil) - rescue URI::InvalidURIError - return false - end - end - - def self.median(array) - return nil if array.empty? - array.sort! - m_pos = array.size / 2 - return array.size % 2 == 1 ? array[m_pos] : (array[m_pos-1] + array[m_pos])/2 - end - - end - -# ['rubygems', 'rest_client'].each do |r| -# require r -# end -# ["bla", "google.de", "http://google.de"].each do |u| -# puts u+"? "+Utils.is_uri?(u).to_s -# end - - -end - -- cgit v1.2.3 From 91c95f8dc8f60a8f0029b970ef881eecee28401b Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 11 Nov 2010 10:42:48 +0100 Subject: Documentation and API fixes for serializer and parser --- lib/dataset.rb | 10 +++++----- lib/opentox.rb | 2 +- lib/parser.rb | 45 +++++++++++++++++++++++++++++++++++++-------- lib/serializer.rb | 37 +++++++++++++++++++++++++++++++++---- 4 files changed, 76 insertions(+), 18 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 05b2ed3..6e270e9 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -77,7 +77,7 @@ module OpenTox parser.load_csv(csv) end - # Load Spreadsheet book (created with roo gem http://roo.rubyforge.org/, excel format specification: http://toxcreate.org/help)) + # Load Spreadsheet book (created with roo gem http://roo.rubyforge.org/, excel format specification: http://toxcreate.org/help) # - loads data_entries, compounds, features # - sets metadata (warnings) for parser errors # - you will have to set remaining metadata manually @@ -87,13 +87,13 @@ module OpenTox save unless @uri # get a uri for creating features parser = Parser::Spreadsheets.new parser.dataset = self - parser.load_excel(book) + parser.load_spreadsheet(book) end # Load and return only metadata of a Dataset object # @return [Hash] Metadata of the dataset def load_metadata - add_metadata Parser::Owl::Dataset.new(@uri).metadata + add_metadata Parser::Owl::Dataset.new(@uri).load_metadata self.uri = @uri if @uri # keep uri @metadata end @@ -147,8 +147,8 @@ module OpenTox # Get Excel representation # @return [Spreadsheet::Workbook] Workbook which can be written with the spreadsheet gem (data_entries only, metadata will will be discarded)) - def to_xls - Serializer::Spreadsheets.new(self).to_xls + def to_spreadsheet + Serializer::Spreadsheets.new(self).to_spreadsheet end # Get CSV string representation (data_entries only, metadata will be discarded) diff --git a/lib/opentox.rb b/lib/opentox.rb index 7e1deec..3b7fa65 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -26,7 +26,7 @@ module OpenTox # Load (and return) metadata from object URI # @return [Hash] Metadata def load_metadata - @metadata = Parser::Owl::Generic.new(@uri).metadata + @metadata = Parser::Owl::Generic.new(@uri).load_metadata @metadata end diff --git a/lib/parser.rb b/lib/parser.rb index 8c173f9..4d8e729 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -3,6 +3,8 @@ require 'roo' class String + # Split RDF statement into triples + # @return [Array] Array with [subject,predicate,object] def to_triple self.chomp.split(' ',3).collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} end @@ -11,16 +13,23 @@ end module OpenTox + # Parser for various input formats module Parser + # OWL-DL parser module Owl + # Create a new OWL-DL parser + # @param uri URI of OpenTox object + # @return [OpenTox::Parser::Owl] OWL-DL parser def initialize(uri) @uri = uri @metadata = {} end - def metadata + # Read metadata from opentox service + # @return [Hash] Object metadata + def load_metadata if @dataset uri = File.join(@uri,"metadata") @@ -47,21 +56,37 @@ module OpenTox @metadata end + # Generic parser for all OpenTox classes class Generic include Owl end + # OWL-DL parser for datasets class Dataset include Owl attr_writer :uri + # Create a new OWL-DL dataset parser + # @param uri Dataset URI + # @return [OpenTox::Parser::Owl::Dataset] OWL-DL parser def initialize(uri) super uri @dataset = ::OpenTox::Dataset.new(@uri) end + # Read data from dataset service. Files can be parsed by setting #uri to a filename (after initialization with a real URI) + # @example Read data from an external service + # parser = OpenTox::Parser::Owl::Dataaset.new "http://wwbservices.in-silico.ch/dataset/1" + # dataset = parser.load_uri + # @example Create dataset from RDF/XML file + # dataset = OpenTox::Dataset.create + # parser = OpenTox::Parser::Owl::Dataaset.new dataset.uri + # parser.uri = "dataset.rdfxml" # insert your input file + # dataset = parser.load_uri + # dataset.save + # @return [Hash] Internal dataset representation def load_uri data = {} feature_values = {} @@ -95,6 +120,8 @@ module OpenTox @dataset end + # Read only features from a dataset service. + # @return [Hash] Internal features representation def load_features uri = File.join(@uri,"features") statements = [] @@ -117,16 +144,12 @@ module OpenTox end + # Parser for getting spreadsheet data into a dataset class Spreadsheets - # TODO: expand for multiple columns attr_accessor :dataset - def initialize - - # TODO: fix 2 datasets created - #@dataset = Dataset.create - #@dataset.save # get uri + def initialize @data = [] @features = [] @feature_types = {} @@ -137,7 +160,10 @@ module OpenTox @duplicates = {} end - def load_excel(book) + # Load Spreadsheet book (created with roo gem http://roo.rubyforge.org/, excel format specification: http://toxcreate.org/help) + # @param [Excel] book Excel workbook object (created with roo gem) + # @return [OpenTox::Dataset] Dataset object with Excel data + def load_spreadsheet(book) book.default_sheet = 0 add_features book.row(1) 2.upto(book.last_row) { |i| add_values book.row(i) } @@ -145,6 +171,9 @@ module OpenTox @dataset end + # Load CSV string (format specification: http://toxcreate.org/help) + # @param [String] csv CSV representation of the dataset + # @return [OpenTox::Dataset] Dataset object with CSV data def load_csv(csv) row = 0 input = csv.split("\n") diff --git a/lib/serializer.rb b/lib/serializer.rb index 3a9cb60..31aa0d1 100644 --- a/lib/serializer.rb +++ b/lib/serializer.rb @@ -3,9 +3,10 @@ require 'yajl' module OpenTox + # Serialzer for various oputput formats module Serializer - # modelled according to to http://n2.talis.com/wiki/RDF_JSON_Specification + # OWL-DL Serializer, modelled according to to http://n2.talis.com/wiki/RDF_JSON_Specification class Owl attr_accessor :object @@ -60,15 +61,21 @@ module OpenTox @objects = Set.new end + # Add a compound + # @param [String] uri Compound URI def add_compound(uri) @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Compound }] } end + # Add a feature + # @param [String] uri Feature URI def add_feature(uri,metadata) @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Feature }] } add_metadata uri, metadata end + # Add a dataset + # @param [String] uri Dataset URI def add_dataset(dataset) @dataset = dataset.uri @@ -89,6 +96,8 @@ module OpenTox end + # Add a algorithm + # @param [String] uri Algorithm URI def add_algorithm(uri,metadata) @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } LOGGER.debug @object[uri] @@ -96,12 +105,16 @@ module OpenTox LOGGER.debug @object[uri] end + # Add a model + # @param [String] uri Model URI def add_model(uri,metadata,parameters) @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Model }] } add_metadata uri, metadata add_parameters uri, parameters end + # Add metadata + # @param [Hash] metadata def add_metadata(uri,metadata) id = 0 metadata.each do |u,v| @@ -123,6 +136,10 @@ module OpenTox end end + # Add a data entry + # @param [String] compound Compound URI + # @param [String] feature Feature URI + # @param [Boolead,Float] value Feature value def add_data_entry(compound,feature,value) add_compound(compound) unless @object[compound] add_feature(feature,{}) unless @object[feature] @@ -158,11 +175,11 @@ module OpenTox # Serializers + # Convert to N-Triples + # @return [text/plain] Object OWL-DL in N-Triples format def to_ntriples - #rdf_types @triples = Set.new - #LOGGER.debug @object.to_yaml @object.each do |s,entry| s = url(s) if type(s) == "uri" entry.each do |p,objects| @@ -183,11 +200,16 @@ module OpenTox @triples.sort.collect{ |s| s.join(' ').concat(" .") }.join("\n")+"\n" end + # Convert to RDF/XML + # @return [text/plain] Object OWL-DL in RDF/XML format def to_rdfxml Tempfile.open("owl-serializer"){|f| f.write(self.to_ntriples); @path = f.path} `rapper -i ntriples -o rdfxml #{@path} 2>/dev/null` end + # Convert to JSON as specified in http://n2.talis.com/wiki/RDF_JSON_Specification + # (Ambit services use a different JSON representation) + # @return [text/plain] Object OWL-DL in JSON format def to_json #rdf_types Yajl::Encoder.encode(@object) @@ -250,8 +272,11 @@ module OpenTox end + # Serializer for spreadsheet formats class Spreadsheets # to avoid nameclash with Spreadsheet gem + # Create a new spreadsheet serializer + # @param [OpenTox::Dataset] dataset Dataset object def initialize(dataset) @rows = [] @rows << ["SMILES"] @@ -272,11 +297,15 @@ module OpenTox end end + # Convert to CSV string + # @return [String] CSV string def to_csv @rows.collect{|r| r.join(", ")}.join("\n") end - def to_xls + # Convert to spreadsheet workbook + # @return [Spreadsheet::Workbook] Workbook object (use the spreadsheet gemc to write a file) + def to_spreadsheet Spreadsheet.client_encoding = 'UTF-8' book = Spreadsheet::Workbook.new sheet = book.create_worksheet(:name => '') -- cgit v1.2.3 From f8552611c2dbe25d76474f51e4e895bf9c2b5c5e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 19 Nov 2010 16:53:21 +0100 Subject: lazar predictions for toxcreate working --- Rakefile | 3 - lib/algorithm.rb | 154 +++++++++++-- lib/dataset.rb | 72 ++++++- lib/environment.rb | 8 +- lib/feature.rb | 10 + lib/model.rb | 466 ++++++++++++++++------------------------ lib/opentox-ruby-api-wrapper.rb | 4 +- lib/opentox.rb | 10 +- lib/ot-logger.rb | 48 ----- lib/overwrite.rb | 50 +++++ lib/parser.rb | 4 +- lib/rest_client_wrapper.rb | 16 +- lib/serializer.rb | 23 +- lib/task.rb | 278 +++++++++++++++--------- lib/validation.rb | 64 +++++- 15 files changed, 720 insertions(+), 490 deletions(-) delete mode 100644 lib/ot-logger.rb diff --git a/Rakefile b/Rakefile index 18f24bd..6838e75 100644 --- a/Rakefile +++ b/Rakefile @@ -21,14 +21,11 @@ begin "rack-flash", "nokogiri", "rubyzip", - #"builder", "roo", "spreadsheet", "google-spreadsheet-ruby", "tmail", "rinruby", - #"rdf", - #"rdf-raptor", "rjb" ].each { |dep| gem.add_dependency dep } [ "dm-core", diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 711f63b..a6fa4a7 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -1,3 +1,9 @@ +# R integration +# workaround to initialize R non-interactively (former rinruby versions did this by default) +# avoids compiling R with X +R = nil +require "rinruby" + module OpenTox # Wrapper for OpenTox Algorithms @@ -6,8 +12,10 @@ module OpenTox include OpenTox # Execute algorithm with parameters, please consult the OpenTox API and the webservice documentation for acceptable parameters + # @param [optional,Hash] params Algorithm parameters + # @return [String] URI of new resource (dataset, model, ...) def run(params=nil) - RestClientWrapper.post(@uri, params) + RestClientWrapper.post(@uri, params).to_s end # Get OWL-DL representation in RDF/XML format @@ -23,9 +31,11 @@ module OpenTox include Algorithm end + # Fminer algorithms (https://github.com/amaunz/fminer2) module Fminer include Algorithm + # Backbone Refinement Class mining (http://bbrc.maunz.de/) class BBRC include Fminer # Initialize bbrc algorithm @@ -35,6 +45,7 @@ module OpenTox end end + # LAtent STructure Pattern Mining (http://last-pm.maunz.de) class LAST include Fminer # Initialize last algorithm @@ -58,15 +69,15 @@ module OpenTox # Utility methods without dedicated webservices + # Similarity calculations module Similarity include Algorithm # Tanimoto similarity - # # @param [Array] features_a Features of first compound # @param [Array] features_b Features of second compound # @param [optional, Hash] weights Weights for all features - # @return [Float] (Wighted) tanimoto similarity + # @return [Float] (Weighted) tanimoto similarity def self.tanimoto(features_a,features_b,weights=nil) common_features = features_a & features_b all_features = (features_a + features_b).uniq @@ -86,15 +97,19 @@ module OpenTox end # Euclidean similarity - def self.euclidean(prop_a,prop_b,weights=nil) - common_properties = prop_a.keys & prop_b.keys + # @param [Hash] properties_a Properties of first compound + # @param [Hash] properties_b Properties of second compound + # @param [optional, Hash] weights Weights for all properties + # @return [Float] (Weighted) euclidean similarity + def self.euclidean(properties_a,properties_b,weights=nil) + common_properties = properties_a.keys & properties_b.keys if common_properties.size > 1 dist_sum = 0 common_properties.each do |p| if weights - dist_sum += ( (prop_a[p] - prop_b[p]) * Algorithm.gauss(weights[p]) )**2 + dist_sum += ( (properties_a[p] - properties_b[p]) * Algorithm.gauss(weights[p]) )**2 else - dist_sum += (prop_a[p] - prop_b[p])**2 + dist_sum += (properties_a[p] - properties_b[p])**2 end end 1/(1+Math.sqrt(dist_sum)) @@ -103,14 +118,129 @@ module OpenTox end end end + + module Neighbors + + # Classification with majority vote from neighbors weighted by similarity + # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity` + # @param [optional] params Ignored (only for compatibility with local_svm_regression) + # @return [Hash] Hash with keys `:prediction, :confidence` + def self.weighted_majority_vote(neighbors,params={}) + conf = 0.0 + confidence = 0.0 + neighbors.each do |neighbor| + case neighbor[:activity].to_s + when 'true' + conf += Algorithm.gauss(neighbor[:similarity]) + when 'false' + conf -= Algorithm.gauss(neighbor[:similarity]) + end + end + if conf > 0.0 + prediction = true + elsif conf < 0.0 + prediction = false + else + prediction = nil + end + confidence = conf/neighbors.size if neighbors.size > 0 + {:prediction => prediction, :confidence => confidence.abs} + end + + # Local support vector regression from neighbors + # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` + # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required + # @return [Hash] Hash with keys `:prediction, :confidence` + def self.local_svm_regression(neighbors,params ) + sims = neighbors.collect{ |n| n[:similarity] } # similarity values between query and neighbors + conf = sims.inject{|sum,x| sum + x } + acts = neighbors.collect do |n| + act = n[:activity] + Math.log10(act.to_f) + end # activities of neighbors for supervised learning + + neighbor_matches = neighbors.collect{ |n| n[:features] } # as in classification: URIs of matches + gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel + if neighbor_matches.size == 0 + raise "No neighbors found" + else + # gram matrix + (0..(neighbor_matches.length-1)).each do |i| + gram_matrix[i] = [] unless gram_matrix[i] + # upper triangle + ((i+1)..(neighbor_matches.length-1)).each do |j| + sim = eval("#{params[:similarity_algorithm]}(neighbor_matches[i], neighbor_matches[j], params[:p_values])") + gram_matrix[i][j] = Algorithm.gauss(sim) + gram_matrix[j] = [] unless gram_matrix[j] + gram_matrix[j][i] = gram_matrix[i][j] # lower triangle + end + gram_matrix[i][i] = 1.0 + end + + LOGGER.debug gram_matrix.to_yaml + + @r = RinRuby.new(false,false) # global R instance leads to Socket errors after a large number of requests + @r.eval "library('kernlab')" # this requires R package "kernlab" to be installed + LOGGER.debug "Setting R data ..." + # set data + @r.gram_matrix = gram_matrix.flatten + @r.n = neighbor_matches.size + @r.y = acts + @r.sims = sims + + LOGGER.debug "Preparing R data ..." + # prepare data + @r.eval "y<-as.vector(y)" + @r.eval "gram_matrix<-as.kernelMatrix(matrix(gram_matrix,n,n))" + @r.eval "sims<-as.vector(sims)" + + # model + support vectors + LOGGER.debug "Creating SVM model ..." + @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-svr\", nu=0.8)" + @r.eval "sv<-as.vector(SVindex(model))" + @r.eval "sims<-sims[sv]" + @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" + LOGGER.debug "Predicting ..." + @r.eval "p<-predict(model,sims)[1,1]" + prediction = 10**(@r.p.to_f) + LOGGER.debug "Prediction is: '" + @prediction.to_s + "'." + @r.quit # free R + end + confidence = conf/neighbors.size if neighbors.size > 0 + {:prediction => prediction, :confidence => confidence} + + end + + end + + module Substructure + include Algorithm + # Substructure matching + # @param [OpenTox::Compound] compound Compound + # @param [Array] features Array with Smarts strings + # @return [Array] Array with matching Smarts + def self.match(compound,features) + compound.match(features) + end + end + + module Dataset + include Algorithm + # API should match Substructure.match + def features(dataset_uri,compound_uri) + end + end - # Gauss kernel - def self.gauss(sim, sigma = 0.3) - x = 1.0 - sim - Math.exp(-(x*x)/(2*sigma*sigma)) - end + # Gauss kernel + # @return [Float] + def self.gauss(x, sigma = 0.3) + d = 1.0 - x + Math.exp(-(d*d)/(2*sigma*sigma)) + end # Median of an array + # @param [Array] Array with values + # @return [Float] Median def self.median(array) return nil if array.empty? array.sort! diff --git a/lib/dataset.rb b/lib/dataset.rb index 6e270e9..4737ea1 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -43,7 +43,7 @@ module OpenTox # Get all datasets from a service # @param [optional,String] uri URI of the dataset service, defaults to service specified in configuration - # @return [Array] Array of dataset object with all data + # @return [Array] Array of dataset object without data (use one of the load_* methods to pull data from the server) def self.all(uri=CONFIG[:services]["opentox-dataset"]) RestClientWrapper.get(uri,:accept => "text/uri-list").to_s.each_line.collect{|u| Dataset.new(u)} end @@ -55,6 +55,10 @@ module OpenTox copy YAML.load(yaml) end + def load_rdfxml(rdfxml) + load_rdfxml_file Tempfile.open("ot-rdfxml"){|f| f.write(rdfxml)}.path + end + # Load RDF/XML representation from a file # @param [String] file File with RDF/XML representation of the dataset # @return [OpenTox::Dataset] Dataset object with RDF/XML data @@ -129,8 +133,6 @@ module OpenTox # @return [String] `classification", "regression", "mixed" or unknown` def feature_type feature_types = @features.collect{|f,metadata| metadata[OT.isA]}.uniq - LOGGER.debug "FEATURES" - LOGGER.debug feature_types.inspect if feature_types.size > 1 "mixed" else @@ -145,12 +147,18 @@ module OpenTox end end - # Get Excel representation + # Get Spreadsheet representation # @return [Spreadsheet::Workbook] Workbook which can be written with the spreadsheet gem (data_entries only, metadata will will be discarded)) def to_spreadsheet Serializer::Spreadsheets.new(self).to_spreadsheet end + # Get Excel representation (alias for to_spreadsheet) + # @return [Spreadsheet::Workbook] Workbook which can be written with the spreadsheet gem (data_entries only, metadata will will be discarded)) + def to_xls + to_spreadsheet + end + # Get CSV string representation (data_entries only, metadata will be discarded) # @return [String] CSV representation def to_csv @@ -180,6 +188,10 @@ module OpenTox @features[feature][DC.title] end + def title + @metadata[DC.title] + end + # Insert a statement (compound_uri,feature_uri,value) # @example Insert a statement (compound_uri,feature_uri,value) # dataset.add "http://webservices.in-silico.ch/compound/InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9", "http://webservices.in-silico.ch/dataset/1/feature/hamster_carcinogenicity", true @@ -224,11 +236,18 @@ module OpenTox # TODO: rewrite feature URI's ?? @compounds.uniq! if @uri - RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) + if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) + RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) + else + File.open("ot-post-file.rdf","w+") { |f| f.write(self.to_rdfxml); @path = f.path } + task_uri = RestClient.post(@uri, {:file => File.new(@path)},{:accept => "text/uri-list"}).to_s.chomp + #task_uri = `curl -X POST -H "Accept:text/uri-list" -F "file=@#{@path};type=application/rdf+xml" http://apps.ideaconsult.net:8080/ambit2/dataset` + Task.find(task_uri).wait_for_completion + self.uri = RestClientWrapper.get(task_uri,:accept => 'text/uri-list') + end else # create dataset if uri is empty self.uri = RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{}).to_s.chomp - RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) end @uri end @@ -252,4 +271,45 @@ module OpenTox end end end + + # Class with special methods for lazar prediction datasets + class LazarPrediction < Dataset + + # Find a prediction dataset and load all data. + # @param [String] uri Prediction dataset URI + # @return [OpenTox::Dataset] Prediction dataset object with all data + def self.find(uri) + prediction = LazarPrediction.new(uri) + prediction.load_all + prediction + end + + def value(compound) + @data_entries[compound.uri].collect{|f,v| v.first if f.match(/prediction/)}.compact.first + end + + def confidence(compound) + feature_uri = @data_entries[compound.uri].collect{|f,v| f if f.match(/prediction/)}.compact.first + @features[feature_uri][OT.confidence] + end + + def descriptors(compound) + @data_entries[compound.uri].collect{|f,v| @features[f] if f.match(/descriptor/)}.compact if @data_entries[compound.uri] + end + + def measured_activities(compound) + source = @metadata[OT.hasSource] + @data_entries[compound.uri].collect{|f,v| v if f.match(/#{source}/)}.compact + end + + def neighbors(compound) + @data_entries[compound.uri].collect{|f,v| @features[f] if f.match(/neighbor/)}.compact + end + +# def errors(compound) +# features = @data_entries[compound.uri].keys +# features.collect{|f| @features[f][OT.error]}.join(" ") if features +# end + + end end diff --git a/lib/environment.rb b/lib/environment.rb index d66b062..4f1cc80 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -1,4 +1,3 @@ -require "ot-logger" # set default environment ENV['RACK_ENV'] = 'production' unless ENV['RACK_ENV'] @@ -45,8 +44,8 @@ end load File.join config_dir,"mail.rb" if File.exists?(File.join config_dir,"mail.rb") logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" -#LOGGER = MyLogger.new(logfile,'daily') # daily rotation -LOGGER = MyLogger.new(logfile) # no rotation +#LOGGER = OTLogger.new(logfile,'daily') # daily rotation +LOGGER = OTLogger.new(logfile) # no rotation LOGGER.formatter = Logger::Formatter.new #this is neccessary to restore the formating in case active-record is loaded if CONFIG[:logger] and CONFIG[:logger] == "debug" LOGGER.level = Logger::DEBUG @@ -60,11 +59,12 @@ FALSE_REGEXP = /^(false|inactive|0|0.0)$/i # Task durations DEFAULT_TASK_MAX_DURATION = 36000 -EXTERNAL_TASK_MAX_DURATION = 36000 +#EXTERNAL_TASK_MAX_DURATION = 36000 # OWL Namespaces class OwlNamespace + attr_accessor :uri def initialize(uri) @uri = uri end diff --git a/lib/feature.rb b/lib/feature.rb index 13d97a2..9e28077 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -1,5 +1,15 @@ module OpenTox class Feature include OpenTox + + def self.find(uri) + feature = Feature.new uri + if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) + feature.add_metadata YAML.load(RestClientWrapper.get(uri,:accept => "application/x-yaml")) + else + feature.add_metadata Parser::Owl::Dataset.new(uri).load_metadata + end + feature + end end end diff --git a/lib/model.rb b/lib/model.rb index 63013cb..c6a2cf4 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -4,6 +4,9 @@ module OpenTox include OpenTox + # Run a model with parameters + # @param [Hash] params Parameters for OpenTox model + # @return [text/uri-list] Task or resource URI def run(params) if CONFIG[:yaml_hosts].include?(URI.parse(@uri).host) accept = 'application/x-yaml' @@ -11,47 +14,25 @@ module OpenTox accept = 'application/rdf+xml' end begin - params[:acccept] = accept - #TODO fix: REstClientWrapper does not accept accept header - #RestClientWrapper.post(@uri,params)#,{:accept => accept}) - `curl -X POST -H "Accept:#{accept}" #{params.collect{|k,v| "-d #{k}=#{v}"}.join(" ")} #{@uri}`.to_s.chomp + RestClientWrapper.post(@uri,{:accept => accept},params).to_s rescue => e LOGGER.error "Failed to run #{@uri} with #{params.inspect} (#{e.inspect})" raise "Failed to run #{@uri} with #{params.inspect}" end end - -=begin - def classification? - #TODO replace with request to ontology server - if @metadata[DC.title] =~ /(?i)classification/ - return true - elsif @metadata[DC.title] =~ /(?i)regression/ - return false - elsif @uri =~/ntua/ and @metadata[DC.title] =~ /mlr/ - return false - elsif @uri =~/tu-muenchen/ and @metadata[DC.title] =~ /regression|M5P|GaussP/ - return false - elsif @uri =~/ambit2/ and @metadata[DC.title] =~ /pKa/ || @metadata[DC.title] =~ /Regression|Caco/ - return false - elsif @uri =~/majority/ - return (@uri =~ /class/) != nil - else - raise "unknown model, uri:'"+@uri+"' title:'"+@metadata[DC.title]+"'" - end - end -=end + # Generic OpenTox model class for all API compliant services class Generic include Model end + # Lazy Structure Activity Relationship class class Lazar include Model + include Algorithm - #attr_accessor :prediction_type, :feature_type, :features, :effects, :activities, :p_values, :fingerprints, :parameters - attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :parameters, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm + attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm, :min_sim def initialize(uri=nil) @@ -61,7 +42,6 @@ module OpenTox super CONFIG[:services]["opentox-model"] end - # TODO: fix metadata, add parameters @metadata[OT.algorithm] = File.join(CONFIG[:services]["opentox-algorithm"],"lazar") @features = [] @@ -70,284 +50,192 @@ module OpenTox @p_values = {} @fingerprints = {} - @feature_calculation_algorithm = "substructure_match" - @similarity_algorithm = "weighted_tanimoto" - @prediction_algorithm = "weighted_majority_vote" + @feature_calculation_algorithm = "Substructure.match" + @similarity_algorithm = "Similarity.tanimoto" + @prediction_algorithm = "Neighbors.weighted_majority_vote" @min_sim = 0.3 end - def self.find(uri) - YAML.load RestClientWrapper.get(uri,:content_type => 'application/x-yaml') + # Get URIs of all lazar models + # @return [Array] List of lazar model URIs + def self.all + RestClientWrapper.get(CONFIG[:services]["opentox-model"]).to_s.split("\n") end - def self.create_from_dataset(dataset_uri,feature_dataset_uri,prediction_feature=nil) - training_activities = OpenTox::Dataset.find(dataset_uri) - training_features = OpenTox::Dataset.find(feature_dataset_uri) - unless prediction_feature # try to read prediction_feature from dataset - raise "#{training_activities.features.size} features in dataset #{dataset_uri}. Please provide a prediction_feature parameter." unless training_activities.features.size == 1 - prediction_feature = training_activities.features.keys.first - params[:prediction_feature] = prediction_feature - end - lazar = Lazar.new - training_features = OpenTox::Dataset.new(feature_dataset_uri) - case training_features.feature_type - when "classification" - lazar.similarity_algorithm = "weighted_tanimoto" - when "regression" - lazar.similarity_algorithm = "weighted_euclid" - end + # Find a lazar model + # @param [String] uri Model URI + # @return [OpenTox::Model::Lazar] lazar model + def self.find(uri) + YAML.load RestClientWrapper.get(uri,:accept => 'application/x-yaml') end - def self.create(dataset_uri,prediction_feature=nil,feature_generation_uri=File.join(CONFIG[:services]["opentox-algorithm"],"fminer/bbrc"),params=nil) - - training_activities = OpenTox::Dataset.find(dataset_uri) - - unless prediction_feature # try to read prediction_feature from dataset - raise "#{training_activities.features.size} features in dataset #{dataset_uri}. Please provide a prediction_feature parameter." unless training_activities.features.size == 1 - prediction_feature = training_activities.features.keys.first - params[:prediction_feature] = prediction_feature - end - - lazar = Lazar.new - params[:feature_generation_uri] = feature_generation_uri - feature_dataset_uri = OpenTox::Algorithm::Generic.new(feature_generation_uri).run(params).to_s - training_features = OpenTox::Dataset.find(feature_dataset_uri) - raise "Dataset #{feature_dataset_uri} not found or empty." if training_features.nil? - - # sorted features for index lookups - lazar.features = training_features.features.sort if training_features.feature_type == "regression" - - training_features.data_entries.each do |compound,entry| - lazar.fingerprints[compound] = [] unless lazar.fingerprints[compound] - entry.keys.each do |feature| - case training_features.feature_type - when "fminer" - # fingerprints are sets - smarts = training_features.features[feature][OT.smarts] - lazar.fingerprints[compound] << smarts - unless lazar.features.include? smarts - lazar.features << smarts - lazar.p_values[smarts] = training_features.features[feature][OT.p_value] - lazar.effects[smarts] = training_features.features[feature][OT.effect] - end - when "classification" - # fingerprints are sets - if entry[feature].flatten.size == 1 - lazar.fingerprints[compound] << feature if entry[feature].flatten.first.match(TRUE_REGEXP) - lazar.features << feature unless lazar.features.include? feature - else - LOGGER.warn "More than one entry (#{entry[feature].inspect}) for compound #{compound}, feature #{feature}" - end - when "regression" - # fingerprints are arrays - if entry[feature].flatten.size == 1 - lazar.fingerprints[compound][lazar.features.index(feature)] = entry[feature].flatten.first - else - LOGGER.warn "More than one entry (#{entry[feature].inspect}) for compound #{compound}, feature #{feature}" - end - end - end - - lazar.activities[compound] = [] unless lazar.activities[compound] - training_activities.data_entries[compound][params[:prediction_feature]].each do |value| - case value.to_s - when "true" - lazar.activities[compound] << true - when "false" - lazar.activities[compound] << false - else - lazar.activities[compound] << value.to_f - lazar.prediction_type = "regression" - end - end - end - - if feature_generation_uri.match(/fminer/) - lazar.feature_calculation_algorithm = "substructure_match" - else - halt 404, "External feature generation services not yet supported" - end - - lazar.metadata[OT.dependentVariables] = params[:prediction_feature] - lazar.metadata[OT.trainingDataset] = dataset_uri - lazar.metadata[OT.featureDataset] = feature_dataset_uri + # Create a new lazar model + # @param [optional,Hash] params Parameters for the lazar algorithm (OpenTox::Algorithm::Lazar) + # @return [OpenTox::Model::Lazar] lazar model + def self.create(params) + lazar_algorithm = OpenTox::Algorithm::Generic.new File.join( CONFIG[:services]["opentox-algorithm"],"lazar") + model_uri = lazar_algorithm.run(params) + OpenTox::Model::Lazar.find(model_uri) + end - lazar.parameters = { - "dataset_uri" => dataset_uri, - "prediction_feature" => prediction_feature, - "feature_generation_uri" => feature_generation_uri - } - - model_uri = lazar.save - LOGGER.info model_uri + " created #{Time.now}" - model_uri +=begin + # Create a new lazar model and return task + # @param [optional,Hash] params Parameters for the lazar algorithm (OpenTox::Algorithm::Lazar) + # @return [OpenTox::Task] Task for lazar model creation + def self.create_task(params) + task_uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-algorithm"],"lazar"), {}, params, false) + Task.find(task_uri) + #model_uri = lazar_algorithm.run(params) + #OpenTox::Model::Lazar.new(model_uri) + end +=end + def parameter(param) + @metadata[OT.parameters].collect{|p| p[OT.paramValue] if p[DC.title] == param}.compact.first end def predict_dataset(dataset_uri) @prediction_dataset = Dataset.create @prediction_dataset.add_metadata({ - OT.hasSource => @lazar.uri, - DC.creator => @lazar.uri, - DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )) + OT.hasSource => @uri, + DC.creator => @uri, + DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), + OT.parameters => [{DC.title => "dataset_uri", OT.paramValue => dataset_uri}] }) - @prediction_dataset.add_parameters({"dataset_uri" => dataset_uri}) - Dataset.new(dataset_uri).load_compounds.each do |compound_uri| + d = Dataset.new(dataset_uri) + d.load_compounds + d.compounds.each do |compound_uri| predict(compound_uri,false) end @prediction_dataset.save - @prediction_dataset.uri + @prediction_dataset end + # Predict a compound + # @param [String] compound_uri Compound URI + # @param [optinal,Boolean] verbose Verbose prediction (output includes neighbors and features) + # @return [OpenTox::Dataset] Dataset with prediction def predict(compound_uri,verbose=false) @compound = Compound.new compound_uri + features = {} unless @prediction_dataset + #@prediction_dataset = cached_prediction + #return @prediction_dataset if cached_prediction @prediction_dataset = Dataset.create @prediction_dataset.add_metadata( { - OT.hasSource => @lazar.uri, - DC.creator => @lazar.uri, - DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )) + OT.hasSource => @uri, + DC.creator => @uri, + # TODO: fix dependentVariable + DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), + OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] } ) - @prediction_dataset.add_parameters( {"compound_uri" => compound_uri} ) end - neighbors - eval @prediction_algorithm - - if @prediction + return @prediction_dataset if database_activity - feature_uri = File.join( @prediction_dataset.uri, "feature", @prediction_dataset.compounds.size) - @prediction_dataset.add @compound.uri, feature_uri, @prediction + neighbors + prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") + + prediction_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),@prediction_dataset.compounds.size.to_s) + # TODO: fix dependentVariable + @prediction_dataset.metadata[OT.dependentVariables] = prediction_feature_uri + + if @neighbors.size == 0 + @prediction_dataset.add_feature(prediction_feature_uri, { + OT.hasSource => @uri, + DC.creator => @uri, + DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), + OT.error => "No similar compounds in training dataset.", + OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] + }) + @prediction_dataset.add @compound.uri, prediction_feature_uri, prediction[:prediction] - feature_metadata = @prediction_dataset.metadata - feature_metadata[DC.title] = File.basename(@metadata[OT.dependentVariables]) - feature_metadata[OT.prediction] = @prediction - feature_metadata[OT.confidence] = @confidence - @prediction_dataset.add_feature(feature_uri, feature_metadata) + else + @prediction_dataset.add_feature(prediction_feature_uri, { + OT.hasSource => @uri, + DC.creator => @uri, + DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), + OT.prediction => prediction[:prediction], + OT.confidence => prediction[:confidence], + OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] + }) + @prediction_dataset.add @compound.uri, prediction_feature_uri, prediction[:prediction] if verbose - if @compound_features + if @feature_calculation_algorithm == "Substructure.match" + f = 0 + @compound_features.each do |feature| + feature_uri = File.join( @prediction_dataset.uri, "feature", "descriptor", f.to_s) + features[feature] = feature_uri + @prediction_dataset.add_feature(feature_uri, { + OT.smarts => feature, + OT.p_value => @p_values[feature], + OT.effect => @effects[feature] + }) + @prediction_dataset.add @compound.uri, feature_uri, true + f+=1 + end + else @compound_features.each do |feature| + features[feature] = feature @prediction_dataset.add @compound.uri, feature, true end end n = 0 - @neighbors.sort{|a,b| a[:similarity] <=> b[:similarity]}.each do |neighbor| - neighbor_uri = File.join( @prediction_dataset.uri, "feature/neighbor", n ) - @prediction_dataset.add @compound.uri, neighbor_uri, true - @prediction_dataset.add_feature(neighbor, { + @neighbors.each do |neighbor| + neighbor_uri = File.join( @prediction_dataset.uri, "feature", "neighbor", n.to_s ) + @prediction_dataset.add_feature(neighbor_uri, { OT.compound => neighbor[:compound], OT.similarity => neighbor[:similarity], OT.activity => neighbor[:activity] }) + @prediction_dataset.add @compound.uri, neighbor_uri, true + f = 0 unless f + neighbor[:features].each do |feature| + if @feature_calculation_algorithm == "Substructure.match" + feature_uri = File.join( @prediction_dataset.uri, "feature", "descriptor", f.to_s) unless feature_uri = features[feature] + else + feature_uri = feature + end + @prediction_dataset.add neighbor[:compound], feature_uri, true + unless features.has_key? feature + features[feature] = feature_uri + @prediction_dataset.add_feature(feature_uri, { + OT.smarts => feature, + OT.p_value => @p_values[feature], + OT.effect => @effects[feature] + }) + f+=1 + end + end n+=1 end + # what happens with dataset predictions? end end - @prediction_dataset.save - @prediction_dataset.uri - end - - def weighted_majority_vote - conf = 0.0 - @neighbors.each do |neighbor| - case neighbor[:activity].to_s - when 'true' - conf += OpenTox::Algorithm.gauss(neighbor[:similarity]) - when 'false' - conf -= OpenTox::Algorithm.gauss(neighbor[:similarity]) - end - end - if conf > 0.0 - @prediction = true - elsif conf < 0.0 - @prediction = false - else - @prediction = nil - end - @confidence = conf/@neighbors.size if @neighbors.size > 0 - end - - def local_svm_regression - sims = @neighbors.collect{ |n| n[:similarity] } # similarity values between query and neighbors - conf = sims.inject{|sum,x| sum + x } - acts = @neighbors.collect do |n| - act = n[:activity] - # TODO: check this in model creation - raise "0 values not allowed in training dataset. log10 is calculated internally." if act.to_f == 0 - Math.log10(act.to_f) - end # activities of neighbors for supervised learning - - neighbor_matches = @neighbors.collect{ |n| n[:features] } # as in classification: URIs of matches - gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel - if neighbor_matches.size == 0 - raise "No neighbors found" - else - # gram matrix - (0..(neighbor_matches.length-1)).each do |i| - gram_matrix[i] = [] - # lower triangle - (0..(i-1)).each do |j| - sim = OpenTox::Algorithm.weighted_tanimoto(neighbor_matches[i], neighbor_matches[j], @lazar.p_values) - gram_matrix[i] << OpenTox::Algorithm.gauss(sim) - end - # diagonal element - gram_matrix[i][i] = 1.0 - # upper triangle - ((i+1)..(neighbor_matches.length-1)).each do |j| - sim = OpenTox::Algorithm.weighted_tanimoto(neighbor_matches[i], neighbor_matches[j], @lazar.p_values) # double calculation? - gram_matrix[i] << OpenTox::Algorithm.gauss(sim) - end - end - @r = RinRuby.new(false,false) # global R instance leads to Socket errors after a large number of requests - @r.eval "library('kernlab')" # this requires R package "kernlab" to be installed - LOGGER.debug "Setting R data ..." - # set data - @r.gram_matrix = gram_matrix.flatten - @r.n = neighbor_matches.size - @r.y = acts - @r.sims = sims - - LOGGER.debug "Preparing R data ..." - # prepare data - @r.eval "y<-as.vector(y)" - @r.eval "gram_matrix<-as.kernelMatrix(matrix(gram_matrix,n,n))" - @r.eval "sims<-as.vector(sims)" - - # model + support vectors - LOGGER.debug "Creating SVM model ..." - @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-svr\", nu=0.8)" - @r.eval "sv<-as.vector(SVindex(model))" - @r.eval "sims<-sims[sv]" - @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" - LOGGER.debug "Predicting ..." - @r.eval "p<-predict(model,sims)[1,1]" - @prediction = 10**(@r.p.to_f) - LOGGER.debug "Prediction is: '" + prediction.to_s + "'." - @r.quit # free R - end - @confidence = conf/@neighbors.size if @neighbors.size > 0 - + @prediction_dataset.save + @prediction_dataset end + # Find neighbors and store them as object variable def neighbors - @compound_features = eval(@feature_calculation_algorithm) if @feature_calculation_algorithm + @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm - @neighbors = {} - @activities.each do |training_compound,activities| - @training_compound = training_compound - sim = eval(@similarity_algorithm) + @neighbors = [] + @fingerprints.each do |training_compound,training_features| + #@activities.each do |training_compound,activities| + sim = eval("#{@similarity_algorithm}(@compound_features,training_features,@p_values)") if sim > @min_sim - activities.each do |act| + @activities[training_compound].each do |act| @neighbors << { - :compound => @training_compound, + :compound => training_compound, :similarity => sim, - :features => @fingerprints[@training_compound], + :features => training_features, :activity => act } end @@ -356,55 +244,63 @@ module OpenTox end - def tanimoto - OpenTox::Algorithm.tanimoto(@compound_features,@fingerprints[@training_compound]) - end - - def weighted_tanimoto - OpenTox::Algorithm.tanimoto(@compound_features,@fingerprints[@training_compound],@p_values) - end - - def euclid - OpenTox::Algorithm.tanimoto(@compound_features,@fingerprints[@training_compound]) - end - - def weighted_euclid - OpenTox::Algorithm.tanimoto(@compound_features,@fingerprints[@training_compound],@p_values) - end - - def substructure_match - @compound.match(@features) - end - - def database_search - #TODO add features method to dataset - Dataset.new(@metadata[OT.featureDataset]).features(@compound.uri) +=begin + def cached_prediction + dataset_uri = PredictionCache.find(:model_uri => @uri, :compound_uri => @compound.uri).dataset_uri) + return false unless dataset_uri + @prediction_dataset = Dataset.find(dataset_uri) + return false unless @prediction_dataset + LOGGER.debug "Serving cached prediction" + true end +=end - def database_activity(compound_uri) - prediction = OpenTox::Dataset.new - # find database activities - if @activities[compound_uri] - @activities[compound_uri].each { |act| prediction.add compound_uri, @metadata[OT.dependentVariables], act } - prediction.add_metadata(OT.hasSource => @metadata[OT.trainingDataset]) - prediction + # Find database activities and store them in @prediction_dataset + # @return [Boolean] true if compound has databasse activities, false if not + def database_activity + if @activities[@compound.uri] + @activities[@compound.uri].each { |act| @prediction_dataset.add @compound.uri, @metadata[OT.dependentVariables], act } + @prediction_dataset.add_metadata(OT.hasSource => @metadata[OT.trainingDataset]) + @prediction_dataset.save + true else - nil + false end end + # Save model at model service def save - RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) - end - - def self.all - RestClientWrapper.get(CONFIG[:services]["opentox-model"]).to_s.split("\n") + self.uri = RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) end + # Delete model at model service def delete RestClientWrapper.delete @uri unless @uri == CONFIG[:services]["opentox-model"] end +=begin +=end + +=begin + def self.create_from_dataset(dataset_uri,feature_dataset_uri,prediction_feature=nil) + training_activities = OpenTox::Dataset.find(dataset_uri) + training_features = OpenTox::Dataset.find(feature_dataset_uri) + unless prediction_feature # try to read prediction_feature from dataset + raise "#{training_activities.features.size} features in dataset #{dataset_uri}. Please provide a prediction_feature parameter." unless training_activities.features.size == 1 + prediction_feature = training_activities.features.keys.first + params[:prediction_feature] = prediction_feature + end + lazar = Lazar.new + training_features = OpenTox::Dataset.new(feature_dataset_uri) + case training_features.feature_type + when "classification" + lazar.similarity_algorithm = "weighted_tanimoto" + when "regression" + lazar.similarity_algorithm = "weighted_euclid" + end + end +=end + end end end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb index 9dc1372..9f9ff26 100644 --- a/lib/opentox-ruby-api-wrapper.rb +++ b/lib/opentox-ruby-api-wrapper.rb @@ -1,4 +1,4 @@ -['rubygems', 'sinatra', 'sinatra/url_for', 'rest_client', 'yaml', 'cgi', 'spork', 'environment'].each do |lib| +['rubygems', 'sinatra', 'sinatra/url_for', 'rest_client', 'yaml', 'cgi', 'spork', 'overwrite', 'environment'].each do |lib| require lib end @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'ot-logger', 'overwrite', 'rest_client_wrapper'].each do |lib| +['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper'].each do |lib| require lib end diff --git a/lib/opentox.rb b/lib/opentox.rb index 3b7fa65..90683e5 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -1,7 +1,7 @@ module OpenTox attr_reader :uri - attr_accessor :metadata, :parameters + attr_accessor :metadata # Initialize OpenTox object with optional uri # @param [optional, String] URI @@ -30,11 +30,9 @@ module OpenTox @metadata end - # Load parameters from URI - #def load_parameters - #@parameters = Parser::Owl::Generic.new(@uri).parameters - #@parameters - #end + def add_metadata(metadata) + metadata.each { |k,v| @metadata[k] = v } + end # Get OWL-DL representation in RDF/XML format # @return [application/rdf+xml] RDF/XML representation diff --git a/lib/ot-logger.rb b/lib/ot-logger.rb deleted file mode 100644 index df38d77..0000000 --- a/lib/ot-logger.rb +++ /dev/null @@ -1,48 +0,0 @@ -require 'logger' -# logging -class MyLogger < Logger - - def pwd - path = Dir.pwd.to_s - index = path.rindex(/\//) - return path if index==nil - path[(index+1)..-1] - end - - def trace() - lines = caller(0) - n = 2 - line = lines[n] - - while (line =~ /spork.rb/ or line =~ /as_task/ or line =~ /ot-logger.rb/) - n += 1 - line = lines[n] - end - - index = line.rindex(/\/.*\.rb/) - return line if index==nil - line[index..-1] - end - - def format(msg) - pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace+" :: "+($sinatra ? $sinatra.request.env['REMOTE_ADDR'] : nil).to_s - end - - def debug(msg) - super format(msg) - end - - def info(msg) - super format(msg) - end - - def warn(msg) - super format(msg) - end - - def error(msg) - super format(msg) - end - -end - diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 2e4c396..f39fec3 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -34,3 +34,53 @@ class String end end end + +require 'logger' +# logging +#class Logger +class OTLogger < Logger + + def pwd + path = Dir.pwd.to_s + index = path.rindex(/\//) + return path if index==nil + path[(index+1)..-1] + end + + def trace() + lines = caller(0) + n = 2 + line = lines[n] + + while (line =~ /spork.rb/ or line =~ /create/ or line =~ /ot-logger.rb/) + n += 1 + line = lines[n] + end + + index = line.rindex(/\/.*\.rb/) + return line if index==nil + line[index..-1] + end + + def format(msg) + pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace+" :: "+($sinatra ? $sinatra.request.env['REMOTE_ADDR'] : nil).to_s + end + + def debug(msg) + super format(msg) + end + + def info(msg) + super format(msg) + end + + def warn(msg) + super format(msg) + end + + def error(msg) + super format(msg) + end + +end + diff --git a/lib/parser.rb b/lib/parser.rb index 4d8e729..b727412 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -116,7 +116,7 @@ module OpenTox end end load_features - @dataset.metadata = metadata + @dataset.metadata = load_metadata @dataset end @@ -253,10 +253,8 @@ module OpenTox when OT.NumericFeature @dataset.add compound.uri, feature, value.to_f when OT.StringFeature - # TODO: insert ?? @dataset.add compound.uri, feature, value.to_s @activity_errors << smiles+", "+row.join(", ") - #return false end end end diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 49549b5..5f5273b 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -80,6 +80,7 @@ module OpenTox raise "content-type not set" unless res.content_type res.code = result.code + # TODO: Ambit returns task representation with 200 instead of result URI return res if res.code==200 || !wait while (res.code==201 || res.code==202) @@ -108,11 +109,12 @@ module OpenTox task = nil case res.content_type - when /application\/rdf\+xml|application\/x-yaml/ - task = OpenTox::Task.from_data(res, res.content_type, res.code, base_uri) + when /application\/rdf\+xml/ + task = OpenTox::Task.from_rdfxml(res) + when /yaml/ + task = OpenTox::Task.from_yaml(res) when /text\// - raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and - res.split("\n").size > 1 #if uri list contains more then one uri, its not a task + raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task task = OpenTox::Task.find(res.to_s) if res.to_s.uri? else raise "unknown content-type for task: '"+res.content_type.to_s+"'" #+"' content: "+res[0..200].to_s @@ -122,7 +124,7 @@ module OpenTox task.wait_for_completion raise task.description unless task.completed? # maybe task was cancelled / error - res = WrapperResult.new task.resultURI + res = WrapperResult.new task.result_uri res.code = task.http_code res.content_type = "text/uri-list" return res @@ -152,8 +154,8 @@ module OpenTox # we are either in a task, or in sinatra # PENDING: always return yaml for now - if $self_task #this global var in Task.as_task to mark that the current process is running in a task - raise error.to_yaml # the error is caught, logged, and task state is set to error in Task.as_task + if $self_task #this global var in Task.create to mark that the current process is running in a task + raise error.to_yaml # the error is caught, logged, and task state is set to error in Task.create #elsif $sinatra #else halt sinatra #$sinatra.halt(502,error.to_yaml) elsif defined?(halt) diff --git a/lib/serializer.rb b/lib/serializer.rb index 31aa0d1..9b3af39 100644 --- a/lib/serializer.rb +++ b/lib/serializer.rb @@ -25,6 +25,7 @@ module OpenTox OT.FeatureValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.Algorithm => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.Parameter => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.Task => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.compound => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.feature => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , @@ -42,6 +43,8 @@ module OpenTox OT.isA => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.Warnings => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , XSD.anyURI => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.hasStatus => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.resultURI => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.hasSource => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , OT.value => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , @@ -100,17 +103,21 @@ module OpenTox # @param [String] uri Algorithm URI def add_algorithm(uri,metadata) @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } - LOGGER.debug @object[uri] add_metadata uri, metadata - LOGGER.debug @object[uri] end # Add a model # @param [String] uri Model URI - def add_model(uri,metadata,parameters) + def add_model(uri,metadata) @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Model }] } add_metadata uri, metadata - add_parameters uri, parameters + end + + # Add a task + # @param [String] uri Model URI + def add_task(uri,metadata) + @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Task }] } + add_metadata uri, metadata end # Add metadata @@ -204,7 +211,7 @@ module OpenTox # @return [text/plain] Object OWL-DL in RDF/XML format def to_rdfxml Tempfile.open("owl-serializer"){|f| f.write(self.to_ntriples); @path = f.path} - `rapper -i ntriples -o rdfxml #{@path} 2>/dev/null` + `rapper -i ntriples -f 'xmlns:ot="#{OT.uri}"' -f 'xmlns:dc="#{DC.uri}"' -f 'xmlns:rdf="#{RDF.uri}"' -f 'xmlns:owl="#{OWL.uri}"' -o rdfxml #{@path} 2>/dev/null` end # Convert to JSON as specified in http://n2.talis.com/wiki/RDF_JSON_Specification @@ -290,7 +297,11 @@ module OpenTox entries.each do |feature, values| i = features.index(feature)+1 values.each do |value| - row[i] = value #TODO overwrites duplicated values + if row[i] + row[i] = "#{row[i]} #{value}" # multiple values + else + row[i] = value + end end end @rows << row diff --git a/lib/task.rb b/lib/task.rb index 96ee719..5b2b5d9 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -2,39 +2,183 @@ $self_task=nil module OpenTox + # Class for handling asynchronous tasks class Task - attr_accessor :uri, :date, :title, :creator, :description, :hasStatus, :percentageCompleted, :resultURI, :due_to_time, :http_code - - # due_to_time is only set in local tasks - TASK_ATTRIBS = [ :uri, :date, :title, :creator, :description, :hasStatus, :percentageCompleted, :resultURI, :due_to_time ] - TASK_ATTRIBS.each{ |a| attr_accessor(a) } - attr_accessor :http_code + include OpenTox + attr_accessor :http_code, :due_to_time - private - def initialize(uri) - @uri = uri.to_s.strip + def initialize(uri=nil) + super uri + @metadata = { + DC.title => "", + DC.date => "", + OT.hasStatus => "Running", + OT.percentageCompleted => "0", + OT.resultURI => "", + DC.creator => "", # not mandatory according to API + DC.description => "", # not mandatory according to API + } end - - # create is private now, use OpenTox::Task.as_task - def self.create( params ) + + # Create a new task for the code in the block. Catches halts and exceptions and sets task state to error if necessary. The block has to return the URI of the created resource. + # @example + # task = OpenTox::Task.create do + # # this code will be executed as a task + # model = OpenTox::Algorithm.run(params) # this can be time consuming + # model.uri # Important: return URI of the created resource + # end + # task.status # returns "Running", because tasks are forked + # @param [String] title Task title + # @param [String] creator Task creator + # @return [OPenTox::Task] Task + def self.create( title=nil, creator=nil, max_duration=DEFAULT_TASK_MAX_DURATION, description=nil ) + + # measure current memory consumption + memory = `free -m|sed -n '2p'`.split + free_memory = memory[3].to_i + memory[6].to_i # include cache + if free_memory < 20 # require at least 200 M free memory + LOGGER.warn "Cannot start task - not enough memory left (#{free_memory} M free)" + raise "Insufficient memory to start a new task" + end + + cpu_load = `cat /proc/loadavg`.split(/\s+/)[0..2].collect{|c| c.to_f} + nr_cpu_cores = `cat /proc/cpuinfo |grep "cpu cores"|cut -d ":" -f2|tr -d " "`.split("\n").collect{|c| c.to_i}.inject{|sum,n| sum+n} + if cpu_load[0] > nr_cpu_cores and cpu_load[0] > cpu_load[1] and cpu_load[1] > cpu_load[2] # average CPU load of the last minute is high and CPU load is increasing + LOGGER.warn "Cannot start task - CPU load too high (#{cpu_load.join(", ")})" + raise "Server too busy to start a new task" + end + + params = {:title=>title, :creator=>creator, :max_duration=>max_duration, :description=>description } task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, nil, false).to_s - Task.find(task_uri.chomp) - end + task = Task.new(task_uri.chomp) + + task_pid = Spork.spork(:logger => LOGGER) do + LOGGER.debug "Task #{task.uri} started #{Time.now}" + $self_task = task + + begin + result = catch(:halt) do + yield task + end + # catching halt, set task state to error + if result && result.is_a?(Array) && result.size==2 && result[0]>202 + LOGGER.error "task was halted: "+result.inspect + task.error(result[1]) + return + end + LOGGER.debug "Task #{task.uri} done #{Time.now} -> "+result.to_s + task.completed(result) + rescue => ex + LOGGER.error "task failed: "+ex.message + LOGGER.error ": "+ex.backtrace.join("\n") + task.error(ex.message) + end + end + task.pid = task_pid + LOGGER.debug "Started task: "+task.uri.to_s + task + end - public - def self.find( uri, accept_header=nil ) + # Find a task for querying, status changes + # @param [String] uri Task URI + # @return [OpenTox::Task] Task object + def self.find(uri) task = Task.new(uri) - task.reload( accept_header ) - return task + task.load_metadata + task + end + + # Get a list of all tasks + # @param [optional, String] uri URI of task service + # @return [text/uri-list] Task URIs + def self.all(uri=CONFIG[:services]["opentox-task"]) + OpenTox.all uri + end + + def self.from_yaml(yaml) + @metadata = YAML.load(yaml) + end + + def self.from_rdfxml(rdfxml) + file = Tempfile.open("ot-rdfxml"){|f| f.write(rdfxml)}.path + parser = Parser::Owl::Generic.new file + @metadata = parser.load_metadata + end + + def to_rdfxml + s = Serializer::Owl.new + s.add_task(@uri,@metadata) + s.to_rdfxml + end + + def status + @metadata[OT.hasStatus] + end + + def result_uri + @metadata[OT.resultURI] + end + + def description + @metadata[DC.description] + end + + def cancel + RestClientWrapper.put(File.join(@uri,'Cancelled')) + load_metadata + end + + def completed(uri) + RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) + load_metadata + end + + def error(description) + RestClientWrapper.put(File.join(@uri,'Error'),{:description => description.to_s[0..2000]}) + load_metadata + end + + def pid=(pid) + RestClientWrapper.put(File.join(@uri,'pid'), {:pid => pid}) + end + + def running? + @metadata[OT.hasStatus] == 'Running' + end + + def completed? + @metadata[OT.hasStatus] == 'Completed' + end + + def error? + @metadata[OT.hasStatus] == 'Error' + end + + def load_metadata + if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) + result = RestClientWrapper.get(@uri, {:accept => 'application/x-yaml'}, false) + @metadata = YAML.load result.to_s + @http_code = result.code + else + @metadata = Parser::Owl::Generic.new(@uri).load_metadata + @http_code = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, false).code + end end + # create is private now, use OpenTox::Task.as_task + #def self.create( params ) + #task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, nil, false).to_s + #Task.find(task_uri.chomp) + #end + +=begin def self.from_data(data, content_type, code, base_uri) task = Task.new(nil) task.http_code = code task.reload_from_data(data, content_type, base_uri) return task end - + def reload( accept_header=nil ) unless accept_header if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) @@ -65,113 +209,45 @@ module OpenTox end raise "uri is null after loading" unless @uri and @uri.to_s.strip.size>0 end - - def cancel - RestClientWrapper.put(File.join(@uri,'Cancelled')) - reload - end - - def completed(uri) - RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) - reload - end - - def error(description) - RestClientWrapper.put(File.join(@uri,'Error'),{:description => description.to_s[0..2000]}) - reload - end - - def pid=(pid) - RestClientWrapper.put(File.join(@uri,'pid'), {:pid => pid}) - end - - def running? - @hasStatus.to_s == 'Running' - end - - def completed? - @hasStatus.to_s == 'Completed' - end - - def error? - @hasStatus.to_s == 'Error' - end +=end # waits for a task, unless time exceeds or state is no longer running def wait_for_completion(dur=0.3) - if (@uri.match(CONFIG[:services]["opentox-task"])) - due_to_time = (@due_to_time.is_a?(Time) ? @due_to_time : Time.parse(@due_to_time)) - running_time = due_to_time - (@date.is_a?(Time) ? @date : Time.parse(@date)) - else - # the date of the external task cannot be trusted, offest to local time might be to big - due_to_time = Time.new + EXTERNAL_TASK_MAX_DURATION - running_time = EXTERNAL_TASK_MAX_DURATION - end + due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION LOGGER.debug "start waiting for task "+@uri.to_s+" at: "+Time.new.to_s+", waiting at least until "+due_to_time.to_s + load_metadata # for extremely fast tasks + check_state while self.running? sleep dur - reload + load_metadata check_state if (Time.new > due_to_time) - raise "max wait time exceeded ("+running_time.to_s+"sec), task: '"+@uri.to_s+"'" + raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" end end - LOGGER.debug "Task '"+@hasStatus+"': "+@uri.to_s+", Result: "+@resultURI.to_s + LOGGER.debug "Task '"+@metadata[OT.hasStatus]+"': "+@uri.to_s+", Result: "+@metadata[OT.resultURI].to_s end + private def check_state begin - raise "illegal task state, task is completed, resultURI is no URI: '"+@resultURI.to_s+ - "'" unless @resultURI and @resultURI.to_s.uri? if completed? + raise "illegal task state, task is completed, resultURI is no URI: '"+@metadata[OT.resultURI].to_s+ + "'" unless @metadata[OT.resultURI] and @metadata[OT.resultURI].to_s.uri? if completed? if @http_code == 202 - raise "illegal task state, code is 202, but hasStatus is not Running: '"+@hasStatus+"'" unless running? + raise "illegal task state, code is 202, but hasStatus is not Running: '"+@metadata[OT.hasStatus]+"'" unless running? elsif @http_code == 201 - raise "illegal task state, code is 201, but hasStatus is not Completed: '"+@hasStatus+"'" unless completed? - raise "illegal task state, code is 201, resultURI is no task-URI: '"+@resultURI.to_s+ - "'" unless @resultURI and @resultURI.to_s.uri? + raise "illegal task state, code is 201, but hasStatus is not Completed: '"+@metadata[OT.hasStatus]+"'" unless completed? + raise "illegal task state, code is 201, resultURI is no task-URI: '"+@metadata[OT.resultURI].to_s+ + "'" unless @metadata[OT.resultURI] and @metadata[OT.resultURI].to_s.uri? end rescue => ex RestClientWrapper.raise_uri_error(ex.message, @uri) end end - - # returns the task uri - # catches halts and exceptions, task state is set to error then - def self.as_task( title, creator, max_duration=DEFAULT_TASK_MAX_DURATION, description=nil ) - #return yield nil - - params = {:title=>title, :creator=>creator, :max_duration=>max_duration, :description=>description } - task = ::OpenTox::Task.create(params) - task_pid = Spork.spork(:logger => LOGGER) do - LOGGER.debug "Task #{task.uri} started #{Time.now}" - $self_task = task - - begin - result = catch(:halt) do - yield task - end - # catching halt, set task state to error - if result && result.is_a?(Array) && result.size==2 && result[0]>202 - LOGGER.error "task was halted: "+result.inspect - task.error(result[1]) - return - end - LOGGER.debug "Task #{task.uri} done #{Time.now} -> "+result.to_s - task.completed(result) - rescue => ex - LOGGER.error "task failed: "+ex.message - LOGGER.error ": "+ex.backtrace.join("\n") - task.error(ex.message) - end - end - task.pid = task_pid - LOGGER.debug "Started task: "+task.uri.to_s - task.uri - end end diff --git a/lib/validation.rb b/lib/validation.rb index 340332a..76c4529 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -1,20 +1,70 @@ module OpenTox class Validation + include OpenTox - attr_accessor :uri - - def initialize(params) - @uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/crossvalidation"),params,nil,false) - end + attr_accessor :report_uri, :qmrf_report_uri - def self.crossvalidation(params) + def self.create_crossvalidation(params) params[:uri] = File.join(CONFIG[:services]['opentox-validation'], "crossvalidation") params[:num_folds] = 10 unless params[:num_folds] params[:random_seed] = 2 unless params[:random_seed] params[:stratified] = false unless params[:stratified] - OpenTox::Validation.new(params) + uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/crossvalidation"),params,nil,false) + OpenTox::Validation.new(uri) end + def create_report + @report_uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/crossvalidation"), :validation_uris => @uri).to_s + @report_uri + end + + def create_qmrf_report + @qmrf_report_uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/reach_report/qmrf"), :model_uri => @uri).to_s + @qmrf_report_uri + end + + def summary(type) + v = YAML.load RestClientWrappper.get(File.join(@uri, 'statistics'),:accept => "application/x-yaml").to_s + + case type + when "classification" + tp=0; tn=0; fp=0; fn=0; n=0 + v[:classification_statistics][:confusion_matrix][:confusion_matrix_cell].each do |cell| + if cell[:confusion_matrix_predicted] == "true" and cell[:confusion_matrix_actual] == "true" + tp = cell[:confusion_matrix_value] + n += tp + elsif cell[:confusion_matrix_predicted] == "false" and cell[:confusion_matrix_actual] == "false" + tn = cell[:confusion_matrix_value] + n += tn + elsif cell[:confusion_matrix_predicted] == "false" and cell[:confusion_matrix_actual] == "true" + fn = cell[:confusion_matrix_value] + n += fn + elsif cell[:confusion_matrix_predicted] == "true" and cell[:confusion_matrix_actual] == "false" + fp = cell[:confusion_matrix_value] + n += fp + end + end + { + :nr_predictions => n, + :true_positives => tp, + :false_positives => fp, + :true_negatives => tn, + :false_negatives => fn, + :correct_predictions => 100*(tp+tn).to_f/n, + :weighted_area_under_roc => v[:classification_statistics][:weighted_area_under_roc].to_f, + :sensitivity => tp.to_f/(tp+fn), + :specificity => tn.to_f/(tn+fp), + } + when "regression" + { + :nr_predictions => v[:num_instances] - v[:num_unpredicted], + :r_square => v[:regression_statistics][:r_square], + :root_mean_squared_error => v[:regression_statistics][:root_mean_squared_error], + :mean_absolute_error => v[:regression_statistics][:mean_absolute_error], + } + end + end + end end -- cgit v1.2.3 From 7c743456c42ffa85e81db6d975ebd7ed260f81f0 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 24 Nov 2010 12:17:53 +0100 Subject: Version bump to 0.0.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ec70f75..8acdd82 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.6 +0.0.1 -- cgit v1.2.3 From 7067bd44d5c97618ec6a968bbdfe6d6bda12a1cd Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 24 Nov 2010 13:13:40 +0100 Subject: opentox-ruby-api-wrapper renamed to opentox-ruby --- Rakefile | 64 ++++++++++++++++++++--------------------- bin/yaml2owl.rb | 18 ------------ lib/dataset.rb | 17 ++++++++++- lib/model.rb | 63 +++++++++------------------------------- lib/opentox-ruby-api-wrapper.rb | 13 --------- lib/opentox-ruby.rb | 13 +++++++++ lib/serializer.rb | 10 ++++--- lib/task.rb | 15 ++++++---- 8 files changed, 91 insertions(+), 122 deletions(-) delete mode 100755 bin/yaml2owl.rb delete mode 100644 lib/opentox-ruby-api-wrapper.rb create mode 100644 lib/opentox-ruby.rb diff --git a/Rakefile b/Rakefile index 6838e75..53c6ae9 100644 --- a/Rakefile +++ b/Rakefile @@ -4,45 +4,45 @@ require 'rake' begin require 'jeweler' Jeweler::Tasks.new do |gem| - gem.name = "opentox-ruby-api-wrapper" + gem.name = "opentox-ruby" gem.summary = %Q{Ruby wrapper for the OpenTox REST API} gem.description = %Q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" - gem.authors = ["Christoph Helma, Martin Guetlein"] - # dependencies - [ "sinatra", - "emk-sinatra-url-for", - "sinatra-respond_to", - "sinatra-static-assets", - "rest-client", - "rack", - "rack-contrib", - "rack-flash", - "nokogiri", - "rubyzip", - "roo", - "spreadsheet", - "google-spreadsheet-ruby", - "tmail", - "rinruby", - "rjb" - ].each { |dep| gem.add_dependency dep } - [ "dm-core", - 'dm-serializer', - 'dm-timestamps', - 'dm-types', - 'dm-migrations', - "dm-mysql-adapter", + gem.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] + # dependencies + [ "sinatra", + "emk-sinatra-url-for", + "sinatra-respond_to", + "sinatra-static-assets", + "rest-client", + "rack", + "rack-contrib", + "rack-flash", + "nokogiri", + "rubyzip", + "roo", + "spreadsheet", + "google-spreadsheet-ruby", + "tmail", + "rinruby", + "rjb" + ].each { |dep| gem.add_dependency dep } + [ "dm-core", + 'dm-serializer', + 'dm-timestamps', + 'dm-types', + 'dm-migrations', + "dm-mysql-adapter", "dm-validations", - ].each {|dep| gem.add_dependency dep, ">= 1" } - gem.add_dependency "haml", ">=3" - ['cucumber','jeweler'].each { |dep| gem.add_development_dependency dep } - gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] - gem.files.include %w(lib/tasks/owl.rb, lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/validation.rb, lib/templates/*) + ].each {|dep| gem.add_dependency dep, ">= 1" } + gem.add_dependency "haml", ">=3" + ['jeweler'].each { |dep| gem.add_development_dependency dep } + gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] + #gem.files.include %w(lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/validation.rb, lib/templates/*) # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end - Jeweler::GemcutterTasks.new + Jeweler::GemcutterTasks.new rescue LoadError puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler" end diff --git a/bin/yaml2owl.rb b/bin/yaml2owl.rb deleted file mode 100755 index 1002912..0000000 --- a/bin/yaml2owl.rb +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env ruby -require 'rubygems' -require 'opentox-ruby-api-wrapper' - -input = YAML.load_file(ARGV[0]) -dataset = OpenTox::Dataset.new -dataset.title = input[:title] -dataset.creator = input[:source] -input[:data].each do |c,f| - f.each do |k,v| - v.each do |value| - dataset.add c,k,value - end - end -end -outfile = File.expand_path(File.join(File.dirname(__FILE__),ARGV[0].sub(/yaml/,'owl'))) -dataset.uri = outfile -File.open(outfile,'w+'){|f| f.puts dataset.rdf} diff --git a/lib/dataset.rb b/lib/dataset.rb index 4737ea1..c5704ae 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -32,6 +32,21 @@ module OpenTox dataset end + # Create dataset from CSV file (format specification: http://toxcreate.org/help) + # - loads data_entries, compounds, features + # - sets metadata (warnings) for parser errors + # - you will have to set remaining metadata manually + # @param [String] file CSV file path + # @return [OpenTox::Dataset] Dataset object with CSV data + def self.create_from_csv_file(file) + dataset = Dataset.create + parser = Parser::Spreadsheets.new + parser.dataset = dataset + parser.load_csv(File.open(file).read) + dataset.save + dataset + end + # Find a dataset and load all data. This can be time consuming, use Dataset.new together with one of the load_* methods for a fine grained control over data loading. # @param [String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object with all data @@ -299,7 +314,7 @@ module OpenTox def measured_activities(compound) source = @metadata[OT.hasSource] - @data_entries[compound.uri].collect{|f,v| v if f.match(/#{source}/)}.compact + @data_entries[compound.uri].collect{|f,v| v if f.match(/#{source}/)}.compact.flatten end def neighbors(compound) diff --git a/lib/model.rb b/lib/model.rb index c6a2cf4..5654bcc 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -80,21 +80,16 @@ module OpenTox OpenTox::Model::Lazar.find(model_uri) end -=begin - # Create a new lazar model and return task - # @param [optional,Hash] params Parameters for the lazar algorithm (OpenTox::Algorithm::Lazar) - # @return [OpenTox::Task] Task for lazar model creation - def self.create_task(params) - task_uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-algorithm"],"lazar"), {}, params, false) - Task.find(task_uri) - #model_uri = lazar_algorithm.run(params) - #OpenTox::Model::Lazar.new(model_uri) - end -=end + # Get a parameter value + # @param [String] param Parameter name + # @return [String] Parameter value def parameter(param) @metadata[OT.parameters].collect{|p| p[OT.paramValue] if p[DC.title] == param}.compact.first end + # Predict a dataset + # @param [String] dataset_uri Dataset URI + # @return [OpenTox::Dataset] Dataset with predictions def predict_dataset(dataset_uri) @prediction_dataset = Dataset.create @prediction_dataset.add_metadata({ @@ -145,6 +140,7 @@ module OpenTox if @neighbors.size == 0 @prediction_dataset.add_feature(prediction_feature_uri, { + OT.isA => OT.MeasuredFeature, OT.hasSource => @uri, DC.creator => @uri, DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), @@ -155,6 +151,7 @@ module OpenTox else @prediction_dataset.add_feature(prediction_feature_uri, { + OT.isA => OT.ModelPrediction, OT.hasSource => @uri, DC.creator => @uri, DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), @@ -171,8 +168,9 @@ module OpenTox feature_uri = File.join( @prediction_dataset.uri, "feature", "descriptor", f.to_s) features[feature] = feature_uri @prediction_dataset.add_feature(feature_uri, { + OT.isA => OT.Substructure, OT.smarts => feature, - OT.p_value => @p_values[feature], + OT.pValue => @p_values[feature], OT.effect => @effects[feature] }) @prediction_dataset.add @compound.uri, feature_uri, true @@ -190,7 +188,8 @@ module OpenTox @prediction_dataset.add_feature(neighbor_uri, { OT.compound => neighbor[:compound], OT.similarity => neighbor[:similarity], - OT.activity => neighbor[:activity] + OT.measuredActivity => neighbor[:activity], + OT.isA => OT.Neighbor }) @prediction_dataset.add @compound.uri, neighbor_uri, true f = 0 unless f @@ -204,8 +203,9 @@ module OpenTox unless features.has_key? feature features[feature] = feature_uri @prediction_dataset.add_feature(feature_uri, { + OT.isA => OT.Substructure, OT.smarts => feature, - OT.p_value => @p_values[feature], + OT.pValue => @p_values[feature], OT.effect => @effects[feature] }) f+=1 @@ -228,7 +228,6 @@ module OpenTox @neighbors = [] @fingerprints.each do |training_compound,training_features| - #@activities.each do |training_compound,activities| sim = eval("#{@similarity_algorithm}(@compound_features,training_features,@p_values)") if sim > @min_sim @activities[training_compound].each do |act| @@ -244,17 +243,6 @@ module OpenTox end -=begin - def cached_prediction - dataset_uri = PredictionCache.find(:model_uri => @uri, :compound_uri => @compound.uri).dataset_uri) - return false unless dataset_uri - @prediction_dataset = Dataset.find(dataset_uri) - return false unless @prediction_dataset - LOGGER.debug "Serving cached prediction" - true - end -=end - # Find database activities and store them in @prediction_dataset # @return [Boolean] true if compound has databasse activities, false if not def database_activity @@ -278,29 +266,6 @@ module OpenTox RestClientWrapper.delete @uri unless @uri == CONFIG[:services]["opentox-model"] end -=begin -=end - -=begin - def self.create_from_dataset(dataset_uri,feature_dataset_uri,prediction_feature=nil) - training_activities = OpenTox::Dataset.find(dataset_uri) - training_features = OpenTox::Dataset.find(feature_dataset_uri) - unless prediction_feature # try to read prediction_feature from dataset - raise "#{training_activities.features.size} features in dataset #{dataset_uri}. Please provide a prediction_feature parameter." unless training_activities.features.size == 1 - prediction_feature = training_activities.features.keys.first - params[:prediction_feature] = prediction_feature - end - lazar = Lazar.new - training_features = OpenTox::Dataset.new(feature_dataset_uri) - case training_features.feature_type - when "classification" - lazar.similarity_algorithm = "weighted_tanimoto" - when "regression" - lazar.similarity_algorithm = "weighted_euclid" - end - end -=end - end end end diff --git a/lib/opentox-ruby-api-wrapper.rb b/lib/opentox-ruby-api-wrapper.rb deleted file mode 100644 index 9f9ff26..0000000 --- a/lib/opentox-ruby-api-wrapper.rb +++ /dev/null @@ -1,13 +0,0 @@ -['rubygems', 'sinatra', 'sinatra/url_for', 'rest_client', 'yaml', 'cgi', 'spork', 'overwrite', 'environment'].each do |lib| - require lib -end - -begin - require 'openbabel' -rescue LoadError - puts "Please install Openbabel with 'rake openbabel:install' in the compound component" -end - -['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper'].each do |lib| - require lib -end diff --git a/lib/opentox-ruby.rb b/lib/opentox-ruby.rb new file mode 100644 index 0000000..9f9ff26 --- /dev/null +++ b/lib/opentox-ruby.rb @@ -0,0 +1,13 @@ +['rubygems', 'sinatra', 'sinatra/url_for', 'rest_client', 'yaml', 'cgi', 'spork', 'overwrite', 'environment'].each do |lib| + require lib +end + +begin + require 'openbabel' +rescue LoadError + puts "Please install Openbabel with 'rake openbabel:install' in the compound component" +end + +['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper'].each do |lib| + require lib +end diff --git a/lib/serializer.rb b/lib/serializer.rb index 9b3af39..495702a 100644 --- a/lib/serializer.rb +++ b/lib/serializer.rb @@ -40,11 +40,13 @@ module OpenTox DC.contributor => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , DC.creator => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , DC.description => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + DC.date => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.isA => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.Warnings => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , XSD.anyURI => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.hasStatus => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.resultURI => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.percentageCompleted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.hasSource => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , OT.value => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , @@ -125,10 +127,7 @@ module OpenTox def add_metadata(uri,metadata) id = 0 metadata.each do |u,v| - if v.is_a? String - @object[uri] = {} unless @object[uri] - @object[uri][u] = [{"type" => type(v), "value" => v }] - elsif v.is_a? Array and u == OT.parameters + if v.is_a? Array and u == OT.parameters @object[uri][u] = [] unless @object[uri][u] v.each do |value| id+=1 @@ -139,6 +138,9 @@ module OpenTox @object[genid][name] = [{"type" => type(entry), "value" => entry }] end end + else # v.is_a? String + @object[uri] = {} unless @object[uri] + @object[uri][u] = [{"type" => type(v), "value" => v }] end end end diff --git a/lib/task.rb b/lib/task.rb index 5b2b5d9..5b59395 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -33,24 +33,29 @@ module OpenTox # @return [OPenTox::Task] Task def self.create( title=nil, creator=nil, max_duration=DEFAULT_TASK_MAX_DURATION, description=nil ) + params = {:title=>title, :creator=>creator, :max_duration=>max_duration, :description=>description } + task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, nil, false).to_s + task = Task.new(task_uri.chomp) + # measure current memory consumption memory = `free -m|sed -n '2p'`.split free_memory = memory[3].to_i + memory[6].to_i # include cache if free_memory < 20 # require at least 200 M free memory LOGGER.warn "Cannot start task - not enough memory left (#{free_memory} M free)" - raise "Insufficient memory to start a new task" + task.cancel + return task + #raise "Insufficient memory to start a new task" end cpu_load = `cat /proc/loadavg`.split(/\s+/)[0..2].collect{|c| c.to_f} nr_cpu_cores = `cat /proc/cpuinfo |grep "cpu cores"|cut -d ":" -f2|tr -d " "`.split("\n").collect{|c| c.to_i}.inject{|sum,n| sum+n} if cpu_load[0] > nr_cpu_cores and cpu_load[0] > cpu_load[1] and cpu_load[1] > cpu_load[2] # average CPU load of the last minute is high and CPU load is increasing LOGGER.warn "Cannot start task - CPU load too high (#{cpu_load.join(", ")})" - raise "Server too busy to start a new task" + task.cancel + return task + #raise "Server too busy to start a new task" end - params = {:title=>title, :creator=>creator, :max_duration=>max_duration, :description=>description } - task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, nil, false).to_s - task = Task.new(task_uri.chomp) task_pid = Spork.spork(:logger => LOGGER) do LOGGER.debug "Task #{task.uri} started #{Time.now}" -- cgit v1.2.3 From 8ff5d7de9683d9bbe6103dd42d10aefbf2f4a021 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 24 Nov 2010 14:43:20 +0100 Subject: opentox-ruby gem in config.ru --- README.rdoc | 8 ++++---- Rakefile | 5 +++-- opentox-ruby-api-wrapper.gemspec | 16 ++++++---------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/README.rdoc b/README.rdoc index e337907..45cc5f6 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,4 +1,4 @@ -= opentox-ruby-api-wrapper += opentox-ruby Ruby wrapper for the OpenTox REST API (http://www.opentox.org) @@ -10,14 +10,14 @@ Run the following if you haven't already: Install the gem: - sudo gem install helma-opentox-ruby-api-wrapper + sudo gem install helma-opentox-ruby == Usage - adjust the settings in $HOME/.opentox/config -- require 'opentox-ruby-api-wrapper' in your ruby application +- require 'opentox-ruby' in your ruby application - consult the rdoc API documentation for details == Copyright -Copyright (c) 2009 Christoph Helma. See LICENSE for details. +Copyright (c) 2009-2010 Christoph Helma. See LICENSE for details. diff --git a/Rakefile b/Rakefile index 53c6ae9..2578bb4 100644 --- a/Rakefile +++ b/Rakefile @@ -8,7 +8,7 @@ begin gem.summary = %Q{Ruby wrapper for the OpenTox REST API} gem.description = %Q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} gem.email = "helma@in-silico.ch" - gem.homepage = "http://github.com/helma/opentox-ruby-api-wrapper" + gem.homepage = "http://github.com/helma/opentox-ruby" gem.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] # dependencies [ "sinatra", @@ -24,6 +24,7 @@ begin "roo", "spreadsheet", "google-spreadsheet-ruby", + "yajl-ruby", "tmail", "rinruby", "rjb" @@ -80,7 +81,7 @@ Rake::RDocTask.new do |rdoc| end rdoc.rdoc_dir = 'rdoc' - rdoc.title = "opentox-ruby-api-wrapper #{version}" + rdoc.title = "opentox-ruby #{version}" rdoc.rdoc_files.include('README*') rdoc.rdoc_files.include('lib/**/*.rb') end diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec index 58f0b46..fd00851 100644 --- a/opentox-ruby-api-wrapper.gemspec +++ b/opentox-ruby-api-wrapper.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby-api-wrapper} - s.version = "1.6.6" + s.version = "0.0.1" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein"] - s.date = %q{2010-09-14} + s.date = %q{2010-11-24} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] @@ -30,24 +30,23 @@ Gem::Specification.new do |s| "lib/config/config_ru.rb", "lib/dataset.rb", "lib/environment.rb", - "lib/features.rb", + "lib/feature.rb", "lib/helper.rb", "lib/model.rb", "lib/opentox-ruby-api-wrapper.rb", "lib/opentox.owl", - "lib/ot-logger.rb", + "lib/opentox.rb", "lib/overwrite.rb", - "lib/owl-serializer.rb", - "lib/owl.rb", "lib/owl.rb.RDF", "lib/owl.rb.nt", "lib/owl.rb.rdfxml.initial", "lib/owl.rb.redland", + "lib/parser.rb", "lib/rest_client_wrapper.rb", + "lib/serializer.rb", "lib/spork.rb", "lib/task.rb", "lib/templates/config.yaml", - "lib/utils.rb", "lib/validation.rb" ] s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} @@ -71,7 +70,6 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) @@ -99,7 +97,6 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -128,7 +125,6 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) -- cgit v1.2.3 From 5233ab341757557c536ed8cc8eefd79a936b4295 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 25 Nov 2010 18:06:09 +0100 Subject: find method documented --- lib/dataset.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/dataset.rb b/lib/dataset.rb index 2eb2206..526e0a2 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -26,6 +26,9 @@ module OpenTox end end + # Find and a dataset and load all data from the dataset service + # @param [String] uri Dataset URI + # @return [OpenTox::Dataset] Dataset object def self.find(uri, accept_header=nil) unless accept_header -- cgit v1.2.3 From d3190ba5fd87db05bdf3219dae00afaf31257718 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 30 Nov 2010 12:43:04 +0100 Subject: Accept: text/uri-list for running algoritms --- lib/algorithm.rb | 2 +- lib/task.rb | 6 +- opentox-ruby-api-wrapper.gemspec | 146 --------------------------------------- opentox-ruby.gemspec | 133 +++++++++++++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 150 deletions(-) delete mode 100644 opentox-ruby-api-wrapper.gemspec create mode 100644 opentox-ruby.gemspec diff --git a/lib/algorithm.rb b/lib/algorithm.rb index a6fa4a7..a2f7786 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -15,7 +15,7 @@ module OpenTox # @param [optional,Hash] params Algorithm parameters # @return [String] URI of new resource (dataset, model, ...) def run(params=nil) - RestClientWrapper.post(@uri, params).to_s + RestClientWrapper.post(@uri, {:accept => 'text/uri-list'}, params).to_s end # Get OWL-DL representation in RDF/XML format diff --git a/lib/task.rb b/lib/task.rb index 5b59395..17f95e6 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -243,10 +243,10 @@ module OpenTox "'" unless @metadata[OT.resultURI] and @metadata[OT.resultURI].to_s.uri? if completed? if @http_code == 202 - raise "illegal task state, code is 202, but hasStatus is not Running: '"+@metadata[OT.hasStatus]+"'" unless running? + raise "#{@uri}: illegal task state, code is 202, but hasStatus is not Running: '"+@metadata[OT.hasStatus]+"'" unless running? elsif @http_code == 201 - raise "illegal task state, code is 201, but hasStatus is not Completed: '"+@metadata[OT.hasStatus]+"'" unless completed? - raise "illegal task state, code is 201, resultURI is no task-URI: '"+@metadata[OT.resultURI].to_s+ + raise "#{@uri}: illegal task state, code is 201, but hasStatus is not Completed: '"+@metadata[OT.hasStatus]+"'" unless completed? + raise "#{@uri}: illegal task state, code is 201, resultURI is no task-URI: '"+@metadata[OT.resultURI].to_s+ "'" unless @metadata[OT.resultURI] and @metadata[OT.resultURI].to_s.uri? end rescue => ex diff --git a/opentox-ruby-api-wrapper.gemspec b/opentox-ruby-api-wrapper.gemspec deleted file mode 100644 index fd00851..0000000 --- a/opentox-ruby-api-wrapper.gemspec +++ /dev/null @@ -1,146 +0,0 @@ -# Generated by jeweler -# DO NOT EDIT THIS FILE DIRECTLY -# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command -# -*- encoding: utf-8 -*- - -Gem::Specification.new do |s| - s.name = %q{opentox-ruby-api-wrapper} - s.version = "0.0.1" - - s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= - s.authors = ["Christoph Helma, Martin Guetlein"] - s.date = %q{2010-11-24} - s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} - s.email = %q{helma@in-silico.ch} - s.executables = ["opentox-install-ubuntu.sh", "yaml2owl.rb", "opentox-install-debian.sh"] - s.extra_rdoc_files = [ - "LICENSE", - "README.rdoc" - ] - s.files = [ - "LICENSE", - "README.rdoc", - "Rakefile", - "VERSION", - "bin/opentox-install-debian.sh", - "bin/opentox-install-ubuntu.sh", - "bin/yaml2owl.rb", - "lib/algorithm.rb", - "lib/compound.rb", - "lib/config/config_ru.rb", - "lib/dataset.rb", - "lib/environment.rb", - "lib/feature.rb", - "lib/helper.rb", - "lib/model.rb", - "lib/opentox-ruby-api-wrapper.rb", - "lib/opentox.owl", - "lib/opentox.rb", - "lib/overwrite.rb", - "lib/owl.rb.RDF", - "lib/owl.rb.nt", - "lib/owl.rb.rdfxml.initial", - "lib/owl.rb.redland", - "lib/parser.rb", - "lib/rest_client_wrapper.rb", - "lib/serializer.rb", - "lib/spork.rb", - "lib/task.rb", - "lib/templates/config.yaml", - "lib/validation.rb" - ] - s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} - s.rdoc_options = ["--charset=UTF-8"] - s.require_paths = ["lib"] - s.rubygems_version = %q{1.3.7} - s.summary = %q{Ruby wrapper for the OpenTox REST API} - - if s.respond_to? :specification_version then - current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION - s.specification_version = 3 - - if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 3"]) - s.add_development_dependency(%q, [">= 0"]) - s.add_development_dependency(%q, [">= 0"]) - else - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 3"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - end - else - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 3"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - end -end - diff --git a/opentox-ruby.gemspec b/opentox-ruby.gemspec new file mode 100644 index 0000000..e89af96 --- /dev/null +++ b/opentox-ruby.gemspec @@ -0,0 +1,133 @@ +# Generated by jeweler +# DO NOT EDIT THIS FILE DIRECTLY +# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = %q{opentox-ruby} + s.version = "0.0.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= + s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] + s.date = %q{2010-11-24} + s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} + s.email = %q{helma@in-silico.ch} + s.executables = ["opentox-install-ubuntu.sh", "opentox-install-debian.sh"] + s.extra_rdoc_files = [ + "LICENSE", + "README.rdoc" + ] + s.files = [ + "LICENSE", + "README.rdoc", + "Rakefile", + "VERSION", + "bin/opentox-install-debian.sh", + "bin/opentox-install-ubuntu.sh", + "lib/algorithm.rb", + "lib/compound.rb", + "lib/config/config_ru.rb", + "lib/dataset.rb", + "lib/environment.rb", + "lib/helper.rb", + "lib/model.rb", + "lib/opentox.owl", + "lib/overwrite.rb", + "lib/rest_client_wrapper.rb", + "lib/spork.rb", + "lib/task.rb", + "lib/templates/config.yaml", + "lib/validation.rb" + ] + s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} + s.rdoc_options = ["--charset=UTF-8"] + s.require_paths = ["lib"] + s.rubygems_version = %q{1.3.7} + s.summary = %q{Ruby wrapper for the OpenTox REST API} + + if s.respond_to? :specification_version then + current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION + s.specification_version = 3 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 1"]) + s.add_runtime_dependency(%q, [">= 3"]) + s.add_development_dependency(%q, [">= 0"]) + else + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 3"]) + s.add_dependency(%q, [">= 0"]) + end + else + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 1"]) + s.add_dependency(%q, [">= 3"]) + s.add_dependency(%q, [">= 0"]) + end +end + -- cgit v1.2.3 From b328664155eabd959b8b9cf40a53d9fa8b9efa81 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 30 Nov 2010 12:43:38 +0100 Subject: Version bump to 0.0.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8acdd82..4e379d2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.1 +0.0.2 -- cgit v1.2.3 From 351694975c611999856c722d8cc3ae971811bc7b Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 30 Nov 2010 13:51:06 +0100 Subject: gemspec built --- opentox-ruby.gemspec | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/opentox-ruby.gemspec b/opentox-ruby.gemspec index e89af96..9320dae 100644 --- a/opentox-ruby.gemspec +++ b/opentox-ruby.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby} - s.version = "0.0.1" + s.version = "0.0.2" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] - s.date = %q{2010-11-24} + s.date = %q{2010-11-30} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-ubuntu.sh", "opentox-install-debian.sh"] @@ -29,17 +29,22 @@ Gem::Specification.new do |s| "lib/config/config_ru.rb", "lib/dataset.rb", "lib/environment.rb", + "lib/feature.rb", "lib/helper.rb", "lib/model.rb", + "lib/opentox-ruby.rb", "lib/opentox.owl", + "lib/opentox.rb", "lib/overwrite.rb", + "lib/parser.rb", "lib/rest_client_wrapper.rb", + "lib/serializer.rb", "lib/spork.rb", "lib/task.rb", "lib/templates/config.yaml", "lib/validation.rb" ] - s.homepage = %q{http://github.com/helma/opentox-ruby-api-wrapper} + s.homepage = %q{http://github.com/helma/opentox-ruby} s.rdoc_options = ["--charset=UTF-8"] s.require_paths = ["lib"] s.rubygems_version = %q{1.3.7} @@ -63,6 +68,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) @@ -89,6 +95,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) @@ -116,6 +123,7 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) -- cgit v1.2.3 From 64e5d2890f42cef112fbe768f6bfd54b746686de Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 3 Dec 2010 14:37:09 +0100 Subject: underscore method added to String class --- lib/compound.rb | 6 ++++++ lib/overwrite.rb | 44 ++++++++++++++++++++++++++------------------ 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 6834860..a85507b 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -68,6 +68,12 @@ module OpenTox c end + # Get InChI + # @return [String] InChI string + def to_inchi + @inchi + end + # Get (canonical) smiles # @return [String] Smiles string def to_smiles diff --git a/lib/overwrite.rb b/lib/overwrite.rb index f39fec3..8d787a6 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -13,26 +13,34 @@ class Sinatra::Base end class String - def task_uri? - self.uri? && !self.match(/task/).nil? - end - - def dataset_uri? - self.uri? && !self.match(/dataset/).nil? - end - - def self.model_uri? - self.uri? && !self.match(/model/).nil? - end + def task_uri? + self.uri? && !self.match(/task/).nil? + end + + def dataset_uri? + self.uri? && !self.match(/dataset/).nil? + end + + def self.model_uri? + self.uri? && !self.match(/model/).nil? + end - def uri? - begin - u = URI::parse(self) - return (u.scheme!=nil and u.host!=nil) - rescue URI::InvalidURIError - return false - end + def uri? + begin + u = URI::parse(self) + return (u.scheme!=nil and u.host!=nil) + rescue URI::InvalidURIError + return false end + end + + def underscore + self.gsub(/::/, '/'). + gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). + gsub(/([a-z\d])([A-Z])/,'\1_\2'). + tr("-", "_"). + downcase + end end require 'logger' -- cgit v1.2.3 From bb99bb49636db1d3f07b6f540dc8624a677ade2f Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 6 Dec 2010 12:09:06 +0100 Subject: insert basic a&a libs to development branch --- lib/authorization.rb | 291 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib/environment.rb | 2 + lib/helper.rb | 72 ++++++++++--- lib/opentox-ruby.rb | 2 +- lib/policy.rb | 242 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 592 insertions(+), 17 deletions(-) create mode 100644 lib/authorization.rb create mode 100644 lib/policy.rb diff --git a/lib/authorization.rb b/lib/authorization.rb new file mode 100644 index 0000000..0cba96a --- /dev/null +++ b/lib/authorization.rb @@ -0,0 +1,291 @@ +module OpenTox + + #Module for Authorization and Authentication + #@example Authentication + # require "opentox-ruby-api-wrapper" + # OpenTox::Authorization::AA_SERVER = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml + # token = OpenTox::Authorization.authenticate("benutzer", "passwort") + #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification + + module Authorization + + #Helper Class AA to create and send default policies out of xml templates + #@example Creating a default policy to a URI + # aa=OpenTox::Authorization::AA.new(tok) + # xml=aa.get_xml('http://uri....') + # OpenTox::Authorization.create_policy(xml,tok) + + class AA + attr_accessor :user, :token_id, :policy + + #Generates AA object - requires token_id + # @param [String] token_id + def initialize(token_id) + @user = Authorization.get_user(token_id) + @token_id = token_id + @policy = Policies.new() + end + + #Cleans AA Policies and loads default xml file into policy attribute + #set uri and user, returns Policyfile(XML) for open-sso + # @param [String] URI to create a policy for + def get_xml(uri) + @policy.drop_policies + @policy.load_default_policy(@user, uri) + return @policy.to_xml + end + + #Loads and sends Policyfile(XML) to open-sso server + # @param [String] URI to create a policy for + def send(uri) + xml = get_xml(uri) + ret = false + ret = Authorization.create_policy(xml, @token_id) + LOGGER.debug "Policy send with token_id: #{@token_id}" + LOGGER.warn "Not created Policy is: #{xml}" if !ret + ret + end + + end + + #Returns the open-sso server set in the config file .opentox/config/[environment].yaml + # @return [String, nil] the openSSO server URI or nil + def self.server + return AA_SERVER + end + + #Authentication against OpenSSO. Returns token. Requires Username and Password. + # @param [String, String]Username,Password + # @return [String, nil] gives token_id or nil + def self.authenticate(user, pw) + return true if !AA_SERVER + begin + resource = RestClient::Resource.new("#{AA_SERVER}/auth/authenticate") + out = resource.post(:username=>user, :password => pw).sub("token.id=","").sub("\n","") + return out + rescue + return nil + end + end + + #Logout on opensso. Make token invalid. Requires token + # @param [String]token_id the token_id + # @return [Boolean] true if logout is OK + def self.logout(token_id) + begin + resource = RestClient::Resource.new("#{AA_SERVER}/auth/logout") + resource.post(:subjectid => token_id) + return true + rescue + return false + end + end + + #Authorization against OpenSSO for a URI with request-method (action) [GET/POST/PUT/DELETE] + # @param [String,String,String]uri,action,token_id + # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). + def self.authorize(uri, action, token_id) + return true if !AA_SERVER + begin + resource = RestClient::Resource.new("#{AA_SERVER}/auth/authorize") + return true if resource.post(:uri => uri, :action => action, :subjectid => token_id) == "boolean=true\n" + rescue + return nil + end + end + + #Checks if a token is a valid token + # @param [String]token_id token_id from openSSO session + # @return [Boolean] token_id is valid or not. + def self.is_token_valid(token_id) + return true if !AA_SERVER + begin + resource = RestClient::Resource.new("#{AA_SERVER}/auth/isTokenValid") + return true if resource.post(:tokenid => token_id) == "boolean=true\n" + rescue + return false + end + end + + #Returns array with all policies of the token owner + # @param [String]token_id requires token_id + # @return [Array, nil] returns an Array of policy names or nil if request fails + def self.list_policies(token_id) + begin + resource = RestClient::Resource.new("#{AA_SERVER}/pol") + out = resource.get(:subjectid => token_id) + return out.split("\n") + rescue + return nil + end + end + + #Returns a policy in xml-format + # @param [String, String]policy,token_id + # @return [String] XML of the policy + def self.list_policy(policy, token_id) + begin + resource = RestClient::Resource.new("#{AA_SERVER}/pol") + return resource.get(:subjectid => token_id,:id => policy) + rescue + return nil + end + end + + #Returns the owner (who created the first policy) of an URI + # @param [String, String]uri,token_id + # return [String, nil]owner,nil returns owner of the URI + def self.get_uri_owner(uri, token_id) + begin + resource = RestClient::Resource.new("#{AA_SERVER}/pol") + return resource.get(:uri => uri, :subjectid => token_id).sub("\n","") + rescue + return nil + end + end + + #Checks if a policy exists to a URI. Requires URI and token. + # @param [String, String]uri,token_id + # return [Boolean] + def self.uri_has_policy(uri, token_id) + owner = get_uri_owner(uri, token_id) + return true if owner and owner != "null" + false + end + + #List all policynames for a URI. Requires URI and token. + # @param [String, String]uri,token_id + # return [Array, nil] returns an Array of policy names or nil if request fails + def self.list_uri_policies(uri, token_id) + begin + resource = RestClient::Resource.new("#{AA_SERVER}/pol") + out = resource.get(:uri => uri, :polnames => true, :subjectid => token_id) + policies = []; notfirstline = false + out.split("\n").each do |line| + policies << line if notfirstline + notfirstline = true + end + return policies + rescue + return nil + end + end + + #Sends a policy in xml-format to opensso server. Requires policy-xml and token. + # @param [String, String]policyxml,token_id + # return [Boolean] returns true if policy is created + def self.create_policy(policy, token_id) + begin +# resource = RestClient::Resource.new("#{AA_SERVER}/Pol/opensso-pol") + LOGGER.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + token_id.to_s + " length: " + token_id.length.to_s +# return true if resource.post(policy, :subjectid => token_id, :content_type => "application/xml") + return true if RestClientWrapper.post("#{AA_SERVER}/pol", {:subjectid => token_id, :content_type => "application/xml"}, policy) + rescue + return false + end + end + + #Deletes a policy + # @param [String, String]policyname,token_id + # @return [Boolean,nil] + def self.delete_policy(policy, token_id) + begin + resource = RestClient::Resource.new("#{AA_SERVER}/pol") + LOGGER.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{token_id}" + return true if resource.delete(:subjectid => token_id, :id => policy) + rescue + return nil + end + end + + #Returns array of all possible LDAP-Groups + # @param [String]token_id + # @return [Array] + def self.list_groups(token_id) + begin + resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/search") + grps = resource.post(:admin => token_id, :attributes_names => "objecttype", :attributes_values_objecttype => "group") + grps.split("\n").collect{|x| x.sub("string=","")} + rescue + [] + end + end + + #Returns array of the LDAP-Groups of an user + # @param [String]token_id + # @return [Array] gives array of LDAP groups of a user + def self.list_user_groups(user, token_id) + begin + resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/read") + out = resource.post(:name => user, :admin => token_id, :attributes_names => "group") + grps = [] + out.split("\n").each do |line| + grps << line.sub("identitydetails.group=","") if line.include?("identitydetails.group=") + end + return grps + rescue + [] + end + end + + #Returns the owner (user id) of a token + # @param [String]token_id + # @return [String]user + def self.get_user(token_id) + begin + resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/attributes") + out = resource.post(:subjectid => token_id, :attributes_names => "uid") + user = ""; check = false + out.split("\n").each do |line| + if check + user = line.sub("userdetails.attribute.value=","") if line.include?("userdetails.attribute.value=") + check = false + end + check = true if line.include?("userdetails.attribute.name=uid") + end + return user + rescue + nil + end + end + + #Send default policy with Authorization::AA class + # @param [String, String]URI,token_id + def self.send_policy(uri, token_id) + return true if !AA_SERVER + aa = Authorization::AA.new(token_id) + ret = aa.send(uri) + LOGGER.debug "OpenTox::Authorization send policy for URI: #{uri} | token_id: #{token_id} - policy created: #{ret}" + ret + end + + #Deletes all policies of an URI + # @param [String, String]URI,token_id + # @return [Boolean] + def self.delete_policies_from_uri(uri, token_id) + policies = list_uri_policies(uri, token_id) + policies.each do |policy| + ret = delete_policy(policy, token_id) + LOGGER.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" + end + return true + end + + #Checks (if token_id is valid) if a policy exist and create default policy if not + def self.check_policy(uri, token_id) + token_valid = OpenTox::Authorization.is_token_valid(token_id) + LOGGER.debug "OpenTox::Authorization.check_policy with uri: #{uri}, token_id: #{token_id} is valid: #{token_valid}" + if uri and token_valid + if !uri_has_policy(uri, token_id) + return send_policy(uri, token_id) + else + LOGGER.debug "OpenTox::Authorization.check_policy URI: #{uri} has already a Policy." + end + end + true + end + + end +end + + diff --git a/lib/environment.rb b/lib/environment.rb index 4f1cc80..1761d92 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -83,6 +83,8 @@ class OwlNamespace end +AA_SERVER = CONFIG[:authorization] ? (CONFIG[:authorization][:server] ? CONFIG[:authorization][:server] : nil) : nil + RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' OWL = OwlNamespace.new 'http://www.w3.org/2002/07/owl#' DC = OwlNamespace.new 'http://purl.org/dc/elements/1.1/' diff --git a/lib/helper.rb b/lib/helper.rb index a9f451e..b69f9b4 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -1,26 +1,66 @@ helpers do # Authentification - def protected! - response['WWW-Authenticate'] = %(Basic realm="Testing HTTP Auth") and \ + def protected!(token_id) + if env["session"] + flash[:notice] = "You don't have access to this section: " and \ + redirect back and \ + return unless authorized?(token_id) + end throw(:halt, [401, "Not authorized\n"]) and \ - return unless authorized? + return unless authorized?(token_id) end - - def authorized? - @auth ||= Rack::Auth::Basic::Request.new(request.env) - @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ['api', API_KEY] + + def authorized?(token_id) + case request.env['REQUEST_METHOD'] + when "DELETE", "PUT" + ret = OpenTox::Authorization.authorize(request.env['SCRIPT_URI'], request.env['REQUEST_METHOD'], token_id) + LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['SCRIPT_URI']}, token_id: #{token_id} with return #{ret}." + return ret + when "POST" + if OpenTox::Authorization.is_token_valid(token_id) + LOGGER.debug "OpenTox helpers OpenTox::Authorization.is_token_valid: true" + return true + end + LOGGER.warn "OpenTox helpers POST on #{request.env['SCRIPT_URI']} with token_id: #{token_id} false." + end + LOGGER.debug "Not authorized for: 1. #{request['SCRIPT_URI']} 2. #{request.env['SCRIPT_URI']} with Method: #{request.env['REQUEST_METHOD']} with Token #{token_id}" + LOGGER.debug "Request infos: #{request.inspect}" + return false end - -=begin - def xml(object) - builder do |xml| - xml.instruct! - object.to_xml - end - end -=end + def unprotected_requests + case env['REQUEST_URI'] + when /\/login$|\/logout$|\/predict$|\/upload$/ + return true + when /\/compound|\/feature|\/task|\/toxcreate/ #to fix: read from config | validation should be protected + return true + else + return false + end + end + + def check_token_id(token_id) + return false if !token_id + return true if token_id.size > 62 + false + end +end +before do + + unless unprotected_requests or env['REQUEST_METHOD'] == "GET" + begin + token_id = session[:token_id] if session[:token_id] + token_id = params[:token_id] if params[:token_id] and !check_token_id(token_id) + token_id = request.env['HTTP_TOKEN_ID'] if request.env['HTTP_TOKEN_ID'] and !check_token_id(token_id) + # see http://rack.rubyforge.org/doc/SPEC.html + rescue + LOGGER.debug "OpenTox api wrapper: helper before filter: NO token_id." + token_id = "" + end + protected!(token_id) if AA_SERVER + end + end diff --git a/lib/opentox-ruby.rb b/lib/opentox-ruby.rb index 9f9ff26..c0bff95 100644 --- a/lib/opentox-ruby.rb +++ b/lib/opentox-ruby.rb @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper'].each do |lib| +['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper', 'authorization', 'policy', 'helper'].each do |lib| require lib end diff --git a/lib/policy.rb b/lib/policy.rb new file mode 100644 index 0000000..0ef8298 --- /dev/null +++ b/lib/policy.rb @@ -0,0 +1,242 @@ +module OpenTox + require "rexml/document" + + #Module for policy-processing + # @see also http://www.opentox.org/dev/apis/api-1.2/AA for opentox API specs + # Class Policies corresponds to container of an xml-policy-fle + class Policies + + attr_accessor :name, :policies + + def initialize() + @policies = {} + end + + #create new policy instance with name + # @param [String]name of the policy + def new_policy(name) + @policies[name] = Policy.new(name) + end + + #drop a specific policy in a policies instance + # @param [String]name of the policy + # @return [Boolean] + def drop_policy(name) + return true if @policies.delete(name) + end + + #drop all policies in a policies instance + def drop_policies + @policies.each do |name, policy| + drop_policy(name) + end + return true + end + + #loads a default policy template in policies instance + def load_default_policy(user, uri, group="member") + template = case user + when "guest", "anonymous" then "default_guest_policy" + else "default_policy" + end + xml = File.read(File.join(File.dirname(__FILE__), "templates/#{template}.xml")) + self.load_xml(xml) + datestring = Time.now.strftime("%Y-%m-%d-%H-%M-%S-x") + rand(1000).to_s + + @policies["policy_user"].name = "policy_user_#{user}_#{datestring}" + @policies["policy_user"].rules["rule_user"].uri = uri + @policies["policy_user"].rules["rule_user"].name = "rule_user_#{user}_#{datestring}" + @policies["policy_user"].subjects["subject_user"].name = "subject_user_#{user}_#{datestring}" + @policies["policy_user"].subjects["subject_user"].value = "uid=#{user},ou=people,dc=opentox,dc=org" + @policies["policy_user"].subject_group = "subjects_user_#{user}_#{datestring}" + + @policies["policy_group"].name = "policy_group_#{group}_#{datestring}" + @policies["policy_group"].rules["rule_group"].uri = uri + @policies["policy_group"].rules["rule_group"].name = "rule_group_#{group}_#{datestring}" + @policies["policy_group"].subjects["subject_group"].name = "subject_group_#{group}_#{datestring}" + @policies["policy_group"].subjects["subject_group"].value = "cn=#{group},ou=groups,dc=opentox,dc=org" + @policies["policy_group"].subject_group = "subjects_#{group}_#{datestring}" + return true + end + + #loads a xml template + def load_xml(xml) + rexml = REXML::Document.new(xml) + rexml.elements.each("Policies/Policy") do |pol| #Policies + policy_name = pol.attributes["name"] + new_policy(policy_name) + #@policies[policy_name] = Policy.new(policy_name) + rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Rule") do |r| #Rules + rule_name = r.attributes["name"] + uri = rexml.elements["Policies/Policy[@name='#{policy_name}']/Rule[@name='#{rule_name}']/ResourceName"].attributes["name"] + @policies[policy_name].rules[rule_name] = @policies[policy_name].new_rule(rule_name, uri) + rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Rule[@name='#{rule_name}']/AttributeValuePair") do |attribute_pairs| + action=nil; value=nil; + attribute_pairs.each_element do |elem| + action = elem.attributes["name"] if elem.attributes["name"] + value = elem.text if elem.text + end + if action and value + case action + when "GET" + @policies[policy_name].rules[rule_name].get = value + when "POST" + @policies[policy_name].rules[rule_name].post = value + when "PUT" + @policies[policy_name].rules[rule_name].put = value + when "DELETE" + @policies[policy_name].rules[rule_name].delete = value + end + end + end + end + rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Subjects") do |subjects| #Subjects + @policies[policy_name].subject_group = subjects.attributes["name"] + rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Subjects[@name='#{@policies[policy_name].subject_group}']/Subject") do |s| #Subject + subject_name = s.attributes["name"] + subject_type = s.attributes["type"] + subject_value = rexml.elements["Policies/Policy[@name='#{policy_name}']/Subjects[@name='#{@policies[policy_name].subject_group}']/Subject[@name='#{subject_name}']/AttributeValuePair/Value"].text + @policies[policy_name].new_subject(subject_name, subject_type, subject_value) if subject_name and subject_type and subject_value + end + end + end + end + + #generates xml from policies instance + def to_xml + doc = REXML::Document.new() + doc << REXML::DocType.new("Policies", "PUBLIC \"-//Sun Java System Access Manager7.1 2006Q3\n Admin CLI DTD//EN\" \"jar://com/sun/identity/policy/policyAdmin.dtd\"") + doc.add_element(REXML::Element.new("Policies")) + + @policies.each do |name, pol| + policy = REXML::Element.new("Policy") + policy.attributes["name"] = pol.name + policy.attributes["referralPolicy"] = false + policy.attributes["active"] = true + @policies[name].rules.each do |r,rl| + rule = @policies[name].rules[r] + out_rule = REXML::Element.new("Rule") + out_rule.attributes["name"] = rule.name + servicename = REXML::Element.new("ServiceName") + servicename.attributes["name"]="iPlanetAMWebAgentService" + out_rule.add_element(servicename) + rescourcename = REXML::Element.new("ResourceName") + rescourcename.attributes["name"] = rule.uri + out_rule.add_element(rescourcename) + + ["get","post","delete","put"].each do |act| + if rule.method(act).call + attribute = REXML::Element.new("Attribute") + attribute.attributes["name"] = act.upcase + attributevaluepair = REXML::Element.new("AttributeValuePair") + attributevaluepair.add_element(attribute) + attributevalue = REXML::Element.new("Value") + attributevaluepair.add_element(attributevalue) + attributevalue.add_text REXML::Text.new(rule.method(act).call) + out_rule.add_element(attributevaluepair) + + end + end + policy.add_element(out_rule) + end + + subjects = REXML::Element.new("Subjects") + subjects.attributes["name"] = pol.subject_group + subjects.attributes["description"] = "" + @policies[name].subjects.each do |subj, subjs| + subject = REXML::Element.new("Subject") + subject.attributes["name"] = pol.subjects[subj].name + subject.attributes["type"] = pol.subjects[subj].type + subject.attributes["includeType"] = "inclusive" + attributevaluepair = REXML::Element.new("AttributeValuePair") + attribute = REXML::Element.new("Attribute") + attribute.attributes["name"] = "Values" + attributevaluepair.add_element(attribute) + attributevalue = REXML::Element.new("Value") + attributevalue.add_text REXML::Text.new(pol.subjects[subj].value) + attributevaluepair.add_element(attributevalue) + subject.add_element(attributevaluepair) + subjects.add_element(subject) + end + policy.add_element(subjects) + doc.root.add_element(policy) + end + out = "" + doc.write(out, 2) + return out + end + + end + + #single policy in a policies instance + class Policy + + attr_accessor :name, :rules, :subject_group, :subjects + + def initialize(name) + @name = name + @rules = {} + @subject_group = "" + @subjects = {} + end + + #create a new rule instance for the policy + def new_rule(name, uri) + @rules[name] = Rule.new(name, uri) + end + + #create a new subject instance for the policy + def new_subject(name, type, value) + @subjects[name] = Subject.new(name, type, value) + end + + #rule inside a policy + class Rule + + attr_accessor :name, :uri, :get, :post, :put, :delete + + def initialize(name, uri) + @name = name + @uri = uri + end + + def rename(new, old) + self[new] = self.delete(old) + self[new].name = new + end + + def get=(value) + @get = check_value(value, @get) + end + + def post=(value) + @post = check_value(value, @post) + end + + def delete=(value) + @delete = check_value(value, @delete) + end + + def put=(value) + @put = check_value(value, @put) + end + + private + #checks if value is allow or deny. returns old value if not valid. + def check_value(new_value, old_value) + return (new_value=="allow" || new_value=="deny" || new_value==nil) ? new_value : old_value + end + end + + class Subject + + attr_accessor :name, :type, :value + + def initialize(name, type, value) + @name = name + @type = type + @value = value + end + end + end +end \ No newline at end of file -- cgit v1.2.3 From c4504c72ffb2920de65399a2dc0a2c29fe04a52d Mon Sep 17 00:00:00 2001 From: mr Date: Thu, 9 Dec 2010 10:46:13 +0100 Subject: A&A implementation --- lib/dataset.rb | 12 +++++--- lib/helper.rb | 4 +-- lib/model.rb | 4 +-- lib/templates/default_guest_policy.xml | 53 ++++++++++++++++++++++++++++++++++ lib/templates/default_policy.xml | 53 ++++++++++++++++++++++++++++++++++ 5 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 lib/templates/default_guest_policy.xml create mode 100644 lib/templates/default_policy.xml diff --git a/lib/dataset.rb b/lib/dataset.rb index c5704ae..bbd8b8b 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -6,6 +6,7 @@ module OpenTox include OpenTox attr_reader :features, :compounds, :data_entries, :metadata + attr_accessor :token_id # Create dataset with optional URI. Does not load data into the dataset - you will need to execute one of the load_* methods to pull data from a service or to insert it from other representations. # @example Create an empty dataset @@ -14,8 +15,9 @@ module OpenTox # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") # @param [optional, String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object - def initialize(uri=nil) + def initialize(uri=nil,token_id=nil) super uri + @token_id = token_id @features = {} @compounds = [] @data_entries = {} @@ -26,8 +28,9 @@ module OpenTox # dataset = OpenTox::Dataset.create # @param [optional, String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object - def self.create(uri=CONFIG[:services]["opentox-dataset"]) + def self.create(uri=CONFIG[:services]["opentox-dataset"], token_id=nil) dataset = Dataset.new + dataset.token_id = token_id if token_id dataset.save dataset end @@ -252,7 +255,7 @@ module OpenTox @compounds.uniq! if @uri if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) + RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :token_id => @token_id},self.to_yaml) else File.open("ot-post-file.rdf","w+") { |f| f.write(self.to_rdfxml); @path = f.path } task_uri = RestClient.post(@uri, {:file => File.new(@path)},{:accept => "text/uri-list"}).to_s.chomp @@ -262,7 +265,7 @@ module OpenTox end else # create dataset if uri is empty - self.uri = RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{}).to_s.chomp + self.uri = RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{:token_id => @token_id}).to_s.chomp end @uri end @@ -279,6 +282,7 @@ module OpenTox @data_entries = dataset.data_entries @compounds = dataset.compounds @features = dataset.features + @token_id = dataset.token_id if @uri self.uri = @uri else diff --git a/lib/helper.rb b/lib/helper.rb index b69f9b4..11f790b 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -17,7 +17,7 @@ helpers do ret = OpenTox::Authorization.authorize(request.env['SCRIPT_URI'], request.env['REQUEST_METHOD'], token_id) LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['SCRIPT_URI']}, token_id: #{token_id} with return #{ret}." return ret - when "POST" + when "POST", "HEAD" if OpenTox::Authorization.is_token_valid(token_id) LOGGER.debug "OpenTox helpers OpenTox::Authorization.is_token_valid: true" return true @@ -25,7 +25,6 @@ helpers do LOGGER.warn "OpenTox helpers POST on #{request.env['SCRIPT_URI']} with token_id: #{token_id} false." end LOGGER.debug "Not authorized for: 1. #{request['SCRIPT_URI']} 2. #{request.env['SCRIPT_URI']} with Method: #{request.env['REQUEST_METHOD']} with Token #{token_id}" - LOGGER.debug "Request infos: #{request.inspect}" return false end @@ -55,6 +54,7 @@ before do token_id = params[:token_id] if params[:token_id] and !check_token_id(token_id) token_id = request.env['HTTP_TOKEN_ID'] if request.env['HTTP_TOKEN_ID'] and !check_token_id(token_id) # see http://rack.rubyforge.org/doc/SPEC.html + token_id = CGI.unescape(token_id) if token_id.include?("%23") rescue LOGGER.debug "OpenTox api wrapper: helper before filter: NO token_id." token_id = "" diff --git a/lib/model.rb b/lib/model.rb index 5654bcc..5dc4d4a 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -32,7 +32,7 @@ module OpenTox include Model include Algorithm - attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm, :min_sim + attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm, :min_sim, :token_id def initialize(uri=nil) @@ -258,7 +258,7 @@ module OpenTox # Save model at model service def save - self.uri = RestClientWrapper.post(@uri,{:content_type => "application/x-yaml"},self.to_yaml) + self.uri = RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :token_id => @token_id},self.to_yaml) end # Delete model at model service diff --git a/lib/templates/default_guest_policy.xml b/lib/templates/default_guest_policy.xml new file mode 100644 index 0000000..a778070 --- /dev/null +++ b/lib/templates/default_guest_policy.xml @@ -0,0 +1,53 @@ + + + + + + + + + + allow + + + + allow + + + + allow + + + + allow + + + + + + + uid=guest,ou=people,dc=opentox,dc=org + + + + + + + + + + + allow + + + + + + + cn=member,ou=groups,dc=opentox,dc=org + + + + + diff --git a/lib/templates/default_policy.xml b/lib/templates/default_policy.xml new file mode 100644 index 0000000..a778070 --- /dev/null +++ b/lib/templates/default_policy.xml @@ -0,0 +1,53 @@ + + + + + + + + + + allow + + + + allow + + + + allow + + + + allow + + + + + + + uid=guest,ou=people,dc=opentox,dc=org + + + + + + + + + + + allow + + + + + + + cn=member,ou=groups,dc=opentox,dc=org + + + + + -- cgit v1.2.3 From 3dd413a79d8ef32c8bf0426228e34d87bdcd5a6b Mon Sep 17 00:00:00 2001 From: mr Date: Thu, 9 Dec 2010 10:47:28 +0100 Subject: Ontology Service with Endpoint-option-list from http://apps.ideaconsult.net:8080/ontology --- lib/ontology_service.rb | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 lib/ontology_service.rb diff --git a/lib/ontology_service.rb b/lib/ontology_service.rb new file mode 100644 index 0000000..4ff688f --- /dev/null +++ b/lib/ontology_service.rb @@ -0,0 +1,43 @@ +module OpenTox + module OntologyService + module Endpoints + require 'sparql/client' + @sparql = SPARQL::Client.new("http://apps.ideaconsult.net:8080/ontology") + def self.qs(classname="Endpoints") + return "PREFIX ot: + PREFIX ota: + PREFIX owl: + PREFIX dc: + PREFIX rdfs: + PREFIX rdf: + PREFIX otee: + PREFIX toxcast: + select ?Endpoints ?title ?id + where {?Endpoints rdfs:subClassOf otee:#{classname}. + OPTIONAL {?Endpoints dc:title ?title}. + OPTIONAL {?Endpoints dc:identifier ?id}.} + ORDER BY ?title" + end + + def self.make_option_list(endpoint="Endpoints", level=1) + out = "" + results = @sparql.query(qs(endpoint)) rescue results = [] + results.each do |result| + endpointname = result.Endpoints.to_s.split('#').last + title = result.bound?(:title) ? result.title : endpointname + out += "\n" + out += make_option_list(endpointname, level + 1) + end + return out + end + + def self.get_endpoint_selectlist(include_blank=true) + out = "\n" + return out + end + end + end +end \ No newline at end of file -- cgit v1.2.3 From de12a8002ebc0bf4018588deafd5057b6478f414 Mon Sep 17 00:00:00 2001 From: mr Date: Fri, 10 Dec 2010 17:19:35 +0100 Subject: A&A configuration options / request script_uri replaced --- lib/helper.rb | 40 ++++++++++++++++++++-------------------- lib/templates/config.yaml | 13 +++++++++++++ 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/lib/helper.rb b/lib/helper.rb index 11f790b..6247460 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -1,30 +1,32 @@ helpers do - # Authentification + # Authentification def protected!(token_id) - if env["session"] + if env["session"] flash[:notice] = "You don't have access to this section: " and \ redirect back and \ return unless authorized?(token_id) + elsif !env["session"] && token_id + throw(:halt, [401, "Not authorized.\n"]) and \ + redirect back and \ + return unless authorized?(token_id) end - throw(:halt, [401, "Not authorized\n"]) and \ + throw(:halt, [401, "Not authorized.\n"]) and \ return unless authorized?(token_id) end - + def authorized?(token_id) - case request.env['REQUEST_METHOD'] - when "DELETE", "PUT" - ret = OpenTox::Authorization.authorize(request.env['SCRIPT_URI'], request.env['REQUEST_METHOD'], token_id) - LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['SCRIPT_URI']}, token_id: #{token_id} with return #{ret}." + if CONFIG[:authorization][:authorize_request].include?(request.env['REQUEST_METHOD']) + ret = OpenTox::Authorization.authorize("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}", request.env['REQUEST_METHOD'], token_id) + LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, token_id: #{token_id} with return #{ret}." return ret - when "POST", "HEAD" + end + if CONFIG[:authorization][:authenticate_request].include?(env['REQUEST_METHOD']) if OpenTox::Authorization.is_token_valid(token_id) - LOGGER.debug "OpenTox helpers OpenTox::Authorization.is_token_valid: true" return true end - LOGGER.warn "OpenTox helpers POST on #{request.env['SCRIPT_URI']} with token_id: #{token_id} false." - end - LOGGER.debug "Not authorized for: 1. #{request['SCRIPT_URI']} 2. #{request.env['SCRIPT_URI']} with Method: #{request.env['REQUEST_METHOD']} with Token #{token_id}" + end + LOGGER.debug "Not authorized for: #{request.env['rack.url_scheme']}://#{request['REQUEST_URI']} with Method: #{request.env['REQUEST_METHOD']} with Token #{token_id}" return false end @@ -32,7 +34,7 @@ helpers do case env['REQUEST_URI'] when /\/login$|\/logout$|\/predict$|\/upload$/ return true - when /\/compound|\/feature|\/task|\/toxcreate/ #to fix: read from config | validation should be protected + when /\/compound|\/feature|\/task|\/toxcreate/ #to fix: read from config | validation should be protected return true else return false @@ -43,24 +45,22 @@ helpers do return false if !token_id return true if token_id.size > 62 false - end + end end before do - - unless unprotected_requests or env['REQUEST_METHOD'] == "GET" + unless unprotected_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) begin token_id = session[:token_id] if session[:token_id] token_id = params[:token_id] if params[:token_id] and !check_token_id(token_id) token_id = request.env['HTTP_TOKEN_ID'] if request.env['HTTP_TOKEN_ID'] and !check_token_id(token_id) # see http://rack.rubyforge.org/doc/SPEC.html - token_id = CGI.unescape(token_id) if token_id.include?("%23") + token_id = CGI.unescape(token_id) if token_id.include?("%23") rescue - LOGGER.debug "OpenTox api wrapper: helper before filter: NO token_id." + LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO token_id." token_id = "" end protected!(token_id) if AA_SERVER end - end diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index 00c00cb..db11006 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -39,3 +39,16 @@ # Uncomment for verbose logging # :logger: debug + +# OpenSSO Authorization +# set ":server: nil" to disable A&A +:authorization: + :server: "https://opensso.in-silico.ch" + :free_request: #not controlled by A&A + - "GET" + :authenticate_request: #only for authenticated user + - "POST" + :authorize_request: #only for authenticated and authorizeduser + - "DELETE" + - "PUT" + \ No newline at end of file -- cgit v1.2.3 From 4c2470353a1e3b69b4260d0052c9c48137ef76d3 Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 14 Dec 2010 12:30:20 +0100 Subject: remove token_id from tables in database --- lib/dataset.rb | 16 ++++++---------- lib/helper.rb | 2 +- lib/model.rb | 10 +++++----- lib/task.rb | 1 + lib/templates/config.yaml | 2 +- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index bbd8b8b..b7feeec 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -6,7 +6,6 @@ module OpenTox include OpenTox attr_reader :features, :compounds, :data_entries, :metadata - attr_accessor :token_id # Create dataset with optional URI. Does not load data into the dataset - you will need to execute one of the load_* methods to pull data from a service or to insert it from other representations. # @example Create an empty dataset @@ -15,9 +14,8 @@ module OpenTox # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") # @param [optional, String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object - def initialize(uri=nil,token_id=nil) + def initialize(uri=nil) super uri - @token_id = token_id @features = {} @compounds = [] @data_entries = {} @@ -30,8 +28,7 @@ module OpenTox # @return [OpenTox::Dataset] Dataset object def self.create(uri=CONFIG[:services]["opentox-dataset"], token_id=nil) dataset = Dataset.new - dataset.token_id = token_id if token_id - dataset.save + dataset.save(token_id) dataset end @@ -250,22 +247,22 @@ module OpenTox # - creates a new dataset if uri is not set # - overwrites dataset if uri exists # @return [String] Dataset URI - def save + def save(token_id=nil) # TODO: rewrite feature URI's ?? @compounds.uniq! if @uri if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :token_id => @token_id},self.to_yaml) + RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :token_id => token_id},self.to_yaml) else File.open("ot-post-file.rdf","w+") { |f| f.write(self.to_rdfxml); @path = f.path } - task_uri = RestClient.post(@uri, {:file => File.new(@path)},{:accept => "text/uri-list"}).to_s.chomp + task_uri = RestClient.post(@uri, {:file => File.new(@path)},{:accept => "text/uri-list" , :token_id => token_id}).to_s.chomp #task_uri = `curl -X POST -H "Accept:text/uri-list" -F "file=@#{@path};type=application/rdf+xml" http://apps.ideaconsult.net:8080/ambit2/dataset` Task.find(task_uri).wait_for_completion self.uri = RestClientWrapper.get(task_uri,:accept => 'text/uri-list') end else # create dataset if uri is empty - self.uri = RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{:token_id => @token_id}).to_s.chomp + self.uri = RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{:token_id => token_id}).to_s.chomp end @uri end @@ -282,7 +279,6 @@ module OpenTox @data_entries = dataset.data_entries @compounds = dataset.compounds @features = dataset.features - @token_id = dataset.token_id if @uri self.uri = @uri else diff --git a/lib/helper.rb b/lib/helper.rb index 6247460..42c35e8 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -32,7 +32,7 @@ helpers do def unprotected_requests case env['REQUEST_URI'] - when /\/login$|\/logout$|\/predict$|\/upload$/ + when /\/login$|\/logout$|\/predict$|\/toxcreate\/models$/ return true when /\/compound|\/feature|\/task|\/toxcreate/ #to fix: read from config | validation should be protected return true diff --git a/lib/model.rb b/lib/model.rb index 5dc4d4a..9c2fb97 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -111,7 +111,7 @@ module OpenTox # @param [String] compound_uri Compound URI # @param [optinal,Boolean] verbose Verbose prediction (output includes neighbors and features) # @return [OpenTox::Dataset] Dataset with prediction - def predict(compound_uri,verbose=false) + def predict(compound_uri,verbose=false,token_id=nil) @compound = Compound.new compound_uri features = {} @@ -119,7 +119,7 @@ module OpenTox unless @prediction_dataset #@prediction_dataset = cached_prediction #return @prediction_dataset if cached_prediction - @prediction_dataset = Dataset.create + @prediction_dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], token_id) @prediction_dataset.add_metadata( { OT.hasSource => @uri, DC.creator => @uri, @@ -217,7 +217,7 @@ module OpenTox end end - @prediction_dataset.save + @prediction_dataset.save(token_id) @prediction_dataset end @@ -257,8 +257,8 @@ module OpenTox end # Save model at model service - def save - self.uri = RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :token_id => @token_id},self.to_yaml) + def save(token_id) + self.uri = RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :token_id => token_id},self.to_yaml) end # Delete model at model service diff --git a/lib/task.rb b/lib/task.rb index 17f95e6..18fba6e 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -49,6 +49,7 @@ module OpenTox cpu_load = `cat /proc/loadavg`.split(/\s+/)[0..2].collect{|c| c.to_f} nr_cpu_cores = `cat /proc/cpuinfo |grep "cpu cores"|cut -d ":" -f2|tr -d " "`.split("\n").collect{|c| c.to_i}.inject{|sum,n| sum+n} + nr_cpu_cores = 1 if !nr_cpu_cores if cpu_load[0] > nr_cpu_cores and cpu_load[0] > cpu_load[1] and cpu_load[1] > cpu_load[2] # average CPU load of the last minute is high and CPU load is increasing LOGGER.warn "Cannot start task - CPU load too high (#{cpu_load.join(", ")})" task.cancel diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index db11006..116f462 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -41,7 +41,7 @@ # :logger: debug # OpenSSO Authorization -# set ":server: nil" to disable A&A +# set ":server: " to disable A&A :authorization: :server: "https://opensso.in-silico.ch" :free_request: #not controlled by A&A -- cgit v1.2.3 From 2fb2f4cd34f499f8c9def5e4091cb5998794c595 Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 14 Dec 2010 16:39:01 +0100 Subject: rename token_id to subjectid --- lib/authorization.rb | 132 +++++++++++++++++++++++++-------------------------- lib/dataset.rb | 12 ++--- lib/helper.rb | 40 ++++++++-------- lib/model.rb | 12 ++--- 4 files changed, 98 insertions(+), 98 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 0cba96a..f9499e6 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -16,13 +16,13 @@ module OpenTox # OpenTox::Authorization.create_policy(xml,tok) class AA - attr_accessor :user, :token_id, :policy + attr_accessor :user, :subjectid, :policy - #Generates AA object - requires token_id - # @param [String] token_id - def initialize(token_id) - @user = Authorization.get_user(token_id) - @token_id = token_id + #Generates AA object - requires subjectid + # @param [String] subjectid + def initialize(subjectid) + @user = Authorization.get_user(subjectid) + @subjectid = subjectid @policy = Policies.new() end @@ -40,8 +40,8 @@ module OpenTox def send(uri) xml = get_xml(uri) ret = false - ret = Authorization.create_policy(xml, @token_id) - LOGGER.debug "Policy send with token_id: #{@token_id}" + ret = Authorization.create_policy(xml, @subjectid) + LOGGER.debug "Policy send with subjectid: #{@subjectid}" LOGGER.warn "Not created Policy is: #{xml}" if !ret ret end @@ -56,7 +56,7 @@ module OpenTox #Authentication against OpenSSO. Returns token. Requires Username and Password. # @param [String, String]Username,Password - # @return [String, nil] gives token_id or nil + # @return [String, nil] gives subjectid or nil def self.authenticate(user, pw) return true if !AA_SERVER begin @@ -69,12 +69,12 @@ module OpenTox end #Logout on opensso. Make token invalid. Requires token - # @param [String]token_id the token_id + # @param [String]subjectid the subjectid # @return [Boolean] true if logout is OK - def self.logout(token_id) + def self.logout(subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/auth/logout") - resource.post(:subjectid => token_id) + resource.post(:subjectid => subjectid) return true rescue return false @@ -82,38 +82,38 @@ module OpenTox end #Authorization against OpenSSO for a URI with request-method (action) [GET/POST/PUT/DELETE] - # @param [String,String,String]uri,action,token_id + # @param [String,String,String]uri,action,subjectid # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). - def self.authorize(uri, action, token_id) + def self.authorize(uri, action, subjectid) return true if !AA_SERVER begin resource = RestClient::Resource.new("#{AA_SERVER}/auth/authorize") - return true if resource.post(:uri => uri, :action => action, :subjectid => token_id) == "boolean=true\n" + return true if resource.post(:uri => uri, :action => action, :subjectid => subjectid) == "boolean=true\n" rescue return nil end end #Checks if a token is a valid token - # @param [String]token_id token_id from openSSO session - # @return [Boolean] token_id is valid or not. - def self.is_token_valid(token_id) + # @param [String]subjectid subjectid from openSSO session + # @return [Boolean] subjectid is valid or not. + def self.is_token_valid(subjectid) return true if !AA_SERVER begin resource = RestClient::Resource.new("#{AA_SERVER}/auth/isTokenValid") - return true if resource.post(:tokenid => token_id) == "boolean=true\n" + return true if resource.post(:tokenid => subjectid) == "boolean=true\n" rescue return false end end #Returns array with all policies of the token owner - # @param [String]token_id requires token_id + # @param [String]subjectid requires subjectid # @return [Array, nil] returns an Array of policy names or nil if request fails - def self.list_policies(token_id) + def self.list_policies(subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/pol") - out = resource.get(:subjectid => token_id) + out = resource.get(:subjectid => subjectid) return out.split("\n") rescue return nil @@ -121,45 +121,45 @@ module OpenTox end #Returns a policy in xml-format - # @param [String, String]policy,token_id + # @param [String, String]policy,subjectid # @return [String] XML of the policy - def self.list_policy(policy, token_id) + def self.list_policy(policy, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/pol") - return resource.get(:subjectid => token_id,:id => policy) + return resource.get(:subjectid => subjectid,:id => policy) rescue return nil end end #Returns the owner (who created the first policy) of an URI - # @param [String, String]uri,token_id + # @param [String, String]uri,subjectid # return [String, nil]owner,nil returns owner of the URI - def self.get_uri_owner(uri, token_id) + def self.get_uri_owner(uri, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/pol") - return resource.get(:uri => uri, :subjectid => token_id).sub("\n","") + return resource.get(:uri => uri, :subjectid => subjectid).sub("\n","") rescue return nil end end #Checks if a policy exists to a URI. Requires URI and token. - # @param [String, String]uri,token_id + # @param [String, String]uri,subjectid # return [Boolean] - def self.uri_has_policy(uri, token_id) - owner = get_uri_owner(uri, token_id) + def self.uri_has_policy(uri, subjectid) + owner = get_uri_owner(uri, subjectid) return true if owner and owner != "null" false end #List all policynames for a URI. Requires URI and token. - # @param [String, String]uri,token_id + # @param [String, String]uri,subjectid # return [Array, nil] returns an Array of policy names or nil if request fails - def self.list_uri_policies(uri, token_id) + def self.list_uri_policies(uri, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/pol") - out = resource.get(:uri => uri, :polnames => true, :subjectid => token_id) + out = resource.get(:uri => uri, :polnames => true, :subjectid => subjectid) policies = []; notfirstline = false out.split("\n").each do |line| policies << line if notfirstline @@ -172,39 +172,39 @@ module OpenTox end #Sends a policy in xml-format to opensso server. Requires policy-xml and token. - # @param [String, String]policyxml,token_id + # @param [String, String]policyxml,subjectid # return [Boolean] returns true if policy is created - def self.create_policy(policy, token_id) + def self.create_policy(policy, subjectid) begin # resource = RestClient::Resource.new("#{AA_SERVER}/Pol/opensso-pol") - LOGGER.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + token_id.to_s + " length: " + token_id.length.to_s -# return true if resource.post(policy, :subjectid => token_id, :content_type => "application/xml") - return true if RestClientWrapper.post("#{AA_SERVER}/pol", {:subjectid => token_id, :content_type => "application/xml"}, policy) + LOGGER.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s +# return true if resource.post(policy, :subjectid => subjectid, :content_type => "application/xml") + return true if RestClientWrapper.post("#{AA_SERVER}/pol", {:subjectid => subjectid, :content_type => "application/xml"}, policy) rescue return false end end #Deletes a policy - # @param [String, String]policyname,token_id + # @param [String, String]policyname,subjectid # @return [Boolean,nil] - def self.delete_policy(policy, token_id) + def self.delete_policy(policy, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/pol") - LOGGER.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{token_id}" - return true if resource.delete(:subjectid => token_id, :id => policy) + LOGGER.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" + return true if resource.delete(:subjectid => subjectid, :id => policy) rescue return nil end end #Returns array of all possible LDAP-Groups - # @param [String]token_id + # @param [String]subjectid # @return [Array] - def self.list_groups(token_id) + def self.list_groups(subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/search") - grps = resource.post(:admin => token_id, :attributes_names => "objecttype", :attributes_values_objecttype => "group") + grps = resource.post(:admin => subjectid, :attributes_names => "objecttype", :attributes_values_objecttype => "group") grps.split("\n").collect{|x| x.sub("string=","")} rescue [] @@ -212,12 +212,12 @@ module OpenTox end #Returns array of the LDAP-Groups of an user - # @param [String]token_id + # @param [String]subjectid # @return [Array] gives array of LDAP groups of a user - def self.list_user_groups(user, token_id) + def self.list_user_groups(user, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/read") - out = resource.post(:name => user, :admin => token_id, :attributes_names => "group") + out = resource.post(:name => user, :admin => subjectid, :attributes_names => "group") grps = [] out.split("\n").each do |line| grps << line.sub("identitydetails.group=","") if line.include?("identitydetails.group=") @@ -229,12 +229,12 @@ module OpenTox end #Returns the owner (user id) of a token - # @param [String]token_id + # @param [String]subjectid # @return [String]user - def self.get_user(token_id) + def self.get_user(subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/attributes") - out = resource.post(:subjectid => token_id, :attributes_names => "uid") + out = resource.post(:subjectid => subjectid, :attributes_names => "uid") user = ""; check = false out.split("\n").each do |line| if check @@ -250,34 +250,34 @@ module OpenTox end #Send default policy with Authorization::AA class - # @param [String, String]URI,token_id - def self.send_policy(uri, token_id) + # @param [String, String]URI,subjectid + def self.send_policy(uri, subjectid) return true if !AA_SERVER - aa = Authorization::AA.new(token_id) + aa = Authorization::AA.new(subjectid) ret = aa.send(uri) - LOGGER.debug "OpenTox::Authorization send policy for URI: #{uri} | token_id: #{token_id} - policy created: #{ret}" + LOGGER.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{subjectid} - policy created: #{ret}" ret end #Deletes all policies of an URI - # @param [String, String]URI,token_id + # @param [String, String]URI,subjectid # @return [Boolean] - def self.delete_policies_from_uri(uri, token_id) - policies = list_uri_policies(uri, token_id) + def self.delete_policies_from_uri(uri, subjectid) + policies = list_uri_policies(uri, subjectid) policies.each do |policy| - ret = delete_policy(policy, token_id) + ret = delete_policy(policy, subjectid) LOGGER.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" end return true end - #Checks (if token_id is valid) if a policy exist and create default policy if not - def self.check_policy(uri, token_id) - token_valid = OpenTox::Authorization.is_token_valid(token_id) - LOGGER.debug "OpenTox::Authorization.check_policy with uri: #{uri}, token_id: #{token_id} is valid: #{token_valid}" + #Checks (if subjectid is valid) if a policy exist and create default policy if not + def self.check_policy(uri, subjectid) + token_valid = OpenTox::Authorization.is_token_valid(subjectid) + LOGGER.debug "OpenTox::Authorization.check_policy with uri: #{uri}, subjectid: #{subjectid} is valid: #{token_valid}" if uri and token_valid - if !uri_has_policy(uri, token_id) - return send_policy(uri, token_id) + if !uri_has_policy(uri, subjectid) + return send_policy(uri, subjectid) else LOGGER.debug "OpenTox::Authorization.check_policy URI: #{uri} has already a Policy." end diff --git a/lib/dataset.rb b/lib/dataset.rb index b7feeec..7c70c9d 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -26,9 +26,9 @@ module OpenTox # dataset = OpenTox::Dataset.create # @param [optional, String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object - def self.create(uri=CONFIG[:services]["opentox-dataset"], token_id=nil) + def self.create(uri=CONFIG[:services]["opentox-dataset"], subjectid=nil) dataset = Dataset.new - dataset.save(token_id) + dataset.save(subjectid) dataset end @@ -247,22 +247,22 @@ module OpenTox # - creates a new dataset if uri is not set # - overwrites dataset if uri exists # @return [String] Dataset URI - def save(token_id=nil) + def save(subjectid=nil) # TODO: rewrite feature URI's ?? @compounds.uniq! if @uri if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :token_id => token_id},self.to_yaml) + RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :subjectid => subjectid},self.to_yaml) else File.open("ot-post-file.rdf","w+") { |f| f.write(self.to_rdfxml); @path = f.path } - task_uri = RestClient.post(@uri, {:file => File.new(@path)},{:accept => "text/uri-list" , :token_id => token_id}).to_s.chomp + task_uri = RestClient.post(@uri, {:file => File.new(@path)},{:accept => "text/uri-list" , :subjectid => subjectid}).to_s.chomp #task_uri = `curl -X POST -H "Accept:text/uri-list" -F "file=@#{@path};type=application/rdf+xml" http://apps.ideaconsult.net:8080/ambit2/dataset` Task.find(task_uri).wait_for_completion self.uri = RestClientWrapper.get(task_uri,:accept => 'text/uri-list') end else # create dataset if uri is empty - self.uri = RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{:token_id => token_id}).to_s.chomp + self.uri = RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{:subjectid => subjectid}).to_s.chomp end @uri end diff --git a/lib/helper.rb b/lib/helper.rb index 42c35e8..6b616bc 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -1,32 +1,32 @@ helpers do # Authentification - def protected!(token_id) + def protected!(subjectid) if env["session"] flash[:notice] = "You don't have access to this section: " and \ redirect back and \ - return unless authorized?(token_id) - elsif !env["session"] && token_id + return unless authorized?(subjectid) + elsif !env["session"] && subjectid throw(:halt, [401, "Not authorized.\n"]) and \ redirect back and \ - return unless authorized?(token_id) + return unless authorized?(subjectid) end throw(:halt, [401, "Not authorized.\n"]) and \ - return unless authorized?(token_id) + return unless authorized?(subjectid) end - def authorized?(token_id) + def authorized?(subjectid) if CONFIG[:authorization][:authorize_request].include?(request.env['REQUEST_METHOD']) - ret = OpenTox::Authorization.authorize("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}", request.env['REQUEST_METHOD'], token_id) - LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, token_id: #{token_id} with return #{ret}." + ret = OpenTox::Authorization.authorize("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}", request.env['REQUEST_METHOD'], subjectid) + LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, subjectid: #{subjectid} with return #{ret}." return ret end if CONFIG[:authorization][:authenticate_request].include?(env['REQUEST_METHOD']) - if OpenTox::Authorization.is_token_valid(token_id) + if OpenTox::Authorization.is_token_valid(subjectid) return true end end - LOGGER.debug "Not authorized for: #{request.env['rack.url_scheme']}://#{request['REQUEST_URI']} with Method: #{request.env['REQUEST_METHOD']} with Token #{token_id}" + LOGGER.debug "Not authorized for: #{request.env['rack.url_scheme']}://#{request['REQUEST_URI']} with Method: #{request.env['REQUEST_METHOD']} with Token #{subjectid}" return false end @@ -41,9 +41,9 @@ helpers do end end - def check_token_id(token_id) - return false if !token_id - return true if token_id.size > 62 + def check_subjectid(subjectid) + return false if !subjectid + return true if subjectid.size > 62 false end end @@ -51,16 +51,16 @@ end before do unless unprotected_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) begin - token_id = session[:token_id] if session[:token_id] - token_id = params[:token_id] if params[:token_id] and !check_token_id(token_id) - token_id = request.env['HTTP_TOKEN_ID'] if request.env['HTTP_TOKEN_ID'] and !check_token_id(token_id) + subjectid = session[:subjectid] if session[:subjectid] + subjectid = params[:subjectid] if params[:subjectid] and !check_subjectid(subjectid) + subjectid = request.env['HTTP_SUBJECTID'] if request.env['HTTP_SUBJECTID'] and !check_subjectid(subjectid) # see http://rack.rubyforge.org/doc/SPEC.html - token_id = CGI.unescape(token_id) if token_id.include?("%23") + subjectid = CGI.unescape(subjectid) if subjectid.include?("%23") rescue - LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO token_id." - token_id = "" + LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO subjectid." + subjectid = "" end - protected!(token_id) if AA_SERVER + protected!(subjectid) if AA_SERVER end end diff --git a/lib/model.rb b/lib/model.rb index 9c2fb97..953bb6c 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -32,7 +32,7 @@ module OpenTox include Model include Algorithm - attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm, :min_sim, :token_id + attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm, :min_sim, :subjectid def initialize(uri=nil) @@ -111,7 +111,7 @@ module OpenTox # @param [String] compound_uri Compound URI # @param [optinal,Boolean] verbose Verbose prediction (output includes neighbors and features) # @return [OpenTox::Dataset] Dataset with prediction - def predict(compound_uri,verbose=false,token_id=nil) + def predict(compound_uri,verbose=false,subjectid=nil) @compound = Compound.new compound_uri features = {} @@ -119,7 +119,7 @@ module OpenTox unless @prediction_dataset #@prediction_dataset = cached_prediction #return @prediction_dataset if cached_prediction - @prediction_dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], token_id) + @prediction_dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid) @prediction_dataset.add_metadata( { OT.hasSource => @uri, DC.creator => @uri, @@ -217,7 +217,7 @@ module OpenTox end end - @prediction_dataset.save(token_id) + @prediction_dataset.save(subjectid) @prediction_dataset end @@ -257,8 +257,8 @@ module OpenTox end # Save model at model service - def save(token_id) - self.uri = RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :token_id => token_id},self.to_yaml) + def save(subjectid) + self.uri = RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :subjectid => subjectid},self.to_yaml) end # Delete model at model service -- cgit v1.2.3 From b22110ae0d8e902d700e0a3dc629ebfde1edfe10 Mon Sep 17 00:00:00 2001 From: mr Date: Thu, 16 Dec 2010 10:59:46 +0100 Subject: A&A --- lib/dataset.rb | 18 +++++++++--------- lib/helper.rb | 2 +- lib/model.rb | 18 +++++++++--------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 7c70c9d..aba7754 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -38,12 +38,12 @@ module OpenTox # - you will have to set remaining metadata manually # @param [String] file CSV file path # @return [OpenTox::Dataset] Dataset object with CSV data - def self.create_from_csv_file(file) - dataset = Dataset.create + def self.create_from_csv_file(file, subjectid=nil) + dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid) parser = Parser::Spreadsheets.new parser.dataset = dataset parser.load_csv(File.open(file).read) - dataset.save + dataset.save(subjectid) dataset end @@ -89,8 +89,8 @@ module OpenTox # - you will have to set remaining metadata manually # @param [String] csv CSV representation of the dataset # @return [OpenTox::Dataset] Dataset object with CSV data - def load_csv(csv) - save unless @uri # get a uri for creating features + def load_csv(csv, subjectid=nil) + save(subjectid) unless @uri # get a uri for creating features parser = Parser::Spreadsheets.new parser.dataset = self parser.load_csv(csv) @@ -102,8 +102,8 @@ module OpenTox # - you will have to set remaining metadata manually # @param [Excel] book Excel workbook object (created with roo gem) # @return [OpenTox::Dataset] Dataset object with Excel data - def load_spreadsheet(book) - save unless @uri # get a uri for creating features + def load_spreadsheet(book, subjectid=nil) + save(subjectid) unless @uri # get a uri for creating features parser = Parser::Spreadsheets.new parser.dataset = self parser.load_spreadsheet(book) @@ -268,8 +268,8 @@ module OpenTox end # Delete dataset at the dataset service - def delete - RestClientWrapper.delete @uri + def delete(subjectid=nil) + RestClientWrapper.delete(@uri, :subjectid => subjectid) end private diff --git a/lib/helper.rb b/lib/helper.rb index 6b616bc..965b4ad 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -57,7 +57,7 @@ before do # see http://rack.rubyforge.org/doc/SPEC.html subjectid = CGI.unescape(subjectid) if subjectid.include?("%23") rescue - LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO subjectid." + LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO subjectid for URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" subjectid = "" end protected!(subjectid) if AA_SERVER diff --git a/lib/model.rb b/lib/model.rb index 953bb6c..c645bdc 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -90,8 +90,8 @@ module OpenTox # Predict a dataset # @param [String] dataset_uri Dataset URI # @return [OpenTox::Dataset] Dataset with predictions - def predict_dataset(dataset_uri) - @prediction_dataset = Dataset.create + def predict_dataset(dataset_uri, subjectid=nil) + @prediction_dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid) @prediction_dataset.add_metadata({ OT.hasSource => @uri, DC.creator => @uri, @@ -101,9 +101,9 @@ module OpenTox d = Dataset.new(dataset_uri) d.load_compounds d.compounds.each do |compound_uri| - predict(compound_uri,false) + predict(compound_uri,false,subjectid) end - @prediction_dataset.save + @prediction_dataset.save(subjectid) @prediction_dataset end @@ -129,7 +129,7 @@ module OpenTox } ) end - return @prediction_dataset if database_activity + return @prediction_dataset if database_activity(subjectid) neighbors prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") @@ -245,11 +245,11 @@ module OpenTox # Find database activities and store them in @prediction_dataset # @return [Boolean] true if compound has databasse activities, false if not - def database_activity + def database_activity(subjectid) if @activities[@compound.uri] @activities[@compound.uri].each { |act| @prediction_dataset.add @compound.uri, @metadata[OT.dependentVariables], act } @prediction_dataset.add_metadata(OT.hasSource => @metadata[OT.trainingDataset]) - @prediction_dataset.save + @prediction_dataset.save(subjectid) true else false @@ -262,8 +262,8 @@ module OpenTox end # Delete model at model service - def delete - RestClientWrapper.delete @uri unless @uri == CONFIG[:services]["opentox-model"] + def delete(subjectid) + RestClientWrapper.delete(@uri, :subjectid => subjectid) unless @uri == CONFIG[:services]["opentox-model"] end end -- cgit v1.2.3 From 4c089275d34ba42014e1add97a41ccf351790260 Mon Sep 17 00:00:00 2001 From: mr Date: Wed, 5 Jan 2011 10:30:54 +0100 Subject: Authorization for GET requests --- lib/dataset.rb | 30 +++++++++++++++--------------- lib/feature.rb | 4 ++-- lib/helper.rb | 31 ++++++++++++++++++++----------- lib/model.rb | 4 ++-- 4 files changed, 39 insertions(+), 30 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index aba7754..52b41a7 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -14,7 +14,7 @@ module OpenTox # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") # @param [optional, String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object - def initialize(uri=nil) + def initialize(uri=nil,subjectid=nil) super uri @features = {} @compounds = [] @@ -27,7 +27,7 @@ module OpenTox # @param [optional, String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object def self.create(uri=CONFIG[:services]["opentox-dataset"], subjectid=nil) - dataset = Dataset.new + dataset = Dataset.new(nil,subjectid) dataset.save(subjectid) dataset end @@ -50,17 +50,17 @@ module OpenTox # Find a dataset and load all data. This can be time consuming, use Dataset.new together with one of the load_* methods for a fine grained control over data loading. # @param [String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object with all data - def self.find(uri) - dataset = Dataset.new(uri) - dataset.load_all + def self.find(uri, subjectid=nil) + dataset = Dataset.new(uri, subjectid) + dataset.load_all(subjectid) dataset end # Get all datasets from a service # @param [optional,String] uri URI of the dataset service, defaults to service specified in configuration # @return [Array] Array of dataset object without data (use one of the load_* methods to pull data from the server) - def self.all(uri=CONFIG[:services]["opentox-dataset"]) - RestClientWrapper.get(uri,:accept => "text/uri-list").to_s.each_line.collect{|u| Dataset.new(u)} + def self.all(uri=CONFIG[:services]["opentox-dataset"], subjectid=nil) + RestClientWrapper.get(uri,{:accept => "text/uri-list",:subjectid => subjectid}).to_s.each_line.collect{|u| Dataset.new(u)} end # Load YAML representation into the dataset @@ -118,9 +118,9 @@ module OpenTox end # Load all data (metadata, data_entries, compounds and features) from URI - def load_all + def load_all(subjectid=nil) if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - copy YAML.load(RestClientWrapper.get(@uri, :accept => "application/x-yaml")) + copy YAML.load(RestClientWrapper.get(@uri, {:accept => "application/x-yaml", :subjectid => subjectid})) else parser = Parser::Owl::Dataset.new(@uri) copy parser.load_uri @@ -129,8 +129,8 @@ module OpenTox # Load and return only compound URIs from the dataset service # @return [Array] Compound URIs in the dataset - def load_compounds - RestClientWrapper.get(File.join(uri,"compounds"),:accept=> "text/uri-list").to_s.each_line do |compound_uri| + def load_compounds(subjectid=nil) + RestClientWrapper.get(File.join(uri,"compounds"),{:accept=> "text/uri-list", :subjectid => subjectid}).to_s.each_line do |compound_uri| @compounds << compound_uri.chomp end @compounds.uniq! @@ -258,7 +258,7 @@ module OpenTox task_uri = RestClient.post(@uri, {:file => File.new(@path)},{:accept => "text/uri-list" , :subjectid => subjectid}).to_s.chomp #task_uri = `curl -X POST -H "Accept:text/uri-list" -F "file=@#{@path};type=application/rdf+xml" http://apps.ideaconsult.net:8080/ambit2/dataset` Task.find(task_uri).wait_for_completion - self.uri = RestClientWrapper.get(task_uri,:accept => 'text/uri-list') + self.uri = RestClientWrapper.get(task_uri,{:accept => 'text/uri-list', :subjectid => subjectid}) end else # create dataset if uri is empty @@ -293,9 +293,9 @@ module OpenTox # Find a prediction dataset and load all data. # @param [String] uri Prediction dataset URI # @return [OpenTox::Dataset] Prediction dataset object with all data - def self.find(uri) - prediction = LazarPrediction.new(uri) - prediction.load_all + def self.find(uri, subjectid=nil) + prediction = LazarPrediction.new(uri, subjectid) + prediction.load_all(subjectid) prediction end diff --git a/lib/feature.rb b/lib/feature.rb index 9e28077..349f8ae 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -2,10 +2,10 @@ module OpenTox class Feature include OpenTox - def self.find(uri) + def self.find(uri, subjectid=nil) feature = Feature.new uri if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) - feature.add_metadata YAML.load(RestClientWrapper.get(uri,:accept => "application/x-yaml")) + feature.add_metadata YAML.load(RestClientWrapper.get(uri,{:accept => "application/x-yaml", :subjectid => subjectid})) else feature.add_metadata Parser::Owl::Dataset.new(uri).load_metadata end diff --git a/lib/helper.rb b/lib/helper.rb index 965b4ad..cb80018 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -15,21 +15,35 @@ helpers do return unless authorized?(subjectid) end + #Check Authorization for URI with method and subjectid. def authorized?(subjectid) + uri = clean_uri("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}") if CONFIG[:authorization][:authorize_request].include?(request.env['REQUEST_METHOD']) - ret = OpenTox::Authorization.authorize("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}", request.env['REQUEST_METHOD'], subjectid) - LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, subjectid: #{subjectid} with return #{ret}." + ret = OpenTox::Authorization.authorize(uri, request.env['REQUEST_METHOD'], subjectid) + LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, subjectid: #{subjectid} with return >>#{ret}<<" return ret end if CONFIG[:authorization][:authenticate_request].include?(env['REQUEST_METHOD']) - if OpenTox::Authorization.is_token_valid(subjectid) - return true - end + return true if OpenTox::Authorization.is_token_valid(subjectid) end LOGGER.debug "Not authorized for: #{request.env['rack.url_scheme']}://#{request['REQUEST_URI']} with Method: #{request.env['REQUEST_METHOD']} with Token #{subjectid}" return false end + #cleans URI from querystring and file-extension. Sets port 80 to emptystring + # @param [String] uri + def clean_uri(uri) + out = URI.parse(uri) + "#{out.scheme}:" + (out.port != 80 ? out.port : "") + "//#{out.host}#{out.path.chomp(File.extname(out.path))}" + end + + def check_subjectid(subjectid) + return false if !subjectid + return true if subjectid.size > 62 + false + end + + #unprotected uris for login/logout, webapplication ... def unprotected_requests case env['REQUEST_URI'] when /\/login$|\/logout$|\/predict$|\/toxcreate\/models$/ @@ -41,18 +55,13 @@ helpers do end end - def check_subjectid(subjectid) - return false if !subjectid - return true if subjectid.size > 62 - false - end end before do unless unprotected_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) begin subjectid = session[:subjectid] if session[:subjectid] - subjectid = params[:subjectid] if params[:subjectid] and !check_subjectid(subjectid) + subjectid = params[:subjectid] if params[:subjectid] and !check_subjectid(subjectid) subjectid = request.env['HTTP_SUBJECTID'] if request.env['HTTP_SUBJECTID'] and !check_subjectid(subjectid) # see http://rack.rubyforge.org/doc/SPEC.html subjectid = CGI.unescape(subjectid) if subjectid.include?("%23") diff --git a/lib/model.rb b/lib/model.rb index c645bdc..32f5604 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -67,8 +67,8 @@ module OpenTox # Find a lazar model # @param [String] uri Model URI # @return [OpenTox::Model::Lazar] lazar model - def self.find(uri) - YAML.load RestClientWrapper.get(uri,:accept => 'application/x-yaml') + def self.find(uri, subjectid=nil) + YAML.load RestClientWrapper.get(uri,{:accept => 'application/x-yaml', :subjectid => subjectid}) end # Create a new lazar model -- cgit v1.2.3 From a0bcb593e95320bff832f5cca9b9f4c105c817d3 Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 10 Jan 2011 17:04:20 +0100 Subject: A&A --- lib/authorization.rb | 4 +++- lib/dataset.rb | 48 ++++++++++++++++++++++++------------------------ 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index f9499e6..dab228a 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -114,7 +114,9 @@ module OpenTox begin resource = RestClient::Resource.new("#{AA_SERVER}/pol") out = resource.get(:subjectid => subjectid) - return out.split("\n") + return out.split("\n") + rescue RestClient::InternalServerError => e + raise e.response rescue return nil end diff --git a/lib/dataset.rb b/lib/dataset.rb index 7c70c9d..52b41a7 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -14,7 +14,7 @@ module OpenTox # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") # @param [optional, String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object - def initialize(uri=nil) + def initialize(uri=nil,subjectid=nil) super uri @features = {} @compounds = [] @@ -27,7 +27,7 @@ module OpenTox # @param [optional, String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object def self.create(uri=CONFIG[:services]["opentox-dataset"], subjectid=nil) - dataset = Dataset.new + dataset = Dataset.new(nil,subjectid) dataset.save(subjectid) dataset end @@ -38,29 +38,29 @@ module OpenTox # - you will have to set remaining metadata manually # @param [String] file CSV file path # @return [OpenTox::Dataset] Dataset object with CSV data - def self.create_from_csv_file(file) - dataset = Dataset.create + def self.create_from_csv_file(file, subjectid=nil) + dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid) parser = Parser::Spreadsheets.new parser.dataset = dataset parser.load_csv(File.open(file).read) - dataset.save + dataset.save(subjectid) dataset end # Find a dataset and load all data. This can be time consuming, use Dataset.new together with one of the load_* methods for a fine grained control over data loading. # @param [String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object with all data - def self.find(uri) - dataset = Dataset.new(uri) - dataset.load_all + def self.find(uri, subjectid=nil) + dataset = Dataset.new(uri, subjectid) + dataset.load_all(subjectid) dataset end # Get all datasets from a service # @param [optional,String] uri URI of the dataset service, defaults to service specified in configuration # @return [Array] Array of dataset object without data (use one of the load_* methods to pull data from the server) - def self.all(uri=CONFIG[:services]["opentox-dataset"]) - RestClientWrapper.get(uri,:accept => "text/uri-list").to_s.each_line.collect{|u| Dataset.new(u)} + def self.all(uri=CONFIG[:services]["opentox-dataset"], subjectid=nil) + RestClientWrapper.get(uri,{:accept => "text/uri-list",:subjectid => subjectid}).to_s.each_line.collect{|u| Dataset.new(u)} end # Load YAML representation into the dataset @@ -89,8 +89,8 @@ module OpenTox # - you will have to set remaining metadata manually # @param [String] csv CSV representation of the dataset # @return [OpenTox::Dataset] Dataset object with CSV data - def load_csv(csv) - save unless @uri # get a uri for creating features + def load_csv(csv, subjectid=nil) + save(subjectid) unless @uri # get a uri for creating features parser = Parser::Spreadsheets.new parser.dataset = self parser.load_csv(csv) @@ -102,8 +102,8 @@ module OpenTox # - you will have to set remaining metadata manually # @param [Excel] book Excel workbook object (created with roo gem) # @return [OpenTox::Dataset] Dataset object with Excel data - def load_spreadsheet(book) - save unless @uri # get a uri for creating features + def load_spreadsheet(book, subjectid=nil) + save(subjectid) unless @uri # get a uri for creating features parser = Parser::Spreadsheets.new parser.dataset = self parser.load_spreadsheet(book) @@ -118,9 +118,9 @@ module OpenTox end # Load all data (metadata, data_entries, compounds and features) from URI - def load_all + def load_all(subjectid=nil) if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - copy YAML.load(RestClientWrapper.get(@uri, :accept => "application/x-yaml")) + copy YAML.load(RestClientWrapper.get(@uri, {:accept => "application/x-yaml", :subjectid => subjectid})) else parser = Parser::Owl::Dataset.new(@uri) copy parser.load_uri @@ -129,8 +129,8 @@ module OpenTox # Load and return only compound URIs from the dataset service # @return [Array] Compound URIs in the dataset - def load_compounds - RestClientWrapper.get(File.join(uri,"compounds"),:accept=> "text/uri-list").to_s.each_line do |compound_uri| + def load_compounds(subjectid=nil) + RestClientWrapper.get(File.join(uri,"compounds"),{:accept=> "text/uri-list", :subjectid => subjectid}).to_s.each_line do |compound_uri| @compounds << compound_uri.chomp end @compounds.uniq! @@ -258,7 +258,7 @@ module OpenTox task_uri = RestClient.post(@uri, {:file => File.new(@path)},{:accept => "text/uri-list" , :subjectid => subjectid}).to_s.chomp #task_uri = `curl -X POST -H "Accept:text/uri-list" -F "file=@#{@path};type=application/rdf+xml" http://apps.ideaconsult.net:8080/ambit2/dataset` Task.find(task_uri).wait_for_completion - self.uri = RestClientWrapper.get(task_uri,:accept => 'text/uri-list') + self.uri = RestClientWrapper.get(task_uri,{:accept => 'text/uri-list', :subjectid => subjectid}) end else # create dataset if uri is empty @@ -268,8 +268,8 @@ module OpenTox end # Delete dataset at the dataset service - def delete - RestClientWrapper.delete @uri + def delete(subjectid=nil) + RestClientWrapper.delete(@uri, :subjectid => subjectid) end private @@ -293,9 +293,9 @@ module OpenTox # Find a prediction dataset and load all data. # @param [String] uri Prediction dataset URI # @return [OpenTox::Dataset] Prediction dataset object with all data - def self.find(uri) - prediction = LazarPrediction.new(uri) - prediction.load_all + def self.find(uri, subjectid=nil) + prediction = LazarPrediction.new(uri, subjectid) + prediction.load_all(subjectid) prediction end -- cgit v1.2.3 From 57cab7b2e22b4f07ee7f53afb15d05873abeca6d Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 10 Jan 2011 17:04:49 +0100 Subject: A&A --- lib/helper.rb | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/helper.rb b/lib/helper.rb index 6b616bc..857c5b5 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -15,25 +15,42 @@ helpers do return unless authorized?(subjectid) end + #Check Authorization for URI with method and subjectid. def authorized?(subjectid) + uri = clean_uri("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}") if CONFIG[:authorization][:authorize_request].include?(request.env['REQUEST_METHOD']) - ret = OpenTox::Authorization.authorize("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}", request.env['REQUEST_METHOD'], subjectid) - LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, subjectid: #{subjectid} with return #{ret}." + ret = OpenTox::Authorization.authorize(uri, request.env['REQUEST_METHOD'], subjectid) + LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, subjectid: #{subjectid} with return >>#{ret}<<" return ret end if CONFIG[:authorization][:authenticate_request].include?(env['REQUEST_METHOD']) - if OpenTox::Authorization.is_token_valid(subjectid) - return true - end + return true if OpenTox::Authorization.is_token_valid(subjectid) end LOGGER.debug "Not authorized for: #{request.env['rack.url_scheme']}://#{request['REQUEST_URI']} with Method: #{request.env['REQUEST_METHOD']} with Token #{subjectid}" return false end + #cleans URI from querystring and file-extension. Sets port 80 to emptystring + # @param [String] uri + def clean_uri(uri) + out = URI.parse(uri) + out.path = out.path[0, out.path.rindex(/[0-9]/) + 1] if out.path.rindex(/[0-9]/) #cuts after id for a&a + "#{out.scheme}:" + (out.port != 80 ? out.port : "") + "//#{out.host}#{out.path}" + end + + def check_subjectid(subjectid) + return false if !subjectid + return true if subjectid.size > 62 + false + end + + #unprotected uris for login/logout, webapplication ... def unprotected_requests case env['REQUEST_URI'] when /\/login$|\/logout$|\/predict$|\/toxcreate\/models$/ return true + when /\/features/ + return false when /\/compound|\/feature|\/task|\/toxcreate/ #to fix: read from config | validation should be protected return true else @@ -41,23 +58,18 @@ helpers do end end - def check_subjectid(subjectid) - return false if !subjectid - return true if subjectid.size > 62 - false - end end before do unless unprotected_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) begin subjectid = session[:subjectid] if session[:subjectid] - subjectid = params[:subjectid] if params[:subjectid] and !check_subjectid(subjectid) + subjectid = params[:subjectid] if params[:subjectid] and !check_subjectid(subjectid) subjectid = request.env['HTTP_SUBJECTID'] if request.env['HTTP_SUBJECTID'] and !check_subjectid(subjectid) # see http://rack.rubyforge.org/doc/SPEC.html subjectid = CGI.unescape(subjectid) if subjectid.include?("%23") rescue - LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO subjectid." + LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO subjectid for URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" subjectid = "" end protected!(subjectid) if AA_SERVER -- cgit v1.2.3 From 7327b1632cdaafd2d49d1ba8703a962f3c0e00d6 Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 10 Jan 2011 17:05:07 +0100 Subject: A&A --- lib/model.rb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 953bb6c..32f5604 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -67,8 +67,8 @@ module OpenTox # Find a lazar model # @param [String] uri Model URI # @return [OpenTox::Model::Lazar] lazar model - def self.find(uri) - YAML.load RestClientWrapper.get(uri,:accept => 'application/x-yaml') + def self.find(uri, subjectid=nil) + YAML.load RestClientWrapper.get(uri,{:accept => 'application/x-yaml', :subjectid => subjectid}) end # Create a new lazar model @@ -90,8 +90,8 @@ module OpenTox # Predict a dataset # @param [String] dataset_uri Dataset URI # @return [OpenTox::Dataset] Dataset with predictions - def predict_dataset(dataset_uri) - @prediction_dataset = Dataset.create + def predict_dataset(dataset_uri, subjectid=nil) + @prediction_dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid) @prediction_dataset.add_metadata({ OT.hasSource => @uri, DC.creator => @uri, @@ -101,9 +101,9 @@ module OpenTox d = Dataset.new(dataset_uri) d.load_compounds d.compounds.each do |compound_uri| - predict(compound_uri,false) + predict(compound_uri,false,subjectid) end - @prediction_dataset.save + @prediction_dataset.save(subjectid) @prediction_dataset end @@ -129,7 +129,7 @@ module OpenTox } ) end - return @prediction_dataset if database_activity + return @prediction_dataset if database_activity(subjectid) neighbors prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") @@ -245,11 +245,11 @@ module OpenTox # Find database activities and store them in @prediction_dataset # @return [Boolean] true if compound has databasse activities, false if not - def database_activity + def database_activity(subjectid) if @activities[@compound.uri] @activities[@compound.uri].each { |act| @prediction_dataset.add @compound.uri, @metadata[OT.dependentVariables], act } @prediction_dataset.add_metadata(OT.hasSource => @metadata[OT.trainingDataset]) - @prediction_dataset.save + @prediction_dataset.save(subjectid) true else false @@ -262,8 +262,8 @@ module OpenTox end # Delete model at model service - def delete - RestClientWrapper.delete @uri unless @uri == CONFIG[:services]["opentox-model"] + def delete(subjectid) + RestClientWrapper.delete(@uri, :subjectid => subjectid) unless @uri == CONFIG[:services]["opentox-model"] end end -- cgit v1.2.3 From ecdd0347a347bd2ac5fa9e6a41ec7475b007309d Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 10 Jan 2011 17:47:09 +0100 Subject: A&A extent --- lib/feature.rb | 4 ++-- lib/model.rb | 8 ++++---- lib/policy.rb | 9 +++++++++ lib/task.rb | 12 ++++++------ 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/lib/feature.rb b/lib/feature.rb index 9e28077..349f8ae 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -2,10 +2,10 @@ module OpenTox class Feature include OpenTox - def self.find(uri) + def self.find(uri, subjectid=nil) feature = Feature.new uri if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) - feature.add_metadata YAML.load(RestClientWrapper.get(uri,:accept => "application/x-yaml")) + feature.add_metadata YAML.load(RestClientWrapper.get(uri,{:accept => "application/x-yaml", :subjectid => subjectid})) else feature.add_metadata Parser::Owl::Dataset.new(uri).load_metadata end diff --git a/lib/model.rb b/lib/model.rb index 32f5604..7aa3f5c 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -60,8 +60,8 @@ module OpenTox # Get URIs of all lazar models # @return [Array] List of lazar model URIs - def self.all - RestClientWrapper.get(CONFIG[:services]["opentox-model"]).to_s.split("\n") + def self.all(subjectid=nil) + RestClientWrapper.get(CONFIG[:services]["opentox-model"], :subjectid => subjectid).to_s.split("\n") end # Find a lazar model @@ -77,7 +77,7 @@ module OpenTox def self.create(params) lazar_algorithm = OpenTox::Algorithm::Generic.new File.join( CONFIG[:services]["opentox-algorithm"],"lazar") model_uri = lazar_algorithm.run(params) - OpenTox::Model::Lazar.find(model_uri) + OpenTox::Model::Lazar.find(model_uri, params[:subjectid]) end # Get a parameter value @@ -98,7 +98,7 @@ module OpenTox DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), OT.parameters => [{DC.title => "dataset_uri", OT.paramValue => dataset_uri}] }) - d = Dataset.new(dataset_uri) + d = Dataset.new(dataset_uri,subjectid) d.load_compounds d.compounds.each do |compound_uri| predict(compound_uri,false,subjectid) diff --git a/lib/policy.rb b/lib/policy.rb index 0ef8298..9c81fbd 100644 --- a/lib/policy.rb +++ b/lib/policy.rb @@ -33,6 +33,15 @@ module OpenTox return true end + #drop all policies in a policies instance + def names + out = [] + @policies.each do |name, policy| + out << name + end + return out + end + #loads a default policy template in policies instance def load_default_policy(user, uri, group="member") template = case user diff --git a/lib/task.rb b/lib/task.rb index 18fba6e..9cf909f 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -50,12 +50,12 @@ module OpenTox cpu_load = `cat /proc/loadavg`.split(/\s+/)[0..2].collect{|c| c.to_f} nr_cpu_cores = `cat /proc/cpuinfo |grep "cpu cores"|cut -d ":" -f2|tr -d " "`.split("\n").collect{|c| c.to_i}.inject{|sum,n| sum+n} nr_cpu_cores = 1 if !nr_cpu_cores - if cpu_load[0] > nr_cpu_cores and cpu_load[0] > cpu_load[1] and cpu_load[1] > cpu_load[2] # average CPU load of the last minute is high and CPU load is increasing - LOGGER.warn "Cannot start task - CPU load too high (#{cpu_load.join(", ")})" - task.cancel - return task - #raise "Server too busy to start a new task" - end + #if cpu_load[0] > nr_cpu_cores and cpu_load[0] > cpu_load[1] and cpu_load[1] > cpu_load[2] # average CPU load of the last minute is high and CPU load is increasing + # LOGGER.warn "Cannot start task - CPU load too high (#{cpu_load.join(", ")})" + # task.cancel + # return task + # #raise "Server too busy to start a new task" + #end task_pid = Spork.spork(:logger => LOGGER) do -- cgit v1.2.3 From 2aafed7543287c420a5aa2e751b8c74ad771d14c Mon Sep 17 00:00:00 2001 From: mr Date: Thu, 13 Jan 2011 12:01:19 +0100 Subject: A&A for GET requests --- lib/dataset.rb | 22 +++++++++++----------- lib/model.rb | 2 +- lib/opentox.rb | 8 ++++---- lib/parser.rb | 17 ++++++++++------- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 52b41a7..a85c2b5 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -60,7 +60,7 @@ module OpenTox # @param [optional,String] uri URI of the dataset service, defaults to service specified in configuration # @return [Array] Array of dataset object without data (use one of the load_* methods to pull data from the server) def self.all(uri=CONFIG[:services]["opentox-dataset"], subjectid=nil) - RestClientWrapper.get(uri,{:accept => "text/uri-list",:subjectid => subjectid}).to_s.each_line.collect{|u| Dataset.new(u)} + RestClientWrapper.get(uri,{:accept => "text/uri-list",:subjectid => subjectid}).to_s.each_line.collect{|u| Dataset.new(u, subjectid)} end # Load YAML representation into the dataset @@ -77,10 +77,10 @@ module OpenTox # Load RDF/XML representation from a file # @param [String] file File with RDF/XML representation of the dataset # @return [OpenTox::Dataset] Dataset object with RDF/XML data - def load_rdfxml_file(file) - parser = Parser::Owl::Dataset.new @uri + def load_rdfxml_file(file, subjectid=nil) + parser = Parser::Owl::Dataset.new @uri, subjectid parser.uri = file.path - copy parser.load_uri + copy parser.load_uri(subjectid) end # Load CSV string (format specification: http://toxcreate.org/help) @@ -111,8 +111,8 @@ module OpenTox # Load and return only metadata of a Dataset object # @return [Hash] Metadata of the dataset - def load_metadata - add_metadata Parser::Owl::Dataset.new(@uri).load_metadata + def load_metadata(subjectid=nil) + add_metadata Parser::Owl::Dataset.new(@uri, subjectid).load_metadata(subjectid) self.uri = @uri if @uri # keep uri @metadata end @@ -122,8 +122,8 @@ module OpenTox if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) copy YAML.load(RestClientWrapper.get(@uri, {:accept => "application/x-yaml", :subjectid => subjectid})) else - parser = Parser::Owl::Dataset.new(@uri) - copy parser.load_uri + parser = Parser::Owl::Dataset.new(@uri, subjectid) + copy parser.load_uri(subjectid) end end @@ -138,9 +138,9 @@ module OpenTox # Load and return only features from the dataset service # @return [Hash] Features of the dataset - def load_features - parser = Parser::Owl::Dataset.new(@uri) - @features = parser.load_features + def load_features(subjectid=nil) + parser = Parser::Owl::Dataset.new(@uri, subjectid) + @features = parser.load_features(subjectid) @features end diff --git a/lib/model.rb b/lib/model.rb index 7aa3f5c..6ef4af2 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -99,7 +99,7 @@ module OpenTox OT.parameters => [{DC.title => "dataset_uri", OT.paramValue => dataset_uri}] }) d = Dataset.new(dataset_uri,subjectid) - d.load_compounds + d.load_compounds(subjectid) d.compounds.each do |compound_uri| predict(compound_uri,false,subjectid) end diff --git a/lib/opentox.rb b/lib/opentox.rb index 90683e5..f1af5c3 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -19,14 +19,14 @@ module OpenTox # Get all objects from a service # @return [Array] List of available URIs - def self.all(uri) - RestClientWrapper.get(uri,:accept => "text/uri-list").to_s.split(/\n/) + def self.all(uri, subjectid=nil) + RestClientWrapper.get(uri,:accept => "text/uri-list", :subjectid => subjectid).to_s.split(/\n/) end # Load (and return) metadata from object URI # @return [Hash] Metadata - def load_metadata - @metadata = Parser::Owl::Generic.new(@uri).load_metadata + def load_metadata(subjectid=nil) + @metadata = Parser::Owl::Generic.new(@uri).load_metadata(subjectid) @metadata end diff --git a/lib/parser.rb b/lib/parser.rb index b727412..a913cf2 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -29,14 +29,14 @@ module OpenTox # Read metadata from opentox service # @return [Hash] Object metadata - def load_metadata + def load_metadata(subjectid=nil) if @dataset uri = File.join(@uri,"metadata") else uri = @uri end - + uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid statements = [] parameter_ids = [] `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| @@ -71,9 +71,9 @@ module OpenTox # Create a new OWL-DL dataset parser # @param uri Dataset URI # @return [OpenTox::Parser::Owl::Dataset] OWL-DL parser - def initialize(uri) + def initialize(uri, subjectid=nil) super uri - @dataset = ::OpenTox::Dataset.new(@uri) + @dataset = ::OpenTox::Dataset.new(@uri, subjectid) end # Read data from dataset service. Files can be parsed by setting #uri to a filename (after initialization with a real URI) @@ -87,12 +87,14 @@ module OpenTox # dataset = parser.load_uri # dataset.save # @return [Hash] Internal dataset representation - def load_uri + def load_uri(subjectid=nil) + uri = @uri + uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid data = {} feature_values = {} feature = {} other_statements = {} - `rapper -i rdfxml -o ntriples #{@uri} 2>/dev/null`.each_line do |line| + `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| triple = line.chomp.split(' ',3) triple = triple[0..2].collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} case triple[1] @@ -122,8 +124,9 @@ module OpenTox # Read only features from a dataset service. # @return [Hash] Internal features representation - def load_features + def load_features(subjectid=nil) uri = File.join(@uri,"features") + uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid statements = [] features = Set.new `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| -- cgit v1.2.3 From f2ca545448ab8a6f654309f23cfce9416b2e9856 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 13 Jan 2011 14:02:58 +0100 Subject: find methods for algorithm and model, split method for dataset, feature_type method for model and feature, perform single predicitons in resuce block, add to-html.rb, fix handling of rest-client-wrapper --- lib/algorithm.rb | 14 ++++++ lib/dataset.rb | 33 +++++++++++++- lib/feature.rb | 23 +++++++++- lib/model.rb | 76 +++++++++++++++++++++++++++++++- lib/opentox-ruby.rb | 2 +- lib/overwrite.rb | 18 +++++++- lib/rest_client_wrapper.rb | 18 +++----- lib/task.rb | 106 ++++++++++++++++++++++++++++++++++++++++++++- lib/to-html.rb | 80 ++++++++++++++++++++++++++++++++++ 9 files changed, 351 insertions(+), 19 deletions(-) create mode 100755 lib/to-html.rb diff --git a/lib/algorithm.rb b/lib/algorithm.rb index a2f7786..0aa86e6 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -29,6 +29,20 @@ module OpenTox # Generic Algorithm class, should work with all OpenTox webservices class Generic include Algorithm + + # Find Generic Opentox Algorithm via URI, and loads metadata + # @param [String] uri Algorithm URI + # @return [OpenTox::Algorithm::Generic] Algorithm instance, nil if alogrithm was not found + def self.find(uri) + alg = Generic.new(uri) + alg.load_metadata + if alg.metadata==nil or alg.metadata.size==0 + nil + else + alg + end + end + end # Fminer algorithms (https://github.com/amaunz/fminer2) diff --git a/lib/dataset.rb b/lib/dataset.rb index aba7754..d45c821 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -46,7 +46,7 @@ module OpenTox dataset.save(subjectid) dataset end - + # Find a dataset and load all data. This can be time consuming, use Dataset.new together with one of the load_* methods for a fine grained control over data loading. # @param [String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object with all data @@ -242,6 +242,37 @@ module OpenTox def add_feature_metadata(feature,metadata) metadata.each { |k,v| @features[feature][k] = v } end + + # Add a new compound + # @param [String] compound Compound URI + def add_compound (compound) + @compounds << compound unless @compounds.include? compound + end + + # Creates a new dataset, by splitting the current dataset, i.e. using only a subset of compounds and features + # @param [Array] compounds List of compound URIs + # @param [Array] features List of feature URIs + # @param [Hash] metadata Hash containing the metadata for the new dataset + # @return [OpenTox::Dataset] newly created dataset, already saved + def split( compounds, features, metadata) + LOGGER.debug "split dataset using "+compounds.size.to_s+"/"+@compounds.size.to_s+" compounds" + raise "no new compounds selected" unless compounds and compounds.size>0 + dataset = OpenTox::Dataset.create + if features.size==0 + compounds.each{ |c| dataset.add_compound(c) } + else + compounds.each do |c| + features.each do |f| + @data_entries[c][f].each do |v| + dataset.add(c,f,v) + end + end + end + end + dataset.add_metadata(metadata) + dataset.save + dataset + end # Save dataset at the dataset service # - creates a new dataset if uri is not set diff --git a/lib/feature.rb b/lib/feature.rb index 9e28077..de7c757 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -1,7 +1,7 @@ module OpenTox class Feature include OpenTox - + def self.find(uri) feature = Feature.new uri if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) @@ -11,5 +11,26 @@ module OpenTox end feature end + + # provides domain (possible target values) of classification feature + # @return [Array] list with possible target values + def domain + #TODO derieve from metadata / ontology + return [true, false] + end + + # provides feature type, possible types are "regression" or "classification" + # @return [String] feature type, unknown if OT.isA property is unknown/ not set + def feature_type + case metadata[OT.isA] + when /NominalFeature/ + "classification" + when /NumericFeature/ + "regression" + else + "unknown" + end + end + end end diff --git a/lib/model.rb b/lib/model.rb index c645bdc..fb266e0 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -24,8 +24,76 @@ module OpenTox # Generic OpenTox model class for all API compliant services class Generic include Model + + # Find Generic Opentox Model via URI, and loads metadata + # @param [String] uri Model URI + # @return [OpenTox::Model::Generic] Model instance, nil if model was not found + def self.find(uri) + model = Generic.new(uri) + model.load_metadata + if model.metadata==nil or model.metadata.size==0 + nil + else + model + end + end + + # provides feature type, possible types are "regression" or "classification" + # @return [String] feature type, "unknown" if type could not be estimated + def feature_type + # dynamically perform restcalls if necessary + load_metadata if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) + @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables] ) unless @dependentVariable + + [@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], @uri].each do |type| + case type + when /(?i)classification/ + return "classification" + when /(?i)regression/ + return "regression" + end + end + raise "unknown model "+[@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], @uri].inspect + end + +# def classification? +# # TODO test on various services / request to ontology service needed? +# # TODO replace bool (for classification/regression) with string value (more types are coming) +# #raise "classification?: type: "+@type.to_s+", title: "+@title.to_s+", uri: "+@uri.to_s+" "+((@uri =~ /class/) != nil).to_s +# +# load_metadata if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) +# @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables] ) unless @dependentVariable +# case @dependentVariable.feature_type +# when "classification" +# return true +# when "regression" +# return false +# end +# +# if @metadata[OT.isA] =~ /(?i)classification/ +# return true +# end +# +# if @metadata[DC.title] =~ /(?i)classification/ +# return true +# elsif @metadata[DC.title] =~ /(?i)regression/ +# return false +# elsif @uri =~/ntua/ and @metadata[DC.title] =~ /mlr/ +# return false +# elsif @uri =~/tu-muenchen/ and @metadata[DC.title] =~ /regression|M5P|GaussP/ +# return false +# elsif @uri =~/ambit2/ and @metadata[DC.title] =~ /pKa/ || @metadata[DC.title] =~ /Regression|Caco/ +# return false +# elsif @uri =~/majority/ +# return (@uri =~ /class/) != nil +# else +# raise "unknown model, uri:'"+@uri.to_s+"' title:'"+@metadata[DC.title].to_s+"'" +# end +# end +# end + end - + # Lazy Structure Activity Relationship class class Lazar @@ -101,7 +169,11 @@ module OpenTox d = Dataset.new(dataset_uri) d.load_compounds d.compounds.each do |compound_uri| - predict(compound_uri,false,subjectid) + begin + predict(compound_uri,false,subjectid) + rescue => ex + LOGGER.warn "prediction for compound "+compound_uri.to_s+" failed: "+ex.message + end end @prediction_dataset.save(subjectid) @prediction_dataset diff --git a/lib/opentox-ruby.rb b/lib/opentox-ruby.rb index c0bff95..fb3803b 100644 --- a/lib/opentox-ruby.rb +++ b/lib/opentox-ruby.rb @@ -8,6 +8,6 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper', 'authorization', 'policy', 'helper'].each do |lib| +['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper', 'authorization', 'policy', 'helper', 'to-html'].each do |lib| require lib end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 8d787a6..e5ed5c3 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -2,6 +2,22 @@ # hack: store sinatra in global var to make url_for and halt methods accessible before{ $sinatra = self unless $sinatra } +# handle errors manually +# this is to return 502, when an error occurs during a rest-call (see rest_client_wrapper.rb) +set :raise_errors, Proc.new { false } +set :show_exceptions, false +error do + # try if the error is an OpenTox::Error + if OpenTox::Error.parse(request.env['sinatra.error'].to_s) + # if true, this error comes from rest_client_wrapper, halt with 502 + # (502 is defined in OT API as Error coming from other service) + halt 502,request.env['sinatra.error'] + else + # else, raise exception, this will return 500 = internal error + raise request.env['sinatra.error'] + end +end + class Sinatra::Base # overwriting halt to log halts (!= 202) def halt(*response) @@ -60,7 +76,7 @@ class OTLogger < Logger n = 2 line = lines[n] - while (line =~ /spork.rb/ or line =~ /create/ or line =~ /ot-logger.rb/) + while (line =~ /spork.rb/ or line =~ /create/ or line =~ /overwrite.rb/) n += 1 line = lines[n] end diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 5f5273b..2f0e215 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -115,7 +115,7 @@ module OpenTox task = OpenTox::Task.from_yaml(res) when /text\// raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task - task = OpenTox::Task.find(res.to_s) if res.to_s.uri? + task = OpenTox::Task.find(res.to_s.chomp) if res.to_s.uri? else raise "unknown content-type for task: '"+res.content_type.to_s+"'" #+"' content: "+res[0..200].to_s end @@ -151,18 +151,14 @@ module OpenTox File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body) # handle error - # we are either in a task, or in sinatra # PENDING: always return yaml for now - if $self_task #this global var in Task.create to mark that the current process is running in a task - raise error.to_yaml # the error is caught, logged, and task state is set to error in Task.create - #elsif $sinatra #else halt sinatra - #$sinatra.halt(502,error.to_yaml) - elsif defined?(halt) - halt(502,error.to_yaml) - else #for testing purposes (if classes used directly) - raise error.to_yaml - end + # raising OpenTox::Error + # to handle the error yourself, put rest-call in begin, rescue block + # if the error is not caught: + # if we are in a task, the error is caught, logged, and task state is set to error in Task.as_task + # if we are in a default call, the error is handled in overwrite.rb to return 502 (according to OT API) + raise error.to_yaml end end end diff --git a/lib/task.rb b/lib/task.rb index 18fba6e..dcbff3f 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,4 +1,3 @@ -$self_task=nil module OpenTox @@ -60,7 +59,6 @@ module OpenTox task_pid = Spork.spork(:logger => LOGGER) do LOGGER.debug "Task #{task.uri} started #{Time.now}" - $self_task = task begin result = catch(:halt) do @@ -254,7 +252,111 @@ module OpenTox RestClientWrapper.raise_uri_error(ex.message, @uri) end end + + public + #hint: do not overwrite percentageCompleted=, this is used in toYaml + def progress(pct) +# #puts "task := "+pct.to_s +# raise "no numeric >= 0 and <= 100 : '"+pct.to_s+"'" unless pct.is_a?(Numeric) and pct>=0 and pct<=100 +# RestClientWrapper.put(File.join(@uri,'Running'),{:percentageCompleted => pct}) +# reload + end + + end + + # Convenience class to split a (sub)task into subtasks + # + # example: + # a crossvalidation is split into creating datasets and performing the validations + # creating the dataset is 1/3 of the work, perform the validations is 2/3: + # Task.as_task do |task| + # create_datasets( SubTask.new(task, 0, 33) ) + # perfom_validations( SubTask.new(task, 33, 100) ) + # end + # inside the create_datasets / perform_validations you can use subtask.progress() + # with vals from 0-100 + # + # note that you can split a subtask into further subtasks + class SubTask + + def initialize(task, min, max) + raise "not a task or subtask" unless task.is_a?(Task) or task.is_a?(SubTask) + raise "invalid max ("+max.to_s+"), min ("+min.to_s+") params" unless + min.is_a?(Numeric) and max.is_a?(Numeric) and min >= 0 and max <= 100 and max > min + @task = task + @min = min + @max = max + @delta = max - min + end + # convenience method to handle null tasks + def self.create(task, min, max) + if task + SubTask.new(task, min, max) + else + nil + end + end + + def progress(pct) + raise "no numeric >= 0 and <= 100 : '"+pct.to_s+"'" unless pct.is_a?(Numeric) and pct>=0 and pct<=100 + #puts "subtask := "+pct.to_s+" -> task := "+(@min + @delta * pct.to_f * 0.01).to_s + @task.progress( @min + @delta * pct.to_f * 0.01 ) + end + + def running?() + @task.running? + end + end + + + # The David Gallagher feature: + # a fake sub task to keep the progress bar movin for external jobs + # note: param could be a subtask + # + # usage (for a call that is normally finished in under 60 seconds): + # fsk = FakeSubTask.new(task, 60) + # external_lib_call.start + # external_lib_call.wait_until_finished + # fsk.finished + # + # what happens: + # the FakeSubTask updates the task.progress each second until + # runtime is up or the finished mehtod is called + # + # example if the param runtime is too low: + # 25% .. 50% .. 75% .. 100% .. 100% .. 100% .. 100% .. 100% + # example if the param runtime is too high: + # 5% .. 10% .. 15% .. 20% .. 25% .. 30% .. 35% .. 100% + # the latter example is better (keep the bar movin!) + # -> better make a conservative runtime estimate + class FakeSubTask + + def initialize(task, runtime) + @task = task + @thread = Thread.new do + timeleft = runtime + while (timeleft > 0 and @task.running?) + sleep 1 + timeleft -= 1 + @task.progress( (runtime - timeleft) / runtime.to_f * 100 ) + end + end + end + + # convenience method to handle null tasks + def self.create(task, runtime) + if task + FakeSubTask.new(task, runtime) + else + nil + end + end + + def finished + @thread.exit + @task.progress(100) if @task.running? + end end end diff --git a/lib/to-html.rb b/lib/to-html.rb new file mode 100755 index 0000000..1bc1496 --- /dev/null +++ b/lib/to-html.rb @@ -0,0 +1,80 @@ + +OT_LOGO = "http://opentox.informatik.uni-freiburg.de/ot-logo.png" + + +class String + + # encloses URI in text with with link tag + # @return [String] new text with marked links + def link_urls + self.gsub(/(?i)http:\/\/[^\r\n\s']*/, '\0') + end +end + +module OpenTox + + # produces a html page for making web services browser friendly + # format of text (=string params) is preserved (e.g. line breaks) + # urls are marked as links + # @example post params: + # [ [ [:mandatory_param_1], [:mandatory_param_2], [:optional_param,"default_value"] ], + # [ [:alteranative_mandatory_param_1], [:alteranative_mandatory_param_2] ] + # ] + # @param [String] text this is the actual content, + # @param [optional,String] related_links info on related resources + # @param [optional,String] description general info + # @param [optional,Array] post_params, array of arrays containing info on POST operation, see example + # @return [String] html page + def self.text_to_html( text, related_links=nil, description=nil, post_params=nil ) + + title = $sinatra.url_for($sinatra.request.env['PATH_INFO'], :full) if $sinatra + + html = < +EOF + html.chomp! + html += ""+title+"" if title + html += < + +EOF + html.chomp! + html += "

Description

"+description.link_urls+"

" if description + html += "

Related links

"+related_links.link_urls+"

" if related_links + if post_params + html += "

POST parameters

" + count = 0 + post_params.each do |p| + html += "

alternatively:

" if count > 0 + html += "

" + p.each do |k,v| + html += "" + end + html += "
paramdefault_value
"+k.to_s+""+(v!=nil ? v.to_s : "mandatory")+"

" + count += 1 + end + end + html += "

Content

" if description || related_links + html += < +

+EOF + html.chomp! + html += text.link_urls + html += < + + + +EOF + html + end + +end + +#puts OpenTox.text_to_html("bla") \ No newline at end of file -- cgit v1.2.3 From 1db377c898a49417c669a52aaf75014f6a31158f Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 13 Jan 2011 14:10:59 +0100 Subject: remove old classification? in model.rb, add ie hack to overwrite --- lib/model.rb | 36 ------------------------------------ lib/overwrite.rb | 6 +++++- 2 files changed, 5 insertions(+), 37 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index fb266e0..1671ba7 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -56,42 +56,6 @@ module OpenTox raise "unknown model "+[@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], @uri].inspect end -# def classification? -# # TODO test on various services / request to ontology service needed? -# # TODO replace bool (for classification/regression) with string value (more types are coming) -# #raise "classification?: type: "+@type.to_s+", title: "+@title.to_s+", uri: "+@uri.to_s+" "+((@uri =~ /class/) != nil).to_s -# -# load_metadata if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) -# @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables] ) unless @dependentVariable -# case @dependentVariable.feature_type -# when "classification" -# return true -# when "regression" -# return false -# end -# -# if @metadata[OT.isA] =~ /(?i)classification/ -# return true -# end -# -# if @metadata[DC.title] =~ /(?i)classification/ -# return true -# elsif @metadata[DC.title] =~ /(?i)regression/ -# return false -# elsif @uri =~/ntua/ and @metadata[DC.title] =~ /mlr/ -# return false -# elsif @uri =~/tu-muenchen/ and @metadata[DC.title] =~ /regression|M5P|GaussP/ -# return false -# elsif @uri =~/ambit2/ and @metadata[DC.title] =~ /pKa/ || @metadata[DC.title] =~ /Regression|Caco/ -# return false -# elsif @uri =~/majority/ -# return (@uri =~ /class/) != nil -# else -# raise "unknown model, uri:'"+@uri.to_s+"' title:'"+@metadata[DC.title].to_s+"'" -# end -# end -# end - end # Lazy Structure Activity Relationship class diff --git a/lib/overwrite.rb b/lib/overwrite.rb index e5ed5c3..ffeba21 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -1,6 +1,10 @@ # class overwrites aka monkey patches # hack: store sinatra in global var to make url_for and halt methods accessible -before{ $sinatra = self unless $sinatra } +before { + $sinatra = self unless $sinatra + # stupid internet explorer does not ask for text/html, add this manually + request.env['HTTP_ACCEPT'] += ";text/html" if request.env["HTTP_USER_AGENT"]=~/MSIE/ +} # handle errors manually # this is to return 502, when an error occurs during a rest-call (see rest_client_wrapper.rb) -- cgit v1.2.3 From 97e3942191e1ab8f084ba8da475749a9609c37aa Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 14 Jan 2011 14:54:14 +0100 Subject: add percentage completed support --- lib/algorithm.rb | 5 ++-- lib/model.rb | 12 ++++++-- lib/rest_client_wrapper.rb | 68 ++++++++++++++++++++++++++++++++++------------ lib/task.rb | 33 +++++++++++++--------- 4 files changed, 83 insertions(+), 35 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 0aa86e6..58a2640 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -13,9 +13,10 @@ module OpenTox # Execute algorithm with parameters, please consult the OpenTox API and the webservice documentation for acceptable parameters # @param [optional,Hash] params Algorithm parameters + # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [String] URI of new resource (dataset, model, ...) - def run(params=nil) - RestClientWrapper.post(@uri, {:accept => 'text/uri-list'}, params).to_s + def run(params=nil, waiting_task=nil) + RestClientWrapper.post(@uri, {:accept => 'text/uri-list'}, params, waiting_task).to_s end # Get OWL-DL representation in RDF/XML format diff --git a/lib/model.rb b/lib/model.rb index 1671ba7..e95c78c 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -6,15 +6,16 @@ module OpenTox # Run a model with parameters # @param [Hash] params Parameters for OpenTox model + # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [text/uri-list] Task or resource URI - def run(params) + def run( params, waiting_task=nil ) if CONFIG[:yaml_hosts].include?(URI.parse(@uri).host) accept = 'application/x-yaml' else accept = 'application/rdf+xml' end begin - RestClientWrapper.post(@uri,{:accept => accept},params).to_s + RestClientWrapper.post(@uri,{:accept => accept},params,waiting_task).to_s rescue => e LOGGER.error "Failed to run #{@uri} with #{params.inspect} (#{e.inspect})" raise "Failed to run #{@uri} with #{params.inspect}" @@ -121,8 +122,10 @@ module OpenTox # Predict a dataset # @param [String] dataset_uri Dataset URI + # @param [optional,subjectid] + # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::Dataset] Dataset with predictions - def predict_dataset(dataset_uri, subjectid=nil) + def predict_dataset(dataset_uri, subjectid=nil, waiting_task=nil) @prediction_dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid) @prediction_dataset.add_metadata({ OT.hasSource => @uri, @@ -132,9 +135,12 @@ module OpenTox }) d = Dataset.new(dataset_uri) d.load_compounds + count = 0 d.compounds.each do |compound_uri| begin predict(compound_uri,false,subjectid) + count += 1 + waiting_task.progress( count/d.compounds.size.to_f*100.0 ) if waiting_task rescue => ex LOGGER.warn "prediction for compound "+compound_uri.to_s+" failed: "+ex.message end diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 2f0e215..920a828 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -34,33 +34,67 @@ module OpenTox class RestClientWrapper - def self.get(uri, headers=nil, wait=true) - execute( "get", uri, headers, nil, wait) + # performs a GET REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # per default: waits for Task to finish and returns result URI of Task + # @param [String] uri destination URI + # @param [optional,Hash] headers contains params like accept-header + # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param [wait,Boolean] wait set to false to NOT wait for task if result is task + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def self.get(uri, headers=nil, waiting_task=nil, wait=true ) + execute( "get", uri, headers, nil, waiting_task, wait) end - def self.post(uri, headers, payload=nil, wait=true) - execute( "post", uri, headers, payload, wait ) + # performs a POST REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # per default: waits for Task to finish and returns result URI of Task + # @param [String] uri destination URI + # @param [optional,Hash] headers contains params like accept-header + # @param [optional,String] payload data posted to the service + # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param [wait,Boolean] wait set to false to NOT wait for task if result is task + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def self.post(uri, headers, payload=nil, waiting_task=nil, wait=true ) + execute( "post", uri, headers, payload, waiting_task, wait ) end + # performs a PUT REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # @param [String] uri destination URI + # @param [optional,Hash] headers contains params like accept-header + # @param [optional,String] payload data put to the service + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call def self.put(uri, headers, payload=nil ) execute( "put", uri, headers, payload ) end - def self.delete(uri, headers=nil) + # performs a DELETE REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # @param [String] uri destination URI + # @param [optional,Hash] headers contains params like accept-header + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def self.delete(uri, headers=nil ) execute( "delete", uri, headers, nil) end + # raises an Error message (rescued in overwrite.rb -> halt 502) + # usage: if the return value of a call is invalid + # @param [String] error_msg the error message + # @param [String] uri destination URI that is responsible for the error + # @param [optional,Hash] headers sent to the URI + # @param [optional,String] payload data sent to the URI def self.raise_uri_error(error_msg, uri, headers=nil, payload=nil) - do_halt( "-", error_msg, uri, headers, payload ) + raise_ot_error( "-", error_msg, uri, headers, payload ) end private - def self.execute( rest_call, uri, headers, payload=nil, wait=true ) + def self.execute( rest_call, uri, headers, payload=nil, waiting_task=nil, wait=true ) - do_halt 400,"uri is null",uri,headers,payload unless uri - do_halt 400,"not a uri",uri,headers,payload unless uri.to_s.uri? - do_halt 400,"headers are no hash",uri,headers,payload unless headers==nil or headers.is_a?(Hash) - do_halt 400,"nil headers for post not allowed, use {}",uri,headers,payload if rest_call=="post" and headers==nil + raise_ot_error 400,"uri is null",uri,headers,payload unless uri + raise_ot_error 400,"not a uri",uri,headers,payload unless uri.to_s.uri? + raise_ot_error 400,"headers are no hash",uri,headers,payload unless headers==nil or headers.is_a?(Hash) + raise_ot_error 400,"nil headers for post not allowed, use {}",uri,headers,payload if rest_call=="post" and headers==nil headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems begin @@ -84,13 +118,13 @@ module OpenTox return res if res.code==200 || !wait while (res.code==201 || res.code==202) - res = wait_for_task(res, uri) + res = wait_for_task(res, uri, waiting_task) end raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200 return res rescue RestClient::RequestTimeout => ex - do_halt 408,ex.message,uri,headers,payload + raise_ot_error 408,ex.message,uri,headers,payload rescue => ex #raise ex #raise "'"+ex.message+"' uri: "+uri.to_s @@ -101,11 +135,11 @@ module OpenTox code = 500 msg = ex.to_s end - do_halt code,msg,uri,headers,payload + raise_ot_error code,msg,uri,headers,payload end end - def self.wait_for_task( res, base_uri ) + def self.wait_for_task( res, base_uri, waiting_task=nil ) task = nil case res.content_type @@ -121,7 +155,7 @@ module OpenTox end LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" - task.wait_for_completion + task.wait_for_completion waiting_task raise task.description unless task.completed? # maybe task was cancelled / error res = WrapperResult.new task.result_uri @@ -130,7 +164,7 @@ module OpenTox return res end - def self.do_halt( code, body, uri, headers, payload=nil ) + def self.raise_ot_error( code, body, uri, headers, payload=nil ) #build error causing_errors = Error.parse(body) diff --git a/lib/task.rb b/lib/task.rb index dcbff3f..d701c82 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -12,7 +12,7 @@ module OpenTox DC.title => "", DC.date => "", OT.hasStatus => "Running", - OT.percentageCompleted => "0", + OT.percentageCompleted => 0.0, OT.resultURI => "", DC.creator => "", # not mandatory according to API DC.description => "", # not mandatory according to API @@ -160,12 +160,12 @@ module OpenTox def load_metadata if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) - result = RestClientWrapper.get(@uri, {:accept => 'application/x-yaml'}, false) + result = RestClientWrapper.get(@uri, {:accept => 'application/x-yaml'}, nil, false) @metadata = YAML.load result.to_s @http_code = result.code else @metadata = Parser::Owl::Generic.new(@uri).load_metadata - @http_code = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, false).code + @http_code = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, nil, false).code end end @@ -216,7 +216,9 @@ module OpenTox =end # waits for a task, unless time exceeds or state is no longer running - def wait_for_completion(dur=0.3) + # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param [optional,Numeric] dur seconds pausing before cheking again for completion + def wait_for_completion( waiting_task=nil, dur=0.3) due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION LOGGER.debug "start waiting for task "+@uri.to_s+" at: "+Time.new.to_s+", waiting at least until "+due_to_time.to_s @@ -226,6 +228,8 @@ module OpenTox while self.running? sleep dur load_metadata + # if another (sub)task is waiting for self, set progress accordingly + waiting_task.progress(@metadata[OT.percentageCompleted]) if waiting_task check_state if (Time.new > due_to_time) raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" @@ -234,6 +238,18 @@ module OpenTox LOGGER.debug "Task '"+@metadata[OT.hasStatus]+"': "+@uri.to_s+", Result: "+@metadata[OT.resultURI].to_s end + + # updates percentageCompleted value (can only be increased) + # task has to be running + # @param [Numeric] pct value between 0 and 100 + def progress(pct) + #puts "task := "+pct.to_s + raise "no numeric >= 0 and <= 100 : '"+pct.to_s+"'" unless pct.is_a?(Numeric) and pct>=0 and pct<=100 + if (pct > @metadata[OT.percentageCompleted] + 0.0001) + RestClientWrapper.put(File.join(@uri,'Running'),{:percentageCompleted => pct}) + load_metadata + end + end private def check_state @@ -252,15 +268,6 @@ module OpenTox RestClientWrapper.raise_uri_error(ex.message, @uri) end end - - public - #hint: do not overwrite percentageCompleted=, this is used in toYaml - def progress(pct) -# #puts "task := "+pct.to_s -# raise "no numeric >= 0 and <= 100 : '"+pct.to_s+"'" unless pct.is_a?(Numeric) and pct>=0 and pct<=100 -# RestClientWrapper.put(File.join(@uri,'Running'),{:percentageCompleted => pct}) -# reload - end end -- cgit v1.2.3 From 9197d6a6503b3995e6f9499840e91a9ed6d3a1db Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 18 Jan 2011 13:07:52 +0100 Subject: get subjectid from api-wrapper helper --- lib/environment.rb | 3 +++ lib/helper.rb | 13 ++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index 1761d92..203ebc6 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -84,6 +84,9 @@ class OwlNamespace end AA_SERVER = CONFIG[:authorization] ? (CONFIG[:authorization][:server] ? CONFIG[:authorization][:server] : nil) : nil +CONFIG[:authorization][:authenticate_request] = [""] unless CONFIG[:authorization][:authenticate_request] +CONFIG[:authorization][:authorize_request] = [""] unless CONFIG[:authorization][:authorize_request] +CONFIG[:authorization][:free_request] = [""] unless CONFIG[:authorization][:free_request] RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' OWL = OwlNamespace.new 'http://www.w3.org/2002/07/owl#' diff --git a/lib/helper.rb b/lib/helper.rb index 857c5b5..cc643f3 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -17,16 +17,18 @@ helpers do #Check Authorization for URI with method and subjectid. def authorized?(subjectid) + request_method = request.env['REQUEST_METHOD'] uri = clean_uri("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}") - if CONFIG[:authorization][:authorize_request].include?(request.env['REQUEST_METHOD']) - ret = OpenTox::Authorization.authorize(uri, request.env['REQUEST_METHOD'], subjectid) - LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, subjectid: #{subjectid} with return >>#{ret}<<" + request_method = "GET" if request_method == "POST" && uri =~ /\/model\/\d+\/?$/ + if CONFIG[:authorization][:authorize_request].include?(request_method) + ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) + LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request_method} , URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, subjectid: #{subjectid} with return >>#{ret}<<" return ret end - if CONFIG[:authorization][:authenticate_request].include?(env['REQUEST_METHOD']) + if CONFIG[:authorization][:authenticate_request].include?(request_method) return true if OpenTox::Authorization.is_token_valid(subjectid) end - LOGGER.debug "Not authorized for: #{request.env['rack.url_scheme']}://#{request['REQUEST_URI']} with Method: #{request.env['REQUEST_METHOD']} with Token #{subjectid}" + LOGGER.debug "Not authorized for: #{uri} with Method: #{request.env['REQUEST_METHOD']}/#{request_method} with Token #{subjectid}" return false end @@ -68,6 +70,7 @@ before do subjectid = request.env['HTTP_SUBJECTID'] if request.env['HTTP_SUBJECTID'] and !check_subjectid(subjectid) # see http://rack.rubyforge.org/doc/SPEC.html subjectid = CGI.unescape(subjectid) if subjectid.include?("%23") + @subjectid = subjectid rescue LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO subjectid for URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" subjectid = "" -- cgit v1.2.3 From dbd302164b74de2b241627bcc205de7245ea0da1 Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 18 Jan 2011 17:15:14 +0100 Subject: refactoring A&A --- lib/authorization.rb | 6 +++++- lib/helper.rb | 30 ++++++++++++++---------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index dab228a..7e898cc 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -286,7 +286,11 @@ module OpenTox end true end - + + class << self + alias :token_valid? :is_token_valid + end + end end diff --git a/lib/helper.rb b/lib/helper.rb index cc643f3..5fe1857 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -3,18 +3,21 @@ helpers do # Authentification def protected!(subjectid) if env["session"] - flash[:notice] = "You don't have access to this section: " and \ - redirect back and \ - return unless authorized?(subjectid) + unless authorized?(subjectid) + flash[:notice] = "You don't have access to this section: " + redirect back + end elsif !env["session"] && subjectid - throw(:halt, [401, "Not authorized.\n"]) and \ - redirect back and \ - return unless authorized?(subjectid) + unless authorized?(subjectid) + throw(:halt, [401, "Not authorized.\n"]) + redirect back + end + else + throw(:halt, [401, "Not authorized.\n"]) unless authorized?(subjectid) end - throw(:halt, [401, "Not authorized.\n"]) and \ - return unless authorized?(subjectid) end + #Check Authorization for URI with method and subjectid. def authorized?(subjectid) request_method = request.env['REQUEST_METHOD'] @@ -40,12 +43,6 @@ helpers do "#{out.scheme}:" + (out.port != 80 ? out.port : "") + "//#{out.host}#{out.path}" end - def check_subjectid(subjectid) - return false if !subjectid - return true if subjectid.size > 62 - false - end - #unprotected uris for login/logout, webapplication ... def unprotected_requests case env['REQUEST_URI'] @@ -65,9 +62,10 @@ end before do unless unprotected_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) begin + subjectid = nil subjectid = session[:subjectid] if session[:subjectid] - subjectid = params[:subjectid] if params[:subjectid] and !check_subjectid(subjectid) - subjectid = request.env['HTTP_SUBJECTID'] if request.env['HTTP_SUBJECTID'] and !check_subjectid(subjectid) + subjectid = params[:subjectid] if params[:subjectid] and !subjectid + subjectid = request.env['HTTP_SUBJECTID'] if request.env['HTTP_SUBJECTID'] and !subjectid # see http://rack.rubyforge.org/doc/SPEC.html subjectid = CGI.unescape(subjectid) if subjectid.include?("%23") @subjectid = subjectid -- cgit v1.2.3 From 23d96df630689d122c023d76ec1d40d7688d2c96 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 19 Jan 2011 15:59:12 +0100 Subject: extend authorization and rdf serialization for validation --- lib/authorization.rb | 48 ++++++++++++++++---- lib/dataset.rb | 7 +-- lib/error.rb | 11 +++++ lib/helper.rb | 25 ++++++----- lib/opentox-ruby.rb | 3 +- lib/overwrite.rb | 10 +++-- lib/policy.rb | 10 +++++ lib/serializer.rb | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib/to-html.rb | 3 +- 9 files changed, 213 insertions(+), 28 deletions(-) create mode 100644 lib/error.rb diff --git a/lib/authorization.rb b/lib/authorization.rb index f9499e6..c33f712 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -132,6 +132,20 @@ module OpenTox end end + # Lists policies alongside with affected uris + # @param [String] subjectid + # @return [Hash] keys: all policies of the subjectid owner, values: uris affected by those policies + def self.list_policy_uris( subjectid ) + names = list_policies(subjectid) + policies = {} + names.each do |n| + p = OpenTox::Policies.new + p.load_xml( list_policy(n, subjectid) ) + policies[n] = p.uris + end + policies + end + #Returns the owner (who created the first policy) of an URI # @param [String, String]uri,subjectid # return [String, nil]owner,nil returns owner of the URI @@ -271,21 +285,37 @@ module OpenTox return true end - #Checks (if subjectid is valid) if a policy exist and create default policy if not + # Checks (if subjectid is valid) if a policy exist and create default policy if not + # @param [String] uri + # @param [String] subjectid + # @return [Boolean] true if policy checked/created successfully (or no uri/subjectid given), false else def self.check_policy(uri, subjectid) + return true unless uri and subjectid token_valid = OpenTox::Authorization.is_token_valid(subjectid) LOGGER.debug "OpenTox::Authorization.check_policy with uri: #{uri}, subjectid: #{subjectid} is valid: #{token_valid}" - if uri and token_valid - if !uri_has_policy(uri, subjectid) - return send_policy(uri, subjectid) - else - LOGGER.debug "OpenTox::Authorization.check_policy URI: #{uri} has already a Policy." + # check if subjectid is valid + unless token_valid + # abort if invalid + LOGGER.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{subjectid}" + return false + end + + if !uri_has_policy(uri, subjectid) + # if no policy exists, create a policy, return result of send policy + send_policy(uri, subjectid) + else + LOGGER.debug "OpenTox::Authorization.check_policy URI: #{uri} has already a Policy." + # if policy exists check for POST rights + if authorize(uri, "POST", subjectid) + true + else + LOGGER.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{subjectid}" + false end end - true - end + end - end + end end diff --git a/lib/dataset.rb b/lib/dataset.rb index d45c821..ae86f5f 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -253,11 +253,12 @@ module OpenTox # @param [Array] compounds List of compound URIs # @param [Array] features List of feature URIs # @param [Hash] metadata Hash containing the metadata for the new dataset + # @param [String] subjectid # @return [OpenTox::Dataset] newly created dataset, already saved - def split( compounds, features, metadata) + def split( compounds, features, metadata, subjectid=nil) LOGGER.debug "split dataset using "+compounds.size.to_s+"/"+@compounds.size.to_s+" compounds" raise "no new compounds selected" unless compounds and compounds.size>0 - dataset = OpenTox::Dataset.create + dataset = OpenTox::Dataset.create(CONFIG[:services]["opentox-dataset"],subjectid) if features.size==0 compounds.each{ |c| dataset.add_compound(c) } else @@ -270,7 +271,7 @@ module OpenTox end end dataset.add_metadata(metadata) - dataset.save + dataset.save(subjectid) dataset end diff --git a/lib/error.rb b/lib/error.rb new file mode 100644 index 0000000..87e1a5d --- /dev/null +++ b/lib/error.rb @@ -0,0 +1,11 @@ +module OpenTox + + class NotFoundError < RuntimeError + + end + + class BadRequestError < RuntimeError + + end + +end \ No newline at end of file diff --git a/lib/helper.rb b/lib/helper.rb index 965b4ad..bb0279e 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -3,22 +3,24 @@ helpers do # Authentification def protected!(subjectid) if env["session"] - flash[:notice] = "You don't have access to this section: " and \ - redirect back and \ - return unless authorized?(subjectid) + unless authorized?(subjectid) + flash[:notice] = "You don't have access to this section: " + redirect back + end elsif !env["session"] && subjectid - throw(:halt, [401, "Not authorized.\n"]) and \ - redirect back and \ - return unless authorized?(subjectid) + unless authorized?(subjectid) + throw(:halt, [401, "Not authorized.\n"]) + redirect back + end + else + throw(:halt, [401, "Not authorized.\n"]) unless authorized?(subjectid) end - throw(:halt, [401, "Not authorized.\n"]) and \ - return unless authorized?(subjectid) end def authorized?(subjectid) if CONFIG[:authorization][:authorize_request].include?(request.env['REQUEST_METHOD']) ret = OpenTox::Authorization.authorize("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}", request.env['REQUEST_METHOD'], subjectid) - LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']} , URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, subjectid: #{subjectid} with return #{ret}." + LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request.env['REQUEST_METHOD']}, URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, subjectid: #{subjectid} with return #{ret}." return ret end if CONFIG[:authorization][:authenticate_request].include?(env['REQUEST_METHOD']) @@ -49,7 +51,7 @@ helpers do end before do - unless unprotected_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) + unless !AA_SERVER or unprotected_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) begin subjectid = session[:subjectid] if session[:subjectid] subjectid = params[:subjectid] if params[:subjectid] and !check_subjectid(subjectid) @@ -60,7 +62,8 @@ before do LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO subjectid for URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" subjectid = "" end - protected!(subjectid) if AA_SERVER + @subjectid = subjectid + protected!(subjectid) end end diff --git a/lib/opentox-ruby.rb b/lib/opentox-ruby.rb index fb3803b..fc1732d 100644 --- a/lib/opentox-ruby.rb +++ b/lib/opentox-ruby.rb @@ -8,6 +8,7 @@ rescue LoadError puts "Please install Openbabel with 'rake openbabel:install' in the compound component" end -['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper', 'authorization', 'policy', 'helper', 'to-html'].each do |lib| +['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', + 'rest_client_wrapper', 'authorization', 'policy', 'helper', 'to-html', 'error' ].each do |lib| require lib end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index ffeba21..720ed77 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -1,7 +1,11 @@ # class overwrites aka monkey patches -# hack: store sinatra in global var to make url_for and halt methods accessible +# hack: store sinatra instance in global var $url_provider to make url_for and halt methods accessible before { - $sinatra = self unless $sinatra + raise "should not happen, url provider already differently initialized "+ + $url_provider.request.host.to_s+" != "+self.request.host.to_s if + $url_provider and $url_provider.request.host!=self.request.host and + $url_provider.request.script_name!=self.request.script_name + $url_provider = self # stupid internet explorer does not ask for text/html, add this manually request.env['HTTP_ACCEPT'] += ";text/html" if request.env["HTTP_USER_AGENT"]=~/MSIE/ } @@ -91,7 +95,7 @@ class OTLogger < Logger end def format(msg) - pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace+" :: "+($sinatra ? $sinatra.request.env['REMOTE_ADDR'] : nil).to_s + pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace end def debug(msg) diff --git a/lib/policy.rb b/lib/policy.rb index 0ef8298..08bf6ed 100644 --- a/lib/policy.rb +++ b/lib/policy.rb @@ -32,6 +32,11 @@ module OpenTox end return true end + + # @return [Array] set of arrays affected by policies + def uris + @policies.collect{ |k,v| v.uris }.flatten.uniq + end #loads a default policy template in policies instance def load_default_policy(user, uri, group="member") @@ -190,6 +195,11 @@ module OpenTox @subjects[name] = Subject.new(name, type, value) end + # @return [Array] set of uris affected by policy + def uris + @rules.collect{ |k,v| v.uri }.uniq + end + #rule inside a policy class Rule diff --git a/lib/serializer.rb b/lib/serializer.rb index 495702a..03c2639 100644 --- a/lib/serializer.rb +++ b/lib/serializer.rb @@ -26,6 +26,15 @@ module OpenTox OT.Algorithm => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.Parameter => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.Task => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + #classes for validation + OT.Validation => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.ClassificationStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.ConfusionMatrix => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.ConfusionMatrixCell => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.ClassValueStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.RegressionStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.Crossvalidation => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.CrossvalidationInfo => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.compound => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.feature => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , @@ -34,6 +43,22 @@ module OpenTox OT.values => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.algorithm => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.parameters => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + #object props for validation# + OT.model => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.trainingDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.predictionFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.predictionDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.crossvalidation => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.testTargetDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.testDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.classificationStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.confusionMatrix => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.confusionMatrixCell => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.classValueStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.regressionStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.validation => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.crossvalidationInfo => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.dataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , DC.title => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , DC.identifier => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , @@ -47,6 +72,47 @@ module OpenTox OT.hasStatus => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.resultURI => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.percentageCompleted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + # annotation props for validation + OT.numUnpredicted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.crossvalidationFold => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.numInstances => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.numWithoutClass => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.percentWithoutClass => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.percentUnpredicted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.confusionMatrixActual => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.confusionMatrixPredicted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.confusionMatrixValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.numIncorrect => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.percentCorrect => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.numCorrect => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.accuracy => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.trueNegativeRate => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.truePositiveRate => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.falseNegativeRate => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.falsePositiveRate => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.numTrueNegatives => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.numTruePositives => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.numFalseNegatives => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.numFalsePositives => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.classValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.precision => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.areaUnderRoc => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.weightedAreaUnderRoc => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.fMeasure => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.percentIncorrect => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.validationType => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.realRuntime => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.sampleCorrelationCoefficient => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.targetVarianceActual => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.targetVariancePredicted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.meanAbsoluteError => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.sumSquaredError => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.rootMeanSquaredError => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.rSquare => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.stratified => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.numFolds => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.randomSeed => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.reportType => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.hasSource => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , OT.value => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , @@ -121,6 +187,64 @@ module OpenTox @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Task }] } add_metadata uri, metadata end + + # Add a resource defined by resource_class and content + # (see documentation of add_content for example) + # @param [String] uri of resource + # @param [String] resource class, e.g. OT.Validation + # @param [Hash] content as hash + def add_resource(uri, resource_class, content) + @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => resource_class }] } + @@content_id = 1 + add_content uri, content + end + + private + @@content_id = 1 + + # Recursiv function to add content + # @example + # { DC.description => "bla", + # OT.similar_resources => [ "http://uri1", "http://uri2" ], + # OT.matrixCells => + # [ { RDF.type => OT.MatrixCell, OT.cellIndex=1 OT.cellValue => "xy" }, + # { RDF.type => OT.MatrixCell, OT.cellIndex=2 OT.cellValue => "z" } ], + # OT.info => { RDF.type => OT.ImportantInfo, + # DC.description => "blub" } + # } + # @param [String] uri + # @param [Hash] content as hash, uri must already have been added to @object + def add_content(uri, hash) + raise "content is no hash: "+hash.class.to_s unless hash.is_a?(Hash) + hash.each do |u,v| + if v.is_a? Hash + # value is again a hash, i.e. a new owl class is added + # first make sure type (==class) is set + type = v[RDF.type] + raise "type missing for "+u.to_s+" content:\n"+v.inspect unless type + raise "class unknown "+type.to_s+" (for "+u.to_s+")" unless @object.has_key?(type) + # create new node and add to current uri + genid = "_:#{type.split('#')[-1]}#{@@content_id}" + @@content_id += 1 + @object[uri] = {} unless @object[uri] + @object[uri][u] = [{ "type" => "bnode", "value" => genid }] + # add content to new class + add_hash(genid,v) + elsif v.is_a? Array + # value is an array, i.e. a list of values with property is added + v.each{ |vv| add_hash( uri, { u => vv } ) } + else # v.is_a? String + # simple string value + @object[uri] = {} unless @object[uri] + @object[uri][u] = [] unless @object[uri][u] + raise "property unknown "+u.to_s if !@object.has_key?(u) and u!=RDF.type + # use << to allow different values for one property + @object[uri][u] << {"type" => type(v), "value" => v } + end + end + end + + public # Add metadata # @param [Hash] metadata diff --git a/lib/to-html.rb b/lib/to-html.rb index 1bc1496..e9764ef 100755 --- a/lib/to-html.rb +++ b/lib/to-html.rb @@ -27,7 +27,8 @@ module OpenTox # @return [String] html page def self.text_to_html( text, related_links=nil, description=nil, post_params=nil ) - title = $sinatra.url_for($sinatra.request.env['PATH_INFO'], :full) if $sinatra + # TODO add title as parameter + title = nil #$sinatra.url_for($sinatra.request.env['PATH_INFO'], :full) if $sinatra html = < -- cgit v1.2.3 From 9d06bd3024139f2bfee4722c7536ee4ffa99fe32 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 20 Jan 2011 11:29:53 +0100 Subject: implemented new error handling, still TODO rdf-support, replace halts --- lib/error.rb | 60 +++++++++++++++++++++++++++--- lib/opentox-ruby.rb | 4 +- lib/overwrite.rb | 44 +++++++++++----------- lib/rest_client_wrapper.rb | 91 ++++++++++------------------------------------ 4 files changed, 99 insertions(+), 100 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 87e1a5d..b72ce7e 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,11 +1,61 @@ -module OpenTox - class NotFoundError < RuntimeError - +# adding additional fields to Exception class to format errors according to OT-API +class Exception + attr_accessor :creator, :errorCause, :id +end + +module OpenTox + + class NotAuthorizedError < Exception end - class BadRequestError < RuntimeError - + class NotFoundError < Exception end + class BadRequestError < Exception + end + + class RestCallError < Exception + attr_accessor :code, :body, :uri, :payload, :headers + end + + class ErrorReport + + # formats error according to accept-header, yaml is default + # ( sets content-type in response accordingly ) + # @param [Exception] error + # @param |Sinatra::Request, optional] request + # @param [Sinatra::Response, optiona,] response, optional to set content-type + # @return [String] formated error + def self.format(error, request=nil, response=nil) + # sets current uri + error.creator = "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" if request + accept = request.env['HTTP_ACCEPT'].to_s if request + case accept + # when /rdf/ + # TODO add error to rdf + when /html/ + response['Content-Type'] = 'text/html' if response + OpenTox.text_to_html error.to_yaml + else + response['Content-Type'] = 'application/x-yaml' if response + error.to_yaml + end + end + + # trys to parse error from text + # @return [Exception] Exception if parsing sucessfull, nil otherwise + def self.parse( body ) + begin + err = YAML.load(body) + if err and err.is_a?(Exception) + return err + else + return nil + end + rescue + return nil + end + end + end end \ No newline at end of file diff --git a/lib/opentox-ruby.rb b/lib/opentox-ruby.rb index fc1732d..735b845 100644 --- a/lib/opentox-ruby.rb +++ b/lib/opentox-ruby.rb @@ -1,4 +1,4 @@ -['rubygems', 'sinatra', 'sinatra/url_for', 'rest_client', 'yaml', 'cgi', 'spork', 'overwrite', 'environment'].each do |lib| +['rubygems', 'sinatra', 'sinatra/url_for', 'rest_client', 'yaml', 'cgi', 'spork', 'error', 'overwrite', 'environment'].each do |lib| require lib end @@ -9,6 +9,6 @@ rescue LoadError end ['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', - 'rest_client_wrapper', 'authorization', 'policy', 'helper', 'to-html', 'error' ].each do |lib| + 'rest_client_wrapper', 'authorization', 'policy', 'helper', 'to-html' ].each do |lib| require lib end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 720ed77..2f9fabd 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -10,30 +10,30 @@ before { request.env['HTTP_ACCEPT'] += ";text/html" if request.env["HTTP_USER_AGENT"]=~/MSIE/ } -# handle errors manually -# this is to return 502, when an error occurs during a rest-call (see rest_client_wrapper.rb) -set :raise_errors, Proc.new { false } -set :show_exceptions, false -error do - # try if the error is an OpenTox::Error - if OpenTox::Error.parse(request.env['sinatra.error'].to_s) - # if true, this error comes from rest_client_wrapper, halt with 502 - # (502 is defined in OT API as Error coming from other service) - halt 502,request.env['sinatra.error'] +# Error handling +# Errors are logged as error and formated according to acccept-header +# Non OpenTox::Errors (defined in error.rb) are handled as internal error (500), stacktrace is logged +# IMPT: set sinatra settings :show_exceptions + :raise_errors to false in config.ru, otherwise Rack::Showexceptions takes over +error Exception do + error = request.env['sinatra.error'] + # log error to logfile + LOGGER.error error.class.to_s+": "+error.message + case error.class + when OpenTox::BadRequestError + code = 400 + when OpenTox::NotAuthorizedError + code = 401 + when OpenTox::NotFoundError + code = 404 + when OpenTox::RestCallError + code = 502 else - # else, raise exception, this will return 500 = internal error - raise request.env['sinatra.error'] - end -end - -class Sinatra::Base - # overwriting halt to log halts (!= 202) - def halt(*response) - LOGGER.error "halt "+response.first.to_s+" "+(response.size>1 ? response[1].to_s : "") if response and response.first and response.first >= 300 - # orig sinatra code: - response = response.first if response.length == 1 - throw :halt, response + # (unwanted RuntimeExceptions as well as sth. like 'raise "invalid state"' is handled here) + code = 500 + # log backtrace for debugging + LOGGER.error error.backtrace.join("\n") end + halt code,OpenTox::ErrorReport.format(error,request,response) end class String diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 920a828..5bc8072 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -1,32 +1,4 @@ module OpenTox - - #PENDING: implement ot error api, move to own file - class Error - - attr_accessor :code, :body, :uri, :payload, :headers - - def initialize(code, body, uri, payload, headers) - self.code = code - self.body = body.to_s[0..1000] - self.uri = uri - self.payload = payload - self.headers = headers - end - - def self.parse(error_array_string) - begin - err = YAML.load(error_array_string) - if err and err.is_a?(Array) and err.size>0 and err[0].is_a?(Error) - return err - else - return nil - end - rescue - return nil - end - end - - end class WrapperResult < String attr_accessor :content_type, :code @@ -85,16 +57,16 @@ module OpenTox # @param [optional,Hash] headers sent to the URI # @param [optional,String] payload data sent to the URI def self.raise_uri_error(error_msg, uri, headers=nil, payload=nil) - raise_ot_error( "-", error_msg, uri, headers, payload ) + raise_ot_error( nil, error_msg, nil, uri, headers, payload ) end private def self.execute( rest_call, uri, headers, payload=nil, waiting_task=nil, wait=true ) - raise_ot_error 400,"uri is null",uri,headers,payload unless uri - raise_ot_error 400,"not a uri",uri,headers,payload unless uri.to_s.uri? - raise_ot_error 400,"headers are no hash",uri,headers,payload unless headers==nil or headers.is_a?(Hash) - raise_ot_error 400,"nil headers for post not allowed, use {}",uri,headers,payload if rest_call=="post" and headers==nil + raise OpenTox::BadRequestError.new "uri is null" unless uri + raise OpenTox::BadRequestError.new "not a uri: "+uri.to_s unless uri.to_s.uri? + raise OpenTox::BadRequestError.new "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) + raise OpenTox::BadRequestError.new "nil headers for post not allowed, use {}" if rest_call=="post" and headers==nil headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems begin @@ -124,18 +96,11 @@ module OpenTox return res rescue RestClient::RequestTimeout => ex - raise_ot_error 408,ex.message,uri,headers,payload + raise_ot_error 408,ex.message,nil,ex.uri,headers,payload + rescue RestClient::ExceptionWithResponse => ex + raise_ot_error ex.http_code,ex.message,ex.http_body,uri,headers,payload rescue => ex - #raise ex - #raise "'"+ex.message+"' uri: "+uri.to_s - begin - code = ex.http_code - msg = ex.http_body - rescue - code = 500 - msg = ex.to_s - end - raise_ot_error code,msg,uri,headers,payload + raise_ot_error 500,ex.message,nil,uri,headers,payload end end @@ -164,35 +129,19 @@ module OpenTox return res end - def self.raise_ot_error( code, body, uri, headers, payload=nil ) - - #build error - causing_errors = Error.parse(body) - if causing_errors - error = causing_errors + [Error.new(code, "subsequent error", uri, payload, headers)] + def self.raise_ot_error( code, message, body, uri, headers, payload=nil ) + error = OpenTox::RestCallError.new("REST call returned error: '"+message.to_s+"'") + error.code = code + error.uri = uri + error.headers = headers + error.payload = payload + parsed = OpenTox::ErrorReport.parse(body) if body + if parsed + error.errorCause = parsed else - error = [Error.new(code, body, uri, payload, headers)] + error.body = body end - - #debug utility: write error to file - error_dir = "/tmp/ot_errors" - FileUtils.mkdir(error_dir) unless File.exist?(error_dir) - raise "could not create error dir" unless File.exist?(error_dir) and File.directory?(error_dir) - file_name = "error" - time=Time.now.strftime("%m.%d.%Y-%H:%M:%S") - count = 1 - count+=1 while File.exist?(File.join(error_dir,file_name+"_"+time+"_"+count.to_s)) - File.new(File.join(error_dir,file_name+"_"+time+"_"+count.to_s),"w").puts(body) - - # handle error - # PENDING: always return yaml for now - - # raising OpenTox::Error - # to handle the error yourself, put rest-call in begin, rescue block - # if the error is not caught: - # if we are in a task, the error is caught, logged, and task state is set to error in Task.as_task - # if we are in a default call, the error is handled in overwrite.rb to return 502 (according to OT API) - raise error.to_yaml + raise error end end end -- cgit v1.2.3 From 0e759bee80e2668e1fec7b741a4ea18015f98b84 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 21 Jan 2011 11:52:53 +0100 Subject: simplify error handling once again, and adding http code --- lib/error.rb | 18 +++++++++++++----- lib/overwrite.rb | 19 +++---------------- lib/rest_client_wrapper.rb | 10 +++++----- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index b72ce7e..e47ad62 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,22 +1,27 @@ # adding additional fields to Exception class to format errors according to OT-API class Exception - attr_accessor :creator, :errorCause, :id + attr_accessor :creator, :errorCause, :id, :http_code + def http_code; 500; end end module OpenTox - class NotAuthorizedError < Exception + class BadRequestError < Exception + def http_code; 400; end end - class NotFoundError < Exception + class NotAuthorizedError < Exception + def http_code; 401; end end - class BadRequestError < Exception + class NotFoundError < Exception + def http_code; 404; end end class RestCallError < Exception - attr_accessor :code, :body, :uri, :payload, :headers + attr_accessor :rest_code, :rest_body, :rest_uri, :rest_payload, :rest_headers + def http_code; 502; end end class ErrorReport @@ -30,6 +35,9 @@ module OpenTox def self.format(error, request=nil, response=nil) # sets current uri error.creator = "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" if request + # bit of a hack: set instance attribute in order to add it for the to_yaml conversion + error.http_code = error.http_code + accept = request.env['HTTP_ACCEPT'].to_s if request case accept # when /rdf/ diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 2f9fabd..83d8099 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -18,22 +18,9 @@ error Exception do error = request.env['sinatra.error'] # log error to logfile LOGGER.error error.class.to_s+": "+error.message - case error.class - when OpenTox::BadRequestError - code = 400 - when OpenTox::NotAuthorizedError - code = 401 - when OpenTox::NotFoundError - code = 404 - when OpenTox::RestCallError - code = 502 - else - # (unwanted RuntimeExceptions as well as sth. like 'raise "invalid state"' is handled here) - code = 500 - # log backtrace for debugging - LOGGER.error error.backtrace.join("\n") - end - halt code,OpenTox::ErrorReport.format(error,request,response) + # log backtrace only if code is 500 -> unwanted (Runtime)Exceptions and internal errors (see error.rb) + LOGGER.error error.backtrace.join("\n") if error.http_code==500 + halt error.http_code,OpenTox::ErrorReport.format(error,request,response) end class String diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 5bc8072..3d7b72e 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -131,15 +131,15 @@ module OpenTox def self.raise_ot_error( code, message, body, uri, headers, payload=nil ) error = OpenTox::RestCallError.new("REST call returned error: '"+message.to_s+"'") - error.code = code - error.uri = uri - error.headers = headers - error.payload = payload + error.rest_code = code + error.rest_uri = uri + error.rest_headers = headers + error.rest_payload = payload parsed = OpenTox::ErrorReport.parse(body) if body if parsed error.errorCause = parsed else - error.body = body + error.rest_body = body end raise error end -- cgit v1.2.3 From 59dba52a30de35da0122cd6c25777573faa5ffc3 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 24 Jan 2011 17:19:56 +0100 Subject: fix error handling --- lib/error.rb | 67 ++++++++++++++++-------------------------- lib/overwrite.rb | 18 ++++++++++-- lib/rest_client_wrapper.rb | 72 +++++++++++++++++++++++++++++----------------- lib/task.rb | 36 +++++++++++------------ 4 files changed, 102 insertions(+), 91 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index e47ad62..8a57bd0 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,69 +1,52 @@ # adding additional fields to Exception class to format errors according to OT-API class Exception - attr_accessor :creator, :errorCause, :id, :http_code + attr_accessor :errorCause def http_code; 500; end end module OpenTox - class BadRequestError < Exception + class BadRequestError < RuntimeError def http_code; 400; end end - class NotAuthorizedError < Exception + class NotAuthorizedError < RuntimeError def http_code; 401; end end - class NotFoundError < Exception + class NotFoundError < RuntimeError def http_code; 404; end end - class RestCallError < Exception - attr_accessor :rest_code, :rest_body, :rest_uri, :rest_payload, :rest_headers + class RestCallError < RuntimeError + attr_accessor :rest_params def http_code; 502; end end class ErrorReport - # formats error according to accept-header, yaml is default - # ( sets content-type in response accordingly ) - # @param [Exception] error - # @param |Sinatra::Request, optional] request - # @param [Sinatra::Response, optiona,] response, optional to set content-type - # @return [String] formated error - def self.format(error, request=nil, response=nil) - # sets current uri - error.creator = "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" if request - # bit of a hack: set instance attribute in order to add it for the to_yaml conversion - error.http_code = error.http_code - - accept = request.env['HTTP_ACCEPT'].to_s if request - case accept - # when /rdf/ - # TODO add error to rdf - when /html/ - response['Content-Type'] = 'text/html' if response - OpenTox.text_to_html error.to_yaml - else - response['Content-Type'] = 'application/x-yaml' if response - error.to_yaml - end + # TODO replace params with URIs (errorCause -> OT.errorCause) + attr_reader :message, :actor, :errorCause, :http_code, :errorDetails, :errorType + + # creates a error report object, from an ruby-exception object + # @param [Exception] error + # @param [String] actor, URI of the call that cause the error + def initialize( error, actor ) + @http_code = error.http_code + @errorType = error.class.to_s + @message = error.message + @actor = actor + @errorCause = error.errorCause if error.errorCause + @rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params + end + + def self.from_rdf(rdf) + raise "not yet implemented" end - # trys to parse error from text - # @return [Exception] Exception if parsing sucessfull, nil otherwise - def self.parse( body ) - begin - err = YAML.load(body) - if err and err.is_a?(Exception) - return err - else - return nil - end - rescue - return nil - end + def self.to_rdf + raise "not yet implemented" end end end \ No newline at end of file diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 83d8099..4fa0829 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -19,8 +19,22 @@ error Exception do # log error to logfile LOGGER.error error.class.to_s+": "+error.message # log backtrace only if code is 500 -> unwanted (Runtime)Exceptions and internal errors (see error.rb) - LOGGER.error error.backtrace.join("\n") if error.http_code==500 - halt error.http_code,OpenTox::ErrorReport.format(error,request,response) + LOGGER.error ":\n"+error.backtrace.join("\n") if error.http_code==500 + + actor = "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" + rep = OpenTox::ErrorReport.new(error, actor) + + case request.env['HTTP_ACCEPT'] + when /rdf/ + content_type 'application/rdf+xml' + halt error.http_code,rep.to_xml + when /html/ + content_type 'text/html' + halt error.http_code,(OpenTox.text_to_html rep.to_yaml) + else + content_type 'application/x-yaml' + halt error.http_code,rep.to_yaml + end end class String diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 3d7b72e..7c2d719 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -50,16 +50,6 @@ module OpenTox execute( "delete", uri, headers, nil) end - # raises an Error message (rescued in overwrite.rb -> halt 502) - # usage: if the return value of a call is invalid - # @param [String] error_msg the error message - # @param [String] uri destination URI that is responsible for the error - # @param [optional,Hash] headers sent to the URI - # @param [optional,String] payload data sent to the URI - def self.raise_uri_error(error_msg, uri, headers=nil, payload=nil) - raise_ot_error( nil, error_msg, nil, uri, headers, payload ) - end - private def self.execute( rest_call, uri, headers, payload=nil, waiting_task=nil, wait=true ) @@ -70,7 +60,7 @@ module OpenTox headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems begin - #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect + #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect+" "+payload.inspect resource = RestClient::Resource.new(uri,{:timeout => 60}) if payload result = resource.send(rest_call, payload, headers) @@ -86,6 +76,7 @@ module OpenTox raise "content-type not set" unless res.content_type res.code = result.code + #LOGGER.debug "RestCall result: "+res.to_s+" "+res.code.to_s+" "+res.content_type.to_s # TODO: Ambit returns task representation with 200 instead of result URI return res if res.code==200 || !wait @@ -96,11 +87,16 @@ module OpenTox return res rescue RestClient::RequestTimeout => ex - raise_ot_error 408,ex.message,nil,ex.uri,headers,payload + received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers} rescue RestClient::ExceptionWithResponse => ex - raise_ot_error ex.http_code,ex.message,ex.http_body,uri,headers,payload + # error comming from a different webservice, + received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers} + rescue OpenTox::RestCallError => ex + # already a rest-error, probably comes from wait_for_task, just pass through + raise ex rescue => ex - raise_ot_error 500,ex.message,nil,uri,headers,payload + # some internal error occuring in rest_client_wrapper, just pass through + raise ex end end @@ -121,27 +117,49 @@ module OpenTox LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" task.wait_for_completion waiting_task - raise task.description unless task.completed? # maybe task was cancelled / error - + unless task.completed? # maybe task was cancelled / error + if task.errorReport + received_error task.errorReport, task.http_code, nil, {:rest_uri => task.uri, :rest_code => task.http_code} + else + raise "task status: '"+task.status.to_s+"' but errorReport nil" + end + end + res = WrapperResult.new task.result_uri res.code = task.http_code res.content_type = "text/uri-list" return res end - def self.raise_ot_error( code, message, body, uri, headers, payload=nil ) - error = OpenTox::RestCallError.new("REST call returned error: '"+message.to_s+"'") - error.rest_code = code - error.rest_uri = uri - error.rest_headers = headers - error.rest_payload = payload - parsed = OpenTox::ErrorReport.parse(body) if body - if parsed - error.errorCause = parsed + def self.received_error( body, code, content_type=nil, params=nil ) + + # try to parse body + report = nil + if body.is_a?(OpenTox::ErrorReport) + report = body + else + case content_type + when /yaml/ + report = YAML.load(body) + when /rdf/ + report = OpenTox::ErrorReport.from_rdf(body) + end + end + + unless report + # parsing was not successfull + # raise 'plain' RestCallError + err = OpenTox::RestCallError.new("REST call returned error: '"+body.to_s+"'") + err.rest_params = params + raise err else - error.rest_body = body + # parsing sucessfull + # raise RestCallError with parsed report as error cause + err = OpenTox::RestCallError.new("REST call subsequent error") + err.errorCause = report + err.rest_params = params + raise err end - raise error end end end diff --git a/lib/task.rb b/lib/task.rb index d701c82..06d290f 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -56,26 +56,17 @@ module OpenTox #raise "Server too busy to start a new task" end - task_pid = Spork.spork(:logger => LOGGER) do LOGGER.debug "Task #{task.uri} started #{Time.now}" - begin - result = catch(:halt) do - yield task - end - # catching halt, set task state to error - if result && result.is_a?(Array) && result.size==2 && result[0]>202 - LOGGER.error "task was halted: "+result.inspect - task.error(result[1]) - return - end + result = yield task LOGGER.debug "Task #{task.uri} done #{Time.now} -> "+result.to_s task.completed(result) - rescue => ex - LOGGER.error "task failed: "+ex.message - LOGGER.error ": "+ex.backtrace.join("\n") - task.error(ex.message) + rescue => error + LOGGER.error "task failed: "+error.class.to_s+": "+error.message + # log backtrace only if code is 500 -> unwanted (Runtime)Exceptions and internal errors (see error.rb) + LOGGER.error ":\n"+error.backtrace.join("\n") if error.http_code==500 + task.error(OpenTox::ErrorReport.new(error, creator)) end end task.pid = task_pid @@ -127,6 +118,10 @@ module OpenTox @metadata[DC.description] end + def errorReport + @metadata[OT.errorReport] + end + def cancel RestClientWrapper.put(File.join(@uri,'Cancelled')) load_metadata @@ -137,8 +132,9 @@ module OpenTox load_metadata end - def error(description) - RestClientWrapper.put(File.join(@uri,'Error'),{:description => description.to_s[0..2000]}) + def error(error_report) + raise "no error report" unless error_report.is_a?(OpenTox::ErrorReport) + RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => error_report.to_yaml}) load_metadata end @@ -236,7 +232,7 @@ module OpenTox end end - LOGGER.debug "Task '"+@metadata[OT.hasStatus]+"': "+@uri.to_s+", Result: "+@metadata[OT.resultURI].to_s + LOGGER.debug "Task '"+@metadata[OT.hasStatus].to_s+"': "+@uri.to_s+", Result: "+@metadata[OT.resultURI].to_s end # updates percentageCompleted value (can only be increased) @@ -250,7 +246,7 @@ module OpenTox load_metadata end end - + private def check_state begin @@ -265,7 +261,7 @@ module OpenTox "'" unless @metadata[OT.resultURI] and @metadata[OT.resultURI].to_s.uri? end rescue => ex - RestClientWrapper.raise_uri_error(ex.message, @uri) + raise OpenTox::BadRequestError.new ex.message+" (task-uri:"+@uri+")" end end -- cgit v1.2.3 From 8cfe8ad608e59d3536cd5403a70743a51cb901ee Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 24 Jan 2011 19:35:36 +0100 Subject: fix task to rdf --- lib/error.rb | 18 ++++++++++++++++-- lib/overwrite.rb | 2 +- lib/serializer.rb | 11 ++++++++--- lib/task.rb | 7 +++++++ 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 8a57bd0..d3fd19b 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -40,13 +40,27 @@ module OpenTox @errorCause = error.errorCause if error.errorCause @rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params end + + def rdf_content() + c = { + RDF.type => OT.ErrorReport, + OT.statusCode => @http_code, + OT.message => @message, + OT.actor => @actor, + OT.errorCode => @errorType, + } + c[OT.errorCause] = @errorCause.rdf_content if @errorCause + c + end def self.from_rdf(rdf) raise "not yet implemented" end - def self.to_rdf - raise "not yet implemented" + def to_rdfxml + s = Serializer::Owl.new + s.add_resource(CONFIG[:services]["opentox-task"]+"/tmpId/ErrorReport/tmpId", OT.errorReport, rdf_content) + s.to_rdfxml end end end \ No newline at end of file diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 4fa0829..e52618c 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -27,7 +27,7 @@ error Exception do case request.env['HTTP_ACCEPT'] when /rdf/ content_type 'application/rdf+xml' - halt error.http_code,rep.to_xml + halt error.http_code,rep.to_rdfxml when /html/ content_type 'text/html' halt error.http_code,(OpenTox.text_to_html rep.to_yaml) diff --git a/lib/serializer.rb b/lib/serializer.rb index 03c2639..44b4414 100644 --- a/lib/serializer.rb +++ b/lib/serializer.rb @@ -14,7 +14,7 @@ module OpenTox def initialize @object = { - # this should come from opntox.owl + # this should come from opentox.owl OT.Compound => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.Feature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.NominalFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , @@ -35,6 +35,7 @@ module OpenTox OT.RegressionStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.Crossvalidation => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.CrossvalidationInfo => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.ErrorReport => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.compound => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.feature => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , @@ -113,6 +114,10 @@ module OpenTox OT.numFolds => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.randomSeed => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.reportType => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.message => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.statusCode => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.actor => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.errorCode => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.hasSource => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , OT.value => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , @@ -229,10 +234,10 @@ module OpenTox @object[uri] = {} unless @object[uri] @object[uri][u] = [{ "type" => "bnode", "value" => genid }] # add content to new class - add_hash(genid,v) + add_content(genid,v) elsif v.is_a? Array # value is an array, i.e. a list of values with property is added - v.each{ |vv| add_hash( uri, { u => vv } ) } + v.each{ |vv| add_content( uri, { u => vv } ) } else # v.is_a? String # simple string value @object[uri] = {} unless @object[uri] diff --git a/lib/task.rb b/lib/task.rb index 06d290f..4d1ee90 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -102,7 +102,9 @@ module OpenTox def to_rdfxml s = Serializer::Owl.new + @metadata[OT.errorReport] = @uri+"/ErrorReport/tmpId" if @error_report s.add_task(@uri,@metadata) + s.add_resource(@uri+"/ErrorReport/tmpId", OT.errorReport, @error_report.rdf_content) if @error_report s.to_rdfxml end @@ -138,6 +140,11 @@ module OpenTox load_metadata end + # not stored just for to_rdf + def add_error_report( error_report ) + @error_report = error_report + end + def pid=(pid) RestClientWrapper.put(File.join(@uri,'pid'), {:pid => pid}) end -- cgit v1.2.3 From b8e919f933b4137043c6facf56b5ad20249fdd2b Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 25 Jan 2011 12:50:41 +0100 Subject: add backtrace to error if configured in .yaml config --- lib/error.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/error.rb b/lib/error.rb index d3fd19b..e5c460d 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -39,6 +39,15 @@ module OpenTox @actor = actor @errorCause = error.errorCause if error.errorCause @rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params + @backtrace = error.backtrace.join("\n") if CONFIG[:backtrace] + end + + # overwrite sorting to make easier readable + def to_yaml_properties + p = super + p = ( p - ["@backtrace"]) + ["@backtrace"] if @backtrace + p = ( p - ["@errorCause"]) + ["@errorCause"] if @errorCause + p end def rdf_content() -- cgit v1.2.3 From bbb753ffe7a428dc4bdfef59fdd703d077aefbfb Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 25 Jan 2011 14:18:24 +0100 Subject: do not catch error in model.run --- lib/model.rb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index e95c78c..efa273b 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -14,12 +14,7 @@ module OpenTox else accept = 'application/rdf+xml' end - begin - RestClientWrapper.post(@uri,{:accept => accept},params,waiting_task).to_s - rescue => e - LOGGER.error "Failed to run #{@uri} with #{params.inspect} (#{e.inspect})" - raise "Failed to run #{@uri} with #{params.inspect}" - end + RestClientWrapper.post(@uri,{:accept => accept},params,waiting_task).to_s end # Generic OpenTox model class for all API compliant services -- cgit v1.2.3 From ddcf8597a13ea6f03c697c78d224376ff36c7ea3 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 25 Jan 2011 16:20:28 +0100 Subject: replace halt with raise NotAuthorized --- lib/helper.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/helper.rb b/lib/helper.rb index bb0279e..ff5e908 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -9,11 +9,10 @@ helpers do end elsif !env["session"] && subjectid unless authorized?(subjectid) - throw(:halt, [401, "Not authorized.\n"]) - redirect back + raise OpenTox::NotAuthorizedError.new "Not authorized" end else - throw(:halt, [401, "Not authorized.\n"]) unless authorized?(subjectid) + raise OpenTox::NotAuthorizedError.new "Not authorized" unless authorized?(subjectid) end end -- cgit v1.2.3 From ce93b07bb253df3c548c59bacc869839aa78bb4c Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 26 Jan 2011 15:54:05 +0100 Subject: add whitlisting concept for A&A, some minor modifications --- lib/authorization.rb | 42 +++++++++++++++++++++++++++++++++++++++++- lib/error.rb | 13 ++++++++++++- lib/helper.rb | 12 +----------- lib/model.rb | 10 +++++----- 4 files changed, 59 insertions(+), 18 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 5bc690a..c6f39c1 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -322,7 +322,47 @@ module OpenTox alias :token_valid? :is_token_valid end - end + #Check Authorization for URI with method and subjectid. + def self.authorized?(uri, request_method, subjectid) + return true if OpenTox::Authorization.whitelisted?(uri, request_method) + if CONFIG[:authorization][:authorize_request].include?(request_method) + ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) + LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request_method} , URI: #{uri}, subjectid: #{subjectid} with return >>#{ret}<<" + return ret + end + if CONFIG[:authorization][:authenticate_request].include?(request_method) + return true if OpenTox::Authorization.is_token_valid(subjectid) + end + LOGGER.debug "Not authorized for: #{uri} with Method: #{request_method} with Token #{subjectid}" + return false + end + + @@whitelist = {} + + private + def self.whitelisted?(uri, request_method) + return false unless @@whitelist[request_method] + @@whitelist[request_method].each do |r| + return true if r.match(uri) + end + return false + end + + public + def self.whitelist(uri_match, request_method) + if uri_match.is_a?(Regexp) + uri_regex = uri_match + elsif uri_match.is_a?(String) + uri_regex = Regexp.new("^"+uri_match+"$") + else + raise "uri-match param is neither string(->exact uri match) nor regexp: "+uri_match.class + end + LOGGER.info("whitelisted "+request_method+" "+uri_regex.to_s) + @@whitelist[request_method] = [] unless @@whitelist[request_method] + @@whitelist[request_method] << uri_regex + end + + end end diff --git a/lib/error.rb b/lib/error.rb index e5c460d..8c666f3 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -39,7 +39,7 @@ module OpenTox @actor = actor @errorCause = error.errorCause if error.errorCause @rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params - @backtrace = error.backtrace.join("\n") if CONFIG[:backtrace] + @backtrace = error.backtrace.short_backtrace if CONFIG[:backtrace] end # overwrite sorting to make easier readable @@ -72,4 +72,15 @@ module OpenTox s.to_rdfxml end end +end + +class Array + def short_backtrace + short = [] + each do |c| + break if c =~ /sinatra\/base/ + short << c + end + short.join("\n") + end end \ No newline at end of file diff --git a/lib/helper.rb b/lib/helper.rb index e82c8fb..afeeb43 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -16,22 +16,12 @@ helpers do end end - #Check Authorization for URI with method and subjectid. def authorized?(subjectid) request_method = request.env['REQUEST_METHOD'] uri = clean_uri("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}") request_method = "GET" if request_method == "POST" && uri =~ /\/model\/\d+\/?$/ - if CONFIG[:authorization][:authorize_request].include?(request_method) - ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) - LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request_method} , URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}, subjectid: #{subjectid} with return >>#{ret}<<" - return ret - end - if CONFIG[:authorization][:authenticate_request].include?(request_method) - return true if OpenTox::Authorization.is_token_valid(subjectid) - end - LOGGER.debug "Not authorized for: #{uri} with Method: #{request.env['REQUEST_METHOD']}/#{request_method} with Token #{subjectid}" - return false + return OpenTox::Authorization.authorized?(uri, request_method, subjectid) end #cleans URI from querystring and file-extension. Sets port 80 to emptystring diff --git a/lib/model.rb b/lib/model.rb index 85be1b5..741eea6 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -24,9 +24,9 @@ module OpenTox # Find Generic Opentox Model via URI, and loads metadata # @param [String] uri Model URI # @return [OpenTox::Model::Generic] Model instance, nil if model was not found - def self.find(uri) + def self.find(uri,subjectid=nil) model = Generic.new(uri) - model.load_metadata + model.load_metadata(subjectid) if model.metadata==nil or model.metadata.size==0 nil else @@ -36,10 +36,10 @@ module OpenTox # provides feature type, possible types are "regression" or "classification" # @return [String] feature type, "unknown" if type could not be estimated - def feature_type + def feature_type(subjectid=nil) # dynamically perform restcalls if necessary - load_metadata if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) - @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables] ) unless @dependentVariable + load_metadata(subjectid) if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) + @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables],subjectid ) unless @dependentVariable [@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], @uri].each do |type| case type -- cgit v1.2.3 From 53a6d76d44543ba8109bc6fa1a609e30dd7e91ff Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 26 Jan 2011 16:08:57 +0100 Subject: documented new autorization function --- lib/authorization.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index c6f39c1..6a8a174 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -322,7 +322,11 @@ module OpenTox alias :token_valid? :is_token_valid end - #Check Authorization for URI with method and subjectid. + # Check Authorization for a resource (identified via URI) with method and subjectid. + # @param [String] uri + # @param [String] request_method, should be GET, POST, PUT, DELETE + # @param [String] subjectid + # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method, subjectid) return true if OpenTox::Authorization.whitelisted?(uri, request_method) if CONFIG[:authorization][:authorize_request].include?(request_method) @@ -349,6 +353,9 @@ module OpenTox end public + # adds uri/regexp-for-matching-uri to the whitelist for a request-method (i.e. access will be granted without cheking the A&A service) + # @param [String or Regexp] uri_match if string match must be ecaxt + # @param [String] request_method, must be GET, POST, PUT, DELETE def self.whitelist(uri_match, request_method) if uri_match.is_a?(Regexp) uri_regex = uri_match @@ -357,7 +364,7 @@ module OpenTox else raise "uri-match param is neither string(->exact uri match) nor regexp: "+uri_match.class end - LOGGER.info("whitelisted "+request_method+" "+uri_regex.to_s) + LOGGER.info("whitelisted "+request_method.to_s+" "+uri_regex.to_s) @@whitelist[request_method] = [] unless @@whitelist[request_method] @@whitelist[request_method] << uri_regex end -- cgit v1.2.3 From 171ab814d15b9504ef9892ba5f194de8bc019f46 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 26 Jan 2011 16:16:09 +0100 Subject: minor fix --- lib/authorization.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 6a8a174..a6253b7 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -362,7 +362,7 @@ module OpenTox elsif uri_match.is_a?(String) uri_regex = Regexp.new("^"+uri_match+"$") else - raise "uri-match param is neither string(->exact uri match) nor regexp: "+uri_match.class + raise "uri-match param is neither string(->exact uri match) nor regexp: "+uri_match.class.to_s end LOGGER.info("whitelisted "+request_method.to_s+" "+uri_regex.to_s) @@whitelist[request_method] = [] unless @@whitelist[request_method] -- cgit v1.2.3 From e1a067953dd9139b01aaebe42ff158a944240540 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 28 Jan 2011 12:20:08 +0100 Subject: extend whitelisting, get feature_type from algorithm --- lib/algorithm.rb | 5 +++-- lib/authorization.rb | 18 +++++++++++++----- lib/dataset.rb | 1 + lib/feature.rb | 3 ++- lib/model.rb | 24 ++++++++++++++++-------- lib/task.rb | 20 +++++++++++++++++--- 6 files changed, 52 insertions(+), 19 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 58a2640..ee3109c 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -34,9 +34,10 @@ module OpenTox # Find Generic Opentox Algorithm via URI, and loads metadata # @param [String] uri Algorithm URI # @return [OpenTox::Algorithm::Generic] Algorithm instance, nil if alogrithm was not found - def self.find(uri) + def self.find(uri, subjectid) + return nil unless uri alg = Generic.new(uri) - alg.load_metadata + alg.load_metadata( subjectid ) if alg.metadata==nil or alg.metadata.size==0 nil else diff --git a/lib/authorization.rb b/lib/authorization.rb index a6253b7..1573da3 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -328,7 +328,10 @@ module OpenTox # @param [String] subjectid # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method, subjectid) - return true if OpenTox::Authorization.whitelisted?(uri, request_method) + if OpenTox::Authorization.whitelisted?(uri, request_method) + LOGGER.debug "whitelisted! "+uri.to_s + return true + end if CONFIG[:authorization][:authorize_request].include?(request_method) ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request_method} , URI: #{uri}, subjectid: #{subjectid} with return >>#{ret}<<" @@ -346,8 +349,12 @@ module OpenTox private def self.whitelisted?(uri, request_method) return false unless @@whitelist[request_method] - @@whitelist[request_method].each do |r| - return true if r.match(uri) + @@whitelist[request_method].each do |regexp,invert| + if invert + return true if !regexp.match(uri) + else + return true if regexp.match(uri) + end end return false end @@ -356,7 +363,8 @@ module OpenTox # adds uri/regexp-for-matching-uri to the whitelist for a request-method (i.e. access will be granted without cheking the A&A service) # @param [String or Regexp] uri_match if string match must be ecaxt # @param [String] request_method, must be GET, POST, PUT, DELETE - def self.whitelist(uri_match, request_method) + # @param [Boolean,optional] invert, set to true if you want to whitelist everything that does not match (careful!) + def self.whitelist(uri_match, request_method, invert=false) if uri_match.is_a?(Regexp) uri_regex = uri_match elsif uri_match.is_a?(String) @@ -366,7 +374,7 @@ module OpenTox end LOGGER.info("whitelisted "+request_method.to_s+" "+uri_regex.to_s) @@whitelist[request_method] = [] unless @@whitelist[request_method] - @@whitelist[request_method] << uri_regex + @@whitelist[request_method] << [ uri_regex, invert ] end end diff --git a/lib/dataset.rb b/lib/dataset.rb index 640e3da..9c20968 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -51,6 +51,7 @@ module OpenTox # @param [String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object with all data def self.find(uri, subjectid=nil) + return nil unless uri dataset = Dataset.new(uri, subjectid) dataset.load_all(subjectid) dataset diff --git a/lib/feature.rb b/lib/feature.rb index 28ac0c5..be063dd 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -3,7 +3,8 @@ module OpenTox include OpenTox def self.find(uri, subjectid=nil) - feature = Feature.new uri + return nil unless uri + feature = Feature.new uri if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) feature.add_metadata YAML.load(RestClientWrapper.get(uri,{:accept => "application/x-yaml", :subjectid => subjectid})) else diff --git a/lib/model.rb b/lib/model.rb index 741eea6..80d7ec4 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -8,13 +8,16 @@ module OpenTox # @param [Hash] params Parameters for OpenTox model # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [text/uri-list] Task or resource URI - def run( params, waiting_task=nil ) - if CONFIG[:yaml_hosts].include?(URI.parse(@uri).host) - accept = 'application/x-yaml' - else - accept = 'application/rdf+xml' + def run( params, accept_header=nil, waiting_task=nil ) + unless accept_header + if CONFIG[:yaml_hosts].include?(URI.parse(@uri).host) + accept_header = 'application/x-yaml' + else + accept_header = 'application/rdf+xml' + end end - RestClientWrapper.post(@uri,{:accept => accept},params,waiting_task).to_s + LOGGER.info "running model "+@uri.to_s+", params: "+params.inspect+", accept: "+accept_header.to_s + RestClientWrapper.post(@uri,{:accept => accept_header},params,waiting_task).to_s end # Generic OpenTox model class for all API compliant services @@ -25,6 +28,7 @@ module OpenTox # @param [String] uri Model URI # @return [OpenTox::Model::Generic] Model instance, nil if model was not found def self.find(uri,subjectid=nil) + return nil unless uri model = Generic.new(uri) model.load_metadata(subjectid) if model.metadata==nil or model.metadata.size==0 @@ -39,9 +43,12 @@ module OpenTox def feature_type(subjectid=nil) # dynamically perform restcalls if necessary load_metadata(subjectid) if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) + + @algorithm = OpenTox::Algorithm::Generic.find(@metadata[OT.algorithm], subjectid) unless @algorithm + algorithm_title = @algorithm ? @algorithm.metadata[DC.title] : nil @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables],subjectid ) unless @dependentVariable - [@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], @uri].each do |type| + [@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], @uri, algorithm_title].each do |type| case type when /(?i)classification/ return "classification" @@ -49,7 +56,8 @@ module OpenTox return "regression" end end - raise "unknown model "+[@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], @uri].inspect + raise "unknown model "+[@dependentVariable.feature_type, @metadata[OT.isA], + @metadata[DC.title], @uri, algorithm_title].inspect end end diff --git a/lib/task.rb b/lib/task.rb index 3c6aba5..74940de 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -78,6 +78,7 @@ module OpenTox # @param [String] uri Task URI # @return [OpenTox::Task] Task object def self.find(uri) + return nil unless uri task = Task.new(uri) task.load_metadata task @@ -94,10 +95,23 @@ module OpenTox @metadata = YAML.load(yaml) end + def self.from_rdfxml(rdfxml) - file = Tempfile.open("ot-rdfxml"){|f| f.write(rdfxml)}.path + file = Tempfile.new("ot-rdfxml") + file.puts rdfxml + file.close + file = "file://"+file.path + + # PENDING + raise "Parse from file not working: what is the base-object-uri??? (omitted in triples)" + parser = Parser::Owl::Generic.new file - @metadata = parser.load_metadata + metadata = parser.load_metadata + puts metadata.inspect + + task = Task.new(uri) + task.add_metadata(metadata) + task end def to_rdfxml @@ -232,7 +246,7 @@ module OpenTox sleep dur load_metadata # if another (sub)task is waiting for self, set progress accordingly - waiting_task.progress(@metadata[OT.percentageCompleted]) if waiting_task + waiting_task.progress(@metadata[OT.percentageCompleted].to_f) if waiting_task check_state if (Time.new > due_to_time) raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" -- cgit v1.2.3 From 3aaae5a3fe341073fc0537606aababe387d830e0 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 28 Jan 2011 13:56:33 +0100 Subject: reorderd Autohorizaion.authorize? --- lib/authorization.rb | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 1573da3..b4c1ee5 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -329,19 +329,20 @@ module OpenTox # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method, subjectid) if OpenTox::Authorization.whitelisted?(uri, request_method) - LOGGER.debug "whitelisted! "+uri.to_s - return true - end - if CONFIG[:authorization][:authorize_request].include?(request_method) + LOGGER.debug "authorized? >>true<< (uris is whitelisted), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + true + elsif CONFIG[:authorization][:authorize_request].include?(request_method) ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) - LOGGER.debug "OpenTox helpers OpenTox::Authorization authorized? method: #{request_method} , URI: #{uri}, subjectid: #{subjectid} with return >>#{ret}<<" - return ret + LOGGER.debug "authorized? >>#{ret}<< (uri authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + ret + elsif CONFIG[:authorization][:authenticate_request].include?(request_method) + ret = OpenTox::Authorization.is_token_valid(subjectid) + LOGGER.debug "authorized? >>#{ret}<< (token is valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + ret + else + LOGGER.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + true end - if CONFIG[:authorization][:authenticate_request].include?(request_method) - return true if OpenTox::Authorization.is_token_valid(subjectid) - end - LOGGER.debug "Not authorized for: #{uri} with Method: #{request_method} with Token #{subjectid}" - return false end @@whitelist = {} -- cgit v1.2.3 From 26c0b93a02fddb60175747f7733d13e973257cd8 Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 1 Feb 2011 16:34:20 +0100 Subject: A&A for validations --- lib/authorization.rb | 79 ++++++++++++++++++++++++++++------------------------ lib/helper.rb | 20 ++++--------- lib/model.rb | 4 +-- lib/validation.rb | 12 ++++---- 4 files changed, 56 insertions(+), 59 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index b4c1ee5..12be037 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -328,55 +328,60 @@ module OpenTox # @param [String] subjectid # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method, subjectid) - if OpenTox::Authorization.whitelisted?(uri, request_method) - LOGGER.debug "authorized? >>true<< (uris is whitelisted), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" - true - elsif CONFIG[:authorization][:authorize_request].include?(request_method) - ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) - LOGGER.debug "authorized? >>#{ret}<< (uri authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" - ret + if CONFIG[:authorization][:free_request].include?(request_method) + #LOGGER.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + true + elsif OpenTox::Authorization.free_uri?(uri, request_method) + #LOGGER.debug "authorized? >>true<< (uris is free_uri), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + true elsif CONFIG[:authorization][:authenticate_request].include?(request_method) ret = OpenTox::Authorization.is_token_valid(subjectid) - LOGGER.debug "authorized? >>#{ret}<< (token is valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + #LOGGER.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + ret + elsif OpenTox::Authorization.authorize_exception?(uri, request_method) + ret = OpenTox::Authorization.is_token_valid(subjectid) + #LOGGER.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + ret + elsif CONFIG[:authorization][:authorize_request].include?(request_method) + ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) + LOGGER.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" ret else - LOGGER.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" - true + LOGGER.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + false end end - @@whitelist = {} - private - def self.whitelisted?(uri, request_method) - return false unless @@whitelist[request_method] - @@whitelist[request_method].each do |regexp,invert| - if invert - return true if !regexp.match(uri) - else - return true if regexp.match(uri) + def self.free_uri?(uri, request_method) + if CONFIG[:authorization][:free_uris] + CONFIG[:authorization][:free_uris].each do |request_methods,uris| + LOGGER.info "free uris "+request_methods.inspect+" -> "+uris.inspect + if request_methods and uris and request_methods.include?(request_method.to_sym) + uris.each do |u| + return true if u.match uri + end + end end - end + end return false end - public - # adds uri/regexp-for-matching-uri to the whitelist for a request-method (i.e. access will be granted without cheking the A&A service) - # @param [String or Regexp] uri_match if string match must be ecaxt - # @param [String] request_method, must be GET, POST, PUT, DELETE - # @param [Boolean,optional] invert, set to true if you want to whitelist everything that does not match (careful!) - def self.whitelist(uri_match, request_method, invert=false) - if uri_match.is_a?(Regexp) - uri_regex = uri_match - elsif uri_match.is_a?(String) - uri_regex = Regexp.new("^"+uri_match+"$") - else - raise "uri-match param is neither string(->exact uri match) nor regexp: "+uri_match.class.to_s - end - LOGGER.info("whitelisted "+request_method.to_s+" "+uri_regex.to_s) - @@whitelist[request_method] = [] unless @@whitelist[request_method] - @@whitelist[request_method] << [ uri_regex, invert ] - end + def self.authorize_exception?(uri, request_method) + if CONFIG[:authorization][:authorize_exceptions] + CONFIG[:authorization][:authorize_exceptions].each do |request_methods,uris| + if request_methods and uris and request_methods.include?(request_method.to_sym) + uris.each do |u| + return true if u.match uri + end + end + end + end + return false + end + + + end end diff --git a/lib/helper.rb b/lib/helper.rb index afeeb43..0bb489c 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -9,6 +9,7 @@ helpers do end elsif !env["session"] && subjectid unless authorized?(subjectid) + LOGGER.debug "URI not authorized: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']} with request: #{request.env['REQUEST_METHOD']}" raise OpenTox::NotAuthorizedError.new "Not authorized" end else @@ -29,27 +30,18 @@ helpers do def clean_uri(uri) out = URI.parse(uri) out.path = out.path[0, out.path.rindex(/[0-9]/) + 1] if out.path.rindex(/[0-9]/) #cuts after id for a&a - "#{out.scheme}:" + (out.port != 80 ? out.port : "") + "//#{out.host}#{out.path}" + "#{out.scheme}:" + (out.port != 80 ? out.port : "") + "//#{out.host}#{out.path.chomp('/')}" end - #unprotected uris for login/logout, webapplication ... - def unprotected_requests - case env['REQUEST_URI'] - when /\/login$|\/logout$|\/predict$|\/toxcreate\/models$/ - return true - when /\/features/ - return false - when /\/compound|\/feature|\/task|\/toxcreate/ #to fix: read from config | validation should be protected - return true - else - return false - end + #unprotected uri for login + def login_requests + return env['REQUEST_URI'] =~ /\/login$/ end end before do - unless !AA_SERVER or unprotected_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) + unless !AA_SERVER or login_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) begin subjectid = nil subjectid = session[:subjectid] if session[:subjectid] diff --git a/lib/model.rb b/lib/model.rb index 80d7ec4..0073ea4 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -46,7 +46,7 @@ module OpenTox @algorithm = OpenTox::Algorithm::Generic.find(@metadata[OT.algorithm], subjectid) unless @algorithm algorithm_title = @algorithm ? @algorithm.metadata[DC.title] : nil - @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables],subjectid ) unless @dependentVariable + @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables], subjectid) unless @dependentVariable [@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], @uri, algorithm_title].each do |type| case type @@ -137,7 +137,7 @@ module OpenTox OT.parameters => [{DC.title => "dataset_uri", OT.paramValue => dataset_uri}] }) d = Dataset.new(dataset_uri,subjectid) - d.load_compounds + d.load_compounds(subjectid) count = 0 d.compounds.each do |compound_uri| begin diff --git a/lib/validation.rb b/lib/validation.rb index 76c4529..23b246b 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -13,18 +13,18 @@ module OpenTox OpenTox::Validation.new(uri) end - def create_report - @report_uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/crossvalidation"), :validation_uris => @uri).to_s + def create_report(subjectid=nil) + @report_uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/crossvalidation"), {:validation_uris => @uri, :subjectid => subjectid}).to_s @report_uri end - def create_qmrf_report - @qmrf_report_uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/reach_report/qmrf"), :model_uri => @uri).to_s + def create_qmrf_report(subjectid=nil) + @qmrf_report_uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/reach_report/qmrf"), {:model_uri => @uri, :subjectid => subjectid}).to_s @qmrf_report_uri end - def summary(type) - v = YAML.load RestClientWrappper.get(File.join(@uri, 'statistics'),:accept => "application/x-yaml").to_s + def summary(type, subjectid=nil) + v = YAML.load OpenTox::RestClientWrapper.get(File.join(@uri, 'statistics'),{:accept => "application/x-yaml", :subjectid => subjectid}).to_s case type when "classification" -- cgit v1.2.3 From 55f81bb50e76e99f370516ec8625a5aae902e898 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 2 Feb 2011 14:06:40 +0100 Subject: hpricot removed from dependencies, a+a for validation --- lib/validation.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/validation.rb b/lib/validation.rb index 76c4529..23b246b 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -13,18 +13,18 @@ module OpenTox OpenTox::Validation.new(uri) end - def create_report - @report_uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/crossvalidation"), :validation_uris => @uri).to_s + def create_report(subjectid=nil) + @report_uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/crossvalidation"), {:validation_uris => @uri, :subjectid => subjectid}).to_s @report_uri end - def create_qmrf_report - @qmrf_report_uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/reach_report/qmrf"), :model_uri => @uri).to_s + def create_qmrf_report(subjectid=nil) + @qmrf_report_uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/reach_report/qmrf"), {:model_uri => @uri, :subjectid => subjectid}).to_s @qmrf_report_uri end - def summary(type) - v = YAML.load RestClientWrappper.get(File.join(@uri, 'statistics'),:accept => "application/x-yaml").to_s + def summary(type, subjectid=nil) + v = YAML.load OpenTox::RestClientWrapper.get(File.join(@uri, 'statistics'),{:accept => "application/x-yaml", :subjectid => subjectid}).to_s case type when "classification" -- cgit v1.2.3 From 70aee6e9dfece2760fc6d616e7151f41cc7625bf Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 2 Feb 2011 17:11:24 +0100 Subject: resclient wrapper: headers <-> payload, error report from rdf --- lib/algorithm.rb | 2 +- lib/authorization.rb | 7 ++++++- lib/dataset.rb | 2 +- lib/environment.rb | 4 ++-- lib/error.rb | 41 +++++++++++++++++++++++++++-------------- lib/model.rb | 4 ++-- lib/overwrite.rb | 7 +++---- lib/parser.rb | 33 ++++++++++++++++++++++++++++++++- lib/rest_client_wrapper.rb | 39 ++++++++++++++++++++++----------------- lib/task.rb | 9 ++++----- lib/validation.rb | 2 +- 11 files changed, 101 insertions(+), 49 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index ee3109c..ae05e16 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -16,7 +16,7 @@ module OpenTox # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [String] URI of new resource (dataset, model, ...) def run(params=nil, waiting_task=nil) - RestClientWrapper.post(@uri, {:accept => 'text/uri-list'}, params, waiting_task).to_s + RestClientWrapper.post(@uri, params, {:accept => 'text/uri-list'}, waiting_task).to_s end # Get OWL-DL representation in RDF/XML format diff --git a/lib/authorization.rb b/lib/authorization.rb index b4c1ee5..dd7dc12 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -195,7 +195,7 @@ module OpenTox # resource = RestClient::Resource.new("#{AA_SERVER}/Pol/opensso-pol") LOGGER.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s # return true if resource.post(policy, :subjectid => subjectid, :content_type => "application/xml") - return true if RestClientWrapper.post("#{AA_SERVER}/pol", {:subjectid => subjectid, :content_type => "application/xml"}, policy) + return true if RestClientWrapper.post("#{AA_SERVER}/pol", policy, {:subjectid => subjectid, :content_type => "application/xml"}) rescue return false end @@ -381,4 +381,9 @@ module OpenTox end end +# PENDING delete as soon as new free uri handling is merged +# this allows GET access to all URIS that do NOT end with / or // +OpenTox::Authorization.whitelist( /\/[0-9]+(\/?)$/, "GET", true ) +OpenTox::Authorization.whitelist( /\/[0-9]+(\/?)$/, "POST", true ) + diff --git a/lib/dataset.rb b/lib/dataset.rb index 9c20968..a4716dc 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -285,7 +285,7 @@ module OpenTox @compounds.uniq! if @uri if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :subjectid => subjectid},self.to_yaml) + RestClientWrapper.post(@uri,self.to_yaml,{:content_type => "application/x-yaml", :subjectid => subjectid}) else File.open("ot-post-file.rdf","w+") { |f| f.write(self.to_rdfxml); @path = f.path } task_uri = RestClient.post(@uri, {:file => File.new(@path)},{:accept => "text/uri-list" , :subjectid => subjectid}).to_s.chomp diff --git a/lib/environment.rb b/lib/environment.rb index 203ebc6..b30b3f3 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -54,8 +54,8 @@ else end # Regular expressions for parsing classification data -TRUE_REGEXP = /^(true|active|1|1.0)$/i -FALSE_REGEXP = /^(false|inactive|0|0.0)$/i +TRUE_REGEXP = /^(true|active|1|1.0|tox)$/i +FALSE_REGEXP = /^(false|inactive|0|0.0|low tox)$/i # Task durations DEFAULT_TASK_MAX_DURATION = 36000 diff --git a/lib/error.rb b/lib/error.rb index 8c666f3..49756d5 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -18,6 +18,10 @@ module OpenTox class NotFoundError < RuntimeError def http_code; 404; end end + + class ServiceUnavailableError < RuntimeError + def http_code; 503; end + end class RestCallError < RuntimeError attr_accessor :rest_params @@ -28,18 +32,31 @@ module OpenTox # TODO replace params with URIs (errorCause -> OT.errorCause) attr_reader :message, :actor, :errorCause, :http_code, :errorDetails, :errorType + + private + def initialize( http_code, erroType, message, actor, errorCause, rest_params=nil, backtrace=nil ) + @http_code = http_code + @errorType = erroType + @message = message + @actor = actor + @errorCause = errorCause + @rest_params = rest_params + @backtrace = backtrace + end + public # creates a error report object, from an ruby-exception object - # @param [Exception] error - # @param [String] actor, URI of the call that cause the error - def initialize( error, actor ) - @http_code = error.http_code - @errorType = error.class.to_s - @message = error.message - @actor = actor - @errorCause = error.errorCause if error.errorCause - @rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params - @backtrace = error.backtrace.short_backtrace if CONFIG[:backtrace] + # @param [Exception] error + # @param [String] actor, URI of the call that cause the error + def self.create( error, actor ) + rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params + backtrace = error.backtrace.short_backtrace if CONFIG[:backtrace] + ErrorReport.new( error.http_code, error.class.to_s, error.message, actor, error.errorCause, rest_params, backtrace ) + end + + def self.from_rdf(rdf) + metadata = OpenTox::Parser::Owl.metadata_from_rdf( rdf, OT.ErrorReport ) + ErrorReport.new(metadata[OT.statusCode], metadata[OT.errorCode], metadata[OT.message], metadata[OT.actor], metadata[OT.errorCause]) end # overwrite sorting to make easier readable @@ -61,10 +78,6 @@ module OpenTox c[OT.errorCause] = @errorCause.rdf_content if @errorCause c end - - def self.from_rdf(rdf) - raise "not yet implemented" - end def to_rdfxml s = Serializer::Owl.new diff --git a/lib/model.rb b/lib/model.rb index 80d7ec4..7cf52ad 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -17,7 +17,7 @@ module OpenTox end end LOGGER.info "running model "+@uri.to_s+", params: "+params.inspect+", accept: "+accept_header.to_s - RestClientWrapper.post(@uri,{:accept => accept_header},params,waiting_task).to_s + RestClientWrapper.post(@uri,params,{:accept => accept_header},waiting_task).to_s end # Generic OpenTox model class for all API compliant services @@ -303,7 +303,7 @@ module OpenTox # Save model at model service def save(subjectid) - self.uri = RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :subjectid => subjectid},self.to_yaml) + self.uri = RestClientWrapper.post(@uri,self.to_yaml,{:content_type => "application/x-yaml", :subjectid => subjectid}) end # Delete model at model service diff --git a/lib/overwrite.rb b/lib/overwrite.rb index e52618c..1e1cc43 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -16,13 +16,12 @@ before { # IMPT: set sinatra settings :show_exceptions + :raise_errors to false in config.ru, otherwise Rack::Showexceptions takes over error Exception do error = request.env['sinatra.error'] - # log error to logfile + # log error message and backtrace to logfile LOGGER.error error.class.to_s+": "+error.message - # log backtrace only if code is 500 -> unwanted (Runtime)Exceptions and internal errors (see error.rb) - LOGGER.error ":\n"+error.backtrace.join("\n") if error.http_code==500 + LOGGER.error ":\n"+error.backtrace.join("\n") actor = "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" - rep = OpenTox::ErrorReport.new(error, actor) + rep = OpenTox::ErrorReport.create(error, actor) case request.env['HTTP_ACCEPT'] when /rdf/ diff --git a/lib/parser.rb b/lib/parser.rb index a913cf2..e055eec 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -30,7 +30,6 @@ module OpenTox # Read metadata from opentox service # @return [Hash] Object metadata def load_metadata(subjectid=nil) - if @dataset uri = File.join(@uri,"metadata") else @@ -55,6 +54,38 @@ module OpenTox end @metadata end + + # loads metadata from rdf-data + # @param [String] rdf + # @param [String] type of the info (e.g. OT.Task, OT.ErrorReport) needed to get the subject-uri + # @return [Hash] metadata + def self.metadata_from_rdf( rdf, type ) + # write to file and read convert with rapper into tripples + file = Tempfile.new("ot-rdfxml") + file.puts rdf + file.close + file = "file://"+file.path + #puts "cmd: rapper -i rdfxml -o ntriples #{file} 2>/dev/null" + triples = `rapper -i rdfxml -o ntriples #{file} 2>/dev/null` + + # load uri via type + uri = nil + triples.each_line do |line| + triple = line.to_triple + if triple[1] == RDF['type'] and triple[2]==type + raise "uri already set, two uris found with type: "+type.to_s if uri + uri = triple[0] + end + end + + # load metadata + metadata = {} + triples.each_line do |line| + triple = line.to_triple + metadata[triple[1]] = triple[2].split('^^').first if triple[0] == uri and triple[1] != RDF['type'] + end + metadata + end # Generic parser for all OpenTox classes class Generic diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 7c2d719..f59dce7 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -14,21 +14,21 @@ module OpenTox # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @param [wait,Boolean] wait set to false to NOT wait for task if result is task # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.get(uri, headers=nil, waiting_task=nil, wait=true ) - execute( "get", uri, headers, nil, waiting_task, wait) + def self.get(uri, headers={}, waiting_task=nil, wait=true ) + execute( "get", uri, nil, headers, waiting_task, wait) end # performs a POST REST call # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) # per default: waits for Task to finish and returns result URI of Task # @param [String] uri destination URI - # @param [optional,Hash] headers contains params like accept-header # @param [optional,String] payload data posted to the service + # @param [optional,Hash] headers contains params like accept-header # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @param [wait,Boolean] wait set to false to NOT wait for task if result is task # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.post(uri, headers, payload=nil, waiting_task=nil, wait=true ) - execute( "post", uri, headers, payload, waiting_task, wait ) + def self.post(uri, payload=nil, headers={}, waiting_task=nil, wait=true ) + execute( "post", uri, payload, headers, waiting_task, wait ) end # performs a PUT REST call @@ -37,8 +37,8 @@ module OpenTox # @param [optional,Hash] headers contains params like accept-header # @param [optional,String] payload data put to the service # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.put(uri, headers, payload=nil ) - execute( "put", uri, headers, payload ) + def self.put(uri, payload=nil, headers={} ) + execute( "put", uri, payload, headers ) end # performs a DELETE REST call @@ -47,36 +47,41 @@ module OpenTox # @param [optional,Hash] headers contains params like accept-header # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call def self.delete(uri, headers=nil ) - execute( "delete", uri, headers, nil) + execute( "delete", uri, nil, headers) end private - def self.execute( rest_call, uri, headers, payload=nil, waiting_task=nil, wait=true ) + def self.execute( rest_call, uri, payload=nil, headers={}, waiting_task=nil, wait=true ) raise OpenTox::BadRequestError.new "uri is null" unless uri raise OpenTox::BadRequestError.new "not a uri: "+uri.to_s unless uri.to_s.uri? raise OpenTox::BadRequestError.new "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) raise OpenTox::BadRequestError.new "nil headers for post not allowed, use {}" if rest_call=="post" and headers==nil headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems + raise OpenTox::BadRequestError.new "accept should go into the headers" if payload and payload.is_a?(Hash) and payload[:accept] + raise OpenTox::BadRequestError.new "content_type should go into the headers" if payload and payload.is_a?(Hash) and payload[:content_type] + + # PENDING needed for NUTA, until we finally agree on how to send subjectid + headers[:subjectid] = payload.delete(:subjectid) if uri=~/ntua/ and payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) begin #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect+" "+payload.inspect - resource = RestClient::Resource.new(uri,{:timeout => 60}) - if payload + resource = RestClient::Resource.new(uri,{:timeout => 60}) + if rest_call=="post" || rest_call=="put" result = resource.send(rest_call, payload, headers) - elsif headers - result = resource.send(rest_call, headers) else - result = resource.send(rest_call) + result = resource.send(rest_call, headers) end + # PENDING NTUA does return errors with 200 + raise RestClient::ExceptionWithResponse.new(result) if uri=~/ntua/ and result.body =~ /about.*http:\/\/anonymous.org\/error/ + # result is a string, with the additional fields content_type and code res = WrapperResult.new(result.body) res.content_type = result.headers[:content_type] raise "content-type not set" unless res.content_type res.code = result.code - #LOGGER.debug "RestCall result: "+res.to_s+" "+res.code.to_s+" "+res.content_type.to_s # TODO: Ambit returns task representation with 200 instead of result URI return res if res.code==200 || !wait @@ -87,10 +92,10 @@ module OpenTox return res rescue RestClient::RequestTimeout => ex - received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers} + received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} rescue RestClient::ExceptionWithResponse => ex # error comming from a different webservice, - received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers} + received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers, :payload => payload} rescue OpenTox::RestCallError => ex # already a rest-error, probably comes from wait_for_task, just pass through raise ex diff --git a/lib/task.rb b/lib/task.rb index 74940de..f635b43 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -33,7 +33,7 @@ module OpenTox def self.create( title=nil, creator=nil, max_duration=DEFAULT_TASK_MAX_DURATION, description=nil ) params = {:title=>title, :creator=>creator, :max_duration=>max_duration, :description=>description } - task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, nil, false).to_s + task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, {}, false).to_s task = Task.new(task_uri.chomp) # measure current memory consumption @@ -64,9 +64,8 @@ module OpenTox task.completed(result) rescue => error LOGGER.error "task failed: "+error.class.to_s+": "+error.message - # log backtrace only if code is 500 -> unwanted (Runtime)Exceptions and internal errors (see error.rb) - LOGGER.error ":\n"+error.backtrace.join("\n") if error.http_code==500 - task.error(OpenTox::ErrorReport.new(error, creator)) + LOGGER.error ":\n"+error.backtrace.join("\n") + task.error(OpenTox::ErrorReport.create(error, creator)) end end task.pid = task_pid @@ -188,7 +187,7 @@ module OpenTox # create is private now, use OpenTox::Task.as_task #def self.create( params ) - #task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, nil, false).to_s + #task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, {}, false).to_s #Task.find(task_uri.chomp) #end diff --git a/lib/validation.rb b/lib/validation.rb index 76c4529..83be91a 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -9,7 +9,7 @@ module OpenTox params[:num_folds] = 10 unless params[:num_folds] params[:random_seed] = 2 unless params[:random_seed] params[:stratified] = false unless params[:stratified] - uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/crossvalidation"),params,nil,false) + uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/crossvalidation"),params,{},false) OpenTox::Validation.new(uri) end -- cgit v1.2.3 From 4ca97288ad2a270c34dc4f18634ee40915a45462 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 3 Feb 2011 09:45:18 +0100 Subject: return task method for sinatra --- lib/overwrite.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 1e1cc43..7b53122 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -36,6 +36,27 @@ error Exception do end end +class Sinatra::Base + + def return_task( task ) + code = task.running? ? 202 : 200 + case request.env['HTTP_ACCEPT'] + when /rdf/ + response['Content-Type'] = "application/rdf+xml" + halt code,task.to_rdfxml + when /yaml/ + response['Content-Type'] = "application/rdf+xml" + halt code,task.to_yaml # PENDING differs from task-webservice + when /html/ + response['Content-Type'] = "text/html" + halt code,OpenTox.text_to_html(task.to_yaml) + else # default /uri-list/ + response['Content-Type'] = "text/uri-list" + halt code,task.uri+"\n" + end + end +end + class String def task_uri? self.uri? && !self.match(/task/).nil? -- cgit v1.2.3 From 34ef45bf1f87c787e3ddaccc03a36a5fa2d54c7f Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 3 Feb 2011 18:10:48 +0100 Subject: update /refactor validation.rb --- lib/algorithm.rb | 2 +- lib/rest_client_wrapper.rb | 7 +- lib/task.rb | 3 +- lib/validation.rb | 180 ++++++++++++++++++++++++++++++++------------- 4 files changed, 134 insertions(+), 58 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index ae05e16..bfa9860 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -34,7 +34,7 @@ module OpenTox # Find Generic Opentox Algorithm via URI, and loads metadata # @param [String] uri Algorithm URI # @return [OpenTox::Algorithm::Generic] Algorithm instance, nil if alogrithm was not found - def self.find(uri, subjectid) + def self.find(uri, subjectid=nil) return nil unless uri alg = Generic.new(uri) alg.load_metadata( subjectid ) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index f59dce7..658f111 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -55,11 +55,12 @@ module OpenTox raise OpenTox::BadRequestError.new "uri is null" unless uri raise OpenTox::BadRequestError.new "not a uri: "+uri.to_s unless uri.to_s.uri? - raise OpenTox::BadRequestError.new "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) - raise OpenTox::BadRequestError.new "nil headers for post not allowed, use {}" if rest_call=="post" and headers==nil - headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems + raise "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) raise OpenTox::BadRequestError.new "accept should go into the headers" if payload and payload.is_a?(Hash) and payload[:accept] raise OpenTox::BadRequestError.new "content_type should go into the headers" if payload and payload.is_a?(Hash) and payload[:content_type] + raise "__waiting_task__ must be 'nil' or '(sub)task', is "+waiting_task.class.to_s if + waiting_task!=nil and !(waiting_task.is_a?(Task) || waiting_task.is_a?(SubTask)) + headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems # PENDING needed for NUTA, until we finally agree on how to send subjectid headers[:subjectid] = payload.delete(:subjectid) if uri=~/ntua/ and payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) diff --git a/lib/task.rb b/lib/task.rb index f635b43..9c52299 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -33,7 +33,7 @@ module OpenTox def self.create( title=nil, creator=nil, max_duration=DEFAULT_TASK_MAX_DURATION, description=nil ) params = {:title=>title, :creator=>creator, :max_duration=>max_duration, :description=>description } - task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, {}, false).to_s + task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, {}, nil, false).to_s task = Task.new(task_uri.chomp) # measure current memory consumption @@ -284,7 +284,6 @@ module OpenTox raise OpenTox::BadRequestError.new ex.message+" (task-uri:"+@uri+")" end end - end # Convenience class to split a (sub)task into subtasks diff --git a/lib/validation.rb b/lib/validation.rb index 83be91a..b1ccb7b 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -1,70 +1,146 @@ module OpenTox - class Validation + class Crossvalidation include OpenTox - attr_accessor :report_uri, :qmrf_report_uri + attr_reader :report + + # find crossvalidation, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::Crossvalidation] + def self.find( uri, subjectid=nil ) + # PENDING load crossvalidation data? + OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) + Crossvalidation.new(uri) + end - def self.create_crossvalidation(params) - params[:uri] = File.join(CONFIG[:services]['opentox-validation'], "crossvalidation") + # creates a crossvalidations, waits until it finishes, may take some time + # @param [Hash] params + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::Crossvalidation] + def self.create( params, subjectid=nil, waiting_task=nil ) + params[:uri] = File.join(CONFIG[:services]['opentox-validation'], "crossvalidation") params[:num_folds] = 10 unless params[:num_folds] - params[:random_seed] = 2 unless params[:random_seed] - params[:stratified] = false unless params[:stratified] - uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/crossvalidation"),params,{},false) - OpenTox::Validation.new(uri) - end - - def create_report - @report_uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/crossvalidation"), :validation_uris => @uri).to_s - @report_uri + params[:random_seed] = 2 unless params[:random_seed] + params[:stratified] = false unless params[:stratified] + params[:subjectid] = subjectid if subjectid + uri = OpenTox::RestClientWrapper.post( File.join(CONFIG[:services]["opentox-validation"],"/crossvalidation"), + params,{:content_type => "text/uri-list"},waiting_task ) + Crossvalidation.new(uri) end - def create_qmrf_report - @qmrf_report_uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/reach_report/qmrf"), :model_uri => @uri).to_s - @qmrf_report_uri + # looks for report for this crossvalidation, creates a report if no report is found + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::CrossvalidationReport] + def find_or_create_report( subjectid=nil, waiting_task=nil ) + @report = CrossvalidationReport.find_for_crossvalidation(self, subjectid) unless @report + @report = CrossvalidationReport.create(self, subjectid, waiting_task) unless @report + @report end - def summary(type) - v = YAML.load RestClientWrappper.get(File.join(@uri, 'statistics'),:accept => "application/x-yaml").to_s - - case type - when "classification" - tp=0; tn=0; fp=0; fn=0; n=0 - v[:classification_statistics][:confusion_matrix][:confusion_matrix_cell].each do |cell| - if cell[:confusion_matrix_predicted] == "true" and cell[:confusion_matrix_actual] == "true" - tp = cell[:confusion_matrix_value] - n += tp - elsif cell[:confusion_matrix_predicted] == "false" and cell[:confusion_matrix_actual] == "false" - tn = cell[:confusion_matrix_value] - n += tn - elsif cell[:confusion_matrix_predicted] == "false" and cell[:confusion_matrix_actual] == "true" - fn = cell[:confusion_matrix_value] - n += fn - elsif cell[:confusion_matrix_predicted] == "true" and cell[:confusion_matrix_actual] == "false" - fp = cell[:confusion_matrix_value] - n += fp + # PENDING: creates summary as used for ToxCreate + def summary + v = YAML.load RestClientWrapper.get(File.join(@uri, 'statistics'),:accept => "application/x-yaml").to_s + if v[OT.classificationStatistics] + res = { + :nr_predictions => v[OT.numInstances] - v[OT.numUnpredicted], + :correct_predictions => v[OT.classificationStatistics][OT.percentCorrect], + :weighted_area_under_roc => v[OT.classificationStatistics][OT.weightedAreaUnderRoc], + } + v[OT.classificationStatistics][OT.classValueStatistics].each do |s| + if s[OT.classValue].to_s=="true" + res[:true_positives] = s[OT.numTruePositives] + res[:false_positives] = s[OT.numFalsePositives] + res[:true_negatives] = s[OT.numTrueNegatives] + res[:false_negatives] = s[OT.numFalseNegatives] + res[:sensitivity] = s[OT.truePositiveRate] + res[:specificity] = s[OT.falsePositiveRate] + break end end + res + elsif v[OT.regressionStatistics] { - :nr_predictions => n, - :true_positives => tp, - :false_positives => fp, - :true_negatives => tn, - :false_negatives => fn, - :correct_predictions => 100*(tp+tn).to_f/n, - :weighted_area_under_roc => v[:classification_statistics][:weighted_area_under_roc].to_f, - :sensitivity => tp.to_f/(tp+fn), - :specificity => tn.to_f/(tn+fp), - } - when "regression" - { - :nr_predictions => v[:num_instances] - v[:num_unpredicted], - :r_square => v[:regression_statistics][:r_square], - :root_mean_squared_error => v[:regression_statistics][:root_mean_squared_error], - :mean_absolute_error => v[:regression_statistics][:mean_absolute_error], + :nr_predictions => v[OT.numInstances] - v[OT.numUnpredicted], + :r_square => v[OT.regressionStatistics][OT.rSquare], + :root_mean_squared_error => v[OT.regressionStatistics][OT.rootMeanSquaredError], + :mean_absolute_error => v[OT.regressionStatistics][OT.meanAbsoluteError], } end end + end - end + class CrossvalidationReport + include OpenTox + + # finds CrossvalidationReport via uri, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::CrossvalidationReport] + def self.find( uri, subjectid=nil ) + # PENDING load report data? + OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) + CrossvalidationReport.new(uri) + end + + # finds CrossvalidationReport for a particular crossvalidation + # @param [OpenTox::Crossvalidation] + # @param [String,optional] subjectid + # @return [OpenTox::CrossvalidationReport] nil if no report found + def self.find_for_crossvalidation( crossvalidation, subjectid=nil ) + uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], + "/report/crossvalidation?crossvalidation="+crossvalidation.uri), {:subjectid => subjectid}).chomp.split("\n") + uris.size==0 ? nil : CrossvalidationReport.new(uris[-1]) + end + + # creates a crossvalidation report via crossvalidation + # @param [OpenTox::Crossvalidation] + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::CrossvalidationReport] + def self.create( crossvalidation, subjectid=nil, waiting_task=nil ) + uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/crossvalidation"), + { :validation_uris => crossvalidation.uri, :subjectid => subjectid }, {}, waiting_task ) + CrossvalidationReport.new(uri) + end + end + + class QMRFReport + include OpenTox + + # finds QMRFReport, raises Error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::QMRFReport] + def self.find( uri, subjectid=nil ) + # PENDING load crossvalidation data? + OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) + QMRFReport.new(uri) + end + + # finds QMRF report for a particular model + # @param [OpenTox::Crossvalidation] + # @param [String,optional] subjectid + # @return [OpenTox::QMRFReport] nil if no report found + def self.find_for_model( model, subjectid=nil ) + uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], + "/reach_report/qmrf?model="+model.uri), {:subjectid => subjectid}).chomp.split("\n") + uris.size==0 ? nil : QMRFReport.new(uris[-1]) + end + + # creates a qmrf report via model + # @param [OpenTox::Model] + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::QMRFReport] + def self.create( model, subjectid=nil, waiting_task=nil ) + uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/reach_report/qmrf"), + { :model_uri => model.uri, :subjectid => subjectid }, {}, waiting_task ) + QMRFReport.new(uri) + end + end + end -- cgit v1.2.3 From e035b7136b8c2df70de980379695fbfeaf070290 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 4 Feb 2011 09:32:22 +0100 Subject: add missing subjectid param --- lib/validation.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/validation.rb b/lib/validation.rb index b1ccb7b..d70bba2 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -41,8 +41,8 @@ module OpenTox end # PENDING: creates summary as used for ToxCreate - def summary - v = YAML.load RestClientWrapper.get(File.join(@uri, 'statistics'),:accept => "application/x-yaml").to_s + def summary( subjectid=nil ) + v = YAML.load RestClientWrapper.get(File.join(@uri, 'statistics'),{:accept => "application/x-yaml", :subjectid => subjectid}).to_s if v[OT.classificationStatistics] res = { :nr_predictions => v[OT.numInstances] - v[OT.numUnpredicted], -- cgit v1.2.3 From 5ea8356992751af875812f0e244f08760eb30aee Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 4 Feb 2011 16:13:25 +0100 Subject: added delete to opentox objects, cosmetics --- lib/opentox.rb | 5 +++++ lib/validation.rb | 12 ++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index f1af5c3..1992896 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -43,5 +43,10 @@ module OpenTox s.to_rdfxml end + # deletes the resource, deletion should have worked when no RestCallError raised + def delete(subjectid=nil) + RestClientWrapper.delete(uri,:subjectid => subjectid) + end + end diff --git a/lib/validation.rb b/lib/validation.rb index d70bba2..c256d1d 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -1,8 +1,8 @@ module OpenTox - class Crossvalidation + class Crossvalidation include OpenTox - attr_reader :report + attr_reader :report # find crossvalidation, raises error if not found # @param [String] uri @@ -15,17 +15,13 @@ module OpenTox end # creates a crossvalidations, waits until it finishes, may take some time - # @param [Hash] params + # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,num_folds(10),random_seed(1),stratified(false)) # @param [String,optional] subjectid # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::Crossvalidation] def self.create( params, subjectid=nil, waiting_task=nil ) - params[:uri] = File.join(CONFIG[:services]['opentox-validation'], "crossvalidation") - params[:num_folds] = 10 unless params[:num_folds] - params[:random_seed] = 2 unless params[:random_seed] - params[:stratified] = false unless params[:stratified] params[:subjectid] = subjectid if subjectid - uri = OpenTox::RestClientWrapper.post( File.join(CONFIG[:services]["opentox-validation"],"/crossvalidation"), + uri = OpenTox::RestClientWrapper.post( File.join(CONFIG[:services]["opentox-validation"],"crossvalidation"), params,{:content_type => "text/uri-list"},waiting_task ) Crossvalidation.new(uri) end -- cgit v1.2.3 From 9848197e9e0830c569ae2addcd404c59c0a53180 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 7 Feb 2011 10:07:34 +0100 Subject: add Dataset.exist as find loads all data --- lib/dataset.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/dataset.rb b/lib/dataset.rb index a4716dc..02b89cb 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -56,6 +56,19 @@ module OpenTox dataset.load_all(subjectid) dataset end + + # replaces find as exist check, takes not as long, does NOT raise an un-authorized exception + # @param [String] uri Dataset URI + # @return [Boolean] true if dataset exists and user has get rights, false else + def self.exist?(uri, subjectid=nil) + return false unless uri + dataset = Dataset.new(uri, subjectid) + begin + dataset.load_metadata( subjectid ).size > 0 + rescue + false + end + end # Get all datasets from a service # @param [optional,String] uri URI of the dataset service, defaults to service specified in configuration -- cgit v1.2.3 From 281a0bade2ca1d1bb040c54704650b69f6da24a5 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 7 Feb 2011 15:35:53 +0100 Subject: .find method raises error if opentox-object not found, extending validation.rb --- lib/algorithm.rb | 11 ++--- lib/model.rb | 11 ++--- lib/task.rb | 1 + lib/validation.rb | 144 +++++++++++++++++++++++++++++++++++++----------------- 4 files changed, 108 insertions(+), 59 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index bfa9860..af8dfaf 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -31,18 +31,15 @@ module OpenTox class Generic include Algorithm - # Find Generic Opentox Algorithm via URI, and loads metadata + # Find Generic Opentox Algorithm via URI, and loads metadata, could raise NotFound/NotAuthorized error # @param [String] uri Algorithm URI - # @return [OpenTox::Algorithm::Generic] Algorithm instance, nil if alogrithm was not found + # @return [OpenTox::Algorithm::Generic] Algorithm instance def self.find(uri, subjectid=nil) return nil unless uri alg = Generic.new(uri) alg.load_metadata( subjectid ) - if alg.metadata==nil or alg.metadata.size==0 - nil - else - alg - end + raise "cannot load algorithm metadata" if alg.metadata==nil or alg.metadata.size==0 + alg end end diff --git a/lib/model.rb b/lib/model.rb index 7cf52ad..ae793e8 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -24,18 +24,15 @@ module OpenTox class Generic include Model - # Find Generic Opentox Model via URI, and loads metadata + # Find Generic Opentox Model via URI, and loads metadata, could raise NotFound/NotAuthorized error # @param [String] uri Model URI - # @return [OpenTox::Model::Generic] Model instance, nil if model was not found + # @return [OpenTox::Model::Generic] Model instance def self.find(uri,subjectid=nil) return nil unless uri model = Generic.new(uri) model.load_metadata(subjectid) - if model.metadata==nil or model.metadata.size==0 - nil - else - model - end + raise "could not load model metadata" if model.metadata==nil or model.metadata.size==0 + model end # provides feature type, possible types are "regression" or "classification" diff --git a/lib/task.rb b/lib/task.rb index 9c52299..73d880e 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -80,6 +80,7 @@ module OpenTox return nil unless uri task = Task.new(uri) task.load_metadata + raise "could not load task metadata" if task.metadata==nil or task.metadata.size==0 task end diff --git a/lib/validation.rb b/lib/validation.rb index c256d1d..f0c5297 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -1,4 +1,63 @@ module OpenTox + class Validation + include OpenTox + + # find validation, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::Validation] + def self.find( uri, subjectid=nil ) + val = Validation.new(uri) + val.load_metadata( subjectid ) + val + end + + # creates a validation object from crossvaldiation statistics, raise error if not found + # (as crossvaldiation statistics are returned as an average valdidation over all folds) + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @return [OpenTox::Validation] + def self.from_cv_statistics( crossvalidation_uri, subjectid=nil ) + find( File.join(crossvalidation_uri, 'statistics'),subjectid ) + end + + # loads metadata via yaml from validation object + # fields (like for example the validated model) can be acces via validation.metadata[OT.model] + def load_metadata( subjectid=nil ) + @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid, :accept => "application/x-yaml"})) + end + + # PENDING: creates summary as used for ToxCreate + def summary + if @metadata[OT.classificationStatistics] + res = { + :nr_predictions => @metadata[OT.numInstances] - @metadata[OT.numUnpredicted], + :correct_predictions => @metadata[OT.classificationStatistics][OT.percentCorrect], + :weighted_area_under_roc => @metadata[OT.classificationStatistics][OT.weightedAreaUnderRoc], + } + @metadata[OT.classificationStatistics][OT.classValueStatistics].each do |s| + if s[OT.classValue].to_s=="true" + res[:true_positives] = s[OT.numTruePositives] + res[:false_positives] = s[OT.numFalsePositives] + res[:true_negatives] = s[OT.numTrueNegatives] + res[:false_negatives] = s[OT.numFalseNegatives] + res[:sensitivity] = s[OT.truePositiveRate] + res[:specificity] = s[OT.falsePositiveRate] + break + end + end + res + elsif @metadata[OT.regressionStatistics] + { + :nr_predictions => @metadata[OT.numInstances] - @metadata[OT.numUnpredicted], + :r_square => @metadata[OT.regressionStatistics][OT.rSquare], + :root_mean_squared_error => @metadata[OT.regressionStatistics][OT.rootMeanSquaredError], + :mean_absolute_error => @metadata[OT.regressionStatistics][OT.meanAbsoluteError], + } + end + end + end + class Crossvalidation include OpenTox @@ -9,9 +68,9 @@ module OpenTox # @param [String,optional] subjectid # @return [OpenTox::Crossvalidation] def self.find( uri, subjectid=nil ) - # PENDING load crossvalidation data? - OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) - Crossvalidation.new(uri) + cv = Crossvalidation.new(uri) + cv.load_metadata( subjectid ) + cv end # creates a crossvalidations, waits until it finishes, may take some time @@ -31,42 +90,37 @@ module OpenTox # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::CrossvalidationReport] def find_or_create_report( subjectid=nil, waiting_task=nil ) - @report = CrossvalidationReport.find_for_crossvalidation(self, subjectid) unless @report - @report = CrossvalidationReport.create(self, subjectid, waiting_task) unless @report + @report = CrossvalidationReport.find_for_crossvalidation(@uri, subjectid) unless @report + @report = CrossvalidationReport.create(@uri, subjectid, waiting_task) unless @report @report end - + + # loads metadata via yaml from crossvalidation object + # fields (like for example the validations) can be acces via validation.metadata[OT.validation] + def load_metadata( subjectid=nil ) + @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid, :accept => "application/x-yaml"})) + end + # PENDING: creates summary as used for ToxCreate def summary( subjectid=nil ) - v = YAML.load RestClientWrapper.get(File.join(@uri, 'statistics'),{:accept => "application/x-yaml", :subjectid => subjectid}).to_s - if v[OT.classificationStatistics] - res = { - :nr_predictions => v[OT.numInstances] - v[OT.numUnpredicted], - :correct_predictions => v[OT.classificationStatistics][OT.percentCorrect], - :weighted_area_under_roc => v[OT.classificationStatistics][OT.weightedAreaUnderRoc], - } - v[OT.classificationStatistics][OT.classValueStatistics].each do |s| - if s[OT.classValue].to_s=="true" - res[:true_positives] = s[OT.numTruePositives] - res[:false_positives] = s[OT.numFalsePositives] - res[:true_negatives] = s[OT.numTrueNegatives] - res[:false_negatives] = s[OT.numFalseNegatives] - res[:sensitivity] = s[OT.truePositiveRate] - res[:specificity] = s[OT.falsePositiveRate] - break - end - end - res - elsif v[OT.regressionStatistics] - { - :nr_predictions => v[OT.numInstances] - v[OT.numUnpredicted], - :r_square => v[OT.regressionStatistics][OT.rSquare], - :root_mean_squared_error => v[OT.regressionStatistics][OT.rootMeanSquaredError], - :mean_absolute_error => v[OT.regressionStatistics][OT.meanAbsoluteError], - } - end + Validation.from_cv_statistics( @uri, subjectid ).summary end end + + class ValidationReport + include OpenTox + + # finds ValidationReport for a particular validation + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @return [OpenTox::ValidationReport] nil if no report found + def self.find_for_validation( validation_uri, subjectid=nil ) + uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], + "/report/validation?validation="+validation_uri), {:subjectid => subjectid}).chomp.split("\n") + uris.size==0 ? nil : ValidationReport.new(uris[-1]) + end + + end class CrossvalidationReport include OpenTox @@ -82,23 +136,23 @@ module OpenTox end # finds CrossvalidationReport for a particular crossvalidation - # @param [OpenTox::Crossvalidation] + # @param [String] crossvalidation uri # @param [String,optional] subjectid # @return [OpenTox::CrossvalidationReport] nil if no report found - def self.find_for_crossvalidation( crossvalidation, subjectid=nil ) + def self.find_for_crossvalidation( crossvalidation_uri, subjectid=nil ) uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], - "/report/crossvalidation?crossvalidation="+crossvalidation.uri), {:subjectid => subjectid}).chomp.split("\n") + "/report/crossvalidation?crossvalidation="+crossvalidation_uri), {:subjectid => subjectid}).chomp.split("\n") uris.size==0 ? nil : CrossvalidationReport.new(uris[-1]) end # creates a crossvalidation report via crossvalidation - # @param [OpenTox::Crossvalidation] + # @param [String] crossvalidation uri # @param [String,optional] subjectid # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::CrossvalidationReport] - def self.create( crossvalidation, subjectid=nil, waiting_task=nil ) + def self.create( crossvalidation_uri, subjectid=nil, waiting_task=nil ) uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/crossvalidation"), - { :validation_uris => crossvalidation.uri, :subjectid => subjectid }, {}, waiting_task ) + { :validation_uris => crossvalidation_uri, :subjectid => subjectid }, {}, waiting_task ) CrossvalidationReport.new(uri) end end @@ -117,23 +171,23 @@ module OpenTox end # finds QMRF report for a particular model - # @param [OpenTox::Crossvalidation] + # @param [String] model_uri # @param [String,optional] subjectid # @return [OpenTox::QMRFReport] nil if no report found - def self.find_for_model( model, subjectid=nil ) + def self.find_for_model( model_uri, subjectid=nil ) uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], - "/reach_report/qmrf?model="+model.uri), {:subjectid => subjectid}).chomp.split("\n") + "/reach_report/qmrf?model="+model_uri), {:subjectid => subjectid}).chomp.split("\n") uris.size==0 ? nil : QMRFReport.new(uris[-1]) end # creates a qmrf report via model - # @param [OpenTox::Model] + # @param [String] model_uri # @param [String,optional] subjectid # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::QMRFReport] - def self.create( model, subjectid=nil, waiting_task=nil ) + def self.create( model_uri, subjectid=nil, waiting_task=nil ) uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/reach_report/qmrf"), - { :model_uri => model.uri, :subjectid => subjectid }, {}, waiting_task ) + { :model_uri => model_uri, :subjectid => subjectid }, {}, waiting_task ) QMRFReport.new(uri) end end -- cgit v1.2.3 From c37cc91893457cb91ddb2a32b9ac76090bd6c521 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 8 Feb 2011 08:57:31 +0100 Subject: not using rapper directly, use rest client and tmp-file --- lib/model.rb | 4 ++-- lib/parser.rb | 12 ++++++++++-- lib/task.rb | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index ae793e8..64d178f 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -31,7 +31,7 @@ module OpenTox return nil unless uri model = Generic.new(uri) model.load_metadata(subjectid) - raise "could not load model metadata" if model.metadata==nil or model.metadata.size==0 + raise "could not load model metadata '"+uri.to_s+"'" if model.metadata==nil or model.metadata.size==0 model end @@ -134,7 +134,7 @@ module OpenTox OT.parameters => [{DC.title => "dataset_uri", OT.paramValue => dataset_uri}] }) d = Dataset.new(dataset_uri,subjectid) - d.load_compounds + d.load_compounds(subjectid) count = 0 d.compounds.each do |compound_uri| begin diff --git a/lib/parser.rb b/lib/parser.rb index e055eec..27dfeee 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -35,10 +35,18 @@ module OpenTox else uri = @uri end - uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid + # avoid using rapper directly because of 2 reasons: + # * http errors wont be noticed + # * subjectid cannot be sent as header + ##uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid + ## `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| + file = Tempfile.new("ot-rdfxml") + file.puts OpenTox::RestClientWrapper.get @uri,{:subjectid => subjectid,:accept => "application/rdf+xml"} + file.close + file = "file://"+file.path statements = [] parameter_ids = [] - `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| + `rapper -i rdfxml -o ntriples #{file} 2>/dev/null`.each_line do |line| triple = line.to_triple @metadata[triple[1]] = triple[2].split('^^').first if triple[0] == @uri and triple[1] != RDF['type'] statements << triple diff --git a/lib/task.rb b/lib/task.rb index 73d880e..ca18d7b 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -303,7 +303,7 @@ module OpenTox class SubTask def initialize(task, min, max) - raise "not a task or subtask" unless task.is_a?(Task) or task.is_a?(SubTask) + raise "not a task or subtask" if task!=nil and !(task.is_a?(Task) or task.is_a?(SubTask)) raise "invalid max ("+max.to_s+"), min ("+min.to_s+") params" unless min.is_a?(Numeric) and max.is_a?(Numeric) and min >= 0 and max <= 100 and max > min @task = task -- cgit v1.2.3 From e4a32e37ab8708aa8ae4dbfc6069e5ea75928f3f Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 8 Feb 2011 12:58:30 +0100 Subject: manually insert code from mguetlein repository | restclientwrapper.post event with changed method call --- lib/algorithm.rb | 15 ++- lib/authorization.rb | 11 +-- lib/dataset.rb | 15 ++- lib/environment.rb | 4 +- lib/error.rb | 37 +++++-- lib/helper.rb | 5 +- lib/model.rb | 17 ++-- lib/opentox.rb | 5 + lib/overwrite.rb | 28 +++++- lib/parser.rb | 44 ++++++++- lib/rest_client_wrapper.rb | 44 +++++---- lib/task.rb | 22 +++-- lib/validation.rb | 240 ++++++++++++++++++++++++++++++++++----------- 13 files changed, 357 insertions(+), 130 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index ee3109c..af8dfaf 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -16,7 +16,7 @@ module OpenTox # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [String] URI of new resource (dataset, model, ...) def run(params=nil, waiting_task=nil) - RestClientWrapper.post(@uri, {:accept => 'text/uri-list'}, params, waiting_task).to_s + RestClientWrapper.post(@uri, params, {:accept => 'text/uri-list'}, waiting_task).to_s end # Get OWL-DL representation in RDF/XML format @@ -31,18 +31,15 @@ module OpenTox class Generic include Algorithm - # Find Generic Opentox Algorithm via URI, and loads metadata + # Find Generic Opentox Algorithm via URI, and loads metadata, could raise NotFound/NotAuthorized error # @param [String] uri Algorithm URI - # @return [OpenTox::Algorithm::Generic] Algorithm instance, nil if alogrithm was not found - def self.find(uri, subjectid) + # @return [OpenTox::Algorithm::Generic] Algorithm instance + def self.find(uri, subjectid=nil) return nil unless uri alg = Generic.new(uri) alg.load_metadata( subjectid ) - if alg.metadata==nil or alg.metadata.size==0 - nil - else - alg - end + raise "cannot load algorithm metadata" if alg.metadata==nil or alg.metadata.size==0 + alg end end diff --git a/lib/authorization.rb b/lib/authorization.rb index 12be037..16f1ee4 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -192,10 +192,10 @@ module OpenTox # return [Boolean] returns true if policy is created def self.create_policy(policy, subjectid) begin -# resource = RestClient::Resource.new("#{AA_SERVER}/Pol/opensso-pol") + resource = RestClient::Resource.new("#{AA_SERVER}/Pol/opensso-pol") LOGGER.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s -# return true if resource.post(policy, :subjectid => subjectid, :content_type => "application/xml") - return true if RestClientWrapper.post("#{AA_SERVER}/pol", {:subjectid => subjectid, :content_type => "application/xml"}, policy) + return true if resource.post(policy, :subjectid => subjectid, :content_type => "application/xml") + #return true if RestClientWrapper.post("#{AA_SERVER}/pol", {:subjectid => subjectid, :content_type => "application/xml"}, policy) rescue return false end @@ -306,7 +306,6 @@ module OpenTox # if no policy exists, create a policy, return result of send policy send_policy(uri, subjectid) else - LOGGER.debug "OpenTox::Authorization.check_policy URI: #{uri} has already a Policy." # if policy exists check for POST rights if authorize(uri, "POST", subjectid) true @@ -356,7 +355,6 @@ module OpenTox def self.free_uri?(uri, request_method) if CONFIG[:authorization][:free_uris] CONFIG[:authorization][:free_uris].each do |request_methods,uris| - LOGGER.info "free uris "+request_methods.inspect+" -> "+uris.inspect if request_methods and uris and request_methods.include?(request_method.to_sym) uris.each do |u| return true if u.match uri @@ -380,9 +378,6 @@ module OpenTox return false end - - - end end diff --git a/lib/dataset.rb b/lib/dataset.rb index 9c20968..02b89cb 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -56,6 +56,19 @@ module OpenTox dataset.load_all(subjectid) dataset end + + # replaces find as exist check, takes not as long, does NOT raise an un-authorized exception + # @param [String] uri Dataset URI + # @return [Boolean] true if dataset exists and user has get rights, false else + def self.exist?(uri, subjectid=nil) + return false unless uri + dataset = Dataset.new(uri, subjectid) + begin + dataset.load_metadata( subjectid ).size > 0 + rescue + false + end + end # Get all datasets from a service # @param [optional,String] uri URI of the dataset service, defaults to service specified in configuration @@ -285,7 +298,7 @@ module OpenTox @compounds.uniq! if @uri if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :subjectid => subjectid},self.to_yaml) + RestClientWrapper.post(@uri,self.to_yaml,{:content_type => "application/x-yaml", :subjectid => subjectid}) else File.open("ot-post-file.rdf","w+") { |f| f.write(self.to_rdfxml); @path = f.path } task_uri = RestClient.post(@uri, {:file => File.new(@path)},{:accept => "text/uri-list" , :subjectid => subjectid}).to_s.chomp diff --git a/lib/environment.rb b/lib/environment.rb index 203ebc6..b30b3f3 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -54,8 +54,8 @@ else end # Regular expressions for parsing classification data -TRUE_REGEXP = /^(true|active|1|1.0)$/i -FALSE_REGEXP = /^(false|inactive|0|0.0)$/i +TRUE_REGEXP = /^(true|active|1|1.0|tox)$/i +FALSE_REGEXP = /^(false|inactive|0|0.0|low tox)$/i # Task durations DEFAULT_TASK_MAX_DURATION = 36000 diff --git a/lib/error.rb b/lib/error.rb index 8c666f3..d086928 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -18,6 +18,10 @@ module OpenTox class NotFoundError < RuntimeError def http_code; 404; end end + + class ServiceUnavailableError < RuntimeError + def http_code; 503; end + end class RestCallError < RuntimeError attr_accessor :rest_params @@ -28,18 +32,31 @@ module OpenTox # TODO replace params with URIs (errorCause -> OT.errorCause) attr_reader :message, :actor, :errorCause, :http_code, :errorDetails, :errorType + + private + def initialize( http_code, erroType, message, actor, errorCause, rest_params=nil, backtrace=nil ) + @http_code = http_code + @errorType = erroType + @message = message + @actor = actor + @errorCause = errorCause + @rest_params = rest_params + @backtrace = backtrace + end + public # creates a error report object, from an ruby-exception object - # @param [Exception] error - # @param [String] actor, URI of the call that cause the error - def initialize( error, actor ) - @http_code = error.http_code - @errorType = error.class.to_s - @message = error.message - @actor = actor - @errorCause = error.errorCause if error.errorCause - @rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params - @backtrace = error.backtrace.short_backtrace if CONFIG[:backtrace] + # @param [Exception] error + # @param [String] actor, URI of the call that cause the error + def self.create( error, actor ) + rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params + backtrace = error.backtrace.short_backtrace if CONFIG[:backtrace] + ErrorReport.new( error.http_code, error.class.to_s, error.message, actor, error.errorCause, rest_params, backtrace ) + end + + def self.from_rdf(rdf) + metadata = OpenTox::Parser::Owl.metadata_from_rdf( rdf, OT.ErrorReport ) + ErrorReport.new(metadata[OT.statusCode], metadata[OT.errorCode], metadata[OT.message], metadata[OT.actor], metadata[OT.errorCause]) end # overwrite sorting to make easier readable diff --git a/lib/helper.rb b/lib/helper.rb index 0bb489c..6ca3901 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -28,8 +28,9 @@ helpers do #cleans URI from querystring and file-extension. Sets port 80 to emptystring # @param [String] uri def clean_uri(uri) + uri = uri.sub(" ", "%20") out = URI.parse(uri) - out.path = out.path[0, out.path.rindex(/[0-9]/) + 1] if out.path.rindex(/[0-9]/) #cuts after id for a&a + out.path = out.path[0, out.path.index(/[0-9]/)] if out.path.index(/[0-9]/) #cuts after id for a&a "#{out.scheme}:" + (out.port != 80 ? out.port : "") + "//#{out.host}#{out.path.chomp('/')}" end @@ -51,7 +52,7 @@ before do subjectid = CGI.unescape(subjectid) if subjectid.include?("%23") @subjectid = subjectid rescue - LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO subjectid for URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" + #LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO subjectid for URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" subjectid = "" end @subjectid = subjectid diff --git a/lib/model.rb b/lib/model.rb index 0073ea4..64d178f 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -17,25 +17,22 @@ module OpenTox end end LOGGER.info "running model "+@uri.to_s+", params: "+params.inspect+", accept: "+accept_header.to_s - RestClientWrapper.post(@uri,{:accept => accept_header},params,waiting_task).to_s + RestClientWrapper.post(@uri,params,{:accept => accept_header},waiting_task).to_s end # Generic OpenTox model class for all API compliant services class Generic include Model - # Find Generic Opentox Model via URI, and loads metadata + # Find Generic Opentox Model via URI, and loads metadata, could raise NotFound/NotAuthorized error # @param [String] uri Model URI - # @return [OpenTox::Model::Generic] Model instance, nil if model was not found + # @return [OpenTox::Model::Generic] Model instance def self.find(uri,subjectid=nil) return nil unless uri model = Generic.new(uri) model.load_metadata(subjectid) - if model.metadata==nil or model.metadata.size==0 - nil - else - model - end + raise "could not load model metadata '"+uri.to_s+"'" if model.metadata==nil or model.metadata.size==0 + model end # provides feature type, possible types are "regression" or "classification" @@ -46,7 +43,7 @@ module OpenTox @algorithm = OpenTox::Algorithm::Generic.find(@metadata[OT.algorithm], subjectid) unless @algorithm algorithm_title = @algorithm ? @algorithm.metadata[DC.title] : nil - @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables], subjectid) unless @dependentVariable + @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables],subjectid ) unless @dependentVariable [@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], @uri, algorithm_title].each do |type| case type @@ -303,7 +300,7 @@ module OpenTox # Save model at model service def save(subjectid) - self.uri = RestClientWrapper.post(@uri,{:content_type => "application/x-yaml", :subjectid => subjectid},self.to_yaml) + self.uri = RestClientWrapper.post(@uri,self.to_yaml,{:content_type => "application/x-yaml", :subjectid => subjectid}) end # Delete model at model service diff --git a/lib/opentox.rb b/lib/opentox.rb index f1af5c3..1992896 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -43,5 +43,10 @@ module OpenTox s.to_rdfxml end + # deletes the resource, deletion should have worked when no RestCallError raised + def delete(subjectid=nil) + RestClientWrapper.delete(uri,:subjectid => subjectid) + end + end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index e52618c..7b53122 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -16,13 +16,12 @@ before { # IMPT: set sinatra settings :show_exceptions + :raise_errors to false in config.ru, otherwise Rack::Showexceptions takes over error Exception do error = request.env['sinatra.error'] - # log error to logfile + # log error message and backtrace to logfile LOGGER.error error.class.to_s+": "+error.message - # log backtrace only if code is 500 -> unwanted (Runtime)Exceptions and internal errors (see error.rb) - LOGGER.error ":\n"+error.backtrace.join("\n") if error.http_code==500 + LOGGER.error ":\n"+error.backtrace.join("\n") actor = "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" - rep = OpenTox::ErrorReport.new(error, actor) + rep = OpenTox::ErrorReport.create(error, actor) case request.env['HTTP_ACCEPT'] when /rdf/ @@ -37,6 +36,27 @@ error Exception do end end +class Sinatra::Base + + def return_task( task ) + code = task.running? ? 202 : 200 + case request.env['HTTP_ACCEPT'] + when /rdf/ + response['Content-Type'] = "application/rdf+xml" + halt code,task.to_rdfxml + when /yaml/ + response['Content-Type'] = "application/rdf+xml" + halt code,task.to_yaml # PENDING differs from task-webservice + when /html/ + response['Content-Type'] = "text/html" + halt code,OpenTox.text_to_html(task.to_yaml) + else # default /uri-list/ + response['Content-Type'] = "text/uri-list" + halt code,task.uri+"\n" + end + end +end + class String def task_uri? self.uri? && !self.match(/task/).nil? diff --git a/lib/parser.rb b/lib/parser.rb index a913cf2..1a872a0 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -36,10 +36,18 @@ module OpenTox else uri = @uri end - uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid + # avoid using rapper directly because of 2 reasons: + # * http errors wont be noticed + # * subjectid cannot be sent as header + ##uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid + ## `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| + file = Tempfile.new("ot-rdfxml") + file.puts OpenTox::RestClientWrapper.get @uri,{:subjectid => subjectid,:accept => "application/rdf+xml"} + file.close + file = "file://"+file.path statements = [] parameter_ids = [] - `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| + `rapper -i rdfxml -o ntriples #{file} 2>/dev/null`.each_line do |line| triple = line.to_triple @metadata[triple[1]] = triple[2].split('^^').first if triple[0] == @uri and triple[1] != RDF['type'] statements << triple @@ -55,6 +63,38 @@ module OpenTox end @metadata end + + # loads metadata from rdf-data + # @param [String] rdf + # @param [String] type of the info (e.g. OT.Task, OT.ErrorReport) needed to get the subject-uri + # @return [Hash] metadata + def self.metadata_from_rdf( rdf, type ) + # write to file and read convert with rapper into tripples + file = Tempfile.new("ot-rdfxml") + file.puts rdf + file.close + file = "file://"+file.path + #puts "cmd: rapper -i rdfxml -o ntriples #{file} 2>/dev/null" + triples = `rapper -i rdfxml -o ntriples #{file} 2>/dev/null` + + # load uri via type + uri = nil + triples.each_line do |line| + triple = line.to_triple + if triple[1] == RDF['type'] and triple[2]==type + raise "uri already set, two uris found with type: "+type.to_s if uri + uri = triple[0] + end + end + + # load metadata + metadata = {} + triples.each_line do |line| + triple = line.to_triple + metadata[triple[1]] = triple[2].split('^^').first if triple[0] == uri and triple[1] != RDF['type'] + end + metadata + end # Generic parser for all OpenTox classes class Generic diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 7c2d719..658f111 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -14,21 +14,21 @@ module OpenTox # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @param [wait,Boolean] wait set to false to NOT wait for task if result is task # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.get(uri, headers=nil, waiting_task=nil, wait=true ) - execute( "get", uri, headers, nil, waiting_task, wait) + def self.get(uri, headers={}, waiting_task=nil, wait=true ) + execute( "get", uri, nil, headers, waiting_task, wait) end # performs a POST REST call # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) # per default: waits for Task to finish and returns result URI of Task # @param [String] uri destination URI - # @param [optional,Hash] headers contains params like accept-header # @param [optional,String] payload data posted to the service + # @param [optional,Hash] headers contains params like accept-header # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @param [wait,Boolean] wait set to false to NOT wait for task if result is task # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.post(uri, headers, payload=nil, waiting_task=nil, wait=true ) - execute( "post", uri, headers, payload, waiting_task, wait ) + def self.post(uri, payload=nil, headers={}, waiting_task=nil, wait=true ) + execute( "post", uri, payload, headers, waiting_task, wait ) end # performs a PUT REST call @@ -37,8 +37,8 @@ module OpenTox # @param [optional,Hash] headers contains params like accept-header # @param [optional,String] payload data put to the service # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.put(uri, headers, payload=nil ) - execute( "put", uri, headers, payload ) + def self.put(uri, payload=nil, headers={} ) + execute( "put", uri, payload, headers ) end # performs a DELETE REST call @@ -47,36 +47,42 @@ module OpenTox # @param [optional,Hash] headers contains params like accept-header # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call def self.delete(uri, headers=nil ) - execute( "delete", uri, headers, nil) + execute( "delete", uri, nil, headers) end private - def self.execute( rest_call, uri, headers, payload=nil, waiting_task=nil, wait=true ) + def self.execute( rest_call, uri, payload=nil, headers={}, waiting_task=nil, wait=true ) raise OpenTox::BadRequestError.new "uri is null" unless uri raise OpenTox::BadRequestError.new "not a uri: "+uri.to_s unless uri.to_s.uri? - raise OpenTox::BadRequestError.new "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) - raise OpenTox::BadRequestError.new "nil headers for post not allowed, use {}" if rest_call=="post" and headers==nil + raise "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) + raise OpenTox::BadRequestError.new "accept should go into the headers" if payload and payload.is_a?(Hash) and payload[:accept] + raise OpenTox::BadRequestError.new "content_type should go into the headers" if payload and payload.is_a?(Hash) and payload[:content_type] + raise "__waiting_task__ must be 'nil' or '(sub)task', is "+waiting_task.class.to_s if + waiting_task!=nil and !(waiting_task.is_a?(Task) || waiting_task.is_a?(SubTask)) headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems + # PENDING needed for NUTA, until we finally agree on how to send subjectid + headers[:subjectid] = payload.delete(:subjectid) if uri=~/ntua/ and payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) + begin #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect+" "+payload.inspect - resource = RestClient::Resource.new(uri,{:timeout => 60}) - if payload + resource = RestClient::Resource.new(uri,{:timeout => 60}) + if rest_call=="post" || rest_call=="put" result = resource.send(rest_call, payload, headers) - elsif headers - result = resource.send(rest_call, headers) else - result = resource.send(rest_call) + result = resource.send(rest_call, headers) end + # PENDING NTUA does return errors with 200 + raise RestClient::ExceptionWithResponse.new(result) if uri=~/ntua/ and result.body =~ /about.*http:\/\/anonymous.org\/error/ + # result is a string, with the additional fields content_type and code res = WrapperResult.new(result.body) res.content_type = result.headers[:content_type] raise "content-type not set" unless res.content_type res.code = result.code - #LOGGER.debug "RestCall result: "+res.to_s+" "+res.code.to_s+" "+res.content_type.to_s # TODO: Ambit returns task representation with 200 instead of result URI return res if res.code==200 || !wait @@ -87,10 +93,10 @@ module OpenTox return res rescue RestClient::RequestTimeout => ex - received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers} + received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} rescue RestClient::ExceptionWithResponse => ex # error comming from a different webservice, - received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers} + received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers, :payload => payload} rescue OpenTox::RestCallError => ex # already a rest-error, probably comes from wait_for_task, just pass through raise ex diff --git a/lib/task.rb b/lib/task.rb index 74940de..1a684df 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -33,7 +33,7 @@ module OpenTox def self.create( title=nil, creator=nil, max_duration=DEFAULT_TASK_MAX_DURATION, description=nil ) params = {:title=>title, :creator=>creator, :max_duration=>max_duration, :description=>description } - task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, nil, false).to_s + task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, {}, nil, false).to_s task = Task.new(task_uri.chomp) # measure current memory consumption @@ -64,9 +64,8 @@ module OpenTox task.completed(result) rescue => error LOGGER.error "task failed: "+error.class.to_s+": "+error.message - # log backtrace only if code is 500 -> unwanted (Runtime)Exceptions and internal errors (see error.rb) - LOGGER.error ":\n"+error.backtrace.join("\n") if error.http_code==500 - task.error(OpenTox::ErrorReport.new(error, creator)) + LOGGER.error ":\n"+error.backtrace.join("\n") + task.error(OpenTox::ErrorReport.create(error, creator)) end end task.pid = task_pid @@ -81,9 +80,20 @@ module OpenTox return nil unless uri task = Task.new(uri) task.load_metadata + raise "could not load task metadata" if task.metadata==nil or task.metadata.size==0 task end + # Find a task for querying, status changes + # @param [String] uri Task URI + # @return [OpenTox::Task] Task object + def self.exist?(uri) + begin + return find(uri) + rescue + end + end + # Get a list of all tasks # @param [optional, String] uri URI of task service # @return [text/uri-list] Task URIs @@ -188,7 +198,7 @@ module OpenTox # create is private now, use OpenTox::Task.as_task #def self.create( params ) - #task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, nil, false).to_s + #task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, {}, false).to_s #Task.find(task_uri.chomp) #end @@ -304,7 +314,7 @@ module OpenTox class SubTask def initialize(task, min, max) - raise "not a task or subtask" unless task.is_a?(Task) or task.is_a?(SubTask) + raise "not a task or subtask" if task!=nil and !(task.is_a?(Task) or task.is_a?(SubTask)) raise "invalid max ("+max.to_s+"), min ("+min.to_s+") params" unless min.is_a?(Numeric) and max.is_a?(Numeric) and min >= 0 and max <= 100 and max > min @task = task diff --git a/lib/validation.rb b/lib/validation.rb index 23b246b..2ea19a9 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -1,70 +1,196 @@ module OpenTox - class Validation + class Validation include OpenTox - - attr_accessor :report_uri, :qmrf_report_uri - - def self.create_crossvalidation(params) - params[:uri] = File.join(CONFIG[:services]['opentox-validation'], "crossvalidation") - params[:num_folds] = 10 unless params[:num_folds] - params[:random_seed] = 2 unless params[:random_seed] - params[:stratified] = false unless params[:stratified] - uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/crossvalidation"),params,nil,false) - OpenTox::Validation.new(uri) - end - - def create_report(subjectid=nil) - @report_uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/crossvalidation"), {:validation_uris => @uri, :subjectid => subjectid}).to_s - @report_uri + + # find validation, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::Validation] + def self.find( uri, subjectid=nil ) + val = Validation.new(uri) + val.load_metadata( subjectid ) + val end - - def create_qmrf_report(subjectid=nil) - @qmrf_report_uri = OpenTox::RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/reach_report/qmrf"), {:model_uri => @uri, :subjectid => subjectid}).to_s - @qmrf_report_uri + + # creates a validation object from crossvaldiation statistics, raise error if not found + # (as crossvaldiation statistics are returned as an average valdidation over all folds) + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @return [OpenTox::Validation] + def self.from_cv_statistics( crossvalidation_uri, subjectid=nil ) + find( File.join(crossvalidation_uri, 'statistics'),subjectid ) end - - def summary(type, subjectid=nil) - v = YAML.load OpenTox::RestClientWrapper.get(File.join(@uri, 'statistics'),{:accept => "application/x-yaml", :subjectid => subjectid}).to_s - - case type - when "classification" - tp=0; tn=0; fp=0; fn=0; n=0 - v[:classification_statistics][:confusion_matrix][:confusion_matrix_cell].each do |cell| - if cell[:confusion_matrix_predicted] == "true" and cell[:confusion_matrix_actual] == "true" - tp = cell[:confusion_matrix_value] - n += tp - elsif cell[:confusion_matrix_predicted] == "false" and cell[:confusion_matrix_actual] == "false" - tn = cell[:confusion_matrix_value] - n += tn - elsif cell[:confusion_matrix_predicted] == "false" and cell[:confusion_matrix_actual] == "true" - fn = cell[:confusion_matrix_value] - n += fn - elsif cell[:confusion_matrix_predicted] == "true" and cell[:confusion_matrix_actual] == "false" - fp = cell[:confusion_matrix_value] - n += fp + + # loads metadata via yaml from validation object + # fields (like for example the validated model) can be acces via validation.metadata[OT.model] + def load_metadata( subjectid=nil ) + @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid, :accept => "application/x-yaml"})) + end + + # PENDING: creates summary as used for ToxCreate + def summary + if @metadata[OT.classificationStatistics] + res = { + :nr_predictions => @metadata[OT.numInstances] - @metadata[OT.numUnpredicted], + :correct_predictions => @metadata[OT.classificationStatistics][OT.percentCorrect], + :weighted_area_under_roc => @metadata[OT.classificationStatistics][OT.weightedAreaUnderRoc], + } + @metadata[OT.classificationStatistics][OT.classValueStatistics].each do |s| + if s[OT.classValue].to_s=="true" + res[:true_positives] = s[OT.numTruePositives] + res[:false_positives] = s[OT.numFalsePositives] + res[:true_negatives] = s[OT.numTrueNegatives] + res[:false_negatives] = s[OT.numFalseNegatives] + res[:sensitivity] = s[OT.truePositiveRate] + res[:specificity] = s[OT.falsePositiveRate] + break end end + res + elsif @metadata[OT.regressionStatistics] { - :nr_predictions => n, - :true_positives => tp, - :false_positives => fp, - :true_negatives => tn, - :false_negatives => fn, - :correct_predictions => 100*(tp+tn).to_f/n, - :weighted_area_under_roc => v[:classification_statistics][:weighted_area_under_roc].to_f, - :sensitivity => tp.to_f/(tp+fn), - :specificity => tn.to_f/(tn+fp), - } - when "regression" - { - :nr_predictions => v[:num_instances] - v[:num_unpredicted], - :r_square => v[:regression_statistics][:r_square], - :root_mean_squared_error => v[:regression_statistics][:root_mean_squared_error], - :mean_absolute_error => v[:regression_statistics][:mean_absolute_error], + :nr_predictions => @metadata[OT.numInstances] - @metadata[OT.numUnpredicted], + :r_square => @metadata[OT.regressionStatistics][OT.rSquare], + :root_mean_squared_error => @metadata[OT.regressionStatistics][OT.rootMeanSquaredError], + :mean_absolute_error => @metadata[OT.regressionStatistics][OT.meanAbsoluteError], } end end + end + + class Crossvalidation + include OpenTox + + attr_reader :report + + # find crossvalidation, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::Crossvalidation] + def self.find( uri, subjectid=nil ) + cv = Crossvalidation.new(uri) + cv.load_metadata( subjectid ) + cv + end + + # creates a crossvalidations, waits until it finishes, may take some time + # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,num_folds(10),random_seed(1),stratified(false)) + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::Crossvalidation] + def self.create( params, subjectid=nil, waiting_task=nil ) + params[:subjectid] = subjectid if subjectid + uri = OpenTox::RestClientWrapper.post( File.join(CONFIG[:services]["opentox-validation"],"crossvalidation"), + params,{:content_type => "text/uri-list"},waiting_task ) + Crossvalidation.new(uri) + end - end + # looks for report for this crossvalidation, creates a report if no report is found + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::CrossvalidationReport] + def find_or_create_report( subjectid=nil, waiting_task=nil ) + @report = CrossvalidationReport.find_for_crossvalidation(@uri, subjectid) unless @report + @report = CrossvalidationReport.create(@uri, subjectid, waiting_task) unless @report + @report.uri + end + + # loads metadata via yaml from crossvalidation object + # fields (like for example the validations) can be acces via validation.metadata[OT.validation] + def load_metadata( subjectid=nil ) + @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid, :accept => "application/x-yaml"})) + end + + # PENDING: creates summary as used for ToxCreate + def summary( subjectid=nil ) + Validation.from_cv_statistics( @uri, subjectid ).summary + end + end + + class ValidationReport + include OpenTox + + # finds ValidationReport for a particular validation + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @return [OpenTox::ValidationReport] nil if no report found + def self.find_for_validation( validation_uri, subjectid=nil ) + uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], + "/report/validation?validation="+validation_uri), {:subjectid => subjectid}).chomp.split("\n") + uris.size==0 ? nil : ValidationReport.new(uris[-1]) + end + + end + + class CrossvalidationReport + include OpenTox + + # finds CrossvalidationReport via uri, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::CrossvalidationReport] + def self.find( uri, subjectid=nil ) + # PENDING load report data? + OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) + CrossvalidationReport.new(uri) + end + + # finds CrossvalidationReport for a particular crossvalidation + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @return [OpenTox::CrossvalidationReport] nil if no report found + def self.find_for_crossvalidation( crossvalidation_uri, subjectid=nil ) + uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], + "/report/crossvalidation?crossvalidation="+crossvalidation_uri), {:subjectid => subjectid}).chomp.split("\n") + uris.size==0 ? nil : CrossvalidationReport.new(uris[-1]) + end + + # creates a crossvalidation report via crossvalidation + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::CrossvalidationReport] + def self.create( crossvalidation_uri, subjectid=nil, waiting_task=nil ) + uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/crossvalidation"), + { :validation_uris => crossvalidation_uri, :subjectid => subjectid }, {}, waiting_task ) + CrossvalidationReport.new(uri) + end + end + + class QMRFReport + include OpenTox + + # finds QMRFReport, raises Error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::QMRFReport] + def self.find( uri, subjectid=nil ) + # PENDING load crossvalidation data? + OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) + QMRFReport.new(uri) + end + + # finds QMRF report for a particular model + # @param [String] model_uri + # @param [String,optional] subjectid + # @return [OpenTox::QMRFReport] nil if no report found + def self.find_for_model( model_uri, subjectid=nil ) + uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], + "/reach_report/qmrf?model="+model_uri), {:subjectid => subjectid}).chomp.split("\n") + uris.size==0 ? nil : QMRFReport.new(uris[-1]) + end + + # creates a qmrf report via model + # @param [String] model_uri + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::QMRFReport] + def self.create( model_uri, subjectid=nil, waiting_task=nil ) + uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/reach_report/qmrf"), + { :model_uri => model_uri, :subjectid => subjectid }, {}, waiting_task ) + QMRFReport.new(uri) + end + end + end -- cgit v1.2.3 From f907690dc7d3f82c75a51718a3abfa7750dedaa5 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 8 Feb 2011 16:58:32 +0100 Subject: set waiting_for in task --- lib/task.rb | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/task.rb b/lib/task.rb index ca18d7b..742afb4 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -139,7 +139,7 @@ module OpenTox end def cancel - RestClientWrapper.put(File.join(@uri,'Cancelled')) + RestClientWrapper.put(File.join(@uri,'Cancelled'),{:cannot_be => "empty"}) load_metadata end @@ -237,6 +237,7 @@ module OpenTox # @param [optional,Numeric] dur seconds pausing before cheking again for completion def wait_for_completion( waiting_task=nil, dur=0.3) + waiting_task.waiting_for(self.uri) if waiting_task due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION LOGGER.debug "start waiting for task "+@uri.to_s+" at: "+Time.new.to_s+", waiting at least until "+due_to_time.to_s @@ -252,7 +253,7 @@ module OpenTox raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" end end - + waiting_task.waiting_for(nil) if waiting_task LOGGER.debug "Task '"+@metadata[OT.hasStatus].to_s+"': "+@uri.to_s+", Result: "+@metadata[OT.resultURI].to_s end @@ -268,6 +269,10 @@ module OpenTox end end + def waiting_for(task_uri) + RestClientWrapper.put(File.join(@uri,'Running'),{:waiting_for => task_uri}) + end + private def check_state begin @@ -321,6 +326,10 @@ module OpenTox end end + def waiting_for(task_uri) + @task.waiting_for(task_uri) + end + def progress(pct) raise "no numeric >= 0 and <= 100 : '"+pct.to_s+"'" unless pct.is_a?(Numeric) and pct>=0 and pct<=100 #puts "subtask := "+pct.to_s+" -> task := "+(@min + @delta * pct.to_f * 0.01).to_s -- cgit v1.2.3 From 9a523f0fb2d5ee0058af5b5b82e01f39549f68fb Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 9 Feb 2011 14:06:12 +0100 Subject: fix rdf parsing to work with ambit dataset service with a&a, minor changes --- lib/error.rb | 2 +- lib/model.rb | 9 +++++---- lib/parser.rb | 41 +++++++++++++++++++++++++++-------------- lib/rest_client_wrapper.rb | 13 ++++++++----- lib/task.rb | 26 +++++++++----------------- 5 files changed, 50 insertions(+), 41 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 49756d5..7ca9767 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -55,7 +55,7 @@ module OpenTox end def self.from_rdf(rdf) - metadata = OpenTox::Parser::Owl.metadata_from_rdf( rdf, OT.ErrorReport ) + metadata = OpenTox::Parser::Owl.from_rdf( rdf, OT.ErrorReport ).metadata ErrorReport.new(metadata[OT.statusCode], metadata[OT.errorCode], metadata[OT.message], metadata[OT.actor], metadata[OT.errorCause]) end diff --git a/lib/model.rb b/lib/model.rb index 64d178f..9622d65 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -43,9 +43,11 @@ module OpenTox @algorithm = OpenTox::Algorithm::Generic.find(@metadata[OT.algorithm], subjectid) unless @algorithm algorithm_title = @algorithm ? @algorithm.metadata[DC.title] : nil + algorithm_type = @algorithm ? @algorithm.metadata[OT.isA] : nil @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables],subjectid ) unless @dependentVariable - - [@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], @uri, algorithm_title].each do |type| + type_indicators = [@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], + @uri, algorithm_type, algorithm_title] + type_indicators.each do |type| case type when /(?i)classification/ return "classification" @@ -53,8 +55,7 @@ module OpenTox return "regression" end end - raise "unknown model "+[@dependentVariable.feature_type, @metadata[OT.isA], - @metadata[DC.title], @uri, algorithm_title].inspect + raise "unknown model "+type_indicators.inspect end end diff --git a/lib/parser.rb b/lib/parser.rb index 27dfeee..2f59d15 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -41,17 +41,17 @@ module OpenTox ##uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid ## `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| file = Tempfile.new("ot-rdfxml") - file.puts OpenTox::RestClientWrapper.get @uri,{:subjectid => subjectid,:accept => "application/rdf+xml"} + file.puts OpenTox::RestClientWrapper.get @uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false file.close - file = "file://"+file.path statements = [] parameter_ids = [] - `rapper -i rdfxml -o ntriples #{file} 2>/dev/null`.each_line do |line| + `rapper -i rdfxml -o ntriples file://#{file.path} 2>/dev/null`.each_line do |line| triple = line.to_triple @metadata[triple[1]] = triple[2].split('^^').first if triple[0] == @uri and triple[1] != RDF['type'] statements << triple parameter_ids << triple[2] if triple[1] == OT.parameters end + File.delete(file.path) unless parameter_ids.empty? @metadata[OT.parameters] = [] parameter_ids.each do |p| @@ -63,18 +63,17 @@ module OpenTox @metadata end - # loads metadata from rdf-data + # creates owl object from rdf-data # @param [String] rdf # @param [String] type of the info (e.g. OT.Task, OT.ErrorReport) needed to get the subject-uri - # @return [Hash] metadata - def self.metadata_from_rdf( rdf, type ) + # @return [Owl] with uri and metadata set + def self.from_rdf( rdf, type ) # write to file and read convert with rapper into tripples file = Tempfile.new("ot-rdfxml") file.puts rdf file.close - file = "file://"+file.path #puts "cmd: rapper -i rdfxml -o ntriples #{file} 2>/dev/null" - triples = `rapper -i rdfxml -o ntriples #{file} 2>/dev/null` + triples = `rapper -i rdfxml -o ntriples file://#{file.path} 2>/dev/null` # load uri via type uri = nil @@ -85,19 +84,23 @@ module OpenTox uri = triple[0] end end - + File.delete(file) # load metadata metadata = {} triples.each_line do |line| triple = line.to_triple metadata[triple[1]] = triple[2].split('^^').first if triple[0] == uri and triple[1] != RDF['type'] end - metadata + owl = Owl::Generic.new(uri) + owl.metadata = metadata + owl end - + # Generic parser for all OpenTox classes class Generic include Owl + + attr_accessor :uri, :metadata end # OWL-DL parser for datasets @@ -128,12 +131,21 @@ module OpenTox # @return [Hash] Internal dataset representation def load_uri(subjectid=nil) uri = @uri - uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid + + # avoid using rapper directly because of 2 reasons: + # * http errors wont be noticed + # * subjectid cannot be sent as header + ##uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid + ##`rapper -i rdfxml -o ntriples #{file} 2>/dev/null`.each_line do |line| + file = Tempfile.new("ot-rdfxml") + file.puts OpenTox::RestClientWrapper.get @uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false + file.close + data = {} feature_values = {} feature = {} other_statements = {} - `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| + `rapper -i rdfxml -o ntriples file://#{file.path} 2>/dev/null`.each_line do |line| triple = line.chomp.split(' ',3) triple = triple[0..2].collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} case triple[1] @@ -150,6 +162,7 @@ module OpenTox else end end + File.delete(file.path) data.each do |id,entry| entry[:values].each do |value_id| value = feature_values[value_id].split(/\^\^/).first # remove XSD.type @@ -157,7 +170,7 @@ module OpenTox end end load_features - @dataset.metadata = load_metadata + @dataset.metadata = load_metadata(subjectid) @dataset end diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 658f111..fcc0d08 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -61,9 +61,8 @@ module OpenTox raise "__waiting_task__ must be 'nil' or '(sub)task', is "+waiting_task.class.to_s if waiting_task!=nil and !(waiting_task.is_a?(Task) || waiting_task.is_a?(SubTask)) headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems - - # PENDING needed for NUTA, until we finally agree on how to send subjectid - headers[:subjectid] = payload.delete(:subjectid) if uri=~/ntua/ and payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) + ## PENDING partner services accept subjectid only in header + headers[:subjectid] = payload.delete(:subjectid) if payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) begin #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect+" "+payload.inspect @@ -94,6 +93,8 @@ module OpenTox rescue RestClient::RequestTimeout => ex received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue Errno::ECONNREFUSED => ex + received_error ex.message, 500, nil, {:rest_uri => uri, :headers => headers, :payload => payload} rescue RestClient::ExceptionWithResponse => ex # error comming from a different webservice, received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers, :payload => payload} @@ -107,7 +108,9 @@ module OpenTox end def self.wait_for_task( res, base_uri, waiting_task=nil ) - + #TODO remove TUM hack + content_type = "text/uri-list" if base_uri =~/tu-muenchen/ and res.content_type == "application/x-www-form-urlencoded;charset=UTF-8" +s task = nil case res.content_type when /application\/rdf\+xml/ @@ -118,7 +121,7 @@ module OpenTox raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task task = OpenTox::Task.find(res.to_s.chomp) if res.to_s.uri? else - raise "unknown content-type for task: '"+res.content_type.to_s+"'" #+"' content: "+res[0..200].to_s + raise "unknown content-type for task : '"+res.content_type.to_s+"'"+" content: "+res[0..200].to_s end LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" diff --git a/lib/task.rb b/lib/task.rb index 742afb4..27dc1c2 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -94,23 +94,11 @@ module OpenTox def self.from_yaml(yaml) @metadata = YAML.load(yaml) end - def self.from_rdfxml(rdfxml) - file = Tempfile.new("ot-rdfxml") - file.puts rdfxml - file.close - file = "file://"+file.path - - # PENDING - raise "Parse from file not working: what is the base-object-uri??? (omitted in triples)" - - parser = Parser::Owl::Generic.new file - metadata = parser.load_metadata - puts metadata.inspect - - task = Task.new(uri) - task.add_metadata(metadata) + owl = OpenTox::Parser::Owl.from_rdf(rdfxml, OT.Task) + task = Task.new(owl.uri) + task.add_metadata(owl.metadata) task end @@ -176,7 +164,7 @@ module OpenTox end def load_metadata - if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) + if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) result = RestClientWrapper.get(@uri, {:accept => 'application/x-yaml'}, nil, false) @metadata = YAML.load result.to_s @http_code = result.code @@ -184,6 +172,7 @@ module OpenTox @metadata = Parser::Owl::Generic.new(@uri).load_metadata @http_code = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, nil, false).code end + raise "could not load task metadata for task "+@uri.to_s if @metadata==nil || @metadata.size==0 end # create is private now, use OpenTox::Task.as_task @@ -274,11 +263,14 @@ module OpenTox end private + VALID_TASK_STATES = ["Cancelled", "Completed", "Running", "Error"] + def check_state begin + raise "illegal task state, invalid status: '"+@metadata[OT.hasStatus].to_s+"'" unless + @metadata[OT.hasStatus] unless VALID_TASK_STATES.include?(@metadata[OT.hasStatus]) raise "illegal task state, task is completed, resultURI is no URI: '"+@metadata[OT.resultURI].to_s+ "'" unless @metadata[OT.resultURI] and @metadata[OT.resultURI].to_s.uri? if completed? - if @http_code == 202 raise "#{@uri}: illegal task state, code is 202, but hasStatus is not Running: '"+@metadata[OT.hasStatus]+"'" unless running? elsif @http_code == 201 -- cgit v1.2.3 From d83015ff26c43ecbb06553403589b35388b3e3e9 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 9 Feb 2011 14:11:41 +0100 Subject: remove letter --- lib/rest_client_wrapper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index fcc0d08..d0e6727 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -110,7 +110,7 @@ module OpenTox def self.wait_for_task( res, base_uri, waiting_task=nil ) #TODO remove TUM hack content_type = "text/uri-list" if base_uri =~/tu-muenchen/ and res.content_type == "application/x-www-form-urlencoded;charset=UTF-8" -s + task = nil case res.content_type when /application\/rdf\+xml/ -- cgit v1.2.3 From e8b8f16cffc0401f4f51c7b5c68198dbe2b89ad2 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 9 Feb 2011 14:43:39 +0100 Subject: fix tum hack --- lib/rest_client_wrapper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index d0e6727..626f94f 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -109,7 +109,7 @@ module OpenTox def self.wait_for_task( res, base_uri, waiting_task=nil ) #TODO remove TUM hack - content_type = "text/uri-list" if base_uri =~/tu-muenchen/ and res.content_type == "application/x-www-form-urlencoded;charset=UTF-8" + res.content_type = "text/uri-list" if base_uri =~/tu-muenchen/ and res.content_type == "application/x-www-form-urlencoded;charset=UTF-8" task = nil case res.content_type @@ -121,7 +121,7 @@ module OpenTox raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task task = OpenTox::Task.find(res.to_s.chomp) if res.to_s.uri? else - raise "unknown content-type for task : '"+res.content_type.to_s+"'"+" content: "+res[0..200].to_s + raise "unknown content-type for task : '"+res.content_type.to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+res[0..200].to_s end LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" -- cgit v1.2.3 From 4109a5256e953a9962a6e46acb074b2d7d8d2bd9 Mon Sep 17 00:00:00 2001 From: mr Date: Wed, 9 Feb 2011 15:53:46 +0100 Subject: minor fix --- lib/authorization.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 16f1ee4..b647bca 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -58,7 +58,7 @@ module OpenTox # @param [String, String]Username,Password # @return [String, nil] gives subjectid or nil def self.authenticate(user, pw) - return true if !AA_SERVER + return nil if !AA_SERVER begin resource = RestClient::Resource.new("#{AA_SERVER}/auth/authenticate") out = resource.post(:username=>user, :password => pw).sub("token.id=","").sub("\n","") -- cgit v1.2.3 From 87fa8c2c74484d85da3f581929a603f31ecc92d0 Mon Sep 17 00:00:00 2001 From: mr Date: Wed, 9 Feb 2011 17:12:51 +0100 Subject: task with subtask from mguetlein --- lib/task.rb | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/lib/task.rb b/lib/task.rb index 1a684df..7aa3dd5 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -107,20 +107,9 @@ module OpenTox def self.from_rdfxml(rdfxml) - file = Tempfile.new("ot-rdfxml") - file.puts rdfxml - file.close - file = "file://"+file.path - - # PENDING - raise "Parse from file not working: what is the base-object-uri??? (omitted in triples)" - - parser = Parser::Owl::Generic.new file - metadata = parser.load_metadata - puts metadata.inspect - - task = Task.new(uri) - task.add_metadata(metadata) + owl = OpenTox::Parser::Owl.from_rdf(rdfxml, OT.Task) + task = Task.new(owl.uri) + task.add_metadata(owl.metadata) task end @@ -149,7 +138,7 @@ module OpenTox end def cancel - RestClientWrapper.put(File.join(@uri,'Cancelled')) + RestClientWrapper.put(File.join(@uri,'Cancelled'),{:cannot_be => "empty"}) load_metadata end @@ -247,6 +236,7 @@ module OpenTox # @param [optional,Numeric] dur seconds pausing before cheking again for completion def wait_for_completion( waiting_task=nil, dur=0.3) + waiting_task.waiting_for(self.uri) if waiting_task due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION LOGGER.debug "start waiting for task "+@uri.to_s+" at: "+Time.new.to_s+", waiting at least until "+due_to_time.to_s @@ -262,7 +252,7 @@ module OpenTox raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" end end - + waiting_task.waiting_for(nil) if waiting_task LOGGER.debug "Task '"+@metadata[OT.hasStatus].to_s+"': "+@uri.to_s+", Result: "+@metadata[OT.resultURI].to_s end @@ -278,6 +268,10 @@ module OpenTox end end + def waiting_for(task_uri) + RestClientWrapper.put(File.join(@uri,'Running'),{:waiting_for => task_uri}) + end + private def check_state begin @@ -332,6 +326,10 @@ module OpenTox end end + def waiting_for(task_uri) + @task.waiting_for(task_uri) + end + def progress(pct) raise "no numeric >= 0 and <= 100 : '"+pct.to_s+"'" unless pct.is_a?(Numeric) and pct>=0 and pct<=100 #puts "subtask := "+pct.to_s+" -> task := "+(@min + @delta * pct.to_f * 0.01).to_s -- cgit v1.2.3 From 766d0eccb1a5d9f3016d9d85469dc68641b779ff Mon Sep 17 00:00:00 2001 From: mr Date: Thu, 10 Feb 2011 08:51:15 +0100 Subject: config.yaml with new settings for A&A --- lib/templates/config.yaml | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml index 116f462..8a5e460 100644 --- a/lib/templates/config.yaml +++ b/lib/templates/config.yaml @@ -39,16 +39,48 @@ # Uncomment for verbose logging # :logger: debug - +# :backtrace: 1 + + # OpenSSO Authorization # set ":server: " to disable A&A :authorization: :server: "https://opensso.in-silico.ch" - :free_request: #not controlled by A&A - - "GET" + :free_request: #request-method not controlled by A&A + - "GET" :authenticate_request: #only for authenticated user - "POST" :authorize_request: #only for authenticated and authorizeduser - "DELETE" - "PUT" + # Exceptions: + :free_uris: #request-method for uri not controlled by A&A + ? - :GET + : - !ruby/regexp /localhost\/algorithm/ + - "http://localhost/dataset" + - "http://localhost/model" + - "http://localhost/validation" + - "http://localhost/validation/crossvalidation" + - "http://localhost/validation/reach_report" + - "http://localhost/validation/reach_report/crossvalidation" + - "http://localhost/validation/report" + - "http://localhost/validation/report/crossvalidation" + - "http://localhost/validation/reach_report/qmrf" + ? - :GET + - :POST + : - !ruby/regexp /localhost\/toxcreate/ + - !ruby/regexp /localhost\/task/ + - !ruby/regexp /localhost\/compound/ + ? - :PUT + : - !ruby/regexp /localhost\/task/ + + :authorize_exceptions: #request-method for uri only authenticated, no authorization + ? - :POST + : - !ruby/regexp /localhost\/algorithm/ + - "http://localhost/dataset" + - "http://localhost/model" + - "http://localhost/validation" + - !ruby/regexp /localhost\/validation\/[a-z,A-Z,\/,_\-]*$/ + + \ No newline at end of file -- cgit v1.2.3 From 03795f02e06b3a9c635abf92c112a9dec142364b Mon Sep 17 00:00:00 2001 From: mr Date: Thu, 10 Feb 2011 09:20:20 +0100 Subject: A&A fixes --- lib/helper.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/helper.rb b/lib/helper.rb index 6ca3901..415ca11 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -9,7 +9,7 @@ helpers do end elsif !env["session"] && subjectid unless authorized?(subjectid) - LOGGER.debug "URI not authorized: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']} with request: #{request.env['REQUEST_METHOD']}" + LOGGER.debug "URI not authorized: clean: " + clean_uri("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}").to_s + " full: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']} with request: #{request.env['REQUEST_METHOD']}" raise OpenTox::NotAuthorizedError.new "Not authorized" end else @@ -28,9 +28,11 @@ helpers do #cleans URI from querystring and file-extension. Sets port 80 to emptystring # @param [String] uri def clean_uri(uri) - uri = uri.sub(" ", "%20") + uri = uri.sub(" ", "%20") #dirty hacks => to fix + uri = uri[0,uri.index("InChI=")] + out = URI.parse(uri) - out.path = out.path[0, out.path.index(/[0-9]/)] if out.path.index(/[0-9]/) #cuts after id for a&a + out.path = out.path[0, out.path.length - (out.path.reverse.rindex(/\/{1}\d+\/{1}/))] if out.path.index(/\/{1}\d+\/{1}/) #cuts after /id/ for a&a "#{out.scheme}:" + (out.port != 80 ? out.port : "") + "//#{out.host}#{out.path.chomp('/')}" end -- cgit v1.2.3 From 65f6d64e57c81ae7b6dd72209fbeffee2d60da71 Mon Sep 17 00:00:00 2001 From: mr Date: Thu, 10 Feb 2011 09:22:13 +0100 Subject: A&A fixes --- lib/helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/helper.rb b/lib/helper.rb index 415ca11..5a2436f 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -29,7 +29,7 @@ helpers do # @param [String] uri def clean_uri(uri) uri = uri.sub(" ", "%20") #dirty hacks => to fix - uri = uri[0,uri.index("InChI=")] + uri = uri[0,uri.index("InChI=")] if uri.index("InChI=") out = URI.parse(uri) out.path = out.path[0, out.path.length - (out.path.reverse.rindex(/\/{1}\d+\/{1}/))] if out.path.index(/\/{1}\d+\/{1}/) #cuts after /id/ for a&a -- cgit v1.2.3 From 1f6625cffbb49ec93f6b4647ca1d11d01c5d11ea Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 10 Feb 2011 15:25:48 +0100 Subject: A&A hack for report svgs --- lib/helper.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/helper.rb b/lib/helper.rb index 5a2436f..191b932 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -19,6 +19,8 @@ helpers do #Check Authorization for URI with method and subjectid. def authorized?(subjectid) + # hack for reports, address problem as soon as subjectid is not longer allowed as param + return true if request.env['REQUEST_URI'] =~ /validation\/report\/.*svg$/ request_method = request.env['REQUEST_METHOD'] uri = clean_uri("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}") request_method = "GET" if request_method == "POST" && uri =~ /\/model\/\d+\/?$/ -- cgit v1.2.3 From 616bb4b7aefed40cda0e09c88dc35ce1a82f8106 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 10 Feb 2011 15:49:04 +0100 Subject: small fixes --- lib/parser.rb | 2 +- lib/rest_client_wrapper.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/parser.rb b/lib/parser.rb index 2f59d15..a2a96be 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -84,7 +84,7 @@ module OpenTox uri = triple[0] end end - File.delete(file) + File.delete(file.path) # load metadata metadata = {} triples.each_line do |line| diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 7a6ed2a..d3136c7 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -62,6 +62,7 @@ module OpenTox waiting_task!=nil and !(waiting_task.is_a?(Task) || waiting_task.is_a?(SubTask)) headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems ## PENDING partner services accept subjectid only in header + headers = {} unless headers headers[:subjectid] = payload.delete(:subjectid) if payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) # PENDING needed for NUTA, until we finally agree on how to send subjectid -- cgit v1.2.3 From 85096197c1618cea45d7a1a8d5e4810ce1166083 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 10 Feb 2011 15:55:30 +0100 Subject: render https as link --- lib/to-html.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/to-html.rb b/lib/to-html.rb index e9764ef..4de5ee6 100755 --- a/lib/to-html.rb +++ b/lib/to-html.rb @@ -7,7 +7,7 @@ class String # encloses URI in text with with link tag # @return [String] new text with marked links def link_urls - self.gsub(/(?i)http:\/\/[^\r\n\s']*/, '\0') + self.gsub(/(?i)http(s?):\/\/[^\r\n\s']*/, '\0') end end -- cgit v1.2.3 From 1e2d28baa88f3a021604787c1356d6be1077be7e Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 10 Feb 2011 17:39:17 +0100 Subject: adjust rdf dataset parsing: take XSD type into account --- lib/parser.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/parser.rb b/lib/parser.rb index a2a96be..c8a573f 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -165,7 +165,13 @@ module OpenTox File.delete(file.path) data.each do |id,entry| entry[:values].each do |value_id| - value = feature_values[value_id].split(/\^\^/).first # remove XSD.type + split = feature_values[value_id].split(/\^\^/) + case split[-1] + when XSD.double + value = split.first.to_f + else + value = split.first + end @dataset.add entry[:compound],feature[value_id],value end end -- cgit v1.2.3 From 3c7e4de0e3f4c9bbf8df55c88f155b40f575b3ab Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 11 Feb 2011 10:51:01 +0100 Subject: fix read from rdf file --- lib/dataset.rb | 7 ++++++- lib/parser.rb | 39 ++++++++++++++++++++++----------------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 02b89cb..a843cea 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -85,7 +85,12 @@ module OpenTox end def load_rdfxml(rdfxml) - load_rdfxml_file Tempfile.open("ot-rdfxml"){|f| f.write(rdfxml)}.path + raise "rdfxml data is empty" if rdfxml.to_s.size==0 + file = Tempfile.new("ot-rdfxml") + file.puts rdfxml + file.close + load_rdfxml_file file + file.delete end # Load RDF/XML representation from a file diff --git a/lib/parser.rb b/lib/parser.rb index c8a573f..f79b5e2 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -30,28 +30,29 @@ module OpenTox # Read metadata from opentox service # @return [Hash] Object metadata def load_metadata(subjectid=nil) - if @dataset - uri = File.join(@uri,"metadata") - else - uri = @uri - end # avoid using rapper directly because of 2 reasons: # * http errors wont be noticed # * subjectid cannot be sent as header ##uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid ## `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| - file = Tempfile.new("ot-rdfxml") - file.puts OpenTox::RestClientWrapper.get @uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false - file.close + if File.exist?(@uri) + file = File.new(@uri) + else + file = Tempfile.new("ot-rdfxml") + uri = @dataset ? File.join(@uri,"metadata") : @uri + file.puts OpenTox::RestClientWrapper.get uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false + file.close + to_delete = file.path + end statements = [] parameter_ids = [] - `rapper -i rdfxml -o ntriples file://#{file.path} 2>/dev/null`.each_line do |line| + `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| triple = line.to_triple @metadata[triple[1]] = triple[2].split('^^').first if triple[0] == @uri and triple[1] != RDF['type'] statements << triple parameter_ids << triple[2] if triple[1] == OT.parameters end - File.delete(file.path) + File.delete(to_delete) if to_delete unless parameter_ids.empty? @metadata[OT.parameters] = [] parameter_ids.each do |p| @@ -73,7 +74,7 @@ module OpenTox file.puts rdf file.close #puts "cmd: rapper -i rdfxml -o ntriples #{file} 2>/dev/null" - triples = `rapper -i rdfxml -o ntriples file://#{file.path} 2>/dev/null` + triples = `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null` # load uri via type uri = nil @@ -130,22 +131,26 @@ module OpenTox # dataset.save # @return [Hash] Internal dataset representation def load_uri(subjectid=nil) - uri = @uri # avoid using rapper directly because of 2 reasons: # * http errors wont be noticed # * subjectid cannot be sent as header ##uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid ##`rapper -i rdfxml -o ntriples #{file} 2>/dev/null`.each_line do |line| - file = Tempfile.new("ot-rdfxml") - file.puts OpenTox::RestClientWrapper.get @uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false - file.close + if File.exist?(@uri) + file = File.new(@uri) + else + file = Tempfile.new("ot-rdfxml") + file.puts OpenTox::RestClientWrapper.get @uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false + file.close + to_delete = file.path + end data = {} feature_values = {} feature = {} other_statements = {} - `rapper -i rdfxml -o ntriples file://#{file.path} 2>/dev/null`.each_line do |line| + `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| triple = line.chomp.split(' ',3) triple = triple[0..2].collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} case triple[1] @@ -162,7 +167,7 @@ module OpenTox else end end - File.delete(file.path) + File.delete(to_delete) if to_delete data.each do |id,entry| entry[:values].each do |value_id| split = feature_values[value_id].split(/\^\^/) -- cgit v1.2.3 From 1898a5353d790a17c3065e4349435642e1b7f701 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 11 Feb 2011 16:34:41 +0100 Subject: adjust parser that dataset = daset.to_rdf.from rdf --- lib/parser.rb | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/parser.rb b/lib/parser.rb index f79b5e2..d2beeac 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -172,8 +172,10 @@ module OpenTox entry[:values].each do |value_id| split = feature_values[value_id].split(/\^\^/) case split[-1] - when XSD.double + when XSD.double, XSD.float value = split.first.to_f + when XSD.boolean + value = split.first=~/(?i)true/ ? true : false else value = split.first end @@ -188,15 +190,23 @@ module OpenTox # Read only features from a dataset service. # @return [Hash] Internal features representation def load_features(subjectid=nil) - uri = File.join(@uri,"features") - uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid + if File.exist?(@uri) + file = File.new(@uri) + else + file = Tempfile.new("ot-rdfxml") + uri = File.join(@uri,"features") + file.puts OpenTox::RestClientWrapper.get uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false + file.close + to_delete = file.path + end statements = [] features = Set.new - `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| + `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| triple = line.chomp.split('> ').collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')}[0..2] statements << triple - features << triple[0] if triple[1] == RDF['type'] and triple[2] == OT.Feature + features << triple[0] if triple[1] == RDF['type'] and (triple[2] == OT.Feature || triple[2] == OT.NumericFeature) end + File.delete(to_delete) if to_delete statements.each do |triple| if features.include? triple[0] @dataset.features[triple[0]] = {} unless @dataset.features[triple[0]] -- cgit v1.2.3 From 7dd4c74bf118285d567b0b221d091511b6a77b2f Mon Sep 17 00:00:00 2001 From: mguetlein Date: Sun, 13 Feb 2011 09:55:38 +0100 Subject: more debug out when authentication fails --- lib/authorization.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 1942e95..eab20df 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -334,15 +334,15 @@ module OpenTox true elsif CONFIG[:authorization][:authenticate_request].include?(request_method) ret = OpenTox::Authorization.is_token_valid(subjectid) - #LOGGER.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + LOGGER.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret elsif OpenTox::Authorization.authorize_exception?(uri, request_method) ret = OpenTox::Authorization.is_token_valid(subjectid) - #LOGGER.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + LOGGER.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret elsif CONFIG[:authorization][:authorize_request].include?(request_method) ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) - LOGGER.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + LOGGER.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret else LOGGER.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" -- cgit v1.2.3 From d4eb231a35c23a5fdb36fd6220b5ab706e7528ba Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 14 Feb 2011 17:48:26 +0100 Subject: read from subjectcookie, fix read feature_type --- lib/feature.rb | 10 ++++++++-- lib/helper.rb | 3 +-- lib/model.rb | 22 +++++++++++++--------- lib/overwrite.rb | 2 +- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/lib/feature.rb b/lib/feature.rb index be063dd..c0729a7 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -16,8 +16,14 @@ module OpenTox # provides domain (possible target values) of classification feature # @return [Array] list with possible target values def domain - #TODO derieve from metadata / ontology - return [true, false] + if metadata[OT.acceptValue] + raise "accept value found, remove hack and implement correctly" + else + if @uri=~/feature\/26221/ || @uri=~/feature\/221726/ + return ["mutagen" , "nonmutagen"] + end + return [true, false] + end end # provides feature type, possible types are "regression" or "classification" diff --git a/lib/helper.rb b/lib/helper.rb index 191b932..a1590d7 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -19,8 +19,6 @@ helpers do #Check Authorization for URI with method and subjectid. def authorized?(subjectid) - # hack for reports, address problem as soon as subjectid is not longer allowed as param - return true if request.env['REQUEST_URI'] =~ /validation\/report\/.*svg$/ request_method = request.env['REQUEST_METHOD'] uri = clean_uri("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}") request_method = "GET" if request_method == "POST" && uri =~ /\/model\/\d+\/?$/ @@ -52,6 +50,7 @@ before do subjectid = session[:subjectid] if session[:subjectid] subjectid = params[:subjectid] if params[:subjectid] and !subjectid subjectid = request.env['HTTP_SUBJECTID'] if request.env['HTTP_SUBJECTID'] and !subjectid + subjectid = request.cookies["subjectid"] unless subjectid # see http://rack.rubyforge.org/doc/SPEC.html subjectid = CGI.unescape(subjectid) if subjectid.include?("%23") @subjectid = subjectid diff --git a/lib/model.rb b/lib/model.rb index 9622d65..74408d8 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -38,24 +38,28 @@ module OpenTox # provides feature type, possible types are "regression" or "classification" # @return [String] feature type, "unknown" if type could not be estimated def feature_type(subjectid=nil) + return @feature_type if @feature_type + # dynamically perform restcalls if necessary load_metadata(subjectid) if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) - - @algorithm = OpenTox::Algorithm::Generic.find(@metadata[OT.algorithm], subjectid) unless @algorithm - algorithm_title = @algorithm ? @algorithm.metadata[DC.title] : nil - algorithm_type = @algorithm ? @algorithm.metadata[OT.isA] : nil - @dependentVariable = OpenTox::Feature.find( @metadata[OT.dependentVariables],subjectid ) unless @dependentVariable - type_indicators = [@dependentVariable.feature_type, @metadata[OT.isA], @metadata[DC.title], + algorithm = OpenTox::Algorithm::Generic.find(@metadata[OT.algorithm], subjectid) + algorithm_title = algorithm ? algorithm.metadata[DC.title] : nil + algorithm_type = algorithm ? algorithm.metadata[OT.isA] : nil + dependent_variable = OpenTox::Feature.find( @metadata[OT.dependentVariables],subjectid ) + dependent_variable_type = dependent_variable ? dependent_variable.feature_type : nil + type_indicators = [dependent_variable_type, @metadata[OT.isA], @metadata[DC.title], @uri, algorithm_type, algorithm_title] type_indicators.each do |type| case type when /(?i)classification/ - return "classification" + @feature_type = "classification" + break when /(?i)regression/ - return "regression" + @feature_type = "regression" end end - raise "unknown model "+type_indicators.inspect + raise "unknown model "+type_indicators.inspect unless @feature_type + @feature_type end end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 7b53122..29a2860 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -45,7 +45,7 @@ class Sinatra::Base response['Content-Type'] = "application/rdf+xml" halt code,task.to_rdfxml when /yaml/ - response['Content-Type'] = "application/rdf+xml" + response['Content-Type'] = "application/x-yaml" halt code,task.to_yaml # PENDING differs from task-webservice when /html/ response['Content-Type'] = "text/html" -- cgit v1.2.3 From 8921d20b9d399274b0674794301ff3567ac7c816 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 14 Feb 2011 18:01:42 +0100 Subject: handle nil values in split --- lib/dataset.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index a843cea..a0f99b1 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -237,7 +237,7 @@ module OpenTox @features[feature] = {} unless @features[feature] @data_entries[compound] = {} unless @data_entries[compound] @data_entries[compound][feature] = [] unless @data_entries[compound][feature] - @data_entries[compound][feature] << value + @data_entries[compound][feature] << value unless value end # Add/modify metadata, existing entries will be overwritten @@ -283,8 +283,12 @@ module OpenTox else compounds.each do |c| features.each do |f| - @data_entries[c][f].each do |v| - dataset.add(c,f,v) + unless @data_entries[c][f] + dataset.add(c,f,nil) + else + @data_entries[c][f].each do |v| + dataset.add(c,f,v) + end end end end -- cgit v1.2.3 From 267b691017202c2fccf69dbeecfd4ed524a73fc2 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 14 Feb 2011 18:28:12 +0100 Subject: fix: handle nil values in split --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index a0f99b1..efab0a3 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -237,7 +237,7 @@ module OpenTox @features[feature] = {} unless @features[feature] @data_entries[compound] = {} unless @data_entries[compound] @data_entries[compound][feature] = [] unless @data_entries[compound][feature] - @data_entries[compound][feature] << value unless value + @data_entries[compound][feature] << value if value end # Add/modify metadata, existing entries will be overwritten -- cgit v1.2.3 From 1bac8bd64f9f703d7e20a65da0ffb05cb150e90f Mon Sep 17 00:00:00 2001 From: mguetlein Date: Sat, 19 Feb 2011 11:26:24 +0100 Subject: add login functionality to webservices --- lib/overwrite.rb | 4 +-- lib/to-html.rb | 99 ++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 66 insertions(+), 37 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 29a2860..b5c3942 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -29,7 +29,7 @@ error Exception do halt error.http_code,rep.to_rdfxml when /html/ content_type 'text/html' - halt error.http_code,(OpenTox.text_to_html rep.to_yaml) + halt error.http_code,(OpenTox.text_to_html rep.to_yaml, @subjectid) else content_type 'application/x-yaml' halt error.http_code,rep.to_yaml @@ -49,7 +49,7 @@ class Sinatra::Base halt code,task.to_yaml # PENDING differs from task-webservice when /html/ response['Content-Type'] = "text/html" - halt code,OpenTox.text_to_html(task.to_yaml) + halt code,OpenTox.text_to_html(task.to_yaml, @subjectid) else # default /uri-list/ response['Content-Type'] = "text/uri-list" halt code,task.uri+"\n" diff --git a/lib/to-html.rb b/lib/to-html.rb index 4de5ee6..1f30ca1 100755 --- a/lib/to-html.rb +++ b/lib/to-html.rb @@ -1,7 +1,6 @@ OT_LOGO = "http://opentox.informatik.uni-freiburg.de/ot-logo.png" - class String # encloses URI in text with with link tag @@ -25,29 +24,30 @@ module OpenTox # @param [optional,String] description general info # @param [optional,Array] post_params, array of arrays containing info on POST operation, see example # @return [String] html page - def self.text_to_html( text, related_links=nil, description=nil, post_params=nil ) + def self.text_to_html( text, subjectid=nil, related_links=nil, description=nil, post_params=nil ) # TODO add title as parameter title = nil #$sinatra.url_for($sinatra.request.env['PATH_INFO'], :full) if $sinatra - - html = < -EOF - html.chomp! + html = "" html += ""+title+"" if title - html += < - -EOF - html.chomp! - html += "

Description

"+description.link_urls+"

" if description - html += "

Related links

"+related_links.link_urls+"

" if related_links - if post_params + html += "" + + if AA_SERVER + user = OpenTox::Authorization.get_user(subjectid) if subjectid + html += "

" + unless user + html += "You are currently not logged in to "+$url_provider.url_for("",:full)+ + ", login" + else + html += "You are logged in as '#{user}' to "+$url_provider.url_for("",:full)+ + ", logout" + end + html += "

" + end + + html += "

Description

"+description.link_urls+"

" if description + html += "

Related links

"+related_links.link_urls+"

" if related_links + if post_params html += "

POST parameters

" count = 0 post_params.each do |p| @@ -59,23 +59,52 @@ EOF html += "

" count += 1 end - end - html += "

Content

" if description || related_links - html += < -

-EOF - html.chomp! - html += text.link_urls - html += < - - - -EOF + end + html += "

Content

" if description || related_links + html += "

" + html += text.link_urls + html += "

" html end + def self.login( msg=nil ) + html = "Login" + html += "
" + html += "

" + html += msg+"\n\n" if msg + html += "Please login to "+$url_provider.url_for("",:full)+"\n\n" + html += "" + html += ""+ + ""+ + #""+ + "" + html += "
user:
password:

" + html + end +end + +get '/logout/?' do + response.set_cookie("subjectid",{:value=>nil}) + content_type "text/html" + content = "Sucessfully logged out from "+$url_provider.url_for("",:full) + OpenTox.text_to_html(content) +end + +get '/login/?' do + content_type "text/html" + OpenTox.login +end + +post '/login/?' do + subjectid = OpenTox::Authorization.authenticate(params[:user], params[:password]) + if (subjectid) + response.set_cookie("subjectid",{:value=>subjectid}) + content_type "text/html" + content = "Sucessfully logged in as '"+params[:user]+"' to "+$url_provider.url_for("",:full) + OpenTox.text_to_html(content,subjectid) + else + content_type "text/html" + OpenTox.login("Login failed, please try again") + end end -#puts OpenTox.text_to_html("bla") \ No newline at end of file -- cgit v1.2.3 From 80d49f60ac55cc2fb1c7974752e1e947fa3f3f70 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 21 Feb 2011 13:52:00 +0100 Subject: clean uri now works for https, rdf parsing issues: /features and ?feature_uris, missing subjectid --- lib/dataset.rb | 2 ++ lib/helper.rb | 5 +++-- lib/parser.rb | 43 +++++++++++++++++++++++++++++-------------- lib/rest_client_wrapper.rb | 3 ++- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index efab0a3..3f530e6 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -141,8 +141,10 @@ module OpenTox if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) copy YAML.load(RestClientWrapper.get(@uri, {:accept => "application/x-yaml", :subjectid => subjectid})) else + puts "loading all.." parser = Parser::Owl::Dataset.new(@uri, subjectid) copy parser.load_uri(subjectid) + puts "..done" end end diff --git a/lib/helper.rb b/lib/helper.rb index a1590d7..b30908c 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -32,8 +32,9 @@ helpers do uri = uri[0,uri.index("InChI=")] if uri.index("InChI=") out = URI.parse(uri) - out.path = out.path[0, out.path.length - (out.path.reverse.rindex(/\/{1}\d+\/{1}/))] if out.path.index(/\/{1}\d+\/{1}/) #cuts after /id/ for a&a - "#{out.scheme}:" + (out.port != 80 ? out.port : "") + "//#{out.host}#{out.path.chomp('/')}" + out.path = out.path[0, out.path.length - (out.path.reverse.rindex(/\/{1}\d+\/{1}/))] if out.path.index(/\/{1}\d+\/{1}/) #cuts after /id/ for a&a + port = (out.scheme=="http" && out.port==80)||(out.scheme=="https" && out.port==443) ? "" : ":#{out.port.to_s}" + "#{out.scheme}://#{out.host}#{port}#{out.path.chomp("/")}" #" end #unprotected uri for login diff --git a/lib/parser.rb b/lib/parser.rb index d2beeac..f1249ad 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -39,7 +39,14 @@ module OpenTox file = File.new(@uri) else file = Tempfile.new("ot-rdfxml") - uri = @dataset ? File.join(@uri,"metadata") : @uri + if @dataset + # do not concat /metadata to uri string, this would not work for dataset/R401577?max=3 + uri = URI::parse(@uri) + uri.path = File.join(uri.path,"metadata") + uri = uri.to_s + else + uri = @uri + end file.puts OpenTox::RestClientWrapper.get uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false file.close to_delete = file.path @@ -163,26 +170,31 @@ module OpenTox data[triple[0]] = {:compound => "", :values => []} unless data[triple[0]] data[triple[0]][:compound] = triple[2] when /#{OT.feature}/i - feature[triple[0]] = triple[2] + feature[triple[0]] = triple[2] else end end File.delete(to_delete) if to_delete data.each do |id,entry| - entry[:values].each do |value_id| - split = feature_values[value_id].split(/\^\^/) - case split[-1] - when XSD.double, XSD.float - value = split.first.to_f - when XSD.boolean - value = split.first=~/(?i)true/ ? true : false - else - value = split.first + if entry[:values].size==0 + # no feature values add plain compounds + @dataset.add_compound(entry[:compound]) + else + entry[:values].each do |value_id| + split = feature_values[value_id].split(/\^\^/) + case split[-1] + when XSD.double, XSD.float + value = split.first.to_f + when XSD.boolean + value = split.first=~/(?i)true/ ? true : false + else + value = split.first + end + @dataset.add entry[:compound],feature[value_id],value end - @dataset.add entry[:compound],feature[value_id],value end end - load_features + load_features subjectid @dataset.metadata = load_metadata(subjectid) @dataset end @@ -194,7 +206,10 @@ module OpenTox file = File.new(@uri) else file = Tempfile.new("ot-rdfxml") - uri = File.join(@uri,"features") + # do not concat /features to uri string, this would not work for dataset/R401577?max=3 + uri = URI::parse(@uri) + uri.path = File.join(uri.path,"features") + uri = uri.to_s file.puts OpenTox::RestClientWrapper.get uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false file.close to_delete = file.path diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index d3136c7..dac24dc 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -76,7 +76,8 @@ module OpenTox else result = resource.send(rest_call, headers) end - + #LOGGER.debug "result body size: #{result.body.size}" + # PENDING NTUA does return errors with 200 raise RestClient::ExceptionWithResponse.new(result) if uri=~/ntua/ and result.body =~ /about.*http:\/\/anonymous.org\/error/ -- cgit v1.2.3 From 53dec3e3b1a59760ac9440749d159edc7ac09359 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 21 Feb 2011 14:10:44 +0100 Subject: removing debug msg --- lib/dataset.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 3f530e6..efab0a3 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -141,10 +141,8 @@ module OpenTox if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) copy YAML.load(RestClientWrapper.get(@uri, {:accept => "application/x-yaml", :subjectid => subjectid})) else - puts "loading all.." parser = Parser::Owl::Dataset.new(@uri, subjectid) copy parser.load_uri(subjectid) - puts "..done" end end -- cgit v1.2.3 From 9bc9d1c5c11aa64d410200cc21d07acc39cc3019 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 21 Feb 2011 15:44:24 +0100 Subject: fix for Datset#add false values, fix for parsing compounds without values --- lib/dataset.rb | 2 +- lib/parser.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index efab0a3..2c47502 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -237,7 +237,7 @@ module OpenTox @features[feature] = {} unless @features[feature] @data_entries[compound] = {} unless @data_entries[compound] @data_entries[compound][feature] = [] unless @data_entries[compound][feature] - @data_entries[compound][feature] << value if value + @data_entries[compound][feature] << value if value!=nil end # Add/modify metadata, existing entries will be overwritten diff --git a/lib/parser.rb b/lib/parser.rb index f1249ad..f33017d 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -171,6 +171,10 @@ module OpenTox data[triple[0]][:compound] = triple[2] when /#{OT.feature}/i feature[triple[0]] = triple[2] + when /#{RDF.type}/i + if triple[2]=~/#{OT.Compound}/i and !data[triple[0]] + data[triple[0]] = {:compound => triple[0], :values => []} + end else end end -- cgit v1.2.3 From 2b61ab65d17b6c80b0afdee33956c263cd7f9c21 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 24 Feb 2011 11:59:56 +0000 Subject: set :lock, true in config_ru.rb, detect accept header in before filter --- lib/config/config_ru.rb | 1 + lib/helper.rb | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/config/config_ru.rb b/lib/config/config_ru.rb index 3d8dce2..93df867 100644 --- a/lib/config/config_ru.rb +++ b/lib/config/config_ru.rb @@ -12,6 +12,7 @@ $stdout.sync = true $stderr.sync = true set :logging, false set :raise_errors, true +set :lock, true ['public','tmp'].each do |dir| FileUtils.mkdir_p dir unless File.exists?(dir) diff --git a/lib/helper.rb b/lib/helper.rb index b30908c..37238bd 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -61,6 +61,26 @@ before do end @subjectid = subjectid protected!(subjectid) + + extension = File.extname(request.path_info) # params[:id] is not yet available + unless extension.empty? + #request.path_info.sub!(/\.#{extension}$/,'') + case extension + when "html" + @accept = 'text/html' + when "yaml" + @accept = 'application/x-yaml' + when "csv" + @accept = 'text/csv' + when "rdfxml" + @accept = 'application/rdf+xml' + when "xls" + @accept = 'application/ms-excel' + else + halt 404, "File format #{extension} not supported." + end + end + end end -- cgit v1.2.3 From 96e7db0a280ed3f28266a117a27cc69cb800063f Mon Sep 17 00:00:00 2001 From: root Date: Fri, 25 Feb 2011 11:45:05 +0000 Subject: experiments with db adapters --- lib/environment.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/environment.rb b/lib/environment.rb index b30b3f3..5b16e4a 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -25,11 +25,17 @@ end # database if CONFIG[:database] ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types', 'dm-migrations', 'dm-validations' ].each{|lib| require lib } +=begin +=end case CONFIG[:database][:adapter] when /sqlite/i db_dir = File.join(basedir, "db") FileUtils.mkdir_p db_dir DataMapper::setup(:default, "sqlite3://#{db_dir}/opentox.sqlite3") + #when /yaml/i + #db_dir = File.join(basedir, "db") + #FileUtils.mkdir_p db_dir + #DataMapper::setup(:default, {:adapter => "yaml", :directory => 'db'}) else DataMapper.setup(:default, { :adapter => CONFIG[:database][:adapter], @@ -38,6 +44,14 @@ if CONFIG[:database] :password => CONFIG[:database][:password], :host => CONFIG[:database][:host]}) end + #db_dir = File.join(basedir, "db") + #FileUtils.mkdir_p db_dir + #DataMapper::setup(:in_memory, "in_memory") + #require 'redis' + + #DataMapper.setup(:default, {:adapter => "redis"}) + + #DataMapper::Model.raise_on_save_failure = true end # load mail settings for error messages -- cgit v1.2.3 From d3dfccb8e46e1d5677877b833fa81acad4d026d4 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 25 Feb 2011 17:54:39 +0000 Subject: ohm/redis backend --- Rakefile | 1 + lib/environment.rb | 2 ++ lib/opentox-ruby.rb | 2 +- lib/overwrite.rb | 6 ++++++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 2578bb4..e49efc3 100644 --- a/Rakefile +++ b/Rakefile @@ -27,6 +27,7 @@ begin "yajl-ruby", "tmail", "rinruby", + "ohm", "rjb" ].each { |dep| gem.add_dependency dep } [ "dm-core", diff --git a/lib/environment.rb b/lib/environment.rb index 5b16e4a..73df64e 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -52,6 +52,8 @@ if CONFIG[:database] #DataMapper.setup(:default, {:adapter => "redis"}) #DataMapper::Model.raise_on_save_failure = true + require 'ohm' + Ohm.connect :thread_safe => true end # load mail settings for error messages diff --git a/lib/opentox-ruby.rb b/lib/opentox-ruby.rb index 735b845..ab8d824 100644 --- a/lib/opentox-ruby.rb +++ b/lib/opentox-ruby.rb @@ -1,4 +1,4 @@ -['rubygems', 'sinatra', 'sinatra/url_for', 'rest_client', 'yaml', 'cgi', 'spork', 'error', 'overwrite', 'environment'].each do |lib| +['rubygems', 'sinatra', 'sinatra/url_for', 'ohm', 'rest_client', 'yaml', 'cgi', 'spork', 'error', 'overwrite', 'environment'].each do |lib| require lib end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index b5c3942..fbe775d 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -137,3 +137,9 @@ class OTLogger < Logger end +# make migration from datamapper more straightforward +class Ohm::Model + def self.get(id) + self[id] + end +end -- cgit v1.2.3 From 9f91e5438a32f0b3b5b3755adfa20d4e0d36566b Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 27 Feb 2011 09:32:57 +0100 Subject: code cleanup --- Rakefile | 2 ++ lib/environment.rb | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Rakefile b/Rakefile index e49efc3..eb0b23a 100644 --- a/Rakefile +++ b/Rakefile @@ -30,6 +30,7 @@ begin "ohm", "rjb" ].each { |dep| gem.add_dependency dep } +=begin [ "dm-core", 'dm-serializer', 'dm-timestamps', @@ -38,6 +39,7 @@ begin "dm-mysql-adapter", "dm-validations", ].each {|dep| gem.add_dependency dep, ">= 1" } +=end gem.add_dependency "haml", ">=3" ['jeweler'].each { |dep| gem.add_development_dependency dep } gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] diff --git a/lib/environment.rb b/lib/environment.rb index 73df64e..4f04e48 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -23,10 +23,9 @@ else end # database +=begin if CONFIG[:database] ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types', 'dm-migrations', 'dm-validations' ].each{|lib| require lib } -=begin -=end case CONFIG[:database][:adapter] when /sqlite/i db_dir = File.join(basedir, "db") @@ -52,9 +51,10 @@ if CONFIG[:database] #DataMapper.setup(:default, {:adapter => "redis"}) #DataMapper::Model.raise_on_save_failure = true - require 'ohm' - Ohm.connect :thread_safe => true end +=end +require 'ohm' +Ohm.connect :thread_safe => true # load mail settings for error messages load File.join config_dir,"mail.rb" if File.exists?(File.join config_dir,"mail.rb") -- cgit v1.2.3 From 2b0ad7c00ec9559d05e07e78cee5f7846d51ee5f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 3 Mar 2011 11:35:54 +0100 Subject: login methods in to-html.rb removed, interferes with ToxCreate login --- Rakefile | 1 + lib/to-html.rb | 2 ++ 2 files changed, 3 insertions(+) mode change 100755 => 100644 lib/to-html.rb diff --git a/Rakefile b/Rakefile index eb0b23a..b496cc2 100644 --- a/Rakefile +++ b/Rakefile @@ -28,6 +28,7 @@ begin "tmail", "rinruby", "ohm", + "SystemTimer", "rjb" ].each { |dep| gem.add_dependency dep } =begin diff --git a/lib/to-html.rb b/lib/to-html.rb old mode 100755 new mode 100644 index 1f30ca1..6785974 --- a/lib/to-html.rb +++ b/lib/to-html.rb @@ -83,6 +83,7 @@ module OpenTox end end +=begin get '/logout/?' do response.set_cookie("subjectid",{:value=>nil}) content_type "text/html" @@ -107,4 +108,5 @@ post '/login/?' do OpenTox.login("Login failed, please try again") end end +=end -- cgit v1.2.3 From 1ffb44de021b276d3ae25fc9d9b09ec1f0f9aa16 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 9 Mar 2011 10:24:49 +0100 Subject: old database config removed --- lib/environment.rb | 32 +------------------------------- lib/helper.rb | 13 +++++++++++++ 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/lib/environment.rb b/lib/environment.rb index 4f04e48..59578c1 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -23,37 +23,7 @@ else end # database -=begin -if CONFIG[:database] - ['dm-core', 'dm-serializer', 'dm-timestamps', 'dm-types', 'dm-migrations', 'dm-validations' ].each{|lib| require lib } - case CONFIG[:database][:adapter] - when /sqlite/i - db_dir = File.join(basedir, "db") - FileUtils.mkdir_p db_dir - DataMapper::setup(:default, "sqlite3://#{db_dir}/opentox.sqlite3") - #when /yaml/i - #db_dir = File.join(basedir, "db") - #FileUtils.mkdir_p db_dir - #DataMapper::setup(:default, {:adapter => "yaml", :directory => 'db'}) - else - DataMapper.setup(:default, { - :adapter => CONFIG[:database][:adapter], - :database => CONFIG[:database][:database], - :username => CONFIG[:database][:username], - :password => CONFIG[:database][:password], - :host => CONFIG[:database][:host]}) - end - #db_dir = File.join(basedir, "db") - #FileUtils.mkdir_p db_dir - #DataMapper::setup(:in_memory, "in_memory") - #require 'redis' - - #DataMapper.setup(:default, {:adapter => "redis"}) - - #DataMapper::Model.raise_on_save_failure = true -end -=end -require 'ohm' +`redis-server /opt/redis/redis.conf` unless File.exists? "/var/run/redis.pid" Ohm.connect :thread_safe => true # load mail settings for error messages diff --git a/lib/helper.rb b/lib/helper.rb index 37238bd..3031b74 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -42,6 +42,19 @@ helpers do return env['REQUEST_URI'] =~ /\/login$/ end + def uri_available?(urlStr) + url = URI.parse(urlStr) + unless @subjectid + Net::HTTP.start(url.host, url.port) do |http| + return http.head(url.request_uri).code == "200" + end + else + Net::HTTP.start(url.host, url.port) do |http| + return http.post(url.request_uri, "subjectid=#{@subjectid}").code == "202" + end + end + end + end before do -- cgit v1.2.3 From 521c615c5aae4b2aaf28cdbcf5d6d37e85362f14 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 9 Mar 2011 10:32:51 +0100 Subject: Version bump to 1.0.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 4e379d2..afaf360 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.2 +1.0.0 \ No newline at end of file -- cgit v1.2.3 From d1f555bdb0368fc82a2bb379ab7857bae727072a Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 9 Mar 2011 11:37:57 +0100 Subject: README updated and converted to markdown --- README.markdown | 43 +++++++++++++++++++++++++++++++++++++++++++ README.rdoc | 23 ----------------------- 2 files changed, 43 insertions(+), 23 deletions(-) create mode 100644 README.markdown delete mode 100644 README.rdoc diff --git a/README.markdown b/README.markdown new file mode 100644 index 0000000..8f18598 --- /dev/null +++ b/README.markdown @@ -0,0 +1,43 @@ +opentox-ruby +============ + +Ruby wrapper for the OpenTox REST API (http://www.opentox.org) + +Installation +------------ + +opentox-ruby depends on many third party programs and libraries, which makes the setup complicated and error prone. For this reason we recommend to use the installer from (opentox-install)[http://github.com/opentox/opentox-install]. If you want to install manually you can find the necessary steps in the installation scripts. + +Quickstart +---------- + +This example shows how to create a lazar model and predict a compound, it assumes that you have access to a working installation of OpenTox services with corresponding settings in $HOME/.opentox/config. Run the following code in irb or from a ruby script: + + require 'rubygems' + require 'opentox-ruby' + + # Authenticate + subjectid = OpenTox::Authorization.authenticate(USER,PASSWORD) + + # Upload a dataset + training_dataset = OpenTox::Dataset.create_from_csv_file(TRAINING_DATASET, subjectid) + + # Create a prediction model + model_uri = OpenTox::Algorithm::Lazar.new.run({:dataset_uri => training_dataset.uri, :subjectid => subjectid}).to_s + lazar = OpenTox::Model::Lazar.find model_uri, subjectid + + # Predict a compound + compound = OpenTox::Compound.from_smiles("c1ccccc1NN") + prediction_uri = lazar.run(:compound_uri => compound.uri, :subjectid => subjectid) + prediction = OpenTox::LazarPrediction.find(prediction_uri, subjectid) + puts prediction.to_yaml + +API documentation +----------------- + +http://rdoc.info/gems/opentox-ruby/0.0.2/frames + +Copyright +-------- + +Copyright (c) 2009-2011 Christoph Helma. See LICENSE for details. diff --git a/README.rdoc b/README.rdoc deleted file mode 100644 index 45cc5f6..0000000 --- a/README.rdoc +++ /dev/null @@ -1,23 +0,0 @@ -= opentox-ruby - -Ruby wrapper for the OpenTox REST API (http://www.opentox.org) - -== Installation - -Run the following if you haven't already: - - gem sources -a http://gems.github.com - -Install the gem: - - sudo gem install helma-opentox-ruby - -== Usage - -- adjust the settings in $HOME/.opentox/config -- require 'opentox-ruby' in your ruby application -- consult the rdoc API documentation for details - -== Copyright - -Copyright (c) 2009-2010 Christoph Helma. See LICENSE for details. -- cgit v1.2.3 From ef5c37ed8cb76b476133d3f7e013059b9bb13fee Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 9 Mar 2011 12:16:07 +0100 Subject: README fixed --- README.markdown | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/README.markdown b/README.markdown index 8f18598..4254748 100644 --- a/README.markdown +++ b/README.markdown @@ -1,43 +1,41 @@ opentox-ruby ============ -Ruby wrapper for the OpenTox REST API (http://www.opentox.org) +Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API Installation ------------ -opentox-ruby depends on many third party programs and libraries, which makes the setup complicated and error prone. For this reason we recommend to use the installer from (opentox-install)[http://github.com/opentox/opentox-install]. If you want to install manually you can find the necessary steps in the installation scripts. +opentox-ruby depends on many third party programs and libraries, which makes the setup complicated and error prone. For this reason we recommend to use the installer from [opentox-install](http://github.com/opentox/opentox-install). If you want to install manually you can find the necessary steps in the installation scripts. Quickstart ---------- This example shows how to create a lazar model and predict a compound, it assumes that you have access to a working installation of OpenTox services with corresponding settings in $HOME/.opentox/config. Run the following code in irb or from a ruby script: - require 'rubygems' - require 'opentox-ruby' + require 'rubygems' + require 'opentox-ruby' - # Authenticate - subjectid = OpenTox::Authorization.authenticate(USER,PASSWORD) + # Authenticate + subjectid = OpenTox::Authorization.authenticate(USER,PASSWORD) - # Upload a dataset - training_dataset = OpenTox::Dataset.create_from_csv_file(TRAINING_DATASET, subjectid) + # Upload a dataset + training_dataset = OpenTox::Dataset.create_from_csv_file(TRAINING_DATASET, subjectid) - # Create a prediction model - model_uri = OpenTox::Algorithm::Lazar.new.run({:dataset_uri => training_dataset.uri, :subjectid => subjectid}).to_s - lazar = OpenTox::Model::Lazar.find model_uri, subjectid - - # Predict a compound - compound = OpenTox::Compound.from_smiles("c1ccccc1NN") - prediction_uri = lazar.run(:compound_uri => compound.uri, :subjectid => subjectid) - prediction = OpenTox::LazarPrediction.find(prediction_uri, subjectid) - puts prediction.to_yaml + # Create a prediction model + model_uri = OpenTox::Algorithm::Lazar.new.run({:dataset_uri => training_dataset.uri, :subjectid => subjectid}).to_s + lazar = OpenTox::Model::Lazar.find model_uri, subjectid + + # Predict a compound + compound = OpenTox::Compound.from_smiles("c1ccccc1NN") + prediction_uri = lazar.run(:compound_uri => compound.uri, :subjectid => subjectid) + prediction = OpenTox::LazarPrediction.find(prediction_uri, subjectid) + puts prediction.to_yaml -API documentation ------------------ - -http://rdoc.info/gems/opentox-ruby/0.0.2/frames +[API documentation](http://rdoc.info/gems/opentox-ruby/0.0.2/frames) +------------------------------------------------------------------- Copyright --------- +--------- -Copyright (c) 2009-2011 Christoph Helma. See LICENSE for details. +Copyright (c) 2009-2011 Christoph Helma, Martin Guetlein, Micha Rautenberg, Andreas Maunz, David Vorgrimmler, Denis Gebele. See LICENSE for details. -- cgit v1.2.3 From 66f2ee967317954568562510111b0d832881547d Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 9 Mar 2011 12:21:36 +0100 Subject: API Doc link fixed --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 4254748..79bdab2 100644 --- a/README.markdown +++ b/README.markdown @@ -32,7 +32,7 @@ This example shows how to create a lazar model and predict a compound, it assume prediction = OpenTox::LazarPrediction.find(prediction_uri, subjectid) puts prediction.to_yaml -[API documentation](http://rdoc.info/gems/opentox-ruby/0.0.2/frames) +[API documentation](http://rdoc.info/gems/opentox-ruby/1.0.0/frames) ------------------------------------------------------------------- Copyright -- cgit v1.2.3 From 4b7d902de3e2704c23a0fca550322cc229261d2f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 9 Mar 2011 12:52:45 +0100 Subject: .gitignore updated --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index fedf1b5..75924e1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,7 @@ coverage rdoc pkg +.yardoc +doc +mysql-bak.rb *~ -- cgit v1.2.3 From 349dd03693bfc357b011e9ebb5b459f6aa893f95 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 9 Mar 2011 12:53:16 +0100 Subject: Regenerate gemspec for version 1.0.0 --- opentox-ruby.gemspec | 107 +++++++++++++++++++++------------------------------ 1 file changed, 43 insertions(+), 64 deletions(-) diff --git a/opentox-ruby.gemspec b/opentox-ruby.gemspec index 3903af7..75fa877 100644 --- a/opentox-ruby.gemspec +++ b/opentox-ruby.gemspec @@ -1,68 +1,62 @@ # Generated by jeweler # DO NOT EDIT THIS FILE DIRECTLY -# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command +# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec' # -*- encoding: utf-8 -*- Gem::Specification.new do |s| s.name = %q{opentox-ruby} - s.version = "0.0.2" + s.version = "1.0.0" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] - s.date = %q{2011-01-27} + s.date = %q{2011-03-09} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} - s.executables = ["opentox-install-ubuntu.sh", "opentox-install-debian.sh"] + s.executables = ["opentox-install-debian.sh", "opentox-install-ubuntu.sh"] s.extra_rdoc_files = [ "LICENSE", - "README.rdoc" + "README.markdown" ] s.files = [ "LICENSE", - "README.rdoc", - "Rakefile", - "VERSION", - "bin/opentox-install-debian.sh", - "bin/opentox-install-ubuntu.sh", - "lib/algorithm.rb", - "lib/authorization.rb", - "lib/compound.rb", - "lib/config/config_ru.rb", - "lib/dataset.rb", - "lib/environment.rb", - "lib/error.rb", - "lib/feature.rb", - "lib/helper.rb", - "lib/model.rb", - "lib/ontology_service.rb", - "lib/opentox-ruby.rb", - "lib/opentox.owl", - "lib/opentox.rb", - "lib/overwrite.rb", - "lib/owl.rb.RDF", - "lib/owl.rb.nt", - "lib/owl.rb.rdfxml.initial", - "lib/owl.rb.redland", - "lib/parser.rb", - "lib/policy.rb", - "lib/rest_client_wrapper.rb", - "lib/serializer.rb", - "lib/spork.rb", - "lib/task.rb", - "lib/templates/config.yaml", - "lib/templates/default_guest_policy.xml", - "lib/templates/default_policy.xml", - "lib/to-html.rb", - "lib/validation.rb" + "README.markdown", + "Rakefile", + "VERSION", + "bin/opentox-install-debian.sh", + "bin/opentox-install-ubuntu.sh", + "lib/algorithm.rb", + "lib/authorization.rb", + "lib/compound.rb", + "lib/config/config_ru.rb", + "lib/dataset.rb", + "lib/environment.rb", + "lib/error.rb", + "lib/feature.rb", + "lib/helper.rb", + "lib/model.rb", + "lib/ontology_service.rb", + "lib/opentox-ruby.rb", + "lib/opentox.owl", + "lib/opentox.rb", + "lib/overwrite.rb", + "lib/parser.rb", + "lib/policy.rb", + "lib/rest_client_wrapper.rb", + "lib/serializer.rb", + "lib/spork.rb", + "lib/task.rb", + "lib/templates/config.yaml", + "lib/templates/default_guest_policy.xml", + "lib/templates/default_policy.xml", + "lib/to-html.rb", + "lib/validation.rb" ] s.homepage = %q{http://github.com/helma/opentox-ruby} - s.rdoc_options = ["--charset=UTF-8"] s.require_paths = ["lib"] - s.rubygems_version = %q{1.3.7} + s.rubygems_version = %q{1.4.2} s.summary = %q{Ruby wrapper for the OpenTox REST API} if s.respond_to? :specification_version then - current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION s.specification_version = 3 if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then @@ -82,14 +76,9 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) - s.add_runtime_dependency(%q, [">= 1"]) s.add_runtime_dependency(%q, [">= 3"]) s.add_development_dependency(%q, [">= 0"]) else @@ -109,14 +98,9 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 3"]) s.add_dependency(%q, [">= 0"]) end @@ -137,14 +121,9 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) - s.add_dependency(%q, [">= 1"]) s.add_dependency(%q, [">= 3"]) s.add_dependency(%q, [">= 0"]) end -- cgit v1.2.3 From c802bfd6c899d4d37e3bd2ee274c1bc3ffb7cd94 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Mar 2011 14:11:37 +0100 Subject: doc for Feature.find, load_features in feature_type --- lib/algorithm.rb | 3 +-- lib/dataset.rb | 3 ++- lib/feature.rb | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index af8dfaf..c8cb116 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -190,8 +190,7 @@ module OpenTox gram_matrix[i][i] = 1.0 end - LOGGER.debug gram_matrix.to_yaml - + #LOGGER.debug gram_matrix.to_yaml @r = RinRuby.new(false,false) # global R instance leads to Socket errors after a large number of requests @r.eval "library('kernlab')" # this requires R package "kernlab" to be installed LOGGER.debug "Setting R data ..." diff --git a/lib/dataset.rb b/lib/dataset.rb index 2c47502..c61d86f 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -165,7 +165,8 @@ module OpenTox # Detect feature type(s) in the dataset # @return [String] `classification", "regression", "mixed" or unknown` - def feature_type + def feature_type(subjectid=nil) + load_features(subjectid) feature_types = @features.collect{|f,metadata| metadata[OT.isA]}.uniq if feature_types.size > 1 "mixed" diff --git a/lib/feature.rb b/lib/feature.rb index c0729a7..e768f7b 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -2,6 +2,9 @@ module OpenTox class Feature include OpenTox + # Find a feature + # @param [String] uri Feature URI + # @return [OpenTox::Task] Feature object def self.find(uri, subjectid=nil) return nil unless uri feature = Feature.new uri -- cgit v1.2.3 From fae1c053a76d501dc9a3deac09e7c60433980b51 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Mar 2011 14:16:47 +0100 Subject: Version bump to 0.0.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index afaf360..bd52db8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0 \ No newline at end of file +0.0.0 \ No newline at end of file -- cgit v1.2.3 From b0ccc26edde30bb2ec459fbe952887a674a23a8c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Mar 2011 14:17:10 +0100 Subject: Version bump to 1.0.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index bd52db8..afaf360 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.0 \ No newline at end of file +1.0.0 \ No newline at end of file -- cgit v1.2.3 From a99b6421f51c9f084dd554fa7d5dc93929d9d2d8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Mar 2011 14:17:21 +0100 Subject: Version bump to 1.0.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index afaf360..7f20734 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0 \ No newline at end of file +1.0.1 \ No newline at end of file -- cgit v1.2.3 From c295a3d01a9241c772d7fa7495a3e215a9c69b7e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Mar 2011 14:19:19 +0100 Subject: v1.0.1 built --- opentox-ruby.gemspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentox-ruby.gemspec b/opentox-ruby.gemspec index 75fa877..2f4370a 100644 --- a/opentox-ruby.gemspec +++ b/opentox-ruby.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby} - s.version = "1.0.0" + s.version = "1.0.1" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] - s.date = %q{2011-03-09} + s.date = %q{2011-03-16} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-debian.sh", "opentox-install-ubuntu.sh"] -- cgit v1.2.3 From 91781c18c8c2c33783f30e64172f11ae9180a6d1 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Mar 2011 15:40:46 +0100 Subject: conversion to float in Math.gauss --- lib/algorithm.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index c8cb116..167c964 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -246,7 +246,7 @@ module OpenTox # Gauss kernel # @return [Float] def self.gauss(x, sigma = 0.3) - d = 1.0 - x + d = 1.0 - x.to_f Math.exp(-(d*d)/(2*sigma*sigma)) end -- cgit v1.2.3 From 9925043c4d7784c8e80664fbfaf71c4cfdd80a0d Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Mar 2011 15:41:53 +0100 Subject: Version bump to 1.0.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 7f20734..e6d5cb8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.1 \ No newline at end of file +1.0.2 \ No newline at end of file -- cgit v1.2.3 From baa94c2520c49846ccdbb43c72bb9d04212fa2f1 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Mar 2011 15:50:23 +0100 Subject: conversion to float in Math.gauss --- opentox-ruby.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentox-ruby.gemspec b/opentox-ruby.gemspec index 2f4370a..289dacd 100644 --- a/opentox-ruby.gemspec +++ b/opentox-ruby.gemspec @@ -5,7 +5,7 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby} - s.version = "1.0.1" + s.version = "1.0.2" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] -- cgit v1.2.3 From c0bef2dc83d2ce1fea6434ca73586d49865bb810 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 31 Mar 2011 13:44:02 +0200 Subject: ohm-contrib added --- Rakefile | 3 +-- lib/environment.rb | 2 +- lib/ontology.rb | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/ontology_service.rb | 43 -------------------------------------- lib/opentox-ruby.rb | 2 +- 5 files changed, 58 insertions(+), 47 deletions(-) create mode 100644 lib/ontology.rb delete mode 100644 lib/ontology_service.rb diff --git a/Rakefile b/Rakefile index b496cc2..215aeb2 100644 --- a/Rakefile +++ b/Rakefile @@ -28,6 +28,7 @@ begin "tmail", "rinruby", "ohm", + "ohm-contrib", "SystemTimer", "rjb" ].each { |dep| gem.add_dependency dep } @@ -44,8 +45,6 @@ begin gem.add_dependency "haml", ">=3" ['jeweler'].each { |dep| gem.add_development_dependency dep } gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] - #gem.files.include %w(lib/environment.rb, lib/algorithm.rb, lib/compound.rb, lib/dataset.rb, lib/model.rb, lib/validation.rb, lib/templates/*) - # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings end Jeweler::GemcutterTasks.new rescue LoadError diff --git a/lib/environment.rb b/lib/environment.rb index 59578c1..57ae014 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -74,7 +74,7 @@ CONFIG[:authorization][:authenticate_request] = [""] unless CONFIG[:authorizatio CONFIG[:authorization][:authorize_request] = [""] unless CONFIG[:authorization][:authorize_request] CONFIG[:authorization][:free_request] = [""] unless CONFIG[:authorization][:free_request] -RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' +#RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' OWL = OwlNamespace.new 'http://www.w3.org/2002/07/owl#' DC = OwlNamespace.new 'http://purl.org/dc/elements/1.1/' OT = OwlNamespace.new 'http://www.opentox.org/api/1.1#' diff --git a/lib/ontology.rb b/lib/ontology.rb new file mode 100644 index 0000000..c3952c3 --- /dev/null +++ b/lib/ontology.rb @@ -0,0 +1,55 @@ +module OpenTox + module Ontology + module Echa + require 'sparql/client' + @sparql = SPARQL::Client.new("http://apps.ideaconsult.net:8080/ontology") + def self.qs(classname="Endpoints") + return "PREFIX ot: + PREFIX ota: + PREFIX owl: + PREFIX dc: + PREFIX rdfs: + PREFIX rdf: + PREFIX otee: + PREFIX toxcast: + select * + where { + ?endpoint rdfs:subClassOf otee:#{classname}. + ?endpoint dc:title ?title. + }" + end + + def self.make_option_list(endpoint="Endpoints", level=1) + out = "" + results = @sparql.query(qs(endpoint)) rescue results = [] + results.each do |result| + endpointname = result.Endpoints.to_s.split('#').last + title = result.bound?(:title) ? result.title : endpointname + out += "\n" + out += make_option_list(endpointname, level + 1) + end + return out + end + + def self.get_endpoint_selectlist(include_blank=true) + out = "\n" + return out + end + + def self.endpoints#(endpoint="Endpoints") + endpoint_datasets = {} + RestClientWrapper.get("http://apps.ideaconsult.net:8080/ambit2/query/ndatasets_endpoint",:accept => "text/csv").each do |line| + if line.match(/^http/) + e = line.split(',') + endpoint_datasets["#{e.first} (#{e[1]})"] = RestClientWrapper.get(e.last, :accept => "text/uri-list").split("\n")#[0..e[1].to_i-1] # hack to get only the first count entries + end + end + endpoint_datasets + end + end + + end +end diff --git a/lib/ontology_service.rb b/lib/ontology_service.rb deleted file mode 100644 index 4ff688f..0000000 --- a/lib/ontology_service.rb +++ /dev/null @@ -1,43 +0,0 @@ -module OpenTox - module OntologyService - module Endpoints - require 'sparql/client' - @sparql = SPARQL::Client.new("http://apps.ideaconsult.net:8080/ontology") - def self.qs(classname="Endpoints") - return "PREFIX ot: - PREFIX ota: - PREFIX owl: - PREFIX dc: - PREFIX rdfs: - PREFIX rdf: - PREFIX otee: - PREFIX toxcast: - select ?Endpoints ?title ?id - where {?Endpoints rdfs:subClassOf otee:#{classname}. - OPTIONAL {?Endpoints dc:title ?title}. - OPTIONAL {?Endpoints dc:identifier ?id}.} - ORDER BY ?title" - end - - def self.make_option_list(endpoint="Endpoints", level=1) - out = "" - results = @sparql.query(qs(endpoint)) rescue results = [] - results.each do |result| - endpointname = result.Endpoints.to_s.split('#').last - title = result.bound?(:title) ? result.title : endpointname - out += "\n" - out += make_option_list(endpointname, level + 1) - end - return out - end - - def self.get_endpoint_selectlist(include_blank=true) - out = "\n" - return out - end - end - end -end \ No newline at end of file diff --git a/lib/opentox-ruby.rb b/lib/opentox-ruby.rb index ab8d824..ae05cb2 100644 --- a/lib/opentox-ruby.rb +++ b/lib/opentox-ruby.rb @@ -9,6 +9,6 @@ rescue LoadError end ['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', - 'rest_client_wrapper', 'authorization', 'policy', 'helper', 'to-html' ].each do |lib| + 'rest_client_wrapper', 'authorization', 'policy', 'helper', 'to-html', 'ontology' ].each do |lib| require lib end -- cgit v1.2.3 From 1daec5badcff31c591377017b32055aac775dbb7 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 4 Apr 2011 18:46:22 +0200 Subject: OT.isA substituted by RDF.type, identification of feature_types by RDF.type --- lib/dataset.rb | 31 +++++++++++------ lib/environment.rb | 2 +- lib/error.rb | 4 +-- lib/feature.rb | 12 ++++++- lib/model.rb | 15 ++++----- lib/ontology.rb | 18 +++++----- lib/opentox.rb | 9 ++++- lib/parser.rb | 11 ++++-- lib/serializer.rb | 2 +- lib/templates/config.yaml | 86 ----------------------------------------------- 10 files changed, 68 insertions(+), 122 deletions(-) delete mode 100644 lib/templates/config.yaml diff --git a/lib/dataset.rb b/lib/dataset.rb index c61d86f..93fce18 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -163,24 +163,33 @@ module OpenTox @features end + def feature_classes(feature) + if Feature.find(feature).feature_type == "classification" + classes = [] + @data_entries.each do |c,e| + e[feature].each { |v| classes << v.to_s } + end + classes.uniq.sort + else + nil + end + end + +=begin # Detect feature type(s) in the dataset # @return [String] `classification", "regression", "mixed" or unknown` def feature_type(subjectid=nil) load_features(subjectid) - feature_types = @features.collect{|f,metadata| metadata[OT.isA]}.uniq - if feature_types.size > 1 - "mixed" + feature_types = @features.collect{|f,metadata| metadata[RDF.type]}.flatten.uniq + if feature_types.include?(OT.NominalFeature) + "classification" + elsif feature_types.include?(OT.NumericFeature) + "regression" else - case feature_types.first - when /NominalFeature/ - "classification" - when /NumericFeature/ - "regression" - else - "unknown" - end + "unknown" end end +=end # Get Spreadsheet representation # @return [Spreadsheet::Workbook] Workbook which can be written with the spreadsheet gem (data_entries only, metadata will will be discarded)) diff --git a/lib/environment.rb b/lib/environment.rb index 57ae014..59578c1 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -74,7 +74,7 @@ CONFIG[:authorization][:authenticate_request] = [""] unless CONFIG[:authorizatio CONFIG[:authorization][:authorize_request] = [""] unless CONFIG[:authorization][:authorize_request] CONFIG[:authorization][:free_request] = [""] unless CONFIG[:authorization][:free_request] -#RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' +RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' OWL = OwlNamespace.new 'http://www.w3.org/2002/07/owl#' DC = OwlNamespace.new 'http://purl.org/dc/elements/1.1/' OT = OwlNamespace.new 'http://www.opentox.org/api/1.1#' diff --git a/lib/error.rb b/lib/error.rb index 7ca9767..b92f2a4 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -69,7 +69,7 @@ module OpenTox def rdf_content() c = { - RDF.type => OT.ErrorReport, + RDF.type => [OT.ErrorReport], OT.statusCode => @http_code, OT.message => @message, OT.actor => @actor, @@ -96,4 +96,4 @@ class Array end short.join("\n") end -end \ No newline at end of file +end diff --git a/lib/feature.rb b/lib/feature.rb index e768f7b..f6e2dfd 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -32,7 +32,16 @@ module OpenTox # provides feature type, possible types are "regression" or "classification" # @return [String] feature type, unknown if OT.isA property is unknown/ not set def feature_type - case metadata[OT.isA] + if metadata[RDF.type].flatten.include?(OT.NominalFeature) + "classification" + elsif metadata[RDF.type].flatten.include?(OT.NumericFeature) + "regression" + else + #"unknown" + metadata[RDF.type].inspect + end +=begin + case metadata[RDF.type] when /NominalFeature/ "classification" when /NumericFeature/ @@ -40,6 +49,7 @@ module OpenTox else "unknown" end +=end end end diff --git a/lib/model.rb b/lib/model.rb index 74408d8..422acd2 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -44,11 +44,10 @@ module OpenTox load_metadata(subjectid) if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) algorithm = OpenTox::Algorithm::Generic.find(@metadata[OT.algorithm], subjectid) algorithm_title = algorithm ? algorithm.metadata[DC.title] : nil - algorithm_type = algorithm ? algorithm.metadata[OT.isA] : nil + algorithm_type = algorithm ? algorithm.metadata[RDF.type] : nil dependent_variable = OpenTox::Feature.find( @metadata[OT.dependentVariables],subjectid ) dependent_variable_type = dependent_variable ? dependent_variable.feature_type : nil - type_indicators = [dependent_variable_type, @metadata[OT.isA], @metadata[DC.title], - @uri, algorithm_type, algorithm_title] + type_indicators = [dependent_variable_type, @metadata[RDF.type], @metadata[DC.title], @uri, algorithm_type, algorithm_title].flatten type_indicators.each do |type| case type when /(?i)classification/ @@ -187,7 +186,7 @@ module OpenTox if @neighbors.size == 0 @prediction_dataset.add_feature(prediction_feature_uri, { - OT.isA => OT.MeasuredFeature, + RDF.type => [OT.MeasuredFeature], OT.hasSource => @uri, DC.creator => @uri, DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), @@ -198,7 +197,7 @@ module OpenTox else @prediction_dataset.add_feature(prediction_feature_uri, { - OT.isA => OT.ModelPrediction, + RDF.type => [OT.ModelPrediction], OT.hasSource => @uri, DC.creator => @uri, DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), @@ -215,7 +214,7 @@ module OpenTox feature_uri = File.join( @prediction_dataset.uri, "feature", "descriptor", f.to_s) features[feature] = feature_uri @prediction_dataset.add_feature(feature_uri, { - OT.isA => OT.Substructure, + RDF.type => [OT.Substructure], OT.smarts => feature, OT.pValue => @p_values[feature], OT.effect => @effects[feature] @@ -236,7 +235,7 @@ module OpenTox OT.compound => neighbor[:compound], OT.similarity => neighbor[:similarity], OT.measuredActivity => neighbor[:activity], - OT.isA => OT.Neighbor + RDF.type => [OT.Neighbor] }) @prediction_dataset.add @compound.uri, neighbor_uri, true f = 0 unless f @@ -250,7 +249,7 @@ module OpenTox unless features.has_key? feature features[feature] = feature_uri @prediction_dataset.add_feature(feature_uri, { - OT.isA => OT.Substructure, + RDF.type => [OT.Substructure], OT.smarts => feature, OT.pValue => @p_values[feature], OT.effect => @effects[feature] diff --git a/lib/ontology.rb b/lib/ontology.rb index c3952c3..fa4ea6f 100644 --- a/lib/ontology.rb +++ b/lib/ontology.rb @@ -1,6 +1,7 @@ module OpenTox module Ontology module Echa +=begin require 'sparql/client' @sparql = SPARQL::Client.new("http://apps.ideaconsult.net:8080/ontology") def self.qs(classname="Endpoints") @@ -38,17 +39,16 @@ module OpenTox out += "\n" return out end +=end - def self.endpoints#(endpoint="Endpoints") - endpoint_datasets = {} - RestClientWrapper.get("http://apps.ideaconsult.net:8080/ambit2/query/ndatasets_endpoint",:accept => "text/csv").each do |line| - if line.match(/^http/) - e = line.split(',') - endpoint_datasets["#{e.first} (#{e[1]})"] = RestClientWrapper.get(e.last, :accept => "text/uri-list").split("\n")#[0..e[1].to_i-1] # hack to get only the first count entries - end - end - endpoint_datasets + def self.endpoints + RestClientWrapper.get("http://apps.ideaconsult.net:8080/ambit2/query/ndatasets_endpoint",:accept => "text/csv").collect { |line| line.split(',').first if line.match(/^http/) }.compact + end + + def self.datasets(endpoint) + RestClientWrapper.get("http://apps.ideaconsult.net:8080/ambit2/dataset?feature_sameas=#{URI.encode endpoint}", :accept => "text/uri-list").split("\n") end + end end diff --git a/lib/opentox.rb b/lib/opentox.rb index 1992896..c76e21a 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -31,7 +31,14 @@ module OpenTox end def add_metadata(metadata) - metadata.each { |k,v| @metadata[k] = v } + metadata.each do |k,v| + if v.is_a? Array + @metadata[k] = [] unless @metadata[k] + @metadata[k] << v + else + @metadata[k] = v + end + end end # Get OWL-DL representation in RDF/XML format diff --git a/lib/parser.rb b/lib/parser.rb index f33017d..cc5f1c8 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -55,7 +55,14 @@ module OpenTox parameter_ids = [] `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| triple = line.to_triple - @metadata[triple[1]] = triple[2].split('^^').first if triple[0] == @uri and triple[1] != RDF['type'] + if triple[0] == @uri + if triple[1] == RDF.type # allow multiple types + @metadata[triple[1]] = [] unless @metadata[triple[1]] + @metadata[triple[1]] << triple[2].split('^^').first + else + @metadata[triple[1]] = triple[2].split('^^').first + end + end statements << triple parameter_ids << triple[2] if triple[1] == OT.parameters end @@ -289,7 +296,7 @@ module OpenTox else type = types.first end - @dataset.add_feature_metadata(feature,{OT.isA => type}) + @dataset.add_feature_metadata(feature,{RDF.type => [type]}) info += "\"#{@dataset.feature_name(feature)}\" detected as #{type.split('#').last}." # TODO: rewrite feature values diff --git a/lib/serializer.rb b/lib/serializer.rb index 44b4414..644a09f 100644 --- a/lib/serializer.rb +++ b/lib/serializer.rb @@ -67,7 +67,7 @@ module OpenTox DC.creator => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , DC.description => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , DC.date => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.isA => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + #OT.isA => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.Warnings => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , XSD.anyURI => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.hasStatus => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , diff --git a/lib/templates/config.yaml b/lib/templates/config.yaml deleted file mode 100644 index 8a5e460..0000000 --- a/lib/templates/config.yaml +++ /dev/null @@ -1,86 +0,0 @@ -# Example configuration for OpenTox, please adjust to your settings -# -# Database setup: -# -# Example MySql: -# -:database: - :adapter: mysql - :database: production - :username: root - :password: opentox - :host: localhost -# -# Example 1: Using external test services -# -# :services: -# opentox-compound: "http://webservices.in-silico.ch/compound/" -# opentox-dataset: "http://webservices.in-silico.ch/dataset/" -# opentox-algorithm: "http://webservices.in-silico.ch/algorithm/" -# opentox-model: "http://webservices.in-silico.ch/model/" -# opentox-task: "http://webservices.in-silico.ch/task/" -# opentox-validation: "http://opentox.informatik.uni-freiburg.de/validation/" -# -# Example 2: Using local services -:base_dir: /home/ist/webservices -:webserver: passenger -:services: - opentox-compound: "http://localhost/compound/" - opentox-dataset: "http://localhost/dataset/" - opentox-algorithm: "http://localhost/algorithm/" - opentox-model: "http://localhost/model/" - opentox-task: "http://localhost/task/" - opentox-validation: "http://localhost/validation/" -# -# Yaml capable hosts (faster than OWL-DL) -# -:yaml_hosts: - - "localhost" - -# Uncomment for verbose logging -# :logger: debug -# :backtrace: 1 - - -# OpenSSO Authorization -# set ":server: " to disable A&A -:authorization: - :server: "https://opensso.in-silico.ch" - :free_request: #request-method not controlled by A&A - - "GET" - :authenticate_request: #only for authenticated user - - "POST" - :authorize_request: #only for authenticated and authorizeduser - - "DELETE" - - "PUT" - # Exceptions: - :free_uris: #request-method for uri not controlled by A&A - ? - :GET - : - !ruby/regexp /localhost\/algorithm/ - - "http://localhost/dataset" - - "http://localhost/model" - - "http://localhost/validation" - - "http://localhost/validation/crossvalidation" - - "http://localhost/validation/reach_report" - - "http://localhost/validation/reach_report/crossvalidation" - - "http://localhost/validation/report" - - "http://localhost/validation/report/crossvalidation" - - "http://localhost/validation/reach_report/qmrf" - ? - :GET - - :POST - : - !ruby/regexp /localhost\/toxcreate/ - - !ruby/regexp /localhost\/task/ - - !ruby/regexp /localhost\/compound/ - ? - :PUT - : - !ruby/regexp /localhost\/task/ - - :authorize_exceptions: #request-method for uri only authenticated, no authorization - ? - :POST - : - !ruby/regexp /localhost\/algorithm/ - - "http://localhost/dataset" - - "http://localhost/model" - - "http://localhost/validation" - - !ruby/regexp /localhost\/validation\/[a-z,A-Z,\/,_\-]*$/ - - - \ No newline at end of file -- cgit v1.2.3 From 80c2562c0f84f65b0e3ed02c3293c530d0dc4ce2 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 5 Apr 2011 19:12:04 +0200 Subject: Parser.load_features fixed for Substructures --- lib/parser.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/parser.rb b/lib/parser.rb index cc5f1c8..db746c1 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -230,7 +230,7 @@ module OpenTox `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| triple = line.chomp.split('> ').collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')}[0..2] statements << triple - features << triple[0] if triple[1] == RDF['type'] and (triple[2] == OT.Feature || triple[2] == OT.NumericFeature) + features << triple[0] if triple[1] == RDF.type and (triple[2] =~ /Feature|Substructure/) end File.delete(to_delete) if to_delete statements.each do |triple| -- cgit v1.2.3 From a12f491fc42b058168fb43b32e8769694e821658 Mon Sep 17 00:00:00 2001 From: mr Date: Wed, 6 Apr 2011 09:59:04 +0200 Subject: A&A fixes, code cleaning --- lib/algorithm.rb | 2 +- lib/helper.rb | 57 +++++++++++++++++++++++++++++--------------------------- lib/model.rb | 3 ++- 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index c8cb116..167c964 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -246,7 +246,7 @@ module OpenTox # Gauss kernel # @return [Float] def self.gauss(x, sigma = 0.3) - d = 1.0 - x + d = 1.0 - x.to_f Math.exp(-(d*d)/(2*sigma*sigma)) end diff --git a/lib/helper.rb b/lib/helper.rb index 3031b74..af92419 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -55,10 +55,7 @@ helpers do end end -end - -before do - unless !AA_SERVER or login_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) + def get_subjectid begin subjectid = nil subjectid = session[:subjectid] if session[:subjectid] @@ -69,31 +66,37 @@ before do subjectid = CGI.unescape(subjectid) if subjectid.include?("%23") @subjectid = subjectid rescue - #LOGGER.debug "OpenTox ruby api wrapper: helper before filter: NO subjectid for URI: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" - subjectid = "" + subjectid = nil end - @subjectid = subjectid - protected!(subjectid) - - extension = File.extname(request.path_info) # params[:id] is not yet available + end + def get_extension + extension = File.extname(request.path_info) unless extension.empty? - #request.path_info.sub!(/\.#{extension}$/,'') - case extension - when "html" - @accept = 'text/html' - when "yaml" - @accept = 'application/x-yaml' - when "csv" - @accept = 'text/csv' - when "rdfxml" - @accept = 'application/rdf+xml' - when "xls" - @accept = 'application/ms-excel' - else - halt 404, "File format #{extension} not supported." - end - end - + case extension.gsub(".","") + when "html" + @accept = 'text/html' + when "yaml" + @accept = 'application/x-yaml' + when "csv" + @accept = 'text/csv' + when "rdfxml" + @accept = 'application/rdf+xml' + when "xls" + @accept = 'application/ms-excel' + when "css" + @accept = 'text/css' + else + # halt 404, "File format #{extension} not supported." + end + end + end +end + +before do + @subjectid = get_subjectid() + @accept = get_extension() + unless !AA_SERVER or login_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) + protected!(@subjectid) end end diff --git a/lib/model.rb b/lib/model.rb index 74408d8..c46f2a0 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -113,9 +113,10 @@ module OpenTox # @param [optional,Hash] params Parameters for the lazar algorithm (OpenTox::Algorithm::Lazar) # @return [OpenTox::Model::Lazar] lazar model def self.create(params) + subjectid = params[:subjectid] lazar_algorithm = OpenTox::Algorithm::Generic.new File.join( CONFIG[:services]["opentox-algorithm"],"lazar") model_uri = lazar_algorithm.run(params) - OpenTox::Model::Lazar.find(model_uri, params[:subjectid]) + OpenTox::Model::Lazar.find(model_uri, subjectid) end # Get a parameter value -- cgit v1.2.3 From d0a2babc27dd0545c0a8a9465dd03ae247151aa4 Mon Sep 17 00:00:00 2001 From: mr Date: Fri, 8 Apr 2011 15:37:01 +0200 Subject: A&A fixes --- lib/dataset.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 93fce18..0a2f770 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -163,8 +163,8 @@ module OpenTox @features end - def feature_classes(feature) - if Feature.find(feature).feature_type == "classification" + def feature_classes(feature, subjectid=nil) + if Feature.find(feature, subjectid).feature_type == "classification" classes = [] @data_entries.each do |c,e| e[feature].each { |v| classes << v.to_s } -- cgit v1.2.3 From 796614bf4431d3560d6aae69de4793bdfa5a7b51 Mon Sep 17 00:00:00 2001 From: mr Date: Thu, 21 Apr 2011 13:27:53 +0200 Subject: subjectids for load_metadata in algorithm.rb and list_policies_uris changes in A&A --- lib/algorithm.rb | 12 ++++++------ lib/authorization.rb | 15 +++++++++++---- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 167c964..54ca064 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -52,9 +52,9 @@ module OpenTox class BBRC include Fminer # Initialize bbrc algorithm - def initialize + def initialize(subjectid=nil) super File.join(CONFIG[:services]["opentox-algorithm"], "fminer/bbrc") - load_metadata + load_metadata(subjectid) end end @@ -62,9 +62,9 @@ module OpenTox class LAST include Fminer # Initialize last algorithm - def initialize + def initialize(subjectid=nil) super File.join(CONFIG[:services]["opentox-algorithm"], "fminer/last") - load_metadata + load_metadata(subjectid) end end @@ -74,9 +74,9 @@ module OpenTox class Lazar include Algorithm # Initialize lazar algorithm - def initialize + def initialize(subjectid=nil) super File.join(CONFIG[:services]["opentox-algorithm"], "lazar") - load_metadata + load_metadata(subjectid) end end diff --git a/lib/authorization.rb b/lib/authorization.rb index eab20df..d9f900b 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -137,16 +137,23 @@ module OpenTox # Lists policies alongside with affected uris # @param [String] subjectid # @return [Hash] keys: all policies of the subjectid owner, values: uris affected by those policies - def self.list_policy_uris( subjectid ) + def self.list_policies_uris( subjectid ) names = list_policies(subjectid) policies = {} names.each do |n| - p = OpenTox::Policies.new - p.load_xml( list_policy(n, subjectid) ) - policies[n] = p.uris + policies[n] = list_policy_uris( n, subjectid ) end policies end + + # Lists policies alongside with affected uris + # @param [String] subjectid + # @return [Hash] keys: all policies of the subjectid owner, values: uris affected by those policies + def self.list_policy_uris( policy, subjectid ) + p = OpenTox::Policies.new + p.load_xml( list_policy(policy, subjectid) ) + p.uris + end #Returns the owner (who created the first policy) of an URI # @param [String, String]uri,subjectid -- cgit v1.2.3 From 60d48b6a31fdc9aa80243d2e1e072f069bdc2799 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 28 Apr 2011 03:55:53 -0700 Subject: Removed redis-server start call. --- lib/environment.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/environment.rb b/lib/environment.rb index 59578c1..ffc4f60 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -23,7 +23,7 @@ else end # database -`redis-server /opt/redis/redis.conf` unless File.exists? "/var/run/redis.pid" +#`redis-server /opt/redis/redis.conf` unless File.exists? "/var/run/redis.pid" # removed by AM Ohm.connect :thread_safe => true # load mail settings for error messages -- cgit v1.2.3 From 8500b7de67afaa34675c006bff42768f1229e22e Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 2 May 2011 15:00:31 +0200 Subject: fix file type in helper --- lib/helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/helper.rb b/lib/helper.rb index 3031b74..7009082 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -90,7 +90,7 @@ before do when "xls" @accept = 'application/ms-excel' else - halt 404, "File format #{extension} not supported." + #halt 404, "File format #{extension} not supported." end end -- cgit v1.2.3 From 5f62bb414dc8345c416623c9435779c16c21c189 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 3 May 2011 14:34:03 +0200 Subject: add validation gems to opentox-ruby --- Rakefile | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 215aeb2..3d8f2d5 100644 --- a/Rakefile +++ b/Rakefile @@ -30,7 +30,16 @@ begin "ohm", "ohm-contrib", "SystemTimer", - "rjb" + "rjb", + #valiation-gems + "dm-core", + "dm-serializer", + "dm-timestamps", + "dm-types", + "dm-migrations", + "dm-validations", + "dm-sqlite-adapter", + "benchmark" ].each { |dep| gem.add_dependency dep } =begin [ "dm-core", @@ -42,7 +51,10 @@ begin "dm-validations", ].each {|dep| gem.add_dependency dep, ">= 1" } =end + #valiation-gem gem.add_dependency "haml", ">=3" + # validation-gems + gem.add_dependency "ruby-plot", "=0.0.2" ['jeweler'].each { |dep| gem.add_development_dependency dep } gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] end -- cgit v1.2.3 From c4d63fc2430caaed39e230e14db7e043642fbd50 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 3 May 2011 15:26:52 +0200 Subject: remove not-existing gem benchmark --- Rakefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index 3d8f2d5..d238a5b 100644 --- a/Rakefile +++ b/Rakefile @@ -38,8 +38,7 @@ begin "dm-types", "dm-migrations", "dm-validations", - "dm-sqlite-adapter", - "benchmark" + "dm-sqlite-adapter" ].each { |dep| gem.add_dependency dep } =begin [ "dm-core", -- cgit v1.2.3 From 612db56ce522a632414158917c2462fe40c242dc Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 4 May 2011 15:27:01 +0200 Subject: use task-status-code from task-service (to fix inconsistent task status codes) --- lib/overwrite.rb | 14 +++++++++----- lib/task.rb | 2 ++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index fbe775d..fffcb14 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -39,20 +39,24 @@ end class Sinatra::Base def return_task( task ) - code = task.running? ? 202 : 200 + raise "http_code == nil" unless task.http_code!=nil case request.env['HTTP_ACCEPT'] when /rdf/ response['Content-Type'] = "application/rdf+xml" - halt code,task.to_rdfxml + halt task.http_code,task.to_rdfxml when /yaml/ response['Content-Type'] = "application/x-yaml" - halt code,task.to_yaml # PENDING differs from task-webservice + halt task.http_code,task.to_yaml # PENDING differs from task-webservice when /html/ response['Content-Type'] = "text/html" - halt code,OpenTox.text_to_html(task.to_yaml, @subjectid) + halt task.http_code,OpenTox.text_to_html(task.to_yaml, @subjectid) else # default /uri-list/ response['Content-Type'] = "text/uri-list" - halt code,task.uri+"\n" + if task.completed? + halt task.http_code,task.resultURI+"\n" + else + halt task.http_code,task.uri+"\n" + end end end end diff --git a/lib/task.rb b/lib/task.rb index 0ee3a11..19f42d6 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -8,6 +8,7 @@ module OpenTox def initialize(uri=nil) super uri + @http_code = 202 @metadata = { DC.title => "", DC.date => "", @@ -154,6 +155,7 @@ module OpenTox # not stored just for to_rdf def add_error_report( error_report ) + raise "not an error report: "+error_report.class.to_s unless error_report.is_a?(ErrorReport) @error_report = error_report end -- cgit v1.2.3 From 435540f4be8787e0c34a64a2d2d7ed3118be9de9 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 5 May 2011 07:17:04 +0200 Subject: Fixed activity output --- lib/algorithm.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 54ca064..008e7fe 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -215,7 +215,7 @@ module OpenTox LOGGER.debug "Predicting ..." @r.eval "p<-predict(model,sims)[1,1]" prediction = 10**(@r.p.to_f) - LOGGER.debug "Prediction is: '" + @prediction.to_s + "'." + LOGGER.debug "Prediction is: '" + prediction.to_s + "'." @r.quit # free R end confidence = conf/neighbors.size if neighbors.size > 0 -- cgit v1.2.3 From 4e01933dda7b56049f1c1216cb5895b10c10b4a4 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 6 May 2011 13:18:28 +0000 Subject: request features in YAML format first (Dataset.load_features), chomp URIs in Dataset.all) --- lib/dataset.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index c61d86f..546eb2e 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -74,7 +74,7 @@ module OpenTox # @param [optional,String] uri URI of the dataset service, defaults to service specified in configuration # @return [Array] Array of dataset object without data (use one of the load_* methods to pull data from the server) def self.all(uri=CONFIG[:services]["opentox-dataset"], subjectid=nil) - RestClientWrapper.get(uri,{:accept => "text/uri-list",:subjectid => subjectid}).to_s.each_line.collect{|u| Dataset.new(u, subjectid)} + RestClientWrapper.get(uri,{:accept => "text/uri-list",:subjectid => subjectid}).to_s.each_line.collect{|u| Dataset.new(u.chomp, subjectid)} end # Load YAML representation into the dataset @@ -158,8 +158,12 @@ module OpenTox # Load and return only features from the dataset service # @return [Hash] Features of the dataset def load_features(subjectid=nil) - parser = Parser::Owl::Dataset.new(@uri, subjectid) - @features = parser.load_features(subjectid) + if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) + @features = YAML.load(RestClientWrapper.get(File.join(@uri,"features"), {:accept => "application/x-yaml", :subjectid => subjectid})) + else + parser = Parser::Owl::Dataset.new(@uri, subjectid) + @features = parser.load_features(subjectid) + end @features end -- cgit v1.2.3 From 0edca0616624ab9711b3791bbb7697a676e0b141 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 6 May 2011 17:01:27 +0200 Subject: fix specificity (was 1-specificity) in cv-summary, (added training-test-split to validation object) --- lib/validation.rb | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/lib/validation.rb b/lib/validation.rb index a47a554..8fa95bb 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -12,6 +12,29 @@ module OpenTox val end + # creates a training test split validation, waits until it finishes, may take some time + # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,split_ratio(0.67),random_seed(1)) + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::Validation] + def self.create_training_test_split( params, subjectid=nil, waiting_task=nil ) + params[:subjectid] = subjectid if subjectid + uri = OpenTox::RestClientWrapper.post( File.join(CONFIG[:services]["opentox-validation"],"training_test_split"), + params,{:content_type => "text/uri-list"},waiting_task ) + Validation.new(uri) + end + + # looks for report for this validation, creates a report if no report is found + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [String] report uri + def find_or_create_report( subjectid=nil, waiting_task=nil ) + @report = ValidationReport.find_for_validation(@uri, subjectid) unless @report + @report = ValidationReport.create(@uri, subjectid, waiting_task) unless @report + @report.uri + end + + # creates a validation object from crossvaldiation statistics, raise error if not found # (as crossvaldiation statistics are returned as an average valdidation over all folds) # @param [String] crossvalidation uri @@ -42,7 +65,7 @@ module OpenTox res[:true_negatives] = s[OT.numTrueNegatives] res[:false_negatives] = s[OT.numFalseNegatives] res[:sensitivity] = s[OT.truePositiveRate] - res[:specificity] = s[OT.falsePositiveRate] + res[:specificity] = s[OT.trueNegativeRate] break end end @@ -110,6 +133,16 @@ module OpenTox class ValidationReport include OpenTox + # finds ValidationReport via uri, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::ValidationReport] + def self.find( uri, subjectid=nil ) + # PENDING load report data? + OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) + ValidationReport.new(uri) + end + # finds ValidationReport for a particular validation # @param [String] crossvalidation uri # @param [String,optional] subjectid @@ -120,6 +153,17 @@ module OpenTox uris.size==0 ? nil : ValidationReport.new(uris[-1]) end + # creates a validation report via validation + # @param [String] validation uri + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::ValidationReport] + def self.create( validation_uri, subjectid=nil, waiting_task=nil ) + uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/validation"), + { :validation_uris => validation_uri, :subjectid => subjectid }, {}, waiting_task ) + ValidationReport.new(uri) + end + end class CrossvalidationReport -- cgit v1.2.3 From b893941bc58260e2dd88d6d78433b65ba1dbe45b Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 6 May 2011 19:28:20 +0200 Subject: minor fixes: missing-values when splitting datasets, timeout handled in rest-client-wrapper --- lib/dataset.rb | 2 +- lib/rest_client_wrapper.rb | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 0a2f770..2b5759e 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -293,7 +293,7 @@ module OpenTox else compounds.each do |c| features.each do |f| - unless @data_entries[c][f] + if @data_entries[c]==nil or @data_entries[c][f]==nil dataset.add(c,f,nil) else @data_entries[c][f].each do |v| diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index dac24dc..747a353 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -98,6 +98,8 @@ module OpenTox rescue RestClient::RequestTimeout => ex received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue Errno::ETIMEDOUT => ex + received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} rescue Errno::ECONNREFUSED => ex received_error ex.message, 500, nil, {:rest_uri => uri, :headers => headers, :payload => payload} rescue RestClient::ExceptionWithResponse => ex -- cgit v1.2.3 From 0f1e80c3dcbbbc0d8b2f916de68d6d0c86b53ec2 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 6 May 2011 19:29:55 +0200 Subject: read acceptValue from ambit datasets, set acceptValue when create dataset from csv/excel --- lib/feature.rb | 13 ------------- lib/parser.rb | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/lib/feature.rb b/lib/feature.rb index f6e2dfd..b631e46 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -16,19 +16,6 @@ module OpenTox feature end - # provides domain (possible target values) of classification feature - # @return [Array] list with possible target values - def domain - if metadata[OT.acceptValue] - raise "accept value found, remove hack and implement correctly" - else - if @uri=~/feature\/26221/ || @uri=~/feature\/221726/ - return ["mutagen" , "nonmutagen"] - end - return [true, false] - end - end - # provides feature type, possible types are "regression" or "classification" # @return [String] feature type, unknown if OT.isA property is unknown/ not set def feature_type diff --git a/lib/parser.rb b/lib/parser.rb index db746c1..7bdee95 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -163,6 +163,7 @@ module OpenTox data = {} feature_values = {} feature = {} + feature_accept_values = {} other_statements = {} `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| triple = line.chomp.split(' ',3) @@ -182,6 +183,9 @@ module OpenTox if triple[2]=~/#{OT.Compound}/i and !data[triple[0]] data[triple[0]] = {:compound => triple[0], :values => []} end + when /#{OT.acceptValue}/i # acceptValue in ambit datasets is only provided in dataset/ no in dataset//features + feature_accept_values[triple[0]] = [] unless feature_accept_values[triple[0]] + feature_accept_values[triple[0]] << triple[2] else end end @@ -192,20 +196,25 @@ module OpenTox @dataset.add_compound(entry[:compound]) else entry[:values].each do |value_id| - split = feature_values[value_id].split(/\^\^/) - case split[-1] - when XSD.double, XSD.float - value = split.first.to_f - when XSD.boolean - value = split.first=~/(?i)true/ ? true : false - else - value = split.first + if feature_values[value_id] + split = feature_values[value_id].split(/\^\^/) + case split[-1] + when XSD.double, XSD.float + value = split.first.to_f + when XSD.boolean + value = split.first=~/(?i)true/ ? true : false + else + value = split.first + end end @dataset.add entry[:compound],feature[value_id],value end end end load_features subjectid + feature_accept_values.each do |feature, values| + @dataset.features[feature][OT.acceptValue] = values + end @dataset.metadata = load_metadata(subjectid) @dataset end @@ -348,16 +357,23 @@ module OpenTox when OT.NominalFeature case value.to_s when TRUE_REGEXP - @dataset.add(compound.uri, feature, true ) + val = true when FALSE_REGEXP - @dataset.add(compound.uri, feature, false ) + val = false end when OT.NumericFeature - @dataset.add compound.uri, feature, value.to_f + val = value.to_f when OT.StringFeature - @dataset.add compound.uri, feature, value.to_s + val = value.to_s @activity_errors << smiles+", "+row.join(", ") end + if val!=nil + @dataset.add(compound.uri, feature, val) + if type!=OT.NumericFeature + @dataset.features[feature][OT.acceptValue] = [] unless @dataset.features[feature][OT.acceptValue] + @dataset.features[feature][OT.acceptValue] << val.to_s unless @dataset.features[feature][OT.acceptValue].include?(val.to_s) + end + end end end -- cgit v1.2.3 From 4d8ca4a4d057a197dbfe34e16950ea5433e9819a Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 9 May 2011 14:01:44 +0200 Subject: add list method to validation and crossvalidation objects --- lib/validation.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/validation.rb b/lib/validation.rb index 8fa95bb..08dc4ab 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -12,6 +12,18 @@ module OpenTox val end + # returns a filtered list of validation uris + # @param [Hash,optional] params, validation-params to filter the uris (could be model, training_dataset, ..) + # @return [Array] + def self.list( params={} ) + filter_string = "" + params.each do |k,v| + filter_string = "?" if filter_string.length==0 + filter_string += k.to_s+"="+v + end + (OpenTox::RestClientWrapper.get(CONFIG[:services]["opentox-validation"]+filter_string).split("\n")) + end + # creates a training test split validation, waits until it finishes, may take some time # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,split_ratio(0.67),random_seed(1)) # @param [String,optional] subjectid @@ -95,6 +107,18 @@ module OpenTox cv.load_metadata( subjectid ) cv end + + # returns a filtered list of crossvalidation uris + # @param [Hash,optional] params, crossvalidation-params to filter the uris (could be algorithm, dataset, ..) + # @return [Array] + def self.list( params={} ) + filter_string = "" + params.each do |k,v| + filter_string = "?" if filter_string.length==0 + filter_string += k.to_s+"="+v + end + (OpenTox::RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"],"crossvalidation")+filter_string).split("\n")) + end # creates a crossvalidations, waits until it finishes, may take some time # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,num_folds(10),random_seed(1),stratified(false)) -- cgit v1.2.3 From 41851663e591433fec1b021b88aa77a8fb0d37b0 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Mon, 9 May 2011 05:53:09 -0700 Subject: Hotfix: Gaussian Decay for neighbors --- lib/algorithm.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 167c964..21a5729 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -165,7 +165,7 @@ module OpenTox # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required # @return [Hash] Hash with keys `:prediction, :confidence` def self.local_svm_regression(neighbors,params ) - sims = neighbors.collect{ |n| n[:similarity] } # similarity values between query and neighbors + sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values between query and neighbors conf = sims.inject{|sum,x| sum + x } acts = neighbors.collect do |n| act = n[:activity] -- cgit v1.2.3 From 88af0ff8e54406f6bd4322a2d0ea93ade2c5bbbd Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Mon, 9 May 2011 05:53:45 -0700 Subject: Hotfix: Gaussian Decay for neighbors --- lib/algorithm.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 008e7fe..abf10d4 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -165,7 +165,7 @@ module OpenTox # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required # @return [Hash] Hash with keys `:prediction, :confidence` def self.local_svm_regression(neighbors,params ) - sims = neighbors.collect{ |n| n[:similarity] } # similarity values between query and neighbors + sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values between query and neighbors conf = sims.inject{|sum,x| sum + x } acts = neighbors.collect do |n| act = n[:activity] -- cgit v1.2.3 From f999b42afbb4387d99b2c91a79f84654408cbab1 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 10 May 2011 08:29:27 +0200 Subject: Added bal --- lib/model.rb | 102 ++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 80 insertions(+), 22 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 048de85..9442897 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -23,7 +23,7 @@ module OpenTox # Generic OpenTox model class for all API compliant services class Generic include Model - + # Find Generic Opentox Model via URI, and loads metadata, could raise NotFound/NotAuthorized error # @param [String] uri Model URI # @return [OpenTox::Model::Generic] Model instance @@ -34,12 +34,12 @@ module OpenTox raise "could not load model metadata '"+uri.to_s+"'" if model.metadata==nil or model.metadata.size==0 model end - - # provides feature type, possible types are "regression" or "classification" - # @return [String] feature type, "unknown" if type could not be estimated + + # provides feature type, possible types are "regression" or "classification" + # @return [String] feature type, "unknown" if type could not be estimated def feature_type(subjectid=nil) return @feature_type if @feature_type - + # dynamically perform restcalls if necessary load_metadata(subjectid) if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) algorithm = OpenTox::Algorithm::Generic.find(@metadata[OT.algorithm], subjectid) @@ -60,9 +60,9 @@ module OpenTox raise "unknown model "+type_indicators.inspect unless @feature_type @feature_type end - + end - + # Lazy Structure Activity Relationship class class Lazar @@ -78,7 +78,7 @@ module OpenTox else super CONFIG[:services]["opentox-model"] end - + @metadata[OT.algorithm] = File.join(CONFIG[:services]["opentox-algorithm"],"lazar") @features = [] @@ -178,8 +178,59 @@ module OpenTox return @prediction_dataset if database_activity(subjectid) - neighbors - prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") + + # AM: Balancing, see http://www.maunz.de/wordpress/opentox/2011/balanced-lazar + l = Array.new # larger + s = Array.new # smaller fraction + if metadata[RDF.type] == [OTA.ClassificationLazySingleTarget] + @fingerprints.each do |training_compound,training_features| + @activities[training_compound].each do |act| + case act.to_s + when "false" + l << training_compound + when "true" + s << training_compound + else + LOGGER.warn "BLAZAR: Activity #{act.to_s} should not be reached." + end + end + end + if s.size > l.size then + l,s = s,l # happy swapping + LOGGER.info "BLAZAR: |s|=#{s.size}, |l|=#{l.size}." + end + # determine ratio + modulo = l.size.divmod(s.size)# modulo[0]=ratio, modulo[1]=rest + LOGGER.info "BLAZAR: Balance: #{modulo[0]}, rest #{modulo[1]}." + end + + # AM: Balanced predictions + addon = (modulo[1].to_f/modulo[0]).ceil # what will be added in each round + slack = modulo[1].divmod(addon)[1] # what remains for the last round + position = 0 + predictions = Array.new + + @collect_neighbors = {} + predictions = [] + for i in 1..modulo[0] do + (i == modulo[0]) && (slack>0) ? lr_size = s.size + slack : lr_size = s.size + addon # determine fraction + LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." + neighbors(s, l, position, lr_size) # get ratio fraction of larger part + predictions << eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") + position = position + lr_size + end + @neighbors = @collect_neighbors.values # AM: get all neighbors + + prediction={} + begin + p_sum=0.0 + predictions.each do |p| + p[:prediction] == false ? p_sum = p_sum - p[:confidence].to_f : p_sum = p_sum + p[:confidence].to_f + end + prediction = { :prediction => (p_sum<0.0 ? false : true), :confidence => p_sum.abs/predictions.size } # AM: get mean + rescue Exception => e + LOGGER.error "BLAZAR failed in prediction: "+e.class.to_s+": "+e.message + end prediction_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),@prediction_dataset.compounds.size.to_s) # TODO: fix dependentVariable @@ -269,23 +320,30 @@ module OpenTox end # Find neighbors and store them as object variable - def neighbors - + def neighbors(s=nil, l=nil, start=nil, offset=nil) @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm @neighbors = [] - @fingerprints.each do |training_compound,training_features| - sim = eval("#{@similarity_algorithm}(@compound_features,training_features,@p_values)") - if sim > @min_sim - @activities[training_compound].each do |act| - @neighbors << { - :compound => training_compound, - :similarity => sim, - :features => training_features, - :activity => act - } + begin + #@fingerprints.each do |training_compound,training_features| # AM: this is original by CH + [ l[start, offset ] , s ].flatten.each do |training_compound| # AM: access only a balanced subset + training_features = @fingerprints[training_compound] + sim = eval("#{@similarity_algorithm}(@compound_features,training_features,@p_values)") + if sim > @min_sim + @activities[training_compound].each do |act| + this_neighbor = { + :compound => training_compound, + :similarity => sim, + :features => training_features, + :activity => act + } + @neighbors << this_neighbor + @collect_neighbors[training_compound] = this_neighbor + end end end + rescue Exception => e + LOGGER.error "BLAZAR failed in neighbors: "+e.class.to_s+": "+e.message end end -- cgit v1.2.3 From 1d8c7d6dfa513cd7c8ad642248db24e0d1e3a199 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 10 May 2011 09:02:38 +0200 Subject: Using Best prediction only --- lib/model.rb | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 9442897..a4d6d85 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -210,28 +210,28 @@ module OpenTox position = 0 predictions = Array.new - @collect_neighbors = {} - predictions = [] + prediction_best=nil + neighbors_best=nil + + begin for i in 1..modulo[0] do (i == modulo[0]) && (slack>0) ? lr_size = s.size + slack : lr_size = s.size + addon # determine fraction LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." neighbors(s, l, position, lr_size) # get ratio fraction of larger part - predictions << eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") + prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") + if prediction[:confidence].abs > prediction_best[:confidence].abs || prediction_best.nil? + prediction_best=prediction + neighbors_best=@neighbors + end position = position + lr_size end - @neighbors = @collect_neighbors.values # AM: get all neighbors - - prediction={} - begin - p_sum=0.0 - predictions.each do |p| - p[:prediction] == false ? p_sum = p_sum - p[:confidence].to_f : p_sum = p_sum + p[:confidence].to_f - end - prediction = { :prediction => (p_sum<0.0 ? false : true), :confidence => p_sum.abs/predictions.size } # AM: get mean rescue Exception => e LOGGER.error "BLAZAR failed in prediction: "+e.class.to_s+": "+e.message end + prediction=prediction_best + @neighbors=neighbors_best + prediction_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),@prediction_dataset.compounds.size.to_s) # TODO: fix dependentVariable @prediction_dataset.metadata[OT.dependentVariables] = prediction_feature_uri @@ -338,7 +338,6 @@ module OpenTox :activity => act } @neighbors << this_neighbor - @collect_neighbors[training_compound] = this_neighbor end end end -- cgit v1.2.3 From 2af934ddc033d7d8a737d88eb4ee175955ad4a0a Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 10 May 2011 11:11:34 +0200 Subject: Fixed first prediction case --- lib/model.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/model.rb b/lib/model.rb index a4d6d85..3d64f32 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -219,7 +219,7 @@ module OpenTox LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." neighbors(s, l, position, lr_size) # get ratio fraction of larger part prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") - if prediction[:confidence].abs > prediction_best[:confidence].abs || prediction_best.nil? + if prediction_best.nil? || prediction[:confidence].abs > prediction_best[:confidence].abs prediction_best=prediction neighbors_best=@neighbors end -- cgit v1.2.3 From 51cb900375a575208cd210da5093773d9e10cfdd Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 10 May 2011 12:23:19 +0200 Subject: minor fix: load metadata when 'find'ing a report in validation.rb --- lib/validation.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/validation.rb b/lib/validation.rb index 08dc4ab..d58d36e 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -46,7 +46,6 @@ module OpenTox @report.uri end - # creates a validation object from crossvaldiation statistics, raise error if not found # (as crossvaldiation statistics are returned as an average valdidation over all folds) # @param [String] crossvalidation uri @@ -162,9 +161,10 @@ module OpenTox # @param [String,optional] subjectid # @return [OpenTox::ValidationReport] def self.find( uri, subjectid=nil ) - # PENDING load report data? OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) - ValidationReport.new(uri) + rep = ValidationReport.new(uri) + rep.load_metadata( subjectid ) + rep end # finds ValidationReport for a particular validation @@ -200,7 +200,9 @@ module OpenTox def self.find( uri, subjectid=nil ) # PENDING load report data? OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) - CrossvalidationReport.new(uri) + rep = CrossvalidationReport.new(uri) + rep.load_metadata( subjectid ) + rep end # finds CrossvalidationReport for a particular crossvalidation -- cgit v1.2.3 From 305f3caa692dd977df07cbc5ec195521e2a135fa Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 10 May 2011 16:43:05 +0200 Subject: Added Gauss patch --- lib/algorithm.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 008e7fe..abf10d4 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -165,7 +165,7 @@ module OpenTox # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required # @return [Hash] Hash with keys `:prediction, :confidence` def self.local_svm_regression(neighbors,params ) - sims = neighbors.collect{ |n| n[:similarity] } # similarity values between query and neighbors + sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values between query and neighbors conf = sims.inject{|sum,x| sum + x } acts = neighbors.collect do |n| act = n[:activity] -- cgit v1.2.3 From 524a68d8429b8adc16bd8073774f9305cb7138a0 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 11 May 2011 12:13:37 +0200 Subject: Added balance patch --- lib/parser.rb | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/parser.rb b/lib/parser.rb index db746c1..dc5f675 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -348,16 +348,27 @@ module OpenTox when OT.NominalFeature case value.to_s when TRUE_REGEXP - @dataset.add(compound.uri, feature, true ) + #@dataset.add(compound.uri, feature, true ) + val=true when FALSE_REGEXP - @dataset.add(compound.uri, feature, false ) + #@dataset.add(compound.uri, feature, false ) + val=false end when OT.NumericFeature - @dataset.add compound.uri, feature, value.to_f + #@dataset.add compound.uri, feature, value.to_f + val = value.to_f when OT.StringFeature - @dataset.add compound.uri, feature, value.to_s + #@dataset.add compound.uri, feature, value.to_s + val = value.to_s @activity_errors << smiles+", "+row.join(", ") end + if val!=nil + @dataset.add(compound.uri, feature, val) + if type!=OT.NumericFeature + @dataset.features[feature][OT.acceptValue] = [] unless @dataset.features[feature][OT.acceptValue] + @dataset.features[feature][OT.acceptValue] << val.to_s unless @dataset.features[feature][OT.acceptValue].include?(val.to_s) + end + end end end -- cgit v1.2.3 From 03a87a832162ccf17b6f0ebfda126e3622530ca3 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 11 May 2011 15:56:55 +0200 Subject: Further Martin patch --- lib/feature.rb | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/feature.rb b/lib/feature.rb index f6e2dfd..eb0b869 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -19,14 +19,7 @@ module OpenTox # provides domain (possible target values) of classification feature # @return [Array] list with possible target values def domain - if metadata[OT.acceptValue] - raise "accept value found, remove hack and implement correctly" - else - if @uri=~/feature\/26221/ || @uri=~/feature\/221726/ - return ["mutagen" , "nonmutagen"] - end - return [true, false] - end + return [true, false] end # provides feature type, possible types are "regression" or "classification" -- cgit v1.2.3 From c6d34021f92610ff7dfcc72473c09ba08586687a Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 12 May 2011 12:39:47 +0200 Subject: set accept-header via html-param ?media=asdf (analogous to ambits services) --- lib/overwrite.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index fffcb14..df4e1b7 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -8,6 +8,7 @@ before { $url_provider = self # stupid internet explorer does not ask for text/html, add this manually request.env['HTTP_ACCEPT'] += ";text/html" if request.env["HTTP_USER_AGENT"]=~/MSIE/ + request.env['HTTP_ACCEPT']=request.params["media"] if request.params["media"] } # Error handling -- cgit v1.2.3 From 8dd7fb5b440d02e6c2aea2d63ced2badc9b680f7 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 12 May 2011 12:41:32 +0200 Subject: move to ruby-plot version 0.0.3 --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index d238a5b..eb6504c 100644 --- a/Rakefile +++ b/Rakefile @@ -53,7 +53,7 @@ begin #valiation-gem gem.add_dependency "haml", ">=3" # validation-gems - gem.add_dependency "ruby-plot", "=0.0.2" + gem.add_dependency "ruby-plot", "=0.0.3" ['jeweler'].each { |dep| gem.add_development_dependency dep } gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] end -- cgit v1.2.3 From cb3c1dd486ba0a891c81886c1546553fc17f01b8 Mon Sep 17 00:00:00 2001 From: ch Date: Thu, 12 May 2011 16:58:14 +0000 Subject: RDF serialization of metadata fixed for multiple RDF.types --- lib/serializer.rb | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/serializer.rb b/lib/serializer.rb index 644a09f..e4cb541 100644 --- a/lib/serializer.rb +++ b/lib/serializer.rb @@ -26,6 +26,8 @@ module OpenTox OT.Algorithm => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.Parameter => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.Task => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OTA.PatternMiningSupervised => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + #classes for validation OT.Validation => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.ClassificationStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , @@ -40,10 +42,10 @@ module OpenTox OT.compound => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.feature => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.dataEntry => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.acceptValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.values => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.algorithm => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.parameters => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + #object props for validation# OT.model => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.trainingDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , @@ -73,6 +75,8 @@ module OpenTox OT.hasStatus => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.resultURI => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.percentageCompleted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.acceptValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + # annotation props for validation OT.numUnpredicted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.crossvalidationFold => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , @@ -256,7 +260,8 @@ module OpenTox def add_metadata(uri,metadata) id = 0 metadata.each do |u,v| - if v.is_a? Array and u == OT.parameters + #if v.is_a? Array and (u == OT.parameters or u == RDF.type) + if v.is_a? Array and u == OT.parameters#or u == RDF.type) @object[uri][u] = [] unless @object[uri][u] v.each do |value| id+=1 @@ -267,7 +272,13 @@ module OpenTox @object[genid][name] = [{"type" => type(entry), "value" => entry }] end end - else # v.is_a? String + elsif v.is_a? Array and u == RDF.type + @object[uri] = {} unless @object[uri] + v.each do |value| + @object[uri][u] = [] unless @object[uri][u] + @object[uri][u] << {"type" => type(value), "value" => value } + end + elsif v.is_a? String @object[uri] = {} unless @object[uri] @object[uri][u] = [{"type" => type(v), "value" => v }] end @@ -309,6 +320,7 @@ module OpenTox OT.value => v } @object[feature][RDF["type"]] << { "type" => "uri", "value" => featuretype(value) } + #@object[feature][RDF["type"]] = { "type" => "uri", "value" => featuretype(value) } end # Serializers -- cgit v1.2.3 From 2919ffefd4b762038d0dcb44ea64aa621674fff8 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 13 May 2011 08:58:56 +0200 Subject: reduce ruby-plot dependency to pessimistic version vonstraint (~>) --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index eb6504c..b2298e6 100644 --- a/Rakefile +++ b/Rakefile @@ -53,7 +53,7 @@ begin #valiation-gem gem.add_dependency "haml", ">=3" # validation-gems - gem.add_dependency "ruby-plot", "=0.0.3" + gem.add_dependency "ruby-plot", "~>0.3.0" ['jeweler'].each { |dep| gem.add_development_dependency dep } gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] end -- cgit v1.2.3 From 153a19bc26e1a9dac35d286b90037bfc9d0e9c6b Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 13 May 2011 11:46:08 +0200 Subject: catch nil error if delete with subjectid but without AA_SERVER is called --- lib/authorization.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index d9f900b..b23b92f 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -286,10 +286,12 @@ module OpenTox # @return [Boolean] def self.delete_policies_from_uri(uri, subjectid) policies = list_uri_policies(uri, subjectid) - policies.each do |policy| - ret = delete_policy(policy, subjectid) - LOGGER.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" - end + if policies + policies.each do |policy| + ret = delete_policy(policy, subjectid) + LOGGER.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" + end + end return true end -- cgit v1.2.3 From a494bcca5a51466191dcb4b3dd5101f21916a0cb Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 16 May 2011 14:47:37 +0200 Subject: move to ruby-plot 0.4 -> confidence values --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index b2298e6..08959b0 100644 --- a/Rakefile +++ b/Rakefile @@ -53,7 +53,7 @@ begin #valiation-gem gem.add_dependency "haml", ">=3" # validation-gems - gem.add_dependency "ruby-plot", "~>0.3.0" + gem.add_dependency "ruby-plot", "~>0.4.0" ['jeweler'].each { |dep| gem.add_development_dependency dep } gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] end -- cgit v1.2.3 From 5acd3b8cd36a0f5017e4858df3d4516876858324 Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 16 May 2011 15:53:03 +0200 Subject: remove internal administrative LDAP groups --- lib/authorization.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index b23b92f..288733a 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -227,7 +227,9 @@ module OpenTox begin resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/search") grps = resource.post(:admin => subjectid, :attributes_names => "objecttype", :attributes_values_objecttype => "group") - grps.split("\n").collect{|x| x.sub("string=","")} + grps = grps.split("\n").collect{|x| x.sub("string=","")} + grps.delete_if{|g|g=="MemberManagement"||g=="Webmasters"} + grps rescue [] end -- cgit v1.2.3 From 778df38c0991aef8de53702e8c6229dd6f43d1a2 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 16 May 2011 14:44:30 +0000 Subject: uri_available? fixed in helper.rb --- lib/helper.rb | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/lib/helper.rb b/lib/helper.rb index af92419..3a6126a 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -44,14 +44,8 @@ helpers do def uri_available?(urlStr) url = URI.parse(urlStr) - unless @subjectid - Net::HTTP.start(url.host, url.port) do |http| - return http.head(url.request_uri).code == "200" - end - else - Net::HTTP.start(url.host, url.port) do |http| - return http.post(url.request_uri, "subjectid=#{@subjectid}").code == "202" - end + Net::HTTP.start(url.host, url.port) do |http| + return http.head("#{url.request_uri}?subjectid=#{CGI.escape @subjectid}").code == "200" end end -- cgit v1.2.3 From 5c6cb977db89b12ddeb822eb09370c9ad32ad84b Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Mon, 16 May 2011 16:50:13 +0200 Subject: Fixed log taking (for exclusively positive values only) --- lib/algorithm.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index abf10d4..130d305 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -167,9 +167,17 @@ module OpenTox def self.local_svm_regression(neighbors,params ) sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values between query and neighbors conf = sims.inject{|sum,x| sum + x } + + # AM: Control log taking + take_logs=true + neighbors.each do |n| + if (! n[:activity].nil?) && (n[:activity].to_f < 0.0) + take_logs = false + end + end acts = neighbors.collect do |n| act = n[:activity] - Math.log10(act.to_f) + take_logs ? Math.log10(act.to_f) : act.to_f end # activities of neighbors for supervised learning neighbor_matches = neighbors.collect{ |n| n[:features] } # as in classification: URIs of matches -- cgit v1.2.3 From b247527ced213486629add9d8b5b739620a8abff Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Mon, 16 May 2011 17:28:59 +0200 Subject: Fixed exp --- lib/algorithm.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 130d305..7fbe0dc 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -222,7 +222,7 @@ module OpenTox @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" LOGGER.debug "Predicting ..." @r.eval "p<-predict(model,sims)[1,1]" - prediction = 10**(@r.p.to_f) + prediction = 10**(@r.p.to_f) if take_logs LOGGER.debug "Prediction is: '" + prediction.to_s + "'." @r.quit # free R end -- cgit v1.2.3 From b944a21b557b9628b3b6f7be990534b2f86f0884 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 17 May 2011 10:47:58 +0200 Subject: fix validation statistics: convert num predictions to integer --- lib/validation.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/validation.rb b/lib/validation.rb index d58d36e..1a2497b 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -65,7 +65,7 @@ module OpenTox def summary if @metadata[OT.classificationStatistics] res = { - :nr_predictions => @metadata[OT.numInstances] - @metadata[OT.numUnpredicted], + :nr_predictions => @metadata[OT.numInstances].to_i - @metadata[OT.numUnpredicted].to_i, :correct_predictions => @metadata[OT.classificationStatistics][OT.percentCorrect], :weighted_area_under_roc => @metadata[OT.classificationStatistics][OT.weightedAreaUnderRoc], } @@ -83,7 +83,7 @@ module OpenTox res elsif @metadata[OT.regressionStatistics] { - :nr_predictions => @metadata[OT.numInstances] - @metadata[OT.numUnpredicted], + :nr_predictions => @metadata[OT.numInstances].to_i - @metadata[OT.numUnpredicted].to_i, :r_square => @metadata[OT.regressionStatistics][OT.rSquare], :root_mean_squared_error => @metadata[OT.regressionStatistics][OT.rootMeanSquaredError], :mean_absolute_error => @metadata[OT.regressionStatistics][OT.meanAbsoluteError], -- cgit v1.2.3 From 37a066e4cfe102d2e4edfaf3b4b9787bcbb3206f Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 17 May 2011 16:08:25 +0200 Subject: Initial version --- lib/algorithm.rb | 62 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 7fbe0dc..16372ea 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -164,11 +164,7 @@ module OpenTox # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required # @return [Hash] Hash with keys `:prediction, :confidence` - def self.local_svm_regression(neighbors,params ) - sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values between query and neighbors - conf = sims.inject{|sum,x| sum + x } - - # AM: Control log taking + def self.local_svm_regression(neighbors, params) take_logs=true neighbors.each do |n| if (! n[:activity].nil?) && (n[:activity].to_f < 0.0) @@ -180,10 +176,51 @@ module OpenTox take_logs ? Math.log10(act.to_f) : act.to_f end # activities of neighbors for supervised learning - neighbor_matches = neighbors.collect{ |n| n[:features] } # as in classification: URIs of matches + sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors + prediction = local_sv_machine (neighbors, acts, sims, "svr", params) + prediction = take_logs ? 10**(prediction.to_f) : prediction.to_f + LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + + conf = sims.inject{|sum,x| sum + x } + confidence = conf/neighbors.size if neighbors.size > 0 + {:prediction => prediction, :confidence => confidence} + + end + + # Local support vector classification from neighbors + # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` + # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required + # @return [Hash] Hash with keys `:prediction, :confidence` + def self.local_svm_classification(neighbors, params) + acts = neighbors.collect do |n| + act = n[:activity] + end # activities of neighbors for supervised learning + + sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors + prediction = local_sv_machine (neighbors, acts, sims, "svc", params) + prediction = prediction.to_f + LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + + conf = sims.inject{|sum,x| sum + x } + confidence = conf/neighbors.size if neighbors.size > 0 + {:prediction => prediction, :confidence => confidence} + + end + + end + + # Local support vector prediction. Not to be called directly (use local_svm_regression or local_svm_classification. + # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` + # @param [Array] acts, activities for neighbors. + # @param [Array] sims, similarities for neighbors. + # @param [String] type, one of "svr" (regression) or "svc" (classification). + # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required + # @return [Numeric] A prediction value. + def self.local_sv_machine(neighbors, acts, sims, type, params) + neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel if neighbor_matches.size == 0 - raise "No neighbors found" + raise "No neighbors found." else # gram matrix (0..(neighbor_matches.length-1)).each do |i| @@ -216,21 +253,16 @@ module OpenTox # model + support vectors LOGGER.debug "Creating SVM model ..." - @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-svr\", nu=0.8)" + @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.5)" @r.eval "sv<-as.vector(SVindex(model))" @r.eval "sims<-sims[sv]" @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" LOGGER.debug "Predicting ..." @r.eval "p<-predict(model,sims)[1,1]" - prediction = 10**(@r.p.to_f) if take_logs - LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + prediction = @r.p @r.quit # free R end - confidence = conf/neighbors.size if neighbors.size > 0 - {:prediction => prediction, :confidence => confidence} - - end - + prediction end module Substructure -- cgit v1.2.3 From 0e49be4d0ed4752d5988ed651d813f001e42c05b Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 17 May 2011 16:35:20 +0200 Subject: Fixed method scope --- lib/algorithm.rb | 110 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 16372ea..0a5b09f 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -177,7 +177,7 @@ module OpenTox end # activities of neighbors for supervised learning sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors - prediction = local_sv_machine (neighbors, acts, sims, "svr", params) + prediction = local_svm(neighbors, acts, sims, "svr", params) prediction = take_logs ? 10**(prediction.to_f) : prediction.to_f LOGGER.debug "Prediction is: '" + prediction.to_s + "'." @@ -197,7 +197,7 @@ module OpenTox end # activities of neighbors for supervised learning sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors - prediction = local_sv_machine (neighbors, acts, sims, "svc", params) + prediction = local_svm (neighbors, acts, sims, "svc", params) prediction = prediction.to_f LOGGER.debug "Prediction is: '" + prediction.to_s + "'." @@ -207,62 +207,64 @@ module OpenTox end - end - # Local support vector prediction. Not to be called directly (use local_svm_regression or local_svm_classification. - # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` - # @param [Array] acts, activities for neighbors. - # @param [Array] sims, similarities for neighbors. - # @param [String] type, one of "svr" (regression) or "svc" (classification). - # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required - # @return [Numeric] A prediction value. - def self.local_sv_machine(neighbors, acts, sims, type, params) - neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches - gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel - if neighbor_matches.size == 0 - raise "No neighbors found." - else - # gram matrix - (0..(neighbor_matches.length-1)).each do |i| - gram_matrix[i] = [] unless gram_matrix[i] - # upper triangle - ((i+1)..(neighbor_matches.length-1)).each do |j| - sim = eval("#{params[:similarity_algorithm]}(neighbor_matches[i], neighbor_matches[j], params[:p_values])") - gram_matrix[i][j] = Algorithm.gauss(sim) - gram_matrix[j] = [] unless gram_matrix[j] - gram_matrix[j][i] = gram_matrix[i][j] # lower triangle + # Local support vector prediction from neighbors. + # Not to be called directly (use local_svm_regression or local_svm_classification. + # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` + # @param [Array] acts, activities for neighbors. + # @param [Array] sims, similarities for neighbors. + # @param [String] type, one of "svr" (regression) or "svc" (classification). + # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required + # @return [Numeric] A prediction value. + def self.local_svm(neighbors, acts, sims, type, params) + neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches + gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel + if neighbor_matches.size == 0 + raise "No neighbors found." + else + # gram matrix + (0..(neighbor_matches.length-1)).each do |i| + gram_matrix[i] = [] unless gram_matrix[i] + # upper triangle + ((i+1)..(neighbor_matches.length-1)).each do |j| + sim = eval("#{params[:similarity_algorithm]}(neighbor_matches[i], neighbor_matches[j], params[:p_values])") + gram_matrix[i][j] = Algorithm.gauss(sim) + gram_matrix[j] = [] unless gram_matrix[j] + gram_matrix[j][i] = gram_matrix[i][j] # lower triangle + end + gram_matrix[i][i] = 1.0 end - gram_matrix[i][i] = 1.0 - end - #LOGGER.debug gram_matrix.to_yaml - @r = RinRuby.new(false,false) # global R instance leads to Socket errors after a large number of requests - @r.eval "library('kernlab')" # this requires R package "kernlab" to be installed - LOGGER.debug "Setting R data ..." - # set data - @r.gram_matrix = gram_matrix.flatten - @r.n = neighbor_matches.size - @r.y = acts - @r.sims = sims + #LOGGER.debug gram_matrix.to_yaml + @r = RinRuby.new(false,false) # global R instance leads to Socket errors after a large number of requests + @r.eval "library('kernlab')" # this requires R package "kernlab" to be installed + LOGGER.debug "Setting R data ..." + # set data + @r.gram_matrix = gram_matrix.flatten + @r.n = neighbor_matches.size + @r.y = acts + @r.sims = sims + + LOGGER.debug "Preparing R data ..." + # prepare data + @r.eval "y<-as.vector(y)" + @r.eval "gram_matrix<-as.kernelMatrix(matrix(gram_matrix,n,n))" + @r.eval "sims<-as.vector(sims)" + + # model + support vectors + LOGGER.debug "Creating SVM model ..." + @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.5)" + @r.eval "sv<-as.vector(SVindex(model))" + @r.eval "sims<-sims[sv]" + @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" + LOGGER.debug "Predicting ..." + @r.eval "p<-predict(model,sims)[1,1]" + prediction = @r.p + @r.quit # free R + end + prediction + end - LOGGER.debug "Preparing R data ..." - # prepare data - @r.eval "y<-as.vector(y)" - @r.eval "gram_matrix<-as.kernelMatrix(matrix(gram_matrix,n,n))" - @r.eval "sims<-as.vector(sims)" - - # model + support vectors - LOGGER.debug "Creating SVM model ..." - @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.5)" - @r.eval "sv<-as.vector(SVindex(model))" - @r.eval "sims<-sims[sv]" - @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" - LOGGER.debug "Predicting ..." - @r.eval "p<-predict(model,sims)[1,1]" - prediction = @r.p - @r.quit # free R - end - prediction end module Substructure -- cgit v1.2.3 From 4372e80a38c5228f3b7d0372f92195e62500b743 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 17 May 2011 16:40:12 +0200 Subject: Add debug --- lib/algorithm.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 0a5b09f..ec5748d 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -178,7 +178,8 @@ module OpenTox sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors prediction = local_svm(neighbors, acts, sims, "svr", params) - prediction = take_logs ? 10**(prediction.to_f) : prediction.to_f + LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + prediction = (take_logs ? 10**(prediction.to_f) : prediction.to_f) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." conf = sims.inject{|sum,x| sum + x } -- cgit v1.2.3 From cf6d40be3f31d473f69216f1453e2ca0ddf82130 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 17 May 2011 16:46:26 +0200 Subject: nu 0.8 again to pass tests --- lib/algorithm.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index ec5748d..4cb80e3 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -254,7 +254,7 @@ module OpenTox # model + support vectors LOGGER.debug "Creating SVM model ..." - @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.5)" + @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.8)" @r.eval "sv<-as.vector(SVindex(model))" @r.eval "sims<-sims[sv]" @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" -- cgit v1.2.3 From 4081ac06ddf8dafeebc93dfc28c4ef54f64a844d Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 18 May 2011 17:57:37 +0200 Subject: add opentox object for new algorithm comparison report --- lib/validation.rb | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/lib/validation.rb b/lib/validation.rb index 1a2497b..d7a337c 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -198,7 +198,6 @@ module OpenTox # @param [String,optional] subjectid # @return [OpenTox::CrossvalidationReport] def self.find( uri, subjectid=nil ) - # PENDING load report data? OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) rep = CrossvalidationReport.new(uri) rep.load_metadata( subjectid ) @@ -227,6 +226,54 @@ module OpenTox end end + + class AlgorithmComparisonReport + include OpenTox + + # finds AlgorithmComparisonReport via uri, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::CrossvalidationReport] + def self.find( uri, subjectid=nil ) + OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) + rep = AlgorithmComparisonReport.new(uri) + rep.load_metadata( subjectid ) + rep + end + + # finds AlgorithmComparisonReport for a particular crossvalidation + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @return [OpenTox::AlgorithmComparisonReport] nil if no report found + def self.find_for_crossvalidation( crossvalidation_uri, subjectid=nil ) + uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], + "/report/algorithm_comparison?crossvalidation="+crossvalidation_uri), {:subjectid => subjectid}).chomp.split("\n") + uris.size==0 ? nil : AlgorithmComparisonReport.new(uris[-1]) + end + + # creates a crossvalidation report via crossvalidation + # @param [Hash] crossvalidation uri_hash, see example + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::AlgorithmComparisonReport] + # example for hash: + # { :lazar-bbrc => [ http://host/validation/crossvalidation/x1, http://host/validation/crossvalidation/x2 ], + # :lazar-last => [ http://host/validation/crossvalidation/xy, http://host/validation/crossvalidation/xy ] } + def self.create( crossvalidation_uri_hash, subjectid=nil, waiting_task=nil ) + identifier = [] + validation_uris = [] + crossvalidation_uri_hash.each do |id, uris| + uris.each do |uri| + identifier << id + validation_uris << uri + end + end + uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/algorithm_comparison"), + { :validation_uris => validation_uris.join(","), :identifier => identifier.join(","), :subjectid => subjectid }, {}, waiting_task ) + AlgorithmComparisonReport.new(uri) + end + end + class QMRFReport include OpenTox -- cgit v1.2.3 From 96f00f67be05da4eed147928254af6e3f6f0f03d Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 17 May 2011 10:47:58 +0200 Subject: fix validation statistics: convert num predictions to integer --- lib/validation.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/validation.rb b/lib/validation.rb index d58d36e..1a2497b 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -65,7 +65,7 @@ module OpenTox def summary if @metadata[OT.classificationStatistics] res = { - :nr_predictions => @metadata[OT.numInstances] - @metadata[OT.numUnpredicted], + :nr_predictions => @metadata[OT.numInstances].to_i - @metadata[OT.numUnpredicted].to_i, :correct_predictions => @metadata[OT.classificationStatistics][OT.percentCorrect], :weighted_area_under_roc => @metadata[OT.classificationStatistics][OT.weightedAreaUnderRoc], } @@ -83,7 +83,7 @@ module OpenTox res elsif @metadata[OT.regressionStatistics] { - :nr_predictions => @metadata[OT.numInstances] - @metadata[OT.numUnpredicted], + :nr_predictions => @metadata[OT.numInstances].to_i - @metadata[OT.numUnpredicted].to_i, :r_square => @metadata[OT.regressionStatistics][OT.rSquare], :root_mean_squared_error => @metadata[OT.regressionStatistics][OT.rootMeanSquaredError], :mean_absolute_error => @metadata[OT.regressionStatistics][OT.meanAbsoluteError], -- cgit v1.2.3 From d755a131a5636f4fbe6077de5a276faf84c325b1 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 17 May 2011 16:08:25 +0200 Subject: Initial version --- lib/algorithm.rb | 62 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 7fbe0dc..16372ea 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -164,11 +164,7 @@ module OpenTox # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required # @return [Hash] Hash with keys `:prediction, :confidence` - def self.local_svm_regression(neighbors,params ) - sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values between query and neighbors - conf = sims.inject{|sum,x| sum + x } - - # AM: Control log taking + def self.local_svm_regression(neighbors, params) take_logs=true neighbors.each do |n| if (! n[:activity].nil?) && (n[:activity].to_f < 0.0) @@ -180,10 +176,51 @@ module OpenTox take_logs ? Math.log10(act.to_f) : act.to_f end # activities of neighbors for supervised learning - neighbor_matches = neighbors.collect{ |n| n[:features] } # as in classification: URIs of matches + sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors + prediction = local_sv_machine (neighbors, acts, sims, "svr", params) + prediction = take_logs ? 10**(prediction.to_f) : prediction.to_f + LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + + conf = sims.inject{|sum,x| sum + x } + confidence = conf/neighbors.size if neighbors.size > 0 + {:prediction => prediction, :confidence => confidence} + + end + + # Local support vector classification from neighbors + # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` + # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required + # @return [Hash] Hash with keys `:prediction, :confidence` + def self.local_svm_classification(neighbors, params) + acts = neighbors.collect do |n| + act = n[:activity] + end # activities of neighbors for supervised learning + + sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors + prediction = local_sv_machine (neighbors, acts, sims, "svc", params) + prediction = prediction.to_f + LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + + conf = sims.inject{|sum,x| sum + x } + confidence = conf/neighbors.size if neighbors.size > 0 + {:prediction => prediction, :confidence => confidence} + + end + + end + + # Local support vector prediction. Not to be called directly (use local_svm_regression or local_svm_classification. + # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` + # @param [Array] acts, activities for neighbors. + # @param [Array] sims, similarities for neighbors. + # @param [String] type, one of "svr" (regression) or "svc" (classification). + # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required + # @return [Numeric] A prediction value. + def self.local_sv_machine(neighbors, acts, sims, type, params) + neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel if neighbor_matches.size == 0 - raise "No neighbors found" + raise "No neighbors found." else # gram matrix (0..(neighbor_matches.length-1)).each do |i| @@ -216,21 +253,16 @@ module OpenTox # model + support vectors LOGGER.debug "Creating SVM model ..." - @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-svr\", nu=0.8)" + @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.5)" @r.eval "sv<-as.vector(SVindex(model))" @r.eval "sims<-sims[sv]" @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" LOGGER.debug "Predicting ..." @r.eval "p<-predict(model,sims)[1,1]" - prediction = 10**(@r.p.to_f) if take_logs - LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + prediction = @r.p @r.quit # free R end - confidence = conf/neighbors.size if neighbors.size > 0 - {:prediction => prediction, :confidence => confidence} - - end - + prediction end module Substructure -- cgit v1.2.3 From cb0cc893c74016425b56424093a6de1b2f795c70 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 17 May 2011 16:35:20 +0200 Subject: Fixed method scope --- lib/algorithm.rb | 110 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 16372ea..0a5b09f 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -177,7 +177,7 @@ module OpenTox end # activities of neighbors for supervised learning sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors - prediction = local_sv_machine (neighbors, acts, sims, "svr", params) + prediction = local_svm(neighbors, acts, sims, "svr", params) prediction = take_logs ? 10**(prediction.to_f) : prediction.to_f LOGGER.debug "Prediction is: '" + prediction.to_s + "'." @@ -197,7 +197,7 @@ module OpenTox end # activities of neighbors for supervised learning sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors - prediction = local_sv_machine (neighbors, acts, sims, "svc", params) + prediction = local_svm (neighbors, acts, sims, "svc", params) prediction = prediction.to_f LOGGER.debug "Prediction is: '" + prediction.to_s + "'." @@ -207,62 +207,64 @@ module OpenTox end - end - # Local support vector prediction. Not to be called directly (use local_svm_regression or local_svm_classification. - # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` - # @param [Array] acts, activities for neighbors. - # @param [Array] sims, similarities for neighbors. - # @param [String] type, one of "svr" (regression) or "svc" (classification). - # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required - # @return [Numeric] A prediction value. - def self.local_sv_machine(neighbors, acts, sims, type, params) - neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches - gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel - if neighbor_matches.size == 0 - raise "No neighbors found." - else - # gram matrix - (0..(neighbor_matches.length-1)).each do |i| - gram_matrix[i] = [] unless gram_matrix[i] - # upper triangle - ((i+1)..(neighbor_matches.length-1)).each do |j| - sim = eval("#{params[:similarity_algorithm]}(neighbor_matches[i], neighbor_matches[j], params[:p_values])") - gram_matrix[i][j] = Algorithm.gauss(sim) - gram_matrix[j] = [] unless gram_matrix[j] - gram_matrix[j][i] = gram_matrix[i][j] # lower triangle + # Local support vector prediction from neighbors. + # Not to be called directly (use local_svm_regression or local_svm_classification. + # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` + # @param [Array] acts, activities for neighbors. + # @param [Array] sims, similarities for neighbors. + # @param [String] type, one of "svr" (regression) or "svc" (classification). + # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required + # @return [Numeric] A prediction value. + def self.local_svm(neighbors, acts, sims, type, params) + neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches + gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel + if neighbor_matches.size == 0 + raise "No neighbors found." + else + # gram matrix + (0..(neighbor_matches.length-1)).each do |i| + gram_matrix[i] = [] unless gram_matrix[i] + # upper triangle + ((i+1)..(neighbor_matches.length-1)).each do |j| + sim = eval("#{params[:similarity_algorithm]}(neighbor_matches[i], neighbor_matches[j], params[:p_values])") + gram_matrix[i][j] = Algorithm.gauss(sim) + gram_matrix[j] = [] unless gram_matrix[j] + gram_matrix[j][i] = gram_matrix[i][j] # lower triangle + end + gram_matrix[i][i] = 1.0 end - gram_matrix[i][i] = 1.0 - end - #LOGGER.debug gram_matrix.to_yaml - @r = RinRuby.new(false,false) # global R instance leads to Socket errors after a large number of requests - @r.eval "library('kernlab')" # this requires R package "kernlab" to be installed - LOGGER.debug "Setting R data ..." - # set data - @r.gram_matrix = gram_matrix.flatten - @r.n = neighbor_matches.size - @r.y = acts - @r.sims = sims + #LOGGER.debug gram_matrix.to_yaml + @r = RinRuby.new(false,false) # global R instance leads to Socket errors after a large number of requests + @r.eval "library('kernlab')" # this requires R package "kernlab" to be installed + LOGGER.debug "Setting R data ..." + # set data + @r.gram_matrix = gram_matrix.flatten + @r.n = neighbor_matches.size + @r.y = acts + @r.sims = sims + + LOGGER.debug "Preparing R data ..." + # prepare data + @r.eval "y<-as.vector(y)" + @r.eval "gram_matrix<-as.kernelMatrix(matrix(gram_matrix,n,n))" + @r.eval "sims<-as.vector(sims)" + + # model + support vectors + LOGGER.debug "Creating SVM model ..." + @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.5)" + @r.eval "sv<-as.vector(SVindex(model))" + @r.eval "sims<-sims[sv]" + @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" + LOGGER.debug "Predicting ..." + @r.eval "p<-predict(model,sims)[1,1]" + prediction = @r.p + @r.quit # free R + end + prediction + end - LOGGER.debug "Preparing R data ..." - # prepare data - @r.eval "y<-as.vector(y)" - @r.eval "gram_matrix<-as.kernelMatrix(matrix(gram_matrix,n,n))" - @r.eval "sims<-as.vector(sims)" - - # model + support vectors - LOGGER.debug "Creating SVM model ..." - @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.5)" - @r.eval "sv<-as.vector(SVindex(model))" - @r.eval "sims<-sims[sv]" - @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" - LOGGER.debug "Predicting ..." - @r.eval "p<-predict(model,sims)[1,1]" - prediction = @r.p - @r.quit # free R - end - prediction end module Substructure -- cgit v1.2.3 From eb2582799bb5a05e053e2709db47880430f80a78 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 17 May 2011 16:40:12 +0200 Subject: Add debug --- lib/algorithm.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 0a5b09f..ec5748d 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -178,7 +178,8 @@ module OpenTox sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors prediction = local_svm(neighbors, acts, sims, "svr", params) - prediction = take_logs ? 10**(prediction.to_f) : prediction.to_f + LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + prediction = (take_logs ? 10**(prediction.to_f) : prediction.to_f) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." conf = sims.inject{|sum,x| sum + x } -- cgit v1.2.3 From 251ce4cd57a161fa20f1400b5980b171bf2ff86c Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 17 May 2011 16:46:26 +0200 Subject: nu 0.8 again to pass tests --- lib/algorithm.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index ec5748d..4cb80e3 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -254,7 +254,7 @@ module OpenTox # model + support vectors LOGGER.debug "Creating SVM model ..." - @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.5)" + @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.8)" @r.eval "sv<-as.vector(SVindex(model))" @r.eval "sims<-sims[sv]" @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" -- cgit v1.2.3 From cf0fd8003c373bd9216823ff2065231696ddfbcb Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 19 May 2011 10:08:17 +0200 Subject: Set nu to 0.5 --- lib/algorithm.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 4cb80e3..fb5fd7f 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -178,7 +178,6 @@ module OpenTox sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors prediction = local_svm(neighbors, acts, sims, "svr", params) - LOGGER.debug "Prediction is: '" + prediction.to_s + "'." prediction = (take_logs ? 10**(prediction.to_f) : prediction.to_f) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." @@ -254,7 +253,7 @@ module OpenTox # model + support vectors LOGGER.debug "Creating SVM model ..." - @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.8)" + @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.5)" @r.eval "sv<-as.vector(SVindex(model))" @r.eval "sims<-sims[sv]" @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" -- cgit v1.2.3 From afefbdf05549c298387821c3a441d1de701291e0 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 19 May 2011 12:12:23 +0200 Subject: Added SVM classification --- lib/algorithm.rb | 61 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index fb5fd7f..9402eab 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -177,7 +177,7 @@ module OpenTox end # activities of neighbors for supervised learning sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors - prediction = local_svm(neighbors, acts, sims, "svr", params) + prediction = local_svm(neighbors, acts, sims, "nu-svr", params) prediction = (take_logs ? 10**(prediction.to_f) : prediction.to_f) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." @@ -197,9 +197,15 @@ module OpenTox end # activities of neighbors for supervised learning sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors - prediction = local_svm (neighbors, acts, sims, "svc", params) - prediction = prediction.to_f - LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + + + acts_f = acts.collect {|v| v == true ? 1.0 : 0.0} + begin + prediction = local_svm (neighbors, acts_f, sims, "C-bsvc", params) + LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + rescue Exception => e + LOGGER.debug "Prediction failed." + end conf = sims.inject{|sum,x| sum + x } confidence = conf/neighbors.size if neighbors.size > 0 @@ -213,7 +219,7 @@ module OpenTox # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` # @param [Array] acts, activities for neighbors. # @param [Array] sims, similarities for neighbors. - # @param [String] type, one of "svr" (regression) or "svc" (classification). + # @param [String] type, one of "nu-svr" (regression) or "C-bsvc" (classification). # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required # @return [Numeric] A prediction value. def self.local_svm(neighbors, acts, sims, type, params) @@ -245,22 +251,35 @@ module OpenTox @r.y = acts @r.sims = sims - LOGGER.debug "Preparing R data ..." - # prepare data - @r.eval "y<-as.vector(y)" - @r.eval "gram_matrix<-as.kernelMatrix(matrix(gram_matrix,n,n))" - @r.eval "sims<-as.vector(sims)" - - # model + support vectors - LOGGER.debug "Creating SVM model ..." - @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"nu-#{type}\", nu=0.5)" - @r.eval "sv<-as.vector(SVindex(model))" - @r.eval "sims<-sims[sv]" - @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" - LOGGER.debug "Predicting ..." - @r.eval "p<-predict(model,sims)[1,1]" - prediction = @r.p - @r.quit # free R + begin + LOGGER.debug "Preparing R data ..." + # prepare data + @r.eval "y<-as.vector(y)" + @r.eval "gram_matrix<-as.kernelMatrix(matrix(gram_matrix,n,n))" + @r.eval "sims<-as.vector(sims)" + + # model + support vectors + LOGGER.debug "Creating SVM model ..." + @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"#{type}\", nu=0.5)" + @r.eval "sv<-as.vector(SVindex(model))" + @r.eval "sims<-sims[sv]" + @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" + LOGGER.debug "Predicting ..." + if type == "nu-svr" + @r.eval "p<-predict(model,sims)[1,1]" + elsif type == "C-bsvc" + @r.eval "p<-predict(model,sims)" + end + if type == "nu-svr" + prediction = @r.p + elsif type == "C-bsvc" + prediction = (@r.p.to_f == 1.0 ? true : false) + end + @r.quit # free R + rescue Exception => e + LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" + end + end prediction end -- cgit v1.2.3 From e34c80eadcd40482a765cda861b92ab5c1250049 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 19 May 2011 13:08:28 +0200 Subject: Added Exception handling --- lib/algorithm.rb | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 9402eab..5b41cbf 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -177,9 +177,13 @@ module OpenTox end # activities of neighbors for supervised learning sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors - prediction = local_svm(neighbors, acts, sims, "nu-svr", params) - prediction = (take_logs ? 10**(prediction.to_f) : prediction.to_f) - LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + begin + prediction = local_svm(neighbors, acts, sims, "nu-svr", params) + prediction = (take_logs ? 10**(prediction.to_f) : prediction.to_f) + LOGGER.debug "Prediction is: '" + prediction.to_s + "'." + rescue Exception => e + LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" + end conf = sims.inject{|sum,x| sum + x } confidence = conf/neighbors.size if neighbors.size > 0 @@ -195,16 +199,13 @@ module OpenTox acts = neighbors.collect do |n| act = n[:activity] end # activities of neighbors for supervised learning - - sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors - - acts_f = acts.collect {|v| v == true ? 1.0 : 0.0} + sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors begin prediction = local_svm (neighbors, acts_f, sims, "C-bsvc", params) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." rescue Exception => e - LOGGER.debug "Prediction failed." + LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" end conf = sims.inject{|sum,x| sum + x } -- cgit v1.2.3 From 30478c4dd18b56048b6e190027daef1fc6608230 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 19 May 2011 16:55:34 +0200 Subject: Fixed digression class / regr --- lib/model.rb | 83 ++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 28 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 3d64f32..7acd8f2 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -179,10 +179,10 @@ module OpenTox return @prediction_dataset if database_activity(subjectid) - # AM: Balancing, see http://www.maunz.de/wordpress/opentox/2011/balanced-lazar - l = Array.new # larger - s = Array.new # smaller fraction - if metadata[RDF.type] == [OTA.ClassificationLazySingleTarget] + if metadata[RDF.type] == [OTA.ClassificationLazySingleTarget] + # AM: Balancing, see http://www.maunz.de/wordpress/opentox/2011/balanced-lazar + l = Array.new # larger + s = Array.new # smaller fraction @fingerprints.each do |training_compound,training_features| @activities[training_compound].each do |act| case act.to_s @@ -202,36 +202,41 @@ module OpenTox # determine ratio modulo = l.size.divmod(s.size)# modulo[0]=ratio, modulo[1]=rest LOGGER.info "BLAZAR: Balance: #{modulo[0]}, rest #{modulo[1]}." - end - # AM: Balanced predictions - addon = (modulo[1].to_f/modulo[0]).ceil # what will be added in each round - slack = modulo[1].divmod(addon)[1] # what remains for the last round - position = 0 - predictions = Array.new + # AM: Balanced predictions + addon = (modulo[1].to_f/modulo[0]).ceil # what will be added in each round + slack = modulo[1].divmod(addon)[1] # what remains for the last round + position = 0 + predictions = Array.new - prediction_best=nil - neighbors_best=nil + prediction_best=nil + neighbors_best=nil - begin - for i in 1..modulo[0] do - (i == modulo[0]) && (slack>0) ? lr_size = s.size + slack : lr_size = s.size + addon # determine fraction - LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." - neighbors(s, l, position, lr_size) # get ratio fraction of larger part - prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") - if prediction_best.nil? || prediction[:confidence].abs > prediction_best[:confidence].abs - prediction_best=prediction - neighbors_best=@neighbors + begin + for i in 1..modulo[0] do + (i == modulo[0]) && (slack>0) ? lr_size = s.size + slack : lr_size = s.size + addon # determine fraction + LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." + neighbors(s, l, position, lr_size) # get ratio fraction of larger part + prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") + if prediction_best.nil? || prediction[:confidence].abs > prediction_best[:confidence].abs + prediction_best=prediction + neighbors_best=@neighbors + end + position = position + lr_size + end + rescue Exception => e + LOGGER.error "BLAZAR failed in prediction: "+e.class.to_s+": "+e.message end - position = position + lr_size - end - rescue Exception => e - LOGGER.error "BLAZAR failed in prediction: "+e.class.to_s+": "+e.message - end - prediction=prediction_best - @neighbors=neighbors_best + prediction=prediction_best + @neighbors=neighbors_best + ### END AM balanced predictions + else # regression case: no balancing + neighbors + prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") + end + prediction_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),@prediction_dataset.compounds.size.to_s) # TODO: fix dependentVariable @prediction_dataset.metadata[OT.dependentVariables] = prediction_feature_uri @@ -347,6 +352,28 @@ module OpenTox end + + # Find neighbors and store them as object variable + def neighbors + + @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm + + @neighbors = [] + @fingerprints.each do |training_compound,training_features| + sim = eval("#{@similarity_algorithm}(@compound_features,training_features,@p_values)") + if sim > @min_sim + @activities[training_compound].each do |act| + @neighbors << { + :compound => training_compound, + :similarity => sim, + :features => training_features, + :activity => act + } + end + end + end + end + # Find database activities and store them in @prediction_dataset # @return [Boolean] true if compound has databasse activities, false if not def database_activity(subjectid) -- cgit v1.2.3 From 32b7faa44ef70194e0ae1c5e43948eea785f9d04 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 19 May 2011 17:03:50 +0200 Subject: Fixed neighbor selection --- lib/model.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 7acd8f2..998d2dc 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -216,7 +216,7 @@ module OpenTox for i in 1..modulo[0] do (i == modulo[0]) && (slack>0) ? lr_size = s.size + slack : lr_size = s.size + addon # determine fraction LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." - neighbors(s, l, position, lr_size) # get ratio fraction of larger part + neighbors_balanced(s, l, position, lr_size) # get ratio fraction of larger part prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") if prediction_best.nil? || prediction[:confidence].abs > prediction_best[:confidence].abs prediction_best=prediction @@ -325,7 +325,7 @@ module OpenTox end # Find neighbors and store them as object variable - def neighbors(s=nil, l=nil, start=nil, offset=nil) + def neighbors_balanced(s, l, start, offset) @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm @neighbors = [] -- cgit v1.2.3 From 8c78bf2358338cf5f795a65c9b1c21a48474169f Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 20 May 2011 10:52:32 +0200 Subject: change location of to-html-opentox-image to local validation service --- lib/to-html.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/to-html.rb b/lib/to-html.rb index 6785974..66a3e74 100644 --- a/lib/to-html.rb +++ b/lib/to-html.rb @@ -1,5 +1,5 @@ -OT_LOGO = "http://opentox.informatik.uni-freiburg.de/ot-logo.png" +OT_LOGO = File.join(CONFIG[:services]["opentox-validation"],"resources/ot-logo.png") class String -- cgit v1.2.3 From 0902a4a0b2d83d167277b82fcfd9cc12c0b993a9 Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 23 May 2011 13:00:00 +0200 Subject: Version bump to 2.0.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index e6d5cb8..359a5b9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.2 \ No newline at end of file +2.0.0 \ No newline at end of file -- cgit v1.2.3 From 580ac1b909cdeb68a5b0b721611dc78fe7c75d95 Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 23 May 2011 13:14:27 +0200 Subject: new release 2.0.0 --- opentox-ruby.gemspec | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/opentox-ruby.gemspec b/opentox-ruby.gemspec index 289dacd..e62eec5 100644 --- a/opentox-ruby.gemspec +++ b/opentox-ruby.gemspec @@ -5,11 +5,11 @@ Gem::Specification.new do |s| s.name = %q{opentox-ruby} - s.version = "1.0.2" + s.version = "2.0.0" s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] - s.date = %q{2011-03-16} + s.date = %q{2011-05-23} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} s.email = %q{helma@in-silico.ch} s.executables = ["opentox-install-debian.sh", "opentox-install-ubuntu.sh"] @@ -34,7 +34,7 @@ Gem::Specification.new do |s| "lib/feature.rb", "lib/helper.rb", "lib/model.rb", - "lib/ontology_service.rb", + "lib/ontology.rb", "lib/opentox-ruby.rb", "lib/opentox.owl", "lib/opentox.rb", @@ -45,7 +45,6 @@ Gem::Specification.new do |s| "lib/serializer.rb", "lib/spork.rb", "lib/task.rb", - "lib/templates/config.yaml", "lib/templates/default_guest_policy.xml", "lib/templates/default_policy.xml", "lib/to-html.rb", @@ -53,7 +52,7 @@ Gem::Specification.new do |s| ] s.homepage = %q{http://github.com/helma/opentox-ruby} s.require_paths = ["lib"] - s.rubygems_version = %q{1.4.2} + s.rubygems_version = %q{1.5.2} s.summary = %q{Ruby wrapper for the OpenTox REST API} if s.respond_to? :specification_version then @@ -77,9 +76,18 @@ Gem::Specification.new do |s| s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) + s.add_runtime_dependency(%q, [">= 0"]) s.add_runtime_dependency(%q, [">= 3"]) + s.add_runtime_dependency(%q, ["~> 0.4.0"]) s.add_development_dependency(%q, [">= 0"]) else s.add_dependency(%q, [">= 0"]) @@ -99,9 +107,18 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 3"]) + s.add_dependency(%q, ["~> 0.4.0"]) s.add_dependency(%q, [">= 0"]) end else @@ -122,9 +139,18 @@ Gem::Specification.new do |s| s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) + s.add_dependency(%q, [">= 0"]) s.add_dependency(%q, [">= 3"]) + s.add_dependency(%q, ["~> 0.4.0"]) s.add_dependency(%q, [">= 0"]) end end -- cgit v1.2.3 From 0b936c71d8a1d5effa6c29d5ee9c227fff18a070 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 23 May 2011 14:03:02 +0000 Subject: owl-dl fixed for model and prediction datasets --- lib/dataset.rb | 7 ++- lib/model.rb | 136 ++++++++++++++++++++++++++++++------------------------ lib/serializer.rb | 27 +++++++---- 3 files changed, 95 insertions(+), 75 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 4005c1c..4dc4296 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -179,7 +179,6 @@ module OpenTox end end -=begin # Detect feature type(s) in the dataset # @return [String] `classification", "regression", "mixed" or unknown` def feature_type(subjectid=nil) @@ -193,6 +192,7 @@ module OpenTox "unknown" end end +=begin =end # Get Spreadsheet representation @@ -369,12 +369,11 @@ module OpenTox end def value(compound) - @data_entries[compound.uri].collect{|f,v| v.first if f.match(/prediction/)}.compact.first + @data_entries[compound.uri].collect{|f,v| v.first if f.match(/value/)}.compact.first end def confidence(compound) - feature_uri = @data_entries[compound.uri].collect{|f,v| f if f.match(/prediction/)}.compact.first - @features[feature_uri][OT.confidence] + @data_entries[compound.uri].collect{|f,v| v.first if f.match(/confidence/)}.compact.first end def descriptors(compound) diff --git a/lib/model.rb b/lib/model.rb index 998d2dc..d46152d 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -164,8 +164,6 @@ module OpenTox features = {} unless @prediction_dataset - #@prediction_dataset = cached_prediction - #return @prediction_dataset if cached_prediction @prediction_dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid) @prediction_dataset.add_metadata( { OT.hasSource => @uri, @@ -237,38 +235,90 @@ module OpenTox prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") end - prediction_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),@prediction_dataset.compounds.size.to_s) - # TODO: fix dependentVariable - @prediction_dataset.metadata[OT.dependentVariables] = prediction_feature_uri + # TODO: reasonable feature name + #prediction_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),@prediction_dataset.compounds.size.to_s) + value_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),"value") + confidence_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),"confidence") + prediction_feature_uris = {value_feature_uri => prediction[:prediction], confidence_feature_uri => prediction[:confidence]} + prediction_feature_uris[value_feature_uri] = "No similar compounds in training dataset." if @neighbors.size == 0 or prediction[:prediction].nil? + + + #@prediction_dataset.metadata[OT.dependentVariables] = prediction_feature_uri + @prediction_dataset.metadata[OT.dependentVariables] = @metadata[OT.dependentVariables] + +=begin if @neighbors.size == 0 - @prediction_dataset.add_feature(prediction_feature_uri, { - RDF.type => [OT.MeasuredFeature], - OT.hasSource => @uri, - DC.creator => @uri, - DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), - OT.error => "No similar compounds in training dataset.", - OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] - }) - @prediction_dataset.add @compound.uri, prediction_feature_uri, prediction[:prediction] + prediction_feature_uris.each do |prediction_feature_uri,value| + @prediction_dataset.add_feature(prediction_feature_uri, { + RDF.type => [OT.MeasuredFeature], + OT.hasSource => @uri, + DC.creator => @uri, + DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), + OT.error => "No similar compounds in training dataset.", + #OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] + }) + @prediction_dataset.add @compound.uri, prediction_feature_uri, value + end else +=end + prediction_feature_uris.each do |prediction_feature_uri,value| + @prediction_dataset.metadata[OT.predictedVariables] = [] unless @prediction_dataset.metadata[OT.predictedVariables] + @prediction_dataset.metadata[OT.predictedVariables] << prediction_feature_uri @prediction_dataset.add_feature(prediction_feature_uri, { RDF.type => [OT.ModelPrediction], OT.hasSource => @uri, DC.creator => @uri, DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), - OT.prediction => prediction[:prediction], - OT.confidence => prediction[:confidence], - OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] + # TODO: factor information to value }) - @prediction_dataset.add @compound.uri, prediction_feature_uri, prediction[:prediction] + #OT.prediction => prediction[:prediction], + #OT.confidence => prediction[:confidence], + #OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] + @prediction_dataset.add @compound.uri, prediction_feature_uri, value + end - if verbose - if @feature_calculation_algorithm == "Substructure.match" - f = 0 - @compound_features.each do |feature| - feature_uri = File.join( @prediction_dataset.uri, "feature", "descriptor", f.to_s) + if verbose + if @feature_calculation_algorithm == "Substructure.match" + f = 0 + @compound_features.each do |feature| + feature_uri = File.join( @prediction_dataset.uri, "feature", "descriptor", f.to_s) + features[feature] = feature_uri + @prediction_dataset.add_feature(feature_uri, { + RDF.type => [OT.Substructure], + OT.smarts => feature, + OT.pValue => @p_values[feature], + OT.effect => @effects[feature] + }) + @prediction_dataset.add @compound.uri, feature_uri, true + f+=1 + end + else + @compound_features.each do |feature| + features[feature] = feature + @prediction_dataset.add @compound.uri, feature, true + end + end + n = 0 + @neighbors.each do |neighbor| + neighbor_uri = File.join( @prediction_dataset.uri, "feature", "neighbor", n.to_s ) + @prediction_dataset.add_feature(neighbor_uri, { + OT.compound => neighbor[:compound], + OT.similarity => neighbor[:similarity], + OT.measuredActivity => neighbor[:activity], + RDF.type => [OT.Neighbor] + }) + @prediction_dataset.add @compound.uri, neighbor_uri, true + f = 0 unless f + neighbor[:features].each do |feature| + if @feature_calculation_algorithm == "Substructure.match" + feature_uri = File.join( @prediction_dataset.uri, "feature", "descriptor", f.to_s) unless feature_uri = features[feature] + else + feature_uri = feature + end + @prediction_dataset.add neighbor[:compound], feature_uri, true + unless features.has_key? feature features[feature] = feature_uri @prediction_dataset.add_feature(feature_uri, { RDF.type => [OT.Substructure], @@ -276,49 +326,13 @@ module OpenTox OT.pValue => @p_values[feature], OT.effect => @effects[feature] }) - @prediction_dataset.add @compound.uri, feature_uri, true f+=1 end - else - @compound_features.each do |feature| - features[feature] = feature - @prediction_dataset.add @compound.uri, feature, true - end - end - n = 0 - @neighbors.each do |neighbor| - neighbor_uri = File.join( @prediction_dataset.uri, "feature", "neighbor", n.to_s ) - @prediction_dataset.add_feature(neighbor_uri, { - OT.compound => neighbor[:compound], - OT.similarity => neighbor[:similarity], - OT.measuredActivity => neighbor[:activity], - RDF.type => [OT.Neighbor] - }) - @prediction_dataset.add @compound.uri, neighbor_uri, true - f = 0 unless f - neighbor[:features].each do |feature| - if @feature_calculation_algorithm == "Substructure.match" - feature_uri = File.join( @prediction_dataset.uri, "feature", "descriptor", f.to_s) unless feature_uri = features[feature] - else - feature_uri = feature - end - @prediction_dataset.add neighbor[:compound], feature_uri, true - unless features.has_key? feature - features[feature] = feature_uri - @prediction_dataset.add_feature(feature_uri, { - RDF.type => [OT.Substructure], - OT.smarts => feature, - OT.pValue => @p_values[feature], - OT.effect => @effects[feature] - }) - f+=1 - end - end - n+=1 end - # what happens with dataset predictions? + n+=1 end end + #end @prediction_dataset.save(subjectid) @prediction_dataset diff --git a/lib/serializer.rb b/lib/serializer.rb index e4cb541..78e7709 100644 --- a/lib/serializer.rb +++ b/lib/serializer.rb @@ -17,6 +17,7 @@ module OpenTox # this should come from opentox.owl OT.Compound => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.Feature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OT.Model => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.NominalFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.NumericFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.StringFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , @@ -27,6 +28,8 @@ module OpenTox OT.Parameter => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OT.Task => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , OTA.PatternMiningSupervised => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OTA.ClassificationLazySingleTarget => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , + OTA.RegressionLazySingleTarget => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , #classes for validation OT.Validation => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , @@ -45,6 +48,9 @@ module OpenTox OT.values => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.algorithm => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.parameters => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.featureDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.dependentVariables => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.paramValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , #object props for validation# OT.model => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , @@ -126,7 +132,7 @@ module OpenTox OT.hasSource => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , OT.value => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , OT.paramScope => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , - OT.paramValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , + #OT.paramValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , } @data_entries = {} @@ -157,23 +163,16 @@ module OpenTox # Add a dataset # @param [String] uri Dataset URI def add_dataset(dataset) - @dataset = dataset.uri - @object[dataset.uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Dataset }] } - add_metadata dataset.uri, dataset.metadata - dataset.compounds.each { |compound| add_compound compound } - dataset.features.each { |feature,metadata| add_feature feature,metadata } - dataset.data_entries.each do |compound,entry| entry.each do |feature,values| values.each { |value| add_data_entry compound,feature,value } end end - end # Add a algorithm @@ -188,6 +187,13 @@ module OpenTox def add_model(uri,metadata) @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Model }] } add_metadata uri, metadata + @object[metadata[OT.featureDataset]] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Dataset }] } + @object[metadata[OT.trainingDataset]] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Dataset }] } + @object[metadata[OT.dependentVariables]] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Feature }] } + # TODO: add algorithms from parameters + @object["http://ot-dev.in-silico.ch/algorithm/fminer/bbrc"] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } + @object["http://ot-dev.in-silico.ch/algorithm/fminer/last"] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } + @object["http://ot-dev.in-silico.ch/algorithm/lazar"] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } end # Add a task @@ -272,7 +278,7 @@ module OpenTox @object[genid][name] = [{"type" => type(entry), "value" => entry }] end end - elsif v.is_a? Array and u == RDF.type + elsif v.is_a? Array #and u == RDF.type @object[uri] = {} unless @object[uri] v.each do |value| @object[uri][u] = [] unless @object[uri][u] @@ -354,7 +360,8 @@ module OpenTox # @return [text/plain] Object OWL-DL in RDF/XML format def to_rdfxml Tempfile.open("owl-serializer"){|f| f.write(self.to_ntriples); @path = f.path} - `rapper -i ntriples -f 'xmlns:ot="#{OT.uri}"' -f 'xmlns:dc="#{DC.uri}"' -f 'xmlns:rdf="#{RDF.uri}"' -f 'xmlns:owl="#{OWL.uri}"' -o rdfxml #{@path} 2>/dev/null` + # TODO: add base uri for ist services + `rapper -i ntriples -f 'xmlns:ot="#{OT.uri}"' -f 'xmlns:ota="#{OTA.uri}"' -f 'xmlns:dc="#{DC.uri}"' -f 'xmlns:rdf="#{RDF.uri}"' -f 'xmlns:owl="#{OWL.uri}"' -o rdfxml #{@path} 2>/dev/null` end # Convert to JSON as specified in http://n2.talis.com/wiki/RDF_JSON_Specification -- cgit v1.2.3 From 87eb7cc1e079821c2f7c5e101e7e392e9bd10f00 Mon Sep 17 00:00:00 2001 From: davor Date: Tue, 24 May 2011 09:35:11 +0200 Subject: Fixing regression detection --- lib/parser.rb | 66 +++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/lib/parser.rb b/lib/parser.rb index 7bdee95..8deaa91 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -277,7 +277,23 @@ module OpenTox def load_spreadsheet(book) book.default_sheet = 0 add_features book.row(1) - 2.upto(book.last_row) { |i| add_values book.row(i) } + + # AM: fix mixed read in + regression_features=false + 2.upto(book.last_row) { |i| + row = book.row(i) + smiles = row.shift + row.each_index do |i| + value = row[i] + type = feature_type(value) + if type == OT.NumericFeature + regression_features=true + break + end + end + } + + 2.upto(book.last_row) { |i| add_values book.row(i),regression_features } warnings @dataset end @@ -289,7 +305,23 @@ module OpenTox row = 0 input = csv.split("\n") add_features split_row(input.shift) - input.each { |row| add_values split_row(row) } + + + # AM: fix mixed read in + regression_features=false + input.each { |row| + row = split_row(row) + smiles = row.shift + row.each_index do |i| + value = row[i] + type = feature_type(value) + if type == OT.NumericFeature + regression_features=true + break + end + end + } + input.each { |row| add_values split_row(row),regression_features } warnings @dataset end @@ -335,7 +367,7 @@ module OpenTox end end - def add_values(row) + def add_values(row, regression_features=false) smiles = row.shift compound = Compound.from_smiles(smiles) @@ -353,19 +385,23 @@ module OpenTox @feature_types[feature] << type - case type - when OT.NominalFeature - case value.to_s - when TRUE_REGEXP - val = true - when FALSE_REGEXP - val = false - end - when OT.NumericFeature + if (regression_features) val = value.to_f - when OT.StringFeature - val = value.to_s - @activity_errors << smiles+", "+row.join(", ") + else + case type + when OT.NominalFeature + case value.to_s + when TRUE_REGEXP + val = true + when FALSE_REGEXP + val = false + end + when OT.NumericFeature + val = value.to_f + when OT.StringFeature + val = value.to_s + @activity_errors << smiles+", "+row.join(", ") + end end if val!=nil @dataset.add(compound.uri, feature, val) -- cgit v1.2.3 From 4a7ba2adb0743cd225ad5c2cf9f71c896d87b157 Mon Sep 17 00:00:00 2001 From: davor Date: Tue, 24 May 2011 10:45:53 +0200 Subject: Created dedicated function for value sweeping --- lib/parser.rb | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/lib/parser.rb b/lib/parser.rb index 8deaa91..4984292 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -282,15 +282,8 @@ module OpenTox regression_features=false 2.upto(book.last_row) { |i| row = book.row(i) - smiles = row.shift - row.each_index do |i| - value = row[i] - type = feature_type(value) - if type == OT.NumericFeature - regression_features=true - break - end - end + regression_features = detect_regression_features row + break if regression_features=true } 2.upto(book.last_row) { |i| add_values book.row(i),regression_features } @@ -311,21 +304,15 @@ module OpenTox regression_features=false input.each { |row| row = split_row(row) - smiles = row.shift - row.each_index do |i| - value = row[i] - type = feature_type(value) - if type == OT.NumericFeature - regression_features=true - break - end - end + regression_features = detect_regression_features row + break if regression_features=true } input.each { |row| add_values split_row(row),regression_features } warnings @dataset end + private def warnings @@ -367,6 +354,18 @@ module OpenTox end end + def detect_regression_features row + regression_features=false + row.each_index do |i| + value = row[i] + type = feature_type(value) + if type == OT.NumericFeature + regression_features=true + end + end + regression_features + end + def add_values(row, regression_features=false) smiles = row.shift -- cgit v1.2.3 From 8a20cf940c346fd04649d3c3c8f7ad4c1fcb20cb Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 24 May 2011 14:00:16 +0200 Subject: Fix: break was too early --- lib/parser.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/parser.rb b/lib/parser.rb index 4984292..5f847c3 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -283,7 +283,7 @@ module OpenTox 2.upto(book.last_row) { |i| row = book.row(i) regression_features = detect_regression_features row - break if regression_features=true + break if regression_features==true } 2.upto(book.last_row) { |i| add_values book.row(i),regression_features } @@ -305,7 +305,7 @@ module OpenTox input.each { |row| row = split_row(row) regression_features = detect_regression_features row - break if regression_features=true + break if regression_features==true } input.each { |row| add_values split_row(row),regression_features } warnings @@ -355,6 +355,7 @@ module OpenTox end def detect_regression_features row + row.shift regression_features=false row.each_index do |i| value = row[i] -- cgit v1.2.3 From d0006c50909a7f134df4e246f747831e3a5547ed Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 24 May 2011 15:11:12 +0200 Subject: Fixing regression detection --- lib/parser.rb | 66 +++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/lib/parser.rb b/lib/parser.rb index 7bdee95..5f847c3 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -277,7 +277,16 @@ module OpenTox def load_spreadsheet(book) book.default_sheet = 0 add_features book.row(1) - 2.upto(book.last_row) { |i| add_values book.row(i) } + + # AM: fix mixed read in + regression_features=false + 2.upto(book.last_row) { |i| + row = book.row(i) + regression_features = detect_regression_features row + break if regression_features==true + } + + 2.upto(book.last_row) { |i| add_values book.row(i),regression_features } warnings @dataset end @@ -289,11 +298,21 @@ module OpenTox row = 0 input = csv.split("\n") add_features split_row(input.shift) - input.each { |row| add_values split_row(row) } + + + # AM: fix mixed read in + regression_features=false + input.each { |row| + row = split_row(row) + regression_features = detect_regression_features row + break if regression_features==true + } + input.each { |row| add_values split_row(row),regression_features } warnings @dataset end + private def warnings @@ -335,7 +354,20 @@ module OpenTox end end - def add_values(row) + def detect_regression_features row + row.shift + regression_features=false + row.each_index do |i| + value = row[i] + type = feature_type(value) + if type == OT.NumericFeature + regression_features=true + end + end + regression_features + end + + def add_values(row, regression_features=false) smiles = row.shift compound = Compound.from_smiles(smiles) @@ -353,19 +385,23 @@ module OpenTox @feature_types[feature] << type - case type - when OT.NominalFeature - case value.to_s - when TRUE_REGEXP - val = true - when FALSE_REGEXP - val = false - end - when OT.NumericFeature + if (regression_features) val = value.to_f - when OT.StringFeature - val = value.to_s - @activity_errors << smiles+", "+row.join(", ") + else + case type + when OT.NominalFeature + case value.to_s + when TRUE_REGEXP + val = true + when FALSE_REGEXP + val = false + end + when OT.NumericFeature + val = value.to_f + when OT.StringFeature + val = value.to_s + @activity_errors << smiles+", "+row.join(", ") + end end if val!=nil @dataset.add(compound.uri, feature, val) -- cgit v1.2.3 From 0d87789eec37f7ae09d01937dbfc72af1ef17252 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 24 May 2011 16:06:05 +0200 Subject: fix small errors in to-html method --- lib/to-html.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/to-html.rb b/lib/to-html.rb index 66a3e74..51602d7 100644 --- a/lib/to-html.rb +++ b/lib/to-html.rb @@ -6,7 +6,7 @@ class String # encloses URI in text with with link tag # @return [String] new text with marked links def link_urls - self.gsub(/(?i)http(s?):\/\/[^\r\n\s']*/, '\0') + self.gsub(/(?i)http(s?):\/\/[^\r\n\s']*/, '\0') end end @@ -30,7 +30,7 @@ module OpenTox title = nil #$sinatra.url_for($sinatra.request.env['PATH_INFO'], :full) if $sinatra html = "" html += ""+title+"" if title - html += "" + html += "<\/img>" if AA_SERVER user = OpenTox::Authorization.get_user(subjectid) if subjectid @@ -63,7 +63,7 @@ module OpenTox html += "

Content

" if description || related_links html += "

" html += text.link_urls - html += "

" + html += "

" html end @@ -78,7 +78,7 @@ module OpenTox "password:"+ #""+ "" - html += "

" + html += "

" html end end -- cgit v1.2.3 From 524bda5ac60e07aa0805bfb215da718157849672 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 24 May 2011 16:08:22 +0200 Subject: fix lazar-non-predictions: replace "No similar compounds in training dataset." with nil --- lib/model.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index d46152d..139aed8 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -241,8 +241,8 @@ module OpenTox confidence_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),"confidence") prediction_feature_uris = {value_feature_uri => prediction[:prediction], confidence_feature_uri => prediction[:confidence]} - prediction_feature_uris[value_feature_uri] = "No similar compounds in training dataset." if @neighbors.size == 0 or prediction[:prediction].nil? - + #prediction_feature_uris[value_feature_uri] = "No similar compounds in training dataset." if @neighbors.size == 0 or prediction[:prediction].nil? + prediction_feature_uris[value_feature_uri] = nil if @neighbors.size == 0 or prediction[:prediction].nil? #@prediction_dataset.metadata[OT.dependentVariables] = prediction_feature_uri @prediction_dataset.metadata[OT.dependentVariables] = @metadata[OT.dependentVariables] -- cgit v1.2.3 From fe85fafc4b24cc8275ad67536d25d660249bb792 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 24 May 2011 16:10:10 +0200 Subject: adjust dataset-parser: predictedVariables may be array, do not request id/features from ambit services as not supported --- lib/parser.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/parser.rb b/lib/parser.rb index 5f847c3..a6878a2 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -56,7 +56,7 @@ module OpenTox `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| triple = line.to_triple if triple[0] == @uri - if triple[1] == RDF.type # allow multiple types + if triple[1] == RDF.type || triple[1]==OT.predictedVariables # allow multiple types @metadata[triple[1]] = [] unless @metadata[triple[1]] @metadata[triple[1]] << triple[2].split('^^').first else @@ -228,7 +228,11 @@ module OpenTox file = Tempfile.new("ot-rdfxml") # do not concat /features to uri string, this would not work for dataset/R401577?max=3 uri = URI::parse(@uri) - uri.path = File.join(uri.path,"features") + # PENDING + # ambit models return http://host/dataset/id?feature_uris[]=sth but + # amibt dataset services does not support http://host/dataset/id/features?feature_uris[]=sth + # -> load features from complete dataset + uri.path = File.join(uri.path,"features") unless @uri=~/\?feature_uris\[\]/ uri = uri.to_s file.puts OpenTox::RestClientWrapper.get uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false file.close -- cgit v1.2.3 From aaff8d61a7b3bb96e79fbf575718764a071ced9a Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 24 May 2011 18:04:59 +0200 Subject: added missing prop to serializer --- lib/serializer.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/serializer.rb b/lib/serializer.rb index 78e7709..62c1159 100644 --- a/lib/serializer.rb +++ b/lib/serializer.rb @@ -109,6 +109,7 @@ module OpenTox OT.precision => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.areaUnderRoc => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.weightedAreaUnderRoc => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , + OT.weightedAccuracy => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.fMeasure => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.percentIncorrect => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , OT.validationType => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , -- cgit v1.2.3 From 43572f94815a5ec4ca5b922dad3a1c1a140b7348 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 24 May 2011 19:44:53 +0200 Subject: remove empty space that produced a warning --- lib/algorithm.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 5b41cbf..96b9df1 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -202,7 +202,7 @@ module OpenTox acts_f = acts.collect {|v| v == true ? 1.0 : 0.0} sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors begin - prediction = local_svm (neighbors, acts_f, sims, "C-bsvc", params) + prediction = local_svm(neighbors, acts_f, sims, "C-bsvc", params) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." rescue Exception => e LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" -- cgit v1.2.3 From 2a52792b6143fba8e888fe454303a45f625cb0cf Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 24 May 2011 19:45:19 +0200 Subject: move to ruby-plot version 0.5 --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 08959b0..acf32d4 100644 --- a/Rakefile +++ b/Rakefile @@ -53,7 +53,7 @@ begin #valiation-gem gem.add_dependency "haml", ">=3" # validation-gems - gem.add_dependency "ruby-plot", "~>0.4.0" + gem.add_dependency "ruby-plot", "~>0.5.0" ['jeweler'].each { |dep| gem.add_development_dependency dep } gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] end -- cgit v1.2.3 From b7a03a18ce90d664d89d6a414512aa03a6dddcc4 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 25 May 2011 08:51:56 +0200 Subject: Add_neighbor function --- lib/model.rb | 59 ++++++++++++++++++++++------------------------------------- 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 139aed8..f5e0410 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -338,54 +338,39 @@ module OpenTox @prediction_dataset end - # Find neighbors and store them as object variable + # Find neighbors and store them as object variable, access only a subset of compounds for that. def neighbors_balanced(s, l, start, offset) @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm - @neighbors = [] - begin - #@fingerprints.each do |training_compound,training_features| # AM: this is original by CH [ l[start, offset ] , s ].flatten.each do |training_compound| # AM: access only a balanced subset training_features = @fingerprints[training_compound] - sim = eval("#{@similarity_algorithm}(@compound_features,training_features,@p_values)") - if sim > @min_sim - @activities[training_compound].each do |act| - this_neighbor = { - :compound => training_compound, - :similarity => sim, - :features => training_features, - :activity => act - } - @neighbors << this_neighbor - end - end - end - rescue Exception => e - LOGGER.error "BLAZAR failed in neighbors: "+e.class.to_s+": "+e.message + add_neighbor training_features end end - - # Find neighbors and store them as object variable + # Find neighbors and store them as object variable. def neighbors - - @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm - - @neighbors = [] - @fingerprints.each do |training_compound,training_features| - sim = eval("#{@similarity_algorithm}(@compound_features,training_features,@p_values)") - if sim > @min_sim - @activities[training_compound].each do |act| - @neighbors << { - :compound => training_compound, - :similarity => sim, - :features => training_features, - :activity => act - } - end + @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm + @neighbors = [] + @fingerprints.each do |training_compound,training_features| # AM: access all compounds + add_neighbor training_features + end + end + + # Adds a neighbor to @neighbors if it passes the similarity threshold. + def add_neighbor(training_features) + sim = eval("#{@similarity_algorithm}(@compound_features,training_features,@p_values)") + if sim > @min_sim + @activities[training_compound].each do |act| + @neighbors << { + :compound => training_compound, + :similarity => sim, + :features => training_features, + :activity => act + } end - end + end end # Find database activities and store them in @prediction_dataset -- cgit v1.2.3 From baca9424a84b6a21363cac891cdef72f44c116b1 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 25 May 2011 10:08:04 +0200 Subject: remove duplicate debug msg --- lib/rest_client_wrapper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 747a353..53887a2 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -131,7 +131,7 @@ module OpenTox raise "unknown content-type for task : '"+res.content_type.to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+res[0..200].to_s end - LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" + #LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" task.wait_for_completion waiting_task unless task.completed? # maybe task was cancelled / error if task.errorReport -- cgit v1.2.3 From baffedfc7543cfc8a90fc185fc91f2748ce94528 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 25 May 2011 10:24:13 +0200 Subject: Fixed add_neighbor --- lib/model.rb | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index f5e0410..3d27706 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -338,28 +338,45 @@ module OpenTox @prediction_dataset end + # Calculate the propositionalization matrix aka instantiation matrix (0/1 entries for features) +# def get_prop_matrix +# matrix = Array.new +# begin +# @neighbors.each do |n| +# row = [] +# @features.each do |f| +# row << @fingerprints[n].include?(f) ? 0.0 : @p_values[f] +# end +# matrix << row +# end +# rescue Exception => e +# LOGGER.debug "get_prop_matrix failed with '" + $! + "'" +# end +# matrix +# end + # Find neighbors and store them as object variable, access only a subset of compounds for that. def neighbors_balanced(s, l, start, offset) @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm @neighbors = [] [ l[start, offset ] , s ].flatten.each do |training_compound| # AM: access only a balanced subset training_features = @fingerprints[training_compound] - add_neighbor training_features + add_neighbor training_features, training_compound end end - # Find neighbors and store them as object variable. + # Find neighbors and store them as object variable, access all compounds for that. def neighbors @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm @neighbors = [] @fingerprints.each do |training_compound,training_features| # AM: access all compounds - add_neighbor training_features + add_neighbor training_features, training_compound end end # Adds a neighbor to @neighbors if it passes the similarity threshold. - def add_neighbor(training_features) + def add_neighbor(training_features, training_compound) sim = eval("#{@similarity_algorithm}(@compound_features,training_features,@p_values)") if sim > @min_sim @activities[training_compound].each do |act| -- cgit v1.2.3 From 52e73a3da8e99da9a0a973b6ef9934297bc6511e Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 25 May 2011 11:55:41 +0200 Subject: remove check for task status when code is 201 (after discussion with nina and fabian) --- lib/task.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/task.rb b/lib/task.rb index 42d3d17..146a756 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -288,7 +288,8 @@ module OpenTox if @http_code == 202 raise "#{@uri}: illegal task state, code is 202, but hasStatus is not Running: '"+@metadata[OT.hasStatus]+"'" unless running? elsif @http_code == 201 - raise "#{@uri}: illegal task state, code is 201, but hasStatus is not Completed: '"+@metadata[OT.hasStatus]+"'" unless completed? + # ignore hasStatus + # raise "#{@uri}: illegal task state, code is 201, but hasStatus is not Completed: '"+@metadata[OT.hasStatus]+"'" unless completed? raise "#{@uri}: illegal task state, code is 201, resultURI is no task-URI: '"+@metadata[OT.resultURI].to_s+ "'" unless @metadata[OT.resultURI] and @metadata[OT.resultURI].to_s.uri? end -- cgit v1.2.3 From b6ba84a077db9f6c708807f059e501333f7303b1 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 25 May 2011 12:18:08 +0200 Subject: 1st v --- lib/model.rb | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 3d27706..bebf5d3 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -215,6 +215,7 @@ module OpenTox (i == modulo[0]) && (slack>0) ? lr_size = s.size + slack : lr_size = s.size + addon # determine fraction LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." neighbors_balanced(s, l, position, lr_size) # get ratio fraction of larger part + prop_matrix = get_prop_matrix prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") if prediction_best.nil? || prediction[:confidence].abs > prediction_best[:confidence].abs prediction_best=prediction @@ -228,10 +229,11 @@ module OpenTox prediction=prediction_best @neighbors=neighbors_best - ### END AM balanced predictions + ### END AM balanced predictions else # regression case: no balancing neighbors + prop_matrix = get_prop_matrix prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") end @@ -339,21 +341,26 @@ module OpenTox end # Calculate the propositionalization matrix aka instantiation matrix (0/1 entries for features) -# def get_prop_matrix -# matrix = Array.new -# begin -# @neighbors.each do |n| -# row = [] -# @features.each do |f| -# row << @fingerprints[n].include?(f) ? 0.0 : @p_values[f] -# end -# matrix << row -# end -# rescue Exception => e -# LOGGER.debug "get_prop_matrix failed with '" + $! + "'" -# end -# matrix -# end + def get_prop_matrix + matrix = Array.new + begin + @neighbors.each do |n| + n = n[:compound] + row = [] + @features.each do |f| + if ! @fingerprints[n].nil? + row << (@fingerprints[n].include?(f) ? 0.0 : @p_values[f]) + else + row << 0.0 + end + end + matrix << row + end + rescue Exception => e + LOGGER.debug "get_prop_matrix failed with '" + $! + "'" + end + matrix + end # Find neighbors and store them as object variable, access only a subset of compounds for that. def neighbors_balanced(s, l, start, offset) -- cgit v1.2.3 From d012b9e8da641c342c455a1384ddf3b14f5b5c35 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 25 May 2011 12:38:04 +0200 Subject: 2nd v --- lib/model.rb | 87 ++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index bebf5d3..f4df8ea 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -177,7 +177,7 @@ module OpenTox return @prediction_dataset if database_activity(subjectid) - if metadata[RDF.type] == [OTA.ClassificationLazySingleTarget] + if metadata[RDF.type] == [OTA.ClassificationLazySingleTarget] # AM: Balancing, see http://www.maunz.de/wordpress/opentox/2011/balanced-lazar l = Array.new # larger s = Array.new # smaller fraction @@ -211,33 +211,33 @@ module OpenTox neighbors_best=nil begin - for i in 1..modulo[0] do - (i == modulo[0]) && (slack>0) ? lr_size = s.size + slack : lr_size = s.size + addon # determine fraction - LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." - neighbors_balanced(s, l, position, lr_size) # get ratio fraction of larger part - prop_matrix = get_prop_matrix - prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") - if prediction_best.nil? || prediction[:confidence].abs > prediction_best[:confidence].abs - prediction_best=prediction - neighbors_best=@neighbors + for i in 1..modulo[0] do + (i == modulo[0]) && (slack>0) ? lr_size = s.size + slack : lr_size = s.size + addon # determine fraction + LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." + neighbors_balanced(s, l, position, lr_size) # get ratio fraction of larger part + props = get_props + prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") + if prediction_best.nil? || prediction[:confidence].abs > prediction_best[:confidence].abs + prediction_best=prediction + neighbors_best=@neighbors + end + position = position + lr_size end - position = position + lr_size - end rescue Exception => e LOGGER.error "BLAZAR failed in prediction: "+e.class.to_s+": "+e.message end prediction=prediction_best @neighbors=neighbors_best - ### END AM balanced predictions + ### END AM balanced predictions else # regression case: no balancing neighbors - prop_matrix = get_prop_matrix + props = get_props prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") end - - # TODO: reasonable feature name + + # TODO: reasonable feature name #prediction_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),@prediction_dataset.compounds.size.to_s) value_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),"value") confidence_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),"confidence") @@ -245,7 +245,7 @@ module OpenTox prediction_feature_uris = {value_feature_uri => prediction[:prediction], confidence_feature_uri => prediction[:confidence]} #prediction_feature_uris[value_feature_uri] = "No similar compounds in training dataset." if @neighbors.size == 0 or prediction[:prediction].nil? prediction_feature_uris[value_feature_uri] = nil if @neighbors.size == 0 or prediction[:prediction].nil? - + #@prediction_dataset.metadata[OT.dependentVariables] = prediction_feature_uri @prediction_dataset.metadata[OT.dependentVariables] = @metadata[OT.dependentVariables] @@ -275,10 +275,10 @@ module OpenTox DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), # TODO: factor information to value }) - #OT.prediction => prediction[:prediction], - #OT.confidence => prediction[:confidence], - #OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] - @prediction_dataset.add @compound.uri, prediction_feature_uri, value + #OT.prediction => prediction[:prediction], + #OT.confidence => prediction[:confidence], + #OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] + @prediction_dataset.add @compound.uri, prediction_feature_uri, value end if verbose @@ -341,34 +341,39 @@ module OpenTox end # Calculate the propositionalization matrix aka instantiation matrix (0/1 entries for features) - def get_prop_matrix + # Same for the vector describing the query compound + def get_props matrix = Array.new begin - @neighbors.each do |n| - n = n[:compound] + @neighbors.each do |n| + n = n[:compound] + row = [] + @features.each do |f| + if ! @fingerprints[n].nil? + row << (@fingerprints[n].include?(f) ? 0.0 : @p_values[f]) + else + row << 0.0 + end + end + matrix << row + end row = [] @features.each do |f| - if ! @fingerprints[n].nil? - row << (@fingerprints[n].include?(f) ? 0.0 : @p_values[f]) - else - row << 0.0 - end + row << (@compound.match([f]).size == 0 ? 0.0 : @p_values[f]) end - matrix << row - end rescue Exception => e - LOGGER.debug "get_prop_matrix failed with '" + $! + "'" + LOGGER.debug "get_props failed with '" + $! + "'" end - matrix + [ matrix, row ] end # Find neighbors and store them as object variable, access only a subset of compounds for that. def neighbors_balanced(s, l, start, offset) @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm @neighbors = [] - [ l[start, offset ] , s ].flatten.each do |training_compound| # AM: access only a balanced subset - training_features = @fingerprints[training_compound] - add_neighbor training_features, training_compound + [ l[start, offset ] , s ].flatten.each do |training_compound| # AM: access only a balanced subset + training_features = @fingerprints[training_compound] + add_neighbor training_features, training_compound end end @@ -378,7 +383,7 @@ module OpenTox @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm @neighbors = [] @fingerprints.each do |training_compound,training_features| # AM: access all compounds - add_neighbor training_features, training_compound + add_neighbor training_features, training_compound end end @@ -388,10 +393,10 @@ module OpenTox if sim > @min_sim @activities[training_compound].each do |act| @neighbors << { - :compound => training_compound, - :similarity => sim, - :features => training_features, - :activity => act + :compound => training_compound, + :similarity => sim, + :features => training_features, + :activity => act } end end -- cgit v1.2.3 From 153c740268c1bf6255f14f80550f690179a72fd9 Mon Sep 17 00:00:00 2001 From: mr Date: Wed, 25 May 2011 13:35:42 +0200 Subject: fix if subjectid is nil --- lib/helper.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/helper.rb b/lib/helper.rb index 3a6126a..995f3e9 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -44,8 +44,9 @@ helpers do def uri_available?(urlStr) url = URI.parse(urlStr) + subjectidstr = @subjectid ? "?subjectid=#{CGI.escape @subjectid}" : "" Net::HTTP.start(url.host, url.port) do |http| - return http.head("#{url.request_uri}?subjectid=#{CGI.escape @subjectid}").code == "200" + return http.head("#{url.request_uri}#{subjectidstr}").code == "200" end end -- cgit v1.2.3 From a76a0c8d8ee259f1818a5fa2b5c4986fa460d888 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Wed, 25 May 2011 13:59:53 +0200 Subject: re-enabled cookie-authentication for html-access to webservices, replaced login/logout with sign in/out to avoid name clash with toxcreate --- lib/to-html.rb | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/lib/to-html.rb b/lib/to-html.rb index 51602d7..2c29f7d 100644 --- a/lib/to-html.rb +++ b/lib/to-html.rb @@ -36,11 +36,11 @@ module OpenTox user = OpenTox::Authorization.get_user(subjectid) if subjectid html += "

" unless user - html += "You are currently not logged in to "+$url_provider.url_for("",:full)+ - ", login" + html += "You are currently not signed in to "+$url_provider.url_for("",:full)+ + ", sign in" else - html += "You are logged in as '#{user}' to "+$url_provider.url_for("",:full)+ - ", logout" + html += "You are signed in as '#{user}' to "+$url_provider.url_for("",:full)+ + ", sign out" end html += "

" end @@ -67,46 +67,44 @@ module OpenTox html end - def self.login( msg=nil ) + def self.sign_in( msg=nil ) html = "Login" - html += "
" + html += "" html += "

" html += msg+"\n\n" if msg - html += "Please login to "+$url_provider.url_for("",:full)+"\n\n" + html += "Please sign in to "+$url_provider.url_for("",:full)+"\n\n" html += "" html += ""+ ""+ #""+ - "" + "" html += "
user:
password:

" html end end -=begin -get '/logout/?' do +get '/sign_out/?' do response.set_cookie("subjectid",{:value=>nil}) content_type "text/html" - content = "Sucessfully logged out from "+$url_provider.url_for("",:full) + content = "Sucessfully signed out from "+$url_provider.url_for("",:full) OpenTox.text_to_html(content) end -get '/login/?' do +get '/sign_in/?' do content_type "text/html" - OpenTox.login + OpenTox.sign_in end -post '/login/?' do +post '/sign_in/?' do subjectid = OpenTox::Authorization.authenticate(params[:user], params[:password]) if (subjectid) response.set_cookie("subjectid",{:value=>subjectid}) content_type "text/html" - content = "Sucessfully logged in as '"+params[:user]+"' to "+$url_provider.url_for("",:full) + content = "Sucessfully signed in as '"+params[:user]+"' to "+$url_provider.url_for("",:full) OpenTox.text_to_html(content,subjectid) else content_type "text/html" - OpenTox.login("Login failed, please try again") + OpenTox.sign_in("Login failed, please try again") end end -=end -- cgit v1.2.3 From 3f209f75a2abe2b8a89df3afcb3f54ec8329a5e1 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 25 May 2011 14:16:34 +0200 Subject: 3rd v --- lib/algorithm.rb | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 5 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 96b9df1..280ed82 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -178,7 +178,7 @@ module OpenTox sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors begin - prediction = local_svm(neighbors, acts, sims, "nu-svr", params) + prediction = (props.nil? ? local_svm(neighbors, acts, sims, "nu-svr", params) : local_svm_prop(neighbors, acts, sims, "nu-svr", params, props)) prediction = (take_logs ? 10**(prediction.to_f) : prediction.to_f) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." rescue Exception => e @@ -194,15 +194,16 @@ module OpenTox # Local support vector classification from neighbors # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required + # @param [Array] props, propositionalization of neighbors and query structure e.g. [ Array_for_q, two-nested-Arrays_for_n ] # @return [Hash] Hash with keys `:prediction, :confidence` - def self.local_svm_classification(neighbors, params) + def self.local_svm_classification(neighbors, params, props=nil) acts = neighbors.collect do |n| act = n[:activity] end # activities of neighbors for supervised learning acts_f = acts.collect {|v| v == true ? 1.0 : 0.0} sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors begin - prediction = local_svm(neighbors, acts_f, sims, "C-bsvc", params) + prediction = (props.nil? ? local_svm(neighbors, acts_f, sims, "C-bsvc", params) : local_svm_prop(neighbors, acts_f, sims, "C-bsvc", params, props)) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." rescue Exception => e LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" @@ -216,14 +217,16 @@ module OpenTox # Local support vector prediction from neighbors. - # Not to be called directly (use local_svm_regression or local_svm_classification. + # Uses pre-defined Kernel Matrix. + # Not to be called directly (use local_svm_regression or local_svm_classification). # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` # @param [Array] acts, activities for neighbors. # @param [Array] sims, similarities for neighbors. # @param [String] type, one of "nu-svr" (regression) or "C-bsvc" (classification). # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required + # @param [Array] props, propositionalization of neighbors and query structure e.g. [ Array_for_q, two-nested-Arrays_for_n ] # @return [Numeric] A prediction value. - def self.local_svm(neighbors, acts, sims, type, params) + def self.local_svm(neighbors, acts, sims, type, params, props=nil) neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel if neighbor_matches.size == 0 @@ -285,6 +288,78 @@ module OpenTox prediction end + # Local support vector prediction from neighbors. + # Uses propositionalized setting. + # Not to be called directly (use local_svm_regression or local_svm_classification). + # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` + # @param [Array] acts, activities for neighbors. + # @param [Array] props, propositionalization of neighbors and query structure e.g. [ Array_for_q, two-nested-Arrays_for_n ] + # @param [String] type, one of "nu-svr" (regression) or "C-bsvc" (classification). + # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required + # @return [Numeric] A prediction value. + def self.local_svm_prop(props, acts, type, params) + + n_prop = props[0] # is a matrix, i.e. two nested Arrays. + q_prop = props[1] # is an Array. + + #neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches + #gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel + if n_prop.size == 0 + raise "No neighbors found." + else + # gram matrix + #(0..(neighbor_matches.length-1)).each do |i| + # gram_matrix[i] = [] unless gram_matrix[i] + # # upper triangle + # ((i+1)..(neighbor_matches.length-1)).each do |j| + # sim = eval("#{params[:similarity_algorithm]}(neighbor_matches[i], neighbor_matches[j], params[:p_values])") + # gram_matrix[i][j] = Algorithm.gauss(sim) + # gram_matrix[j] = [] unless gram_matrix[j] + # gram_matrix[j][i] = gram_matrix[i][j] # lower triangle + # end + # gram_matrix[i][i] = 1.0 + #end + + #LOGGER.debug gram_matrix.to_yaml + @r = RinRuby.new(false,false) # global R instance leads to Socket errors after a large number of requests + @r.eval "library('kernlab')" # this requires R package "kernlab" to be installed + LOGGER.debug "Setting R data ..." + # set data + @r.n_prop = n_prop.flatten + @r.n = n_prop.size + @r.y = acts + @r.q_prop = q_prop + + begin + LOGGER.debug "Preparing R data ..." + # prepare data + @r.eval "y<-as.vector(y)" + @r.eval "prop_matrix<-matrix(n_prop,n,n)" + @r.eval "q_prop<-as.vector(q_prop)" + + # model + support vectors + LOGGER.debug "Creating SVM model ..." + @r.eval "model<-ksvm(prop_matrix, y, type=\"#{type}\", nu=0.5)" + LOGGER.debug "Predicting ..." + if type == "nu-svr" + @r.eval "p<-predict(model,q_prop)[1,1]" + elsif type == "C-bsvc" + @r.eval "p<-predict(model,q_prop)" + end + if type == "nu-svr" + prediction = @r.p + elsif type == "C-bsvc" + prediction = (@r.p.to_f == 1.0 ? true : false) + end + @r.quit # free R + rescue Exception => e + LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" + end + end + prediction + end + + end module Substructure -- cgit v1.2.3 From ca6dd87b7c80611c4f4e4716f68fe6633ce1066b Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 25 May 2011 15:04:50 +0200 Subject: 4th v --- lib/algorithm.rb | 4 ++-- lib/model.rb | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 280ed82..2f722c1 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -178,7 +178,7 @@ module OpenTox sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors begin - prediction = (props.nil? ? local_svm(neighbors, acts, sims, "nu-svr", params) : local_svm_prop(neighbors, acts, sims, "nu-svr", params, props)) + prediction = (props.nil? ? local_svm(neighbors, acts, sims, "nu-svr", params) : local_svm_prop(props, acts, sims, "nu-svr", params)) prediction = (take_logs ? 10**(prediction.to_f) : prediction.to_f) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." rescue Exception => e @@ -203,7 +203,7 @@ module OpenTox acts_f = acts.collect {|v| v == true ? 1.0 : 0.0} sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors begin - prediction = (props.nil? ? local_svm(neighbors, acts_f, sims, "C-bsvc", params) : local_svm_prop(neighbors, acts_f, sims, "C-bsvc", params, props)) + prediction = (props.nil? ? local_svm(neighbors, acts_f, sims, "C-bsvc", params) : local_svm_prop(props, acts_f, sims, "C-bsvc", params)) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." rescue Exception => e LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" diff --git a/lib/model.rb b/lib/model.rb index f4df8ea..6a4602f 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -176,8 +176,7 @@ module OpenTox return @prediction_dataset if database_activity(subjectid) - - if metadata[RDF.type] == [OTA.ClassificationLazySingleTarget] + if metadata[RDF.type].include?([OTA.ClassificationLazySingleTarget][0]) # AM: searching in metadata for classification # AM: Balancing, see http://www.maunz.de/wordpress/opentox/2011/balanced-lazar l = Array.new # larger s = Array.new # smaller fraction @@ -231,7 +230,7 @@ module OpenTox @neighbors=neighbors_best ### END AM balanced predictions - else # regression case: no balancing + else # no balancing as before neighbors props = get_props prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") -- cgit v1.2.3 From 2b12d07bec101df8c10b7ab5aff1491b0997a6c7 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 25 May 2011 17:10:14 +0200 Subject: 6th v --- lib/algorithm.rb | 17 +++++++++-------- lib/model.rb | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 2f722c1..e089184 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -138,7 +138,7 @@ module OpenTox # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity` # @param [optional] params Ignored (only for compatibility with local_svm_regression) # @return [Hash] Hash with keys `:prediction, :confidence` - def self.weighted_majority_vote(neighbors,params={}) + def self.weighted_majority_vote(neighbors,params={}, props=nil) conf = 0.0 confidence = 0.0 neighbors.each do |neighbor| @@ -178,7 +178,7 @@ module OpenTox sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors begin - prediction = (props.nil? ? local_svm(neighbors, acts, sims, "nu-svr", params) : local_svm_prop(props, acts, sims, "nu-svr", params)) + prediction = (props.nil? ? local_svm(neighbors, acts, sims, "nu-svr", params) : local_svm_prop(props, acts, "nu-svr", params)) prediction = (take_logs ? 10**(prediction.to_f) : prediction.to_f) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." rescue Exception => e @@ -203,7 +203,7 @@ module OpenTox acts_f = acts.collect {|v| v == true ? 1.0 : 0.0} sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors begin - prediction = (props.nil? ? local_svm(neighbors, acts_f, sims, "C-bsvc", params) : local_svm_prop(props, acts_f, sims, "C-bsvc", params)) + prediction = (props.nil? ? local_svm(neighbors, acts_f, sims, "C-bsvc", params) : local_svm_prop(props, acts_f, "C-bsvc", params)) LOGGER.debug "Prediction is: '" + prediction.to_s + "'." rescue Exception => e LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" @@ -226,7 +226,7 @@ module OpenTox # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required # @param [Array] props, propositionalization of neighbors and query structure e.g. [ Array_for_q, two-nested-Arrays_for_n ] # @return [Numeric] A prediction value. - def self.local_svm(neighbors, acts, sims, type, params, props=nil) + def self.local_svm(neighbors, acts, sims, type, params) neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel if neighbor_matches.size == 0 @@ -326,16 +326,17 @@ module OpenTox LOGGER.debug "Setting R data ..." # set data @r.n_prop = n_prop.flatten - @r.n = n_prop.size + @r.n_prop_x_size = n_prop.size + @r.n_prop_y_size = n_prop[0].size @r.y = acts @r.q_prop = q_prop begin LOGGER.debug "Preparing R data ..." # prepare data - @r.eval "y<-as.vector(y)" - @r.eval "prop_matrix<-matrix(n_prop,n,n)" - @r.eval "q_prop<-as.vector(q_prop)" + @r.eval "y<-matrix(y)" + @r.eval "prop_matrix<-matrix(n_prop, n_prop_x_size, n_prop_y_size, byrow=TRUE)" + @r.eval "q_prop<-matrix(q_prop, 1, n_prop_y_size, byrow=TRUE)" # model + support vectors LOGGER.debug "Creating SVM model ..." diff --git a/lib/model.rb b/lib/model.rb index 6a4602f..1a5aa37 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -215,7 +215,7 @@ module OpenTox LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." neighbors_balanced(s, l, position, lr_size) # get ratio fraction of larger part props = get_props - prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") + prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values}, props)") if prediction_best.nil? || prediction[:confidence].abs > prediction_best[:confidence].abs prediction_best=prediction neighbors_best=@neighbors @@ -233,7 +233,7 @@ module OpenTox else # no balancing as before neighbors props = get_props - prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") + prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values}, props)") end # TODO: reasonable feature name -- cgit v1.2.3 From 77c885b7394aa11ba5e59eb60884205332efa31a Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 26 May 2011 08:38:21 +0200 Subject: 7th v --- lib/algorithm.rb | 2 ++ lib/model.rb | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index e089184..91e075a 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -227,6 +227,7 @@ module OpenTox # @param [Array] props, propositionalization of neighbors and query structure e.g. [ Array_for_q, two-nested-Arrays_for_n ] # @return [Numeric] A prediction value. def self.local_svm(neighbors, acts, sims, type, params) + LOGGER.debug "Local SVM (Weighted Tanimoto Kernel)." neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel if neighbor_matches.size == 0 @@ -299,6 +300,7 @@ module OpenTox # @return [Numeric] A prediction value. def self.local_svm_prop(props, acts, type, params) + LOGGER.debug "Local SVM (Propositionalization / Kernlab Kernel)." n_prop = props[0] # is a matrix, i.e. two nested Arrays. q_prop = props[1] # is an Array. diff --git a/lib/model.rb b/lib/model.rb index 1a5aa37..921335c 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -214,7 +214,7 @@ module OpenTox (i == modulo[0]) && (slack>0) ? lr_size = s.size + slack : lr_size = s.size + addon # determine fraction LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." neighbors_balanced(s, l, position, lr_size) # get ratio fraction of larger part - props = get_props + (@prediction_algorithm.include? "svm" and params[:prop_kernel] == "true") ? props = get_props : props = nil prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values}, props)") if prediction_best.nil? || prediction[:confidence].abs > prediction_best[:confidence].abs prediction_best=prediction @@ -232,7 +232,7 @@ module OpenTox else # no balancing as before neighbors - props = get_props + (@prediction_algorithm.include? "svm" and params[:prop_kernel] == "true") ? props = get_props : props = nil prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values}, props)") end -- cgit v1.2.3 From f13763a8505ad997739b65d7cfcd804411ff9c77 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 26 May 2011 10:56:31 +0200 Subject: unify access to classification feature domain, replace methode feature_values with accept_values --- lib/dataset.rb | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 4dc4296..fc7c263 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -167,16 +167,13 @@ module OpenTox @features end - def feature_classes(feature, subjectid=nil) - if Feature.find(feature, subjectid).feature_type == "classification" - classes = [] - @data_entries.each do |c,e| - e[feature].each { |v| classes << v.to_s } - end - classes.uniq.sort - else - nil - end + # returns the accept_values of a feature, i.e. the classification domain / all possible feature values + # @param [String] feature the URI of the feature + # @return [Array] return array with strings, nil if value is not set (e.g. when feature is numeric) + def accept_values(feature) + accept_values = features[feature][OT.acceptValue] + accept_values.sort if accept_values + accept_values end # Detect feature type(s) in the dataset -- cgit v1.2.3 From 065fdeb351f68d0445b66516ccf8e7cfcc7e2a1f Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 26 May 2011 12:22:07 +0200 Subject: Fixed prediction type switching --- lib/model.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/model.rb b/lib/model.rb index 921335c..d63eef2 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -176,7 +176,10 @@ module OpenTox return @prediction_dataset if database_activity(subjectid) - if metadata[RDF.type].include?([OTA.ClassificationLazySingleTarget][0]) # AM: searching in metadata for classification + load_metadata(subjectid) + case OpenTox::Feature.find(metadata[OT.dependentVariables]).feature_type + when "classification" + # AM: Balancing, see http://www.maunz.de/wordpress/opentox/2011/balanced-lazar l = Array.new # larger s = Array.new # smaller fraction @@ -231,6 +234,7 @@ module OpenTox ### END AM balanced predictions else # no balancing as before + LOGGER.info "LAZAR: Unbalanced." neighbors (@prediction_algorithm.include? "svm" and params[:prop_kernel] == "true") ? props = get_props : props = nil prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values}, props)") -- cgit v1.2.3 From f507227fd4efff3c8b32b2a8c8f2860af2546e3b Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 26 May 2011 13:11:32 +0200 Subject: Hotfix: Switch to balanced mode. --- lib/model.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 139aed8..14471cc 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -176,11 +176,15 @@ module OpenTox return @prediction_dataset if database_activity(subjectid) - - if metadata[RDF.type] == [OTA.ClassificationLazySingleTarget] + load_metadata(subjectid) + case OpenTox::Feature.find(metadata[OT.dependentVariables]).feature_type + when "classification" # AM: Balancing, see http://www.maunz.de/wordpress/opentox/2011/balanced-lazar l = Array.new # larger s = Array.new # smaller fraction + + raise "no fingerprints in model" if @fingerprints.size==0 + @fingerprints.each do |training_compound,training_features| @activities[training_compound].each do |act| case act.to_s @@ -231,6 +235,7 @@ module OpenTox ### END AM balanced predictions else # regression case: no balancing + LOGGER.info "LAZAR: Unbalanced." neighbors prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") end -- cgit v1.2.3 From 3922c8e5fcb9fbe6ddedab9f70e114717ff33a60 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 26 May 2011 14:28:19 +0200 Subject: 8th v --- lib/algorithm.rb | 2 +- lib/model.rb | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 91e075a..2652695 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -164,7 +164,7 @@ module OpenTox # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required # @return [Hash] Hash with keys `:prediction, :confidence` - def self.local_svm_regression(neighbors, params) + def self.local_svm_regression(neighbors, params, props=nil) take_logs=true neighbors.each do |n| if (! n[:activity].nil?) && (n[:activity].to_f < 0.0) diff --git a/lib/model.rb b/lib/model.rb index 7c2ef58..28c05a9 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -69,7 +69,7 @@ module OpenTox include Model include Algorithm - attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm, :min_sim, :subjectid + attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm, :min_sim, :subjectid, :prop_kernel def initialize(uri=nil) @@ -92,6 +92,7 @@ module OpenTox @prediction_algorithm = "Neighbors.weighted_majority_vote" @min_sim = 0.3 + @prop_kernel = false end @@ -219,7 +220,11 @@ module OpenTox (i == modulo[0]) && (slack>0) ? lr_size = s.size + slack : lr_size = s.size + addon # determine fraction LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." neighbors_balanced(s, l, position, lr_size) # get ratio fraction of larger part - (@prediction_algorithm.include? "svm" and params[:prop_kernel] == "true") ? props = get_props : props = nil + if @prop_kernel && @prediction_algorithm.include?("svm") + props = get_props + else + props = nil + end prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values}, props)") if prediction_best.nil? || prediction[:confidence].abs > prediction_best[:confidence].abs prediction_best=prediction @@ -235,10 +240,14 @@ module OpenTox @neighbors=neighbors_best ### END AM balanced predictions - else # regression case: no balancing + else # AM: no balancing LOGGER.info "LAZAR: Unbalanced." neighbors - (@prediction_algorithm.include? "svm" and params[:prop_kernel] == "true") ? props = get_props : props = nil + if @prop_kernel && @prediction_algorithm.include?("svm") + props = get_props + else + props = nil + end prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values}, props)") end -- cgit v1.2.3 From a1135de5d9911838f4c020d73be9c462cba709d1 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 26 May 2011 15:46:15 +0200 Subject: fix blazar nil error --- lib/model.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/model.rb b/lib/model.rb index 14471cc..edaa696 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -207,7 +207,7 @@ module OpenTox # AM: Balanced predictions addon = (modulo[1].to_f/modulo[0]).ceil # what will be added in each round - slack = modulo[1].divmod(addon)[1] # what remains for the last round + slack = (addon!=0 ? modulo[1].divmod(addon)[1] : 0) # what remains for the last round position = 0 predictions = Array.new -- cgit v1.2.3 From 1ddea6e712319b7f21a6acf24739a2ef54c41042 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 26 May 2011 20:52:10 +0000 Subject: predicted/value and predicted/confidence stored as separate features in model --- lib/model.rb | 67 ++++++++++++++++++++++++++----------------------------- lib/serializer.rb | 2 ++ 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 139aed8..31a513e 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -168,7 +168,6 @@ module OpenTox @prediction_dataset.add_metadata( { OT.hasSource => @uri, DC.creator => @uri, - # TODO: fix dependentVariable DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] } ) @@ -235,47 +234,16 @@ module OpenTox prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values})") end - # TODO: reasonable feature name - #prediction_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),@prediction_dataset.compounds.size.to_s) - value_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),"value") - confidence_feature_uri = File.join( @prediction_dataset.uri, "feature", "prediction", File.basename(@metadata[OT.dependentVariables]),"confidence") + value_feature_uri = File.join( @uri, "predicted", "value") + confidence_feature_uri = File.join( @uri, "predicted", "confidence") prediction_feature_uris = {value_feature_uri => prediction[:prediction], confidence_feature_uri => prediction[:confidence]} - #prediction_feature_uris[value_feature_uri] = "No similar compounds in training dataset." if @neighbors.size == 0 or prediction[:prediction].nil? prediction_feature_uris[value_feature_uri] = nil if @neighbors.size == 0 or prediction[:prediction].nil? - #@prediction_dataset.metadata[OT.dependentVariables] = prediction_feature_uri @prediction_dataset.metadata[OT.dependentVariables] = @metadata[OT.dependentVariables] + @prediction_dataset.metadata[OT.predictedVariables] = [value_feature_uri, confidence_feature_uri] -=begin - if @neighbors.size == 0 - prediction_feature_uris.each do |prediction_feature_uri,value| - @prediction_dataset.add_feature(prediction_feature_uri, { - RDF.type => [OT.MeasuredFeature], - OT.hasSource => @uri, - DC.creator => @uri, - DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), - OT.error => "No similar compounds in training dataset.", - #OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] - }) - @prediction_dataset.add @compound.uri, prediction_feature_uri, value - end - - else -=end prediction_feature_uris.each do |prediction_feature_uri,value| - @prediction_dataset.metadata[OT.predictedVariables] = [] unless @prediction_dataset.metadata[OT.predictedVariables] - @prediction_dataset.metadata[OT.predictedVariables] << prediction_feature_uri - @prediction_dataset.add_feature(prediction_feature_uri, { - RDF.type => [OT.ModelPrediction], - OT.hasSource => @uri, - DC.creator => @uri, - DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), - # TODO: factor information to value - }) - #OT.prediction => prediction[:prediction], - #OT.confidence => prediction[:confidence], - #OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] @prediction_dataset.add @compound.uri, prediction_feature_uri, value end @@ -401,6 +369,35 @@ module OpenTox end end + def prediction_features + [prediction_value_feature,prediction_confidence_feature] + end + + def prediction_value_feature + dependent_uri = @metadata[OT.dependentVariables].first + feature = OpenTox::Feature.new File.join( @uri, "predicted", "value") + feature.add_metadata( { + RDF.type => [OT.ModelPrediction], + OT.hasSource => @uri, + DC.creator => @uri, + DC.title => URI.decode(File.basename( dependent_uri )), + OWL.sameAs => dependent_uri + }) + feature + end + + def prediction_confidence_feature + dependent_uri = @metadata[OT.dependentVariables].first + feature = OpenTox::Feature.new File.join( @uri, "predicted", "confidence") + feature.add_metadata( { + RDF.type => [OT.ModelPrediction], + OT.hasSource => @uri, + DC.creator => @uri, + DC.title => "#{URI.decode(File.basename( dependent_uri ))} confidence" + }) + feature + end + # Save model at model service def save(subjectid) self.uri = RestClientWrapper.post(@uri,self.to_yaml,{:content_type => "application/x-yaml", :subjectid => subjectid}) diff --git a/lib/serializer.rb b/lib/serializer.rb index 62c1159..5a9fd0a 100644 --- a/lib/serializer.rb +++ b/lib/serializer.rb @@ -50,6 +50,7 @@ module OpenTox OT.parameters => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.featureDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.dependentVariables => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , + OT.predictedVariables => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , OT.paramValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , #object props for validation# @@ -191,6 +192,7 @@ module OpenTox @object[metadata[OT.featureDataset]] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Dataset }] } @object[metadata[OT.trainingDataset]] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Dataset }] } @object[metadata[OT.dependentVariables]] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Feature }] } + metadata[OT.predictedVariables].each{|feature| @object[feature] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Feature }] }} # TODO: add algorithms from parameters @object["http://ot-dev.in-silico.ch/algorithm/fminer/bbrc"] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } @object["http://ot-dev.in-silico.ch/algorithm/fminer/last"] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } -- cgit v1.2.3 From af426336f15e1f4b58c87bf09571721bb42a388f Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 27 May 2011 10:06:12 +0200 Subject: predicted variable and confidence can now be derieved from model, adjust feature_type accordingly --- lib/feature.rb | 26 ++++++++++++------------- lib/model.rb | 60 +++++++++++++++++++++++++++++++++++++++------------------- 2 files changed, 54 insertions(+), 32 deletions(-) diff --git a/lib/feature.rb b/lib/feature.rb index 2f1ab6c..f3bec5c 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -2,6 +2,8 @@ module OpenTox class Feature include OpenTox + attr_accessor :subjectid + # Find a feature # @param [String] uri Feature URI # @return [OpenTox::Task] Feature object @@ -13,9 +15,9 @@ module OpenTox else feature.add_metadata Parser::Owl::Dataset.new(uri).load_metadata end + feature.subjectid = subjectid feature end - # provides feature type, possible types are "regression" or "classification" # @return [String] feature type, unknown if OT.isA property is unknown/ not set @@ -24,21 +26,19 @@ module OpenTox "classification" elsif metadata[RDF.type].flatten.include?(OT.NumericFeature) "regression" - else - #"unknown" - metadata[RDF.type].inspect - end -=begin - case metadata[RDF.type] - when /NominalFeature/ - "classification" - when /NumericFeature/ - "regression" + elsif metadata[OWL.sameAs] + metadata[OWL.sameAs].each do |f| + begin + type = Feature.find(f, subjectid).feature_type + return type unless type=="unknown" + rescue => ex + LOGGER.warn "could not load same-as-feature '"+f.to_s+"' for feature '"+uri.to_s+"' : "+ex.message.to_s + end + end + "unknown" else "unknown" end -=end end - end end diff --git a/lib/model.rb b/lib/model.rb index baf01a6..f0fd46b 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -38,29 +38,51 @@ module OpenTox # provides feature type, possible types are "regression" or "classification" # @return [String] feature type, "unknown" if type could not be estimated def feature_type(subjectid=nil) - return @feature_type if @feature_type - - # dynamically perform restcalls if necessary - load_metadata(subjectid) if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) - algorithm = OpenTox::Algorithm::Generic.find(@metadata[OT.algorithm], subjectid) - algorithm_title = algorithm ? algorithm.metadata[DC.title] : nil - algorithm_type = algorithm ? algorithm.metadata[RDF.type] : nil - dependent_variable = OpenTox::Feature.find( @metadata[OT.dependentVariables],subjectid ) - dependent_variable_type = dependent_variable ? dependent_variable.feature_type : nil - type_indicators = [dependent_variable_type, @metadata[RDF.type], @metadata[DC.title], @uri, algorithm_type, algorithm_title].flatten - type_indicators.each do |type| - case type - when /(?i)classification/ - @feature_type = "classification" - break - when /(?i)regression/ - @feature_type = "regression" - end + unless @feature_type + load_predicted_variables( subjectid ) unless @predicted_variable + @feature_type = OpenTox::Feature.find( @predicted_variable, subjectid ).feature_type end - raise "unknown model "+type_indicators.inspect unless @feature_type @feature_type end + + def predicted_variable( subjectid ) + load_predicted_variables( subjectid ) unless @predicted_variable + @predicted_variable + end + def predicted_confidence( subjectid ) + load_predicted_variables( subjectid ) unless @predicted_confidence + @predicted_confidence + end + + private + def load_predicted_variables( subjectid=nil ) + load_metadata(subjectid) if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) + if @metadata[OT.predictedVariables] + predictedVariables = @metadata[OT.predictedVariables] + if predictedVariables.is_a?(Array) + if (predictedVariables.size==1) + @predicted_variable = predictedVariables[0] + elsif (predictedVariables.size==2) + # PENDING identify confidence + conf_index = -1 + predictedVariables.size.times do |i| + f = OpenTox::Feature.find(predictedVariables[i]) + conf_index = i if f.metadata[DC.title]=~/(?i)confidence/ + end + raise "could not estimate predicted variable from model: '"+uri.to_s+ + "', number of predicted-variables==2, but no confidence found" if conf_index==-1 + @predicted_variable = predictedVariables[1-conf_index] + @predicted_confidence = predictedVariables[conf_index] + else + raise "could not estimate predicted variable from model: '"+uri.to_s+"', number of predicted-variables > 2" + end + else + raise "could not estimate predicted variable from model: '"+uri.to_s+"', predicted-variables is no array" + end + end + raise "could not estimate predicted variable from model: '"+uri.to_s+"'" unless @predicted_variable + end end # Lazy Structure Activity Relationship class -- cgit v1.2.3 From 24df87ffb307af4dbff9a19af43734e0f02b81eb Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 27 May 2011 17:09:09 +0000 Subject: explicit gem versions --- Rakefile | 78 +++++++++++++++++++++++++++------------------------------------- 1 file changed, 33 insertions(+), 45 deletions(-) diff --git a/Rakefile b/Rakefile index acf32d4..f402e0d 100644 --- a/Rakefile +++ b/Rakefile @@ -10,51 +10,39 @@ begin gem.email = "helma@in-silico.ch" gem.homepage = "http://github.com/helma/opentox-ruby" gem.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] - # dependencies - [ "sinatra", - "emk-sinatra-url-for", - "sinatra-respond_to", - "sinatra-static-assets", - "rest-client", - "rack", - "rack-contrib", - "rack-flash", - "nokogiri", - "rubyzip", - "roo", - "spreadsheet", - "google-spreadsheet-ruby", - "yajl-ruby", - "tmail", - "rinruby", - "ohm", - "ohm-contrib", - "SystemTimer", - "rjb", - #valiation-gems - "dm-core", - "dm-serializer", - "dm-timestamps", - "dm-types", - "dm-migrations", - "dm-validations", - "dm-sqlite-adapter" - ].each { |dep| gem.add_dependency dep } -=begin - [ "dm-core", - 'dm-serializer', - 'dm-timestamps', - 'dm-types', - 'dm-migrations', - "dm-mysql-adapter", - "dm-validations", - ].each {|dep| gem.add_dependency dep, ">= 1" } -=end - #valiation-gem - gem.add_dependency "haml", ">=3" - # validation-gems - gem.add_dependency "ruby-plot", "~>0.5.0" - ['jeweler'].each { |dep| gem.add_development_dependency dep } + # dependencies with versions + gem.add_dependency "sinatra", "=1.2.6" + gem.add_dependency "emk-sinatra-url-for", "=0.2.1" + gem.add_dependency "sinatra-respond_to", "=0.7.0" + gem.add_dependency "sinatra-static-assets", "=0.5.0" + gem.add_dependency "rest-client", "=1.6.1" + gem.add_dependency "rack", "=1.3.0" + gem.add_dependency "rack-contrib", "=1.1.0" + gem.add_dependency "rack-flash", "=0.1.1" + gem.add_dependency "nokogiri", "=1.4.4" + gem.add_dependency "rubyzip", "=0.9.4" + gem.add_dependency "roo", "=1.9.3" + gem.add_dependency "spreadsheet", "=0.6.5.4" + gem.add_dependency "google-spreadsheet-ruby", "=0.1.5" + gem.add_dependency "yajl-ruby", "=0.8.2" + gem.add_dependency "tmail", "=1.2.7.1" + gem.add_dependency "rinruby", "=2.0.2" + gem.add_dependency "ohm", "=0.1.3" + gem.add_dependency "ohm-contrib", "=0.1.1" + gem.add_dependency "SystemTimer", "=1.2.3" + gem.add_dependency "rjb", "=1.3.4" + gem.add_dependency "haml", "=3.1.1" + #valiation-gems + gem.add_dependency "dm-core", "=1.1.0" + gem.add_dependency "dm-serializer", "=1.1.0" + gem.add_dependency "dm-timestamps", "=1.1.0" + gem.add_dependency "dm-types", "=1.1.0" + gem.add_dependency "dm-migrations", "=1.1.0" + gem.add_dependency "dm-validations", "=1.1.0" + gem.add_dependency "dm-sqlite-adapter", "=1.1.0" + gem.add_dependency "ruby-plot", "=0.5.0" + + gem.add_development_dependency 'jeweler' gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] end Jeweler::GemcutterTasks.new -- cgit v1.2.3 From 1dbf257583fb68658f4ba4ecde3602ebef07e540 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 30 May 2011 08:17:43 +0000 Subject: mail exceptions disabled --- Rakefile | 2 +- lib/config/config_ru.rb | 2 ++ lib/environment.rb | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index f402e0d..4fb851e 100644 --- a/Rakefile +++ b/Rakefile @@ -25,7 +25,7 @@ begin gem.add_dependency "spreadsheet", "=0.6.5.4" gem.add_dependency "google-spreadsheet-ruby", "=0.1.5" gem.add_dependency "yajl-ruby", "=0.8.2" - gem.add_dependency "tmail", "=1.2.7.1" + #gem.add_dependency "mail", "=2.3.0" gem.add_dependency "rinruby", "=2.0.2" gem.add_dependency "ohm", "=0.1.3" gem.add_dependency "ohm-contrib", "=0.1.1" diff --git a/lib/config/config_ru.rb b/lib/config/config_ru.rb index 93df867..dc04263 100644 --- a/lib/config/config_ru.rb +++ b/lib/config/config_ru.rb @@ -19,6 +19,7 @@ set :lock, true end use Rack::ShowExceptions +=begin if defined?(MAIL) # monkeypatch with the original method @@ -50,3 +51,4 @@ if defined?(MAIL) mail.smtp MAIL end end +=end diff --git a/lib/environment.rb b/lib/environment.rb index ffc4f60..28a9a66 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -27,7 +27,7 @@ end Ohm.connect :thread_safe => true # load mail settings for error messages -load File.join config_dir,"mail.rb" if File.exists?(File.join config_dir,"mail.rb") +#load File.join config_dir,"mail.rb" if File.exists?(File.join config_dir,"mail.rb") logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" #LOGGER = OTLogger.new(logfile,'daily') # daily rotation -- cgit v1.2.3 From a5945d10144e49ff983dd02b0860aeb4e4e8ab1c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 31 May 2011 08:59:18 +0000 Subject: keep classes from external datasets --- lib/model.rb | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 4321646..02fabfa 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -91,7 +91,7 @@ module OpenTox include Model include Algorithm - attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm, :min_sim, :subjectid, :prop_kernel + attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm, :min_sim, :subjectid, :prop_kernel, :value_map def initialize(uri=nil) @@ -108,6 +108,7 @@ module OpenTox @activities = {} @p_values = {} @fingerprints = {} + @value_map = {} @feature_calculation_algorithm = "Substructure.match" @similarity_algorithm = "Similarity.tanimoto" @@ -275,15 +276,21 @@ module OpenTox value_feature_uri = File.join( @uri, "predicted", "value") confidence_feature_uri = File.join( @uri, "predicted", "confidence") - prediction_feature_uris = {value_feature_uri => prediction[:prediction], confidence_feature_uri => prediction[:confidence]} - prediction_feature_uris[value_feature_uri] = nil if @neighbors.size == 0 or prediction[:prediction].nil? + #prediction_feature_uris = {value_feature_uri => prediction[:prediction], confidence_feature_uri => prediction[:confidence]} + #prediction_feature_uris[value_feature_uri] = nil if @neighbors.size == 0 or prediction[:prediction].nil? @prediction_dataset.metadata[OT.dependentVariables] = @metadata[OT.dependentVariables] @prediction_dataset.metadata[OT.predictedVariables] = [value_feature_uri, confidence_feature_uri] - prediction_feature_uris.each do |prediction_feature_uri,value| - @prediction_dataset.add @compound.uri, prediction_feature_uri, value + if OpenTox::Feature.find(metadata[OT.dependentVariables]).feature_type == "classification" + @prediction_dataset.add @compound.uri, value_feature_uri, @value_map[prediction[:prediction]] + else + @prediction_dataset.add @compound.uri, value_feature_uri, prediction[:prediction] end + @prediction_dataset.add @compound.uri, confidence_feature_uri, prediction[:confidence] + #prediction_feature_uris.each do |prediction_feature_uri,value| + #@prediction_dataset.add @compound.uri, prediction_feature_uri, @value_map[value] + #end if verbose if @feature_calculation_algorithm == "Substructure.match" -- cgit v1.2.3 From b98bc374b119e5a21f43d4f45048376aeeeead09 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 31 May 2011 13:51:09 +0200 Subject: fix set acceptValues when splitting dataset for validation --- lib/dataset.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/dataset.rb b/lib/dataset.rb index fc7c263..5e6a29b 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -304,6 +304,12 @@ module OpenTox end end end + # set feature metadata in new dataset accordingly (including accept values) + features.each do |f| + self.features[f].each do |k,v| + dataset.features[f][k] = v + end + end dataset.add_metadata(metadata) dataset.save(subjectid) dataset -- cgit v1.2.3 From 64354959e04fcac11bcf70e75099691b74573033 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 16 Aug 2011 14:46:31 +0200 Subject: initial minimal version --- README.markdown | 12 +- Rakefile | 50 +++--- bin/opentox-install-debian.sh | 105 ------------ bin/opentox-install-ubuntu.sh | 375 ------------------------------------------ lib/algorithm.rb | 15 +- lib/authorization.rb | 4 +- lib/compound.rb | 21 +-- lib/dataset.rb | 164 ++++++++---------- lib/environment.rb | 12 +- lib/error.rb | 1 - lib/feature.rb | 6 +- lib/helper.rb | 3 +- lib/model.rb | 66 +++++--- lib/opentox-ruby.rb | 17 +- lib/opentox.rb | 16 +- lib/overwrite.rb | 4 + lib/to-html.rb | 1 - 17 files changed, 193 insertions(+), 679 deletions(-) delete mode 100644 bin/opentox-install-debian.sh delete mode 100755 bin/opentox-install-ubuntu.sh diff --git a/README.markdown b/README.markdown index 79bdab2..5f12ad9 100644 --- a/README.markdown +++ b/README.markdown @@ -1,12 +1,14 @@ -opentox-ruby -============ +opentox-ruby-minimal +==================== -Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API +Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API Installation ------------ -opentox-ruby depends on many third party programs and libraries, which makes the setup complicated and error prone. For this reason we recommend to use the installer from [opentox-install](http://github.com/opentox/opentox-install). If you want to install manually you can find the necessary steps in the installation scripts. + sudo gem install opentox-ruby-minimal + +opentox-ruby depends on [rapper](http://librdf.org/raptor/rapper.html) for parsing OWL-DL in RDFXML format. Quickstart ---------- @@ -32,7 +34,7 @@ This example shows how to create a lazar model and predict a compound, it assume prediction = OpenTox::LazarPrediction.find(prediction_uri, subjectid) puts prediction.to_yaml -[API documentation](http://rdoc.info/gems/opentox-ruby/1.0.0/frames) +[API documentation](http://rdoc.info/gems/opentox-ruby-minimal) ------------------------------------------------------------------- Copyright diff --git a/Rakefile b/Rakefile index 4fb851e..7e0bcf9 100644 --- a/Rakefile +++ b/Rakefile @@ -4,43 +4,43 @@ require 'rake' begin require 'jeweler' Jeweler::Tasks.new do |gem| - gem.name = "opentox-ruby" + gem.name = "opentox-ruby-minimal" gem.summary = %Q{Ruby wrapper for the OpenTox REST API} gem.description = %Q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} gem.email = "helma@in-silico.ch" - gem.homepage = "http://github.com/helma/opentox-ruby" + gem.homepage = "http://github.com/opentox/opentox-ruby-minimal" gem.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] # dependencies with versions - gem.add_dependency "sinatra", "=1.2.6" - gem.add_dependency "emk-sinatra-url-for", "=0.2.1" - gem.add_dependency "sinatra-respond_to", "=0.7.0" - gem.add_dependency "sinatra-static-assets", "=0.5.0" +# gem.add_dependency "sinatra", "=1.2.6" +# gem.add_dependency "emk-sinatra-url-for", "=0.2.1" +# gem.add_dependency "sinatra-respond_to", "=0.7.0" +# gem.add_dependency "sinatra-static-assets", "=0.5.0" gem.add_dependency "rest-client", "=1.6.1" - gem.add_dependency "rack", "=1.3.0" - gem.add_dependency "rack-contrib", "=1.1.0" - gem.add_dependency "rack-flash", "=0.1.1" +# gem.add_dependency "rack", "=1.3.0" +# gem.add_dependency "rack-contrib", "=1.1.0" +# gem.add_dependency "rack-flash", "=0.1.1" gem.add_dependency "nokogiri", "=1.4.4" - gem.add_dependency "rubyzip", "=0.9.4" +# gem.add_dependency "rubyzip", "=0.9.4" gem.add_dependency "roo", "=1.9.3" gem.add_dependency "spreadsheet", "=0.6.5.4" gem.add_dependency "google-spreadsheet-ruby", "=0.1.5" gem.add_dependency "yajl-ruby", "=0.8.2" #gem.add_dependency "mail", "=2.3.0" - gem.add_dependency "rinruby", "=2.0.2" - gem.add_dependency "ohm", "=0.1.3" - gem.add_dependency "ohm-contrib", "=0.1.1" - gem.add_dependency "SystemTimer", "=1.2.3" - gem.add_dependency "rjb", "=1.3.4" - gem.add_dependency "haml", "=3.1.1" +# gem.add_dependency "rinruby", "=2.0.2" +# gem.add_dependency "ohm", "=0.1.3" +# gem.add_dependency "ohm-contrib", "=0.1.1" +# gem.add_dependency "SystemTimer", "=1.2.3" +# gem.add_dependency "rjb", "=1.3.4" +# gem.add_dependency "haml", "=3.1.1" #valiation-gems - gem.add_dependency "dm-core", "=1.1.0" - gem.add_dependency "dm-serializer", "=1.1.0" - gem.add_dependency "dm-timestamps", "=1.1.0" - gem.add_dependency "dm-types", "=1.1.0" - gem.add_dependency "dm-migrations", "=1.1.0" - gem.add_dependency "dm-validations", "=1.1.0" - gem.add_dependency "dm-sqlite-adapter", "=1.1.0" - gem.add_dependency "ruby-plot", "=0.5.0" +# gem.add_dependency "dm-core", "=1.1.0" +# gem.add_dependency "dm-serializer", "=1.1.0" +# gem.add_dependency "dm-timestamps", "=1.1.0" +# gem.add_dependency "dm-types", "=1.1.0" +# gem.add_dependency "dm-migrations", "=1.1.0" +# gem.add_dependency "dm-validations", "=1.1.0" +# gem.add_dependency "dm-sqlite-adapter", "=1.1.0" +# gem.add_dependency "ruby-plot", "=0.5.0" gem.add_development_dependency 'jeweler' gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] @@ -83,7 +83,7 @@ Rake::RDocTask.new do |rdoc| end rdoc.rdoc_dir = 'rdoc' - rdoc.title = "opentox-ruby #{version}" + rdoc.title = "opentox-ruby-minimal #{version}" rdoc.rdoc_files.include('README*') rdoc.rdoc_files.include('lib/**/*.rb') end diff --git a/bin/opentox-install-debian.sh b/bin/opentox-install-debian.sh deleted file mode 100644 index cf173da..0000000 --- a/bin/opentox-install-debian.sh +++ /dev/null @@ -1,105 +0,0 @@ -#!/bin/bash -#Installation is tested on Debian Lenny Ubuntu 9.04 -#Update the system - -ERRLOG='install_err.log' -INSTALLLOG='install_log.log' -DATE=$(date +%Y/%m/%d\ %H:%M:%S) - -echo "=================================================" -echo "Please enshure that the sudo package is installed" -echo "on your system. " -echo "On Ubuntu Linux sudo is installed by default." -echo "If you are unshure check with it 'sudo ls'" -echo "and installed it with 'apt-get install sudo'" -echo "and add your username with visudo." -echo "=================================================" -echo -n "To continue installation press y: " -read answer -if [ "$answer" != "y" ] -then - echo "exiting the script..." - exit 1 -fi - -echo "opentox webservice install log - " $DATE > $INSTALLLOG -echo "Installing: build-essential" -sudo apt-get install build-essential >> $INSTALLLOG 2>>$ERRLOG -echo "Installing: ruby 1.8 with its dev files" -sudo apt-get install ruby ruby1.8-dev >> $INSTALLLOG 2>>$ERRLOG -echo "Installing: gems rdoc rubygems and rake" -sudo apt-get install gems rdoc rubygems rake >> $INSTALLLOG 2>>$ERRLOG - -echo "Installing rubygems from source. This may take some time" -wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz >> $INSTALLLOG 2>>$ERRLOG -tar xzfv rubygems-1.3.5.tgz 2>>$ERRLOG -cd rubygems-1.3.5 >> $INSTALLLOG 2>>$ERRLOG -sudo ruby setup.rb 2>>$ERRLOG -cd .. - -echo "Adding http://gems.github.com to ruby gem sources" -sudo gem sources -a http://gems.github.com >> $INSTALLLOG 2>>$ERRLOG - -#for debian lenny: -echo "Installing packages: zlib1g-dev tcl curl perl ssh tcl tk8.5" -sudo apt-get install zlib1g-dev tcl curl perl ssh tcl tk8.5 >> $INSTALLLOG 2>>$ERRLOG -echo "Installing git from source" -wget http://www.kernel.org/pub/software/scm/git/git-1.6.5.2.tar.gz >> $INSTALLLOG 2>>$ERRLOG -tar xzfv git-1.6.5.2.tar.gz 2>>$ERRLOG -cd git-1.6.5.2 >> $INSTALLLOG 2>>$ERRLOG -./configure 2>>$ERRLOG -make 2>>$ERRLOG -make install 2>>$ERRLOG - -echo "Installing the opentox webservices" -mkdir webservices >> $INSTALLLOG 2>>$ERRLOG -cd webservices >> $INSTALLLOG 2>>$ERRLOG - -git clone git://github.com/helma/opentox-compound.git >> $INSTALLLOG 2>>$ERRLOG -git clone git://github.com/helma/opentox-feature.git >> $INSTALLLOG 2>>$ERRLOG -git clone git://github.com/helma/opentox-dataset.git >> $INSTALLLOG 2>>$ERRLOG -git clone git://github.com/helma/opentox-algorithm.git >> $INSTALLLOG 2>>$ERRLOG -git clone git://github.com/helma/opentox-model.git >> $INSTALLLOG 2>>$ERRLOG -git clone git://github.com/helma/opentox-test.git >> $INSTALLLOG 2>>$ERRLOG - -cd opentox-compound >> $INSTALLLOG 2>>$ERRLOG -git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG -cd ../opentox-feature >> $INSTALLLOG 2>>$ERRLOG -git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG -cd ../opentox-dataset >> $INSTALLLOG 2>>$ERRLOG -git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG -cd ../opentox-algorithm >> $INSTALLLOG 2>>$ERRLOG -git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG -cd ../opentox-model >> $INSTALLLOG 2>>$ERRLOG -git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG -cd .. >> $INSTALLLOG 2>>$ERRLOG -git clone git://github.com/helma/opentox-ruby-api-wrapper.git >> $INSTALLLOG 2>>$ERRLOG -cd opentox-ruby-api-wrapper >> $INSTALLLOG 2>>$ERRLOG -git checkout -b development origin/development >> $INSTALLLOG 2>>$ERRLOG -rake install >> $INSTALLLOG 2>>$ERRLOG - - -cd ../opentox-compound >> $INSTALLLOG 2>>$ERRLOG -echo "Installing libopenssl-ruby" -sudo apt-get install libopenssl-ruby >> $INSTALLLOG 2>>$ERRLOG -echo "Installing dtach" -rake dtach:install >> $INSTALLLOG 2>>$ERRLOG -echo "Installing openbabel" -rake openbabel:install >> $INSTALLLOG 2>>$ERRLOG - -#debian lenny missed liblink: -ln -s /usr/local/lib/libopenbabel.so.3 /usr/lib/libopenbabel.so.3 >> $INSTALLLOG 2>>$ERRLOG - -rake redis:download >> $INSTALLLOG 2>>$ERRLOG -rake redis:install >> $INSTALLLOG 2>>$ERRLOG -#edit /home/[username]/.opentox/config/test.yaml set :base_dir: /home/[username]/webservices -sudo apt-get install libgsl0-dev >> $INSTALLLOG 2>>$ERRLOG -sudo apt-get install swig >> $INSTALLLOG 2>>$ERRLOG -sudo apt-get install curl >> $INSTALLLOG 2>>$ERRLOG -cd ../opentox-algorithm >> $INSTALLLOG 2>>$ERRLOG -echo "Installing fminer" -rake fminer:install >> $INSTALLLOG 2>>$ERRLOG -sudo apt-get install libsqlite3-dev >> $INSTALLLOG 2>>$ERRLOG - - -mkdir ../opentox-model/db >> $INSTALLLOG 2>>$ERRLOG diff --git a/bin/opentox-install-ubuntu.sh b/bin/opentox-install-ubuntu.sh deleted file mode 100755 index ae4807d..0000000 --- a/bin/opentox-install-ubuntu.sh +++ /dev/null @@ -1,375 +0,0 @@ -#!/bin/bash -#Installation is tested on Debian Ubuntu 9.10 -#Update the system - -FAILED=0 -STARTPATH=$PWD -ERRLOG=$PWD/'install_err.log' -INSTALLLOG=$PWD/'install_log.log' -DATE=$(date +%Y/%m/%d\ %H:%M:%S) -BRANCH=$1 -GEMVERSION="1.3.5" -GITVERSION="1.6.5.2" -RAPTORVERSION="1.4.20" -RASQALVERSION="0.9.16" -RASQALVERSION2="0.9.15" -REDLANDVERSION="1.0.7" -REDBINDVERSION="1.0.7.1" - -if [ "$BRANCH" = '' ] -then - echo "Please enter: sudo ./[filename] [brunchtpy]" - exit 1 -fi -echo "=================================================" -echo "Selected branch is: $BRANCH" -echo "=================================================" -echo "Please enshure that the sudo package is installed" -echo "on your system. " -echo "On Ubuntu Linux sudo is installed by default." -echo "If you are unsure check with it 'sudo ls'" -echo "and installed it with 'apt-get install sudo'" -echo "and add your username with visudo." -echo "=================================================" -echo "Some programs and the OpenTox webservices will be installed in the current folder." -echo "=================================================" -echo -n "To continue installation press y: " -read answer -if [ "$answer" != "y" ] -then - echo "exiting the script..." - exit 1 -fi - -echo "opentox webservice install log - " $DATE > $INSTALLLOG -echo "opentox webservice install err log - " $DATE > $ERRLOG -echo "Installing: build-essential" -sudo apt-get install build-essential | tee -a $INSTALLLOG - -echo "Installing: ruby 1.8 with its dev files" -sudo apt-get install ruby ruby1.8-dev | tee -a $INSTALLLOG - -echo "Installing: gems rdoc rubygems libxml-parser-ruby1.8 libxml++2.6-dev libyaml-ruby libzlib-ruby sqlite3 libsqlite3-dev libsqlite3-ruby1.8 and rake" -sudo apt-get install gems rdoc rubygems libxml-parser-ruby1.8 libxml++2.6-dev libyaml-ruby libzlib-ruby rake sqlite3 libsqlite3-dev libsqlite3-ruby1.8 | tee -a $INSTALLLOG - -#RUBYGEMS -echo "Installing rubygems from source. This may take some time" -if [ ! -d $STARTPATH/rubygems-$GEMVERSION ]; -then - wget http://rubyforge.org/frs/download.php/60718/rubygems-$GEMVERSION.tgz >>$INSTALLLOG 2>>$ERRLOG - tar xzfv rubygems-$GEMVERSION.tgz >>$INSTALLLOG 2>>$ERRLOG - cd rubygems-$GEMVERSION - sudo ruby setup.rb >>$INSTALLLOG 2>>$ERRLOG - cd .. - sudo rm rubygems-$GEMVERSION.tgz - CHECKGEM=`gem -v` - if [ "$CHECKGEM" == "$GEMVERSION" ] - then - echo "Adding http://gems.github.com to ruby gem sources" - sudo gem sources -a http://gems.github.com >>$INSTALLLOG 2>>$ERRLOG - - echo "=================================================" - echo "Rubygems version $GEMVERSION successfully installed." - echo "=================================================" - else - echo "Rubygems version $GEMVERSION installation failed." - FAILED=1 - exit $FAILED - fi -else - echo "rubygems-$GEMVERSION folder already exist. " -fi - -echo "Installing packages: zlib1g-dev tcl curl perl ssh tcl tk8.5 libopenssl-ruby libgsl0-dev swig r-base rinruby" -sudo apt-get install zlib1g-dev tcl curl perl libopenssl-ruby libgsl0-dev r-base | tee -a $INSTALLLOG -sudo apt-get install ssh tcl tk8.5 | tee -a $INSTALLLOG -sudo apt-get install swig | tee -a $INSTALLLOG -sudo apt-get install postgresql-server-dev-8.4 | tee -a $INSTALLLOG - - -#echo "Installing gems jeweler sinatra emk-sinatra-url-for dm-core cehoffman-sinatra-respond_to rest-client rack-contrib thin cucumber datamapper data_objects do_sqlite3 rinruby" -sudo gem install jeweler | tee -a $INSTALLLOG -sudo gem install sinatra | tee -a $INSTALLLOG -sudo gem install emk-sinatra-url-for -s http://gems.github.com | tee -a $INSTALLLOG -sudo gem install dm-core | tee -a $INSTALLLOG -sudo gem install sinatra-respond_to | tee -a $INSTALLLOG -sudo gem install rest-client | tee -a $INSTALLLOG -sudo gem install rack-contrib | tee -a $INSTALLLOG -sudo gem install thin | tee -a $INSTALLLOG -sudo gem install cucumber | tee -a $INSTALLLOG -sudo gem install datamapper | tee -a $INSTALLLOG -sudo gem install data_objects | tee -a $INSTALLLOG -sudo gem install do_sqlite3 | tee -a $INSTALLLOG -sudo gem install rinruby | tee -a $INSTALLLOG -sudo gem cleanup | tee -a $INSTALLLOG - -echo "Installing LibRDF-ruby" -sudo apt-get install librdf0 librdf-ruby | tee -a $INSTALLLOG - -#GIT -echo "Installing git from source" -echo "This could take a while..." -if [ ! -d $STARTPATH/git-$GITVERSION ]; -then - wget http://www.kernel.org/pub/software/scm/git/git-$GITVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG - tar xzfv git-$GITVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG - cd git-$GITVERSION - ./configure >>$INSTALLLOG 2>>$ERRLOG - make >>$INSTALLLOG 2>>$ERRLOG - sudo make install >>$INSTALLLOG 2>>$ERRLOG - cd .. - sudo rm git-$GITVERSION.tar.gz - CHECKGIT=`git --version` - if [ "$CHECKGIT" == "git version $GITVERSION" ] - then - echo "=================================================" - echo "Git version $GITVERSION successfully installed." - echo "=================================================" - else - echo "Git version $GITVERSION installation failed." - FAILED=1 - exit $FAILED - fi -else - echo "git-$GITVERSION folder exists." -fi - -#REDLAND -if [ ! -d $STARTPATH/redland ]; -then - echo "Making Redland folder." - mkdir redland >>$INSTALLLOG 2>>$ERRLOG - cd redland - echo "Installing Redland raptor" - if [ ! -d $STARTPATH/redland/raptor-$RAPTORVERSION ]; - then - wget wget http://download.librdf.org/source/raptor-$RAPTORVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG - tar xzfv raptor-$RAPTORVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG - cd raptor-$RAPTORVERSION - ./configure >>$INSTALLLOG 2>>$ERRLOG - sudo make >>$INSTALLLOG 2>>$ERRLOG - sudo make install >>$INSTALLLOG 2>>$ERRLOG - cd .. - sudo rm raptor-$RAPTORVERSION.tar.gz - CHECKRAPTOR=`raptor-config --version` - if [ "$CHECKRAPTOR" == "$RAPTORVERSION" ] - then - echo "=================================================" - echo "Raptor version $RAPTORVERSION successfully installed." - echo "=================================================" - else - echo "Raptor version $RAPTORVERSION installation failed." - FAILED=1 - exit $FAILED - fi - else - echo "raptor-$RAPTORVERSION folder exists." - fi - - echo "Installing Redland rasqal" - wget wget http://download.librdf.org/source/rasqal-$RASQALVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG - tar xzfv rasqal-$RASQALVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG - cd rasqal-$RASQALVERSION - ./configure >>$INSTALLLOG 2>>$ERRLOG - sudo make >>$INSTALLLOG 2>>$ERRLOG - sudo make install >>$INSTALLLOG 2>>$ERRLOG - cd .. - sudo rm rasqal-$RASQALVERSION.tar.gz - CHECKRASQAL=`rasqal-config --version` - if [ "$CHECKRASQAL" == "$RASQALVERSION2" -o "$CHECKRASQAL" == "$RASQALVERSION" ] - then - echo "=================================================" - echo "Raptor version $RASQALVERSION2 or higher successfully installed." - echo "=================================================" - else - echo "Raptor version $RASQALVERSION2 or higher installation failed." - FAILED=1 - exit $FAILED - fi - - echo "Installing Redland redland" - wget wget http://download.librdf.org/source/redland-$REDLANDVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG - tar xzfv redland-$REDLANDVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG - cd redland-$REDLANDVERSION - ./configure >>$INSTALLLOG 2>>$ERRLOG - sudo make >>$INSTALLLOG 2>>$ERRLOG - sudo make install >>$INSTALLLOG 2>>$ERRLOG - cd .. - sudo rm redland-$REDLANDVERSION.tar.gz - CHECKREDLAND=`redland-config --version` - if [ "$CHECKREDLAND" == "$REDLANDVERSION" ] - then - echo "=================================================" - echo "Redland version $REDLANDVERSION successfully installed." - echo "=================================================" - else - echo "Redland version $REDLANDVERSION installation failed." - FAILED=1 - exit $FAILED - fi - - - echo "Installing Redland Bindings with ruby" - wget http://download.librdf.org/source/redland-bindings-$REDBINDVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG - tar xzfv redland-bindings-$REDBINDVERSION.tar.gz >>$INSTALLLOG 2>>$ERRLOG - cd redland-bindings-$REDBINDVERSION - ./configure --with-ruby >>$INSTALLLOG 2>>$ERRLOG - sudo make >>$INSTALLLOG 2>>$ERRLOG - sudo make install >>$INSTALLLOG 2>>$ERRLOG - cd .. - sudo rm redland-bindings-$REDBINDVERSION.tar.gz - cd .. - #CHECKREDBIND=`??? --version` - #if [ "$CHECKREDBIND" == "$REDBINDVERSION" ] - #then - # echo "=================================================" - # echo "Redland Bindings version $REDBINDVERSION successfully installed." - # echo "=================================================" - #else - # echo "Redland Bindings version $REDBINDVERSION installation failed." - # FAILED=1 - # exit $FAILED - #fi -else - echo "Redland folder exists." -fi - -echo "Installing the opentox webservices" -mkdir webservices -cd webservices - -echo "Install the opentox-ruby-api-wrapper" -echo "This could take a while..." -git clone git://github.com/helma/opentox-ruby-api-wrapper.git >>$INSTALLLOG 2>>$ERRLOG -cd opentox-ruby-api-wrapper -git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG -OTAPIVERSION=`cat VERSION` -sudo rake install | tee -a $INSTALLLOG -cd .. -CHECKOTAPI=`gem list | grep "opentox-ruby-api-wrapper" | grep "$OTAPIVERSION"` -if [ ! "$CHECKOTAPI" = '' ] -then - echo "=================================================" - echo "opentox-ruby-api-wrapper ($OTAPIVERSION) successfully installed." - echo "=================================================" -else - echo "opentox-ruby-api-wrapper ($OTAPIVERSION) installation failed." - FAILED=1 - exit $FAILED -fi - -echo "Installing the webservices: compound, dataset, algorithm, model, task, feature" -git clone git://github.com/helma/opentox-compound.git >>$INSTALLLOG 2>>$ERRLOG -git clone git://github.com/helma/opentox-dataset.git >>$INSTALLLOG 2>>$ERRLOG -git clone git://github.com/helma/opentox-algorithm.git >>$INSTALLLOG 2>>$ERRLOG -git clone git://github.com/helma/opentox-model.git >>$INSTALLLOG 2>>$ERRLOG -git clone git://github.com/helma/opentox-task.git >>$INSTALLLOG 2>>$ERRLOG -git clone git://github.com/helma/opentox-feature.git >>$INSTALLLOG 2>>$ERRLOG - -cd opentox-compound -git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG -cd ../opentox-dataset -git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG -cd ../opentox-algorithm -git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG -cd ../opentox-model -git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG -cd ../opentox-task -git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG -cd ../opentox-task -git checkout -b development origin/development >>$INSTALLLOG 2>>$ERRLOG -cd .. - -#edit /home/[username]/.opentox/config/test.yaml set :base_dir: /home/[username]/webservices - -echo "Installing the tests" -git clone git://github.com/helma/opentox-test.git >>$INSTALLLOG 2>>$ERRLOG -cd opentox-test -git checkout -b $BRANCH origin/$BRANCH >>$INSTALLLOG 2>>$ERRLOG - -echo "Installing openbabel" -cd ../opentox-compound -sudo rake openbabel:install | tee -a $INSTALLLOG -sudo ldconfig >>$INSTALLLOG 2>>$ERRLOG - -ln -s /usr/local/lib/libopenbabel.so.3 /usr/lib/libopenbabel.so.3 >> $INSTALLLOG 2>>$ERR -#VERSION=` --version` -#if [ "$VERSION" == "$RAPTORVERSION" ] -#then -# echo "=================================================" -# echo "Raptor version $RAPTORVERSION successfully installed." -# echo "=================================================" -#else -# echo "Raptor version $RAPTORVERSION installation failed." -# FAILED=1 -# exit $FAILED -#fi - - -#check /webservices/opentox-algorithm/fminer.rb for 1,0/ture,false bug -BUGCHECK1=`grep "@@fminer.AddActivity(true, id)" $STARTPATH/webservices/opentox-algorithm/fminer.rb` -BUGCHECK2=`grep "@@fminer.AddActivity(false, id)" $STARTPATH/webservices/opentox-algorithm/fminer.rb` -if [ -z "$BUGCHECK1$BUGCHECK2" ] -then - echo "fminer.rb is correct." -else - sed -i 's/@@fminer.AddActivity(true, id)/@@fminer.AddActivity(1, id)/g' $STARTPATH/webservices/opentox-algorithm/fminer.rb - sed -i 's/@@fminer.AddActivity(false, id)/@@fminer.AddActivity(0, id)/g' $STARTPATH/webservices/opentox-algorithm/fminer.rb - echo "fminer.rb updated." -fi - -#todo: configure libfminer Makefile (location of ruby.h) -#-> fixed by using davor's repository - - -cd ../opentox-algorithm -echo "Installing fminer" -echo "This could take a while..." -sudo updatedb -sudo rake fminer:install | tee -a $INSTALLLOG -cd .. -FMINERVERSION=`ls $STARTPATH/webservices/opentox-algorithm/libfminer | grep "fminer.so"` -if [ "$FMINERVERSION" == "fminer.so" ] -then - echo "=================================================" - echo "Fminer successfully installed." - echo "=================================================" -else - echo "Fminer installation failed." - FAILED=1 - exit $FAILED -fi - -if [ $FAILED == 0 ] -then - #get username - echo "Please enter username:" - read USERNAME - - #change rights from root to user - sudo chown -R $USERNAME: $STARTPATH/webservices/ - sudo chown -R $USERNAME: ~/.opentox/ -fi - -if [ "$FAILED" == "1" ] -then - echo "=================================================" - echo "Installation script failed!" - echo "=================================================" - exit 1 -else -echo "=================================================" -echo "opentox-install-script is completed." -echo "=================================================" -echo "Configuration:" -echo "Edit the settings in $HOME/.opentox/config/{development|production|test}.yaml for your environment." -echo "=================================================" -echo "Start the webservices local:" -echo "cd webservices/opentox-test/" -echo "rake opentox:services:start" -echo "=================================================" -echo "Test local webservices:" -echo "rake features" -echo "=================================================" -fi -exit 0 diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 2652695..4c50d32 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -1,8 +1,8 @@ # R integration # workaround to initialize R non-interactively (former rinruby versions did this by default) # avoids compiling R with X -R = nil -require "rinruby" +#R = nil +#require "rinruby" module OpenTox @@ -16,6 +16,7 @@ module OpenTox # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [String] URI of new resource (dataset, model, ...) def run(params=nil, waiting_task=nil) + #puts @uri RestClientWrapper.post(@uri, params, {:accept => 'text/uri-list'}, waiting_task).to_s end @@ -37,7 +38,7 @@ module OpenTox def self.find(uri, subjectid=nil) return nil unless uri alg = Generic.new(uri) - alg.load_metadata( subjectid ) + alg.load_metadata raise "cannot load algorithm metadata" if alg.metadata==nil or alg.metadata.size==0 alg end @@ -54,7 +55,7 @@ module OpenTox # Initialize bbrc algorithm def initialize(subjectid=nil) super File.join(CONFIG[:services]["opentox-algorithm"], "fminer/bbrc") - load_metadata(subjectid) + load_metadata end end @@ -64,7 +65,7 @@ module OpenTox # Initialize last algorithm def initialize(subjectid=nil) super File.join(CONFIG[:services]["opentox-algorithm"], "fminer/last") - load_metadata(subjectid) + load_metadata end end @@ -76,10 +77,11 @@ module OpenTox # Initialize lazar algorithm def initialize(subjectid=nil) super File.join(CONFIG[:services]["opentox-algorithm"], "lazar") - load_metadata(subjectid) + load_metadata end end +=begin # Utility methods without dedicated webservices # Similarity calculations @@ -399,6 +401,7 @@ module OpenTox m_pos = array.size / 2 return array.size % 2 == 1 ? array[m_pos] : (array[m_pos-1] + array[m_pos])/2 end +=end end end diff --git a/lib/authorization.rb b/lib/authorization.rb index 288733a..27ae734 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -2,7 +2,7 @@ module OpenTox #Module for Authorization and Authentication #@example Authentication - # require "opentox-ruby-api-wrapper" + # require "opentox-ruby" # OpenTox::Authorization::AA_SERVER = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml # token = OpenTox::Authorization.authenticate("benutzer", "passwort") #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification @@ -389,4 +389,4 @@ module OpenTox end end -end \ No newline at end of file +end diff --git a/lib/compound.rb b/lib/compound.rb index a85507b..189db7b 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -29,30 +29,21 @@ module OpenTox # @param [String] smiles Smiles string # @return [OpenTox::Compound] Compound def self.from_smiles(smiles) - c = Compound.new - c.inchi = Compound.smiles2inchi(smiles) - c.uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(c.inchi)) - c + Compound.new RestClientWrapper.post(CONFIG[:services]["opentox-compound"], smiles, :content_type => 'chemical/x-daylight-smiles').to_s.chomp end # Create a compound from inchi string # @param [String] smiles InChI string # @return [OpenTox::Compound] Compound def self.from_inchi(inchi) - c = Compound.new - c.inchi = inchi - c.uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(c.inchi)) - c + Compound.new RestClientWrapper.post(CONFIG[:services]["opentox-compound"], inchi, :content_type => 'chemical/x-inchi').to_s.chomp end # Create a compound from sdf string # @param [String] smiles SDF string # @return [OpenTox::Compound] Compound def self.from_sdf(sdf) - c = Compound.new - c.inchi = Compound.sdf2inchi(sdf) - c.uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(c.inchi)) - c + Compound.new RestClientWrapper.post(CONFIG[:services]["opentox-compound"], sdf, :content_type => 'chemical/x-mdl-sdfile').to_s.chomp end # Create a compound from name. Relies on an external service for name lookups. @@ -77,13 +68,13 @@ module OpenTox # Get (canonical) smiles # @return [String] Smiles string def to_smiles - Compound.obconversion(@inchi,'inchi','can') + RestClientWrapper.get(@uri, :accept => 'chemical/x-daylight-smiles').chomp end # Get sdf # @return [String] SDF string def to_sdf - Compound.obconversion(@inchi,'inchi','sdf') + RestClientWrapper.get(@uri, :accept => 'chemical/x-mdl-sdfile').chomp end # Get gif image @@ -118,6 +109,7 @@ module OpenTox end end +=begin # Match a smarts string # @example # compound = OpenTox::Compound.from_name("Benzene") @@ -195,5 +187,6 @@ module OpenTox obconversion.write_string(obmol) end end +=end end end diff --git a/lib/dataset.rb b/lib/dataset.rb index 5e6a29b..84dce65 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -1,6 +1,7 @@ module OpenTox # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). + # TODO: fix API Doc class Dataset include OpenTox @@ -15,7 +16,7 @@ module OpenTox # @param [optional, String] uri Dataset URI # @return [OpenTox::Dataset] Dataset object def initialize(uri=nil,subjectid=nil) - super uri + super uri, subjectid @features = {} @compounds = [] @data_entries = {} @@ -28,7 +29,17 @@ module OpenTox # @return [OpenTox::Dataset] Dataset object def self.create(uri=CONFIG[:services]["opentox-dataset"], subjectid=nil) dataset = Dataset.new(nil,subjectid) - dataset.save(subjectid) + dataset.save + dataset + end + + # Find a dataset and load all data. This can be time consuming, use Dataset.new together with one of the load_* methods for a fine grained control over data loading. + # @param [String] uri Dataset URI + # @return [OpenTox::Dataset] Dataset object with all data + def self.find(uri, subjectid=nil) + return nil unless uri + dataset = Dataset.new(uri, subjectid) + dataset.load_metadata dataset end @@ -40,20 +51,9 @@ module OpenTox # @return [OpenTox::Dataset] Dataset object with CSV data def self.create_from_csv_file(file, subjectid=nil) dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid) - parser = Parser::Spreadsheets.new - parser.dataset = dataset - parser.load_csv(File.open(file).read) - dataset.save(subjectid) - dataset - end - - # Find a dataset and load all data. This can be time consuming, use Dataset.new together with one of the load_* methods for a fine grained control over data loading. - # @param [String] uri Dataset URI - # @return [OpenTox::Dataset] Dataset object with all data - def self.find(uri, subjectid=nil) - return nil unless uri - dataset = Dataset.new(uri, subjectid) - dataset.load_all(subjectid) + #RestClientWrapper.post(dataset.uri,File.read(file), {:content_type => "text/csv", :subjectid => @subjectid}) + RestClientWrapper.post(dataset.uri,{:file => File.new(file)},{:accept => "text/uri-list", :subjectid => subjectid})#, {:content_type => "text/csv", :subjectid => @subjectid}) + dataset.load_metadata dataset end @@ -64,7 +64,7 @@ module OpenTox return false unless uri dataset = Dataset.new(uri, subjectid) begin - dataset.load_metadata( subjectid ).size > 0 + dataset.load_metadata.size > 0 rescue false end @@ -80,26 +80,20 @@ module OpenTox # Load YAML representation into the dataset # @param [String] yaml YAML representation of the dataset # @return [OpenTox::Dataset] Dataset object with YAML data - def load_yaml(yaml) - copy YAML.load(yaml) + def store_yaml(yaml) + RestClientWrapper.post(@uri,yaml, {:content_type => "application/x-yaml", :subjectid => @subjectid}) end - def load_rdfxml(rdfxml) - raise "rdfxml data is empty" if rdfxml.to_s.size==0 - file = Tempfile.new("ot-rdfxml") - file.puts rdfxml - file.close - load_rdfxml_file file - file.delete + def store_rdfxml(rdfxml) + RestClientWrapper.post(@uri, rdfxml, {:content_type => "application/rdf+xml", :subjectid => @subjectid}) end # Load RDF/XML representation from a file # @param [String] file File with RDF/XML representation of the dataset # @return [OpenTox::Dataset] Dataset object with RDF/XML data - def load_rdfxml_file(file, subjectid=nil) - parser = Parser::Owl::Dataset.new @uri, subjectid - parser.uri = file.path - copy parser.load_uri(subjectid) + def store_rdfxml_file(file) + #RestClientWrapper.post(@uri, :file => File.new(file))#, {:content_type => "application/rdf+xml", :subjectid => @subjectid}) + RestClientWrapper.post(@uri, File.read(file), {:content_type => "application/rdf+xml", :subjectid => @subjectid}) end # Load CSV string (format specification: http://toxcreate.org/help) @@ -108,11 +102,8 @@ module OpenTox # - you will have to set remaining metadata manually # @param [String] csv CSV representation of the dataset # @return [OpenTox::Dataset] Dataset object with CSV data - def load_csv(csv, subjectid=nil) - save(subjectid) unless @uri # get a uri for creating features - parser = Parser::Spreadsheets.new - parser.dataset = self - parser.load_csv(csv) + def store_csv(csv) + RestClientWrapper.post(@uri, csv, {:content_type => "text/csv", :subjectid => @subjectid}) end # Load Spreadsheet book (created with roo gem http://roo.rubyforge.org/, excel format specification: http://toxcreate.org/help) @@ -121,35 +112,36 @@ module OpenTox # - you will have to set remaining metadata manually # @param [Excel] book Excel workbook object (created with roo gem) # @return [OpenTox::Dataset] Dataset object with Excel data - def load_spreadsheet(book, subjectid=nil) - save(subjectid) unless @uri # get a uri for creating features - parser = Parser::Spreadsheets.new - parser.dataset = self - parser.load_spreadsheet(book) + def store_spreadsheet_file(file) + RestClientWrapper.post(@uri, :file => File.new(file))#, {:content_type => "application/vnd.ms-excel", :subjectid => @subjectid}) end # Load and return only metadata of a Dataset object # @return [Hash] Metadata of the dataset - def load_metadata(subjectid=nil) - add_metadata Parser::Owl::Dataset.new(@uri, subjectid).load_metadata(subjectid) + def load_metadata + if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) + @metadata = YAML.load(RestClientWrapper.get(File.join(@uri,"metadata"), {:accept => "application/x-yaml", :subjectid => @subjectid})) + else + add_metadata Parser::Owl::Dataset.new(@uri, @subjectid).load_metadata + end self.uri = @uri if @uri # keep uri @metadata end # Load all data (metadata, data_entries, compounds and features) from URI - def load_all(subjectid=nil) + def load_all if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - copy YAML.load(RestClientWrapper.get(@uri, {:accept => "application/x-yaml", :subjectid => subjectid})) + copy YAML.load(RestClientWrapper.get(@uri, {:accept => "application/x-yaml", :subjectid => @subjectid})) else - parser = Parser::Owl::Dataset.new(@uri, subjectid) - copy parser.load_uri(subjectid) + parser = Parser::Owl::Dataset.new(@uri, @subjectid) + copy parser.load_uri end end # Load and return only compound URIs from the dataset service # @return [Array] Compound URIs in the dataset - def load_compounds(subjectid=nil) - RestClientWrapper.get(File.join(uri,"compounds"),{:accept=> "text/uri-list", :subjectid => subjectid}).to_s.each_line do |compound_uri| + def load_compounds + RestClientWrapper.get(File.join(uri,"compounds"),{:accept=> "text/uri-list", :subjectid => @subjectid}).to_s.each_line do |compound_uri| @compounds << compound_uri.chomp end @compounds.uniq! @@ -157,12 +149,12 @@ module OpenTox # Load and return only features from the dataset service # @return [Hash] Features of the dataset - def load_features(subjectid=nil) + def load_features if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - @features = YAML.load(RestClientWrapper.get(File.join(@uri,"features"), {:accept => "application/x-yaml", :subjectid => subjectid})) + @features = YAML.load(RestClientWrapper.get(File.join(@uri,"features"), {:accept => "application/x-yaml", :subjectid => @subjectid})) else - parser = Parser::Owl::Dataset.new(@uri, subjectid) - @features = parser.load_features(subjectid) + parser = Parser::Owl::Dataset.new(@uri, @subjectid) + @features = parser.load_features end @features end @@ -171,6 +163,7 @@ module OpenTox # @param [String] feature the URI of the feature # @return [Array] return array with strings, nil if value is not set (e.g. when feature is numeric) def accept_values(feature) + load_features accept_values = features[feature][OT.acceptValue] accept_values.sort if accept_values accept_values @@ -178,8 +171,8 @@ module OpenTox # Detect feature type(s) in the dataset # @return [String] `classification", "regression", "mixed" or unknown` - def feature_type(subjectid=nil) - load_features(subjectid) + def feature_type + load_features feature_types = @features.collect{|f,metadata| metadata[RDF.type]}.flatten.uniq if feature_types.include?(OT.NominalFeature) "classification" @@ -189,13 +182,11 @@ module OpenTox "unknown" end end -=begin -=end # Get Spreadsheet representation # @return [Spreadsheet::Workbook] Workbook which can be written with the spreadsheet gem (data_entries only, metadata will will be discarded)) def to_spreadsheet - Serializer::Spreadsheets.new(self).to_spreadsheet + Spreadsheet::Workbook.new(RestClientWrapper.get(@uri, {:accept => "application/vnd.ms-excel", :subjectid => @subjectid})) end # Get Excel representation (alias for to_spreadsheet) @@ -207,33 +198,31 @@ module OpenTox # Get CSV string representation (data_entries only, metadata will be discarded) # @return [String] CSV representation def to_csv - Serializer::Spreadsheets.new(self).to_csv + RestClientWrapper.get(@uri, {:accept => "text/csv", :subjectid => @subjectid}) end # Get OWL-DL in ntriples format # @return [String] N-Triples representation def to_ntriples - s = Serializer::Owl.new - s.add_dataset(self) - s.to_ntriples + RestClientWrapper.get(@uri, {:accept => "application/rdf+xml", :subjectid => @subjectid}) end # Get OWL-DL in RDF/XML format # @return [String] RDF/XML representation def to_rdfxml - s = Serializer::Owl.new - s.add_dataset(self) - s.to_rdfxml + RestClientWrapper.get(@uri, {:accept => "application/rdf+xml", :subjectid => @subjectid}) end # Get name (DC.title) of a feature # @param [String] feature Feature URI # @return [String] Feture title def feature_name(feature) + load_features @features[feature][DC.title] end def title + load_metadata @metadata[DC.title] end @@ -251,14 +240,6 @@ module OpenTox @data_entries[compound][feature] << value if value!=nil end - # Add/modify metadata, existing entries will be overwritten - # @example - # dataset.add_metadata({DC.title => "any_title", DC.creator => "my_email"}) - # @param [Hash] metadata Hash mapping predicate_uris to values - def add_metadata(metadata) - metadata.each { |k,v| @metadata[k] = v } - end - # Add a feature # @param [String] feature Feature URI # @param [Hash] metadata Hash with feature metadata @@ -285,10 +266,10 @@ module OpenTox # @param [Hash] metadata Hash containing the metadata for the new dataset # @param [String] subjectid # @return [OpenTox::Dataset] newly created dataset, already saved - def split( compounds, features, metadata, subjectid=nil) + def split( compounds, features, metadata) LOGGER.debug "split dataset using "+compounds.size.to_s+"/"+@compounds.size.to_s+" compounds" raise "no new compounds selected" unless compounds and compounds.size>0 - dataset = OpenTox::Dataset.create(CONFIG[:services]["opentox-dataset"],subjectid) + dataset = OpenTox::Dataset.create(CONFIG[:services]["opentox-dataset"],@subjectid) if features.size==0 compounds.each{ |c| dataset.add_compound(c) } else @@ -311,7 +292,7 @@ module OpenTox end end dataset.add_metadata(metadata) - dataset.save(subjectid) + dataset.save dataset end @@ -319,29 +300,23 @@ module OpenTox # - creates a new dataset if uri is not set # - overwrites dataset if uri exists # @return [String] Dataset URI - def save(subjectid=nil) - # TODO: rewrite feature URI's ?? + def save @compounds.uniq! - if @uri - if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - RestClientWrapper.post(@uri,self.to_yaml,{:content_type => "application/x-yaml", :subjectid => subjectid}) - else - File.open("ot-post-file.rdf","w+") { |f| f.write(self.to_rdfxml); @path = f.path } - task_uri = RestClient.post(@uri, {:file => File.new(@path)},{:accept => "text/uri-list" , :subjectid => subjectid}).to_s.chomp - #task_uri = `curl -X POST -H "Accept:text/uri-list" -F "file=@#{@path};type=application/rdf+xml" http://apps.ideaconsult.net:8080/ambit2/dataset` - Task.find(task_uri).wait_for_completion - self.uri = RestClientWrapper.get(task_uri,{:accept => 'text/uri-list', :subjectid => subjectid}) - end + # create dataset if uri is empty + self.uri = RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{:subjectid => @subjectid}).to_s.chomp unless @uri + if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) + RestClientWrapper.post(@uri,self.to_yaml,{:content_type => "application/x-yaml", :subjectid => @subjectid}) else - # create dataset if uri is empty - self.uri = RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{:subjectid => subjectid}).to_s.chomp + s = Serializer::Owl.new + s.add_dataset(self) + RestClientWrapper.post(@uri, s.to_rdfxml,{:content_type => "application/rdf+xml" , :subjectid => @subjectid}) end @uri end # Delete dataset at the dataset service - def delete(subjectid=nil) - RestClientWrapper.delete(@uri, :subjectid => subjectid) + def delete + RestClientWrapper.delete(@uri, :subjectid => @subjectid) end private @@ -367,7 +342,7 @@ module OpenTox # @return [OpenTox::Dataset] Prediction dataset object with all data def self.find(uri, subjectid=nil) prediction = LazarPrediction.new(uri, subjectid) - prediction.load_all(subjectid) + prediction.load_all prediction end @@ -392,10 +367,5 @@ module OpenTox @data_entries[compound.uri].collect{|f,v| @features[f] if f.match(/neighbor/)}.compact end -# def errors(compound) -# features = @data_entries[compound.uri].keys -# features.collect{|f| @features[f][OT.error]}.join(" ") if features -# end - end end diff --git a/lib/environment.rb b/lib/environment.rb index 28a9a66..cae743c 100644 --- a/lib/environment.rb +++ b/lib/environment.rb @@ -24,7 +24,7 @@ end # database #`redis-server /opt/redis/redis.conf` unless File.exists? "/var/run/redis.pid" # removed by AM -Ohm.connect :thread_safe => true +# Ohm.connect :thread_safe => true # load mail settings for error messages #load File.join config_dir,"mail.rb" if File.exists?(File.join config_dir,"mail.rb") @@ -69,11 +69,6 @@ class OwlNamespace end -AA_SERVER = CONFIG[:authorization] ? (CONFIG[:authorization][:server] ? CONFIG[:authorization][:server] : nil) : nil -CONFIG[:authorization][:authenticate_request] = [""] unless CONFIG[:authorization][:authenticate_request] -CONFIG[:authorization][:authorize_request] = [""] unless CONFIG[:authorization][:authorize_request] -CONFIG[:authorization][:free_request] = [""] unless CONFIG[:authorization][:free_request] - RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' OWL = OwlNamespace.new 'http://www.w3.org/2002/07/owl#' DC = OwlNamespace.new 'http://purl.org/dc/elements/1.1/' @@ -81,3 +76,8 @@ OT = OwlNamespace.new 'http://www.opentox.org/api/1.1#' OTA = OwlNamespace.new 'http://www.opentox.org/algorithmTypes.owl#' XSD = OwlNamespace.new 'http://www.w3.org/2001/XMLSchema#' +AA_SERVER = CONFIG[:authorization] ? (CONFIG[:authorization][:server] ? CONFIG[:authorization][:server] : nil) : nil +CONFIG[:authorization][:authenticate_request] = [""] unless CONFIG[:authorization][:authenticate_request] +CONFIG[:authorization][:authorize_request] = [""] unless CONFIG[:authorization][:authorize_request] +CONFIG[:authorization][:free_request] = [""] unless CONFIG[:authorization][:free_request] + diff --git a/lib/error.rb b/lib/error.rb index b92f2a4..45b7545 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,4 +1,3 @@ - # adding additional fields to Exception class to format errors according to OT-API class Exception attr_accessor :errorCause diff --git a/lib/feature.rb b/lib/feature.rb index f3bec5c..84a85b9 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -6,12 +6,12 @@ module OpenTox # Find a feature # @param [String] uri Feature URI - # @return [OpenTox::Task] Feature object + # @return [OpenTox::Feature] Feature object def self.find(uri, subjectid=nil) return nil unless uri - feature = Feature.new uri + feature = Feature.new uri, subjectid if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) - feature.add_metadata YAML.load(RestClientWrapper.get(uri,{:accept => "application/x-yaml", :subjectid => subjectid})) + feature.add_metadata YAML.load(RestClientWrapper.get(uri,{:accept => "application/x-yaml", :subjectid => @subjectid})) else feature.add_metadata Parser::Owl::Dataset.new(uri).load_metadata end diff --git a/lib/helper.rb b/lib/helper.rb index 995f3e9..04300e0 100644 --- a/lib/helper.rb +++ b/lib/helper.rb @@ -1,3 +1,4 @@ +=begin helpers do # Authentification @@ -94,4 +95,4 @@ before do protected!(@subjectid) end end - +=end diff --git a/lib/model.rb b/lib/model.rb index 02fabfa..a806b74 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -4,6 +4,24 @@ module OpenTox include OpenTox + # Find a lazar model + # @param [String] uri Model URI + # @return [OpenTox::Model::Lazar] lazar model + def self.find(uri, subjectid=nil) + if CONFIG[:yaml_hosts].include?(URI.parse(uri).host) + YAML.load RestClientWrapper.get(uri,{:accept => 'application/x-yaml', :subjectid => subjectid}) + else + parser = Parser::Owl::Feature.new(uri, @subjectid) + @metadata = parser.load_uri.metadata + end + end + + # Get URIs of all models + # @return [Array] List of lazar model URIs + def self.all(subjectid=nil) + RestClientWrapper.get(CONFIG[:services]["opentox-model"], :subjectid => subjectid).to_s.split("\n") + end + # Run a model with parameters # @param [Hash] params Parameters for OpenTox model # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly @@ -29,35 +47,35 @@ module OpenTox # @return [OpenTox::Model::Generic] Model instance def self.find(uri,subjectid=nil) return nil unless uri - model = Generic.new(uri) - model.load_metadata(subjectid) + model = Generic.new(uri,subjectid) + model.load_metadata raise "could not load model metadata '"+uri.to_s+"'" if model.metadata==nil or model.metadata.size==0 model end # provides feature type, possible types are "regression" or "classification" # @return [String] feature type, "unknown" if type could not be estimated - def feature_type(subjectid=nil) + def feature_type unless @feature_type - load_predicted_variables( subjectid ) unless @predicted_variable - @feature_type = OpenTox::Feature.find( @predicted_variable, subjectid ).feature_type + load_predicted_variables unless @predicted_variable + @feature_type = OpenTox::Feature.find( @predicted_variable, @subjectid ).feature_type end @feature_type end - def predicted_variable( subjectid ) - load_predicted_variables( subjectid ) unless @predicted_variable + def predicted_variable + load_predicted_variables unless @predicted_variable @predicted_variable end - def predicted_confidence( subjectid ) - load_predicted_variables( subjectid ) unless @predicted_confidence + def predicted_confidence + load_predicted_variables unless @predicted_confidence @predicted_confidence end private - def load_predicted_variables( subjectid=nil ) - load_metadata(subjectid) if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) + def load_predicted_variables + load_metadata if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) if @metadata[OT.predictedVariables] predictedVariables = @metadata[OT.predictedVariables] if predictedVariables.is_a?(Array) @@ -86,14 +104,14 @@ module OpenTox end # Lazy Structure Activity Relationship class - class Lazar + class Lazar < Generic - include Model + #include Model include Algorithm attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm, :min_sim, :subjectid, :prop_kernel, :value_map - def initialize(uri=nil) + def initialize(uri=nil,subjectid=nil) if uri super uri @@ -119,17 +137,15 @@ module OpenTox end - # Get URIs of all lazar models - # @return [Array] List of lazar model URIs - def self.all(subjectid=nil) - RestClientWrapper.get(CONFIG[:services]["opentox-model"], :subjectid => subjectid).to_s.split("\n") - end - - # Find a lazar model + # Find a lazar model via URI, and loads metadata, could raise NotFound/NotAuthorized error # @param [String] uri Model URI - # @return [OpenTox::Model::Lazar] lazar model - def self.find(uri, subjectid=nil) - YAML.load RestClientWrapper.get(uri,{:accept => 'application/x-yaml', :subjectid => subjectid}) + # @return [OpenTox::Model::Generic] Model instance + def self.find(uri,subjectid=nil) + return nil unless uri + model = Lazar.new(uri,subjectid) + model.load_metadata + raise "could not load model metadata '"+uri.to_s+"'" if model.metadata==nil or model.metadata.size==0 + model end # Create a new lazar model @@ -142,6 +158,7 @@ module OpenTox OpenTox::Model::Lazar.find(model_uri, subjectid) end +=begin # Get a parameter value # @param [String] param Parameter name # @return [String] Parameter value @@ -465,6 +482,7 @@ module OpenTox RestClientWrapper.delete(@uri, :subjectid => subjectid) unless @uri == CONFIG[:services]["opentox-model"] end +=end end end end diff --git a/lib/opentox-ruby.rb b/lib/opentox-ruby.rb index ae05cb2..16abee9 100644 --- a/lib/opentox-ruby.rb +++ b/lib/opentox-ruby.rb @@ -1,14 +1,15 @@ -['rubygems', 'sinatra', 'sinatra/url_for', 'ohm', 'rest_client', 'yaml', 'cgi', 'spork', 'error', 'overwrite', 'environment'].each do |lib| +#['rubygems', 'sinatra', 'sinatra/url_for', 'ohm', 'rest_client', 'yaml', 'cgi', 'spork', 'error', 'overwrite', 'environment'].each do |lib| +['rubygems', 'rest_client', 'yaml', 'cgi', 'spork', 'error', 'overwrite', 'environment'].each do |lib| require lib end -begin - require 'openbabel' -rescue LoadError - puts "Please install Openbabel with 'rake openbabel:install' in the compound component" -end +#begin + #require 'openbabel' +#rescue LoadError + #puts "Please install Openbabel with 'rake openbabel:install' in the compound component" +#end -['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', - 'rest_client_wrapper', 'authorization', 'policy', 'helper', 'to-html', 'ontology' ].each do |lib| +#['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper', 'authorization', 'policy', 'helper', 'to-html', 'ontology' ].each do |lib| +['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper', 'authorization', 'policy', 'ontology' ].each do |lib| require lib end diff --git a/lib/opentox.rb b/lib/opentox.rb index c76e21a..6250d86 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -5,8 +5,9 @@ module OpenTox # Initialize OpenTox object with optional uri # @param [optional, String] URI - def initialize(uri=nil) + def initialize(uri=nil,subjectid=nil) @metadata = {} + @subjectid = subjectid self.uri = uri if uri end @@ -25,11 +26,15 @@ module OpenTox # Load (and return) metadata from object URI # @return [Hash] Metadata - def load_metadata(subjectid=nil) - @metadata = Parser::Owl::Generic.new(@uri).load_metadata(subjectid) + def load_metadata + @metadata = Parser::Owl::Generic.new(@uri).load_metadata @metadata end + # Add/modify metadata, existing entries will be overwritten + # @example + # dataset.add_metadata({DC.title => "any_title", DC.creator => "my_email"}) + # @param [Hash] metadata Hash mapping predicate_uris to values def add_metadata(metadata) metadata.each do |k,v| if v.is_a? Array @@ -46,13 +51,12 @@ module OpenTox def to_rdfxml s = Serializer::Owl.new s.add_metadata(@uri,@metadata) - #s.add_parameters(@uri,@parameters) if @parameters s.to_rdfxml end # deletes the resource, deletion should have worked when no RestCallError raised - def delete(subjectid=nil) - RestClientWrapper.delete(uri,:subjectid => subjectid) + def delete + RestClientWrapper.delete(uri,:subjectid => @subjectid) end end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index df4e1b7..efc570d 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -1,3 +1,4 @@ +=begin # class overwrites aka monkey patches # hack: store sinatra instance in global var $url_provider to make url_for and halt methods accessible before { @@ -61,6 +62,7 @@ class Sinatra::Base end end end +=end class String def task_uri? @@ -143,8 +145,10 @@ class OTLogger < Logger end # make migration from datamapper more straightforward +=begin class Ohm::Model def self.get(id) self[id] end end +=end diff --git a/lib/to-html.rb b/lib/to-html.rb index 2c29f7d..04fa158 100644 --- a/lib/to-html.rb +++ b/lib/to-html.rb @@ -1,4 +1,3 @@ - OT_LOGO = File.join(CONFIG[:services]["opentox-validation"],"resources/ot-logo.png") class String -- cgit v1.2.3 From 442aa6f6647756d10d57cd7869cb3d27c87b24a8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 10 Jan 2012 13:04:01 +0100 Subject: untested update --- lib/opentox-ruby.rb | 2 +- lib/opentox.rb | 143 +++++++++++++++++++++++++++++++-------------- lib/parser.rb | 6 +- lib/rest_client_wrapper.rb | 2 +- lib/task.rb | 2 +- 5 files changed, 107 insertions(+), 48 deletions(-) diff --git a/lib/opentox-ruby.rb b/lib/opentox-ruby.rb index 16abee9..63935fa 100644 --- a/lib/opentox-ruby.rb +++ b/lib/opentox-ruby.rb @@ -1,5 +1,5 @@ #['rubygems', 'sinatra', 'sinatra/url_for', 'ohm', 'rest_client', 'yaml', 'cgi', 'spork', 'error', 'overwrite', 'environment'].each do |lib| -['rubygems', 'rest_client', 'yaml', 'cgi', 'spork', 'error', 'overwrite', 'environment'].each do |lib| +['rubygems', 'rest_client', 'yaml', 'cgi', 'error', 'overwrite', 'environment'].each do |lib| require lib end diff --git a/lib/opentox.rb b/lib/opentox.rb index 6250d86..dbe2360 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -1,51 +1,70 @@ +require "./parser.rb" +require "./rest_client_wrapper.rb" +require "./error.rb" + +SERVICES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task"] + module OpenTox - attr_reader :uri - attr_accessor :metadata + attr_accessor :subjectid, :uri + attr_writer :metadata - # Initialize OpenTox object with optional uri - # @param [optional, String] URI - def initialize(uri=nil,subjectid=nil) - @metadata = {} + # Initialize OpenTox object with optional subjectid + # @param [optional, String] subjectid + def initialize uri=nil, subjectid=nil + @uri = uri @subjectid = subjectid - self.uri = uri if uri end - # Set URI - # @param [String] URI - def uri=(uri) - @uri = uri - @metadata[XSD.anyURI] = uri - end - - # Get all objects from a service - # @return [Array] List of available URIs - def self.all(uri, subjectid=nil) - RestClientWrapper.get(uri,:accept => "text/uri-list", :subjectid => subjectid).to_s.split(/\n/) - end - - # Load (and return) metadata from object URI - # @return [Hash] Metadata - def load_metadata - @metadata = Parser::Owl::Generic.new(@uri).load_metadata - @metadata - end - - # Add/modify metadata, existing entries will be overwritten - # @example - # dataset.add_metadata({DC.title => "any_title", DC.creator => "my_email"}) - # @param [Hash] metadata Hash mapping predicate_uris to values - def add_metadata(metadata) - metadata.each do |k,v| - if v.is_a? Array - @metadata[k] = [] unless @metadata[k] - @metadata[k] << v - else - @metadata[k] = v - end - end + def metadata + @metadata ||= Parser::Owl::Generic.from_rdf get(:accept => "application/rdf+xml") + end + + # REST API + # returns OpenTox::WrapperResult, not OpenTox objects + + # perfoms a GET REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # per default: waits for Task to finish and returns result URI of Task + # @param [optional,Hash] headers contains params like accept-header + # @param [wait,Boolean] wait set to false to NOT wait for task if result is task + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def get headers={}, wait=true + headers[:subjectid] = @subjectid + RestClientWrapper.get(@uri, headers, nil, wait).chomp end + # performs a POST REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # per default: waits for Task to finish and returns result URI of Task + # @param [optional,String] payload data posted to the service + # @param [optional,Hash] headers contains params like accept-header + # @param [wait,Boolean] wait set to false to NOT wait for task if result is task + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def post payload=nil, headers={}, wait=true + headers[:subjectid] = @subjectid + RestClientWrapper.post(@uri, payload, headers, nil, wait).chomp + end + + # performs a PUT REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # @param [optional,String] payload data put to the service + # @param [optional,Hash] headers contains params like accept-header + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def put payload=nil, headers={} + headers[:subjectid] = @subjectid + RestClientWrapper.put(@uri, payload, headers).chomp + end + + # performs a DELETE REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def delete + RestClientWrapper.delete(@uri,:subjectid => @subjectid) + end + + # Tools + # Get OWL-DL representation in RDF/XML format # @return [application/rdf+xml] RDF/XML representation def to_rdfxml @@ -54,9 +73,47 @@ module OpenTox s.to_rdfxml end - # deletes the resource, deletion should have worked when no RestCallError raised - def delete - RestClientWrapper.delete(uri,:subjectid => @subjectid) + def uri_available? + url = URI.parse(@uri) + #TODO: move subjectid to header + subjectidstr = @subjectid ? "?subjectid=#{CGI.escape @subjectid}" : "" + Net::HTTP.start(url.host, url.port) do |http| + return http.head("#{url.request_uri}#{subjectidstr}").code == "200" + end + end + + # create default classes + SERVICES.each { |s| eval "class #{s}; include OpenTox; end" } + + module Collection + + include OpenTox + + def find + uri_available? ? object_class.new(@uri, @subjectid) : nil + end + + def create metadata + object_class.new post(service_uri, metadata.to_rdfxml, { :content_type => 'application/rdf+xml', :subjectid => subjectid}).to_s.chomp, @subject_id + end + + # Get all objects from a service + # @return [Array] List of available Objects + def all + get(:accept => "text/uri-list").to_s.split(/\n/).collect{|uri| object_class.new uri,@subjectid} + end + + def save object + object_class.new post(object.to_rdfxml, :content_type => 'application/rdf+xml').to_s, @subjectid + end + + def object_class + eval self.class.to_s.sub(/::Collection/,'') + end + + # create collection classes + SERVICES.each { |s| eval "class #{s}; include Collection; end" } + end end diff --git a/lib/parser.rb b/lib/parser.rb index a6878a2..580f6f7 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -1,5 +1,5 @@ -require 'spreadsheet' -require 'roo' +#require 'spreadsheet' +#require 'roo' class String @@ -259,6 +259,7 @@ module OpenTox end +=begin # Parser for getting spreadsheet data into a dataset class Spreadsheets @@ -440,5 +441,6 @@ module OpenTox end end +=end end end diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 53887a2..3dd3eff 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -53,7 +53,7 @@ module OpenTox private def self.execute( rest_call, uri, payload=nil, headers={}, waiting_task=nil, wait=true ) - raise OpenTox::BadRequestError.new "uri is null" unless uri + raise OpenTox::BadRequestError.new "uri is nil" unless uri raise OpenTox::BadRequestError.new "not a uri: "+uri.to_s unless uri.to_s.uri? raise "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) raise OpenTox::BadRequestError.new "accept should go into the headers" if payload and payload.is_a?(Hash) and payload[:accept] diff --git a/lib/task.rb b/lib/task.rb index 146a756..3815177 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -231,7 +231,7 @@ module OpenTox else raise "content type for tasks not supported: "+content_type.to_s end - raise "uri is null after loading" unless @uri and @uri.to_s.strip.size>0 + raise "uri is nil after loading" unless @uri and @uri.to_s.strip.size>0 end =end -- cgit v1.2.3 From e84a1b439e63ae3ed3b4bc3bc78261f95daf9ab7 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 11 Jan 2012 21:00:20 +0100 Subject: basic rest post get delete test working --- Rakefile | 34 ++------------------------ lib/opentox.rb | 59 +++++++++++++++++++++++++--------------------- lib/overwrite.rb | 1 + lib/parser.rb | 29 +++++++++++++++++++++++ lib/rest_client_wrapper.rb | 1 + test/rest.rb | 23 ++++++++++++++++++ 6 files changed, 88 insertions(+), 59 deletions(-) create mode 100644 test/rest.rb diff --git a/Rakefile b/Rakefile index 7e0bcf9..b670f39 100644 --- a/Rakefile +++ b/Rakefile @@ -11,37 +11,7 @@ begin gem.homepage = "http://github.com/opentox/opentox-ruby-minimal" gem.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] # dependencies with versions -# gem.add_dependency "sinatra", "=1.2.6" -# gem.add_dependency "emk-sinatra-url-for", "=0.2.1" -# gem.add_dependency "sinatra-respond_to", "=0.7.0" -# gem.add_dependency "sinatra-static-assets", "=0.5.0" - gem.add_dependency "rest-client", "=1.6.1" -# gem.add_dependency "rack", "=1.3.0" -# gem.add_dependency "rack-contrib", "=1.1.0" -# gem.add_dependency "rack-flash", "=0.1.1" - gem.add_dependency "nokogiri", "=1.4.4" -# gem.add_dependency "rubyzip", "=0.9.4" - gem.add_dependency "roo", "=1.9.3" - gem.add_dependency "spreadsheet", "=0.6.5.4" - gem.add_dependency "google-spreadsheet-ruby", "=0.1.5" - gem.add_dependency "yajl-ruby", "=0.8.2" - #gem.add_dependency "mail", "=2.3.0" -# gem.add_dependency "rinruby", "=2.0.2" -# gem.add_dependency "ohm", "=0.1.3" -# gem.add_dependency "ohm-contrib", "=0.1.1" -# gem.add_dependency "SystemTimer", "=1.2.3" -# gem.add_dependency "rjb", "=1.3.4" -# gem.add_dependency "haml", "=3.1.1" - #valiation-gems -# gem.add_dependency "dm-core", "=1.1.0" -# gem.add_dependency "dm-serializer", "=1.1.0" -# gem.add_dependency "dm-timestamps", "=1.1.0" -# gem.add_dependency "dm-types", "=1.1.0" -# gem.add_dependency "dm-migrations", "=1.1.0" -# gem.add_dependency "dm-validations", "=1.1.0" -# gem.add_dependency "dm-sqlite-adapter", "=1.1.0" -# gem.add_dependency "ruby-plot", "=0.5.0" - + gem.add_dependency "rest-client" gem.add_development_dependency 'jeweler' gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] end @@ -74,7 +44,7 @@ task :test => :check_dependencies task :default => :test -require 'rake/rdoctask' +require 'rdoc/task' Rake::RDocTask.new do |rdoc| if File.exist?('VERSION') version = File.read('VERSION') diff --git a/lib/opentox.rb b/lib/opentox.rb index dbe2360..b0ffcb1 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -1,13 +1,18 @@ -require "./parser.rb" -require "./rest_client_wrapper.rb" -require "./error.rb" - +require 'rdf' +require 'rdf/raptor' +#require "parser.rb" +require "rest_client_wrapper.rb" +require "overwrite.rb" +require "error.rb" + +RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' +RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' SERVICES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task"] module OpenTox - attr_accessor :subjectid, :uri - attr_writer :metadata + attr_accessor :subjectid, :uri #, :service_uri + #attr_writer :metadata # Initialize OpenTox object with optional subjectid # @param [optional, String] subjectid @@ -17,7 +22,13 @@ module OpenTox end def metadata - @metadata ||= Parser::Owl::Generic.from_rdf get(:accept => "application/rdf+xml") + metadata = {} + RDF::Reader.open(@uri) do |reader| + reader.each_statement do |statement| + metadata[statement.predicate] = statement.object if statement.subject == @uri + end + end + metadata end # REST API @@ -31,7 +42,7 @@ module OpenTox # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call def get headers={}, wait=true headers[:subjectid] = @subjectid - RestClientWrapper.get(@uri, headers, nil, wait).chomp + RestClientWrapper.get(@uri.to_s, headers, nil, wait).chomp end # performs a POST REST call @@ -41,9 +52,9 @@ module OpenTox # @param [optional,Hash] headers contains params like accept-header # @param [wait,Boolean] wait set to false to NOT wait for task if result is task # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def post payload=nil, headers={}, wait=true + def post payload={}, headers={}, wait=true headers[:subjectid] = @subjectid - RestClientWrapper.post(@uri, payload, headers, nil, wait).chomp + RestClientWrapper.post(@uri.to_s, payload, headers, nil, wait).chomp end # performs a PUT REST call @@ -51,40 +62,33 @@ module OpenTox # @param [optional,String] payload data put to the service # @param [optional,Hash] headers contains params like accept-header # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def put payload=nil, headers={} + def put payload={}, headers={} headers[:subjectid] = @subjectid - RestClientWrapper.put(@uri, payload, headers).chomp + RestClientWrapper.put(@uri.to_s, payload, headers).chomp end # performs a DELETE REST call # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call def delete - RestClientWrapper.delete(@uri,:subjectid => @subjectid) + RestClientWrapper.delete(@uri.to_s,:subjectid => @subjectid) end - # Tools + # create default classes + SERVICES.each { |s| eval "class #{s}; include OpenTox; end" } - # Get OWL-DL representation in RDF/XML format - # @return [application/rdf+xml] RDF/XML representation - def to_rdfxml - s = Serializer::Owl.new - s.add_metadata(@uri,@metadata) - s.to_rdfxml - end +=begin + # Tools def uri_available? url = URI.parse(@uri) - #TODO: move subjectid to header - subjectidstr = @subjectid ? "?subjectid=#{CGI.escape @subjectid}" : "" - Net::HTTP.start(url.host, url.port) do |http| + req = Net::HTTP.new(url.host,url.port) + req['subjectid'] = @subjectid if @subjectid + req.start(url.host, url.port) do |http| return http.head("#{url.request_uri}#{subjectidstr}").code == "200" end end - # create default classes - SERVICES.each { |s| eval "class #{s}; include OpenTox; end" } - module Collection include OpenTox @@ -115,6 +119,7 @@ module OpenTox SERVICES.each { |s| eval "class #{s}; include Collection; end" } end +=end end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index efc570d..d541b61 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -1,3 +1,4 @@ +require 'uri' =begin # class overwrites aka monkey patches # hack: store sinatra instance in global var $url_provider to make url_for and halt methods accessible diff --git a/lib/parser.rb b/lib/parser.rb index 580f6f7..7475d6d 100644 --- a/lib/parser.rb +++ b/lib/parser.rb @@ -1,6 +1,35 @@ #require 'spreadsheet' #require 'roo' +# OWL Namespaces +class OwlNamespace + + attr_accessor :uri + def initialize(uri) + @uri = uri + end + + def [](property) + @uri+property.to_s + end + + def type # for RDF.type + "#{@uri}type" + end + + def method_missing(property) + @uri+property.to_s + end + +end + +RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' +OWL = OwlNamespace.new 'http://www.w3.org/2002/07/owl#' +DC = OwlNamespace.new 'http://purl.org/dc/elements/1.1/' +OT = OwlNamespace.new 'http://www.opentox.org/api/1.1#' +OTA = OwlNamespace.new 'http://www.opentox.org/algorithmTypes.owl#' +XSD = OwlNamespace.new 'http://www.w3.org/2001/XMLSchema#' + class String # Split RDF statement into triples diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb index 3dd3eff..30f04cc 100644 --- a/lib/rest_client_wrapper.rb +++ b/lib/rest_client_wrapper.rb @@ -1,3 +1,4 @@ +require 'rest-client' module OpenTox class WrapperResult < String diff --git a/test/rest.rb b/test/rest.rb new file mode 100644 index 0000000..576e712 --- /dev/null +++ b/test/rest.rb @@ -0,0 +1,23 @@ +$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' ) +require 'rubygems' +require 'opentox.rb' +require 'test/unit' + +class RestTest < Test::Unit::TestCase + + def test_post_get_delete + uristring = "http://ot-dev.in-silico.ch/dataset" + uri = uristring + dataset_service = OpenTox::Dataset.new uri + assert_match /#{uristring}/, dataset_service.get + dataset_uri = dataset_service.post + assert_match /#{uristring}/, dataset_uri.to_s + dataset = OpenTox::Dataset.new dataset_uri + assert_equal dataset_uri, dataset.uri + metadata = dataset.metadata + assert_equal RDF::OT.Dataset, metadata[RDF.type] + assert_equal dataset.uri, metadata[RDF::XSD.anyURI] + dataset.delete + end + +end -- cgit v1.2.3 From 17c5833fbaa7f06b0b7f13494bd2649fd75e35f3 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 12 Jan 2012 12:55:40 +0100 Subject: feature test added, version reset to 0.0.1 --- Rakefile | 4 ++++ VERSION | 2 +- test/feature.rb | 39 +++++++++++++++++++++++++++++++++++++++ test/rest.rb | 2 +- 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 test/feature.rb diff --git a/Rakefile b/Rakefile index b670f39..a99522a 100644 --- a/Rakefile +++ b/Rakefile @@ -12,6 +12,8 @@ begin gem.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] # dependencies with versions gem.add_dependency "rest-client" + gem.add_dependency "rdf" + gem.add_dependency "rdf-raptor" gem.add_development_dependency 'jeweler' gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] end @@ -20,6 +22,7 @@ rescue LoadError puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler" end +=begin require 'rake/testtask' Rake::TestTask.new(:test) do |test| test.libs << 'lib' << 'test' @@ -57,3 +60,4 @@ Rake::RDocTask.new do |rdoc| rdoc.rdoc_files.include('README*') rdoc.rdoc_files.include('lib/**/*.rb') end +=end diff --git a/VERSION b/VERSION index 359a5b9..8acdd82 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.0 \ No newline at end of file +0.0.1 diff --git a/test/feature.rb b/test/feature.rb new file mode 100644 index 0000000..479e29f --- /dev/null +++ b/test/feature.rb @@ -0,0 +1,39 @@ +$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' ) +require 'rubygems' +require 'opentox-ruby-minimal' +require 'test/unit' +#require 'validate-owl' + +class FeatureTest < Test::Unit::TestCase + + def setup + @features = [ + #@@classification_training_dataset.features.keys.first, + "http://apps.ideaconsult.net:8080/ambit2/feature/35796", + #File.join(OpenTox::Model::Lazar.all.last,"predicted","value") + + ] + end + + def test_feature + @features.each do |uri| + puts uri + f = OpenTox::Feature.new(uri) + metadata = f.metadata + puts metadata.inspect + assert_equal RDF::OT.Feature, metadata[RDF.type] + end + end + +=begin + def test_owl + #@features.each do |uri| + validate_owl @features.first, @@subjectid unless CONFIG[:services]["opentox-dataset"].match(/localhost/) + validate_owl @features.last, @@subjectid unless CONFIG[:services]["opentox-dataset"].match(/localhost/) + # Ambit does not validate + #end + end +=end + + +end diff --git a/test/rest.rb b/test/rest.rb index 576e712..1000b4e 100644 --- a/test/rest.rb +++ b/test/rest.rb @@ -1,6 +1,6 @@ $LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' ) require 'rubygems' -require 'opentox.rb' +require 'opentox-ruby-minimal.rb' require 'test/unit' class RestTest < Test::Unit::TestCase -- cgit v1.2.3 From ad50866e35b665dd8e4a11c6b8384cfcdb219040 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 12 Jan 2012 12:58:48 +0100 Subject: test/all.rb added --- test/all.rb | 16 ++++++++++++++++ test/feature.rb | 5 +---- 2 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 test/all.rb diff --git a/test/all.rb b/test/all.rb new file mode 100644 index 0000000..6666e84 --- /dev/null +++ b/test/all.rb @@ -0,0 +1,16 @@ +require 'rubygems' +require 'test/unit' +require 'opentox-ruby-minimal' +require './rest.rb' +require './feature.rb' +#require './authorization.rb' +#require './compound.rb' +#require './dataset.rb' +#require './parser.rb' +#require './task.rb' +#require './algorithm.rb' +#require './fminer.rb' +#require './lazar.rb' +#require './validation.rb' +#require './toxcreate.rb' +#require './transform.rb' diff --git a/test/feature.rb b/test/feature.rb index 479e29f..c389e8f 100644 --- a/test/feature.rb +++ b/test/feature.rb @@ -17,11 +17,8 @@ class FeatureTest < Test::Unit::TestCase def test_feature @features.each do |uri| - puts uri f = OpenTox::Feature.new(uri) - metadata = f.metadata - puts metadata.inspect - assert_equal RDF::OT.Feature, metadata[RDF.type] + assert_equal RDF::OT.Feature, f.metadata[RDF.type] end end -- cgit v1.2.3 From ac54997dccc571471a0cdf62939e2fcbc42e06e2 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 13 Jan 2012 12:49:09 +0100 Subject: compound added --- lib/compound.rb | 39 +++++++-------------------- lib/opentox-ruby-minimal.rb | 2 ++ lib/opentox.rb | 64 +++++++++++++++++++++++++++------------------ test/all.rb | 9 ++++--- test/compound.rb | 53 +++++++++++++++++++++++++++++++++++++ test/ruby-api.rb | 17 ++++++++++++ 6 files changed, 126 insertions(+), 58 deletions(-) create mode 100644 lib/opentox-ruby-minimal.rb create mode 100644 test/compound.rb create mode 100644 test/ruby-api.rb diff --git a/lib/compound.rb b/lib/compound.rb index 189db7b..974e46e 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -6,44 +6,27 @@ module OpenTox # Ruby wrapper for OpenTox Compound Webservices (http://opentox.org/dev/apis/api-1.2/structure). class Compound - attr_accessor :inchi, :uri - - # Create compound with optional uri - # @example - # compound = OpenTox::Compound.new("http://webservices.in-silico.ch/compound/InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H"") - # @param [optional, String] uri Compound URI - # @return [OpenTox::Compound] Compound - def initialize(uri=nil) - @uri = uri - case @uri - when /InChI/ # shortcut for IST services - @inchi = @uri.sub(/^.*InChI/, 'InChI') - else - @inchi = RestClientWrapper.get(@uri, :accept => 'chemical/x-inchi').to_s.chomp if @uri - end - end - # Create a compound from smiles string # @example # compound = OpenTox::Compound.from_smiles("c1ccccc1") # @param [String] smiles Smiles string # @return [OpenTox::Compound] Compound - def self.from_smiles(smiles) - Compound.new RestClientWrapper.post(CONFIG[:services]["opentox-compound"], smiles, :content_type => 'chemical/x-daylight-smiles').to_s.chomp + def self.from_smiles service_uri, smiles, subjectid=nil + Compound.new RestClientWrapper.post(service_uri, smiles, :content_type => 'chemical/x-daylight-smiles').to_s.chomp end # Create a compound from inchi string # @param [String] smiles InChI string # @return [OpenTox::Compound] Compound - def self.from_inchi(inchi) - Compound.new RestClientWrapper.post(CONFIG[:services]["opentox-compound"], inchi, :content_type => 'chemical/x-inchi').to_s.chomp + def self.from_inchi(service_uri, inchi) + Compound.new RestClientWrapper.post(service_uri, inchi, :content_type => 'chemical/x-inchi').to_s.chomp end # Create a compound from sdf string # @param [String] smiles SDF string # @return [OpenTox::Compound] Compound - def self.from_sdf(sdf) - Compound.new RestClientWrapper.post(CONFIG[:services]["opentox-compound"], sdf, :content_type => 'chemical/x-mdl-sdfile').to_s.chomp + def self.from_sdf(service_uri, sdf) + Compound.new RestClientWrapper.post(service_uri, sdf, :content_type => 'chemical/x-mdl-sdfile').to_s.chomp end # Create a compound from name. Relies on an external service for name lookups. @@ -51,18 +34,16 @@ module OpenTox # compound = OpenTox::Compound.from_name("Benzene") # @param [String] name name can be also an InChI/InChiKey, CAS number, etc # @return [OpenTox::Compound] Compound - def self.from_name(name) - c = Compound.new + def self.from_name(service_uri, name) # paranoid URI encoding to keep SMILES charges and brackets - c.inchi = RestClientWrapper.get("#{@@cactus_uri}#{URI.encode(name, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").to_s.chomp - c.uri = File.join(CONFIG[:services]["opentox-compound"],URI.escape(c.inchi)) - c + inchi = RestClientWrapper.get("#{@@cactus_uri}#{URI.encode(name, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").to_s.chomp + Compound.new File.join(service_uri,URI.escape(inchi)) end # Get InChI # @return [String] InChI string def to_inchi - @inchi + RestClientWrapper.get(@uri, :accept => 'chemical/x-inchi').to_s.chomp if @uri end # Get (canonical) smiles diff --git a/lib/opentox-ruby-minimal.rb b/lib/opentox-ruby-minimal.rb new file mode 100644 index 0000000..e0d5489 --- /dev/null +++ b/lib/opentox-ruby-minimal.rb @@ -0,0 +1,2 @@ +require "opentox" +require "compound" diff --git a/lib/opentox.rb b/lib/opentox.rb index b0ffcb1..a6ac1d4 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -11,8 +11,8 @@ SERVICES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation" module OpenTox - attr_accessor :subjectid, :uri #, :service_uri - #attr_writer :metadata + attr_accessor :subjectid, :uri + attr_writer :metadata # Initialize OpenTox object with optional subjectid # @param [optional, String] subjectid @@ -21,14 +21,26 @@ module OpenTox @subjectid = subjectid end - def metadata - metadata = {} - RDF::Reader.open(@uri) do |reader| - reader.each_statement do |statement| - metadata[statement.predicate] = statement.object if statement.subject == @uri + # Ruby interface + + def metadata reload=true + if reload + @metadata = {} + RDF::Reader.open(@uri) do |reader| + reader.each_statement do |statement| + @metadata[statement.predicate] = statement.object if statement.subject == @uri + end end end - metadata + @metadata + end + + def save + rdf = RDF::Writer.buffer do |writer| + @metadata.each { |p,o| writer << RDF::Statement.new(RDF::URI.new(@uri), p, o) } + end + puts rdf + #post(@uri, rdf, { :content_type => 'application/rdf+xml', :subjectid => subjectid}).to_s.chomp, @subjectid end # REST API @@ -74,17 +86,31 @@ module OpenTox RestClientWrapper.delete(@uri.to_s,:subjectid => @subjectid) end + + module Service + def create service_uri, subjectid=nil + service = eval("#{self}.new(\"#{service_uri}\", #{subjectid})") + uri = service.post({}, {}, subjectid).to_s + eval "#{self}.new(\"#{uri}\", #{subjectid})" + end + end + # create default classes - SERVICES.each { |s| eval "class #{s}; include OpenTox; end" } + SERVICES.each do |s| + eval "class #{s} + include OpenTox + extend OpenTox::Service + end" + end =begin - # Tools + private def uri_available? url = URI.parse(@uri) - req = Net::HTTP.new(url.host,url.port) - req['subjectid'] = @subjectid if @subjectid - req.start(url.host, url.port) do |http| + #req = Net::HTTP.new(url.host,url.port) + #req['subjectid'] = @subjectid if @subjectid + Net::HTTP.start(url.host, url.port) do |http| return http.head("#{url.request_uri}#{subjectidstr}").code == "200" end end @@ -93,10 +119,6 @@ module OpenTox include OpenTox - def find - uri_available? ? object_class.new(@uri, @subjectid) : nil - end - def create metadata object_class.new post(service_uri, metadata.to_rdfxml, { :content_type => 'application/rdf+xml', :subjectid => subjectid}).to_s.chomp, @subject_id end @@ -107,14 +129,6 @@ module OpenTox get(:accept => "text/uri-list").to_s.split(/\n/).collect{|uri| object_class.new uri,@subjectid} end - def save object - object_class.new post(object.to_rdfxml, :content_type => 'application/rdf+xml').to_s, @subjectid - end - - def object_class - eval self.class.to_s.sub(/::Collection/,'') - end - # create collection classes SERVICES.each { |s| eval "class #{s}; include Collection; end" } diff --git a/test/all.rb b/test/all.rb index 6666e84..91a994c 100644 --- a/test/all.rb +++ b/test/all.rb @@ -1,10 +1,11 @@ -require 'rubygems' -require 'test/unit' -require 'opentox-ruby-minimal' +#require 'rubygems' +#require 'test/unit' +#require 'opentox-ruby-minimal' require './rest.rb' +require './ruby-api.rb' require './feature.rb' +require './compound.rb' #require './authorization.rb' -#require './compound.rb' #require './dataset.rb' #require './parser.rb' #require './task.rb' diff --git a/test/compound.rb b/test/compound.rb new file mode 100644 index 0000000..35fc514 --- /dev/null +++ b/test/compound.rb @@ -0,0 +1,53 @@ +$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' ) +require 'rubygems' +require 'opentox-ruby-minimal.rb' +require 'test/unit' + +class CompoundTest < Test::Unit::TestCase + + def setup + @service_uri = "http://ot-dev.in-silico.ch/compound" + end + + def test_compound_from_smiles_0 + c = OpenTox::Compound.from_smiles @service_uri, "F[B-](F)(F)F.[Na+]" + assert_equal "InChI=1S/BF4.Na/c2-1(3,4)5;/q-1;+1", c.to_inchi + assert_equal "[Na+].F[B-](F)(F)F", c.to_smiles # still does not work on 64bit machines + end + + def test_compound_from_smiles_1 + c = OpenTox::Compound.from_smiles @service_uri, "CC(=O)CC(C)C#N" + assert_equal "InChI=1S/C6H9NO/c1-5(4-7)3-6(2)8/h5H,3H2,1-2H3", c.to_inchi + assert_equal "CC(CC(=O)C)C#N", c.to_smiles + end + + def test_compound_from_name + c = OpenTox::Compound.from_name @service_uri, "Benzene" + assert_equal "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H", c.to_inchi + assert_equal "c1ccccc1", c.to_smiles + end + + def test_compound_from_smiles_2 + c = OpenTox::Compound.from_smiles @service_uri, "N#[N+]C1=CC=CC=C1.F[B-](F)(F)F" + assert_equal "InChI=1S/C6H5N2.BF4/c7-8-6-4-2-1-3-5-6;2-1(3,4)5/h1-5H;/q+1;-1", c.to_inchi + assert_equal "N#[N+]c1ccccc1.F[B-](F)(F)F", c.to_smiles + end + + def test_compound_from_inchi + c = OpenTox::Compound.from_inchi @service_uri, "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H" + assert_equal "c1ccccc1", c.to_smiles + end + + def test_compound_ambit + c = OpenTox::Compound.new "http://apps.ideaconsult.net:8080/ambit2/compound/144036" + assert_equal "InChI=1S/C6H11NO2/c1-3-5-6(4-2)7(8)9/h5H,3-4H2,1-2H3", c.to_inchi + assert_equal "CCC=C(CC)[N+](=O)[O-]", c.to_smiles + end + +=begin + def test_match_hits + c = OpenTox::Compound.from_smiles @service_uri, "N=C=C1CCC(=F=FO)C1" + assert_equal ({"FF"=>2, "CC"=>10, "C"=>6, "C1CCCC1"=>10, "C=C"=>2}), c.match_hits(['CC','F=F','C','C=C','FF','C1CCCC1','OO']) + end +=end +end diff --git a/test/ruby-api.rb b/test/ruby-api.rb new file mode 100644 index 0000000..be828fb --- /dev/null +++ b/test/ruby-api.rb @@ -0,0 +1,17 @@ +$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' ) +require 'rubygems' +require 'opentox-ruby-minimal.rb' +require 'test/unit' + +class RubyAPITest < Test::Unit::TestCase + + def test_create + d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset"#, {RDF::DC.title => "test dataset"} + assert_equal OpenTox::Dataset, d.class + assert_equal RDF::OT.Dataset, d.metadata[RDF.type] + end + + def test_save + end + +end -- cgit v1.2.3 From 354aaa649e9eeed5d81793e09d9714b45063c147 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 8 Feb 2012 13:14:11 +0100 Subject: toxbank-investigation compatible version --- Rakefile | 42 +- lib/algorithm.rb | 398 +- lib/authorization.rb | 156 +- lib/compound.rb | 31 +- lib/config/config_ru.rb | 54 - lib/dataset.rb | 253 +- lib/environment.rb | 83 - lib/error.rb | 98 - lib/feature.rb | 44 - lib/helper.rb | 98 - lib/model.rb | 480 +- lib/ontology.rb | 55 - lib/opentox-client.rb | 7 + lib/opentox-ruby-minimal.rb | 2 - lib/opentox-ruby.rb | 15 - lib/opentox.owl | 809 -- lib/opentox.rb | 214 +- lib/overwrite.rb | 155 - lib/parser.rb | 475 - lib/rest_client_wrapper.rb | 182 - lib/serializer.rb | 491 - lib/spork.rb | 83 - lib/task.rb | 367 +- lib/to-html.rb | 109 - lib/validation.rb | 313 - opentox-ruby.gemspec | 157 - test/all.rb | 17 - test/compound.rb | 5 +- test/data/CPDBAS_v5c_1547_29Apr2008part.sdf | 13553 ++++++++++++++++++++ test/data/EPAFHM.csv | 618 + test/data/EPAFHM.mini.csv | 21 + test/data/ISSCAN-multi.csv | 59 + test/data/cpdb_100.csv | 101 + test/data/hamster_carcinogenicity.csv | 86 + test/data/hamster_carcinogenicity.mini.csv | 11 + test/data/hamster_carcinogenicity.sdf | 2805 ++++ test/data/hamster_carcinogenicity.xls | Bin 0 -> 12288 bytes test/data/hamster_carcinogenicity.yaml | 352 + test/data/hamster_carcinogenicity_with_errors.csv | 88 + test/data/kazius.csv | 4069 ++++++ test/data/multi_cell_call.csv | 1067 ++ test/data/multicolumn.csv | 5 + test/feature.rb | 8 +- test/rest.rb | 16 +- test/ruby-api.rb | 25 +- test/task.rb | 34 + 46 files changed, 23260 insertions(+), 4851 deletions(-) delete mode 100644 lib/config/config_ru.rb delete mode 100644 lib/environment.rb delete mode 100644 lib/error.rb delete mode 100644 lib/feature.rb delete mode 100644 lib/helper.rb delete mode 100644 lib/ontology.rb create mode 100644 lib/opentox-client.rb delete mode 100644 lib/opentox-ruby-minimal.rb delete mode 100644 lib/opentox-ruby.rb delete mode 100644 lib/opentox.owl delete mode 100644 lib/overwrite.rb delete mode 100644 lib/parser.rb delete mode 100644 lib/rest_client_wrapper.rb delete mode 100644 lib/serializer.rb delete mode 100644 lib/spork.rb delete mode 100644 lib/to-html.rb delete mode 100644 lib/validation.rb delete mode 100644 opentox-ruby.gemspec delete mode 100644 test/all.rb create mode 100644 test/data/CPDBAS_v5c_1547_29Apr2008part.sdf create mode 100644 test/data/EPAFHM.csv create mode 100644 test/data/EPAFHM.mini.csv create mode 100644 test/data/ISSCAN-multi.csv create mode 100644 test/data/cpdb_100.csv create mode 100644 test/data/hamster_carcinogenicity.csv create mode 100644 test/data/hamster_carcinogenicity.mini.csv create mode 100644 test/data/hamster_carcinogenicity.sdf create mode 100644 test/data/hamster_carcinogenicity.xls create mode 100644 test/data/hamster_carcinogenicity.yaml create mode 100644 test/data/hamster_carcinogenicity_with_errors.csv create mode 100644 test/data/kazius.csv create mode 100644 test/data/multi_cell_call.csv create mode 100644 test/data/multicolumn.csv create mode 100644 test/task.rb diff --git a/Rakefile b/Rakefile index a99522a..2c791a6 100644 --- a/Rakefile +++ b/Rakefile @@ -4,7 +4,7 @@ require 'rake' begin require 'jeweler' Jeweler::Tasks.new do |gem| - gem.name = "opentox-ruby-minimal" + gem.name = "opentox-client" gem.summary = %Q{Ruby wrapper for the OpenTox REST API} gem.description = %Q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} gem.email = "helma@in-silico.ch" @@ -22,42 +22,10 @@ rescue LoadError puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler" end -=begin require 'rake/testtask' -Rake::TestTask.new(:test) do |test| - test.libs << 'lib' << 'test' - test.pattern = 'test/**/*_test.rb' - test.verbose = true +Rake::TestTask.new do |t| + t.libs << 'lib' + t.test_files = FileList['test/*.rb'] + t.verbose = true end -begin - require 'rcov/rcovtask' - Rcov::RcovTask.new do |test| - test.libs << 'test' - test.pattern = 'test/**/*_test.rb' - test.verbose = true - end -rescue LoadError - task :rcov do - abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov" - end -end - -task :test => :check_dependencies - -task :default => :test - -require 'rdoc/task' -Rake::RDocTask.new do |rdoc| - if File.exist?('VERSION') - version = File.read('VERSION') - else - version = "" - end - - rdoc.rdoc_dir = 'rdoc' - rdoc.title = "opentox-ruby-minimal #{version}" - rdoc.rdoc_files.include('README*') - rdoc.rdoc_files.include('lib/**/*.rb') -end -=end diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 4c50d32..4986c40 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -1,407 +1,15 @@ -# R integration -# workaround to initialize R non-interactively (former rinruby versions did this by default) -# avoids compiling R with X -#R = nil -#require "rinruby" - module OpenTox # Wrapper for OpenTox Algorithms - module Algorithm - - include OpenTox + class Algorithm # Execute algorithm with parameters, please consult the OpenTox API and the webservice documentation for acceptable parameters # @param [optional,Hash] params Algorithm parameters # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [String] URI of new resource (dataset, model, ...) - def run(params=nil, waiting_task=nil) - #puts @uri - RestClientWrapper.post(@uri, params, {:accept => 'text/uri-list'}, waiting_task).to_s - end - - # Get OWL-DL representation in RDF/XML format - # @return [application/rdf+xml] RDF/XML representation - def to_rdfxml - s = Serializer::Owl.new - s.add_algorithm(@uri,@metadata) - s.to_rdfxml - end - - # Generic Algorithm class, should work with all OpenTox webservices - class Generic - include Algorithm - - # Find Generic Opentox Algorithm via URI, and loads metadata, could raise NotFound/NotAuthorized error - # @param [String] uri Algorithm URI - # @return [OpenTox::Algorithm::Generic] Algorithm instance - def self.find(uri, subjectid=nil) - return nil unless uri - alg = Generic.new(uri) - alg.load_metadata - raise "cannot load algorithm metadata" if alg.metadata==nil or alg.metadata.size==0 - alg - end - - end - - # Fminer algorithms (https://github.com/amaunz/fminer2) - module Fminer - include Algorithm - - # Backbone Refinement Class mining (http://bbrc.maunz.de/) - class BBRC - include Fminer - # Initialize bbrc algorithm - def initialize(subjectid=nil) - super File.join(CONFIG[:services]["opentox-algorithm"], "fminer/bbrc") - load_metadata - end - end - - # LAtent STructure Pattern Mining (http://last-pm.maunz.de) - class LAST - include Fminer - # Initialize last algorithm - def initialize(subjectid=nil) - super File.join(CONFIG[:services]["opentox-algorithm"], "fminer/last") - load_metadata - end - end - - end - - # Create lazar prediction model - class Lazar - include Algorithm - # Initialize lazar algorithm - def initialize(subjectid=nil) - super File.join(CONFIG[:services]["opentox-algorithm"], "lazar") - load_metadata - end - end - -=begin - # Utility methods without dedicated webservices - - # Similarity calculations - module Similarity - include Algorithm - - # Tanimoto similarity - # @param [Array] features_a Features of first compound - # @param [Array] features_b Features of second compound - # @param [optional, Hash] weights Weights for all features - # @return [Float] (Weighted) tanimoto similarity - def self.tanimoto(features_a,features_b,weights=nil) - common_features = features_a & features_b - all_features = (features_a + features_b).uniq - common_p_sum = 0.0 - if common_features.size > 0 - if weights - common_features.each{|f| common_p_sum += Algorithm.gauss(weights[f])} - all_p_sum = 0.0 - all_features.each{|f| all_p_sum += Algorithm.gauss(weights[f])} - common_p_sum/all_p_sum - else - common_features.to_f/all_features - end - else - 0.0 - end - end - - # Euclidean similarity - # @param [Hash] properties_a Properties of first compound - # @param [Hash] properties_b Properties of second compound - # @param [optional, Hash] weights Weights for all properties - # @return [Float] (Weighted) euclidean similarity - def self.euclidean(properties_a,properties_b,weights=nil) - common_properties = properties_a.keys & properties_b.keys - if common_properties.size > 1 - dist_sum = 0 - common_properties.each do |p| - if weights - dist_sum += ( (properties_a[p] - properties_b[p]) * Algorithm.gauss(weights[p]) )**2 - else - dist_sum += (properties_a[p] - properties_b[p])**2 - end - end - 1/(1+Math.sqrt(dist_sum)) - else - 0.0 - end - end - end - - module Neighbors - - # Classification with majority vote from neighbors weighted by similarity - # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity` - # @param [optional] params Ignored (only for compatibility with local_svm_regression) - # @return [Hash] Hash with keys `:prediction, :confidence` - def self.weighted_majority_vote(neighbors,params={}, props=nil) - conf = 0.0 - confidence = 0.0 - neighbors.each do |neighbor| - case neighbor[:activity].to_s - when 'true' - conf += Algorithm.gauss(neighbor[:similarity]) - when 'false' - conf -= Algorithm.gauss(neighbor[:similarity]) - end - end - if conf > 0.0 - prediction = true - elsif conf < 0.0 - prediction = false - else - prediction = nil - end - confidence = conf/neighbors.size if neighbors.size > 0 - {:prediction => prediction, :confidence => confidence.abs} - end - - # Local support vector regression from neighbors - # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` - # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required - # @return [Hash] Hash with keys `:prediction, :confidence` - def self.local_svm_regression(neighbors, params, props=nil) - take_logs=true - neighbors.each do |n| - if (! n[:activity].nil?) && (n[:activity].to_f < 0.0) - take_logs = false - end - end - acts = neighbors.collect do |n| - act = n[:activity] - take_logs ? Math.log10(act.to_f) : act.to_f - end # activities of neighbors for supervised learning - - sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors - begin - prediction = (props.nil? ? local_svm(neighbors, acts, sims, "nu-svr", params) : local_svm_prop(props, acts, "nu-svr", params)) - prediction = (take_logs ? 10**(prediction.to_f) : prediction.to_f) - LOGGER.debug "Prediction is: '" + prediction.to_s + "'." - rescue Exception => e - LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" - end - - conf = sims.inject{|sum,x| sum + x } - confidence = conf/neighbors.size if neighbors.size > 0 - {:prediction => prediction, :confidence => confidence} - - end - - # Local support vector classification from neighbors - # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` - # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required - # @param [Array] props, propositionalization of neighbors and query structure e.g. [ Array_for_q, two-nested-Arrays_for_n ] - # @return [Hash] Hash with keys `:prediction, :confidence` - def self.local_svm_classification(neighbors, params, props=nil) - acts = neighbors.collect do |n| - act = n[:activity] - end # activities of neighbors for supervised learning - acts_f = acts.collect {|v| v == true ? 1.0 : 0.0} - sims = neighbors.collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors - begin - prediction = (props.nil? ? local_svm(neighbors, acts_f, sims, "C-bsvc", params) : local_svm_prop(props, acts_f, "C-bsvc", params)) - LOGGER.debug "Prediction is: '" + prediction.to_s + "'." - rescue Exception => e - LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" - end - - conf = sims.inject{|sum,x| sum + x } - confidence = conf/neighbors.size if neighbors.size > 0 - {:prediction => prediction, :confidence => confidence} - - end - - - # Local support vector prediction from neighbors. - # Uses pre-defined Kernel Matrix. - # Not to be called directly (use local_svm_regression or local_svm_classification). - # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` - # @param [Array] acts, activities for neighbors. - # @param [Array] sims, similarities for neighbors. - # @param [String] type, one of "nu-svr" (regression) or "C-bsvc" (classification). - # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required - # @param [Array] props, propositionalization of neighbors and query structure e.g. [ Array_for_q, two-nested-Arrays_for_n ] - # @return [Numeric] A prediction value. - def self.local_svm(neighbors, acts, sims, type, params) - LOGGER.debug "Local SVM (Weighted Tanimoto Kernel)." - neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches - gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel - if neighbor_matches.size == 0 - raise "No neighbors found." - else - # gram matrix - (0..(neighbor_matches.length-1)).each do |i| - gram_matrix[i] = [] unless gram_matrix[i] - # upper triangle - ((i+1)..(neighbor_matches.length-1)).each do |j| - sim = eval("#{params[:similarity_algorithm]}(neighbor_matches[i], neighbor_matches[j], params[:p_values])") - gram_matrix[i][j] = Algorithm.gauss(sim) - gram_matrix[j] = [] unless gram_matrix[j] - gram_matrix[j][i] = gram_matrix[i][j] # lower triangle - end - gram_matrix[i][i] = 1.0 - end - - #LOGGER.debug gram_matrix.to_yaml - @r = RinRuby.new(false,false) # global R instance leads to Socket errors after a large number of requests - @r.eval "library('kernlab')" # this requires R package "kernlab" to be installed - LOGGER.debug "Setting R data ..." - # set data - @r.gram_matrix = gram_matrix.flatten - @r.n = neighbor_matches.size - @r.y = acts - @r.sims = sims - - begin - LOGGER.debug "Preparing R data ..." - # prepare data - @r.eval "y<-as.vector(y)" - @r.eval "gram_matrix<-as.kernelMatrix(matrix(gram_matrix,n,n))" - @r.eval "sims<-as.vector(sims)" - - # model + support vectors - LOGGER.debug "Creating SVM model ..." - @r.eval "model<-ksvm(gram_matrix, y, kernel=matrix, type=\"#{type}\", nu=0.5)" - @r.eval "sv<-as.vector(SVindex(model))" - @r.eval "sims<-sims[sv]" - @r.eval "sims<-as.kernelMatrix(matrix(sims,1))" - LOGGER.debug "Predicting ..." - if type == "nu-svr" - @r.eval "p<-predict(model,sims)[1,1]" - elsif type == "C-bsvc" - @r.eval "p<-predict(model,sims)" - end - if type == "nu-svr" - prediction = @r.p - elsif type == "C-bsvc" - prediction = (@r.p.to_f == 1.0 ? true : false) - end - @r.quit # free R - rescue Exception => e - LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" - end - - end - prediction - end - - # Local support vector prediction from neighbors. - # Uses propositionalized setting. - # Not to be called directly (use local_svm_regression or local_svm_classification). - # @param [Array] neighbors, each neighbor is a hash with keys `:similarity, :activity, :features` - # @param [Array] acts, activities for neighbors. - # @param [Array] props, propositionalization of neighbors and query structure e.g. [ Array_for_q, two-nested-Arrays_for_n ] - # @param [String] type, one of "nu-svr" (regression) or "C-bsvc" (classification). - # @param [Hash] params Keys `:similarity_algorithm,:p_values` are required - # @return [Numeric] A prediction value. - def self.local_svm_prop(props, acts, type, params) - - LOGGER.debug "Local SVM (Propositionalization / Kernlab Kernel)." - n_prop = props[0] # is a matrix, i.e. two nested Arrays. - q_prop = props[1] # is an Array. - - #neighbor_matches = neighbors.collect{ |n| n[:features] } # URIs of matches - #gram_matrix = [] # square matrix of similarities between neighbors; implements weighted tanimoto kernel - if n_prop.size == 0 - raise "No neighbors found." - else - # gram matrix - #(0..(neighbor_matches.length-1)).each do |i| - # gram_matrix[i] = [] unless gram_matrix[i] - # # upper triangle - # ((i+1)..(neighbor_matches.length-1)).each do |j| - # sim = eval("#{params[:similarity_algorithm]}(neighbor_matches[i], neighbor_matches[j], params[:p_values])") - # gram_matrix[i][j] = Algorithm.gauss(sim) - # gram_matrix[j] = [] unless gram_matrix[j] - # gram_matrix[j][i] = gram_matrix[i][j] # lower triangle - # end - # gram_matrix[i][i] = 1.0 - #end - - #LOGGER.debug gram_matrix.to_yaml - @r = RinRuby.new(false,false) # global R instance leads to Socket errors after a large number of requests - @r.eval "library('kernlab')" # this requires R package "kernlab" to be installed - LOGGER.debug "Setting R data ..." - # set data - @r.n_prop = n_prop.flatten - @r.n_prop_x_size = n_prop.size - @r.n_prop_y_size = n_prop[0].size - @r.y = acts - @r.q_prop = q_prop - - begin - LOGGER.debug "Preparing R data ..." - # prepare data - @r.eval "y<-matrix(y)" - @r.eval "prop_matrix<-matrix(n_prop, n_prop_x_size, n_prop_y_size, byrow=TRUE)" - @r.eval "q_prop<-matrix(q_prop, 1, n_prop_y_size, byrow=TRUE)" - - # model + support vectors - LOGGER.debug "Creating SVM model ..." - @r.eval "model<-ksvm(prop_matrix, y, type=\"#{type}\", nu=0.5)" - LOGGER.debug "Predicting ..." - if type == "nu-svr" - @r.eval "p<-predict(model,q_prop)[1,1]" - elsif type == "C-bsvc" - @r.eval "p<-predict(model,q_prop)" - end - if type == "nu-svr" - prediction = @r.p - elsif type == "C-bsvc" - prediction = (@r.p.to_f == 1.0 ? true : false) - end - @r.quit # free R - rescue Exception => e - LOGGER.debug "#{e.class}: #{e.message} #{e.backtrace}" - end - end - prediction - end - - - end - - module Substructure - include Algorithm - # Substructure matching - # @param [OpenTox::Compound] compound Compound - # @param [Array] features Array with Smarts strings - # @return [Array] Array with matching Smarts - def self.match(compound,features) - compound.match(features) - end - end - - module Dataset - include Algorithm - # API should match Substructure.match - def features(dataset_uri,compound_uri) - end - end - - # Gauss kernel - # @return [Float] - def self.gauss(x, sigma = 0.3) - d = 1.0 - x.to_f - Math.exp(-(d*d)/(2*sigma*sigma)) - end - - # Median of an array - # @param [Array] Array with values - # @return [Float] Median - def self.median(array) - return nil if array.empty? - array.sort! - m_pos = array.size / 2 - return array.size % 2 == 1 ? array[m_pos] : (array[m_pos-1] + array[m_pos])/2 + def run params=nil + post params, {:accept => 'text/uri-list'} end -=end end end diff --git a/lib/authorization.rb b/lib/authorization.rb index 27ae734..d447f88 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -2,52 +2,52 @@ module OpenTox #Module for Authorization and Authentication #@example Authentication - # require "opentox-ruby" + # require "opentox-client" # OpenTox::Authorization::AA_SERVER = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml - # token = OpenTox::Authorization.authenticate("benutzer", "passwort") + # token = OpenTox::Authorization.authenticate("benutzer", "passwort") #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification - + module Authorization #Helper Class AA to create and send default policies out of xml templates - #@example Creating a default policy to a URI - # aa=OpenTox::Authorization::AA.new(tok) + #@example Creating a default policy to a URI + # aa=OpenTox::Authorization::AA.new(tok) # xml=aa.get_xml('http://uri....') - # OpenTox::Authorization.create_policy(xml,tok) - + # OpenTox::Authorization.create_policy(xml,tok) + class AA - attr_accessor :user, :subjectid, :policy - + attr_accessor :user, :subjectid, :policy + #Generates AA object - requires subjectid - # @param [String] subjectid + # @param [String] subjectid def initialize(subjectid) @user = Authorization.get_user(subjectid) @subjectid = subjectid @policy = Policies.new() end - + #Cleans AA Policies and loads default xml file into policy attribute - #set uri and user, returns Policyfile(XML) for open-sso + #set uri and user, returns Policyfile(XML) for open-sso # @param [String] URI to create a policy for def get_xml(uri) @policy.drop_policies @policy.load_default_policy(@user, uri) return @policy.to_xml - end - + end + #Loads and sends Policyfile(XML) to open-sso server - # @param [String] URI to create a policy for - def send(uri) + # @param [String] URI to create a policy for + def send(uri) xml = get_xml(uri) ret = false - ret = Authorization.create_policy(xml, @subjectid) + ret = Authorization.create_policy(xml, @subjectid) LOGGER.debug "Policy send with subjectid: #{@subjectid}" LOGGER.warn "Not created Policy is: #{xml}" if !ret - ret + ret end - + end - + #Returns the open-sso server set in the config file .opentox/config/[environment].yaml # @return [String, nil] the openSSO server URI or nil def self.server @@ -55,11 +55,11 @@ module OpenTox end #Authentication against OpenSSO. Returns token. Requires Username and Password. - # @param [String, String]Username,Password + # @param [String, String]Username,Password # @return [String, nil] gives subjectid or nil def self.authenticate(user, pw) return nil if !AA_SERVER - begin + begin resource = RestClient::Resource.new("#{AA_SERVER}/auth/authenticate") out = resource.post(:username=>user, :password => pw).sub("token.id=","").sub("\n","") return out @@ -67,20 +67,20 @@ module OpenTox return nil end end - + #Logout on opensso. Make token invalid. Requires token - # @param [String]subjectid the subjectid + # @param [String]subjectid the subjectid # @return [Boolean] true if logout is OK def self.logout(subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/auth/logout") resource.post(:subjectid => subjectid) - return true + return true rescue return false end - end - + end + #Authorization against OpenSSO for a URI with request-method (action) [GET/POST/PUT/DELETE] # @param [String,String,String]uri,action,subjectid # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). @@ -91,12 +91,12 @@ module OpenTox return true if resource.post(:uri => uri, :action => action, :subjectid => subjectid) == "boolean=true\n" rescue return nil - end + end end - #Checks if a token is a valid token - # @param [String]subjectid subjectid from openSSO session - # @return [Boolean] subjectid is valid or not. + #Checks if a token is a valid token + # @param [String]subjectid subjectid from openSSO session + # @return [Boolean] subjectid is valid or not. def self.is_token_valid(subjectid) return true if !AA_SERVER begin @@ -106,7 +106,7 @@ module OpenTox return false end end - + #Returns array with all policies of the token owner # @param [String]subjectid requires subjectid # @return [Array, nil] returns an Array of policy names or nil if request fails @@ -116,15 +116,15 @@ module OpenTox out = resource.get(:subjectid => subjectid) return out.split("\n") rescue RestClient::InternalServerError => e - raise e.response + raise e.response rescue return nil end end #Returns a policy in xml-format - # @param [String, String]policy,subjectid - # @return [String] XML of the policy + # @param [String, String]policy,subjectid + # @return [String] XML of the policy def self.list_policy(policy, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/pol") @@ -133,7 +133,7 @@ module OpenTox return nil end end - + # Lists policies alongside with affected uris # @param [String] subjectid # @return [Hash] keys: all policies of the subjectid owner, values: uris affected by those policies @@ -154,7 +154,7 @@ module OpenTox p.load_xml( list_policy(policy, subjectid) ) p.uris end - + #Returns the owner (who created the first policy) of an URI # @param [String, String]uri,subjectid # return [String, nil]owner,nil returns owner of the URI @@ -164,39 +164,39 @@ module OpenTox return resource.get(:uri => uri, :subjectid => subjectid).sub("\n","") rescue return nil - end - end - + end + end + #Checks if a policy exists to a URI. Requires URI and token. # @param [String, String]uri,subjectid - # return [Boolean] + # return [Boolean] def self.uri_has_policy(uri, subjectid) owner = get_uri_owner(uri, subjectid) return true if owner and owner != "null" false end - + #List all policynames for a URI. Requires URI and token. # @param [String, String]uri,subjectid - # return [Array, nil] returns an Array of policy names or nil if request fails + # return [Array, nil] returns an Array of policy names or nil if request fails def self.list_uri_policies(uri, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/pol") - out = resource.get(:uri => uri, :polnames => true, :subjectid => subjectid) + out = resource.get(:uri => uri, :polnames => true, :subjectid => subjectid) policies = []; notfirstline = false out.split("\n").each do |line| policies << line if notfirstline - notfirstline = true + notfirstline = true end - return policies + return policies rescue return nil - end - end + end + end #Sends a policy in xml-format to opensso server. Requires policy-xml and token. # @param [String, String]policyxml,subjectid - # return [Boolean] returns true if policy is created + # return [Boolean] returns true if policy is created def self.create_policy(policy, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/Pol/opensso-pol") @@ -206,7 +206,7 @@ module OpenTox return false end end - + #Deletes a policy # @param [String, String]policyname,subjectid # @return [Boolean,nil] @@ -214,7 +214,7 @@ module OpenTox begin resource = RestClient::Resource.new("#{AA_SERVER}/pol") LOGGER.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" - return true if resource.delete(:subjectid => subjectid, :id => policy) + return true if resource.delete(:subjectid => subjectid, :id => policy) rescue return nil end @@ -222,7 +222,7 @@ module OpenTox #Returns array of all possible LDAP-Groups # @param [String]subjectid - # @return [Array] + # @return [Array] def self.list_groups(subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/search") @@ -233,8 +233,8 @@ module OpenTox rescue [] end - end - + end + #Returns array of the LDAP-Groups of an user # @param [String]subjectid # @return [Array] gives array of LDAP groups of a user @@ -244,17 +244,17 @@ module OpenTox out = resource.post(:name => user, :admin => subjectid, :attributes_names => "group") grps = [] out.split("\n").each do |line| - grps << line.sub("identitydetails.group=","") if line.include?("identitydetails.group=") + grps << line.sub("identitydetails.group=","") if line.include?("identitydetails.group=") end return grps rescue [] end - end - + end + #Returns the owner (user id) of a token # @param [String]subjectid - # @return [String]user + # @return [String]user def self.get_user(subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/attributes") @@ -265,14 +265,14 @@ module OpenTox user = line.sub("userdetails.attribute.value=","") if line.include?("userdetails.attribute.value=") check = false end - check = true if line.include?("userdetails.attribute.name=uid") + check = true if line.include?("userdetails.attribute.name=uid") end return user rescue nil end end - + #Send default policy with Authorization::AA class # @param [String, String]URI,subjectid def self.send_policy(uri, subjectid) @@ -282,7 +282,7 @@ module OpenTox LOGGER.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{subjectid} - policy created: #{ret}" ret end - + #Deletes all policies of an URI # @param [String, String]URI,subjectid # @return [Boolean] @@ -303,20 +303,20 @@ module OpenTox # @return [Boolean] true if policy checked/created successfully (or no uri/subjectid given), false else def self.check_policy(uri, subjectid) return true unless uri and subjectid - token_valid = OpenTox::Authorization.is_token_valid(subjectid) + token_valid = OpenTox::Authorization.is_token_valid(subjectid) LOGGER.debug "OpenTox::Authorization.check_policy with uri: #{uri}, subjectid: #{subjectid} is valid: #{token_valid}" # check if subjectid is valid unless token_valid # abort if invalid - LOGGER.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{subjectid}" + LOGGER.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{subjectid}" return false end - + if !uri_has_policy(uri, subjectid) # if no policy exists, create a policy, return result of send policy send_policy(uri, subjectid) else - # if policy exists check for POST rights + # if policy exists check for POST rights if authorize(uri, "POST", subjectid) true else @@ -325,19 +325,19 @@ module OpenTox end end true - end + end - class << self + class << self alias :token_valid? :is_token_valid end - # Check Authorization for a resource (identified via URI) with method and subjectid. + # Check Authorization for a resource (identified via URI) with method and subjectid. # @param [String] uri # @param [String] request_method, should be GET, POST, PUT, DELETE # @param [String] subjectid # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method, subjectid) - if CONFIG[:authorization][:free_request].include?(request_method) + if CONFIG[:authorization][:free_request].include?(request_method) #LOGGER.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true elsif OpenTox::Authorization.free_uri?(uri, request_method) @@ -355,38 +355,38 @@ module OpenTox ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) LOGGER.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret - else + else LOGGER.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" false end end - + private def self.free_uri?(uri, request_method) if CONFIG[:authorization][:free_uris] CONFIG[:authorization][:free_uris].each do |request_methods,uris| - if request_methods and uris and request_methods.include?(request_method.to_sym) + if request_methods and uris and request_methods.include?(request_method.to_sym) uris.each do |u| return true if u.match uri end end end - end + end return false end - + def self.authorize_exception?(uri, request_method) if CONFIG[:authorization][:authorize_exceptions] CONFIG[:authorization][:authorize_exceptions].each do |request_methods,uris| - if request_methods and uris and request_methods.include?(request_method.to_sym) + if request_methods and uris and request_methods.include?(request_method.to_sym) uris.each do |u| return true if u.match uri end end end - end + end return false - end - + end + end end diff --git a/lib/compound.rb b/lib/compound.rb index 974e46e..8761d50 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -1,5 +1,4 @@ -@@cactus_uri="http://cactus.nci.nih.gov/chemical/structure/" -@@ambit_uri="http://ambit.uni-plovdiv.bg:8080/ambit2/depict/cdk?search=" +CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/" module OpenTox @@ -12,21 +11,21 @@ module OpenTox # @param [String] smiles Smiles string # @return [OpenTox::Compound] Compound def self.from_smiles service_uri, smiles, subjectid=nil - Compound.new RestClientWrapper.post(service_uri, smiles, :content_type => 'chemical/x-daylight-smiles').to_s.chomp + Compound.new RestClient.post(service_uri, smiles, {:content_type => 'chemical/x-daylight-smiles', :subjectid => subjectid}) end # Create a compound from inchi string # @param [String] smiles InChI string # @return [OpenTox::Compound] Compound - def self.from_inchi(service_uri, inchi) - Compound.new RestClientWrapper.post(service_uri, inchi, :content_type => 'chemical/x-inchi').to_s.chomp + def self.from_inchi service_uri, inchi, subjectid=nil + Compound.new RestClient.post(service_uri, inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) end # Create a compound from sdf string # @param [String] smiles SDF string # @return [OpenTox::Compound] Compound - def self.from_sdf(service_uri, sdf) - Compound.new RestClientWrapper.post(service_uri, sdf, :content_type => 'chemical/x-mdl-sdfile').to_s.chomp + def self.from_sdf service_uri, sdf, subjectid=nil + Compound.new RestClient.post(service_uri, sdf, {:content_type => 'chemical/x-mdl-sdfile', :subjectid => subjectid}) end # Create a compound from name. Relies on an external service for name lookups. @@ -34,34 +33,32 @@ module OpenTox # compound = OpenTox::Compound.from_name("Benzene") # @param [String] name name can be also an InChI/InChiKey, CAS number, etc # @return [OpenTox::Compound] Compound - def self.from_name(service_uri, name) - # paranoid URI encoding to keep SMILES charges and brackets - inchi = RestClientWrapper.get("#{@@cactus_uri}#{URI.encode(name, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}/stdinchi").to_s.chomp - Compound.new File.join(service_uri,URI.escape(inchi)) + def self.from_name service_uri, name, subjectid=nil + Compound.new RestClient.post(service_uri, name, {:content_type => 'text/plain', :subjectid => subjectid}) end # Get InChI # @return [String] InChI string def to_inchi - RestClientWrapper.get(@uri, :accept => 'chemical/x-inchi').to_s.chomp if @uri + get(:accept => 'chemical/x-inchi').to_s.chomp if @uri end # Get (canonical) smiles # @return [String] Smiles string def to_smiles - RestClientWrapper.get(@uri, :accept => 'chemical/x-daylight-smiles').chomp + get(:accept => 'chemical/x-daylight-smiles').chomp end # Get sdf # @return [String] SDF string def to_sdf - RestClientWrapper.get(@uri, :accept => 'chemical/x-mdl-sdfile').chomp + get(:accept => 'chemical/x-mdl-sdfile').chomp end # Get gif image # @return [image/gif] Image data def to_gif - RestClientWrapper.get("#{@@cactus_uri}#{@inchi}/image") + get("#{CACTUS_URI}#{to_inchi}/image") end # Get png image @@ -69,7 +66,7 @@ module OpenTox # image = compound.to_png # @return [image/png] Image data def to_png - RestClientWrapper.get(File.join @uri, "image") + get(File.join @uri, "image") end # Get URI of compound image @@ -84,7 +81,7 @@ module OpenTox # @return [String] Compound names def to_names begin - RestClientWrapper.get("#{@@cactus_uri}#{@inchi}/names").split("\n") + get("#{CACTUS_URI}#{to_inchi}/names").split("\n") rescue "not available" end diff --git a/lib/config/config_ru.rb b/lib/config/config_ru.rb deleted file mode 100644 index dc04263..0000000 --- a/lib/config/config_ru.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'rubygems' -require 'rack' -require 'rack/contrib' -require 'application.rb' - -# log at centralized place -logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" -log = File.new(logfile, "a+") -$stdout.reopen(log) -$stderr.reopen(log) -$stdout.sync = true -$stderr.sync = true -set :logging, false -set :raise_errors, true -set :lock, true - -['public','tmp'].each do |dir| - FileUtils.mkdir_p dir unless File.exists?(dir) -end - -use Rack::ShowExceptions -=begin -if defined?(MAIL) - - # monkeypatch with the original method - # strangely enough my mailserver returns "Connection refused - connect(2)" errors without this patch - module Rack - class MailExceptions - - def send_notification(exception, env) - mail = generate_mail(exception, env) - smtp = config[:smtp] - env['mail.sent'] = true - return if smtp[:server] == 'example.com' - - Net::SMTP.start smtp[:server], smtp[:port], smtp[:domain], smtp[:user_name], smtp[:password], smtp[:authentication] do |server| - mail.to.each do |recipient| - server.send_message mail.to_s, mail.from, recipient - end - end - end - end - end - - - require "socket" - use Rack::MailExceptions do |mail| - mail.to MAIL[:user_name] - mail.subject '[ERROR] %s' - mail.from "#{Socket.gethostname}@#{MAIL[:domain]}" - mail.smtp MAIL - end -end -=end diff --git a/lib/dataset.rb b/lib/dataset.rb index 84dce65..3de9d1f 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -4,9 +4,9 @@ module OpenTox # TODO: fix API Doc class Dataset - include OpenTox + #include OpenTox - attr_reader :features, :compounds, :data_entries, :metadata + #attr_reader :features, :compounds, :data_entries, :metadata # Create dataset with optional URI. Does not load data into the dataset - you will need to execute one of the load_* methods to pull data from a service or to insert it from other representations. # @example Create an empty dataset @@ -22,78 +22,19 @@ module OpenTox @data_entries = {} end - # Create an empty dataset and save it at the dataset service (assigns URI to dataset) - # @example Create new dataset and save it to obtain a URI - # dataset = OpenTox::Dataset.create - # @param [optional, String] uri Dataset URI - # @return [OpenTox::Dataset] Dataset object - def self.create(uri=CONFIG[:services]["opentox-dataset"], subjectid=nil) - dataset = Dataset.new(nil,subjectid) - dataset.save - dataset - end - - # Find a dataset and load all data. This can be time consuming, use Dataset.new together with one of the load_* methods for a fine grained control over data loading. - # @param [String] uri Dataset URI - # @return [OpenTox::Dataset] Dataset object with all data - def self.find(uri, subjectid=nil) - return nil unless uri - dataset = Dataset.new(uri, subjectid) - dataset.load_metadata - dataset - end - - # Create dataset from CSV file (format specification: http://toxcreate.org/help) - # - loads data_entries, compounds, features - # - sets metadata (warnings) for parser errors - # - you will have to set remaining metadata manually - # @param [String] file CSV file path - # @return [OpenTox::Dataset] Dataset object with CSV data - def self.create_from_csv_file(file, subjectid=nil) - dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid) - #RestClientWrapper.post(dataset.uri,File.read(file), {:content_type => "text/csv", :subjectid => @subjectid}) - RestClientWrapper.post(dataset.uri,{:file => File.new(file)},{:accept => "text/uri-list", :subjectid => subjectid})#, {:content_type => "text/csv", :subjectid => @subjectid}) - dataset.load_metadata - dataset - end - - # replaces find as exist check, takes not as long, does NOT raise an un-authorized exception - # @param [String] uri Dataset URI - # @return [Boolean] true if dataset exists and user has get rights, false else - def self.exist?(uri, subjectid=nil) - return false unless uri - dataset = Dataset.new(uri, subjectid) - begin - dataset.load_metadata.size > 0 - rescue - false - end - end - - # Get all datasets from a service - # @param [optional,String] uri URI of the dataset service, defaults to service specified in configuration - # @return [Array] Array of dataset object without data (use one of the load_* methods to pull data from the server) - def self.all(uri=CONFIG[:services]["opentox-dataset"], subjectid=nil) - RestClientWrapper.get(uri,{:accept => "text/uri-list",:subjectid => subjectid}).to_s.each_line.collect{|u| Dataset.new(u.chomp, subjectid)} - end - +=begin # Load YAML representation into the dataset # @param [String] yaml YAML representation of the dataset # @return [OpenTox::Dataset] Dataset object with YAML data - def store_yaml(yaml) - RestClientWrapper.post(@uri,yaml, {:content_type => "application/x-yaml", :subjectid => @subjectid}) - end - - def store_rdfxml(rdfxml) - RestClientWrapper.post(@uri, rdfxml, {:content_type => "application/rdf+xml", :subjectid => @subjectid}) + def self.from_yaml service_uri, yaml, subjectid=nil + Dataset.create(service_uri, subjectid).post yaml, :content_type => "application/x-yaml" end # Load RDF/XML representation from a file # @param [String] file File with RDF/XML representation of the dataset # @return [OpenTox::Dataset] Dataset object with RDF/XML data - def store_rdfxml_file(file) - #RestClientWrapper.post(@uri, :file => File.new(file))#, {:content_type => "application/rdf+xml", :subjectid => @subjectid}) - RestClientWrapper.post(@uri, File.read(file), {:content_type => "application/rdf+xml", :subjectid => @subjectid}) + def self.from_rdfxml service_uri, rdfxml, subjectid=nil + Dataset.create(service_uri, subjectid).post rdfxml, :content_type => "application/rdf+xml" end # Load CSV string (format specification: http://toxcreate.org/help) @@ -102,8 +43,8 @@ module OpenTox # - you will have to set remaining metadata manually # @param [String] csv CSV representation of the dataset # @return [OpenTox::Dataset] Dataset object with CSV data - def store_csv(csv) - RestClientWrapper.post(@uri, csv, {:content_type => "text/csv", :subjectid => @subjectid}) + def self.from_csv service_uri, csv, subjectid=nil + Dataset.from_file(service_uri, csv, subjectid) end # Load Spreadsheet book (created with roo gem http://roo.rubyforge.org/, excel format specification: http://toxcreate.org/help) @@ -112,53 +53,101 @@ module OpenTox # - you will have to set remaining metadata manually # @param [Excel] book Excel workbook object (created with roo gem) # @return [OpenTox::Dataset] Dataset object with Excel data - def store_spreadsheet_file(file) - RestClientWrapper.post(@uri, :file => File.new(file))#, {:content_type => "application/vnd.ms-excel", :subjectid => @subjectid}) + def self.from_xls service_uri, xls, subjectid=nil + Dataset.create(service_uri, subjectid).post xls, :content_type => "application/vnd.ms-excel" end - # Load and return only metadata of a Dataset object - # @return [Hash] Metadata of the dataset - def load_metadata - if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - @metadata = YAML.load(RestClientWrapper.get(File.join(@uri,"metadata"), {:accept => "application/x-yaml", :subjectid => @subjectid})) - else - add_metadata Parser::Owl::Dataset.new(@uri, @subjectid).load_metadata - end - self.uri = @uri if @uri # keep uri - @metadata + def self.from_sdf service_uri, sdf, subjectid=nil + Dataset.create(service_uri, subjectid).post sdf, :content_type => 'chemical/x-mdl-sdfile' end +=end # Load all data (metadata, data_entries, compounds and features) from URI - def load_all - if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - copy YAML.load(RestClientWrapper.get(@uri, {:accept => "application/x-yaml", :subjectid => @subjectid})) - else - parser = Parser::Owl::Dataset.new(@uri, @subjectid) - copy parser.load_uri + # TODO: move to opentox-server + def data_entries reload=true + if reload + file = Tempfile.new("ot-rdfxml") + file.puts get :accept => "application/rdf+xml" + file.close + to_delete = file.path + + data = {} + feature_values = {} + feature = {} + feature_accept_values = {} + other_statements = {} + `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| + triple = line.chomp.split(' ',3) + triple = triple[0..2].collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} + case triple[1] + when /#{RDF::OT.values}|#{RDF::OT1.values}/i + data[triple[0]] = {:compound => "", :values => []} unless data[triple[0]] + data[triple[0]][:values] << triple[2] + when /#{RDF::OT.value}|#{RDF::OT1.value}/i + feature_values[triple[0]] = triple[2] + when /#{RDF::OT.compound}|#{RDF::OT1.compound}/i + data[triple[0]] = {:compound => "", :values => []} unless data[triple[0]] + data[triple[0]][:compound] = triple[2] + when /#{RDF::OT.feature}|#{RDF::OT1.feature}/i + feature[triple[0]] = triple[2] + when /#{RDF.type}/i + if triple[2]=~/#{RDF::OT.Compound}|#{RDF::OT1.Compound}/i and !data[triple[0]] + data[triple[0]] = {:compound => triple[0], :values => []} + end + when /#{RDF::OT.acceptValue}|#{RDF::OT1.acceptValue}/i # acceptValue in ambit datasets is only provided in dataset/ no in dataset//features + feature_accept_values[triple[0]] = [] unless feature_accept_values[triple[0]] + feature_accept_values[triple[0]] << triple[2] + else + end + end + File.delete(to_delete) if to_delete + data.each do |id,entry| + if entry[:values].size==0 + # no feature values add plain compounds + @compounds << entry[:compound] unless @compounds.include? entry[:compound] + else + entry[:values].each do |value_id| + if feature_values[value_id] + split = feature_values[value_id].split(/\^\^/) + case split[-1] + when RDF::XSD.double, RDF::XSD.float + value = split.first.to_f + when RDF::XSD.boolean + value = split.first=~/(?i)true/ ? true : false + else + value = split.first + end + end + @compounds << entry[:compound] unless @compounds.include? entry[:compound] + @features[feature[value_id][value_id]] = {} unless @features[feature[value_id]] + @data_entries[entry[:compound].to_s] = {} unless @data_entries[entry[:compound].to_s] + @data_entries[entry[:compound].to_s][feature[value_id]] = [] unless @data_entries[entry[:compound]][feature[value_id]] + @data_entries[entry[:compound].to_s][feature[value_id]] << value if value!=nil + end + end + end + features subjectid + #feature_accept_values.each do |feature, values| + #self.features[feature][OT.acceptValue] = values + #end + self.metadata = metadata(subjectid) end + @data_entries end # Load and return only compound URIs from the dataset service # @return [Array] Compound URIs in the dataset - def load_compounds - RestClientWrapper.get(File.join(uri,"compounds"),{:accept=> "text/uri-list", :subjectid => @subjectid}).to_s.each_line do |compound_uri| - @compounds << compound_uri.chomp - end - @compounds.uniq! + def compounds reload=true + reload ? @compounds = Compound.all(File.join(@uri,"compounds")) : @compounds end # Load and return only features from the dataset service # @return [Hash] Features of the dataset - def load_features - if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - @features = YAML.load(RestClientWrapper.get(File.join(@uri,"features"), {:accept => "application/x-yaml", :subjectid => @subjectid})) - else - parser = Parser::Owl::Dataset.new(@uri, @subjectid) - @features = parser.load_features - end - @features + def features reload=true + reload ? @features = Feature.all(File.join(@uri,"features")) : @features end +=begin # returns the accept_values of a feature, i.e. the classification domain / all possible feature values # @param [String] feature the URI of the feature # @return [Array] return array with strings, nil if value is not set (e.g. when feature is numeric) @@ -182,48 +171,46 @@ module OpenTox "unknown" end end - - # Get Spreadsheet representation - # @return [Spreadsheet::Workbook] Workbook which can be written with the spreadsheet gem (data_entries only, metadata will will be discarded)) - def to_spreadsheet - Spreadsheet::Workbook.new(RestClientWrapper.get(@uri, {:accept => "application/vnd.ms-excel", :subjectid => @subjectid})) - end +=end # Get Excel representation (alias for to_spreadsheet) # @return [Spreadsheet::Workbook] Workbook which can be written with the spreadsheet gem (data_entries only, metadata will will be discarded)) def to_xls - to_spreadsheet + get :accept => "application/vnd.ms-excel" end # Get CSV string representation (data_entries only, metadata will be discarded) # @return [String] CSV representation def to_csv - RestClientWrapper.get(@uri, {:accept => "text/csv", :subjectid => @subjectid}) + get :accept => "text/csv" + end + + def to_sdf + get :accept => 'chemical/x-mdl-sdfile' end + # Get OWL-DL in ntriples format # @return [String] N-Triples representation def to_ntriples - RestClientWrapper.get(@uri, {:accept => "application/rdf+xml", :subjectid => @subjectid}) + get :accept => "application/rdf+xml" end # Get OWL-DL in RDF/XML format # @return [String] RDF/XML representation def to_rdfxml - RestClientWrapper.get(@uri, {:accept => "application/rdf+xml", :subjectid => @subjectid}) + get :accept => "application/rdf+xml" end # Get name (DC.title) of a feature # @param [String] feature Feature URI # @return [String] Feture title def feature_name(feature) - load_features - @features[feature][DC.title] + features[feature][DC.title] end def title - load_metadata - @metadata[DC.title] + metadata[DC.title] end # Insert a statement (compound_uri,feature_uri,value) @@ -314,11 +301,6 @@ module OpenTox @uri end - # Delete dataset at the dataset service - def delete - RestClientWrapper.delete(@uri, :subjectid => @subjectid) - end - private # Copy a dataset (rewrites URI) def copy(dataset) @@ -333,39 +315,4 @@ module OpenTox end end end - - # Class with special methods for lazar prediction datasets - class LazarPrediction < Dataset - - # Find a prediction dataset and load all data. - # @param [String] uri Prediction dataset URI - # @return [OpenTox::Dataset] Prediction dataset object with all data - def self.find(uri, subjectid=nil) - prediction = LazarPrediction.new(uri, subjectid) - prediction.load_all - prediction - end - - def value(compound) - @data_entries[compound.uri].collect{|f,v| v.first if f.match(/value/)}.compact.first - end - - def confidence(compound) - @data_entries[compound.uri].collect{|f,v| v.first if f.match(/confidence/)}.compact.first - end - - def descriptors(compound) - @data_entries[compound.uri].collect{|f,v| @features[f] if f.match(/descriptor/)}.compact if @data_entries[compound.uri] - end - - def measured_activities(compound) - source = @metadata[OT.hasSource] - @data_entries[compound.uri].collect{|f,v| v if f.match(/#{source}/)}.compact.flatten - end - - def neighbors(compound) - @data_entries[compound.uri].collect{|f,v| @features[f] if f.match(/neighbor/)}.compact - end - - end end diff --git a/lib/environment.rb b/lib/environment.rb deleted file mode 100644 index cae743c..0000000 --- a/lib/environment.rb +++ /dev/null @@ -1,83 +0,0 @@ -# set default environment -ENV['RACK_ENV'] = 'production' unless ENV['RACK_ENV'] - -# load/setup configuration -basedir = File.join(ENV['HOME'], ".opentox") -config_dir = File.join(basedir, "config") -config_file = File.join(config_dir, "#{ENV['RACK_ENV']}.yaml") -user_file = File.join(config_dir, "users.yaml") - -TMP_DIR = File.join(basedir, "tmp") -LOG_DIR = File.join(basedir, "log") - -if File.exist?(config_file) - CONFIG = YAML.load_file(config_file) - raise "could not load config, config file: "+config_file.to_s unless CONFIG -else - FileUtils.mkdir_p TMP_DIR - FileUtils.mkdir_p LOG_DIR - FileUtils.mkdir_p config_dir - FileUtils.cp(File.join(File.dirname(__FILE__), 'templates/config.yaml'), config_file) - puts "Please edit #{config_file} and restart your application." - exit -end - -# database -#`redis-server /opt/redis/redis.conf` unless File.exists? "/var/run/redis.pid" # removed by AM -# Ohm.connect :thread_safe => true - -# load mail settings for error messages -#load File.join config_dir,"mail.rb" if File.exists?(File.join config_dir,"mail.rb") - -logfile = "#{LOG_DIR}/#{ENV["RACK_ENV"]}.log" -#LOGGER = OTLogger.new(logfile,'daily') # daily rotation -LOGGER = OTLogger.new(logfile) # no rotation -LOGGER.formatter = Logger::Formatter.new #this is neccessary to restore the formating in case active-record is loaded -if CONFIG[:logger] and CONFIG[:logger] == "debug" - LOGGER.level = Logger::DEBUG -else - LOGGER.level = Logger::WARN -end - -# Regular expressions for parsing classification data -TRUE_REGEXP = /^(true|active|1|1.0|tox)$/i -FALSE_REGEXP = /^(false|inactive|0|0.0|low tox)$/i - -# Task durations -DEFAULT_TASK_MAX_DURATION = 36000 -#EXTERNAL_TASK_MAX_DURATION = 36000 - -# OWL Namespaces -class OwlNamespace - - attr_accessor :uri - def initialize(uri) - @uri = uri - end - - def [](property) - @uri+property.to_s - end - - def type # for RDF.type - "#{@uri}type" - end - - def method_missing(property) - @uri+property.to_s - end - -end - -RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' -OWL = OwlNamespace.new 'http://www.w3.org/2002/07/owl#' -DC = OwlNamespace.new 'http://purl.org/dc/elements/1.1/' -OT = OwlNamespace.new 'http://www.opentox.org/api/1.1#' -OTA = OwlNamespace.new 'http://www.opentox.org/algorithmTypes.owl#' -XSD = OwlNamespace.new 'http://www.w3.org/2001/XMLSchema#' - -AA_SERVER = CONFIG[:authorization] ? (CONFIG[:authorization][:server] ? CONFIG[:authorization][:server] : nil) : nil -CONFIG[:authorization][:authenticate_request] = [""] unless CONFIG[:authorization][:authenticate_request] -CONFIG[:authorization][:authorize_request] = [""] unless CONFIG[:authorization][:authorize_request] -CONFIG[:authorization][:free_request] = [""] unless CONFIG[:authorization][:free_request] - diff --git a/lib/error.rb b/lib/error.rb deleted file mode 100644 index 45b7545..0000000 --- a/lib/error.rb +++ /dev/null @@ -1,98 +0,0 @@ -# adding additional fields to Exception class to format errors according to OT-API -class Exception - attr_accessor :errorCause - def http_code; 500; end -end - -module OpenTox - - class BadRequestError < RuntimeError - def http_code; 400; end - end - - class NotAuthorizedError < RuntimeError - def http_code; 401; end - end - - class NotFoundError < RuntimeError - def http_code; 404; end - end - - class ServiceUnavailableError < RuntimeError - def http_code; 503; end - end - - class RestCallError < RuntimeError - attr_accessor :rest_params - def http_code; 502; end - end - - class ErrorReport - - # TODO replace params with URIs (errorCause -> OT.errorCause) - attr_reader :message, :actor, :errorCause, :http_code, :errorDetails, :errorType - - private - def initialize( http_code, erroType, message, actor, errorCause, rest_params=nil, backtrace=nil ) - @http_code = http_code - @errorType = erroType - @message = message - @actor = actor - @errorCause = errorCause - @rest_params = rest_params - @backtrace = backtrace - end - - public - # creates a error report object, from an ruby-exception object - # @param [Exception] error - # @param [String] actor, URI of the call that cause the error - def self.create( error, actor ) - rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params - backtrace = error.backtrace.short_backtrace if CONFIG[:backtrace] - ErrorReport.new( error.http_code, error.class.to_s, error.message, actor, error.errorCause, rest_params, backtrace ) - end - - def self.from_rdf(rdf) - metadata = OpenTox::Parser::Owl.from_rdf( rdf, OT.ErrorReport ).metadata - ErrorReport.new(metadata[OT.statusCode], metadata[OT.errorCode], metadata[OT.message], metadata[OT.actor], metadata[OT.errorCause]) - end - - # overwrite sorting to make easier readable - def to_yaml_properties - p = super - p = ( p - ["@backtrace"]) + ["@backtrace"] if @backtrace - p = ( p - ["@errorCause"]) + ["@errorCause"] if @errorCause - p - end - - def rdf_content() - c = { - RDF.type => [OT.ErrorReport], - OT.statusCode => @http_code, - OT.message => @message, - OT.actor => @actor, - OT.errorCode => @errorType, - } - c[OT.errorCause] = @errorCause.rdf_content if @errorCause - c - end - - def to_rdfxml - s = Serializer::Owl.new - s.add_resource(CONFIG[:services]["opentox-task"]+"/tmpId/ErrorReport/tmpId", OT.errorReport, rdf_content) - s.to_rdfxml - end - end -end - -class Array - def short_backtrace - short = [] - each do |c| - break if c =~ /sinatra\/base/ - short << c - end - short.join("\n") - end -end diff --git a/lib/feature.rb b/lib/feature.rb deleted file mode 100644 index 84a85b9..0000000 --- a/lib/feature.rb +++ /dev/null @@ -1,44 +0,0 @@ -module OpenTox - class Feature - include OpenTox - - attr_accessor :subjectid - - # Find a feature - # @param [String] uri Feature URI - # @return [OpenTox::Feature] Feature object - def self.find(uri, subjectid=nil) - return nil unless uri - feature = Feature.new uri, subjectid - if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) - feature.add_metadata YAML.load(RestClientWrapper.get(uri,{:accept => "application/x-yaml", :subjectid => @subjectid})) - else - feature.add_metadata Parser::Owl::Dataset.new(uri).load_metadata - end - feature.subjectid = subjectid - feature - end - - # provides feature type, possible types are "regression" or "classification" - # @return [String] feature type, unknown if OT.isA property is unknown/ not set - def feature_type - if metadata[RDF.type].flatten.include?(OT.NominalFeature) - "classification" - elsif metadata[RDF.type].flatten.include?(OT.NumericFeature) - "regression" - elsif metadata[OWL.sameAs] - metadata[OWL.sameAs].each do |f| - begin - type = Feature.find(f, subjectid).feature_type - return type unless type=="unknown" - rescue => ex - LOGGER.warn "could not load same-as-feature '"+f.to_s+"' for feature '"+uri.to_s+"' : "+ex.message.to_s - end - end - "unknown" - else - "unknown" - end - end - end -end diff --git a/lib/helper.rb b/lib/helper.rb deleted file mode 100644 index 04300e0..0000000 --- a/lib/helper.rb +++ /dev/null @@ -1,98 +0,0 @@ -=begin -helpers do - - # Authentification - def protected!(subjectid) - if env["session"] - unless authorized?(subjectid) - flash[:notice] = "You don't have access to this section: " - redirect back - end - elsif !env["session"] && subjectid - unless authorized?(subjectid) - LOGGER.debug "URI not authorized: clean: " + clean_uri("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}").to_s + " full: #{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']} with request: #{request.env['REQUEST_METHOD']}" - raise OpenTox::NotAuthorizedError.new "Not authorized" - end - else - raise OpenTox::NotAuthorizedError.new "Not authorized" unless authorized?(subjectid) - end - end - - #Check Authorization for URI with method and subjectid. - def authorized?(subjectid) - request_method = request.env['REQUEST_METHOD'] - uri = clean_uri("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}") - request_method = "GET" if request_method == "POST" && uri =~ /\/model\/\d+\/?$/ - return OpenTox::Authorization.authorized?(uri, request_method, subjectid) - end - - #cleans URI from querystring and file-extension. Sets port 80 to emptystring - # @param [String] uri - def clean_uri(uri) - uri = uri.sub(" ", "%20") #dirty hacks => to fix - uri = uri[0,uri.index("InChI=")] if uri.index("InChI=") - - out = URI.parse(uri) - out.path = out.path[0, out.path.length - (out.path.reverse.rindex(/\/{1}\d+\/{1}/))] if out.path.index(/\/{1}\d+\/{1}/) #cuts after /id/ for a&a - port = (out.scheme=="http" && out.port==80)||(out.scheme=="https" && out.port==443) ? "" : ":#{out.port.to_s}" - "#{out.scheme}://#{out.host}#{port}#{out.path.chomp("/")}" #" - end - - #unprotected uri for login - def login_requests - return env['REQUEST_URI'] =~ /\/login$/ - end - - def uri_available?(urlStr) - url = URI.parse(urlStr) - subjectidstr = @subjectid ? "?subjectid=#{CGI.escape @subjectid}" : "" - Net::HTTP.start(url.host, url.port) do |http| - return http.head("#{url.request_uri}#{subjectidstr}").code == "200" - end - end - - def get_subjectid - begin - subjectid = nil - subjectid = session[:subjectid] if session[:subjectid] - subjectid = params[:subjectid] if params[:subjectid] and !subjectid - subjectid = request.env['HTTP_SUBJECTID'] if request.env['HTTP_SUBJECTID'] and !subjectid - subjectid = request.cookies["subjectid"] unless subjectid - # see http://rack.rubyforge.org/doc/SPEC.html - subjectid = CGI.unescape(subjectid) if subjectid.include?("%23") - @subjectid = subjectid - rescue - subjectid = nil - end - end - def get_extension - extension = File.extname(request.path_info) - unless extension.empty? - case extension.gsub(".","") - when "html" - @accept = 'text/html' - when "yaml" - @accept = 'application/x-yaml' - when "csv" - @accept = 'text/csv' - when "rdfxml" - @accept = 'application/rdf+xml' - when "xls" - @accept = 'application/ms-excel' - when "css" - @accept = 'text/css' - else - # halt 404, "File format #{extension} not supported." - end - end - end -end - -before do - @subjectid = get_subjectid() - @accept = get_extension() - unless !AA_SERVER or login_requests or CONFIG[:authorization][:free_request].include?(env['REQUEST_METHOD']) - protected!(@subjectid) - end -end -=end diff --git a/lib/model.rb b/lib/model.rb index a806b74..95aa9ff 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -1,488 +1,14 @@ module OpenTox - module Model - - include OpenTox - - # Find a lazar model - # @param [String] uri Model URI - # @return [OpenTox::Model::Lazar] lazar model - def self.find(uri, subjectid=nil) - if CONFIG[:yaml_hosts].include?(URI.parse(uri).host) - YAML.load RestClientWrapper.get(uri,{:accept => 'application/x-yaml', :subjectid => subjectid}) - else - parser = Parser::Owl::Feature.new(uri, @subjectid) - @metadata = parser.load_uri.metadata - end - end - - # Get URIs of all models - # @return [Array] List of lazar model URIs - def self.all(subjectid=nil) - RestClientWrapper.get(CONFIG[:services]["opentox-model"], :subjectid => subjectid).to_s.split("\n") - end + class Model # Run a model with parameters # @param [Hash] params Parameters for OpenTox model # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [text/uri-list] Task or resource URI - def run( params, accept_header=nil, waiting_task=nil ) - unless accept_header - if CONFIG[:yaml_hosts].include?(URI.parse(@uri).host) - accept_header = 'application/x-yaml' - else - accept_header = 'application/rdf+xml' - end - end - LOGGER.info "running model "+@uri.to_s+", params: "+params.inspect+", accept: "+accept_header.to_s - RestClientWrapper.post(@uri,params,{:accept => accept_header},waiting_task).to_s - end - - # Generic OpenTox model class for all API compliant services - class Generic - include Model - - # Find Generic Opentox Model via URI, and loads metadata, could raise NotFound/NotAuthorized error - # @param [String] uri Model URI - # @return [OpenTox::Model::Generic] Model instance - def self.find(uri,subjectid=nil) - return nil unless uri - model = Generic.new(uri,subjectid) - model.load_metadata - raise "could not load model metadata '"+uri.to_s+"'" if model.metadata==nil or model.metadata.size==0 - model - end - - # provides feature type, possible types are "regression" or "classification" - # @return [String] feature type, "unknown" if type could not be estimated - def feature_type - unless @feature_type - load_predicted_variables unless @predicted_variable - @feature_type = OpenTox::Feature.find( @predicted_variable, @subjectid ).feature_type - end - @feature_type - end - - def predicted_variable - load_predicted_variables unless @predicted_variable - @predicted_variable - end - - def predicted_confidence - load_predicted_variables unless @predicted_confidence - @predicted_confidence - end - - private - def load_predicted_variables - load_metadata if @metadata==nil or @metadata.size==0 or (@metadata.size==1 && @metadata.values[0]==@uri) - if @metadata[OT.predictedVariables] - predictedVariables = @metadata[OT.predictedVariables] - if predictedVariables.is_a?(Array) - if (predictedVariables.size==1) - @predicted_variable = predictedVariables[0] - elsif (predictedVariables.size==2) - # PENDING identify confidence - conf_index = -1 - predictedVariables.size.times do |i| - f = OpenTox::Feature.find(predictedVariables[i]) - conf_index = i if f.metadata[DC.title]=~/(?i)confidence/ - end - raise "could not estimate predicted variable from model: '"+uri.to_s+ - "', number of predicted-variables==2, but no confidence found" if conf_index==-1 - @predicted_variable = predictedVariables[1-conf_index] - @predicted_confidence = predictedVariables[conf_index] - else - raise "could not estimate predicted variable from model: '"+uri.to_s+"', number of predicted-variables > 2" - end - else - raise "could not estimate predicted variable from model: '"+uri.to_s+"', predicted-variables is no array" - end - end - raise "could not estimate predicted variable from model: '"+uri.to_s+"'" unless @predicted_variable - end + def run params=nil + post params, {:accept => 'text/uri-list'} end - # Lazy Structure Activity Relationship class - class Lazar < Generic - - #include Model - include Algorithm - - attr_accessor :compound, :prediction_dataset, :features, :effects, :activities, :p_values, :fingerprints, :feature_calculation_algorithm, :similarity_algorithm, :prediction_algorithm, :min_sim, :subjectid, :prop_kernel, :value_map - - def initialize(uri=nil,subjectid=nil) - - if uri - super uri - else - super CONFIG[:services]["opentox-model"] - end - - @metadata[OT.algorithm] = File.join(CONFIG[:services]["opentox-algorithm"],"lazar") - - @features = [] - @effects = {} - @activities = {} - @p_values = {} - @fingerprints = {} - @value_map = {} - - @feature_calculation_algorithm = "Substructure.match" - @similarity_algorithm = "Similarity.tanimoto" - @prediction_algorithm = "Neighbors.weighted_majority_vote" - - @min_sim = 0.3 - @prop_kernel = false - - end - - # Find a lazar model via URI, and loads metadata, could raise NotFound/NotAuthorized error - # @param [String] uri Model URI - # @return [OpenTox::Model::Generic] Model instance - def self.find(uri,subjectid=nil) - return nil unless uri - model = Lazar.new(uri,subjectid) - model.load_metadata - raise "could not load model metadata '"+uri.to_s+"'" if model.metadata==nil or model.metadata.size==0 - model - end - - # Create a new lazar model - # @param [optional,Hash] params Parameters for the lazar algorithm (OpenTox::Algorithm::Lazar) - # @return [OpenTox::Model::Lazar] lazar model - def self.create(params) - subjectid = params[:subjectid] - lazar_algorithm = OpenTox::Algorithm::Generic.new File.join( CONFIG[:services]["opentox-algorithm"],"lazar") - model_uri = lazar_algorithm.run(params) - OpenTox::Model::Lazar.find(model_uri, subjectid) - end - -=begin - # Get a parameter value - # @param [String] param Parameter name - # @return [String] Parameter value - def parameter(param) - @metadata[OT.parameters].collect{|p| p[OT.paramValue] if p[DC.title] == param}.compact.first - end - - # Predict a dataset - # @param [String] dataset_uri Dataset URI - # @param [optional,subjectid] - # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::Dataset] Dataset with predictions - def predict_dataset(dataset_uri, subjectid=nil, waiting_task=nil) - @prediction_dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid) - @prediction_dataset.add_metadata({ - OT.hasSource => @uri, - DC.creator => @uri, - DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), - OT.parameters => [{DC.title => "dataset_uri", OT.paramValue => dataset_uri}] - }) - d = Dataset.new(dataset_uri,subjectid) - d.load_compounds(subjectid) - count = 0 - d.compounds.each do |compound_uri| - begin - predict(compound_uri,false,subjectid) - count += 1 - waiting_task.progress( count/d.compounds.size.to_f*100.0 ) if waiting_task - rescue => ex - LOGGER.warn "prediction for compound "+compound_uri.to_s+" failed: "+ex.message - end - end - @prediction_dataset.save(subjectid) - @prediction_dataset - end - - # Predict a compound - # @param [String] compound_uri Compound URI - # @param [optinal,Boolean] verbose Verbose prediction (output includes neighbors and features) - # @return [OpenTox::Dataset] Dataset with prediction - def predict(compound_uri,verbose=false,subjectid=nil) - - @compound = Compound.new compound_uri - features = {} - - unless @prediction_dataset - @prediction_dataset = Dataset.create(CONFIG[:services]["opentox-dataset"], subjectid) - @prediction_dataset.add_metadata( { - OT.hasSource => @uri, - DC.creator => @uri, - DC.title => URI.decode(File.basename( @metadata[OT.dependentVariables] )), - OT.parameters => [{DC.title => "compound_uri", OT.paramValue => compound_uri}] - } ) - end - - return @prediction_dataset if database_activity(subjectid) - - load_metadata(subjectid) - case OpenTox::Feature.find(metadata[OT.dependentVariables]).feature_type - when "classification" - # AM: Balancing, see http://www.maunz.de/wordpress/opentox/2011/balanced-lazar - l = Array.new # larger - s = Array.new # smaller fraction - - raise "no fingerprints in model" if @fingerprints.size==0 - - @fingerprints.each do |training_compound,training_features| - @activities[training_compound].each do |act| - case act.to_s - when "false" - l << training_compound - when "true" - s << training_compound - else - LOGGER.warn "BLAZAR: Activity #{act.to_s} should not be reached." - end - end - end - if s.size > l.size then - l,s = s,l # happy swapping - LOGGER.info "BLAZAR: |s|=#{s.size}, |l|=#{l.size}." - end - # determine ratio - modulo = l.size.divmod(s.size)# modulo[0]=ratio, modulo[1]=rest - LOGGER.info "BLAZAR: Balance: #{modulo[0]}, rest #{modulo[1]}." - - # AM: Balanced predictions - addon = (modulo[1].to_f/modulo[0]).ceil # what will be added in each round - slack = (addon!=0 ? modulo[1].divmod(addon)[1] : 0) # what remains for the last round - position = 0 - predictions = Array.new - - prediction_best=nil - neighbors_best=nil - - begin - for i in 1..modulo[0] do - (i == modulo[0]) && (slack>0) ? lr_size = s.size + slack : lr_size = s.size + addon # determine fraction - LOGGER.info "BLAZAR: Neighbors round #{i}: #{position} + #{lr_size}." - neighbors_balanced(s, l, position, lr_size) # get ratio fraction of larger part - if @prop_kernel && @prediction_algorithm.include?("svm") - props = get_props - else - props = nil - end - prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values}, props)") - if prediction_best.nil? || prediction[:confidence].abs > prediction_best[:confidence].abs - prediction_best=prediction - neighbors_best=@neighbors - end - position = position + lr_size - end - rescue Exception => e - LOGGER.error "BLAZAR failed in prediction: "+e.class.to_s+": "+e.message - end - - prediction=prediction_best - @neighbors=neighbors_best - ### END AM balanced predictions - - else # AM: no balancing - LOGGER.info "LAZAR: Unbalanced." - neighbors - if @prop_kernel && @prediction_algorithm.include?("svm") - props = get_props - else - props = nil - end - prediction = eval("#{@prediction_algorithm}(@neighbors,{:similarity_algorithm => @similarity_algorithm, :p_values => @p_values}, props)") - end - - value_feature_uri = File.join( @uri, "predicted", "value") - confidence_feature_uri = File.join( @uri, "predicted", "confidence") - - #prediction_feature_uris = {value_feature_uri => prediction[:prediction], confidence_feature_uri => prediction[:confidence]} - #prediction_feature_uris[value_feature_uri] = nil if @neighbors.size == 0 or prediction[:prediction].nil? - - @prediction_dataset.metadata[OT.dependentVariables] = @metadata[OT.dependentVariables] - @prediction_dataset.metadata[OT.predictedVariables] = [value_feature_uri, confidence_feature_uri] - - if OpenTox::Feature.find(metadata[OT.dependentVariables]).feature_type == "classification" - @prediction_dataset.add @compound.uri, value_feature_uri, @value_map[prediction[:prediction]] - else - @prediction_dataset.add @compound.uri, value_feature_uri, prediction[:prediction] - end - @prediction_dataset.add @compound.uri, confidence_feature_uri, prediction[:confidence] - #prediction_feature_uris.each do |prediction_feature_uri,value| - #@prediction_dataset.add @compound.uri, prediction_feature_uri, @value_map[value] - #end - - if verbose - if @feature_calculation_algorithm == "Substructure.match" - f = 0 - @compound_features.each do |feature| - feature_uri = File.join( @prediction_dataset.uri, "feature", "descriptor", f.to_s) - features[feature] = feature_uri - @prediction_dataset.add_feature(feature_uri, { - RDF.type => [OT.Substructure], - OT.smarts => feature, - OT.pValue => @p_values[feature], - OT.effect => @effects[feature] - }) - @prediction_dataset.add @compound.uri, feature_uri, true - f+=1 - end - else - @compound_features.each do |feature| - features[feature] = feature - @prediction_dataset.add @compound.uri, feature, true - end - end - n = 0 - @neighbors.each do |neighbor| - neighbor_uri = File.join( @prediction_dataset.uri, "feature", "neighbor", n.to_s ) - @prediction_dataset.add_feature(neighbor_uri, { - OT.compound => neighbor[:compound], - OT.similarity => neighbor[:similarity], - OT.measuredActivity => neighbor[:activity], - RDF.type => [OT.Neighbor] - }) - @prediction_dataset.add @compound.uri, neighbor_uri, true - f = 0 unless f - neighbor[:features].each do |feature| - if @feature_calculation_algorithm == "Substructure.match" - feature_uri = File.join( @prediction_dataset.uri, "feature", "descriptor", f.to_s) unless feature_uri = features[feature] - else - feature_uri = feature - end - @prediction_dataset.add neighbor[:compound], feature_uri, true - unless features.has_key? feature - features[feature] = feature_uri - @prediction_dataset.add_feature(feature_uri, { - RDF.type => [OT.Substructure], - OT.smarts => feature, - OT.pValue => @p_values[feature], - OT.effect => @effects[feature] - }) - f+=1 - end - end - n+=1 - end - end - #end - - @prediction_dataset.save(subjectid) - @prediction_dataset - end - - # Calculate the propositionalization matrix aka instantiation matrix (0/1 entries for features) - # Same for the vector describing the query compound - def get_props - matrix = Array.new - begin - @neighbors.each do |n| - n = n[:compound] - row = [] - @features.each do |f| - if ! @fingerprints[n].nil? - row << (@fingerprints[n].include?(f) ? 0.0 : @p_values[f]) - else - row << 0.0 - end - end - matrix << row - end - row = [] - @features.each do |f| - row << (@compound.match([f]).size == 0 ? 0.0 : @p_values[f]) - end - rescue Exception => e - LOGGER.debug "get_props failed with '" + $! + "'" - end - [ matrix, row ] - end - - # Find neighbors and store them as object variable, access only a subset of compounds for that. - def neighbors_balanced(s, l, start, offset) - @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm - @neighbors = [] - [ l[start, offset ] , s ].flatten.each do |training_compound| # AM: access only a balanced subset - training_features = @fingerprints[training_compound] - add_neighbor training_features, training_compound - end - - end - - # Find neighbors and store them as object variable, access all compounds for that. - def neighbors - @compound_features = eval("#{@feature_calculation_algorithm}(@compound,@features)") if @feature_calculation_algorithm - @neighbors = [] - @fingerprints.each do |training_compound,training_features| # AM: access all compounds - add_neighbor training_features, training_compound - end - end - - # Adds a neighbor to @neighbors if it passes the similarity threshold. - def add_neighbor(training_features, training_compound) - sim = eval("#{@similarity_algorithm}(@compound_features,training_features,@p_values)") - if sim > @min_sim - @activities[training_compound].each do |act| - @neighbors << { - :compound => training_compound, - :similarity => sim, - :features => training_features, - :activity => act - } - end - end - end - - # Find database activities and store them in @prediction_dataset - # @return [Boolean] true if compound has databasse activities, false if not - def database_activity(subjectid) - if @activities[@compound.uri] - @activities[@compound.uri].each { |act| @prediction_dataset.add @compound.uri, @metadata[OT.dependentVariables], act } - @prediction_dataset.add_metadata(OT.hasSource => @metadata[OT.trainingDataset]) - @prediction_dataset.save(subjectid) - true - else - false - end - end - - def prediction_features - [prediction_value_feature,prediction_confidence_feature] - end - - def prediction_value_feature - dependent_uri = @metadata[OT.dependentVariables].first - feature = OpenTox::Feature.new File.join( @uri, "predicted", "value") - feature.add_metadata( { - RDF.type => [OT.ModelPrediction], - OT.hasSource => @uri, - DC.creator => @uri, - DC.title => URI.decode(File.basename( dependent_uri )), - OWL.sameAs => dependent_uri - }) - feature - end - - def prediction_confidence_feature - dependent_uri = @metadata[OT.dependentVariables].first - feature = OpenTox::Feature.new File.join( @uri, "predicted", "confidence") - feature.add_metadata( { - RDF.type => [OT.ModelPrediction], - OT.hasSource => @uri, - DC.creator => @uri, - DC.title => "#{URI.decode(File.basename( dependent_uri ))} confidence" - }) - feature - end - - # Save model at model service - def save(subjectid) - self.uri = RestClientWrapper.post(@uri,self.to_yaml,{:content_type => "application/x-yaml", :subjectid => subjectid}) - end - - # Delete model at model service - def delete(subjectid) - RestClientWrapper.delete(@uri, :subjectid => subjectid) unless @uri == CONFIG[:services]["opentox-model"] - end - -=end - end end end diff --git a/lib/ontology.rb b/lib/ontology.rb deleted file mode 100644 index fa4ea6f..0000000 --- a/lib/ontology.rb +++ /dev/null @@ -1,55 +0,0 @@ -module OpenTox - module Ontology - module Echa -=begin - require 'sparql/client' - @sparql = SPARQL::Client.new("http://apps.ideaconsult.net:8080/ontology") - def self.qs(classname="Endpoints") - return "PREFIX ot: - PREFIX ota: - PREFIX owl: - PREFIX dc: - PREFIX rdfs: - PREFIX rdf: - PREFIX otee: - PREFIX toxcast: - select * - where { - ?endpoint rdfs:subClassOf otee:#{classname}. - ?endpoint dc:title ?title. - }" - end - - def self.make_option_list(endpoint="Endpoints", level=1) - out = "" - results = @sparql.query(qs(endpoint)) rescue results = [] - results.each do |result| - endpointname = result.Endpoints.to_s.split('#').last - title = result.bound?(:title) ? result.title : endpointname - out += "\n" - out += make_option_list(endpointname, level + 1) - end - return out - end - - def self.get_endpoint_selectlist(include_blank=true) - out = "\n" - return out - end -=end - - def self.endpoints - RestClientWrapper.get("http://apps.ideaconsult.net:8080/ambit2/query/ndatasets_endpoint",:accept => "text/csv").collect { |line| line.split(',').first if line.match(/^http/) }.compact - end - - def self.datasets(endpoint) - RestClientWrapper.get("http://apps.ideaconsult.net:8080/ambit2/dataset?feature_sameas=#{URI.encode endpoint}", :accept => "text/uri-list").split("\n") - end - - end - - end -end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb new file mode 100644 index 0000000..bc297b5 --- /dev/null +++ b/lib/opentox-client.rb @@ -0,0 +1,7 @@ +require 'rdf' +require 'rdf/raptor' +require "rest-client" +require "opentox" +require "task" +require "compound" +require "dataset" diff --git a/lib/opentox-ruby-minimal.rb b/lib/opentox-ruby-minimal.rb deleted file mode 100644 index e0d5489..0000000 --- a/lib/opentox-ruby-minimal.rb +++ /dev/null @@ -1,2 +0,0 @@ -require "opentox" -require "compound" diff --git a/lib/opentox-ruby.rb b/lib/opentox-ruby.rb deleted file mode 100644 index 63935fa..0000000 --- a/lib/opentox-ruby.rb +++ /dev/null @@ -1,15 +0,0 @@ -#['rubygems', 'sinatra', 'sinatra/url_for', 'ohm', 'rest_client', 'yaml', 'cgi', 'spork', 'error', 'overwrite', 'environment'].each do |lib| -['rubygems', 'rest_client', 'yaml', 'cgi', 'error', 'overwrite', 'environment'].each do |lib| - require lib -end - -#begin - #require 'openbabel' -#rescue LoadError - #puts "Please install Openbabel with 'rake openbabel:install' in the compound component" -#end - -#['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper', 'authorization', 'policy', 'helper', 'to-html', 'ontology' ].each do |lib| -['opentox', 'compound','dataset', 'parser','serializer', 'algorithm','model','task','validation','feature', 'rest_client_wrapper', 'authorization', 'policy', 'ontology' ].each do |lib| - require lib -end diff --git a/lib/opentox.owl b/lib/opentox.owl deleted file mode 100644 index 4760055..0000000 --- a/lib/opentox.owl +++ /dev/null @@ -1,809 +0,0 @@ - - - - http://opentox.org/dev/apis/api-1.1 - 2009-11-22 - martin.guetlein@gmail.com - jeliazkova.nina@gmail.com - OpenTox resource ontology - OpenTox API - OpenTox - - - - http://opentox.org/dev/apis/api-1.1/dataset - - /dataset/{datasetid} - - Original source of the dataset - - - Provides access to chemical compounds and their features (e.g. structural, physical-chemical, biological, toxicological properties) - - - - - - - - - - - - - - - - - - - - - - - - - - - A generic OpenTox resource - name of the resource - URI of the resource - 1.1 - - - - - - - - - TODO: Specify allowed values for model content - The native format of the model content (e.g. PMML, Weka model, etc.) - - - - TODO: Introduce a link to User resource - /model/{modelid} - The model creator (perhaps a link to User resource) - - - The date of model creation - - - A validation corresponds to the validation of a model on a test dataset. The results are stored in another dataset. Parameters with default values are optional. - Datetime - http://opentox.org/dev/apis/api-1.1/Validation - - - - http://opentox.org/dev/apis/api-1.1/Validation#validation-report - - - - TODO: AlgorithmType, or link to Algorithm ontology - 1.1 - Reference - TODO: statistics supported - is it possible to reuse ValidationInfo classes? - /algorithm/{algorithmid} - - http://opentox.org/dev/apis/api-1.1/Algorithm - Name of the algorithm - - - - - - - - - - - - - Provides access to OpenTox algorithms - - - - - - - - - - - - - - - encapsulates validation information - - - - - - - - /compound/{compoundid} - http://opentox.org/dev/apis/api-1.1/structure - - - - - 1.1 - - - - - - - - API for OpenTox compound webservices - - - - - - - - true - - - - [Optional] support for multiple (e.g. 3D) structures per chemical compound (single structure by default) - /compound/{compoundid}/conformer/{conformerid} - - - - - - - - - - - - - - - - 1.1 - - - - /feature/{featureid} - - - - - - - - - - - - - - - - /dataset/{datasetid}/compound/{compoundid}?feature_uri[]=featureuris - - - 1.1 - - Encapsulates a dataset entry - defined by a single Compound (or conformer) and multiple FeatureValues. Could be regarded as "Compound with features" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PredictionDatasetURI - - - - - - - - - - - - - - - - - - - A model can have one or more dependent variables, described as multiple features, specified by this relationship. - - - - - - - - - - - - - - - - Algorithms and Models can have multiple parameters - http://opentox.org/api/1.1 - - - - - - - - - - - - - Test dataset , used in a validation exercise - - - - - - http://opentox.org/api/1.1 - - Variables, holding the predicted values, generated by the model - - - http://opentox.org/api/1.1 - - - A Dataset contains multiple DataEntries. This property specifies the relationship between Dataset and DataEntry. - - - - - - a link to UnscrambledDataset - UnscrambledDatasetURI - - - - http://opentox.org/api/1.1 - A model can have multiple independent variables, described as multiple features, specified by this relationship. - - - - - - Links Validation with Validation Info. One validation exercise may have multiple types of validation informaton - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A DataEntry is defined with a single compound and multiple feature values. This property sets the relationship between a DataEntry and multiple FeatureValues - http://opentox.org/api/1.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cancelled - - - Running - - - Completed - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Parameter value - The value of a Parameter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Units - Units for a feature value - TODO: make use of units ontology - - - - - - - - - - - - - - - - - - - - - - - Allows to define "is a" relationships outside of particular class hierarchy - - - - Model used in a validation exercise - - - - - - - - Number incorrect - - - - - - - Percent Correct - - - - - - - RootMeanSquaredError - - - - - - - - YScramblingEnabled - - YScramblingEnabled - - - - - YScramblingSeed - YScramblingSeed - - - - - - - - - - - Has 3D structure - - True, if the compound has 3D structure - - - - - - Literal - - Feature value - - - - - - A model is derived by applying an Algorithm on a training Dataset. - http://opentox.org/api/1.1 - - - - - - - - - - http://opentox.org/api/1.1 - The algorithm, used to create the Model - - - - - - - - - - Number correct - - - - - - - - - - - - - - - - - - specifies if a parameter is optional or mandatory - - - - - - - optional - - mandatory - - - - Parameter scope - - - - - Percentage completed - - - - - http://opentox.org/api/1.1 - - - - A DataEntry is defined with a single compound and multiple feature values. This property sets the relationship between a DataEntry and a Compound - - - - - Percent Incorrect - - - - - - MeanAbsolutError - - - - - - FeatureValue contains a value for specific Feature, specified by this relationship. - - - http://opentox.org/api/1.1 - - - - - - - - - - - - - - diff --git a/lib/opentox.rb b/lib/opentox.rb index a6ac1d4..a9cbeab 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -1,23 +1,100 @@ -require 'rdf' -require 'rdf/raptor' -#require "parser.rb" -require "rest_client_wrapper.rb" -require "overwrite.rb" -require "error.rb" - -RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' +#TODO: switch services to 1.2 +#TODO: error handling +RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' +RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' SERVICES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task"] +# not working +RestClient.add_before_execution_proc do |req, params| + params[:subjectid] = @subjectid +end + +class String + def to_object + # TODO: fix, this is unsafe + self =~ /dataset/ ? uri = File.join(self.chomp,"metadata") : uri = self.chomp + raise "#{uri} is not a valid URI." unless RDF::URI.new(uri).uri? + RDF::Reader.open(uri) do |reader| + reader.each_statement do |statement| + if statement.predicate == RDF.type and statement.subject == uri + klass = "OpenTox::#{statement.object.to_s.split("#").last}" + object = eval "#{klass}.new \"#{uri}\"" + end + end + end + # fallback: guess class from uri + # TODO: fix services and remove + unless object + case uri + when /compound/ + object = OpenTox::Compound.new uri + when /feature/ + object = OpenTox::Feature.new uri + when /dataset/ + object = OpenTox::Dataset.new uri.sub(/\/metadata/,'') + when /algorithm/ + object = OpenTox::Algorithm.new uri + when /model/ + object = OpenTox::Model.new uri + when /validation/ + object = OpenTox::Validation.new uri + when /task/ + object = OpenTox::Task.new uri + else + raise "Class for #{uri} not found." + end + end + if object.class == Task # wait for tasks + object.wait_for_completion + object = object.result_uri.to_s.to_object + end + object + end + +=begin + def object_from_uri + # TODO: fix, this is unsafe + self =~ /dataset/ ? uri = File.join(self.chomp,"metadata") : uri = self.chomp + RDF::Reader.open(uri) do |reader| + reader.each_statement do |statement| + if statement.predicate == RDF.type and statement.subject == uri + klass = "OpenTox::#{statement.object.to_s.split("#").last}" + return eval "#{klass}.new \"#{uri}\"" + end + end + end + # guess class from uri + # TODO: fix services and remove + case uri + when /compound/ + return OpenTox::Compound.new uri + when /feature/ + return OpenTox::Feature.new uri + when /dataset/ + return OpenTox::Dataset.new uri.sub(/\/metadata/,'') + when /algorithm/ + return OpenTox::Algorithm.new uri + when /model/ + return OpenTox::Model.new uri + when /validation/ + return OpenTox::Validation.new uri + when /task/ + return OpenTox::Task.new uri + else + raise "Class for #{uri} not found." + end + end +=end +end + module OpenTox - attr_accessor :subjectid, :uri + attr_accessor :subjectid, :uri, :response attr_writer :metadata - # Initialize OpenTox object with optional subjectid - # @param [optional, String] subjectid def initialize uri=nil, subjectid=nil - @uri = uri + @uri = uri.chomp @subjectid = subjectid end @@ -36,104 +113,73 @@ module OpenTox end def save - rdf = RDF::Writer.buffer do |writer| + rdf = RDF::Writer.for(:rdfxml).buffer do |writer| @metadata.each { |p,o| writer << RDF::Statement.new(RDF::URI.new(@uri), p, o) } end - puts rdf - #post(@uri, rdf, { :content_type => 'application/rdf+xml', :subjectid => subjectid}).to_s.chomp, @subjectid + post rdf, { :content_type => 'application/rdf+xml'} end # REST API - # returns OpenTox::WrapperResult, not OpenTox objects - - # perfoms a GET REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # per default: waits for Task to finish and returns result URI of Task - # @param [optional,Hash] headers contains params like accept-header - # @param [wait,Boolean] wait set to false to NOT wait for task if result is task - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def get headers={}, wait=true - headers[:subjectid] = @subjectid - RestClientWrapper.get(@uri.to_s, headers, nil, wait).chomp + def get params={} + params[:subjectid] ||= @subjectid + params[:accept] ||= 'application/rdf+xml' + @response = RestClient.get @uri, params end - # performs a POST REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # per default: waits for Task to finish and returns result URI of Task - # @param [optional,String] payload data posted to the service - # @param [optional,Hash] headers contains params like accept-header - # @param [wait,Boolean] wait set to false to NOT wait for task if result is task - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def post payload={}, headers={}, wait=true - headers[:subjectid] = @subjectid - RestClientWrapper.post(@uri.to_s, payload, headers, nil, wait).chomp + def post payload={}, params={} + params[:subjectid] ||= @subjectid + params[:accept] ||= 'application/rdf+xml' + @response = RestClient.post(@uri.to_s, payload, params) + begin + @response.to_s.to_object + rescue + @response + end end - # performs a PUT REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # @param [optional,String] payload data put to the service - # @param [optional,Hash] headers contains params like accept-header - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def put payload={}, headers={} - headers[:subjectid] = @subjectid - RestClientWrapper.put(@uri.to_s, payload, headers).chomp + def put payload={}, params={} + params[:subjectid] ||= @subjectid + params[:accept] ||= 'application/rdf+xml' + @response = RestClient.put(@uri.to_s, payload, params) end - # performs a DELETE REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def delete - RestClientWrapper.delete(@uri.to_s,:subjectid => @subjectid) + def delete params={} + params[:subjectid] ||= @subjectid + params[:accept] ||= 'application/rdf+xml' + @response = RestClient.delete(@uri.to_s,:subjectid => @subjectid) end + # class methods + module ClassMethods - module Service def create service_uri, subjectid=nil - service = eval("#{self}.new(\"#{service_uri}\", #{subjectid})") - uri = service.post({}, {}, subjectid).to_s - eval "#{self}.new(\"#{uri}\", #{subjectid})" + uri = RestClient.post(service_uri, {}, :subjectid => subjectid).chomp + eval("#{self}.new(\"#{uri}\", #{subjectid})") end + + def from_file service_uri, file, subjectid=nil + RestClient.post(service_uri, :file => File.new(file), :subjectid => subjectid).chomp.to_object + end + + def all service_uri, subjectid=nil + uris = RestClient.get(service_uri, {:accept => 'text/uri-list'}).split("\n").compact + uris.collect{|uri| eval "#{self}.new(\"#{uri}\", #{subjectid})"} + end + + end + + class FromUri end # create default classes SERVICES.each do |s| eval "class #{s} include OpenTox - extend OpenTox::Service + extend OpenTox::ClassMethods end" end -=begin private - def uri_available? - url = URI.parse(@uri) - #req = Net::HTTP.new(url.host,url.port) - #req['subjectid'] = @subjectid if @subjectid - Net::HTTP.start(url.host, url.port) do |http| - return http.head("#{url.request_uri}#{subjectidstr}").code == "200" - end - end - - module Collection - - include OpenTox - - def create metadata - object_class.new post(service_uri, metadata.to_rdfxml, { :content_type => 'application/rdf+xml', :subjectid => subjectid}).to_s.chomp, @subject_id - end - - # Get all objects from a service - # @return [Array] List of available Objects - def all - get(:accept => "text/uri-list").to_s.split(/\n/).collect{|uri| object_class.new uri,@subjectid} - end - - # create collection classes - SERVICES.each { |s| eval "class #{s}; include Collection; end" } - - end -=end - end diff --git a/lib/overwrite.rb b/lib/overwrite.rb deleted file mode 100644 index d541b61..0000000 --- a/lib/overwrite.rb +++ /dev/null @@ -1,155 +0,0 @@ -require 'uri' -=begin -# class overwrites aka monkey patches -# hack: store sinatra instance in global var $url_provider to make url_for and halt methods accessible -before { - raise "should not happen, url provider already differently initialized "+ - $url_provider.request.host.to_s+" != "+self.request.host.to_s if - $url_provider and $url_provider.request.host!=self.request.host and - $url_provider.request.script_name!=self.request.script_name - $url_provider = self - # stupid internet explorer does not ask for text/html, add this manually - request.env['HTTP_ACCEPT'] += ";text/html" if request.env["HTTP_USER_AGENT"]=~/MSIE/ - request.env['HTTP_ACCEPT']=request.params["media"] if request.params["media"] -} - -# Error handling -# Errors are logged as error and formated according to acccept-header -# Non OpenTox::Errors (defined in error.rb) are handled as internal error (500), stacktrace is logged -# IMPT: set sinatra settings :show_exceptions + :raise_errors to false in config.ru, otherwise Rack::Showexceptions takes over -error Exception do - error = request.env['sinatra.error'] - # log error message and backtrace to logfile - LOGGER.error error.class.to_s+": "+error.message - LOGGER.error ":\n"+error.backtrace.join("\n") - - actor = "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}#{request.env['REQUEST_URI']}" - rep = OpenTox::ErrorReport.create(error, actor) - - case request.env['HTTP_ACCEPT'] - when /rdf/ - content_type 'application/rdf+xml' - halt error.http_code,rep.to_rdfxml - when /html/ - content_type 'text/html' - halt error.http_code,(OpenTox.text_to_html rep.to_yaml, @subjectid) - else - content_type 'application/x-yaml' - halt error.http_code,rep.to_yaml - end -end - -class Sinatra::Base - - def return_task( task ) - raise "http_code == nil" unless task.http_code!=nil - case request.env['HTTP_ACCEPT'] - when /rdf/ - response['Content-Type'] = "application/rdf+xml" - halt task.http_code,task.to_rdfxml - when /yaml/ - response['Content-Type'] = "application/x-yaml" - halt task.http_code,task.to_yaml # PENDING differs from task-webservice - when /html/ - response['Content-Type'] = "text/html" - halt task.http_code,OpenTox.text_to_html(task.to_yaml, @subjectid) - else # default /uri-list/ - response['Content-Type'] = "text/uri-list" - if task.completed? - halt task.http_code,task.resultURI+"\n" - else - halt task.http_code,task.uri+"\n" - end - end - end -end -=end - -class String - def task_uri? - self.uri? && !self.match(/task/).nil? - end - - def dataset_uri? - self.uri? && !self.match(/dataset/).nil? - end - - def self.model_uri? - self.uri? && !self.match(/model/).nil? - end - - def uri? - begin - u = URI::parse(self) - return (u.scheme!=nil and u.host!=nil) - rescue URI::InvalidURIError - return false - end - end - - def underscore - self.gsub(/::/, '/'). - gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). - gsub(/([a-z\d])([A-Z])/,'\1_\2'). - tr("-", "_"). - downcase - end -end - -require 'logger' -# logging -#class Logger -class OTLogger < Logger - - def pwd - path = Dir.pwd.to_s - index = path.rindex(/\//) - return path if index==nil - path[(index+1)..-1] - end - - def trace() - lines = caller(0) - n = 2 - line = lines[n] - - while (line =~ /spork.rb/ or line =~ /create/ or line =~ /overwrite.rb/) - n += 1 - line = lines[n] - end - - index = line.rindex(/\/.*\.rb/) - return line if index==nil - line[index..-1] - end - - def format(msg) - pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace - end - - def debug(msg) - super format(msg) - end - - def info(msg) - super format(msg) - end - - def warn(msg) - super format(msg) - end - - def error(msg) - super format(msg) - end - -end - -# make migration from datamapper more straightforward -=begin -class Ohm::Model - def self.get(id) - self[id] - end -end -=end diff --git a/lib/parser.rb b/lib/parser.rb deleted file mode 100644 index 7475d6d..0000000 --- a/lib/parser.rb +++ /dev/null @@ -1,475 +0,0 @@ -#require 'spreadsheet' -#require 'roo' - -# OWL Namespaces -class OwlNamespace - - attr_accessor :uri - def initialize(uri) - @uri = uri - end - - def [](property) - @uri+property.to_s - end - - def type # for RDF.type - "#{@uri}type" - end - - def method_missing(property) - @uri+property.to_s - end - -end - -RDF = OwlNamespace.new 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' -OWL = OwlNamespace.new 'http://www.w3.org/2002/07/owl#' -DC = OwlNamespace.new 'http://purl.org/dc/elements/1.1/' -OT = OwlNamespace.new 'http://www.opentox.org/api/1.1#' -OTA = OwlNamespace.new 'http://www.opentox.org/algorithmTypes.owl#' -XSD = OwlNamespace.new 'http://www.w3.org/2001/XMLSchema#' - -class String - - # Split RDF statement into triples - # @return [Array] Array with [subject,predicate,object] - def to_triple - self.chomp.split(' ',3).collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} - end - -end - -module OpenTox - - # Parser for various input formats - module Parser - - # OWL-DL parser - module Owl - - # Create a new OWL-DL parser - # @param uri URI of OpenTox object - # @return [OpenTox::Parser::Owl] OWL-DL parser - def initialize(uri) - @uri = uri - @metadata = {} - end - - # Read metadata from opentox service - # @return [Hash] Object metadata - def load_metadata(subjectid=nil) - # avoid using rapper directly because of 2 reasons: - # * http errors wont be noticed - # * subjectid cannot be sent as header - ##uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid - ## `rapper -i rdfxml -o ntriples #{uri} 2>/dev/null`.each_line do |line| - if File.exist?(@uri) - file = File.new(@uri) - else - file = Tempfile.new("ot-rdfxml") - if @dataset - # do not concat /metadata to uri string, this would not work for dataset/R401577?max=3 - uri = URI::parse(@uri) - uri.path = File.join(uri.path,"metadata") - uri = uri.to_s - else - uri = @uri - end - file.puts OpenTox::RestClientWrapper.get uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false - file.close - to_delete = file.path - end - statements = [] - parameter_ids = [] - `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| - triple = line.to_triple - if triple[0] == @uri - if triple[1] == RDF.type || triple[1]==OT.predictedVariables # allow multiple types - @metadata[triple[1]] = [] unless @metadata[triple[1]] - @metadata[triple[1]] << triple[2].split('^^').first - else - @metadata[triple[1]] = triple[2].split('^^').first - end - end - statements << triple - parameter_ids << triple[2] if triple[1] == OT.parameters - end - File.delete(to_delete) if to_delete - unless parameter_ids.empty? - @metadata[OT.parameters] = [] - parameter_ids.each do |p| - parameter = {} - statements.each{ |t| parameter[t[1]] = t[2] if t[0] == p and t[1] != RDF['type']} - @metadata[OT.parameters] << parameter - end - end - @metadata - end - - # creates owl object from rdf-data - # @param [String] rdf - # @param [String] type of the info (e.g. OT.Task, OT.ErrorReport) needed to get the subject-uri - # @return [Owl] with uri and metadata set - def self.from_rdf( rdf, type ) - # write to file and read convert with rapper into tripples - file = Tempfile.new("ot-rdfxml") - file.puts rdf - file.close - #puts "cmd: rapper -i rdfxml -o ntriples #{file} 2>/dev/null" - triples = `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null` - - # load uri via type - uri = nil - triples.each_line do |line| - triple = line.to_triple - if triple[1] == RDF['type'] and triple[2]==type - raise "uri already set, two uris found with type: "+type.to_s if uri - uri = triple[0] - end - end - File.delete(file.path) - # load metadata - metadata = {} - triples.each_line do |line| - triple = line.to_triple - metadata[triple[1]] = triple[2].split('^^').first if triple[0] == uri and triple[1] != RDF['type'] - end - owl = Owl::Generic.new(uri) - owl.metadata = metadata - owl - end - - # Generic parser for all OpenTox classes - class Generic - include Owl - - attr_accessor :uri, :metadata - end - - # OWL-DL parser for datasets - class Dataset - - include Owl - - attr_writer :uri - - # Create a new OWL-DL dataset parser - # @param uri Dataset URI - # @return [OpenTox::Parser::Owl::Dataset] OWL-DL parser - def initialize(uri, subjectid=nil) - super uri - @dataset = ::OpenTox::Dataset.new(@uri, subjectid) - end - - # Read data from dataset service. Files can be parsed by setting #uri to a filename (after initialization with a real URI) - # @example Read data from an external service - # parser = OpenTox::Parser::Owl::Dataaset.new "http://wwbservices.in-silico.ch/dataset/1" - # dataset = parser.load_uri - # @example Create dataset from RDF/XML file - # dataset = OpenTox::Dataset.create - # parser = OpenTox::Parser::Owl::Dataaset.new dataset.uri - # parser.uri = "dataset.rdfxml" # insert your input file - # dataset = parser.load_uri - # dataset.save - # @return [Hash] Internal dataset representation - def load_uri(subjectid=nil) - - # avoid using rapper directly because of 2 reasons: - # * http errors wont be noticed - # * subjectid cannot be sent as header - ##uri += "?subjectid=#{CGI.escape(subjectid)}" if subjectid - ##`rapper -i rdfxml -o ntriples #{file} 2>/dev/null`.each_line do |line| - if File.exist?(@uri) - file = File.new(@uri) - else - file = Tempfile.new("ot-rdfxml") - file.puts OpenTox::RestClientWrapper.get @uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false - file.close - to_delete = file.path - end - - data = {} - feature_values = {} - feature = {} - feature_accept_values = {} - other_statements = {} - `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| - triple = line.chomp.split(' ',3) - triple = triple[0..2].collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} - case triple[1] - when /#{OT.values}/i - data[triple[0]] = {:compound => "", :values => []} unless data[triple[0]] - data[triple[0]][:values] << triple[2] - when /#{OT.value}/i - feature_values[triple[0]] = triple[2] - when /#{OT.compound}/i - data[triple[0]] = {:compound => "", :values => []} unless data[triple[0]] - data[triple[0]][:compound] = triple[2] - when /#{OT.feature}/i - feature[triple[0]] = triple[2] - when /#{RDF.type}/i - if triple[2]=~/#{OT.Compound}/i and !data[triple[0]] - data[triple[0]] = {:compound => triple[0], :values => []} - end - when /#{OT.acceptValue}/i # acceptValue in ambit datasets is only provided in dataset/ no in dataset//features - feature_accept_values[triple[0]] = [] unless feature_accept_values[triple[0]] - feature_accept_values[triple[0]] << triple[2] - else - end - end - File.delete(to_delete) if to_delete - data.each do |id,entry| - if entry[:values].size==0 - # no feature values add plain compounds - @dataset.add_compound(entry[:compound]) - else - entry[:values].each do |value_id| - if feature_values[value_id] - split = feature_values[value_id].split(/\^\^/) - case split[-1] - when XSD.double, XSD.float - value = split.first.to_f - when XSD.boolean - value = split.first=~/(?i)true/ ? true : false - else - value = split.first - end - end - @dataset.add entry[:compound],feature[value_id],value - end - end - end - load_features subjectid - feature_accept_values.each do |feature, values| - @dataset.features[feature][OT.acceptValue] = values - end - @dataset.metadata = load_metadata(subjectid) - @dataset - end - - # Read only features from a dataset service. - # @return [Hash] Internal features representation - def load_features(subjectid=nil) - if File.exist?(@uri) - file = File.new(@uri) - else - file = Tempfile.new("ot-rdfxml") - # do not concat /features to uri string, this would not work for dataset/R401577?max=3 - uri = URI::parse(@uri) - # PENDING - # ambit models return http://host/dataset/id?feature_uris[]=sth but - # amibt dataset services does not support http://host/dataset/id/features?feature_uris[]=sth - # -> load features from complete dataset - uri.path = File.join(uri.path,"features") unless @uri=~/\?feature_uris\[\]/ - uri = uri.to_s - file.puts OpenTox::RestClientWrapper.get uri,{:subjectid => subjectid,:accept => "application/rdf+xml"},nil,false - file.close - to_delete = file.path - end - statements = [] - features = Set.new - `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| - triple = line.chomp.split('> ').collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')}[0..2] - statements << triple - features << triple[0] if triple[1] == RDF.type and (triple[2] =~ /Feature|Substructure/) - end - File.delete(to_delete) if to_delete - statements.each do |triple| - if features.include? triple[0] - @dataset.features[triple[0]] = {} unless @dataset.features[triple[0]] - @dataset.features[triple[0]][triple[1]] = triple[2].split('^^').first - end - end - @dataset.features - end - - end - - end - -=begin - # Parser for getting spreadsheet data into a dataset - class Spreadsheets - - attr_accessor :dataset - - def initialize - @data = [] - @features = [] - @feature_types = {} - - @format_errors = "" - @smiles_errors = [] - @activity_errors = [] - @duplicates = {} - end - - # Load Spreadsheet book (created with roo gem http://roo.rubyforge.org/, excel format specification: http://toxcreate.org/help) - # @param [Excel] book Excel workbook object (created with roo gem) - # @return [OpenTox::Dataset] Dataset object with Excel data - def load_spreadsheet(book) - book.default_sheet = 0 - add_features book.row(1) - - # AM: fix mixed read in - regression_features=false - 2.upto(book.last_row) { |i| - row = book.row(i) - regression_features = detect_regression_features row - break if regression_features==true - } - - 2.upto(book.last_row) { |i| add_values book.row(i),regression_features } - warnings - @dataset - end - - # Load CSV string (format specification: http://toxcreate.org/help) - # @param [String] csv CSV representation of the dataset - # @return [OpenTox::Dataset] Dataset object with CSV data - def load_csv(csv) - row = 0 - input = csv.split("\n") - add_features split_row(input.shift) - - - # AM: fix mixed read in - regression_features=false - input.each { |row| - row = split_row(row) - regression_features = detect_regression_features row - break if regression_features==true - } - input.each { |row| add_values split_row(row),regression_features } - warnings - @dataset - end - - - private - - def warnings - - info = '' - @feature_types.each do |feature,types| - if types.uniq.size > 1 - type = OT.NumericFeature - else - type = types.first - end - @dataset.add_feature_metadata(feature,{RDF.type => [type]}) - info += "\"#{@dataset.feature_name(feature)}\" detected as #{type.split('#').last}." - - # TODO: rewrite feature values - # TODO if value.to_f == 0 @activity_errors << "#{smiles} Zero values not allowed for regression datasets - entry ignored." - end - - @dataset.metadata[OT.Info] = info - - warnings = '' - warnings += "

Incorrect Smiles structures (ignored):

" + @smiles_errors.join("
") unless @smiles_errors.empty? - warnings += "

Irregular activities (ignored):

" + @activity_errors.join("
") unless @activity_errors.empty? - duplicate_warnings = '' - @duplicates.each {|inchi,lines| duplicate_warnings << "

#{lines.join('
')}

" if lines.size > 1 } - warnings += "

Duplicated structures (all structures/activities used for model building, please make sure, that the results were obtained from independent experiments):

" + duplicate_warnings unless duplicate_warnings.empty? - - @dataset.metadata[OT.Warnings] = warnings - - end - - def add_features(row) - row.shift # get rid of smiles entry - row.each do |feature_name| - feature_uri = File.join(@dataset.uri,"feature",URI.encode(feature_name)) - @feature_types[feature_uri] = [] - @features << feature_uri - @dataset.add_feature(feature_uri,{DC.title => feature_name}) - end - end - - def detect_regression_features row - row.shift - regression_features=false - row.each_index do |i| - value = row[i] - type = feature_type(value) - if type == OT.NumericFeature - regression_features=true - end - end - regression_features - end - - def add_values(row, regression_features=false) - - smiles = row.shift - compound = Compound.from_smiles(smiles) - if compound.nil? or compound.inchi.nil? or compound.inchi == "" - @smiles_errors << smiles+", "+row.join(", ") - return false - end - @duplicates[compound.inchi] = [] unless @duplicates[compound.inchi] - @duplicates[compound.inchi] << smiles+", "+row.join(", ") - - row.each_index do |i| - value = row[i] - feature = @features[i] - type = feature_type(value) - - @feature_types[feature] << type - - if (regression_features) - val = value.to_f - else - case type - when OT.NominalFeature - case value.to_s - when TRUE_REGEXP - val = true - when FALSE_REGEXP - val = false - end - when OT.NumericFeature - val = value.to_f - when OT.StringFeature - val = value.to_s - @activity_errors << smiles+", "+row.join(", ") - end - end - if val!=nil - @dataset.add(compound.uri, feature, val) - if type!=OT.NumericFeature - @dataset.features[feature][OT.acceptValue] = [] unless @dataset.features[feature][OT.acceptValue] - @dataset.features[feature][OT.acceptValue] << val.to_s unless @dataset.features[feature][OT.acceptValue].include?(val.to_s) - end - end - end - end - - def numeric?(value) - true if Float(value) rescue false - end - - def classification?(value) - !value.to_s.strip.match(TRUE_REGEXP).nil? or !value.to_s.strip.match(FALSE_REGEXP).nil? - end - - def feature_type(value) - if classification? value - return OT.NominalFeature - elsif numeric? value - return OT.NumericFeature - else - return OT.StringFeature - end - end - - def split_row(row) - row.chomp.gsub(/["']/,'').split(/\s*[,;]\s*/) # remove quotes - end - - end -=end - end -end diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb deleted file mode 100644 index 30f04cc..0000000 --- a/lib/rest_client_wrapper.rb +++ /dev/null @@ -1,182 +0,0 @@ -require 'rest-client' -module OpenTox - - class WrapperResult < String - attr_accessor :content_type, :code - end - - class RestClientWrapper - - # performs a GET REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # per default: waits for Task to finish and returns result URI of Task - # @param [String] uri destination URI - # @param [optional,Hash] headers contains params like accept-header - # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @param [wait,Boolean] wait set to false to NOT wait for task if result is task - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.get(uri, headers={}, waiting_task=nil, wait=true ) - execute( "get", uri, nil, headers, waiting_task, wait) - end - - # performs a POST REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # per default: waits for Task to finish and returns result URI of Task - # @param [String] uri destination URI - # @param [optional,String] payload data posted to the service - # @param [optional,Hash] headers contains params like accept-header - # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @param [wait,Boolean] wait set to false to NOT wait for task if result is task - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.post(uri, payload=nil, headers={}, waiting_task=nil, wait=true ) - execute( "post", uri, payload, headers, waiting_task, wait ) - end - - # performs a PUT REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # @param [String] uri destination URI - # @param [optional,Hash] headers contains params like accept-header - # @param [optional,String] payload data put to the service - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.put(uri, payload=nil, headers={} ) - execute( "put", uri, payload, headers ) - end - - # performs a DELETE REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # @param [String] uri destination URI - # @param [optional,Hash] headers contains params like accept-header - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.delete(uri, headers=nil ) - execute( "delete", uri, nil, headers) - end - - private - def self.execute( rest_call, uri, payload=nil, headers={}, waiting_task=nil, wait=true ) - - raise OpenTox::BadRequestError.new "uri is nil" unless uri - raise OpenTox::BadRequestError.new "not a uri: "+uri.to_s unless uri.to_s.uri? - raise "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) - raise OpenTox::BadRequestError.new "accept should go into the headers" if payload and payload.is_a?(Hash) and payload[:accept] - raise OpenTox::BadRequestError.new "content_type should go into the headers" if payload and payload.is_a?(Hash) and payload[:content_type] - raise "__waiting_task__ must be 'nil' or '(sub)task', is "+waiting_task.class.to_s if - waiting_task!=nil and !(waiting_task.is_a?(Task) || waiting_task.is_a?(SubTask)) - headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems - ## PENDING partner services accept subjectid only in header - headers = {} unless headers - headers[:subjectid] = payload.delete(:subjectid) if payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) - - # PENDING needed for NUTA, until we finally agree on how to send subjectid - headers[:subjectid] = payload.delete(:subjectid) if uri=~/ntua/ and payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) - - begin - #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect+" "+payload.inspect - resource = RestClient::Resource.new(uri,{:timeout => 60}) - if rest_call=="post" || rest_call=="put" - result = resource.send(rest_call, payload, headers) - else - result = resource.send(rest_call, headers) - end - #LOGGER.debug "result body size: #{result.body.size}" - - # PENDING NTUA does return errors with 200 - raise RestClient::ExceptionWithResponse.new(result) if uri=~/ntua/ and result.body =~ /about.*http:\/\/anonymous.org\/error/ - - # result is a string, with the additional fields content_type and code - res = WrapperResult.new(result.body) - res.content_type = result.headers[:content_type] - raise "content-type not set" unless res.content_type - res.code = result.code - - # TODO: Ambit returns task representation with 200 instead of result URI - return res if res.code==200 || !wait - - while (res.code==201 || res.code==202) - res = wait_for_task(res, uri, waiting_task) - end - raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200 - return res - - rescue RestClient::RequestTimeout => ex - received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue Errno::ETIMEDOUT => ex - received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue Errno::ECONNREFUSED => ex - received_error ex.message, 500, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue RestClient::ExceptionWithResponse => ex - # error comming from a different webservice, - received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue OpenTox::RestCallError => ex - # already a rest-error, probably comes from wait_for_task, just pass through - raise ex - rescue => ex - # some internal error occuring in rest_client_wrapper, just pass through - raise ex - end - end - - def self.wait_for_task( res, base_uri, waiting_task=nil ) - #TODO remove TUM hack - res.content_type = "text/uri-list" if base_uri =~/tu-muenchen/ and res.content_type == "application/x-www-form-urlencoded;charset=UTF-8" - - task = nil - case res.content_type - when /application\/rdf\+xml/ - task = OpenTox::Task.from_rdfxml(res) - when /yaml/ - task = OpenTox::Task.from_yaml(res) - when /text\// - raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task - task = OpenTox::Task.find(res.to_s.chomp) if res.to_s.uri? - else - raise "unknown content-type for task : '"+res.content_type.to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+res[0..200].to_s - end - - #LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" - task.wait_for_completion waiting_task - unless task.completed? # maybe task was cancelled / error - if task.errorReport - received_error task.errorReport, task.http_code, nil, {:rest_uri => task.uri, :rest_code => task.http_code} - else - raise "task status: '"+task.status.to_s+"' but errorReport nil" - end - end - - res = WrapperResult.new task.result_uri - res.code = task.http_code - res.content_type = "text/uri-list" - return res - end - - def self.received_error( body, code, content_type=nil, params=nil ) - - # try to parse body - report = nil - if body.is_a?(OpenTox::ErrorReport) - report = body - else - case content_type - when /yaml/ - report = YAML.load(body) - when /rdf/ - report = OpenTox::ErrorReport.from_rdf(body) - end - end - - unless report - # parsing was not successfull - # raise 'plain' RestCallError - err = OpenTox::RestCallError.new("REST call returned error: '"+body.to_s+"'") - err.rest_params = params - raise err - else - # parsing sucessfull - # raise RestCallError with parsed report as error cause - err = OpenTox::RestCallError.new("REST call subsequent error") - err.errorCause = report - err.rest_params = params - raise err - end - end - end -end diff --git a/lib/serializer.rb b/lib/serializer.rb deleted file mode 100644 index 5a9fd0a..0000000 --- a/lib/serializer.rb +++ /dev/null @@ -1,491 +0,0 @@ -require 'spreadsheet' -require 'yajl' - -module OpenTox - - # Serialzer for various oputput formats - module Serializer - - # OWL-DL Serializer, modelled according to to http://n2.talis.com/wiki/RDF_JSON_Specification - class Owl - - attr_accessor :object - - def initialize - - @object = { - # this should come from opentox.owl - OT.Compound => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.Feature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.Model => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.NominalFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.NumericFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.StringFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.Dataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.DataEntry => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.FeatureValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.Algorithm => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.Parameter => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.Task => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OTA.PatternMiningSupervised => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OTA.ClassificationLazySingleTarget => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OTA.RegressionLazySingleTarget => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - - #classes for validation - OT.Validation => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.ClassificationStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.ConfusionMatrix => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.ConfusionMatrixCell => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.ClassValueStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.RegressionStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.Crossvalidation => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.CrossvalidationInfo => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - OT.ErrorReport => { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } , - - OT.compound => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.feature => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.dataEntry => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.values => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.algorithm => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.parameters => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.featureDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.dependentVariables => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.predictedVariables => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.paramValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - - #object props for validation# - OT.model => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.trainingDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.predictionFeature => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.predictionDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.crossvalidation => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.testTargetDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.testDataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.classificationStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.confusionMatrix => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.confusionMatrixCell => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.classValueStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.regressionStatistics => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.validation => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.crossvalidationInfo => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - OT.dataset => { RDF["type"] => [{ "type" => "uri", "value" => OWL.ObjectProperty }] } , - - DC.title => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - DC.identifier => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - DC.contributor => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - DC.creator => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - DC.description => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - DC.date => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - #OT.isA => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.Warnings => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - XSD.anyURI => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.hasStatus => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.resultURI => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.percentageCompleted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.acceptValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - - # annotation props for validation - OT.numUnpredicted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.crossvalidationFold => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.numInstances => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.numWithoutClass => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.percentWithoutClass => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.percentUnpredicted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.confusionMatrixActual => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.confusionMatrixPredicted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.confusionMatrixValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.numIncorrect => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.percentCorrect => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.numCorrect => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.accuracy => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.trueNegativeRate => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.truePositiveRate => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.falseNegativeRate => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.falsePositiveRate => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.numTrueNegatives => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.numTruePositives => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.numFalseNegatives => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.numFalsePositives => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.classValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.precision => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.areaUnderRoc => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.weightedAreaUnderRoc => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.weightedAccuracy => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.fMeasure => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.percentIncorrect => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.validationType => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.realRuntime => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.sampleCorrelationCoefficient => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.targetVarianceActual => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.targetVariancePredicted => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.meanAbsoluteError => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.sumSquaredError => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.rootMeanSquaredError => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.rSquare => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.stratified => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.numFolds => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.randomSeed => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.reportType => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.message => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.statusCode => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.actor => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - OT.errorCode => { RDF["type"] => [{ "type" => "uri", "value" => OWL.AnnotationProperty }] } , - - OT.hasSource => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , - OT.value => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , - OT.paramScope => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , - #OT.paramValue => { RDF["type"] => [{ "type" => "uri", "value" => OWL.DatatypeProperty }] } , - } - - @data_entries = {} - @values_id = 0 - @parameter_id = 0 - - @classes = Set.new - @object_properties = Set.new - @annotation_properties = Set.new - @datatype_properties = Set.new - - @objects = Set.new - end - - # Add a compound - # @param [String] uri Compound URI - def add_compound(uri) - @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Compound }] } - end - - # Add a feature - # @param [String] uri Feature URI - def add_feature(uri,metadata) - @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Feature }] } - add_metadata uri, metadata - end - - # Add a dataset - # @param [String] uri Dataset URI - def add_dataset(dataset) - @dataset = dataset.uri - @object[dataset.uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Dataset }] } - add_metadata dataset.uri, dataset.metadata - dataset.compounds.each { |compound| add_compound compound } - dataset.features.each { |feature,metadata| add_feature feature,metadata } - dataset.data_entries.each do |compound,entry| - entry.each do |feature,values| - values.each { |value| add_data_entry compound,feature,value } - end - end - end - - # Add a algorithm - # @param [String] uri Algorithm URI - def add_algorithm(uri,metadata) - @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } - add_metadata uri, metadata - end - - # Add a model - # @param [String] uri Model URI - def add_model(uri,metadata) - @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Model }] } - add_metadata uri, metadata - @object[metadata[OT.featureDataset]] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Dataset }] } - @object[metadata[OT.trainingDataset]] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Dataset }] } - @object[metadata[OT.dependentVariables]] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Feature }] } - metadata[OT.predictedVariables].each{|feature| @object[feature] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Feature }] }} - # TODO: add algorithms from parameters - @object["http://ot-dev.in-silico.ch/algorithm/fminer/bbrc"] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } - @object["http://ot-dev.in-silico.ch/algorithm/fminer/last"] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } - @object["http://ot-dev.in-silico.ch/algorithm/lazar"] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Algorithm }] } - end - - # Add a task - # @param [String] uri Model URI - def add_task(uri,metadata) - @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Task }] } - add_metadata uri, metadata - end - - # Add a resource defined by resource_class and content - # (see documentation of add_content for example) - # @param [String] uri of resource - # @param [String] resource class, e.g. OT.Validation - # @param [Hash] content as hash - def add_resource(uri, resource_class, content) - @object[uri] = { RDF["type"] => [{ "type" => "uri", "value" => resource_class }] } - @@content_id = 1 - add_content uri, content - end - - private - @@content_id = 1 - - # Recursiv function to add content - # @example - # { DC.description => "bla", - # OT.similar_resources => [ "http://uri1", "http://uri2" ], - # OT.matrixCells => - # [ { RDF.type => OT.MatrixCell, OT.cellIndex=1 OT.cellValue => "xy" }, - # { RDF.type => OT.MatrixCell, OT.cellIndex=2 OT.cellValue => "z" } ], - # OT.info => { RDF.type => OT.ImportantInfo, - # DC.description => "blub" } - # } - # @param [String] uri - # @param [Hash] content as hash, uri must already have been added to @object - def add_content(uri, hash) - raise "content is no hash: "+hash.class.to_s unless hash.is_a?(Hash) - hash.each do |u,v| - if v.is_a? Hash - # value is again a hash, i.e. a new owl class is added - # first make sure type (==class) is set - type = v[RDF.type] - raise "type missing for "+u.to_s+" content:\n"+v.inspect unless type - raise "class unknown "+type.to_s+" (for "+u.to_s+")" unless @object.has_key?(type) - # create new node and add to current uri - genid = "_:#{type.split('#')[-1]}#{@@content_id}" - @@content_id += 1 - @object[uri] = {} unless @object[uri] - @object[uri][u] = [{ "type" => "bnode", "value" => genid }] - # add content to new class - add_content(genid,v) - elsif v.is_a? Array - # value is an array, i.e. a list of values with property is added - v.each{ |vv| add_content( uri, { u => vv } ) } - else # v.is_a? String - # simple string value - @object[uri] = {} unless @object[uri] - @object[uri][u] = [] unless @object[uri][u] - raise "property unknown "+u.to_s if !@object.has_key?(u) and u!=RDF.type - # use << to allow different values for one property - @object[uri][u] << {"type" => type(v), "value" => v } - end - end - end - - public - - # Add metadata - # @param [Hash] metadata - def add_metadata(uri,metadata) - id = 0 - metadata.each do |u,v| - #if v.is_a? Array and (u == OT.parameters or u == RDF.type) - if v.is_a? Array and u == OT.parameters#or u == RDF.type) - @object[uri][u] = [] unless @object[uri][u] - v.each do |value| - id+=1 - genid = "_:genid#{id}" - @object[uri][u] << {"type" => "bnode", "value" => genid} - @object[genid] = { RDF["type"] => [{ "type" => "uri", "value" => OT.Parameter}] } - value.each do |name,entry| - @object[genid][name] = [{"type" => type(entry), "value" => entry }] - end - end - elsif v.is_a? Array #and u == RDF.type - @object[uri] = {} unless @object[uri] - v.each do |value| - @object[uri][u] = [] unless @object[uri][u] - @object[uri][u] << {"type" => type(value), "value" => value } - end - elsif v.is_a? String - @object[uri] = {} unless @object[uri] - @object[uri][u] = [{"type" => type(v), "value" => v }] - end - end - end - - # Add a data entry - # @param [String] compound Compound URI - # @param [String] feature Feature URI - # @param [Boolead,Float] value Feature value - def add_data_entry(compound,feature,value) - add_compound(compound) unless @object[compound] - add_feature(feature,{}) unless @object[feature] - unless data_entry = @data_entries[compound] - data_entry = "_:dataentry#{@data_entries.size}" - @data_entries[compound] = data_entry - @object[@dataset][OT.dataEntry] = [] unless @object[@dataset][OT.dataEntry] - @object[@dataset][OT.dataEntry] << {"type" => "bnode", "value" => data_entry} - @object[data_entry] = { - RDF["type"] => [{ "type" => "uri", "value" => OT.DataEntry }], - OT.compound => [{ "type" => "uri", "value" => compound }], - OT.values => [], - } - end - values = "_:values#{@values_id}" - @values_id += 1 - @object[data_entry][OT.values] << {"type" => "bnode", "value" => values} - case type(value) - when "uri" - v = [{ "type" => "uri", "value" => value}] - when "literal" - v = [{ "type" => "literal", "value" => value, "datatype" => datatype(value) }] - else - raise "Illegal type #{type(value)} for #{value}." - end - @object[values] = { - RDF["type"] => [{ "type" => "uri", "value" => OT.FeatureValue }], - OT.feature => [{ "type" => "uri", "value" => feature }], - OT.value => v - } - @object[feature][RDF["type"]] << { "type" => "uri", "value" => featuretype(value) } - #@object[feature][RDF["type"]] = { "type" => "uri", "value" => featuretype(value) } - end - - # Serializers - - # Convert to N-Triples - # @return [text/plain] Object OWL-DL in N-Triples format - def to_ntriples - - @triples = Set.new - @object.each do |s,entry| - s = url(s) if type(s) == "uri" - entry.each do |p,objects| - p = url(p) - objects.each do |o| - case o["type"] - when "uri" - o = url(o["value"]) - when "literal" - o = literal(o["value"],datatype(o["value"])) - when "bnode" - o = o["value"] - end - @triples << [s,p,o] - end - end - end - @triples.sort.collect{ |s| s.join(' ').concat(" .") }.join("\n")+"\n" - end - - # Convert to RDF/XML - # @return [text/plain] Object OWL-DL in RDF/XML format - def to_rdfxml - Tempfile.open("owl-serializer"){|f| f.write(self.to_ntriples); @path = f.path} - # TODO: add base uri for ist services - `rapper -i ntriples -f 'xmlns:ot="#{OT.uri}"' -f 'xmlns:ota="#{OTA.uri}"' -f 'xmlns:dc="#{DC.uri}"' -f 'xmlns:rdf="#{RDF.uri}"' -f 'xmlns:owl="#{OWL.uri}"' -o rdfxml #{@path} 2>/dev/null` - end - - # Convert to JSON as specified in http://n2.talis.com/wiki/RDF_JSON_Specification - # (Ambit services use a different JSON representation) - # @return [text/plain] Object OWL-DL in JSON format - def to_json - #rdf_types - Yajl::Encoder.encode(@object) - end - - # Helpers for type detection - private - - def datatype(value) - if value.is_a? TrueClass or value.is_a? FalseClass - XSD.boolean - elsif value.is_a? Float - XSD.float - else - XSD.string - end - end - - def featuretype(value) - if value.is_a? TrueClass or value.is_a? FalseClass - datatype = OT.NominalFeature - elsif value.is_a? Float - datatype = OT.NumericFeature - else - datatype = OT.StringFeature - end - end - - def type(value) - begin - uri = URI.parse(value) - if uri.class == URI::HTTP or uri.class == URI::HTTPS - "uri" - elsif value.match(/^_/) - "bnode" - else - "literal" - end - rescue - "literal" - end - end - - def literal(value,type) - # concat and << are faster string concatination operators than + - '"'.concat(value.to_s).concat('"^^<').concat(type).concat('>') - end - - def url(uri) - # concat and << are faster string concatination operators than + - '<'.concat(uri).concat('>') - end - - def rdf_types - @classes.each { |c| @object[c] = { RDF["type"] => [{ "type" => "uri", "value" => OWL['Class'] }] } } - @object_properties.each { |p| @object[p] = { RDF["type"] => [{ "type" => "uri", "value" => OWL['ObjectProperty'] }] } } - @annotation_properties.each { |a| @object[a] = { RDF["type"] => [{ "type" => "uri", "value" => OWL['AnnotationProperty'] }] } } - @datatype_properties.each { |d| @object[d] = { RDF["type"] => [{ "type" => "uri", "value" => OWL['DatatypeProperty'] }] } } - end - - end - - # Serializer for spreadsheet formats - class Spreadsheets # to avoid nameclash with Spreadsheet gem - - # Create a new spreadsheet serializer - # @param [OpenTox::Dataset] dataset Dataset object - def initialize(dataset) - @rows = [] - @rows << ["SMILES"] - features = dataset.features.keys - @rows.first << features - @rows.first.flatten! - dataset.data_entries.each do |compound,entries| - smiles = Compound.new(compound).to_smiles - row = Array.new(@rows.first.size) - row[0] = smiles - entries.each do |feature, values| - i = features.index(feature)+1 - values.each do |value| - if row[i] - row[i] = "#{row[i]} #{value}" # multiple values - else - row[i] = value - end - end - end - @rows << row - end - end - - # Convert to CSV string - # @return [String] CSV string - def to_csv - @rows.collect{|r| r.join(", ")}.join("\n") - end - - # Convert to spreadsheet workbook - # @return [Spreadsheet::Workbook] Workbook object (use the spreadsheet gemc to write a file) - def to_spreadsheet - Spreadsheet.client_encoding = 'UTF-8' - book = Spreadsheet::Workbook.new - sheet = book.create_worksheet(:name => '') - sheet.column(0).width = 100 - i = 0 - @rows.each do |row| - row.each do |c| - sheet.row(i).push c - end - i+=1 - end - book - end - - end - - - end -end diff --git a/lib/spork.rb b/lib/spork.rb deleted file mode 100644 index c77b5b5..0000000 --- a/lib/spork.rb +++ /dev/null @@ -1,83 +0,0 @@ -# A way to cleanly handle process forking in Sinatra when using Passenger, aka "sporking some code". -# This will allow you to properly execute some code asynchronously, which otherwise does not work correctly. -# -# Written by Ron Evans -# More info at http://deadprogrammersociety.com -# -# Mostly lifted from the Spawn plugin for Rails (http://github.com/tra/spawn) -# but with all of the Rails stuff removed.... cause you are using Sinatra. If you are using Rails, Spawn is -# what you need. If you are using something else besides Sinatra that is Rack-based under Passenger, and you are having trouble with -# asynch processing, let me know if spork helped you. -# -module Spork - # things to close in child process - @@resources = [] - def self.resources - @@resources - end - - # set the resource to disconnect from in the child process (when forking) - def self.resource_to_close(resource) - @@resources << resource - end - - # close all the resources added by calls to resource_to_close - def self.close_resources - @@resources.each do |resource| - resource.close if resource && resource.respond_to?(:close) && !resource.closed? - end - @@resources = [] - end - - # actually perform the fork... er, spork - # valid options are: - # :priority => to set the process priority of the child - # :logger => a logger object to use from the child - # :no_detach => true if you want to keep the child process under the parent control. usually you do NOT want this - def self.spork(options={}) - logger = options[:logger] - logger.debug "spork> parent PID = #{Process.pid}" if logger - - child = fork do - begin - start = Time.now - logger.debug "spork> child PID = #{Process.pid}" if logger - - # set the nice priority if needed - Process.setpriority(Process::PRIO_PROCESS, 0, options[:priority]) if options[:priority] - - # disconnect from the rack - Spork.close_resources - - # run the block of code that takes so long - yield - - rescue => ex - #raise ex - logger.error "spork> Exception in child[#{Process.pid}] - #{ex.class}: #{ex.message}" if logger - ensure - logger.info "spork> child[#{Process.pid}] took #{Time.now - start} sec" if logger - # this form of exit doesn't call at_exit handlers - exit!(0) - end - end - - # detach from child process (parent may still wait for detached process if they wish) - Process.detach(child) unless options[:no_detach] - - return child - end - -end - -# Patch to work with passenger -if defined? Passenger::Rack::RequestHandler - class Passenger::Rack::RequestHandler - alias_method :orig_process_request, :process_request - def process_request(env, input, output) - Spork.resource_to_close(input) - Spork.resource_to_close(output) - orig_process_request(env, input, output) - end - end -end diff --git a/lib/task.rb b/lib/task.rb index 3815177..0adb7a0 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,401 +1,72 @@ - +DEFAULT_TASK_MAX_DURATION = 36000 module OpenTox # Class for handling asynchronous tasks class Task - include OpenTox - attr_accessor :http_code, :due_to_time - - def initialize(uri=nil) - super uri - @http_code = 202 - @metadata = { - DC.title => "", - DC.date => "", - OT.hasStatus => "Running", - OT.percentageCompleted => 0.0, - OT.resultURI => "", - DC.creator => "", # not mandatory according to API - DC.description => "", # not mandatory according to API - } - end - - # Create a new task for the code in the block. Catches halts and exceptions and sets task state to error if necessary. The block has to return the URI of the created resource. - # @example - # task = OpenTox::Task.create do - # # this code will be executed as a task - # model = OpenTox::Algorithm.run(params) # this can be time consuming - # model.uri # Important: return URI of the created resource - # end - # task.status # returns "Running", because tasks are forked - # @param [String] title Task title - # @param [String] creator Task creator - # @return [OPenTox::Task] Task - def self.create( title=nil, creator=nil, max_duration=DEFAULT_TASK_MAX_DURATION, description=nil ) - - params = {:title=>title, :creator=>creator, :max_duration=>max_duration, :description=>description } - task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, {}, nil, false).to_s - task = Task.new(task_uri.chomp) - - # measure current memory consumption -=begin - memory = `free -m|sed -n '2p'`.split - free_memory = memory[3].to_i + memory[6].to_i # include cache - if free_memory < 20 # require at least 200 M free memory - LOGGER.warn "Cannot start task - not enough memory left (#{free_memory} M free)" - task.cancel - return task - #raise "Insufficient memory to start a new task" - end - - cpu_load = `cat /proc/loadavg`.split(/\s+/)[0..2].collect{|c| c.to_f} - nr_cpu_cores = `cat /proc/cpuinfo |grep "cpu cores"|cut -d ":" -f2|tr -d " "`.split("\n").collect{|c| c.to_i}.inject{|sum,n| sum+n} - nr_cpu_cores = 1 if !nr_cpu_cores - #if cpu_load[0] > nr_cpu_cores and cpu_load[0] > cpu_load[1] and cpu_load[1] > cpu_load[2] # average CPU load of the last minute is high and CPU load is increasing - # LOGGER.warn "Cannot start task - CPU load too high (#{cpu_load.join(", ")})" - # task.cancel - # return task - # #raise "Server too busy to start a new task" - #end -=end - task_pid = Spork.spork(:logger => LOGGER) do - LOGGER.debug "Task #{task.uri} started #{Time.now}" - begin - result = yield task - LOGGER.debug "Task #{task.uri} done #{Time.now} -> "+result.to_s - task.completed(result) - rescue => error - LOGGER.error "task failed: "+error.class.to_s+": "+error.message - LOGGER.error ":\n"+error.backtrace.join("\n") - task.error(OpenTox::ErrorReport.create(error, creator)) - end - end - task.pid = task_pid - LOGGER.debug "Started task: "+task.uri.to_s - task - end - - # Find a task for querying, status changes - # @param [String] uri Task URI - # @return [OpenTox::Task] Task object - def self.find(uri) - return nil unless uri - task = Task.new(uri) - task.load_metadata - raise "could not load task metadata" if task.metadata==nil or task.metadata.size==0 - task - end - # Find a task for querying, status changes - # @param [String] uri Task URI - # @return [OpenTox::Task] Task object - def self.exist?(uri) - begin - return find(uri) - rescue - end + def self.create service_uri + Task.new RestClient.post(service_uri,{}).chomp + #eval("#{self}.new(\"#{uri}\", #{subjectid})") end - # Get a list of all tasks - # @param [optional, String] uri URI of task service - # @return [text/uri-list] Task URIs - def self.all(uri=CONFIG[:services]["opentox-task"]) - OpenTox.all uri - end - - def self.from_yaml(yaml) - @metadata = YAML.load(yaml) - end - - def self.from_rdfxml(rdfxml) - owl = OpenTox::Parser::Owl.from_rdf(rdfxml, OT.Task) - task = Task.new(owl.uri) - task.add_metadata(owl.metadata) - task - end - - def to_rdfxml - s = Serializer::Owl.new - @metadata[OT.errorReport] = @uri+"/ErrorReport/tmpId" if @error_report - s.add_task(@uri,@metadata) - s.add_resource(@uri+"/ErrorReport/tmpId", OT.errorReport, @error_report.rdf_content) if @error_report - s.to_rdfxml + def http_code + get(@uri).code end def status - @metadata[OT.hasStatus] + metadata[RDF::OT.hasStatus].to_s end def result_uri - @metadata[OT.resultURI] + metadata[RDF::OT.resultURI] end def description - @metadata[DC.description] + metadata[RDF::DC.description] end def errorReport - @metadata[OT.errorReport] + metadata[RDF::OT.errorReport] end def cancel - RestClientWrapper.put(File.join(@uri,'Cancelled'),{:cannot_be => "empty"}) - load_metadata + RestClient.put(File.join(@uri,'Cancelled'),{:cannot_be => "empty"}) end def completed(uri) - RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) - load_metadata + RestClient.put(File.join(@uri,'Completed'),{:resultURI => uri}) end def error(error_report) raise "no error report" unless error_report.is_a?(OpenTox::ErrorReport) - RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => error_report.to_yaml}) - load_metadata - end - - # not stored just for to_rdf - def add_error_report( error_report ) - raise "not an error report: "+error_report.class.to_s unless error_report.is_a?(ErrorReport) - @error_report = error_report + RestClient.put(File.join(@uri,'Error'),{:errorReport => error_report.to_yaml}) end def pid=(pid) - RestClientWrapper.put(File.join(@uri,'pid'), {:pid => pid}) + RestClient.put(File.join(@uri,'pid'), {:pid => pid}) end def running? - @metadata[OT.hasStatus] == 'Running' + metadata[RDF::OT.hasStatus] == 'Running' end def completed? - @metadata[OT.hasStatus] == 'Completed' + metadata[RDF::OT.hasStatus] == 'Completed' end def error? - @metadata[OT.hasStatus] == 'Error' + metadata[RDF::OT.hasStatus] == 'Error' end - def load_metadata - if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - result = RestClientWrapper.get(@uri, {:accept => 'application/x-yaml'}, nil, false) - @metadata = YAML.load result.to_s - @http_code = result.code - else - @metadata = Parser::Owl::Generic.new(@uri).load_metadata - @http_code = RestClientWrapper.get(uri, {:accept => 'application/rdf+xml'}, nil, false).code - end - raise "could not load task metadata for task "+@uri.to_s if @metadata==nil || @metadata.size==0 - end - - # create is private now, use OpenTox::Task.as_task - #def self.create( params ) - #task_uri = RestClientWrapper.post(CONFIG[:services]["opentox-task"], params, {}, false).to_s - #Task.find(task_uri.chomp) - #end - -=begin - def self.from_data(data, content_type, code, base_uri) - task = Task.new(nil) - task.http_code = code - task.reload_from_data(data, content_type, base_uri) - return task - end - - def reload( accept_header=nil ) - unless accept_header - if (CONFIG[:yaml_hosts].include?(URI.parse(uri).host)) - accept_header = "application/x-yaml" - else - accept_header = 'application/rdf+xml' - end - end - result = RestClientWrapper.get(uri, {:accept => accept_header}, false)#'application/x-yaml'}) - @http_code = result.code - reload_from_data(result, result.content_type, uri) - end - - def reload_from_data( data, content_type, base_uri ) - case content_type - when /yaml/ - task = YAML.load data - TASK_ATTRIBS.each do |a| - raise "task yaml data invalid, key missing: "+a.to_s unless task.has_key?(a) - send("#{a.to_s}=".to_sym,task[a]) - end - when /application\/rdf\+xml/ - owl = OpenTox::Owl.from_data(data,base_uri,"Task") - self.uri = owl.uri - (TASK_ATTRIBS-[:uri]).each{|a| self.send("#{a.to_s}=".to_sym, owl.get(a.to_s))} - else - raise "content type for tasks not supported: "+content_type.to_s - end - raise "uri is nil after loading" unless @uri and @uri.to_s.strip.size>0 - end -=end - # waits for a task, unless time exceeds or state is no longer running - # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @param [optional,Numeric] dur seconds pausing before cheking again for completion - def wait_for_completion( waiting_task=nil, dur=0.3) - - waiting_task.waiting_for(self.uri) if waiting_task + def wait_for_completion(dur=0.3) due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION - LOGGER.debug "start waiting for task "+@uri.to_s+" at: "+Time.new.to_s+", waiting at least until "+due_to_time.to_s - - load_metadata # for extremely fast tasks - check_state while self.running? - sleep dur - load_metadata - # if another (sub)task is waiting for self, set progress accordingly - waiting_task.progress(@metadata[OT.percentageCompleted].to_f) if waiting_task - check_state - if (Time.new > due_to_time) - raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" - end - end - waiting_task.waiting_for(nil) if waiting_task - LOGGER.debug "Task '"+@metadata[OT.hasStatus].to_s+"': "+@uri.to_s+", Result: "+@metadata[OT.resultURI].to_s - end - - # updates percentageCompleted value (can only be increased) - # task has to be running - # @param [Numeric] pct value between 0 and 100 - def progress(pct) - #puts "task := "+pct.to_s - raise "no numeric >= 0 and <= 100 : '"+pct.to_s+"'" unless pct.is_a?(Numeric) and pct>=0 and pct<=100 - if (pct > @metadata[OT.percentageCompleted] + 0.0001) - RestClientWrapper.put(File.join(@uri,'Running'),{:percentageCompleted => pct}) - load_metadata - end - end - - def waiting_for(task_uri) - RestClientWrapper.put(File.join(@uri,'Running'),{:waiting_for => task_uri}) - end - - private - VALID_TASK_STATES = ["Cancelled", "Completed", "Running", "Error"] - - def check_state - begin - raise "illegal task state, invalid status: '"+@metadata[OT.hasStatus].to_s+"'" unless - @metadata[OT.hasStatus] unless VALID_TASK_STATES.include?(@metadata[OT.hasStatus]) - raise "illegal task state, task is completed, resultURI is no URI: '"+@metadata[OT.resultURI].to_s+ - "'" unless @metadata[OT.resultURI] and @metadata[OT.resultURI].to_s.uri? if completed? - if @http_code == 202 - raise "#{@uri}: illegal task state, code is 202, but hasStatus is not Running: '"+@metadata[OT.hasStatus]+"'" unless running? - elsif @http_code == 201 - # ignore hasStatus - # raise "#{@uri}: illegal task state, code is 201, but hasStatus is not Completed: '"+@metadata[OT.hasStatus]+"'" unless completed? - raise "#{@uri}: illegal task state, code is 201, resultURI is no task-URI: '"+@metadata[OT.resultURI].to_s+ - "'" unless @metadata[OT.resultURI] and @metadata[OT.resultURI].to_s.uri? - end - rescue => ex - raise OpenTox::BadRequestError.new ex.message+" (task-uri:"+@uri+")" + raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) end end end - # Convenience class to split a (sub)task into subtasks - # - # example: - # a crossvalidation is split into creating datasets and performing the validations - # creating the dataset is 1/3 of the work, perform the validations is 2/3: - # Task.as_task do |task| - # create_datasets( SubTask.new(task, 0, 33) ) - # perfom_validations( SubTask.new(task, 33, 100) ) - # end - # inside the create_datasets / perform_validations you can use subtask.progress() - # with vals from 0-100 - # - # note that you can split a subtask into further subtasks - class SubTask - - def initialize(task, min, max) - raise "not a task or subtask" if task!=nil and !(task.is_a?(Task) or task.is_a?(SubTask)) - raise "invalid max ("+max.to_s+"), min ("+min.to_s+") params" unless - min.is_a?(Numeric) and max.is_a?(Numeric) and min >= 0 and max <= 100 and max > min - @task = task - @min = min - @max = max - @delta = max - min - end - - # convenience method to handle null tasks - def self.create(task, min, max) - if task - SubTask.new(task, min, max) - else - nil - end - end - - def waiting_for(task_uri) - @task.waiting_for(task_uri) - end - - def progress(pct) - raise "no numeric >= 0 and <= 100 : '"+pct.to_s+"'" unless pct.is_a?(Numeric) and pct>=0 and pct<=100 - #puts "subtask := "+pct.to_s+" -> task := "+(@min + @delta * pct.to_f * 0.01).to_s - @task.progress( @min + @delta * pct.to_f * 0.01 ) - end - - def running?() - @task.running? - end - end - - - # The David Gallagher feature: - # a fake sub task to keep the progress bar movin for external jobs - # note: param could be a subtask - # - # usage (for a call that is normally finished in under 60 seconds): - # fsk = FakeSubTask.new(task, 60) - # external_lib_call.start - # external_lib_call.wait_until_finished - # fsk.finished - # - # what happens: - # the FakeSubTask updates the task.progress each second until - # runtime is up or the finished mehtod is called - # - # example if the param runtime is too low: - # 25% .. 50% .. 75% .. 100% .. 100% .. 100% .. 100% .. 100% - # example if the param runtime is too high: - # 5% .. 10% .. 15% .. 20% .. 25% .. 30% .. 35% .. 100% - # the latter example is better (keep the bar movin!) - # -> better make a conservative runtime estimate - class FakeSubTask - - def initialize(task, runtime) - @task = task - @thread = Thread.new do - timeleft = runtime - while (timeleft > 0 and @task.running?) - sleep 1 - timeleft -= 1 - @task.progress( (runtime - timeleft) / runtime.to_f * 100 ) - end - end - end - - # convenience method to handle null tasks - def self.create(task, runtime) - if task - FakeSubTask.new(task, runtime) - else - nil - end - end - - def finished - @thread.exit - @task.progress(100) if @task.running? - end - end - end diff --git a/lib/to-html.rb b/lib/to-html.rb deleted file mode 100644 index 04fa158..0000000 --- a/lib/to-html.rb +++ /dev/null @@ -1,109 +0,0 @@ -OT_LOGO = File.join(CONFIG[:services]["opentox-validation"],"resources/ot-logo.png") - -class String - - # encloses URI in text with with link tag - # @return [String] new text with marked links - def link_urls - self.gsub(/(?i)http(s?):\/\/[^\r\n\s']*/, '\0') - end -end - -module OpenTox - - # produces a html page for making web services browser friendly - # format of text (=string params) is preserved (e.g. line breaks) - # urls are marked as links - # @example post params: - # [ [ [:mandatory_param_1], [:mandatory_param_2], [:optional_param,"default_value"] ], - # [ [:alteranative_mandatory_param_1], [:alteranative_mandatory_param_2] ] - # ] - # @param [String] text this is the actual content, - # @param [optional,String] related_links info on related resources - # @param [optional,String] description general info - # @param [optional,Array] post_params, array of arrays containing info on POST operation, see example - # @return [String] html page - def self.text_to_html( text, subjectid=nil, related_links=nil, description=nil, post_params=nil ) - - # TODO add title as parameter - title = nil #$sinatra.url_for($sinatra.request.env['PATH_INFO'], :full) if $sinatra - html = "" - html += ""+title+"" if title - html += "<\/img>" - - if AA_SERVER - user = OpenTox::Authorization.get_user(subjectid) if subjectid - html += "

" - unless user - html += "You are currently not signed in to "+$url_provider.url_for("",:full)+ - ", sign in" - else - html += "You are signed in as '#{user}' to "+$url_provider.url_for("",:full)+ - ", sign out" - end - html += "

" - end - - html += "

Description

"+description.link_urls+"

" if description - html += "

Related links

"+related_links.link_urls+"

" if related_links - if post_params - html += "

POST parameters

" - count = 0 - post_params.each do |p| - html += "

alternatively:

" if count > 0 - html += "

" - p.each do |k,v| - html += "" - end - html += "
paramdefault_value
"+k.to_s+""+(v!=nil ? v.to_s : "mandatory")+"

" - count += 1 - end - end - html += "

Content

" if description || related_links - html += "

" - html += text.link_urls - html += "

" - html - end - - def self.sign_in( msg=nil ) - html = "Login" - html += "
" - html += "

" - html += msg+"\n\n" if msg - html += "Please sign in to "+$url_provider.url_for("",:full)+"\n\n" - html += "" - html += ""+ - ""+ - #""+ - "" - html += "
user:
password:

" - html - end -end - -get '/sign_out/?' do - response.set_cookie("subjectid",{:value=>nil}) - content_type "text/html" - content = "Sucessfully signed out from "+$url_provider.url_for("",:full) - OpenTox.text_to_html(content) -end - -get '/sign_in/?' do - content_type "text/html" - OpenTox.sign_in -end - -post '/sign_in/?' do - subjectid = OpenTox::Authorization.authenticate(params[:user], params[:password]) - if (subjectid) - response.set_cookie("subjectid",{:value=>subjectid}) - content_type "text/html" - content = "Sucessfully signed in as '"+params[:user]+"' to "+$url_provider.url_for("",:full) - OpenTox.text_to_html(content,subjectid) - else - content_type "text/html" - OpenTox.sign_in("Login failed, please try again") - end -end - diff --git a/lib/validation.rb b/lib/validation.rb deleted file mode 100644 index d7a337c..0000000 --- a/lib/validation.rb +++ /dev/null @@ -1,313 +0,0 @@ -module OpenTox - class Validation - include OpenTox - - # find validation, raises error if not found - # @param [String] uri - # @param [String,optional] subjectid - # @return [OpenTox::Validation] - def self.find( uri, subjectid=nil ) - val = Validation.new(uri) - val.load_metadata( subjectid ) - val - end - - # returns a filtered list of validation uris - # @param [Hash,optional] params, validation-params to filter the uris (could be model, training_dataset, ..) - # @return [Array] - def self.list( params={} ) - filter_string = "" - params.each do |k,v| - filter_string = "?" if filter_string.length==0 - filter_string += k.to_s+"="+v - end - (OpenTox::RestClientWrapper.get(CONFIG[:services]["opentox-validation"]+filter_string).split("\n")) - end - - # creates a training test split validation, waits until it finishes, may take some time - # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,split_ratio(0.67),random_seed(1)) - # @param [String,optional] subjectid - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::Validation] - def self.create_training_test_split( params, subjectid=nil, waiting_task=nil ) - params[:subjectid] = subjectid if subjectid - uri = OpenTox::RestClientWrapper.post( File.join(CONFIG[:services]["opentox-validation"],"training_test_split"), - params,{:content_type => "text/uri-list"},waiting_task ) - Validation.new(uri) - end - - # looks for report for this validation, creates a report if no report is found - # @param [String,optional] subjectid - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [String] report uri - def find_or_create_report( subjectid=nil, waiting_task=nil ) - @report = ValidationReport.find_for_validation(@uri, subjectid) unless @report - @report = ValidationReport.create(@uri, subjectid, waiting_task) unless @report - @report.uri - end - - # creates a validation object from crossvaldiation statistics, raise error if not found - # (as crossvaldiation statistics are returned as an average valdidation over all folds) - # @param [String] crossvalidation uri - # @param [String,optional] subjectid - # @return [OpenTox::Validation] - def self.from_cv_statistics( crossvalidation_uri, subjectid=nil ) - find( File.join(crossvalidation_uri, 'statistics'),subjectid ) - end - - # loads metadata via yaml from validation object - # fields (like for example the validated model) can be acces via validation.metadata[OT.model] - def load_metadata( subjectid=nil ) - @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid, :accept => "application/x-yaml"})) - end - - # PENDING: creates summary as used for ToxCreate - def summary - if @metadata[OT.classificationStatistics] - res = { - :nr_predictions => @metadata[OT.numInstances].to_i - @metadata[OT.numUnpredicted].to_i, - :correct_predictions => @metadata[OT.classificationStatistics][OT.percentCorrect], - :weighted_area_under_roc => @metadata[OT.classificationStatistics][OT.weightedAreaUnderRoc], - } - @metadata[OT.classificationStatistics][OT.classValueStatistics].each do |s| - if s[OT.classValue].to_s=="true" - res[:true_positives] = s[OT.numTruePositives] - res[:false_positives] = s[OT.numFalsePositives] - res[:true_negatives] = s[OT.numTrueNegatives] - res[:false_negatives] = s[OT.numFalseNegatives] - res[:sensitivity] = s[OT.truePositiveRate] - res[:specificity] = s[OT.trueNegativeRate] - break - end - end - res - elsif @metadata[OT.regressionStatistics] - { - :nr_predictions => @metadata[OT.numInstances].to_i - @metadata[OT.numUnpredicted].to_i, - :r_square => @metadata[OT.regressionStatistics][OT.rSquare], - :root_mean_squared_error => @metadata[OT.regressionStatistics][OT.rootMeanSquaredError], - :mean_absolute_error => @metadata[OT.regressionStatistics][OT.meanAbsoluteError], - } - end - end - end - - class Crossvalidation - include OpenTox - - attr_reader :report - - # find crossvalidation, raises error if not found - # @param [String] uri - # @param [String,optional] subjectid - # @return [OpenTox::Crossvalidation] - def self.find( uri, subjectid=nil ) - cv = Crossvalidation.new(uri) - cv.load_metadata( subjectid ) - cv - end - - # returns a filtered list of crossvalidation uris - # @param [Hash,optional] params, crossvalidation-params to filter the uris (could be algorithm, dataset, ..) - # @return [Array] - def self.list( params={} ) - filter_string = "" - params.each do |k,v| - filter_string = "?" if filter_string.length==0 - filter_string += k.to_s+"="+v - end - (OpenTox::RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"],"crossvalidation")+filter_string).split("\n")) - end - - # creates a crossvalidations, waits until it finishes, may take some time - # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,num_folds(10),random_seed(1),stratified(false)) - # @param [String,optional] subjectid - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::Crossvalidation] - def self.create( params, subjectid=nil, waiting_task=nil ) - params[:subjectid] = subjectid if subjectid - uri = OpenTox::RestClientWrapper.post( File.join(CONFIG[:services]["opentox-validation"],"crossvalidation"), - params,{:content_type => "text/uri-list"},waiting_task ) - Crossvalidation.new(uri) - end - - # looks for report for this crossvalidation, creates a report if no report is found - # @param [String,optional] subjectid - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [String] report uri - def find_or_create_report( subjectid=nil, waiting_task=nil ) - @report = CrossvalidationReport.find_for_crossvalidation(@uri, subjectid) unless @report - @report = CrossvalidationReport.create(@uri, subjectid, waiting_task) unless @report - @report.uri - end - - # loads metadata via yaml from crossvalidation object - # fields (like for example the validations) can be acces via validation.metadata[OT.validation] - def load_metadata( subjectid=nil ) - @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid, :accept => "application/x-yaml"})) - end - - # PENDING: creates summary as used for ToxCreate - def summary( subjectid=nil ) - Validation.from_cv_statistics( @uri, subjectid ).summary - end - end - - class ValidationReport - include OpenTox - - # finds ValidationReport via uri, raises error if not found - # @param [String] uri - # @param [String,optional] subjectid - # @return [OpenTox::ValidationReport] - def self.find( uri, subjectid=nil ) - OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) - rep = ValidationReport.new(uri) - rep.load_metadata( subjectid ) - rep - end - - # finds ValidationReport for a particular validation - # @param [String] crossvalidation uri - # @param [String,optional] subjectid - # @return [OpenTox::ValidationReport] nil if no report found - def self.find_for_validation( validation_uri, subjectid=nil ) - uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], - "/report/validation?validation="+validation_uri), {:subjectid => subjectid}).chomp.split("\n") - uris.size==0 ? nil : ValidationReport.new(uris[-1]) - end - - # creates a validation report via validation - # @param [String] validation uri - # @param [String,optional] subjectid - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::ValidationReport] - def self.create( validation_uri, subjectid=nil, waiting_task=nil ) - uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/validation"), - { :validation_uris => validation_uri, :subjectid => subjectid }, {}, waiting_task ) - ValidationReport.new(uri) - end - - end - - class CrossvalidationReport - include OpenTox - - # finds CrossvalidationReport via uri, raises error if not found - # @param [String] uri - # @param [String,optional] subjectid - # @return [OpenTox::CrossvalidationReport] - def self.find( uri, subjectid=nil ) - OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) - rep = CrossvalidationReport.new(uri) - rep.load_metadata( subjectid ) - rep - end - - # finds CrossvalidationReport for a particular crossvalidation - # @param [String] crossvalidation uri - # @param [String,optional] subjectid - # @return [OpenTox::CrossvalidationReport] nil if no report found - def self.find_for_crossvalidation( crossvalidation_uri, subjectid=nil ) - uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], - "/report/crossvalidation?crossvalidation="+crossvalidation_uri), {:subjectid => subjectid}).chomp.split("\n") - uris.size==0 ? nil : CrossvalidationReport.new(uris[-1]) - end - - # creates a crossvalidation report via crossvalidation - # @param [String] crossvalidation uri - # @param [String,optional] subjectid - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::CrossvalidationReport] - def self.create( crossvalidation_uri, subjectid=nil, waiting_task=nil ) - uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/crossvalidation"), - { :validation_uris => crossvalidation_uri, :subjectid => subjectid }, {}, waiting_task ) - CrossvalidationReport.new(uri) - end - end - - - class AlgorithmComparisonReport - include OpenTox - - # finds AlgorithmComparisonReport via uri, raises error if not found - # @param [String] uri - # @param [String,optional] subjectid - # @return [OpenTox::CrossvalidationReport] - def self.find( uri, subjectid=nil ) - OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) - rep = AlgorithmComparisonReport.new(uri) - rep.load_metadata( subjectid ) - rep - end - - # finds AlgorithmComparisonReport for a particular crossvalidation - # @param [String] crossvalidation uri - # @param [String,optional] subjectid - # @return [OpenTox::AlgorithmComparisonReport] nil if no report found - def self.find_for_crossvalidation( crossvalidation_uri, subjectid=nil ) - uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], - "/report/algorithm_comparison?crossvalidation="+crossvalidation_uri), {:subjectid => subjectid}).chomp.split("\n") - uris.size==0 ? nil : AlgorithmComparisonReport.new(uris[-1]) - end - - # creates a crossvalidation report via crossvalidation - # @param [Hash] crossvalidation uri_hash, see example - # @param [String,optional] subjectid - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::AlgorithmComparisonReport] - # example for hash: - # { :lazar-bbrc => [ http://host/validation/crossvalidation/x1, http://host/validation/crossvalidation/x2 ], - # :lazar-last => [ http://host/validation/crossvalidation/xy, http://host/validation/crossvalidation/xy ] } - def self.create( crossvalidation_uri_hash, subjectid=nil, waiting_task=nil ) - identifier = [] - validation_uris = [] - crossvalidation_uri_hash.each do |id, uris| - uris.each do |uri| - identifier << id - validation_uris << uri - end - end - uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/report/algorithm_comparison"), - { :validation_uris => validation_uris.join(","), :identifier => identifier.join(","), :subjectid => subjectid }, {}, waiting_task ) - AlgorithmComparisonReport.new(uri) - end - end - - class QMRFReport - include OpenTox - - # finds QMRFReport, raises Error if not found - # @param [String] uri - # @param [String,optional] subjectid - # @return [OpenTox::QMRFReport] - def self.find( uri, subjectid=nil ) - # PENDING load crossvalidation data? - OpenTox::RestClientWrapper.get(uri,{:subjectid => subjectid}) - QMRFReport.new(uri) - end - - # finds QMRF report for a particular model - # @param [String] model_uri - # @param [String,optional] subjectid - # @return [OpenTox::QMRFReport] nil if no report found - def self.find_for_model( model_uri, subjectid=nil ) - uris = RestClientWrapper.get(File.join(CONFIG[:services]["opentox-validation"], - "/reach_report/qmrf?model="+model_uri), {:subjectid => subjectid}).chomp.split("\n") - uris.size==0 ? nil : QMRFReport.new(uris[-1]) - end - - # creates a qmrf report via model - # @param [String] model_uri - # @param [String,optional] subjectid - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::QMRFReport] - def self.create( model_uri, subjectid=nil, waiting_task=nil ) - uri = RestClientWrapper.post(File.join(CONFIG[:services]["opentox-validation"],"/reach_report/qmrf"), - { :model_uri => model_uri, :subjectid => subjectid }, {}, waiting_task ) - QMRFReport.new(uri) - end - end - -end - diff --git a/opentox-ruby.gemspec b/opentox-ruby.gemspec deleted file mode 100644 index e62eec5..0000000 --- a/opentox-ruby.gemspec +++ /dev/null @@ -1,157 +0,0 @@ -# Generated by jeweler -# DO NOT EDIT THIS FILE DIRECTLY -# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec' -# -*- encoding: utf-8 -*- - -Gem::Specification.new do |s| - s.name = %q{opentox-ruby} - s.version = "2.0.0" - - s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= - s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] - s.date = %q{2011-05-23} - s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} - s.email = %q{helma@in-silico.ch} - s.executables = ["opentox-install-debian.sh", "opentox-install-ubuntu.sh"] - s.extra_rdoc_files = [ - "LICENSE", - "README.markdown" - ] - s.files = [ - "LICENSE", - "README.markdown", - "Rakefile", - "VERSION", - "bin/opentox-install-debian.sh", - "bin/opentox-install-ubuntu.sh", - "lib/algorithm.rb", - "lib/authorization.rb", - "lib/compound.rb", - "lib/config/config_ru.rb", - "lib/dataset.rb", - "lib/environment.rb", - "lib/error.rb", - "lib/feature.rb", - "lib/helper.rb", - "lib/model.rb", - "lib/ontology.rb", - "lib/opentox-ruby.rb", - "lib/opentox.owl", - "lib/opentox.rb", - "lib/overwrite.rb", - "lib/parser.rb", - "lib/policy.rb", - "lib/rest_client_wrapper.rb", - "lib/serializer.rb", - "lib/spork.rb", - "lib/task.rb", - "lib/templates/default_guest_policy.xml", - "lib/templates/default_policy.xml", - "lib/to-html.rb", - "lib/validation.rb" - ] - s.homepage = %q{http://github.com/helma/opentox-ruby} - s.require_paths = ["lib"] - s.rubygems_version = %q{1.5.2} - s.summary = %q{Ruby wrapper for the OpenTox REST API} - - if s.respond_to? :specification_version then - s.specification_version = 3 - - if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 0"]) - s.add_runtime_dependency(%q, [">= 3"]) - s.add_runtime_dependency(%q, ["~> 0.4.0"]) - s.add_development_dependency(%q, [">= 0"]) - else - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 3"]) - s.add_dependency(%q, ["~> 0.4.0"]) - s.add_dependency(%q, [">= 0"]) - end - else - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 0"]) - s.add_dependency(%q, [">= 3"]) - s.add_dependency(%q, ["~> 0.4.0"]) - s.add_dependency(%q, [">= 0"]) - end -end - diff --git a/test/all.rb b/test/all.rb deleted file mode 100644 index 91a994c..0000000 --- a/test/all.rb +++ /dev/null @@ -1,17 +0,0 @@ -#require 'rubygems' -#require 'test/unit' -#require 'opentox-ruby-minimal' -require './rest.rb' -require './ruby-api.rb' -require './feature.rb' -require './compound.rb' -#require './authorization.rb' -#require './dataset.rb' -#require './parser.rb' -#require './task.rb' -#require './algorithm.rb' -#require './fminer.rb' -#require './lazar.rb' -#require './validation.rb' -#require './toxcreate.rb' -#require './transform.rb' diff --git a/test/compound.rb b/test/compound.rb index 35fc514..da77480 100644 --- a/test/compound.rb +++ b/test/compound.rb @@ -1,7 +1,6 @@ -$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' ) -require 'rubygems' -require 'opentox-ruby-minimal.rb' require 'test/unit' +$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') +require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' class CompoundTest < Test::Unit::TestCase diff --git a/test/data/CPDBAS_v5c_1547_29Apr2008part.sdf b/test/data/CPDBAS_v5c_1547_29Apr2008part.sdf new file mode 100644 index 0000000..d7eb740 --- /dev/null +++ b/test/data/CPDBAS_v5c_1547_29Apr2008part.sdf @@ -0,0 +1,13553 @@ + + + + 14 16 0 0 0 0 0 0 0 0 1 V2000 + 7.3615 -3.7543 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2131 -3.0918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2131 -1.7594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0573 -1.0969 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9089 -1.7594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9089 -3.0918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0573 -3.7543 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6428 -3.5041 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8624 -2.4219 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5374 -2.2894 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.0748 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7803 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1054 -0.1325 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6428 -1.3471 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 2 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 14 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 +M END +> +20001 + +> +1 + +> +20001 + +> +1_CPDBAS_v5c + +> +C11H9N3 + +> +183.2122 + +> +defined organic + +> +parent + +> +tested chemical + +> +A-alpha-C + +> +26148-68-5 + +> +single chemical compound + +> +blank + +> +9H-pyrido[2,3-b]indol-2-amine + +> +NC1C=CC2=C(N=1)NC3=CC=CC=C23 + +> +NC1C=CC2=C(N=1)NC3=CC=CC=C23 + +> +InChI=1/C11H9N3/c12-10-6-5-8-7-3-1-2-4-9(7)13-11(8)14-10/h1-6H,(H3,12,13,14)/f/h13H,12H2 + +> +FJTNLJLPLJDTRM-DXMPFREMCP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +active + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +49.8 + +> +0.271815959854202 + +> +35 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; vascular system + +> +liver; vascular system + +> +blank + +> +active + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +active + +> +active + +> +multisite active; multisex active + +> +blank + +> +blank + +> +http://potency.berkeley.edu/chempages/A-alpha-C.html + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 2 V2000 + 3.4800 -1.1526 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4800 -2.4613 0.0000 N 0 5 0 0 0 0 0 0 0 0 0 0 + 2.3349 -3.1008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3349 -0.4610 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1749 -2.4613 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1749 -1.1526 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1344 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8110 -1.1526 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3349 -4.4392 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4359 -2.2159 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 7 2 0 0 0 0 + 1 8 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 9 2 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 10 1 0 0 0 0 +M CHG 2 2 -1 11 1 +M END +> +40770 + +> +10606 + +> +30606 + +> +2_CPDBAS_v5c + +> +C4H4KNO4S + +> +201.2422 + +> +defined organic + +> +salt K + +> +tested chemical + +> +Acesulfame-K + +> +55589-62-3 + +> +single chemical compound + +> +parent [33665-90-6] + +> +potassium 6-methyl-4-oxo-4H-1,2,3-oxathiazin-3-ide 2,2-dioxide + +> +O=S([N-]C1=O)(OC(C)=C1)=O.[K+] + +> +O=S(NC1=O)(OC(C)=C1)=O + +> +InChI=1/C4H5NO4S.K/c1-3-2-4(6)5-10(7,8)9-3;/h2H,1H3,(H,5,6);/q;+1/p-1/fC4H4NO4S.K/q-1;m + +> +WBZFUFAFFUEMEI-COHKJUPYCC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +Mouse added v5a; chemical added v5a + +> +http://potency.berkeley.edu/chempages/ACESULFAME-K.html + +$$$$ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 +M END +> +20002 + +> +2 + +> +39224 + +> +3_CPDBAS_v5c + +> +C2H4O + +> +44.0526 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetaldehyde + +> +75-07-0 + +> +single chemical compound + +> +acetaldehyde + +> +CC=O + +> +CC=O + +> +InChI=1/C2H4O/c1-2-3/h2H,1H3 + +> +IKHGUXGNUITLKF-UHFFFAOYAB + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; hamster + +> +inactive + +> +153 + +> +3.4731207692622 + +> +20 + +> +TD50 is harmonic mean of more than one positive test + +> +nasal cavity + +> +nasal cavity + +> +active + +> +565 + +> +12.8255766969486 + +> +1 + +> +TD50 is harmonic mean of more than one positive test + +> +nasal cavity; oral cavity + +> +oral cavity + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +http://potency.berkeley.edu/chempages/ACETALDEHYDE.html + +$$$$ + + + + 7 6 0 0 0 0 0 0 0 0 1 V2000 + 5.7637 -1.9942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6110 -1.3314 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4582 -1.9942 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3055 -1.3314 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3055 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1527 -1.9942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3314 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 2 0 0 0 0 +M END +> +20003 + +> +3 + +> +39225 + +> +4_CPDBAS_v5c + +> +C4H8N2O + +> +100.12 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetaldehyde methylformylhydrazone + +> +16568-02-8 + +> +single chemical compound + +> +N'-[(1E)-ethylidene]-N-methylformic hydrazide + +> +CC=NN(C)C=O + +> +CC=NN(C)C=O + +> +InChI=1/C4H8N2O/c1-3-5-6(2)4-7/h3-4H,1-2H3/b5-3+ + +> +IMAGWKUTFZRWSB-HWKANZROBR + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +inactive + +> +2.51 + +> +2.50699161006792E-02 + +> +46 + +> +TD50 is harmonic mean of more than one positive test + +> +lung; preputial gland + +> +clitoral gland; lung; stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/ACETALDEHYDE%20METHYLFORMYLHYDRAZONE.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3061 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +20004 + +> +4 + +> +20004 + +> +5_CPDBAS_v5c + +> +C2H5NO + +> +59.0672 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetaldoxime + +> +107-29-9 + +> +single chemical compound + +> +(1E)-acetaldehyde oxime + +> +CC=NO + +> +CC=NO + +> +InChI=1/C2H5NO/c1-2-3-4/h2,4H,1H3/b3-2+ + +> +FZENGILVLUJGJX-NSCUHMNNBP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/ACETALDOXIME.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 1.9950 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3292 -1.1518 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1518 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 +M END +> +20005 + +> +5 + +> +20005 + +> +6_CPDBAS_v5c + +> +C2H5NO + +> +59.0672 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetamide + +> +60-35-5 + +> +single chemical compound + +> +acetamide + +> +CC(=O)N + +> +CC(=O)N + +> +InChI=1/C2H5NO/c1-2(3)4/h1H3,(H2,3,4)/f/h3H2 + +> +DLFVBJFMPXGRIB-ZZOWFUDICC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +180 + +> +3.04737654739009 + +> +21 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +3010 + +> +50.9589078202454 + +> +9 + +> +hematopoietic system + +> +no positive results + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +http://potency.berkeley.edu/chempages/ACETAMIDE.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 3.8512 -1.8702 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9346 -2.8163 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5407 -0.5987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1522 -2.2102 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6410 -2.4689 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2397 -0.2587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0983 -1.2862 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2936 -1.2049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7583 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3919 -1.6114 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.8575 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 3 6 2 0 0 0 0 + 4 7 1 0 0 0 0 + 5 8 2 0 0 0 0 + 6 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 10 2 0 0 0 0 + 8 11 1 0 0 0 0 +M END +> +20006 + +> +6 + +> +20006 + +> +7_CPDBAS_v5c + +> +C8H9NO2 + +> +151.1626 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetaminophen + +> +103-90-2 + +> +single chemical compound + +> +N-(4-hydroxyphenyl)acetamide + +> +C1(=CC=C(C=C1)O)NC(C)=O + +> +C1(=CC=C(C=C1)O)NC(C)=O + +> +InChI=1/C8H9NO2/c1-6(10)9-7-2-4-8(11)5-3-7/h2-5,11H,1H3,(H,9,10)/f/h9H + +> +RZVAJINKPMORJF-BGGKNDAXCW + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +495 + +> +3.27461951567385 + +> +20 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; urinary bladder + +> +liver; urinary bladder + +> +active + +> +1620 + +> +10.7169365967508 + +> +17 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 394; final call in CPDB differs due to additional data + +> +http://potency.berkeley.edu/chempages/ACETAMINOPHEN.html + +$$$$ + + + + 22 23 0 0 0 0 0 0 0 0 1 V2000 + 5.1434 -4.1211 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9933 -3.4609 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8432 -2.7900 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3224 -4.6110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9913 -4.6110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3311 -5.7610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9913 -6.9111 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3224 -6.9111 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9933 -5.7610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3311 -8.0718 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9913 -9.2219 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -8.0718 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6642 -2.3002 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9953 -2.3002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6555 -3.4609 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6555 -1.1501 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9866 -1.1501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6575 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9780 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6489 -1.1501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9780 -2.3002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6575 -2.3002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 2 13 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 14 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 22 1 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 1 0 0 0 0 + 21 22 1 0 0 0 0 +M END +> +20007 + +> +7 + +> +20007 + +> +8_CPDBAS_v5c + +> +C15H20N2O4S + +> +324.3953 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetohexamide + +> +968-81-0 + +> +single chemical compound + +> +4-acetyl-N-[(cyclohexylamino)carbonyl]benzenesulfonamide + +> +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2 + +> +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2 + +> +InChI=1/C15H20N2O4S/c1-11(18)12-7-9-14(10-8-12)22(20,21)17-15(19)16-13-5-3-2-4-6-13/h7-10,13H,2-6H2,1H3,(H2,16,17,19)/f/h16-17H + +> +VGZSUPCWNCWDAN-XQMQJMAZCC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 050 + +> +http://potency.berkeley.edu/chempages/ACETOHEXAMIDE.html + +$$$$ + + + + 18 19 0 0 0 0 0 0 0 0 2 V2000 + 11.1272 -2.0879 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1272 -0.7492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.2816 -2.7511 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9727 -2.7511 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8182 -2.0879 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6760 -2.7511 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5286 -4.0652 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2268 -4.3477 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5636 -3.1932 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4601 -2.2107 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2372 -3.0581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3529 -4.0407 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1370 -3.5003 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2721 -2.1861 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5740 -1.9037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2896 -1.2896 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.6335 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6335 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 10 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 15 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 16 18 1 0 0 0 0 +M CHG 2 16 1 18 -1 +M END +> +20008 + +> +8 + +> +20008 + +> +9_CPDBAS_v5c + +> +C10H10N4O3S + +> +266.274 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetone[4-(5-nitro-2-furyl)-2-thiazolyl] hydrazone + +> +18523-69-8 + +> +single chemical compound + +> +propan-2-one [5-(5-nitrofuran-2-yl)-1,3-thiazol-2-yl]hydrazone + +> +C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-] + +> +C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-] + +> +InChI=1/C10H10N4O3S/c1-6(2)12-13-10-11-5-8(18-10)7-3-4-9(17-7)14(15)16/h3-5H,1-2H3,(H,11,13)/f/h13H + +> +CUWVNOSSZYUJAE-NDKGDYFDCK + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +6.05 + +> +2.27209566086062E-02 + +> +43 + +> +stomach + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/ACETONE[4-(5-NITRO-2-FURYL)-2-THIAZOLYL]HYDRAZONE.html + +$$$$ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.6600 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 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 + 1 2 1 0 0 0 0 + 2 3 3 0 0 0 0 +M END +> +20009 + +> +9 + +> +20009 + +> +10_CPDBAS_v5c + +> +C2H3N + +> +41.0519 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetonitrile + +> +75-05-8 + +> +single chemical compound + +> +acetonitrile + +> +CC#N + +> +CC#N + +> +InChI=1/C2H3N/c1-2-3/h1H3 + +> +WEVYAHXRMPXWCK-UHFFFAOYAJ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 447 + +> +http://potency.berkeley.edu/chempages/ACETONITRILE.html + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 3.4567 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -1.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3308 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 5 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +20010 + +> +10 + +> +20010 + +> +11_CPDBAS_v5c + +> +C3H7NO + +> +73.0938 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetoxime + +> +127-06-0 + +> +single chemical compound + +> +propan-2-one oxime + +> +CC(=NO)C + +> +CC(=NO)C + +> +InChI=1/C3H7NO/c1-3(2)4-5/h5H,1-2H3 + +> +PXAJQJMDEXJWFB-UHFFFAOYAK + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +12.1 + +> +0.165540716175654 + +> +34 + +> +liver + +> +no positive results + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/ACETOXIME.html + +$$$$ + + + + 16 17 0 0 0 0 0 0 0 0 1 V2000 + 1.1551 -0.6716 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9126 -2.6594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9126 -3.9935 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1751 -2.2475 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1751 -4.4054 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9541 -3.3309 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7575 -1.9968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7575 -4.6561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 -0.6716 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6024 -2.6594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6024 -3.9935 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 -1.9968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 -2.6594 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1551 -1.9968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 15 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 11 2 0 0 0 0 + 8 12 2 0 0 0 0 + 9 13 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 +M END +> +20011 + +> +11 + +> +39226 + +> +12_CPDBAS_v5c + +> +C12H12O4 + +> +220.2213 + +> +defined organic + +> +parent + +> +tested chemical + +> +1'-Acetoxysafrole + +> +34627-78-6 + +> +single chemical compound + +> +1-(1,3-benzodioxol-5-yl)prop-2-en-1-yl acetate + +> +O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C + +> +O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C + +> +InChI=1/C12H12O4/c1-3-10(16-8(2)13)9-4-5-11-12(6-9)15-7-14-11/h3-6,10H,1,7H2,2H3 + +> +TXUCQVJZBXYDKH-UHFFFAOYAY + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +25 + +> +0.113522170652884 + +> +35 + +> +TD50 is harmonic mean of more than one positive test + +> +stomach + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +http://potency.berkeley.edu/chempages/1'-ACETOXYSAFROLE.html + +$$$$ + + + + 13 13 0 0 0 0 0 0 0 0 1 V2000 + 2.6636 -2.3090 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9977 -1.1588 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6659 -1.1588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9953 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6526 -1.1588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9844 -1.1588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6503 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9844 -3.4592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6526 -3.4592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9820 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6479 -3.4592 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 12 1 0 0 0 0 + 10 11 2 0 0 0 0 + 12 13 1 0 0 0 0 +M END +> +20012 + +> +12 + +> +20012 + +> +13_CPDBAS_v5c + +> +C9H12N2O2 + +> +180.206 + +> +defined organic + +> +parent + +> +tested chemical + +> +N'-Acetyl-4-(hydroxymethyl) phenylhydrazine + +> +65734-38-5 + +> +single chemical compound + +> +N'-[4-(hydroxymethyl)phenyl]acetohydrazide + +> +N(NC(C)=O)C1=CC=C(C=C1)CO + +> +N(NC(C)=O)C1=CC=C(C=C1)CO + +> +InChI=1/C9H12N2O2/c1-7(13)10-11-9-4-2-8(6-12)3-5-9/h2-5,11-12H,6H2,1H3,(H,10,13)/f/h10H + +> +UFFJUAYKLIGSJF-KZFATGLACR + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +241 + +> +1.33735835654751 + +> +27 + +> +TD50 is harmonic mean of more than one positive test + +> +lung; vascular system + +> +lung; vascular system + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/N'-ACETYL-4-(HYDROXYMETHYL)PHENYLHYDRAZINE.html + +$$$$ + + + + 13 13 0 0 0 0 0 0 0 0 1 V2000 + 3.4560 -1.9979 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3040 -1.3292 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 -1.9979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3292 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 -3.3271 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6000 -1.3292 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7520 -1.9979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9040 -1.3292 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0560 -1.9979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0560 -3.3271 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9040 -3.9877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7520 -3.3271 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 6 13 2 0 0 0 0 + 7 8 2 0 0 0 0 + 7 12 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +20013 + +> +13 + +> +20013 + +> +14_CPDBAS_v5c + +> +C8H9N3O2 + +> +179.178 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Acetyl-2-isonicotinoylhydrazine + +> +1078-38-2 + +> +single chemical compound + +> +N'-acetylpyridine-4-carbohydrazide + +> +N(NC(C)=O)C(C1=CC=NC=C1)=O + +> +N(NC(C)=O)C(C1=CC=NC=C1)=O + +> +InChI=1/C8H9N3O2/c1-6(12)10-11-8(13)7-2-4-9-5-3-7/h2-5H,1H3,(H,10,12)(H,11,13)/f/h10-11H + +> +CVBGNAKQQUWBQV-PZWAIHAUCF + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +330 + +> +1.84174396410274 + +> +25 + +> +TD50 is harmonic mean of more than one positive test + +> +lung + +> +lung + +> +active + +> +active + +> +active + +> +multisex active + +> +http://potency.berkeley.edu/chempages/1-ACETYL-2-ISONICOTINOYLHYDRAZINE.html + +$$$$ + + + + 12 12 0 0 0 0 0 0 0 0 1 V2000 + 1.9922 -4.6067 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6563 -3.4580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9922 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6563 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9922 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9905 -1.1547 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6546 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9905 -3.4580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9827 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6641 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4580 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 +M END +> +20014 + +> +14 + +> +20014 + +> +15_CPDBAS_v5c + +> +C8H8O4 + +> +168.1488 + +> +defined organic + +> +parent + +> +tested chemical + +> +3-Acetyl-6-methyl-2,4-pyrandione + +> +520-45-6 + +> +single chemical compound + +> +tautomers + +> +3-acetyl-6-methyl-2H-pyran-2,4(3H)-dione + +> +O=C1C(C(=O)OC(=C1)C)C(=O)C + +> +O=C1C(C(=O)OC(=C1)C)C(=O)C + +> +InChI=1/C8H8O4/c1-4-3-6(10)7(5(2)9)8(11)12-4/h3,7H,1-2H3 + +> +PGRHXDWITVMQBC-UHFFFAOYAH + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/3-ACETYL-6-METHYL-2,4-PYRANDIONE.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 3.9907 -2.3079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6605 -2.3079 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9953 -1.1573 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6651 -1.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6558 -1.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9860 -1.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6511 -2.3079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9860 -3.4586 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6558 -3.4586 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 2 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 +M END +> +20015 + +> +15 + +> +20015 + +> +16_CPDBAS_v5c + +> +C8H10N2O + +> +150.1778 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Acetyl-2-phenylhydrazine + +> +114-83-0 + +> +single chemical compound + +> +N'-phenylacetohydrazide + +> +C1(NNC(C)=O)=CC=CC=C1 + +> +C1(NNC(C)=O)=CC=CC=C1 + +> +InChI=1/C8H10N2O/c1-7(11)9-10-8-5-3-2-4-6-8/h2-6,10H,1H3,(H,9,11)/f/h9H + +> +UICBCXONCUFSOI-BGGKNDAXCP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +active + +> +51.2 + +> +0.34092921856626 + +> +34 + +> +TD50 is harmonic mean of more than one positive test + +> +vascular system + +> +vascular system + +> +active + +> +active + +> +active + +> +multisex active + +> +http://potency.berkeley.edu/chempages/1-ACETYL-2-PHENYLHYDRAZINE.html + +$$$$ + + + + 16 17 0 0 0 0 0 0 0 0 1 V2000 + 1.9954 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3269 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1473 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9954 -2.3046 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3223 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9907 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3176 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9861 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3176 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9907 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3130 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9814 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3083 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9768 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3083 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9814 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 8 11 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +20016 + +> +16 + +> +39243 + +> +17_CPDBAS_v5c + +> +C14H13NO + +> +211.2628 + +> +defined organic + +> +parent + +> +tested chemical + +> +4-Acetylaminobiphenyl + +> +4075-79-0 + +> +single chemical compound + +> +N-biphenyl-4-ylacetamide + +> +CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2 + +> +CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2 + +> +InChI=1/C14H13NO/c1-11(16)15-14-9-7-13(8-10-14)12-5-3-2-4-6-12/h2-10H,1H3,(H,15,16)/f/h15H + +> +SVLDILRDQOVJED-YAQRNVERCM + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +1.18 + +> +5.58546038393887E-03 + +> +49 + +> +mammary gland + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/4-ACETYLAMINOBIPHENYL.html + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 8.3884 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7257 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3884 -4.6052 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3920 -3.4560 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7293 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3955 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5064 -3.2883 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2900 -2.7514 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0737 -3.2883 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.5081 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1426 -1.1828 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3505 -0.6459 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4326 -1.4260 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7328 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3955 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7293 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3920 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 17 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 14 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 13 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 +M END +> +20017 + +> +17 + +> +20017 + +> +18_CPDBAS_v5c + +> +C15H13NO + +> +223.2738 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Acetylaminofluorene + +> +28314-03-6 + +> +single chemical compound + +> +N-9H-fluoren-1-ylacetamide + +> +CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1 + +> +CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1 + +> +InChI=1/C15H13NO/c1-10(17)16-15-8-4-7-13-12-6-3-2-5-11(12)9-14(13)15/h2-8H,9H2,1H3,(H,16,17)/f/h16H + +> +POECHIXSIXBYKI-WYUMXYHSCQ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/1-ACETYLAMINOFLUORENE.html + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 5.7640 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0213 -1.3540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8046 -2.4275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1296 -2.2921 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6712 -1.0735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8878 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5629 -0.1451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0213 -3.5106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7640 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6035 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4526 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4526 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6035 -1.1025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3017 -3.7621 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 -1.7698 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 13 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 14 1 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 17 2 0 0 0 0 +M END +> +20018 + +> +18 + +> +39227 + +> +19_CPDBAS_v5c + +> +C15H13NO + +> +223.2698 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Acetylaminofluorene + +> +53-96-3 + +> +single chemical compound + +> +N-9H-fluoren-2-ylacetamide + +> +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O + +> +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O + +> +InChI=1/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17)/f/h16H + +> +CZIHNRWJTSTCEX-WYUMXYHSCF + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse; hamster; rhesus + +> +active + +> +1.22 + +> +5.46424102140101E-03 + +> +49 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; mammary gland; skin + +> +liver; mammary gland; skin + +> +active + +> +7.59 + +> +3.39947453708473E-02 + +> +45 + +> +TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results + +> +liver; urinary bladder + +> +liver; urinary bladder + +> +active + +> +17.4 + +> +7.79326178462112E-02 + +> +53 + +> +liver + +> +no positive results + +> +active + +> +no positive results + +> +no positive results for Rhesus + +> +inactive + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +http://potency.berkeley.edu/chempages/2-ACETYLAMINOFLUORENE.html + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 2.3012 -3.9858 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2905 -4.8819 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7528 -6.0934 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5342 -7.1688 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8533 -7.0326 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3981 -5.8139 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6167 -4.7385 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4266 -5.9572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1542 -4.6525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9858 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1542 -1.9929 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 -2.6596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4553 -1.9929 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4553 -0.6667 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6023 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 13 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 17 2 0 0 0 0 +M END +> +20019 + +> +19 + +> +20019 + +> +20_CPDBAS_v5c + +> +C15H13NO + +> +223.2698 + +> +defined organic + +> +parent + +> +tested chemical + +> +4-Acetylaminofluorene + +> +28322-02-3 + +> +single chemical compound + +> +N-9H-fluoren-4-ylacetamide + +> +C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O + +> +C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O + +> +InChI=1/C15H13NO/c1-10(17)16-14-8-4-6-12-9-11-5-2-3-7-13(11)15(12)14/h2-8H,9H2,1H3,(H,16,17)/f/h16H + +> +PHPWISAFHNEMSR-WYUMXYHSCU + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/4-ACETYLAMINOFLUORENE.html + +$$$$ + + + + 14 14 0 0 0 0 0 0 0 0 1 V2000 + 5.7595 -0.6749 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7595 -1.9876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6224 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6224 -2.6625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4853 -0.6749 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4853 -1.9876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9335 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0891 -0.6564 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2447 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0891 -1.9876 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3112 -2.6625 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1556 -1.9876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1556 -0.6564 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 1 7 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 14 2 0 0 0 0 +M END +> +20020 + +> +20 + +> +20020 + +> +21_CPDBAS_v5c + +> +C10H11NO3 + +> +193.1992 + +> +defined organic + +> +parent + +> +tested chemical + +> +4-Acetylaminophenylacetic acid + +> +18699-02-0 + +> +single chemical compound + +> +[4-(acetylamino)phenyl]acetic acid + +> +O=C(O)Cc1ccc(cc1)NC(C)=O + +> +O=C(O)Cc1ccc(cc1)NC(C)=O + +> +InChI=1/C10H11NO3/c1-7(12)11-9-4-2-8(3-5-9)6-10(13)14/h2-5H,6H2,1H3,(H,11,12)(H,13,14)/f/h11,13H + +> +MROJXXOCABQVEF-KZZMUEETCP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +Rat added v2a; Mouse added v2a + +> +http://potency.berkeley.edu/chempages/4-ACETYLAMINOPHENYLACETIC%20ACID.html + +$$$$ + + + + 10 9 0 0 1 0 0 0 0 0 1 V2000 + 2.3100 -1.9854 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4651 -1.3307 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3100 -3.3213 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4651 -3.9920 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4651 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4651 -5.3227 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6148 -1.9854 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9854 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1710 -1.3307 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6148 -3.3213 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 1 0 0 0 + 1 9 1 0 0 0 0 + 2 5 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 6 2 0 0 0 0 + 4 10 1 0 0 0 0 + 8 9 1 0 0 0 0 +M END +> +20021 + +> +21 + +> +20021 + +> +22_CPDBAS_v5c + +> +C5H9NO3S + +> +163.1949 + +> +defined organic + +> +parent + +> +tested chemical + +> +N-acetylcysteine + +> +616-91-1 + +> +single chemical compound + +> +stereochem + +> +N-acetyl-L-cysteine + +> +CC(=O)N[C@@H](CS)C(=O)O + +> +CC(=O)N[C@@H](CS)C(=O)O + +> +InChI=1/C5H9NO3S/c1-3(7)6-4(2-10)5(8)9/h4,10H,2H2,1H3,(H,6,7)(H,8,9)/t4-/m0/s1/f/h6,8H + +> +PWKSKIMOESPYIA-JVBVHTJODB + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +Rat added v2a + +> +http://potency.berkeley.edu/chempages/N-ACETYLCYSTEINE.html + +$$$$ + + + + 24 25 0 0 0 0 0 0 0 0 2 V2000 + 11.5157 -1.9922 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3641 -1.3358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3641 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2126 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2126 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0610 -3.9959 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9094 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9094 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0610 -1.3358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7578 -1.3358 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6063 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6063 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4547 -3.9959 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3031 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3031 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4547 -1.3358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4547 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1516 -3.9959 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4837 -2.8444 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8195 -5.1475 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.6523 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3641 -3.9959 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 10.3641 -5.3203 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5157 -3.3280 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 22 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 18 1 0 0 0 0 + 15 16 2 0 0 0 0 + 16 17 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 20 1 0 0 0 0 + 18 21 1 0 0 0 0 + 22 23 2 0 0 0 0 + 22 24 1 0 0 0 0 +M CHG 2 22 1 24 -1 +M END +> +20022 + +> +22 + +> +20022 + +> +23_CPDBAS_v5c + +> +C14H7ClF3NO5 + +> +361.6573 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acifluorfen + +> +50594-66-6 + +> +single chemical compound + +> +5-{[2-chloro-4-(trifluoromethyl)phenyl]oxy}-2-nitrobenzoic acid + +> +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-] + +> +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-] + +> +InChI=1/C14H7ClF3NO5/c15-10-5-7(14(16,17)18)1-4-12(10)24-8-2-3-11(19(22)23)9(6-8)13(20)21/h1-6H,(H,20,21)/f/h20H + +> +NUFNQYOELLVIPL-UYBDAZJACV + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +141 + +> +0.389871848293951 + +> +33 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; stomach + +> +liver; stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/ACIFLUORFEN.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3061 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 +M END +> +20023 + +> +23 + +> +20023 + +> +24_CPDBAS_v5c + +> +C3H4O + +> +56.0633 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrolein + +> +107-02-8 + +> +single chemical compound + +> +acrylaldehyde + +> +C=CC=O + +> +C=CC=O + +> +InChI=1/C3H4O/c1-2-3-4/h2-3H,1H2 + +> +HGINCPLSRVDWNT-UHFFFAOYAQ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +http://potency.berkeley.edu/chempages/ACROLEIN.html + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 -2.6588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3040 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3040 -0.6635 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4560 -2.6588 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6080 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6080 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 +M END +> +20024 + +> +24 + +> +20024 + +> +25_CPDBAS_v5c + +> +C7H14O2 + +> +130.1864 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrolein diethylacetal + +> +3054-95-3 + +> +single chemical compound + +> +3,3-bis(ethyloxy)prop-1-ene + +> +C=CC(OCC)OCC + +> +C=CC(OCC)OCC + +> +InChI=1/C7H14O2/c1-4-7(8-5-2)9-6-3/h4,7H,1,5-6H2,2-3H3 + +> +MCIPQLOKVXSHTD-UHFFFAOYAI + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/ACROLEIN%20DIETHYLACETAL.html + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 4.6099 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1525 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 +M END +> +20025 + +> +25 + +> +20025 + +> +26_CPDBAS_v5c + +> +C3H5NO + +> +71.0786 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrolein oxime + +> +5314-33-0 + +> +single chemical compound + +> +(1E)-prop-2-enal oxime + +> +C=C/C=N/O + +> +C=C/C=N/O + +> +InChI=1/C3H5NO/c1-2-3-4-5/h2-3,5H,1H2/b4-3+ + +> +KMNIXISXZFPRDC-ONEGZZNKBI + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/ACROLEIN%20OXIME.html + +$$$$ + + + + 24 27 0 0 0 0 0 0 0 0 1 V2000 + 6.9100 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7600 -5.6730 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4598 -5.6730 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3001 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1501 -5.6730 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3001 -3.6821 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4598 -3.0153 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -3.6821 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7600 -3.0153 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7600 -1.6816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -1.0148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4598 -1.6816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7498 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4604 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4598 -7.0067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -7.6735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7600 -7.0067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9100 -7.6735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9100 -8.9975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7600 -9.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -8.9975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3001 -7.6735 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 19 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 8 2 0 0 0 0 + 6 7 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 13 15 1 0 0 0 0 + 13 16 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 24 2 0 0 0 0 + 18 19 2 0 0 0 0 + 18 23 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 2 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 2 0 0 0 0 +M END +> +20026 + +> +26 + +> +20026 + +> +27_CPDBAS_v5c + +> +C20H19NO3 + +> +321.3698 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acronycine + +> +7008-42-6 + +> +single chemical compound + +> +3,3,12-trimethyl-6-(methyloxy)-3,12-dihydro-7H-pyrano[2,3-c]acridin-7-one + +> +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O + +> +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O + +> +InChI=1/C20H19NO3/c1-20(2)10-9-13-15(24-20)11-16(23-4)17-18(13)21(3)14-8-6-5-7-12(14)19(17)22/h5-11H,1-4H3 + +> +SMPZPKRDRQOOHT-UHFFFAOYAD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +0.505 + +> +1.57139843258452E-03 + +> +55 + +> +positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test + +> +bone; peritoneal cavity + +> +mammary gland; peritoneal cavity + +> +active + +> +0 + +> +NTP bioassay inadequate + +> +NTP bioassay inadequate + +> +NTP bioassay inadequate + +> +inconclusive + +> +active + +> +active + +> +multisite active; multisex active + +> +TR 49 + +> +http://potency.berkeley.edu/chempages/ACRONYCINE.html + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 3.4567 -1.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 +M END +> +20027 + +> +27 + +> +20027 + +> +28_CPDBAS_v5c + +> +C3H5NO + +> +71.0779 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrylamide + +> +79-06-1 + +> +single chemical compound + +> +acrylamide + +> +NC(=O)C=C + +> +NC(=O)C=C + +> +InChI=1/C3H5NO/c1-2-3(4)5/h2H,1H2,(H2,4,5)/f/h4H2 + +> +HRPVXLWXLXDGHG-LGEMBHMGCJ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +3.75 + +> +0.052759015108775 + +> +39 + +> +TD50 is harmonic mean of more than one positive test + +> +nervous system; peritoneal cavity; thyroid gland + +> +clitoral gland; mammary gland; nervous system; oral cavity; thyroid gland; uterus + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +TD50_Rat modified v3a + +> +http://potency.berkeley.edu/chempages/ACRYLAMIDE.html + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 3.4567 -1.9945 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 +M END +> +20028 + +> +28 + +> +39229 + +> +29_CPDBAS_v5c + +> +C3H4O2 + +> +72.0627 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrylic acid + +> +79-10-7 + +> +single chemical compound + +> +acrylic acid + +> +OC(=O)C=C + +> +OC(=O)C=C + +> +InChI=1/C3H4O2/c1-2-3(4)5/h2H,1H2,(H,4,5)/f/h4H + +> +NIXOWILDQLNWCW-JLSKMEETCA + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/ACRYLIC%20ACID.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6652 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9956 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3260 -1.1508 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 3 0 0 0 0 +M END +> +20029 + +> +29 + +> +20029 + +> +30_CPDBAS_v5c + +> +C3H3N + +> +53.0626 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrylonitrile + +> +107-13-1 + +> +single chemical compound + +> +acrylonitrile + +> +C=CC#N + +> +C=CC#N + +> +InChI=1/C3H3N/c1-2-3-4/h2H,1H2 + +> +NLHHRLWOUZZQLW-UHFFFAOYAG + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +16.9 + +> +0.318491743714028 + +> +31 + +> +TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results + +> +ear Zymbals gland; nervous system; oral cavity; small intestine; stomach + +> +ear Zymbals gland; mammary gland; nasal cavity; nervous system; oral cavity; small intestine; stomach + +> +active + +> +6.32 + +> +0.119104604749861 + +> +39 + +> +TD50 is harmonic mean of more than one positive test + +> +harderian gland; stomach + +> +harderian gland; stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +Mouse added v5a + +> +http://potency.berkeley.edu/chempages/ACRYLONITRILE.html + +$$$$ + + + + 93 99 0 0 1 0 0 0 0 0 1 V2000 + 11.4975 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4975 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5218 -12.3337 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4523 -12.3337 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4523 -14.7168 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5218 -14.7168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5218 -11.1421 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5670 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4279 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4279 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5670 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5218 -15.9083 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5670 -10.5359 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4975 -10.5359 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5914 -12.3337 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3827 -12.3337 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3827 -14.7168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5914 -14.7168 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3827 -11.1421 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3584 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3584 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3827 -15.9083 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3584 -10.5359 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4279 -10.5359 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5670 -9.2816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4800 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6332 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4800 -3.8046 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4139 -9.2816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6332 -7.4211 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.7411 -9.2607 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 16.7654 -8.6754 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.7654 -7.4838 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8734 -2.9893 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2496 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8350 -3.7001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4412 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8175 -2.9893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8593 -4.2854 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8350 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8316 -5.6860 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8802 -5.6860 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8802 -6.8776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.9045 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8350 -7.4838 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8316 -6.8776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8350 -8.6754 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8802 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8316 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8316 -10.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8350 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.7654 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3584 -9.2816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4454 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2923 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4454 -3.8046 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5116 -9.2816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2923 -7.4211 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1634 -9.2607 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1391 -8.6754 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1391 -7.4838 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0312 -2.9893 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6549 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0695 -3.7001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4633 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1079 -2.9893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0661 -4.2854 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0695 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0939 -5.6860 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0243 -5.6860 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0243 -6.8776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0695 -7.4838 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0939 -6.8776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0695 -8.6754 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0243 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0939 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0939 -10.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0695 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1391 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6750 -3.8046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5879 -3.1566 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6750 -5.0589 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5879 -1.9023 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4800 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6750 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4800 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2505 -3.8046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3375 -3.1566 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2505 -5.0589 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3375 -1.9023 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2505 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4454 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 2 0 0 0 0 + 2 5 1 0 0 0 0 + 2 6 2 0 0 0 0 + 3 7 1 0 0 0 0 + 3 8 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 10 1 0 0 0 0 + 6 11 1 0 0 0 0 + 6 12 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 2 0 0 0 0 + 8 15 1 0 0 0 0 + 8 11 1 0 0 0 0 + 9 16 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 17 2 0 0 0 0 + 11 18 2 0 0 0 0 + 25 13 1 6 0 0 0 + 16 19 1 0 0 0 0 + 16 20 1 0 0 0 0 + 17 21 1 0 0 0 0 + 17 22 1 0 0 0 0 + 19 23 1 0 0 0 0 + 19 24 2 0 0 0 0 + 20 21 2 0 0 0 0 + 53 23 1 1 0 0 0 + 25 26 1 0 0 0 0 + 25 27 1 0 0 0 0 + 26 28 1 0 0 0 0 + 26 29 2 0 0 0 0 + 27 30 1 1 0 0 0 + 27 31 1 0 0 0 0 + 82 28 1 6 0 0 0 + 31 32 1 0 0 0 0 + 32 33 2 0 0 0 0 + 32 49 1 0 0 0 0 + 34 35 1 0 0 0 0 + 34 36 1 0 0 0 0 + 34 81 1 0 0 0 0 + 35 37 1 0 0 0 0 + 36 38 1 0 0 0 0 + 36 39 1 6 0 0 0 + 36 40 1 0 0 0 0 + 37 38 1 0 0 0 0 + 40 41 2 0 0 0 0 + 40 42 1 0 0 0 0 + 42 43 1 0 0 0 0 + 42 44 1 0 0 0 0 + 43 45 1 0 0 0 0 + 45 46 2 0 0 0 0 + 45 47 1 0 0 0 0 + 47 48 1 0 0 0 0 + 47 49 1 0 0 0 0 + 49 50 1 1 0 0 0 + 50 51 1 0 0 0 0 + 50 52 1 0 0 0 0 + 53 54 1 0 0 0 0 + 53 55 1 0 0 0 0 + 54 56 1 0 0 0 0 + 54 57 2 0 0 0 0 + 55 58 1 6 0 0 0 + 55 59 1 0 0 0 0 + 89 56 1 1 0 0 0 + 59 60 1 0 0 0 0 + 60 61 2 0 0 0 0 + 60 77 1 0 0 0 0 + 62 63 1 0 0 0 0 + 62 64 1 0 0 0 0 + 62 88 1 0 0 0 0 + 63 65 1 0 0 0 0 + 64 66 1 0 0 0 0 + 64 67 1 1 0 0 0 + 64 68 1 0 0 0 0 + 65 66 1 0 0 0 0 + 68 69 2 0 0 0 0 + 68 70 1 0 0 0 0 + 70 71 1 0 0 0 0 + 70 72 1 0 0 0 0 + 71 73 1 0 0 0 0 + 73 74 2 0 0 0 0 + 73 75 1 0 0 0 0 + 75 76 1 0 0 0 0 + 75 77 1 0 0 0 0 + 77 78 1 6 0 0 0 + 78 79 1 0 0 0 0 + 78 80 1 0 0 0 0 + 81 82 1 0 0 0 0 + 81 83 2 0 0 0 0 + 82 84 1 0 0 0 0 + 84 85 1 0 0 0 0 + 84 86 1 6 0 0 0 + 85 87 1 0 0 0 0 + 88 89 1 0 0 0 0 + 88 90 2 0 0 0 0 + 89 91 1 0 0 0 0 + 91 92 1 0 0 0 0 + 91 93 1 0 0 0 0 +M END +> +20030 + +> +30 + +> +20030 + +> +31_CPDBAS_v5c + +> +C63H88N12O16 + +> +1269.4436 + +> +defined organic + +> +parent + +> +representative component in mixture + +> +Actinomycin C + +> +8052-16-2 + +> +mixture or formulation + +> +mixture of actinomycin C1 [50-76-0] (10%), actinomycin C2 [2612-14-8] (45%), and actinomycin C3 [6156-47-4] (45%), structure shown C2, stereochem + +> +2-amino-4,6-dimethyl-3-oxo-N~9~-[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-N~1~-{(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6-(1-methylethyl) + +> +O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N + +> +O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N + +> +InChI=1/C63H88N12O16/c1-17-31(8)44-61(86)75-25-19-21-38(75)59(84)71(14)27-40(77)73(16)50(30(6)7)63(88)90-35(12)46(57(82)67-44)69-55(80)41-42(64)51(78)33(10)53-48(41)65-47-36(23-22-32(9)52(47)91-53)54(79)68-45-34(11)89-62(87)49(29(4)5)72(15)39(76)26-70(13)58(83)37-20-18-24-74(37)60(85)43(28(2)3)66-56(45)81/h22-23,28-31,34-35,37-38,43-46,49-50H,17-21,24-27,64H2,1-16H3,(H,66,81)(H,67,82)(H,68,79)(H,69,80)/t31-,34+,35+,37-,38-,43+,44+,45-,46-,49-,50-/m0/s1/f/h66-69H + +> +QCXJFISCRQIYID-IFORFJDKDU + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/ACTINOMYCIN%20C.html + +$$$$ + + + + 92 98 0 0 1 0 0 0 0 0 1 V2000 + 11.5534 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5534 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5827 -10.8602 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5031 -10.8602 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5031 -13.2549 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5827 -13.2549 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5827 -9.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6330 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4738 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4738 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6330 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5827 -14.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6330 -9.0537 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5534 -9.0537 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6623 -10.8602 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4235 -10.8602 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4235 -13.2549 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6623 -13.2549 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4235 -9.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3942 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3942 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4235 -14.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3942 -9.0537 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4738 -9.0537 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6330 -7.7933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5407 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7043 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5407 -2.2897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4694 -7.7933 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7043 -5.9238 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.8177 -7.7723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 16.8470 -7.1841 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.8470 -5.9868 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5280 -1.8065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5280 -0.6092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6706 -2.3947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9603 -1.4704 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6706 -3.5921 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 18.3384 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9266 -2.1846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.5358 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9139 -1.4704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4777 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5573 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9559 -2.7728 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9266 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9183 -4.1802 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9769 -4.1802 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9769 -5.3776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.0062 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9266 -5.9868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9183 -5.3776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9266 -7.1841 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9769 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9183 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9183 -8.9697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9266 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.8470 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3942 -7.7933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4865 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3229 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4865 -2.2897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5578 -7.7933 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3229 -5.9238 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1885 -7.7723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1592 -7.1841 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1592 -5.9868 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4992 -1.8065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4992 -0.6092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3566 -2.3947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0459 -1.4704 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3566 -3.5921 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6678 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0796 -2.1846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4704 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1133 -1.4704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5285 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4489 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0713 -2.7728 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0796 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1089 -4.1802 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0293 -4.1802 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0293 -5.3776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0796 -5.9868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1089 -5.3776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0796 -7.1841 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0293 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1089 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1089 -8.9697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0796 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1592 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 2 0 0 0 0 + 2 5 1 0 0 0 0 + 2 6 2 0 0 0 0 + 3 7 1 0 0 0 0 + 3 8 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 10 1 0 0 0 0 + 6 11 1 0 0 0 0 + 6 12 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 2 0 0 0 0 + 8 15 1 0 0 0 0 + 8 11 1 0 0 0 0 + 9 16 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 17 2 0 0 0 0 + 11 18 2 0 0 0 0 + 25 13 1 6 0 0 0 + 16 19 1 0 0 0 0 + 16 20 1 0 0 0 0 + 17 21 1 0 0 0 0 + 17 22 1 0 0 0 0 + 19 23 1 0 0 0 0 + 19 24 2 0 0 0 0 + 20 21 2 0 0 0 0 + 59 23 1 1 0 0 0 + 25 26 1 0 0 0 0 + 25 27 1 0 0 0 0 + 26 28 1 0 0 0 0 + 26 29 2 0 0 0 0 + 27 30 1 1 0 0 0 + 27 31 1 0 0 0 0 + 28 34 1 0 0 0 0 + 31 32 1 0 0 0 0 + 32 33 2 0 0 0 0 + 32 55 1 0 0 0 0 + 34 35 1 6 0 0 0 + 34 36 1 0 0 0 0 + 35 43 1 0 0 0 0 + 35 44 1 0 0 0 0 + 36 37 1 0 0 0 0 + 36 38 2 0 0 0 0 + 37 39 1 0 0 0 0 + 37 40 1 0 0 0 0 + 39 41 1 0 0 0 0 + 40 42 1 0 0 0 0 + 40 45 1 6 0 0 0 + 40 46 1 0 0 0 0 + 41 42 1 0 0 0 0 + 46 47 2 0 0 0 0 + 46 48 1 0 0 0 0 + 48 49 1 0 0 0 0 + 48 50 1 0 0 0 0 + 49 51 1 0 0 0 0 + 51 52 2 0 0 0 0 + 51 53 1 0 0 0 0 + 53 54 1 0 0 0 0 + 53 55 1 0 0 0 0 + 55 56 1 1 0 0 0 + 56 57 1 0 0 0 0 + 56 58 1 0 0 0 0 + 59 60 1 0 0 0 0 + 59 61 1 0 0 0 0 + 60 62 1 0 0 0 0 + 60 63 2 0 0 0 0 + 61 64 1 6 0 0 0 + 61 65 1 0 0 0 0 + 62 68 1 0 0 0 0 + 65 66 1 0 0 0 0 + 66 67 2 0 0 0 0 + 66 89 1 0 0 0 0 + 68 69 1 1 0 0 0 + 68 70 1 0 0 0 0 + 69 77 1 0 0 0 0 + 69 78 1 0 0 0 0 + 70 71 1 0 0 0 0 + 70 72 2 0 0 0 0 + 71 73 1 0 0 0 0 + 71 74 1 0 0 0 0 + 73 75 1 0 0 0 0 + 74 76 1 0 0 0 0 + 74 79 1 1 0 0 0 + 74 80 1 0 0 0 0 + 75 76 1 0 0 0 0 + 80 81 2 0 0 0 0 + 80 82 1 0 0 0 0 + 82 83 1 0 0 0 0 + 82 84 1 0 0 0 0 + 83 85 1 0 0 0 0 + 85 86 2 0 0 0 0 + 85 87 1 0 0 0 0 + 87 88 1 0 0 0 0 + 87 89 1 0 0 0 0 + 89 90 1 6 0 0 0 + 90 91 1 0 0 0 0 + 90 92 1 0 0 0 0 +M END +> +20031 + +> +31 + +> +20031 + +> +32_CPDBAS_v5c + +> +C62H86N12O16 + +> +1255.417 + +> +defined organic + +> +parent + +> +tested chemical + +> +Actinomycin D + +> +50-76-0 + +> +single chemical compound + +> +stereochem + +> +2-amino-4,6-dimethyl-3-oxo-N,N'-bis[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-3H-phenoxazine-1,9-dicarboxamide + +> +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C + +> +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C + +> +InChI=1/C62H86N12O16/c1-27(2)42-59(84)73-23-17-19-36(73)57(82)69(13)25-38(75)71(15)48(29(5)6)61(86)88-33(11)44(55(80)65-42)67-53(78)35-22-21-31(9)51-46(35)64-47-40(41(63)50(77)32(10)52(47)90-51)54(79)68-45-34(12)89-62(87)49(30(7)8)72(16)39(76)26-70(14)58(83)37-20-18-24-74(37)60(85)43(28(3)4)66-56(45)81/h21-22,27-30,33-34,36-37,42-45,48-49H,17-20,23-26,63H2,1-16H3,(H,65,80)(H,66,81)(H,67,78)(H,68,79)/t33-,34-,36+,37+,42-,43-,44+,45+,48+,49+/m1/s1/f/h65-68H + +> +RJURFGZVJUQBHK-HQANWYOLDQ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +0.00111 + +> +8.84168367960606E-07 + +> +88 + +> +positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test + +> +peritoneal cavity + +> +peritoneal cavity + +> +active + +> +active + +> +active + +> +multisex active + +> +TD50_Rat_Note modified v5a + +> +http://potency.berkeley.edu/chempages/ACTINOMYCIN%20D.html + +$$$$ + + + + 10 9 0 0 0 0 0 0 0 0 1 V2000 + 8.0713 -1.9936 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9171 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9171 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7629 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6087 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4626 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3084 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1542 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1542 -3.3254 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3318 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 +M END +> +20032 + +> +32 + +> +20032 + +> +33_CPDBAS_v5c + +> +C6H12N2O2 + +> +144.1717 + +> +defined organic + +> +parent + +> +tested chemical + +> +Adipamide + +> +628-94-4 + +> +single chemical compound + +> +hexanediamide + +> +NC(=O)CCCCC(=O)N + +> +NC(=O)CCCCC(=O)N + +> +InChI=1/C6H12N2O2/c7-5(9)3-1-2-4-6(8)10/h1-4H2,(H2,7,9)(H2,8,10)/f/h7-8H2 + +> +GVNWZKBFMFUVNX-UNXFWZPKCL + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +http://potency.berkeley.edu/chempages/ADIPAMIDE.html + +$$$$ + + + + 18 19 0 0 0 0 0 0 0 0 2 V2000 + 3.2537 -3.5906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2537 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4062 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4062 -4.2555 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1011 -4.2555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9682 -0.2748 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6649 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1011 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8866 -2.1366 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7006 -3.5817 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0038 -3.8654 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5587 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6687 -2.7129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7733 -1.7199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5446 -5.0800 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 6.7644 -6.1527 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 8.8656 -5.2130 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 4 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 8 1 0 0 0 0 + 3 13 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 9 2 0 0 0 0 + 8 10 2 0 0 0 0 + 9 10 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 12 14 2 0 0 0 0 + 12 16 1 0 0 0 0 + 13 15 2 0 0 0 0 + 14 15 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 18 2 0 0 0 0 +M CHG 2 16 1 17 -1 +M END +> +20033 + +> +33 + +> +20033 + +> +34_CPDBAS_v5c + +> +C11H8N2O5 + +> +248.1916 + +> +defined organic + +> +parent + +> +tested chemical + +> +AF-2 + +> +3688-53-7 + +> +single chemical compound + +> +stereochem + +> +(2Z)-2-(furan-2-yl)-3-(5-nitrofuran-2-yl)prop-2-enamide + +> +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1 + +> +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1 + +> +InChI=1/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14)/b8-6-/f/h12H2 + +> +LYAHJFZLDZDIOH-SDXKRDFODJ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse; hamster + +> +active + +> +29.4 + +> +0.118456869612026 + +> +35 + +> +TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results + +> +mammary gland + +> +mammary gland + +> +active + +> +131 + +> +0.527818024461747 + +> +31 + +> +TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results + +> +stomach + +> +stomach + +> +active + +> +164 + +> +0.660779816883408 + +> +30 + +> +TD50 is harmonic mean of more than one positive test + +> +esophagus; stomach + +> +stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +structure modified v5b + +> +http://potency.berkeley.edu/chempages/AF-2.html + +$$$$ + + + + 25 29 0 0 1 0 0 0 0 0 1 V2000 + 5.7454 -4.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5929 -3.9863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5929 -2.6604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4403 -1.9931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2878 -2.6604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2878 -3.9863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4403 -4.6535 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1352 -4.6535 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2999 -1.7678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.0451 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8458 -0.5546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1630 -0.6933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7454 -1.9931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8980 -2.6604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8980 -3.9863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8859 -4.8788 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3399 -6.0921 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0227 -5.9534 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4768 -7.1666 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4647 -8.0592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6172 -7.3919 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6969 -5.8148 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6658 -6.2307 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7454 -0.6673 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8980 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 15 2 0 0 0 0 + 1 18 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 9 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 9 10 1 6 0 0 0 + 9 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 24 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 21 1 0 0 0 0 + 17 23 1 1 0 0 0 + 18 19 1 0 0 0 0 + 18 22 1 6 0 0 0 + 19 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 24 25 1 0 0 0 0 +M END +> +20034 + +> +34 + +> +20034 + +> +35_CPDBAS_v5c + +> +C17H14O6 + +> +314.294 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aflatoxicol + +> +29611-03-8 + +> +single chemical compound + +> +stereochem + +> +(1R,6aS,9aS)-1-hydroxy-4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromen-11(1H)-one + +> +O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC + +> +O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC + +> +InChI=1/C17H14O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8-9,17-18H,2-3H2,1H3/t8-,9+,17-/m0/s1 + +> +WYIWLDSPNDMZIT-BTKFHORUBM + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +active + +> +0.00247 + +> +7.85888372033828E-06 + +> +78 + +> +liver + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/AFLATOXICOL.html + +$$$$ + + + + 23 27 0 0 0 0 0 0 0 0 1 V2000 + 5.4986 -3.3221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3531 -3.9918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1987 -3.3221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0444 -3.9918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0444 -5.3224 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1987 -5.9833 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3531 -5.3224 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1987 -7.3139 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7843 -5.7277 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3701 -6.9966 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7843 -3.5776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1987 -1.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3531 -1.3306 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4986 -1.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7675 -1.5861 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5430 -2.6612 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7675 -3.7362 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5430 -4.8113 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8119 -4.3971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8119 -3.0665 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0444 -1.3306 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0444 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 15 1 0 0 0 0 + 1 18 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 2 0 0 0 0 + 4 5 2 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 9 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 13 22 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 21 1 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 22 23 1 0 0 0 0 +M END +> +20035 + +> +35 + +> +20035 + +> +36_CPDBAS_v5c + +> +C17H12O6 + +> +312.2736 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aflatoxin B1 + +> +1162-65-8 + +> +single chemical compound + +> +4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromene-1,11-dione + +> +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC + +> +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC + +> +InChI=1/C17H12O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8,17H,2-3H2,1H3 + +> +OQIQSTLJSLGHID-UHFFFAOYAB + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse; rhesus; cynomolgus; tree shrew + +> +active + +> +0.0032 + +> +1.02474240537785E-05 + +> +77 + +> +TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable; greater than ten-fold variation among TD50 values for positive results + +> +kidney; large intestine; liver + +> +large intestine; liver + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0.0082 + +> +gall bladder; liver; vascular system + +> +0.0201 + +> +gall bladder; liver; vascular system + +> +Tree Shrew (TD50=0.0269; Target Sites=liver) + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TD50_Rat_Note modified v5a + +> +http://potency.berkeley.edu/chempages/AFLATOXIN%20B1.html + +$$$$ + + + + 24 28 0 0 0 0 0 0 0 0 1 V2000 + 6.7674 -1.9958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7674 -3.3293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6244 -1.3335 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4723 -3.3202 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6244 -3.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4723 -2.0048 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3202 -3.9824 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3202 -5.3251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0593 -5.7333 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2791 -4.6537 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6244 -5.3251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9195 -1.3335 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0593 -3.5742 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4814 -5.9873 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0181 -4.2546 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6244 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0716 -2.0048 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.9392 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2610 -2.5038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9195 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9195 -3.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7947 -6.0054 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0716 -3.3202 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9558 -5.3432 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 3 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 21 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 16 2 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 11 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 14 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 13 1 0 0 0 0 + 10 15 1 0 0 0 0 + 11 14 2 0 0 0 0 + 11 22 1 0 0 0 0 + 12 17 1 0 0 0 0 + 12 20 2 0 0 0 0 + 13 19 1 0 0 0 0 + 15 18 1 0 0 0 0 + 17 23 1 0 0 0 0 + 18 19 2 0 0 0 0 + 21 23 1 0 0 0 0 + 22 24 1 0 0 0 0 +M END +> +20036 + +> +36 + +> +20036 + +> +37_CPDBAS_v5c + +> +C17H12O7 + +> +328.273 + +> +defined organic + +> +parent + +> +representative component in mixture + +> +Aflatoxin, crude + +> +1402-68-2 + +> +mixture or formulation + +> +mixture of aflatoxins, structure shown G1 [1165-39-5] + +> +5-(methyloxy)-3,4,7a,10a-tetrahydro-1H,12H-furo[3',2':4,5]furo[2,3-h]pyrano[3,4-c]chromene-1,12-dione + +> +O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1 + +> +O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1 + +> +InChI=1/C17H12O7/c1-20-9-6-10-12(8-3-5-22-17(8)23-10)14-11(9)7-2-4-21-15(18)13(7)16(19)24-14/h3,5-6,8,17H,2,4H2,1H3 + +> +XWIYFDMXXLINPU-UHFFFAOYAD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +0.00299 + +> +50 + +> +TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active + +> +liver + +> +active + +> +0.343 + +> +50 + +> +hematopoietic system + +> +active + +> +active + +> +active + +> +multisite active; multispecies active + +> +TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture + +> +http://potency.berkeley.edu/chempages/AFLATOXIN,%20CRUDE.html + +$$$$ + + + + 0 0 0 0 0 0 0 0 0 0 1 V2000 +M END +> +20037 + +> +20037 + +> +38_CPDBAS_v5c + +> +no structure + +> +no structure + +> +Agar + +> +9002-18-0 + +> +mixture or formulation + +> +InChI=1// + +> +MOSFIJXAXDLOML-UHFFFAOYAM + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 230 + +> +http://potency.berkeley.edu/chempages/AGAR.html + +$$$$ + + + + 15 15 0 0 0 0 0 0 0 0 1 V2000 + 5.7597 -2.0304 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1706 -2.0304 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7597 -0.7148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6306 -2.7038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4807 -2.0304 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.7038 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3101 -2.7038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6306 -0.0414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2094 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3592 -0.6526 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9096 -2.7245 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4807 -0.7148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1706 -0.7148 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9096 -0.0104 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0802 -0.6837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 2 0 0 0 0 + 1 11 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 6 2 0 0 0 0 + 2 13 1 0 0 0 0 + 3 8 2 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 12 2 0 0 0 0 + 8 12 1 0 0 0 0 + 9 15 1 0 0 0 0 + 9 10 2 0 0 0 0 + 14 15 1 0 0 0 0 +M END +> +20038 + +> +38 + +> +20038 + +> +39_CPDBAS_v5c + +> +C11H11ClO3 + +> +226.6562 + +> +defined organic + +> +parent + +> +tested chemical + +> +Alclofenac + +> +22131-79-9 + +> +single chemical compound + +> +[3-chloro-4-(prop-2-en-1-yloxy)phenyl]acetic acid + +> +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl + +> +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl + +> +InChI=1/C11H11ClO3/c1-2-5-15-10-4-3-8(6-9(10)12)7-11(13)14/h2-4,6H,1,5,7H2,(H,13,14)/f/h13H + +> +ARHWPKZXBHOEEE-NDKGDYFDCL + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +Rat added v2a + +> +http://potency.berkeley.edu/chempages/ALCLOFENAC.html + +$$$$ + + + + 12 11 0 0 0 0 0 0 0 0 1 V2000 + 0.8456 -0.6672 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9938 -1.3343 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1497 -1.9938 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2978 -1.3343 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4537 -1.9938 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6019 -1.3343 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6019 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7578 -1.9938 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7578 -3.3281 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3343 -2.4825 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.4825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6609 -0.1784 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +20039 + +> +39 + +> +39223 + +> +40_CPDBAS_v5c + +> +C7H14N2O2S + +> +190.2633 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aldicarb + +> +116-06-3 + +> +single chemical compound + +> +(1E)-2-methyl-2-(methylthio)propanal O-[(methylamino)carbonyl]oxime + +> +CC(C=NOC(=O)NC)(SC)C + +> +CC(C=NOC(=O)NC)(SC)C + +> +InChI=1/C7H14N2O2S/c1-7(2,12-4)5-9-11-6(10)8-3/h5H,1-4H3,(H,8,10)/b9-5+/f/h8H + +> +QGLZXHRNAYXIBU-RVKZGWQMDN + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 136 + +> +http://potency.berkeley.edu/chempages/ALDICARB.html + +$$$$ + + + + 18 21 0 0 0 0 0 0 0 0 1 V2000 + 4.3850 -2.1587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2104 -2.1095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1821 -0.9164 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1845 -3.0750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3567 -1.7958 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5400 -3.2473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9188 -2.6568 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8869 -3.2473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3887 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0615 -0.3260 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6126 -4.2128 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1501 -2.7798 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3653 -3.6962 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6052 -4.8340 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7073 -2.0726 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2657 -4.4404 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5449 -5.2337 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.0750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 11 2 0 0 0 0 + 4 12 1 0 0 0 0 + 6 13 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 + 8 11 1 0 0 0 0 + 11 17 1 0 0 0 0 + 13 18 1 0 0 0 0 + 13 14 1 0 0 0 0 + 15 18 2 0 0 0 0 +M END +> +20040 + +> +40 + +> +20040 + +> +41_CPDBAS_v5c + +> +C12H8Cl6 + +> +364.9099 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aldrin + +> +309-00-2 + +> +single chemical compound + +> +stereochem + +> +1,2,3,4,10,10-hexachloro-1,4,4a,5,8,8a-hexahydro-1,4:5,8-dimethanonaphthalene + +> +ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2 + +> +ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2 + +> +InChI=1/C12H8Cl6/c13-8-9(14)11(16)7-5-2-1-4(3-5)6(7)10(8,15)12(11,17)18/h1-2,4-7H,3H2 + +> +QBYJBZPUGVGKQQ-UHFFFAOYAT + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +1.27 + +> +3.48031116722237E-03 + +> +56 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +active + +> +TR 21; final call in CPDB differs due to additional data + +> +http://potency.berkeley.edu/chempages/ALDRIN.html + +$$$$ + + + + 23 22 0 0 0 0 0 0 0 0 2 V2000 + 13.2448 -7.3111 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 + 12.6753 -2.6490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6753 -3.9867 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5230 -1.9867 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5230 -4.6489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3707 -2.6490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3707 -3.9867 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5230 -5.9867 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8475 -5.9867 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1853 -5.9867 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5230 -7.3111 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 6.9138 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7615 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1523 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3046 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6092 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0661 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2184 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3707 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5230 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6753 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 4 22 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 2 0 0 0 0 + 8 11 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 19 1 0 0 0 0 + 13 18 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 +M CHG 2 1 1 11 -1 +M END +> +20041 + +> +41 + +> +20041 + +> +42_CPDBAS_v5c + +> +C18H29NaO3S + +> +348.4758 + +> +defined organic + +> +salt Na + +> +representative isomer in mixture + +> +Alkylbenzenesulfonate, linear + +> +42615-29-2 + +> +mixture or formulation + +> +mixture of C10-13 alkylbenzenesulfonates average 11.6; with phenyl attachment varying in apprpx equal amounts between C-2,3,4,5 or 6; structure shown C12 attached at C2 + +> +sodium 4-(dodecan-2-yl)benzenesulfonate + +> +O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)([O-])=O.[Na+] + +> +O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)(O)=O + +> +InChI=1/C18H30O3S.Na/c1-3-4-5-6-7-8-9-10-11-16(2)17-12-14-18(15-13-17)22(19,20)21;/h12-16H,3-11H2,1-2H3,(H,19,20,21);/q;+1/p-1/fC18H29O3S.Na/q-1;m + +> +GHRHULTYHYEOQB-MFZBKVKLCJ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +structure modified v5b + +> +http://potency.berkeley.edu/chempages/ALKYLBENZENESULFONATE,%20LINEAR.html + +$$$$ + + + + 14 13 0 0 0 0 0 0 0 0 2 V2000 + 0.0000 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1547 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3093 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4640 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6186 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7733 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9152 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0699 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2245 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3792 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5338 -1.1547 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 12.2063 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8740 -2.3093 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6885 -1.8271 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 11 14 1 0 0 0 0 +M CHG 2 11 1 14 -1 +M END +> +20042 + +> +42 + +> +20042 + +> +43_CPDBAS_v5c + +> +C12H27NO + +> +201.3489 + +> +defined organic + +> +parent + +> +representative isomer in mixture + +> +Alkyldimethylamine oxides, commercial grade + +> +NOCAS + +> +mixture or formulation + +> +mixture, C10-16 [70592-80-2], C12-18 [68955-55-5], C12-16 [68439-70-3], C14-18 [68390-99-8], structure shown C-12 + +> +decyl(dimethyl)amine oxide + +> +[O-][N+](C)(C)CCCCCCCCCC + +> +[O-][N+](C)(C)CCCCCCCCCC + +> +InChI=1/C12H27NO/c1-4-5-6-7-8-9-10-11-12-13(2,3)14/h4-12H2,1-3H3 + +> +ZRKZFNZPJKEWPC-UHFFFAOYAU + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/ALKYLDIMETHYLAMINE%20OXIDES,%20COMMERCIAL%20GRADE.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 4.2744 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2901 -0.8879 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4278 -2.2095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2095 -2.7532 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3216 -1.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9066 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9892 -0.6126 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5773 -2.8771 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7336 -2.2095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7336 -0.8810 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8831 -2.8771 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 +M END +> +20043 + +> +43 + +> +20043 + +> +44_CPDBAS_v5c + +> +C4H6N4O3 + +> +158.1164 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allantoin + +> +97-59-6 + +> +single chemical compound + +> +1-(2,5-dioxoimidazolidin-4-yl)urea + +> +O=C1C(NC(=O)N1)NC(=O)N + +> +O=C1C(NC(=O)N1)NC(=O)N + +> +InChI=1/C4H6N4O3/c5-3(10)6-1-2(9)8-4(11)7-1/h1H,(H3,5,6,10)(H2,7,8,9,11)/f/h6-8H,5H2 + +> +POJWUDADGALRAB-BANUENCFCI + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/ALLANTOIN.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3061 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +20044 + +> +44 + +> +20044 + +> +45_CPDBAS_v5c + +> +C3H6O + +> +58.0791 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allyl alcohol + +> +107-18-6 + +> +single chemical compound + +> +prop-2-en-1-ol + +> +C=CCO + +> +C=CCO + +> +InChI=1/C3H6O/c1-2-3-4/h2,4H,1,3H2 + +> +XXROGKLTLUQVRX-UHFFFAOYAC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +Mutagenicity_SAL_CPDB added v3a + +> +http://potency.berkeley.edu/chempages/ALLYL%20ALCOHOL.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3061 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 -0.6638 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +20045 + +> +45 + +> +39231 + +> +46_CPDBAS_v5c + +> +C3H5Cl + +> +76.5248 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allyl chloride + +> +107-05-1 + +> +single chemical compound + +> +3-chloroprop-1-ene + +> +C=CCCl + +> +C=CCCl + +> +InChI=1/C3H5Cl/c1-2-3-4/h2H,1,3H2 + +> +OSDWBNJEKMUWAV-UHFFFAOYAQ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +0 + +> +NTP bioassay inadequate + +> +NTP bioassay inadequate + +> +NTP bioassay inadequate + +> +inconclusive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +TR 73 + +> +http://potency.berkeley.edu/chempages/ALLYL%20CHLORIDE.html + +$$$$ + + + + 8 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.8149 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1485 -1.1485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3041 -1.8149 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4526 -1.1485 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6082 -1.8149 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7567 -1.1485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4231 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0895 -1.1485 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 8 1 0 0 0 0 +M END +> +20046 + +> +46 + +> +39232 + +> +47_CPDBAS_v5c + +> +C6H10O2 + +> +114.1424 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allyl glycidyl ether + +> +106-92-3 + +> +single chemical compound + +> +2-[(allyloxy)methyl]oxirane + +> +C=CCOCC1CO1 + +> +C=CCOCC1CO1 + +> +InChI=1/C6H10O2/c1-2-3-7-4-6-5-8-6/h2,6H,1,3-5H2 + +> +LSWYGACWGAICNM-UHFFFAOYAR + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +182 + +> +1.59449950237598 + +> +26 + +> +nasal cavity + +> +no positive results + +> +active + +> +active + +> +TR 376 + +> +http://potency.berkeley.edu/chempages/ALLYL%20GLYCIDYL%20ETHER.html + +$$$$ + + + + 6 5 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -0.6684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1525 -1.3311 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -0.6684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 -1.3311 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -0.6684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7624 0.0000 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 2 0 0 0 0 +M END +> +20047 + +> +47 + +> +20047 + +> +48_CPDBAS_v5c + +> +C4H5NS + +> +99.1542 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allyl isothiocyanate + +> +57-06-7 + +> +single chemical compound + +> +3-isothiocyanatoprop-1-ene + +> +C=CCN=C=S + +> +C=CCN=C=S + +> +InChI=1/C4H5NS/c1-2-3-5-4-6/h2H,1,3H2 + +> +ZOJBYZNEUISWFT-UHFFFAOYAS + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +96 + +> +0.968188942072045 + +> +26 + +> +urinary bladder + +> +no positive results + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +TR 234 + +> +http://potency.berkeley.edu/chempages/ALLYL%20ISOTHIOCYANATE.html + +$$$$ + + + + 10 9 0 0 0 0 0 0 0 0 1 V2000 + 4.6087 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6087 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7629 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9171 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9171 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0713 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4626 -1.9936 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3084 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1542 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 +M END +> +20048 + +> +48 + +> +39233 + +> +49_CPDBAS_v5c + +> +C8H14O2 + +> +142.1956 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allyl isovalerate + +> +2835-39-4 + +> +single chemical compound + +> +allyl 3-methylbutanoate + +> +O=C(CC(C)C)OCC=C + +> +O=C(CC(C)C)OCC=C + +> +InChI=1/C8H14O2/c1-4-5-10-8(9)6-7(2)3/h4,7H,1,5-6H2,2-3H3 + +> +HOMAGVUCNZNWBC-UHFFFAOYAF + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +123 + +> +0.865005668248525 + +> +26 + +> +hematopoietic system + +> +no positive results + +> +active + +> +62.8 + +> +0.441645170455345 + +> +32 + +> +no positive results + +> +hematopoietic system + +> +active + +> +active + +> +active + +> +multisex active; multispecies active + +> +TR 253 + +> +http://potency.berkeley.edu/chempages/ALLYL%20ISOVALERATE.html + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 4.6080 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4560 -2.6588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3040 -1.9953 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3040 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4560 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 -2.6588 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9953 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6080 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 2 0 0 0 0 + 7 8 2 0 0 0 0 +M END +> +20049 + +> +49 + +> +20049 + +> +50_CPDBAS_v5c + +> +C4H7N3O2 + +> +129.1182 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Allyl-1-nitrosourea + +> +760-56-5 + +> +single chemical compound + +> +1-nitroso-1-prop-2-en-1-ylurea + +> +NC(=O)N(CC=C)N=O + +> +NC(=O)N(CC=C)N=O + +> +InChI=1/C4H7N3O2/c1-2-3-7(6-9)4(5)8/h2H,1,3H2,(H2,5,8)/f/h5H2 + +> +WBBDVRPSJSJSPC-GLFQYTTQCA + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0.341 + +> +2.64099096796579E-03 + +> +52 + +> +TD50 is harmonic mean of more than one positive test + +> +large intestine; lung; stomach + +> +mammary gland; stomach; uterus + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/1-ALLYL-1-NITROSOUREA.html + +$$$$ + + + + 7 5 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -0.6636 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1521 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3042 -0.6636 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6084 -0.6636 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5945 -1.9954 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9263 -1.9954 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 1 0 0 0 0 +M END +> +20050 + +> +50 + +> +20050 + +> +51_CPDBAS_v5c + +> +C3H9ClN2 + +> +108.5705 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +Allylhydrazine.HCl + +> +52207-83-7 + +> +single chemical compound + +> +parent [7422-78-8] + +> +prop-2-en-1-ylhydrazine hydrochloride + +> +C=CCNN.HCl + +> +C=CCNN + +> +InChI=1/C3H8N2.ClH/c1-2-3-5-4;/h2,5H,1,3-4H2;1H + +> +PWGPATVPEGLIAN-UHFFFAOYAO + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +34.2 + +> +0.315002694101989 + +> +34 + +> +TD50 is harmonic mean of more than one positive test + +> +lung + +> +lung; vascular system + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/ALLYLHYDRAZINE.HCl.html + +$$$$ + + + + 12 8 0 0 0 0 0 0 0 0 2 V2000 + 5.3200 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3200 -1.3300 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3200 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9900 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 6.6500 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.3300 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 -1.3300 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2.6600 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 3.3250 -3.9900 0.0000 Al 0 1 0 0 0 0 0 0 0 0 0 0 + 1.9950 -3.9900 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 7 10 1 0 0 0 0 +M CHG 6 4 -1 5 -1 9 -1 10 -1 11 3 12 1 +M END +> +20051 + +> +51 + +> +39234 + +> +52_CPDBAS_v5c + +> +AlKO8S2 + +> +258.18674 + +> +inorganic + +> +tested chemical + +> +Aluminum potassium sulfate + +> +10043-67-1 + +> +single chemical compound + +> +aluminum potassium sulfate + +> +O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+] + +> +InChI=1/Al.K.2H2O4S/c;;2*1-5(2,3)4/h;;2*(H2,1,2,3,4)/q+3;+1;;/p-4/fAl.K.2O4S/q2m;2*-2 + +> +GRLPQNLYRHEGIJ-MHPHYJPNCZ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +http://potency.berkeley.edu/chempages/ALUMINUM%20POTASSIUM%20SULFATE.html + +$$$$ + + + + 19 21 0 0 0 0 0 0 0 0 1 V2000 + 3.4588 -5.3212 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4588 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6036 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7566 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9095 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9095 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7566 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6036 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4588 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4588 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3059 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3059 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7566 0.0000 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0624 -3.9909 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7566 -5.3212 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 18 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 17 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +20052 + +> +52 + +> +39235 + +> +53_CPDBAS_v5c + +> +C14H7Br2NO2 + +> +381.0189 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Amino-2,4-dibromoanthraquinone + +> +81-49-2 + +> +single chemical compound + +> +1-amino-2,4-dibromo-9,10-anthraquinone + +> +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N + +> +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N + +> +InChI=1/C14H7Br2NO2/c15-8-5-9(16)12(17)11-10(8)13(18)6-3-1-2-4-7(6)14(11)19/h1-5H,17H2 + +> +ZINRVIQBCHAZMM-UHFFFAOYAC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +46 + +> +0.120728919221592 + +> +35 + +> +TD50 is harmonic mean of more than one positive test + +> +kidney; large intestine; liver; urinary bladder + +> +kidney; large intestine; liver; urinary bladder + +> +active + +> +477 + +> +1.25190640149347 + +> +27 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; lung; stomach + +> +liver; lung; stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 383 + +> +http://potency.berkeley.edu/chempages/1-AMINO-2,4-DIBROMOANTHRAQUINONE.html + +$$$$ + + + + 14 14 0 0 0 0 0 0 0 0 1 V2000 + 5.9919 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3210 -1.1555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9919 -2.3110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3210 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9977 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3268 -2.3110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9977 -1.1555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9942 -2.3110 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3326 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9942 -4.6127 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3245 -2.3110 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9861 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3187 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 +M END +> +20053 + +> +53 + +> +20053 + +> +54_CPDBAS_v5c + +> +C10H14N2O2 + +> +194.2304 + +> +defined organic + +> +parent + +> +tested chemical + +> +3-Amino-4-ethoxyacetanilide + +> +17026-81-2 + +> +single chemical compound + +> +N-[3-amino-4-(ethyloxy)phenyl]acetamide + +> +NC1=C(C=CC(=C1)NC(=O)C)OCC + +> +NC1=C(C=CC(=C1)NC(=O)C)OCC + +> +InChI=1/C10H14N2O2/c1-3-14-10-5-4-8(6-9(10)11)12-7(2)13/h4-6H,3,11H2,1-2H3,(H,12,13)/f/h12H + +> +XTXFAVHDQCHWCS-XWKXFZRBCV + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +2070 + +> +10.6574460022736 + +> +17 + +> +thyroid gland + +> +no positive results + +> +active + +> +active + +> +TR 112 + +> +http://potency.berkeley.edu/chempages/3-AMINO-4-ETHOXYACETANILIDE.html + +$$$$ + + + + 18 19 0 0 0 0 0 0 0 0 1 V2000 + 3.6099 -7.5422 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1990 -6.2771 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0854 -5.2860 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4149 -5.4310 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9548 -4.2143 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2763 -4.0773 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0579 -5.1490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5180 -6.3658 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1965 -6.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9637 -3.3199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8114 -3.9887 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6591 -3.3199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6591 -1.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8114 -1.3296 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9637 -1.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8114 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.8195 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3296 -3.8195 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 15 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 14 16 1 0 0 0 0 + 17 18 1 0 0 0 0 +M END +> +20054 + +> +54 + +> +20054 + +> +55_CPDBAS_v5c + +> +C14H15ClN2 + +> +246.7353 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +3-Amino-9-ethylcarbazole.HCl + +> +6109-97-3 + +> +single chemical compound + +> +parent [132-32-1] + +> +9-ethyl-9H-carbazol-3-amine hydrochloride + +> +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl + +> +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N) + +> +InChI=1/C14H14N2.ClH/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16;/h3-9H,2,15H2,1H3;1H + +> +UUYSTZWIFZYHRM-UHFFFAOYAB + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +57.2 + +> +0.231827387487725 + +> +32 + +> +TD50 is harmonic mean of more than one positive test + +> +ear Zymbals gland; liver; skin + +> +ear Zymbals gland; liver; uterus + +> +active + +> +38.6 + +> +0.156442957290667 + +> +37 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 93 + +> +http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE.HCl.html + +$$$$ + + + + 16 18 0 0 0 0 0 0 0 0 1 V2000 + 2.8854 -1.7137 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0066 -2.7097 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1011 -2.2629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 -3.8595 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9547 -3.5738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0066 -5.0166 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0312 -4.3575 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3168 -1.7137 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6738 -2.7097 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6738 -5.0166 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2469 -3.8155 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.8595 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3934 -2.4973 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3235 -4.5991 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6145 -0.4174 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3475 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 15 1 0 0 0 0 + 2 4 2 0 0 0 0 + 2 9 1 0 0 0 0 + 3 5 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 10 2 0 0 0 0 + 7 11 2 0 0 0 0 + 8 13 2 0 0 0 0 + 9 12 2 0 0 0 0 + 10 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 11 14 1 0 0 0 0 + 15 16 1 0 0 0 0 +M END +> +20055 + +> +55 + +> +20055 + +> +56_CPDBAS_v5c + +> +C14H15N2 + +> +210.2744 + +> +defined organic + +> +parent + +> +representative component in mixture + +> +3-Amino-9-ethylcarbazole mixture + +> +NOCAS + +> +mixture or formulation + +> +mixture, structure shown 3-Amino-9-ethylcarbazole [132-32-1] + +> +9-ethyl-9H-carbazol-3-amine + +> +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N) + +> +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N) + +> +InChI=1/C14H14N2/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16/h3-9H,2,15H2,1H3 + +> +OXEUETBFKVCRNP-UHFFFAOYAV + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +26.4 + +> +50 + +> +TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active + +> +ear Zymbals gland; liver; skin + +> +ear Zymbals gland + +> +active + +> +38 + +> +50 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture + +> +TR 93 + +> +http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE%20MIXTURE.html + +$$$$ + + + + 20 21 0 0 0 0 0 0 0 0 1 V2000 + 14.3944 -3.3539 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 13.1277 -2.9365 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8542 -1.6410 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 12.1345 -3.8289 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8822 -3.4259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8026 -4.2032 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7230 -3.4259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4563 -3.8289 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4775 -2.9365 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2108 -3.3539 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2176 -2.4615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9509 -2.8789 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9720 -1.9864 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6621 -2.2599 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1084 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8925 -0.1152 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1016 -0.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2531 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1405 -2.1592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4648 -2.1592 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 20 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 19 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 17 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 17 18 1 0 0 0 0 + 19 20 1 0 0 0 0 +M END +> +20056 + +> +56 + +> +39236 + +> +57_CPDBAS_v5c + +> +C9H14N8S3 + +> +330.4561 + +> +defined organic + +> +parent + +> +tested chemical + +> +3-Amino-4-[2-[(2-guanidinothiazol-4-yl)methylthio], ethylamino]-1,2,5-thiadiazole + +> +78441-84-6 + +> +single chemical compound + +> +BL-6341 + +> +1-{4-[({2-[(4-amino-1,2,5-thiadiazol-3-yl)amino]ethyl}sulfanyl)methyl]-1,3-thiazol-2-yl}guanidine + +> +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1 + +> +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1 + +> +InChI=1/C9H14N8S3/c10-6-7(17-20-16-6)13-1-2-18-3-5-4-19-9(14-5)15-8(11)12/h4H,1-3H2,(H2,10,16)(H,13,17)(H4,11,12,14,15)/f/h11,13,15H,10,12H2 + +> +MOMKQYRYLQUFMV-GVMYFUFNCD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +4990 + +> +15.1003416187506 + +> +14 + +> +TD50 is harmonic mean of more than one positive test + +> +stomach + +> +stomach + +> +active + +> +active + +> +active + +> +multisex active + +> +Rat added v2a; CPDB lists HCl complex in some instances in tables but referenced study for this chemical does not specify HCl complex - parent is assumed correct + +> +http://potency.berkeley.edu/chempages/3-AMINO-4-[2-[(2-GUANIDINOTHIAZOL-4-YL)METHYLTHIO].html + +$$$$ + + + + 18 20 0 0 0 0 0 0 0 0 1 V2000 + 4.6526 -4.6047 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9902 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6526 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9853 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6477 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9853 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6526 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9902 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6575 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9951 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9951 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6575 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9951 -4.6047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6624 -4.6047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6624 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9804 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6477 -3.4555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 17 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +20057 + +> +57 + +> +20057 + +> +58_CPDBAS_v5c + +> +C15H11NO2 + +> +237.2533 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Amino-2-methylanthraquinone + +> +82-28-0 + +> +single chemical compound + +> +C.I. 60700 + +> +1-amino-2-methylanthracene-9,10-dione + +> +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N + +> +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N + +> +InChI=1/C15H11NO2/c1-8-6-7-11-12(13(8)16)15(18)10-5-3-2-4-9(10)14(11)17/h2-7H,16H2,1H3 + +> +ZLCUIOWQYBYEBG-UHFFFAOYAP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +59.2 + +> +0.249522345948402 + +> +32 + +> +TD50 is harmonic mean of more than one positive test + +> +kidney; liver + +> +liver + +> +active + +> +174 + +> +0.733393381672668 + +> +30 + +> +no positive results + +> +liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 111 + +> +http://potency.berkeley.edu/chempages/1-AMINO-2-METHYLANTHRAQUINONE.html + +$$$$ + + + + 14 15 0 0 0 0 0 0 0 0 2 V2000 + 2.3652 -3.2915 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -2.7519 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2950 -1.4299 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5900 -1.1511 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2555 -2.3022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5865 -2.4461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4768 -1.4569 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6908 -1.9965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5469 -3.3184 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2430 -3.5972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8419 -1.3310 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 7.8419 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9931 -1.9965 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4174 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 10 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 11 1 0 0 0 0 + 9 10 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 13 1 0 0 0 0 +M CHG 2 11 1 13 -1 +M END +> +20058 + +> +58 + +> +20058 + +> +59_CPDBAS_v5c + +> +C6H4N4O4 + +> +196.122 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-5-(5-nitro-2-furyl)-1,3,4-oxadiazole + +> +3775-55-1 + +> +single chemical compound + +> +5-(5-nitrofuran-2-yl)-1,3,4-oxadiazol-2-amine + +> +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N + +> +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N + +> +InChI=1/C6H4N4O4/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2 + +> +VTWQUFUBSCXPOW-IAUQMDSZCD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +3.67 + +> +1.87128420065062E-02 + +> +44 + +> +kidney; lung; mammary gland; stomach + +> +active + +> +active + +> +active + +> +multisite active + +> +http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-OXADIAZOLE.html + +$$$$ + + + + 14 15 0 0 0 0 0 0 0 0 2 V2000 + 8.4233 -3.5294 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5389 -2.5523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2248 -2.6870 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6857 -1.4825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3970 -1.2045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4957 -2.1985 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2743 -1.4320 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0698 -1.9626 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1877 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 0.9266 -3.2767 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5523 -0.1348 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8579 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6713 -0.5981 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8168 -1.2551 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 12 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 11 2 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 13 14 1 0 0 0 0 +M CHG 2 8 1 9 -1 +M END +> +20059 + +> +59 + +> +20059 + +> +60_CPDBAS_v5c + +> +C6H4N4O3S + +> +212.1826 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-5-(5-nitro-2-furyl)-1,3,4-thiadiazole + +> +712-68-5 + +> +single chemical compound + +> +5-(5-nitrofuran-2-yl)-1,3,4-thiadiazol-2-amine + +> +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1 + +> +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1 + +> +InChI=1/C6H4N4O3S/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2 + +> +SXZZHGJWUBJKHH-IAUQMDSZCG + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0.662 + +> +3.11995422810353E-03 + +> +52 + +> +kidney; lung; mammary gland; stomach + +> +active + +> +active + +> +active + +> +multisite active + +> +http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-THIADIAZOLE.html + +$$$$ + + + + 14 15 0 0 0 0 0 0 0 0 2 V2000 + 5.7002 -2.7618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4855 -1.6853 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7473 -2.1001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7473 -3.4236 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4855 -3.8383 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8238 -1.3147 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3678 -2.7618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5825 -3.8383 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3207 -3.4236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3207 -2.1001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5825 -1.6853 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2442 -1.3147 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.7912 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.4471 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 2 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 11 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 10 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 14 2 0 0 0 0 +M CHG 2 12 1 13 -1 +M END +> +20060 + +> +60 + +> +39237 + +> +61_CPDBAS_v5c + +> +C7H5N3O3S + +> +211.1948 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-4-(5-nitro-2-furyl)thiazole + +> +38514-71-5 + +> +single chemical compound + +> +4-(5-nitrofuran-2-yl)-1,3-thiazol-2-amine + +> +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1 + +> +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1 + +> +InChI=1/C7H5N3O3S/c8-7-9-4(3-14-7)5-1-2-6(13-5)10(11)12/h1-3H,(H2,8,9)/f/h8H2 + +> +ZAVLMIGIVYJYMU-FSHFIPFOCT + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +5.85 + +> +2.76995456327523E-02 + +> +42 + +> +stomach; urinary bladder + +> +active + +> +7.87 + +> +3.72641750649164E-02 + +> +44 + +> +stomach + +> +active + +> +active + +> +active + +> +multisite active; multispecies active + +> +http://potency.berkeley.edu/chempages/2-AMINO-4-(5-NITRO-2-FURYL)THIAZOLE.html + +$$$$ + + + + 16 17 0 0 0 0 0 0 0 0 2 V2000 + 0.0000 -7.5449 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4042 -6.3035 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7130 -6.3035 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1172 -7.5449 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0586 -8.3148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0586 -9.6236 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4829 -5.2449 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8109 -5.2545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8310 -3.9649 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7637 -2.6561 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9859 -2.1846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8135 -3.2047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1014 -4.3017 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3227 -0.9239 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 7.5930 -0.5870 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3988 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 13 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 14 1 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 2 0 0 0 0 + 14 16 1 0 0 0 0 +M CHG 2 14 1 16 -1 +M END +> +20061 + +> +61 + +> +20061 + +> +62_CPDBAS_v5c + +> +C8H6N4O4 + +> +222.1598 + +> +defined organic + +> +parent + +> +tested chemical + +> +trans-5-Amino-3[2-(5-nitro-2-furyl)vinyl]-1,2,4-oxadiazole + +> +28754-68-9 + +> +single chemical compound + +> +stereochem + +> +3-[(E)-2-(5-nitrofuran-2-yl)ethenyl]-1,2,4-oxadiazol-5-amine + +> +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1 + +> +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1 + +> +InChI=1/C8H6N4O4/c9-8-10-6(11-16-8)3-1-5-2-4-7(15-5)12(13)14/h1-4H,(H2,9,10,11)/b3-1+/f/h9H2 + +> +RMZNNIOKNRDECR-OYGOROAMDP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +112 + +> +0.504141613379198 + +> +32 + +> +TD50 is harmonic mean of more than one positive test + +> +hematopoietic system; stomach + +> +hematopoietic system; stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/trans-5-AMINO-3[2-(5-NITRO-2-FURYL)VINYL]-1,2,4-OX.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 2 V2000 + 0.0000 -3.4525 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6642 -2.3037 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1.9925 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9835 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1488 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 9 1 0 0 0 0 + 7 8 2 0 0 0 0 +M CHG 2 2 1 11 -1 +M END +> +20062 + +> +62 + +> +20062 + +> +63_CPDBAS_v5c + +> +C6H6N2O3 + +> +154.1234 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-4-nitrophenol + +> +99-57-0 + +> +single chemical compound + +> +2-amino-4-nitrophenol + +> +O=[N+](C1=CC(=C(C=C1)O)N)[O-] + +> +O=[N+](C1=CC(=C(C=C1)O)N)[O-] + +> +InChI=1/C6H6N2O3/c7-5-3-4(8(10)11)1-2-6(5)9/h1-3,9H,7H2 + +> +VLZVIIYRNMWPSN-UHFFFAOYAN + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +839 + +> +5.44368992638366 + +> +18 + +> +kidney + +> +no positive results + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +TR 339 + +> +http://potency.berkeley.edu/chempages/2-AMINO-4-NITROPHENOL.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 2 V2000 + 0.0000 -3.4525 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6642 -2.3037 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1.9925 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9835 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1488 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 9 1 0 0 0 0 + 7 8 2 0 0 0 0 +M CHG 2 2 1 11 -1 +M END +> +20063 + +> +63 + +> +20063 + +> +64_CPDBAS_v5c + +> +C6H6N2O3 + +> +154.1234 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-5-nitrophenol + +> +121-88-0 + +> +single chemical compound + +> +2-amino-5-nitrophenol + +> +O=[N+](C1=CC(=C(C=C1)N)O)[O-] + +> +O=[N+](C1=CC(=C(C=C1)N)O)[O-] + +> +InChI=1/C6H6N2O3/c7-5-2-1-4(8(10)11)3-6(5)9/h1-3,9H,7H2 + +> +DOPJTDJKZNWLRB-UHFFFAOYAU + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +111 + +> +0.720202123752785 + +> +27 + +> +pancreas + +> +no positive results + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +TR 334 + +> +http://potency.berkeley.edu/chempages/2-AMINO-5-NITROPHENOL.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 2 V2000 + 1.9968 -4.6079 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6577 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9968 -2.3039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6577 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9889 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6544 -2.3039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9889 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6544 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6656 -2.3039 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4583 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1543 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 +M CHG 2 9 1 11 -1 +M END +> +20064 + +> +64 + +> +20064 + +> +65_CPDBAS_v5c + +> +C6H6N2O3 + +> +154.1234 + +> +defined organic + +> +parent + +> +tested chemical + +> +4-Amino-2-nitrophenol + +> +119-34-6 + +> +single chemical compound + +> +4-amino-2-nitrophenol + +> +OC1=C(C=C(C=C1)N)[N+](=O)[O-] + +> +OC1=C(C=C(C=C1)N)[N+](=O)[O-] + +> +InChI=1/C6H6N2O3/c7-4-1-2-6(9)5(3-4)8(10)11/h1-3,9H,7H2 + +> +WHODQVWERNSQEO-UHFFFAOYAM + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +309 + +> +2.00488699314965 + +> +23 + +> +urinary bladder + +> +no positive results + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +TR 94 + +> +http://potency.berkeley.edu/chempages/4-AMINO-2-NITROPHENOL.html + +$$$$ + + + + 15 16 0 0 0 0 0 0 0 0 2 V2000 + 3.1238 -1.1475 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3406 -2.2222 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0747 -1.8124 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0747 -0.4827 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3406 -0.0729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.5956 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4535 -1.1475 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1184 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4480 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1129 -1.1475 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4480 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1184 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4426 -1.1475 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 9.1074 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 9.1074 -2.3042 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 2 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 12 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 10 13 1 0 0 0 0 + 11 12 2 0 0 0 0 + 13 14 1 0 0 0 0 + 13 15 2 0 0 0 0 +M CHG 2 13 1 14 -1 +M END +> +20065 + +> +65 + +> +39238 + +> +66_CPDBAS_v5c + +> +C9H7N3O2S + +> +221.2332 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-4-(p-nitrophenyl)thiazole + +> +2104-09-8 + +> +single chemical compound + +> +4-(4-nitrophenyl)-1,3-thiazol-2-amine + +> +NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1 + +> +NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1 + +> +InChI=1/C9H7N3O2S/c10-9-11-8(5-15-9)6-1-3-7(4-2-6)12(13)14/h1-5H,(H2,10,11)/f/h10H2 + +> +RIKJWJIWXCUKQV-GIMVELNWCN + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +9.95 + +> +4.49751664759177E-02 + +> +43 + +> +hematopoietic system + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/2-AMINO-4-(p-NITROPHENYL)THIAZOLE.html + +$$$$ + + + + 9 9 0 0 0 0 0 0 0 0 2 V2000 + 5.1188 -0.2969 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4533 -1.4486 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 3.1225 -1.4486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3393 -2.5236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0749 -2.1141 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0749 -0.7832 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3393 -0.3737 0.0000 S 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 + 5.1188 -2.6003 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 +M CHG 2 2 1 9 -1 +M END +> +20066 + +> +66 + +> +20066 + +> +67_CPDBAS_v5c + +> +C3H3N3O2S + +> +145.1398 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-5-nitrothiazole + +> +121-66-4 + +> +single chemical compound + +> +5-nitro-1,3-thiazol-2-amine + +> +O=[N+](C1=CN=C(S1)N)[O-] + +> +O=[N+](C1=CN=C(S1)N)[O-] + +> +InChI=1/C3H3N3O2S/c4-3-5-1-2(9-3)6(7)8/h1H,(H2,4,5)/f/h4H2 + +> +MIHADVKEHAFNPG-LGEMBHMGCP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +44.6 + +> +0.307289937012453 + +> +31 + +> +no positive results; NTP assigned level of evidence positive + +> +kidney; lung; mammary gland + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +active + +> +multisite active + +> +TargetSites_Rat_Male modified v3a + +> +TR 53; final call in CPDB differs due to additional data; NTP-assigned level of evidence of carcinogenicity is "positive" in male rat; noting that "these experiments were particularly difficult to evaluate". + +> +http://potency.berkeley.edu/chempages/2-AMINO-5-NITROTHIAZOLE.html + +$$$$ + + + + 16 16 0 0 0 0 0 0 0 0 1 V2000 + 3.1225 -2.3401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3401 -3.4212 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0740 -3.0087 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.7911 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0740 -1.6786 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3401 -1.2661 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7526 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4526 -2.3401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1212 -1.1878 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4513 -1.1878 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1128 -2.3401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4513 -3.4924 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1212 -3.4924 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5493 -5.2563 0.0000 Mg 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6944 -5.9178 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3970 -5.9178 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 8 13 2 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 +M END +> +20067 + +> +67 + +> +20067 + +> +68_CPDBAS_v5c + +> +C9H10MgN2O4 + +> +234.494 + +> +defined organic + +> +complex Mg(OH)2 + +> +tested chemical + +> +2-Amino-5-phenyl-2-oxazolin-4-one + Mg(OH)2 + +> +18968-99-5 + +> +single chemical compound + +> +parent [2152-34-3] + +> +2-amino-5-phenyl-1,3-oxazol-4(5H)-one - dihydroxymagnesium (1:1) + +> +NC1=NC(C(C2=CC=CC=C2)O1)=O.O[Mg]O + +> +NC1=NC(C(C2=CC=CC=C2)O1)=O + +> +InChI=1/C9H8N2O2.Mg.2H2O/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;;;/h1-5,7H,(H2,10,11,12);;2*1H2/q;+2;;/p-2/fC9H8N2O2.Mg.2HO/h10H2;;2*1h/q;m;2*-1/rC9H8N2O2.H2MgO2/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;2-1-3/h1-5,7H,(H2,10,11,12);2-3H/f/h10H2; + +> +JOPOQPCBCUIPFX-VWMXNRJTCY + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/2-AMINO-5-PHENYL-2-OXAZOLIN-4-ONE%20+%20Mg(OH)2.html + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 3.3283 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9907 -1.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3283 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9954 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3329 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9954 -4.6053 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3283 -4.6053 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9907 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3236 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9861 -4.6053 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9861 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3236 -1.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9861 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3190 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9814 -1.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3190 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4560 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 17 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +20068 + +> +68 + +> +20068 + +> +69_CPDBAS_v5c + +> +C14H9NO2 + +> +223.2268 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Aminoanthraquinone + +> +117-79-3 + +> +single chemical compound + +> +2-amino-9,10-anthraquinone + +> +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N + +> +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N + +> +InChI=1/C14H9NO2/c15-8-5-6-11-12(7-8)14(17)10-4-2-1-3-9(10)13(11)16/h1-7H,15H2 + +> +XOGPDSATLSAZEK-UHFFFAOYAH + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +101 + +> +0.452454633583423 + +> +29 + +> +liver + +> +no positive results + +> +active + +> +1190 + +> +5.33090112835914 + +> +20 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +hematopoietic system; liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 144 + +> +http://potency.berkeley.edu/chempages/2-AMINOANTHRAQUINONE.html + +$$$$ + + + + 17 18 0 0 0 0 0 0 0 0 1 V2000 + 2.6631 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9948 -1.1570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6631 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9948 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6683 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6683 -1.1570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9896 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6579 -3.4610 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9844 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6527 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9793 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6475 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9793 -4.6080 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6527 -4.6080 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9741 -3.4610 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6475 -1.1570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 15 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 17 1 0 0 0 0 + 13 14 1 0 0 0 0 + 13 16 1 0 0 0 0 + 14 15 2 0 0 0 0 +M END +> +20069 + +> +69 + +> +20069 + +> +70_CPDBAS_v5c + +> +C14H15N3 + +> +225.289 + +> +defined organic + +> +parent + +> +tested chemical + +> +o-Aminoazotoluene + +> +97-56-3 + +> +single chemical compound + +> +2-methyl-4-[(E)-(2-methylphenyl)diazenyl]aniline + +> +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C + +> +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C + +> +InChI=1/C14H15N3/c1-10-5-3-4-6-14(10)17-16-12-7-8-13(15)11(2)9-12/h3-9H,15H2,1-2H3/b17-16+ + +> +PFRYFZZSECNQOL-WUKNDPDIBU + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +4.04 + +> +1.79325222270062E-02 + +> +44 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +active + +> +multisex active + +> +http://potency.berkeley.edu/chempages/o-AMINOAZOTOLUENE.html + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1544 -0.6620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1544 -1.9939 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4632 -0.6620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6095 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7639 -0.6620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9183 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0727 -0.6620 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 +M END +> +20070 + +> +70 + +> +20070 + +> +71_CPDBAS_v5c + +> +C6H13NO2 + +> +131.1742 + +> +defined organic + +> +parent + +> +tested chemical + +> +6-Aminocaproic acid + +> +60-32-2 + +> +single chemical compound + +> +6-aminohexanoic acid + +> +OC(=O)CCCCCN + +> +OC(=O)CCCCCN + +> +InChI=1/C6H13NO2/c7-5-3-1-2-4-6(8)9/h1-5,7H2,(H,8,9)/f/h8H + +> +SLXKOJJOQWFEFD-FZOZFQFYCD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/6-AMINOCAPROIC%20ACID.html + +$$$$ + + + + 13 14 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1562 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3316 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9935 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3251 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9869 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3251 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9935 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3186 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9804 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3120 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9739 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3120 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9804 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 13 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 +M END +> +20071 + +> +71 + +> +20071 + +> +72_CPDBAS_v5c + +> +C12H11N + +> +169.2224 + +> +defined organic + +> +parent + +> +tested chemical + +> +4-Aminodiphenyl + +> +92-67-1 + +> +single chemical compound + +> +biphenyl-4-amine + +> +NC1=CC=C(C=C1)C2=CC=CC=C2 + +> +NC1=CC=C(C=C1)C2=CC=CC=C2 + +> +InChI=1/C12H11N/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10/h1-9H,13H2 + +> +DMVOXQPQNTYEKQ-UHFFFAOYAX + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +active + +> +2.1 + +> +1.24097046253924E-02 + +> +50 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; urinary bladder + +> +liver; urinary bladder + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.html + +$$$$ + + + + 15 15 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1502 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3339 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9969 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3308 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9937 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3308 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9969 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3276 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9906 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3245 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9875 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3245 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9906 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3308 -3.6343 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6567 -3.6343 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 13 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 14 15 1 0 0 0 0 +M END +> +20072 + +> +72 + +> +20072 + +> +73_CPDBAS_v5c + +> +C12H12ClN + +> +205.6865 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +4-Aminodiphenyl.HCl + +> +2113-61-3 + +> +single chemical compound + +> +parent [92-67-1] + +> +biphenyl-4-amine hydrochloride + +> +NC1(=CC=C(C=C1)C2=CC=CC=C2).[H]Cl + +> +NC1(=CC=C(C=C1)C2=CC=CC=C2) + +> +InChI=1/C12H11N.ClH/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10;/h1-9H,13H2;1H + +> +GUHXYHYUBFCYGJ-UHFFFAOYAT + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +active + +> +0.98 + +> +4.76453243163747E-03 + +> +50 + +> +mammary gland + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.HCl.html + +$$$$ + + + + 14 16 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.8880 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0775 -2.1037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2943 -2.6461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3645 -1.8618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6692 -2.1404 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3363 -0.9896 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6630 -0.9896 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3301 -2.1404 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6630 -3.2912 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3363 -3.2912 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4420 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2326 -0.5424 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0158 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9382 -0.7770 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 +M END +> +20073 + +> +73 + +> +39239 + +> +74_CPDBAS_v5c + +> +C12H9NO + +> +183.2092 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Aminodiphenylene oxide + +> +3693-22-9 + +> +single chemical compound + +> +dibenzo[b,d]furan-2-amine + +> +NC3=CC1=C(C=C3)OC2=C1C=CC=C2 + +> +NC3=CC1=C(C=C3)OC2=C1C=CC=C2 + +> +InChI=1/C12H9NO/c13-8-5-6-12-10(7-8)9-3-1-2-4-11(9)14-12/h1-7H,13H2 + +> +FFYZMBQLAYDJIG-UHFFFAOYAK + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +4.24 + +> +0.023142942603319 + +> +47 + +> +TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable + +> +liver; urinary bladder + +> +liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/2-AMINODIPHENYLENE%20OXIDE.html + +$$$$ + + + + 12 12 0 0 0 0 0 0 0 0 1 V2000 + 4.0663 -4.2139 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6134 -2.9635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3039 -2.7322 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7568 -1.4818 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0663 -1.2504 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9228 -2.2694 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5241 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3039 -4.0613 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1519 -4.7259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.0613 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.7322 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1519 -2.0676 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 +M END +> +20074 + +> +74 + +> +20074 + +> +75_CPDBAS_v5c + +> +C9H17NO2 + +> +171.2388 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-(Aminomethyl)cyclohexaneacetic acid + +> +60142-96-3 + +> +single chemical compound + +> +[1-(aminomethyl)cyclohexyl]acetic acid + +> +NCC1(CC(=O)O)CCCCC1 + +> +NCC1(CC(=O)O)CCCCC1 + +> +InChI=1/C9H17NO2/c10-7-9(6-8(11)12)4-2-1-3-5-9/h1-7,10H2,(H,11,12)/f/h11H + +> +UGJMXCAKCUNAIE-WXRBYKJCCG + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +5850 + +> +34.1628182397914 + +> +10 + +> +pancreas + +> +no positive results + +> +active + +> +active + +> +Rat added v3a + +> +http://potency.berkeley.edu/chempages/1-(AMINOMETHYL)CYCLOHEXANEACETIC%20ACID.html + +$$$$ + + + + 19 18 0 0 0 0 0 0 0 0 1 V2000 + 1.3251 -5.7158 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3129 -4.5673 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9543 -2.2881 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2829 -3.4365 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2829 -1.1396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9666 -3.4365 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9666 -1.1396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3129 -2.2881 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9543 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3129 -6.8554 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9666 -5.7158 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9877 -4.5673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9666 -8.0039 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -5.7158 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4827 -6.6964 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1133 -5.3448 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4827 -5.3448 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8343 -5.3448 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4827 -3.9754 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 12 1 0 0 0 0 + 1 14 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 4 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 5 9 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 8 2 0 0 0 0 + 10 11 1 0 0 0 0 + 10 13 1 0 0 0 0 + 15 17 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 17 19 2 0 0 0 0 +M END +> +20075 + +> +75 + +> +20075 + +> +76_CPDBAS_v5c + +> +C10H18N2O6S + +> +294.3247 + +> +defined organic + +> +complex H2SO4 + +> +tested chemical + +> +2,2'-[(4-Aminophenyl)imino]bisethanol sulfate + +> +54381-16-7 + +> +single chemical compound + +> +parent [7575-35-1] + +> +2,2'-[(4-aminophenyl)imino]diethanol sulfate (salt) + +> +OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1 + +> +OCCN(CCO)c1ccc(N)cc1 + +> +InChI=1/C10H16N2O2.H2O4S/c11-9-1-3-10(4-2-9)12(5-7-13)6-8-14;1-5(2,3)4/h1-4,13-14H,5-8,11H2;(H2,1,2,3,4)/f/h;1-2H + +> +KMCFMEHSEWDYKG-ATDHBCBACR + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +Rat added v2a + +> +http://potency.berkeley.edu/chempages/2,2'-[(4-AMINOPHENYL)IMINO]BISETHANOL%20SULFATE.html + +$$$$ + + + + 6 6 0 0 0 0 0 0 0 0 1 V2000 + 1.3304 -1.0738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1104 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3767 -0.4086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3767 -1.7390 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1104 -2.1509 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.0738 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 2 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END +> +20076 + +> +76 + +> +20076 + +> +77_CPDBAS_v5c + +> +C2H4N4 + +> +84.08 + +> +defined organic + +> +parent + +> +tested chemical + +> +3-Aminotriazole + +> +61-82-5 + +> +single chemical compound + +> +tautomers + +> +1H-1,2,4-triazol-3-amine + +> +C1(N=CNN=1)N + +> +C1(N=CNN=1)N + +> +InChI=1/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6)/f/h5H,3H2 + +> +KLSJWNVTNUYHDU-YPUDGCQOCD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse; hamster + +> +inactive + +> +9.94 + +> +0.118220742150333 + +> +35 + +> +TD50 is harmonic mean of more than one positive test + +> +thyroid gland + +> +pituitary gland; thyroid gland + +> +active + +> +25.3 + +> +0.300903901046622 + +> +34 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +http://potency.berkeley.edu/chempages/3-AMINOTRIAZOLE.html + +$$$$ + + + + 14 13 0 0 0 0 0 0 0 0 1 V2000 + 1.1352 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2703 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4055 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5680 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7032 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8383 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9735 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1086 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2712 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4063 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5415 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1352 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.0241 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6766 -2.0241 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 12 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 14 1 0 0 0 0 +M END +> +20077 + +> +77 + +> +20077 + +> +78_CPDBAS_v5c + +> +C11H23NO2 + +> +201.3058 + +> +defined organic + +> +parent + +> +tested chemical + +> +11-Aminoundecanoic acid + +> +2432-99-7 + +> +single chemical compound + +> +11-aminoundecanoic acid + +> +OC(=O)CCCCCCCCCCN + +> +OC(=O)CCCCCCCCCCN + +> +InChI=1/C11H23NO2/c12-10-8-6-4-2-1-3-5-7-9-11(13)14/h1-10,12H2,(H,13,14)/f/h13H + +> +GUOSQNAUYHMCRU-NDKGDYFDCZ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +1100 + +> +5.46432343231044 + +> +18 + +> +liver; urinary bladder + +> +no positive results + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +active + +> +multisite active + +> +TR 216 + +> +http://potency.berkeley.edu/chempages/11-AMINOUNDECANOIC%20ACID.html + +$$$$ + + + + 6 4 0 0 0 0 0 0 0 0 2 V2000 + 2.6600 -2.6600 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 -1.3320 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1.3280 -1.3320 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 0.0000 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9880 -1.3320 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3320 0.0000 Cl 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M CHG 2 2 1 6 -1 +M END +> +20078 + +> +78 + +> +20078 + +> +79_CPDBAS_v5c + +> +H4ClN + +> +53.4915 + +> +inorganic + +> +tested chemical + +> +Ammonium chloride + +> +12125-02-9 + +> +single chemical compound + +> +ammonium chloride + +> +[H][N+]([H])([H])[H].[Cl-] + +> +InChI=1/ClH.H3N/h1H;1H3/fCl.H4N/h1h;1H/q-1;+1 + +> +NLXLAEXVIDQMFP-DWOZJLMICO + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/AMMONIUM%20CHLORIDE.html + +$$$$ + + + + 15 12 0 0 0 0 0 0 0 0 2 V2000 + 2.3011 -1.9952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3011 -3.3253 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1505 -3.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.3253 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.1505 -5.3204 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6312 -1.9952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2963 -3.1457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6312 -4.2963 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6264 -3.1457 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3011 -0.6651 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4583 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.1505 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9710 -1.9952 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7932 -6.6506 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1.4631 -6.6506 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 2 0 0 0 0 + 10 11 1 0 0 0 0 + 10 12 2 0 0 0 0 +M CHG 4 4 -1 11 -1 14 1 15 1 +M END +> +20079 + +> +79 + +> +20079 + +> +80_CPDBAS_v5c + +> +C6H14N2O7 + +> +226.1858 + +> +defined organic + +> +complex 2NH4 + +> +tested chemical + +> +Ammonium citrate + +> +3012-65-5 + +> +single chemical compound + +> +parent [77-92-9] + +> +diammonium 2-(carboxymethyl)-2-hydroxybutanedioate + +> +C(CC([O-])=O)(CC(O)=O)(C([O-])=O)O.[N+].[N+] + +> +C(CC(O)=O)(CC(O)=O)(C(O)=O)O + +> +InChI=1/C6H8O7.2H3N/c7-3(8)1-6(13,5(11)12)2-4(9)10;;/h13H,1-2H2,(H,7,8)(H,9,10)(H,11,12);2*1H3/fC6H6O7.2H4N/h7H;2*1H/q-2;2*+1 + +> +YXVFQADLFFNVDS-JYGIMERMCP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/AMMONIUM%20CITRATE.html + +$$$$ + + + + 2 0 0 0 0 0 0 0 0 0 2 V2000 + 10.0000 0.0000 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.3600 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 +M CHG 2 1 1 2 -1 +M END +> +20080 + +> +80 + +> +20080 + +> +81_CPDBAS_v5c + +> +H5NO + +> +35.0458 + +> +inorganic + +> +tested chemical + +> +Ammonium hydroxide + +> +1336-21-6 + +> +single chemical compound + +> +ammonium hydroxide + +> +[N+].[O-] + +> +InChI=1/H3N.H2O/h1H3;1H2/fH4N.HO/h1H;1h/q+1;-1 + +> +VHUUQVKOLVNVRT-QBBVKLOVCT + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/AMMONIUM%20HYDROXIDE.html + +$$$$ + + + + 16 16 0 0 0 0 0 0 0 0 1 V2000 + 3.1752 -3.9923 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3269 -3.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3269 -2.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4787 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4787 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6305 -2.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6305 -3.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7823 -3.9923 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4787 -3.9923 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0195 -2.2257 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1635 -1.2140 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8560 -1.4397 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3969 -2.6927 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.4202 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8756 -0.7471 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5604 -0.5214 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 14 1 0 0 0 0 + 15 16 1 0 0 0 0 +M END +> +20081 + +> +81 + +> +20081 + +> +82_CPDBAS_v5c + +> +C11H18N2O3 + +> +226.2748 + +> +defined organic + +> +parent + +> +tested chemical + +> +Amobarbital + +> +57-43-2 + +> +single chemical compound + +> +5-ethyl-5-(3-methylbutyl)pyrimidine-2,4,6(1H,3H,5H)-trione + +> +N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O + +> +N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O + +> +InChI=1/C11H18N2O3/c1-4-11(6-5-7(2)3)8(14)12-10(16)13-9(11)15/h7H,4-6H2,1-3H3,(H2,12,13,14,15,16)/f/h12-13H + +> +VIROVYVQCGLCII-BAINRFMOCW + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/AMOBARBITAL.html + +$$$$ + + + + 25 24 0 0 0 0 0 0 0 0 1 V2000 + 1.3247 -4.6461 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3247 -3.3214 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.3214 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6591 -3.3214 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3247 -1.9967 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1331 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9837 -1.9967 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9837 -0.6623 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1331 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2922 -0.6623 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2922 -1.9967 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4415 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5908 -1.9967 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5908 -0.6623 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7402 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1331 -6.6428 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9837 -5.9805 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9837 -4.6461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1331 -3.9837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2922 -4.6461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2922 -5.9805 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4415 -6.6428 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5908 -5.9805 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5908 -4.6461 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7402 -6.6428 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 2 0 0 0 0 + 6 7 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 13 15 1 0 0 0 0 + 16 17 2 0 0 0 0 + 16 21 1 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 2 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 2 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 23 24 1 0 0 0 0 + 23 25 1 0 0 0 0 +M END +> +20082 + +> +82 + +> +20082 + +> +83_CPDBAS_v5c + +> +C18H28N2O4S + +> +368.4909 + +> +defined organic + +> +complex bis H2SO4 + +> +tested chemical + +> +dl-Amphetamine sulfate + +> +60-13-9 + +> +single chemical compound + +> +racemic mixture of L- [51-62-7] and D- [51-63-8], parent [300-62-9], structure shown without stereochem + +> +1-phenylpropan-2-amine sulfate (2:1) + +> +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C + +> +C1=CC=CC=C1CC(N)C + +> +InChI=1/2C9H13N.H2O4S/c2*1-8(10)7-9-5-3-2-4-6-9;1-5(2,3)4/h2*2-6,8H,7,10H2,1H3;(H2,1,2,3,4)/f/h;;1-2H + +> +PYHRZPFZZDCOPH-IPLSSONACD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 387 + +> +http://potency.berkeley.edu/chempages/dl-AMPHETAMINE%20SULFATE.html + +$$$$ + + + + 29 28 0 0 1 0 0 0 0 0 1 V2000 + 7.0899 -2.6689 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4012 -3.9801 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4012 -2.6689 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0899 -3.9801 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6776 -4.3979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4667 -3.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6776 -2.2627 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4244 -1.3228 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0783 -1.3228 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7439 -2.6573 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6038 -2.6573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6038 -4.0033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0837 -5.6743 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3834 -5.9528 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1902 -6.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1384 -4.9432 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2976 -0.6498 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2976 -1.9843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1372 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1372 -2.6573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6498 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4463 -2.6573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4463 -3.9801 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6067 -1.9843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6067 -0.6498 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0232 -7.1248 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9727 -7.0783 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7132 -7.1712 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 9 1 6 0 0 0 + 1 10 1 1 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 7 1 0 0 0 0 + 3 8 1 6 0 0 0 + 4 16 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 13 1 6 0 0 0 + 6 7 1 0 0 0 0 + 6 11 1 0 0 0 0 + 6 12 1 0 0 0 0 + 10 25 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 15 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 19 2 0 0 0 0 + 18 20 2 0 0 0 0 + 18 23 1 0 0 0 0 + 19 21 1 0 0 0 0 + 20 22 1 0 0 0 0 + 21 22 2 0 0 0 0 + 23 24 1 6 0 0 0 + 23 25 1 0 0 0 0 + 25 26 2 0 0 0 0 +M END +> +20083 + +> +83 + +> +20083 + +> +84_CPDBAS_v5c + +> +C16H25N3O7S + +> +403.4506 + +> +defined organic + +> +complex 3H2O + +> +tested chemical + +> +Ampicillin trihydrate + +> +7177-48-2 + +> +single chemical compound + +> +stereochem; parent [69-53-4] + +> +(2S,5R,6R)-6-{[(2R)-2-amino-2-phenylacetyl]amino}-3,3-dimethyl-7-oxo-4-thia-1-azabicyclo[3.2.0]heptane-2-carboxylic acid trihydrate + +> +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O + +> +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O + +> +InChI=1/C16H19N3O4S.3H2O/c1-16(2)11(15(22)23)19-13(21)10(14(19)24-16)18-12(20)9(17)8-6-4-3-5-7-8;;;/h3-7,9-11,14H,17H2,1-2H3,(H,18,20)(H,22,23);3*1H2/t9-,10-,11+,14-;;;/m1.../s1/f/h18,22H;;; + +> +RXDALBZNGVATNY-FQLIROBNDT + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +structure modified v5b + +> +TR 318 + +> +http://potency.berkeley.edu/chempages/AMPICILLIN%20TRIHYDRATE.html + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 1 V2000 + 1.1536 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3071 -0.6696 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3071 -2.0006 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4607 -2.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6062 -2.0006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7598 -2.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9133 -2.0006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0669 -2.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1536 -2.6621 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.0006 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4607 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 10 2 0 0 0 0 +M END +> +20084 + +> +84 + +> +20084 + +> +85_CPDBAS_v5c + +> +C6H13N3O2 + +> +159.1876 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Amyl-1-nitrosourea + +> +10589-74-9 + +> +single chemical compound + +> +1-nitroso-1-pentylurea + +> +O=C(N(CCCCC)N=O)N + +> +O=C(N(CCCCC)N=O)N + +> +InChI=1/C6H13N3O2/c1-2-3-4-5-9(8-11)6(7)10/h2-5H2,1H3,(H2,7,10)/f/h7H2 + +> +YYTNAQDGJQPZFU-IAUQMDSZCI + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0.555 + +> +3.48645246237772E-03 + +> +51 + +> +TD50 is harmonic mean of more than one positive test + +> +hematopoietic system; lung; stomach + +> +hematopoietic system; lung; mammary gland; stomach; uterus + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +TD50_Rat modified v5a + +> +http://potency.berkeley.edu/chempages/1-AMYL-1-NITROSOUREA.html + +$$$$ + + + + 0 0 0 0 0 0 0 0 0 0 1 V2000 +M END +> +20085 + +> +20085 + +> +86_CPDBAS_v5c + +> +no structure + +> +no structure + +> +Amylopectin sulfate + +> +9047-13-6 + +> +macromolecule + +> +non-linear polymer of glucose (Merck - amylopectic) + +> +InChI=1// + +> +MOSFIJXAXDLOML-UHFFFAOYAM + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +283 + +> +50 + +> +TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active + +> +large intestine + +> +active + +> +active + +> +TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture + +> +http://potency.berkeley.edu/chempages/AMYLOPECTIN%20SULFATE.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 0.6773 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1753 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6640 -2.3241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9921 -2.3241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6561 -1.1753 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9842 -1.1753 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6482 -2.3241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9842 -3.4729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6561 -3.4729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9763 -2.3241 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6403 -3.4729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +20086 + +> +86 + +> +20086 + +> +87_CPDBAS_v5c + +> +C10H12O + +> +148.2017 + +> +defined organic + +> +parent + +> +representative isomer in mixture + +> +Anethole + +> +104-46-1 + +> +mixture or formulation + +> +mixture of Z [25679-28-1], E [4180-23-8] isomers, structure shown Z, stereochem + +> +1-(methyloxy)-4-[(1Z)-prop-1-en-1-yl]benzene + +> +CC=CC1=CC=C(C=C1)OC + +> +CC=CC1=CC=C(C=C1)OC + +> +InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3- + +> +RUVINXPYWBROJD-ARJAWSKDBC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/ANETHOLE.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3316 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9934 -1.1561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3249 -1.1561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9867 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3183 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9801 -1.1561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3183 -2.3043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9867 -2.3043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3116 -1.1561 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9734 -2.3043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +20087 + +> +87 + +> +20087 + +> +88_CPDBAS_v5c + +> +C10H12O + +> +148.2017 + +> +defined organic + +> +parent + +> +tested chemical + +> +trans-Anethole + +> +4180-23-8 + +> +single chemical compound + +> +stereochem + +> +1-(methyloxy)-4-[(1E)-prop-1-en-1-yl]benzene + +> +C/C=C/C1=CC=C(C=C1)OC + +> +C/C=C/C1=CC=C(C=C1)OC + +> +InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3+ + +> +RUVINXPYWBROJD-ONEGZZNKBR + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/trans-ANETHOLE.html + +$$$$ + + + + 17 18 0 0 1 0 0 0 0 0 1 V2000 + 3.5180 -1.6894 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5813 -0.9143 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9254 -2.9615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6745 -1.6894 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2571 -2.9615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9962 -1.6894 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3403 -3.7465 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1403 -4.0347 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2559 -1.2820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2522 -2.1863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9776 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.7689 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3937 -2.9615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6658 -3.3788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9378 -3.7962 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0732 -2.1068 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2484 -4.6310 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 1 0 0 0 + 1 3 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 8 1 1 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 6 0 0 0 + 5 7 1 6 0 0 0 + 6 13 1 0 0 0 0 + 7 13 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 11 1 1 0 0 0 + 10 12 1 0 0 0 0 + 13 14 1 6 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 + 14 17 1 0 0 0 0 +M END +> +20088 + +> +88 + +> +20088 + +> +89_CPDBAS_v5c + +> +C8H11Cl3O6 + +> +309.52834 + +> +defined organic + +> +parent + +> +tested chemical + +> +Anhydroglucochloral + +> +15879-93-3 + +> +single chemical compound + +> +Chlorlose-alpha, stereochem + +> +1,2-O-[(1R)-2,2,2-trichloroethylidene]-alpha-D-glucofuranose + +> +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2 + +> +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2 + +> +InChI=1/C8H11Cl3O6/c9-8(10,11)7-16-5-3(14)4(2(13)1-12)15-6(5)17-7/h2-7,12-14H,1H2/t2-,3+,4-,5-,6-,7-/m1/s1 + +> +OJYGBLRPYBAHRT-IPQSZEQABF + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +structure modified v5b + +> +http://potency.berkeley.edu/chempages/ANHYDROGLUCOCHLORAL.html + +$$$$ + + + + 16 17 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -3.9909 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -1.9995 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3058 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4587 -1.9995 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4587 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3058 -3.9909 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6036 -3.9909 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7565 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7565 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9094 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0623 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0623 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9094 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9094 -5.3211 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3058 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 +M END +> +20089 + +> +89 + +> +20089 + +> +90_CPDBAS_v5c + +> +C9H5Cl3N4 + +> +275.5218 + +> +defined organic + +> +parent + +> +tested chemical + +> +Anilazine + +> +101-05-3 + +> +single chemical compound + +> +4,6-dichloro-N-(2-chlorophenyl)-1,3,5-triazin-2-amine + +> +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl + +> +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl + +> +InChI=1/C9H5Cl3N4/c10-5-3-1-2-4-6(5)13-9-15-7(11)14-8(12)16-9/h1-4H,(H,13,14,15,16)/f/h13H + +> +IMHBYKMAHXWHRP-NDKGDYFDCD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 104 + +> +http://potency.berkeley.edu/chempages/ANILAZINE.html + +$$$$ + + + + 7 7 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1496 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3292 -1.1496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9958 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3250 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9916 -1.1496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3250 -2.3032 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9958 -2.3032 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 +M END +> +20090 + +> +90 + +> +20090 + +> +91_CPDBAS_v5c + +> +C6H7N + +> +93.1265 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aniline + +> +62-53-3 + +> +single chemical compound + +> +aniline + +> +NC1=CC=CC=C1 + +> +NC1=CC=CC=C1 + +> +InChI=1/C6H7N/c7-6-4-2-1-3-5-6/h1-5H,7H2 + +> +PAYRUJLWNCNPSJ-UHFFFAOYAP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/ANILINE.html + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1525 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3279 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9939 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3219 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9878 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3219 -2.3050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9939 -2.3050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3279 -3.6329 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6599 -3.6329 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 +M END +> +20091 + +> +91 + +> +20091 + +> +92_CPDBAS_v5c + +> +C6H8ClN + +> +129.5874 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +Aniline.HCl + +> +142-04-1 + +> +single chemical compound + +> +parent [62-53-3] + +> +aniline hydrochloride + +> +NC1=CC=CC=C1[H]Cl + +> +NC1=CC=CC=C1 + +> +InChI=1/C6H7N.ClH/c7-6-4-2-1-3-5-6;/h1-5H,7H2;1H + +> +MMCPOSDMTGQNKG-UHFFFAOYAJ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +269 + +> +2.07581909969642 + +> +22 + +> +TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results + +> +peritoneal cavity; spleen; vascular system + +> +peritoneal cavity + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +active + +> +multisite active; multisex active + +> +TR 130 + +> +http://potency.berkeley.edu/chempages/ANILINE.HCl.html + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 1 V2000 + 1.9960 -2.3024 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6614 -1.1536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9921 -1.1536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6574 -2.3024 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9921 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6614 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9960 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6653 -2.3024 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5988 -4.7867 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9247 -4.7867 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 8 9 1 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +20092 + +> +92 + +> +20092 + +> +93_CPDBAS_v5c + +> +C7H10ClNO + +> +159.6134 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +o-Anisidine.HCl + +> +134-29-2 + +> +single chemical compound + +> +parent [90-04-0] + +> +2-methoxyaniline hydrochloride + +> +C1(=C(C=CC=C1)N)OC.[H]Cl + +> +C1(=C(C=CC=C1)N)OC + +> +InChI=1/C7H9NO.ClH/c1-9-7-5-3-2-4-6(7)8;/h2-5H,8H2,1H3;1H + +> +XCZCWGVXRBJCCD-UHFFFAOYAX + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +29.7 + +> +0.186074602758916 + +> +33 + +> +TD50 is harmonic mean of more than one positive test + +> +kidney; thyroid gland; urinary bladder + +> +urinary bladder + +> +active + +> +966 + +> +6.0521234432698 + +> +19 + +> +TD50 is harmonic mean of more than one positive test + +> +urinary bladder + +> +urinary bladder + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 89 + +> +http://potency.berkeley.edu/chempages/o-ANISIDINE.HCl.html + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 1 V2000 + 1.9927 -1.1489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9913 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6555 -1.1489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9839 -1.1489 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9913 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6642 -1.1489 0.0000 O 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 + 2.3936 -3.6322 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7220 -3.6322 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +20093 + +> +93 + +> +20093 + +> +94_CPDBAS_v5c + +> +C7H10ClNO + +> +159.6134 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +p-Anisidine.HCl + +> +20265-97-8 + +> +single chemical compound + +> +parent [104-94-9] + +> +4-(methyloxy)aniline hydrochloride + +> +C1(=CC=C(N)C=C1)OC.[H]Cl + +> +C1(=CC=C(N)C=C1)OC + +> +InChI=1/C7H9NO.ClH/c1-9-7-4-2-6(8)3-5-7;/h2-5H,8H2,1H3;1H + +> +VQYJLACQFYZHCO-UHFFFAOYAH + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 116 + +> +http://potency.berkeley.edu/chempages/p-ANISIDINE.HCl.html + +$$$$ + + + + 10 10 0 0 0 0 0 0 0 0 1 V2000 + 2.6582 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9971 -1.1499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6582 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9971 -3.4542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6657 -3.4542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6657 -1.1499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9896 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6553 -1.1499 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6553 -3.4542 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 +M END +> +20094 + +> +94 + +> +20094 + +> +95_CPDBAS_v5c + +> +C7H7NO2 + +> +137.136 + +> +defined organic + +> +parent + +> +tested chemical + +> +Anthranilic acid + +> +118-92-3 + +> +single chemical compound + +> +2-aminobenzoic acid + +> +NC1=C(C=CC=C1)C(=O)O + +> +NC1=C(C=CC=C1)C(=O)O + +> +InChI=1/C7H7NO2/c8-6-4-2-1-3-5(6)7(9)10/h1-4H,8H2,(H,9,10)/f/h9H + +> +RWZYAGGXGHYGMB-BGGKNDAXCO + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 36 + +> +http://potency.berkeley.edu/chempages/ANTHRANILIC%20ACID.html + +$$$$ + + + + 16 18 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -4.6544 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -3.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3006 -4.6544 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4576 -3.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6079 -4.6544 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6079 -5.9842 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4576 -6.6491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3006 -5.9842 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4576 -2.6597 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6079 -1.9947 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3006 -1.9947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -2.6597 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6649 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3006 -0.6649 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +20095 + +> +95 + +> +20095 + +> +96_CPDBAS_v5c + +> +C14H8O2 + +> +208.2121 + +> +defined organic + +> +parent + +> +tested chemical + +> +9,10-Anthraquinone + +> +84-65-1 + +> +single chemical compound + +> +9,10-anthraquinone + +> +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3 + +> +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3 + +> +InChI=1/C14H8O2/c15-13-9-5-1-2-6-10(9)14(16)12-8-4-3-7-11(12)13/h1-8H + +> +RZVHIXYEVGDQDX-UHFFFAOYAA + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/9,10-ANTHRAQUINONE.html + +$$$$ + + + + 33 30 0 0 0 0 0 0 0 0 2 V2000 + 12.0104 -4.5373 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 + 2.4492 -4.9297 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 + 15.6998 -6.7352 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6637 -7.5987 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.3920 -6.7352 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4779 -0.6908 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3004 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1543 -0.6908 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3079 -7.7086 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1461 -7.0178 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -7.7086 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8281 -7.8813 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7994 -7.7086 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0287 -3.2342 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4055 -4.4902 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7414 -3.2185 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3379 -5.2123 0.0000 Sb 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3175 -4.4431 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3018 -5.9816 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 4.7100 -7.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3898 -5.9816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9973 -7.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9598 -3.2813 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2472 -3.2342 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5987 -4.5373 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6868 -4.4588 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 8.5250 -5.1966 0.0000 Sb 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4574 -5.9659 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8656 -7.1905 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5612 -5.9659 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1530 -7.1905 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1107 -2.4649 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6738 -2.1352 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 12 31 2 0 0 0 0 + 13 20 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 + 14 23 1 0 0 0 0 + 15 17 1 0 0 0 0 + 16 18 1 0 0 0 0 + 16 33 2 0 0 0 0 + 17 18 1 0 0 0 0 + 17 21 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 22 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 29 1 0 0 0 0 + 23 24 1 0 0 0 0 + 23 25 1 0 0 0 0 + 24 26 1 0 0 0 0 + 24 32 2 0 0 0 0 + 25 27 1 0 0 0 0 + 27 28 1 0 0 0 0 + 27 30 1 0 0 0 0 + 28 29 1 0 0 0 0 + 29 31 1 0 0 0 0 + 30 31 1 0 0 0 0 +M CHG 4 1 1 2 1 19 -1 26 -1 +M END +> +20096 + +> +96 + +> +39240 + +> +97_CPDBAS_v5c + +> +C8H10K2O15Sb2 + +> +667.8726 + +> +organometallic + +> +tested chemical + +> +Antimony potassium tartrate + +> +28300-74-5 + +> +single chemical compound + +> +dipotassium 5,11-dioxo-2,6,8,12,13,14-hexaoxa-1,7-distibatricyclo[8.2.1.1~4,7~]tetradecane-3,9-dicarboxylate trihydrate + +> +[K+].[K+].[O-]C(=O)C2O[Sb]3OC(C(O[Sb]1OC(=O)C2O1)C([O-])=O)C(=O)O3.O.O.O + +> +InChI=1/2C4H4O6.2K.3H2O.2Sb/c2*5-1(3(7)8)2(6)4(9)10;;;;;;;/h2*1-2H,(H,7,8)(H,9,10);;;3*1H2;;/q2*-2;2*+1;;;;2*+3/p-4/f2C4H2O6.2K.3H2O.2Sb/q2*-4;2m;;;;2m/rC8H6O12Sb2.2K.3H2O/c9-5(10)1-3-7(13)19-22(17-3)16-2(6(11)12)4-8(14)20-21(15-1)18-4;;;;;/h1-4H,(H,9,10)(H,11,12);;;3*1H2/q;2*+1;;;/p-2/fC8H4O12Sb2.2K.3H2O/q-2;2m;;; + +> +WBTCZEPSIIFINA-DYFLWLNICK + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +inactive + +> +0 + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/ANTIMONY%20POTASSIUM%20TARTRATE.html + +$$$$ + + + + 21 21 0 0 0 0 0 0 0 0 1 V2000 + 8.0682 -5.1439 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0682 -3.8092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9285 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7737 -3.8092 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6190 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4642 -3.8092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3095 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3095 -1.8146 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4642 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6190 -1.8146 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1547 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.4799 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8146 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4949 -2.2945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2230 -3.1493 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3777 -3.8092 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3777 -5.1439 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5325 -3.1493 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6872 -3.8092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.8420 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9967 -3.8092 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 8 11 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 11 14 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 16 18 1 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 1 0 0 0 0 +M END +> +20097 + +> +97 + +> +20097 + +> +98_CPDBAS_v5c + +> +C15H23ClO4S + +> +334.8587 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aramite + +> +140-57-8 + +> +single chemical compound + +> +2-chloroethyl 2-{[4-(1,1-dimethylethyl)phenyl]oxy}-1-methylethyl sulfite + +> +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl + +> +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl + +> +InChI=1/C15H23ClO4S/c1-12(20-21(17)19-10-9-16)11-18-14-7-5-13(6-8-14)15(2,3)4/h5-8,12H,9-11H2,1-4H3 + +> +YKFRAOGHWKADFJ-UHFFFAOYAL + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +96.7 + +> +0.288778520611828 + +> +31 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +active + +> +158 + +> +0.471840809272687 + +> +32 + +> +liver + +> +no positive results + +> +active + +> +active + +> +active + +> +multispecies active + +> +http://potency.berkeley.edu/chempages/ARAMITE.html + +$$$$ + + + + 13 12 0 0 0 0 0 0 0 0 1 V2000 + 4.6515 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3171 -1.1556 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6482 -1.1556 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3137 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6482 -3.4594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3171 -3.4594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3137 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3278 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6622 -3.4594 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3278 -4.6077 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6622 -1.1556 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3477 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3311 -2.3477 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 2 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 11 2 0 0 0 0 + 9 10 1 0 0 0 0 + 12 13 1 0 0 0 0 +M END +> +20098 + +> +98 + +> +20098 + +> +99_CPDBAS_v5c + +> +C8H14ClNO2 + +> +191.6571 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +Arecoline.HCl + +> +61-94-9 + +> +single chemical compound + +> +parent [63-75-2] + +> +methyl 1-methyl-1,2,5,6-tetrahydropyridine-3-carboxylate hydrochloride + +> +O=C(OC)C1=CCCN(C)C1.[H]Cl + +> +O=C(OC)C1=CCCN(C)C1 + +> +InChI=1/C8H13NO2.ClH/c1-9-5-3-4-7(6-9)8(10)11-2;/h4H,3,5-6H2,1-2H3;1H + +> +LQSWCSYIDIBGRR-UHFFFAOYAO + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +39.5 + +> +0.206097243462413 + +> +36 + +> +TD50 is harmonic mean of more than one positive test + +> +lung; stomach; vascular system + +> +lung; vascular system + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/ARECOLINE.HCl.html + +$$$$ + + + + 26 28 0 0 0 0 0 0 0 0 2 V2000 + 4.6012 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9551 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4264 -7.5675 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 4.6012 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6530 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9032 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5493 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9551 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9032 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0069 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6530 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0069 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3564 -0.7636 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1244 -7.5675 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2.2516 -0.7636 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0725 -8.6933 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3089 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8416 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7147 -5.3648 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5258 -6.2361 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 6.5493 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4975 -5.3648 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8416 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4975 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7897 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4949 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 9 2 0 0 0 0 + 2 4 2 0 0 0 0 + 2 5 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 16 2 0 0 0 0 + 4 8 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 10 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 21 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 18 1 0 0 0 0 + 8 13 1 0 0 0 0 + 8 11 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 15 1 0 0 0 0 + 12 19 2 0 0 0 0 + 12 20 1 0 0 0 0 + 13 17 1 0 0 0 0 + 15 17 1 0 0 0 0 + 18 22 1 0 0 0 0 + 18 24 2 0 0 0 0 + 21 23 2 0 0 0 0 + 22 25 1 0 0 0 0 + 23 24 1 0 0 0 0 +M CHG 4 3 1 14 -1 20 -1 26 1 +M END +> +20099 + +> +99 + +> +20099 + +> +100_CPDBAS_v5c + +> +C17H10NNaO7 + +> +363.2536 + +> +defined organic + +> +salt Na + +> +representative component in mixture + +> +Aristolochic acid, sodium salt (77% AA I, 21% AA II) + +> +10190-99-5 + +> +mixture or formulation + +> +structure shown AA I, parent [313-67-7]; AA II 6-Nitrophenanthro(3,4-d)-1,3-dioxole-5-carboxylic acid, sodium salt, AA II parent [475-80-9] + +> +sodium 8-(methyloxy)-6-nitrophenanthro[3,4-d][1,3]dioxole-5-carboxylate + +> +[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+] + +> +[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C(O)=O)=CC3=C2OCO3)=O + +> +InChI=1/C17H11NO7.Na/c1-23-12-4-2-3-8-9(12)5-11(18(21)22)14-10(17(19)20)6-13-16(15(8)14)25-7-24-13;/h2-6H,7H2,1H3,(H,19,20);/q;+1/p-1/fC17H10NO7.Na/q-1;m + +> +BQVOPWJSBBMGBR-KEMNOBITCY + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +active + +> +0.0141 + +> +50 + +> +TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active + +> +stomach + +> +stomach + +> +active + +> +active + +> +active + +> +multisex active + +> +kidney and urinary bladder were additional target sites but experiments too short to meet the inclusion rules of the CPDB; Rat added v2a; Mutagenicity_SAL_CPDB added v3a; TD50_Rat_mmol conversion from mg value not provided due to substance being a mixture + +> +http://potency.berkeley.edu/chempages/ARISTOLOCHIC%20ACID,%20SODIUM%20SALT%20(77%25%20AA%20I,%2021%25%20AA%20I.html + +$$$$ diff --git a/test/data/EPAFHM.csv b/test/data/EPAFHM.csv new file mode 100644 index 0000000..9092abc --- /dev/null +++ b/test/data/EPAFHM.csv @@ -0,0 +1,618 @@ +"STRUCTURE_SMILES","LC50_mmol" +"C1=CC(C=O)=CC(OC)=C1OCCCCCC",1.13E-02 +"C1(OC)=C([N+]([O-])=O)C(C=O)=CC(Br)=C1O",2.66E-01 +"CCCCCCCCOC(=O)C1=CC=CC(C(=O)OCCCCCCCC)=C1", +"C1=CC(Cl)=CC=C1OC2=C([N+](=O)[O-])C=CC=C2",7.69E-03 +"CC1=C(NC=O)C=CC=C1Cl",2.75E-01 +"CCCCOC(=O)C1=CC=CC(C(=O)OCCCC)=C1",3.23E-03 +"C(C1=CC=CC=C1)(C2=CC=CC=C2)(O)C#C",5.33E-02 +"CCCSCCSCCC",4.22E-02 +"CCCCCCCCOC(=O)C1=CC=C(C(=O)OCCCCCCCC)C=C1", +"OCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCOC(=O)C2=CC=CC=C2C(=O)OCCCCO", +"CCCSCCCCSCCC",1.45E-02 +"C1([N+](=O)[O-])=CC=C(C)C=C1OP(=O)(OC2=C([N+](=O)[O-])C=CC(C)=C2)OC3=C([N+]([O-])=O)C=CC(C)=C3", +"C1=C([N+]([O-])=O)C=CC=C1P(=O)(C2=CC([N+](=O)[O-])=CC=C2)C3=CC([N+](=O)[O-])=CC=C3", +"ClCCOC(=O)NC1CCCCC1",1.70E-01 +"O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC",2.08E+00 +"OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-]",5.92E-02 +"NC(=O)OCC",5.88E+01 +"[O-]C(C1=CC=CC=C1O)=O.[Na+]",1.25E+01 +"C1=CC=CC=C1C(=O)N",5.46E+00 +"CC[N+](CC)(CC)CC1(=CC=CC=C1).[Cl-]",7.07E-01 +"CN(C)N",1.31E-01 +"CC(C(C(NC([O-])=N1)=O)(C1=O)CC)CCC.[Na+]",1.99E-01 +"N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O",3.77E-01 +"O=C1C2=C(N=CN2C)N(C(=O)N1C)C",7.78E-01 +"C1=CC=C2C(=C1)C(=O)C(C)=CC2=O",6.39E-04 +"OC1=C(Cl)C(Cl)=C(Cl)C=C1Cl",4.44E-03 +"OC1=CC(C)=C(Cl)C=C1",3.84E-02 +"[H]Cl.C1=CC=CC=C1CC2=NCCN2",1.80E+00 +"O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C",7.82E-02 +"O(CC)CC",3.45E+01 +"O=C2N5[C@@]3([H])[C@@]1([H])[C@](C[C@]4([H])N(C7)CC[C@]34C6=C5C=CC=C6)([H])C7=CCO[C@]([H])1C2.O=C9N%12[C@@]%10([H])[C@@]8([H])[C@](C[C@]%11([H])N(C%14)CC[C@]%10%11C%13=C%12C=CC=C%13)([H])C%14=CCO[C@]([H])8C9.O=S(O)(O)=O",1.11E-03 +"NC1=CC=CC=C1",1.13E+00 +"O=C(OC1=C2C(=CC=C1)C=CC=C2)NC",4.35E-02 +"CCO",3.19E+02 +"C1(=NC=CC=C1C2CCCN2C).OS(O)(=O)=O",5.30E-02 +"C1(O)=CC=CC=C1C(=O)N",7.36E-01 +"O=C1NC(=O)NC=C1", +"CCCCCC=O",1.75E-01 +"O=C1OC2=CC=CC=C2C(O)=C1CC3=C(O)C4=CC=CC=C4OC3=O",1.52E-02 +"C1(C=O)=CC=C(OC2=CC=CC=C2)C=C1",2.32E-02 +"CO",9.17E+02 +"OC(C)C",1.44E+02 +"CC(=O)C",1.23E+02 +"ClC(Cl)Cl",5.92E-01 +"CS(=O)C",4.35E+02 +"ClC(C(Cl)(Cl)Cl)(Cl)Cl",6.00E-03 +"OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl",5.16E-05 +"C1=CC(=CC=C1N)C(=O)CC",9.79E-01 +"OCCC",7.57E+01 +"CCCCO",2.33E+01 +"CCCCCO",5.36E+00 +"C1=CC=CC=C1",2.25E-01 +"CC(Cl)(Cl)Cl",3.55E-01 +"[S-]C1=NC(C(C(C)CCC)(CC)C(N1)=O)=O.[Na+]",9.91E-02 +"CC#N",4.01E+01 +"CC=O",7.67E-01 +"ClCCl",3.89E+00 +"IC(I)I",7.42E-03 +"[N+](C)(C)(C)C.[Cl-]",4.22E+00 +"CC(C)(C)O",8.65E+01 +"C(F)(F)(F)CO",1.19E+00 +"CC(=O)C(C)(C)C",8.69E-01 +"ClC(C(Cl)Cl)(Cl)Cl",3.72E-02 +"CC1(C)NC(=O)NC1=O",1.29E+02 +"CCC(O)(C)CC",6.58E+00 +"C#CC(O)(C)CC",1.24E+01 +"C1CCCC(C#C)(O)C1",2.06E+00 +"CCCCOCCOP(=O)(OCCOCCCC)OCCOCCCC",2.81E-02 +"OCC(C)C",1.93E+01 +"CC(Cl)CCl",1.12E+00 +"NCC(N)C",1.36E+01 +"CC(O)CC",4.95E+01 +"CCC(=O)C",4.47E+01 +"OC(C)CN",3.36E+01 +"ClC(CCl)Cl",6.12E-01 +"ClC(=CCl)Cl",3.36E-01 +"CC(=O)OC",4.82E+00 +"ClC(C(Cl)Cl)Cl",1.21E-01 +"C1(C)(C)CCCC(C)=C1C=CC(C)=O",2.65E-02 +"ClC1=C(O)C(Cl)=CC(=C1)C(C2=CC(Cl)=C(O)C(=C2)Cl)(C)C",3.63E-03 +"C(C1C=CC(=CC=1)O)(CC)(C)C",1.58E-02 +"C1CC(CCC1(N)C)C(C)(N)C",3.83E-01 +"ClC(Cl)C1=C(Cl)C=CC=C1Cl",4.22E-03 +"C1=CC=C2C=CC=C3C2=C1CC3",1.12E-02 +"CC1=CNC2=C1C=CC=C2",6.74E-02 +"O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1",1.32E-05 +"O=C2C1=NC3=C(C=C(C)C(C)=C3)N(C[C@H](O)[C@H](O)[C@H](O)CO)C1=NC(N2)=O", +"C1=CC=CC=C1OC(=O)C2=CC=CC=C2C(=O)OC3=CC=CC=C3",2.51E-04 +"O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3", +"CCOC(=O)C1=CC=CC=C1C(=O)OCC",1.43E-01 +"C1=CC=C(C(=O)OCCCC)C(=C1)C(=O)OCCCC",3.5900E-03 +"CCC1=C(Br)C(Br)=C(Br)C(Br)=C1Br", +"O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC",2.02E-04 +"C1=CC=CC=C1NC(=O)C2=C(O)C=CC=C2",1.85E-02 +"Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl",3.45E-04 +"OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl",9.12E-04 +"OC1=C(C=C(C=C1Cl)Cl)Cl",2.48E-02 +"OC1=CC(C(F)(F)F)=C([N+]([O-])=O)C=C1",4.41E-02 +"C1(N)=CC=CC=C1C(=O)N",2.90E+00 +"OC1=C([N+]([O-])=O)C=CC=C1",1.15E+00 +"OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-]",2.23E-03 +"O=CC1=CC=CC=C1O",1.88E-02 +"OC1=CC=CC2=CC=CC=C12",3.21E-02 +"OC1=C(C=CC=C1)C2=CC=CC=C2",3.61E-02 +"C12C(=O)C3=C(OC=1C=CC=C2)C=CC=C3", +"BrC1=C(O)C(C=O)=CC(Br)=C1",3.04E-03 +"C1=C2C(=CC=C1)C=CC=C2",4.79E-02 +"N1=CC=CC2=C1C=CC=C2",6.02E-01 +"CCN(CC)C1CCCCC1",1.38E-01 +"CCN(CC)C1=CC=CC=C1",1.10E-01 +"OCCN(CC)C1=CC(C)=CC=C1",2.95E-01 +"C1CCCCC1C2CCCCC2", +"C1=CC=CC=C1C(=O)CC(=O)C",6.78E-03 +"C1=CC(N)=CC=C1C(=O)OCC",2.16E-01 +"O1COC2=CC=C(/C=C/C=C/C(=O)N3CCCCC3)C=C12",2.75E-02 +"C1(C=O)=C(O)C=C(O)C=C1",9.50E-02 +"CC1=C(C)C=CC=C1",1.54E-01 +"OC1=C(C)C=CC=C1",1.29E-01 +"ClC1=C(C=CC=C1)Cl",6.40E-02 +"NC1=C(Cl)C=CC=C1",4.50E-02 +"CC1=C(F)C=CC=C1",1.76E-01 +"OC1=CC=CC=C1Cl",8.87E-02 +"CC1=C(C=CC(=C1)C)C",6.42E-02 +"CC1=CC(Cl)=C(Cl)C=C1",1.81E-02 +"NC1=CC(Cl)=C(Cl)C=C1",4.67E-02 +"C=C(C)C(=O)OCC=C",7.85E-03 +"BrCC(Br)CO",3.26E-01 +"CC(C=O)CC",1.16E-01 +"ClCC(Cl)CCl",3.91E-01 +"CCC(=O)CC",1.79E+01 +"CCC(C)=NO",9.68E+00 +"OCCN(C(C)C)C(C)C",1.38E+00 +"NC1=C([N+]([O-])=O)C=C([N+]([O-])=O)C=C1",8.08E-02 +"OC1=CC=C(Cl)C=C1CC2=CC(Cl)=CC=C2O",1.15E-03 +"C[N+](C1=CC=CC=C1)(C)C.[I-]",9.24E-01 +"C(C1=CC=C(O)C=C1)(C)(C)C",3.43E-02 +"C1=CC=CC=C1C(C)C",5.26E-02 +"C1=CC=CC=C1C(=O)C",1.35E+00 +"O=[N+](C1=CC=CC=C1)[O-]",9.67E-01 +"C1=C(C(=O)C)C=C(N)C=C1",2.83E+00 +"CC1=CC([N+](=O)[O-])=CC=C1",1.87E-01 +"CN(C)C1=CC=C(C)C=C1",3.62E-01 +"O=[N+](C1=CC=C(C=C1)N)[O-]",9.05E-01 +"OC1=CC=C([N+](=O)[O-])C=C1",3.22E-01 +"CN(C)C1=CC=C(C=O)C=C1",3.06E-01 +"[O-][N+](=O)C1=CC=C([N+]([O-])=O)C=C1",4.22E-03 +"CCN(CCO)CC",1.52E+01 +"CCC1=CC=CC=C1",9.89E-02 +"NCC1=CC=CC=C1",9.52E-01 +"O=CC1=CC=CC=C1",9.30E-02 +"C1=CC=C(NC)C=C1",9.33E-01 +"ON=C1CCCCC1",1.84E+00 +"N1=C(C#N)C=CC=C1",6.97E+00 +"N1=C(CC)C=CC=C1",3.86E+00 +"CC1(C)OCC(CO)O1",1.26E+02 +"C1N2CN3CN(C2)CN1C3",3.55E+02 +"C1=CC=CC=C1OC2=CC=CC=C2",2.35E-02 +"CCNC1=CC(C)=CC=C1",3.66E-01 +"CCCN(CCC)CCC",3.55E-01 +"OCCN(CCO)CCO",7.91E+01 +"C1=CC=CC=C1CCC(C)(C)O",4.04E-01 +"C1=CC(C)=CC=C1SSC2=CC=C(C)C=C2", +"OCCN1CCNCC1",4.92E+01 +"CN(C)CC1=CC=CC=C1",2.80E-01 +"C1(=CC=C(C=C1)O)NC(C)=O",5.39E+00 +"NC1=CC=C(CCCC)C=C1",6.80E-02 +"CCCCCCCCCC1=CC=C(O)C=C1",6.35E-04 +"NC1=CC=C(CCCCCCCCCCCC)C=C1", +"CCC(CCCC)CO",2.17E-01 +"ClC1=CC=C(C=O)C=C1",1.56E-02 +"N1=C(C)C=CC(CC)=C1",6.69E-01 +"CC(=O)CCCN(CC)CC",2.14E+00 +"CCOC(=O)CC(=O)OCC",9.18E-02 +"OC1=C(C)C=C(C)C=C1",1.36E-01 +"CCCCOC(=O)C=CC(=O)OCCCC",2.76E-03 +"CCCCOC(=O)CCCCC(=O)OCCCC",1.41E-02 +"NC1=CC=C(Br)C=C1",2.76E-01 +"CC1=CC=C(C)C=C1",8.35E-02 +"OC1=CC=C(C)C=C1",1.53E-01 +"NC1=CC=C(C=C1)Cl",2.46E-01 +"OC1=CC=C(Cl)C=C1",4.75E-02 +"NC1=CC=C(C)C=C1",1.49E+00 +"C=CC(=O)OCC(C)C",1.64E-02 +"BrCCC",5.47E-01 +"C=CC=O",3.03E-04 +"ClCCCl",1.37E+00 +"ClCCO",6.67E-01 +"CCCN",5.21E+00 +"CCC#N",2.76E+01 +"ClCC#N",1.78E-02 +"NCCN",3.66E+00 +"C=CCO",5.51E-03 +"C(O)C#C",2.64E-02 +"CC=NO",1.29E+00 +"C[C@](CC(O)C)(C)O",9.05E+01 +"CC(C)(C)CC(C)(C)N",1.90E-01 +"CC(C)(C)SC(C)(C)C",1.99E-01 +"CCCC(=O)C",1.44E+01 +"CC(=O)CC(C)C",5.21E+00 +"CC(C)OC(C)C",7.69E+00 +"CC1=CC=CC=C1",3.68E-01 +"N1=CC=C(C)C=C1",4.33E+00 +"ClC1=CC=CC=C1",1.50E-01 +"C1CCCCC1O",7.03E+00 +"O=C1CCCCC1",6.33E+00 +"OC1=CC=CC=C1",3.47E-01 +"N1=CC(C)=CC=C1",1.55E+00 +"CN1CCNCC1",2.30E+01 +"N1=C(C)C=CC=C1",9.63E+00 +"N1CC(C)NCC1",2.24E+01 +"CC(=O)OCCC",5.87E-01 +"BrCCCBr",1.04E-02 +"BrCCCC",2.68E-01 +"CCCCN",3.66E+00 +"C=CCC#N",2.71E+00 +"NCCCN",1.61E+01 +"N#CCC#N",8.48E-03 +"COCCN",6.98E+00 +"CCNCC",1.17E+01 +"N1C=CC=C1",3.13E+00 +"C1CCCO1",3.00E+01 +"C1=COC=C1",8.96E-01 +"CC(C)(C)SSC(C)(C)C",7.68E-03 +"CC(=O)CCC(C)C",1.39E+00 +"CCOC(=O)CCCCCCCCC(=O)OCC",1.05E-02 +"CCCCCC(=O)C",1.15E+00 +"CCCCCC",2.90E-02 +"ClCCCCCl",4.06E-01 +"CCCCCN",2.03E+00 +"CCCCC=O",1.50E-01 +"C(O)C#CC(O)",6.23E-01 +"CCNCCO",1.66E+01 +"C1CCCCC1",5.38E-02 +"N1=CC=CC=C1",1.26E+00 +"C1OCOCO1",6.61E+01 +"O=C(CC/C=C(C)/C)C",6.79E-01 +"CC(=O)CCCCCC",2.81E-01 +"CC(=O)OCCOCC",3.19E-01 +"BrCCCCCC",2.09E-02 +"CCCCCCN",5.59E-01 +"CCCCCCO",9.56E-01 +"OCCNCCO",4.48E+01 +"OCCOCCO",7.09E+02 +"CCCSCCC",1.84E-01 +"CCCCCCCN",1.89E-01 +"N#CCCCCC#N",1.79E+01 +"CCCCCCCO",2.97E-01 +"BrCCCCCCCC",4.34E-03 +"CCCCCCCCN",4.02E-02 +"CCCCCCCCO",1.04E-01 +"CCOCCOCCO",1.98E+02 +"CCCCCCCCC(=O)O",6.57E-01 +"CCCCCCCCCC(=O)C",8.81E-03 +"CCCCCCCCCN",1.50E-02 +"OCCOCCOCCO",4.59E+02 +"CCCCCCCCCCO",1.52E-02 +"CCCCCCCCCCCCCO", +"CC(C)OC1=CC=CC=C1OC(=O)NC",4.21E-02 +"CC(O)(C)C#C",3.91E+01 +"C(Cl)(Cl)(Cl)CO",2.00E+00 +"OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl",1.67E-03 +"C1=CC=CC=C1OP(=O)(OC2=CC=CC=C2)OC3=CC=CC=C3",2.66E-03 +"S(=O)(C)C1=CC=C(OP(=S)(OCC)OCC)C=C1",1.40E-01 +"CC(C=NOC(=O)NC)(SC)C",4.52E-03 +"O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC", +"CCCCCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCCCCC", +"C1=CC=CC(O)=C1C(=O)OC2=CC=CC=C2",5.51E-03 +"C1=CC=CC(O)=C1C(=O)OCC",1.22E-01 +"OC1=C(Br)C=C(Br)C=C1Br",1.98E-02 +"OC1=C(C=C(C=C1)N)[N+](=O)[O-]",2.35E-01 +"C1=CC=CC=C1C(=O)C2=CC=CC=C2",8.07E-02 +"C1=CC=CC=C1N(CCO)CCO",4.06E+00 +"C1=CC(=CC=C1C=O)N(CC)CC",1.35E-01 +"OC1=C(C=CC=C1)O",8.37E-02 +"ClC1=C(Cl)C=C(Cl)C=C1",1.65E-02 +"ClC1=C(C=CC(=C1)Cl)O",4.75E-02 +"CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-]",1.33E-01 +"O=CC1=CC(OCC)=C(O)C=C1",5.27E-01 +"C1(C=O)=CC(OC)=C(O)C=C1",5.51E-01 +"CN(C1=CC=CC=C1)C",5.29E-01 +"ClC1=CC([N+](=O)[O-])=CC=C1",1.19E-01 +"O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC",4.27E-02 +"NC1=C(Cl)C=C([N+]([O-])=O)C=C1",1.16E-01 +"C1(C=O)=CC=C(C(C)C)C=C1",4.47E-02 +"C1=CC=CC=C1NC2=CC=CC=C2",2.24E-02 +"C1=CC=CC=C1OCCO",2.49E+00 +"OC1=CC=C(CC)C=C1",8.51E-02 +"CC(C=O)CCC",1.88E-01 +"CC(=O)CC(=O)C",1.35E+00 +"CCCCCC(=O)OCC",6.17E-02 +"CCCC=O",2.04E-01 +"CC(=O)OCCCC",1.55E-01 +"C1COCCO1",1.17E+02 +"CCCCCCCCCCCCN",5.56E-04 +"CCCCCCCCCCCCCC=O", +"CCCCOP(=O)(OCCCC)OCCCC",3.56E-02 +"O=C(CC(=O)C1)CC1(C)C",8.20E+01 +"OC(C)CCl",2.59E+00 +"ClC(=C(Cl)Cl)Cl",9.95E-02 +"CC(C1=CC=CC=C1)(O)C#C",7.73E-01 +"OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C",1.65E-03 +"O=S(C1=CC=CC=C1C([N-]2)=O)2=O.[Na+].[O]",8.20E+01 +"C1=CC=CC2C3=CC=CC=C3OC1=2",8.92E-03 +"C1=CC=CC=C1OC(=O)C2=C(O)C=C(N)C=C2",2.08E-02 +"CCN(CC)C(=O)C1=CC=CC(C)=C1",5.75E-01 +"CCC([O-])=O.[Na+]",4.99E+01 +"NCCN1CCNCC1",1.70E+01 +"CCCCOC(=O)CCC(=O)OCCCC",1.94E-02 +"CCOC(=O)CCCCC(=O)OCC",8.99E-02 +"OCCN",3.39E+01 +"CC(=O)OCC",2.61E+00 +"N1CC(C)OC(C)C1",3.36E+00 +"CCC1=CC(CC)=CC=C1",3.09E-02 +"ClCCCCl",9.82E-01 +"CCCCCC(O)=O",2.76E+00 +"CC(=O)OCCCCCC",3.05E-02 +"CCCCOCCCC",2.48E-01 +"CCCCCCCCCO",3.95E-02 +"CCCCCCNCCCCCC",4.21E-03 +"OCCCCCCCC\C=C/CCCCCCCC", +"C1(C=O)=C(O)C(OC)=CC=C1",1.58E-02 +"OC1=CC(OC)=CC=C1",5.96E-01 +"COC1=CC=C(C=C1)O",8.86E-01 +"COC1=CC=C(OC)C=C1",8.47E-01 +"C1=COC2=C1C=CC=C2",1.19E-01 +"C(CN(C1)C2)N(C1)C2",1.54E+01 +"C(CC(CC1CC23)C2)(C1)C3",2.06E-03 +"CCOP(OCC)(=S)SCCSCC",9.95E-03 +"[O-]C(N1)=NC(C(C(CCC)C)(CC=C)C1=O)=O.[Na+]",9.07E-02 +"BrC1=C(C)NC(=O)N(C(C)CC)C1=O",7.12E-01 +"OC1=C([N+](=O)[O-])C=CC([N+]([O-])=O)=C1",1.82E-02 +"ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl",6.09E-02 +"C1=CC(F)=CC=C1OC2=CC=C(F)C=C2",5.48E-03 +"S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC",3.07E-02 +"FC1=CC=C([N+](=O)[O-])C=C1",2.01E-01 +"C(F)(F)(F)C1=CC(C#N)=CC=C1",2.79E-01 +"NC1=CC=C(F)C=C1",1.52E-01 +"C1(C=O)=C(Cl)C=CC=C1F",5.93E-02 +"NC1=C(C(F)(F)F)C=C(F)C=C1",1.65E-01 +"C1(C=O)=C(F)C=CC=C1",1.09E-02 +"C1=CC=CC(=C1C(F)(F)F)C#N",2.47E-01 +"C1(C=O)=CC(C(F)(F)F)=CC=C1",5.31E-03 +"CNC1=CC=C(F)C=C1",3.07E-01 +"CCCCCCC(=O)CCCCCC", +"O[C@H]1[C@@]([C@@](C)2C)(C)CC[C@H]2C1",4.10E-01 +"O=C(CC1C2)C(C2)(C1(C)C)C",1.12E-01 +"CC2(C)OC1(C)CCC2CC1",6.61E-01 +"O=[C@](O)[C@@]1(C)[C@]([C@]([C@]([H])2CC3)(C)CCC1)([H])CCC2=C\C3=C(C)/C",4.93E-03 +"N1=C(C2=CC=CC=C2)NC(C3=CC=CC=C3)=C1C4=CC=CC=C4", +"C1COC2=CC=CC=C12",6.80E-01 +"O[C@H]1[C@H](CC2)C[C@H]2C1",2.03E+00 +"C1C2C=CC1CC2",1.06E-01 +"N1=C(C(=O)O)C=CC=C1C(=O)O",1.93E+00 +"N1=CC(C=O)=CC=C1",1.53E-01 +"CCCCC(=O)CCCC",2.18E-01 +"C=C(C)C(C)=C",8.41E-02 +"O=[C@](O)[C@@]3(C)[C@@]1([H])[C@@](CCC3)(C)[C@]2([H])C(C=[C@@]([C@@H](C)C)CC2)=CC1",7.87E-03 +"C1=CC=CC=C1C2=CC(=O)C3=CC=CC=C3O2",1.57E-02 +"OC1=C(C)C=C(C)C=C1C",9.54E-02 +"C1(C#N)=CC=CC=C1C",3.82E-01 +"C1(C=O)=C(C)C=CC=C1",4.40E-01 +"C1(=CC=CC=C1)C(=O)[O-].[Na+]",3.36E+00 +"OC1=C(C)C=C([N+]([O-])=O)C=C1[N+]([O-])=O",8.73E-03 +"C1=CC=CC=C1CCCCC",1.15E-02 +"O=C(OC(C)(C)C)C",2.82E+00 +"ClC1=CC(Cl)=CC=C1",5.46E-02 +"Cl\C=C\CCl",2.15E-03 +"CCCCSCCCC",2.45E-02 +"C1(O)=CC(OC)=CC=C1C(=O)C",4.18E-01 +"C1(C=O)=C([N+]([O-])=O)C=CC=C1",9.53E-02 +"O=CC1=CC=C([N+](=O)[O-])C=C1",6.68E-02 +"CC(=O)C(C)C",1.00E+01 +"OC1=C([N+]([O-])=O)C=CC=C1[N+]([O-])=O",2.16E-01 +"BrC1=C(Br)C=CC=C1",1.72E-02 +"C=CCNC1=CC=CC=C1",2.70E-01 +"NC1=CC=C(CC)C=C1",6.02E-01 +"CC(C)CC=O",3.77E-02 +"CCCCC(=O)C",4.27E+00 +"CC=CC=CC",2.43E-01 +"CCCCCCCCCCCC(=O)C",1.81E-03 +"C1=CC=CC=C1[Sn](C2=CC=CC=C2)(C3=CC=CC=C3)C4=CC=CC=C4", +"[H][C@]1(CC2)C(C)(C)CCC[C@@](C)1[C@@H](CC[C@@](O)(C)C=C)C2=C",4.13E-04 +"CC[Sn](CC)(CC)CC",4.68E-05 +"CC(C)C(C)N",3.26E+00 +"CC(C)C(O)C(C)C",1.40E+00 +"C1=CC=CC=C1N(C2=CC=CC=C2)C3=CC=CC=C3", +"C1=CC=CC=C1N(C2=CC=CC=C2)C=O",1.54E-01 +"CCOC(=O)C(CC1=CC=CC=C1)C(=O)OCC",2.17E-02 +"OC1=C(Br)C(Br)=C(Br)C(Br)=C1Br",1.90E-04 +"OC1=C(I)C=C(I)C=C1I",2.56E-03 +"C1(C=O)=C(OC)C=C(OC)C=C1",1.21E-01 +"OC1=C(NC(=O)C)C=CC=C1",1.79E-01 +"NC1=C(Cl)C=C(C)C=C1",2.54E-01 +"NC1=C([N+]([O-])=O)C=C(OCC)C=C1",1.43E-01 +"C1=CC([N+](=O)[O-])=CC=C1C(=O)OC",1.31E-01 +"C1=CC([N+]([O-])=O)=CC=C1C(=O)N",8.01E-01 +"C1=CC=CC=C1OC2=CC=C([N+](=O)[O-])C=C2",1.23E-02 +"C1=CC=C(CS(=O)CC2=CC=CC=C2)C=C1",3.48E-01 +"OC1=CC(NC(=O)C)=CC=C1",7.48E+00 +"OCCN1CCOCC1",2.07E+01 +"ClCC1=CC=C(CCl)C=C1",2.23E-04 +"IC1=CC=C(I)C=C1", +"O1C(C)=CC=C1C",7.40E-01 +"ClCCCCCCl",1.79E-01 +"BrCCCCCCC",8.21E-03 +"CCCSSCCC",1.70E-02 +"N#CCCCCCCC#N",3.88E+00 +"NC1=C(Cl)C(Cl)=C(Cl)C=C1",1.85E-02 +"C1(C=O)=C(O)C=CC(Cl)=C1",4.92E-03 +"OC1=CC=C(CCC)C=C1",8.08E-02 +"C1(C=O)=C(F)C(F)=C(F)C(F)=C1F",5.61E-03 +"C(Cl)(Cl)C(=O)N",1.88E+00 +"CCCCCCC(C)N",4.02E-02 +"CC(=O)CCCCCCCC",3.09E-02 +"CCCCCOCCCCC",1.98E-02 +"CC1=COC=N1",1.67E+01 +"CC1=NC=CN1",3.48E+00 +"O=C1C3CC2CC1CC(C3)C2",4.05E-01 +"CCCCCCC1OC(=O)CC1",1.06E-01 +"C1(C=O)=C(O)C=C(OC)C=C1OC",1.47E-02 +"C1=C(Cl)C(Cl)=CC=C1NC(=O)CC",3.94E-02 +"OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C",2.32E-04 +"C=CC(Cl)C(Cl)",6.54E-02 +"C(=O)N(CCCC)CCCC",5.68E-01 +"C(O)C#CC",1.44E-01 +"CC(C)=CC=C(C)C",3.43E-02 +"NC13CC(CC(C3)C2)CC2C1",1.65E-01 +"N1=C(O)C(C#N)=C(C)C=C1C",1.06E+00 +"NC1=C(F)C(F)=C(F)C(F)=C1F",2.03E-01 +"ClC1=CC=C(SCSP(=S)(OCC)OCC)C=C1",7.00E-04 +"C1=CC=CC=C1P(=O)(C2=CC=CC=C2)C3=CC=CC=C3",1.93E-01 +"C1=CC(N(C)C)=CC=C1P(=O)(C2=CC=C(N(C)C)C=C2)C3=CC=C(N(C)C)C=C3", +"C=CC(=O)OCCO",4.14E-02 +"C#CC(O)CCCCC",3.27E-03 +"CCCCCCCC(=O)C",1.07E-01 +"Cl[C@@H]1CCCC[C@H]1Cl",1.20E-01 +"C1=CC=CC=C1OC2=CC=C(O)C=C2",2.66E-02 +"C=C(C)C(=O)OCCO",1.74E+00 +"C1(Br)=CSC=C1",3.80E-02 +"O=CC1=C(Cl)C=C(Cl)C=C1",1.03E-02 +"C1=CC=CC=C1SSC2=CC=CC=C2",5.04E-04 +"C1(=CC=CC=C1)/C=C/C=C/C2=CC=CC=C2", +"O=C(OCC)C1=CC(N)=CC=C1.OS(C)(=O)=O",3.02E-01 +"C(F)(F)(F)C(O)C(F)(F)(F)",1.45E+00 +"C=CC(O)CC=C",3.88E-01 +"C(O)CC#C",5.15E-01 +"CC\C=C/CCO",3.80E+00 +"CC/C=C/CCO",2.71E+00 +"CN1C(C(=O)C)=CC=C1",1.28E+00 +"N1=CC=C(C2=CC=CC=C2)C=C1",1.04E-01 +"C1=CC=CC=C1S(=O)C2=CC=CC=C2",4.32E-01 +"C1=CC=CC=C1C2=CC=C(C3=CC=CC=C3)O2", +"C=CC(=O)OCC(O)C",2.60E-02 +"N1=C(N)C=CC(Br)=C1",1.02E+00 +"CCOP(=O)(CC1=CC=CC=C1)OCC",1.47E+00 +"CCCCCCCCCCCC(=O)N", +"N1=CC=C(C(=O)C)C=C1",1.39E+00 +"C1=CC(Cl)=CC=C1C(=O)OC",6.40E-02 +"CCCCOC1=CC=CC=C1",3.80E-02 +"C1=CC(C#N)=CC=C1C(=O)OC",2.90E-01 +"OC1=C(O)C(Cl)=C(Cl)C(Cl)=C1Cl",5.12E-03 +"C1=C(C(=O)CBr)C(OC)=CC=C1OC",2.55E-03 +"CCCC[Sn](CCCC)(CCCC)CCCC",1.30E-04 +"C#CC(C)(O)C(C)C",1.83E+00 +"C1=CC=C2C3=CC=CC=C3N(C2=C1)C=C",1.66E-05 +"C1=C(N)C=CC=C1OCC2=CC=CC=C2",4.59E-02 +"O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C",3.81E-03 +"CC(OC)(C)C",7.62E+00 +"C=CCCCCCCC=C",2.10E-03 +"C1=CC(O)=CC=C1/N=N/C2=CC=CC=C2",6.00E-03 +"C1=C(I)C(O)=C(I)C=C1C#N",1.83E-02 +"C1=C(Br)C(O)=C(Br)C=C1C#N",4.55E-02 +"O=[C@](O)[C@@]3(C)[C@@]2([H])[C@@](CCC3)(C)C1=C(CC2)C=[C@@]([C@@H](C)C)C=C1",6.99E-03 +"C=CCC1=CC=CC=C1O",1.12E-01 +"C1(C=O)=C(O)C=CC(Br)=C1",6.46E-03 +"C=C(CCl)C(Cl)",1.52E-03 +"C1=C(Cl)C(O)=C(Cl)C=C1C#N",1.29E-01 +"CCCCOC(=O)C1=CC=C(C(=O)OCCCC)C=C1",2.12E-03 +"C1=CC(O)=CC=C1OC2=CC=C(O)C=C2",2.86E-02 +"C1(Cl)=CC=CC(Cl)=C1C(=O)N",2.47E+00 +"CCCCCCCCCCN",6.55E-03 +"CNC(=O)OC1=CC(C)=C(N(C)C)C=C1",9.36E-03 +"N1=C(Br)NC(Br)=C1Br",2.01E-02 +"CCOP(=S)(OC1=CC=C(C=C1)[N+](=O)[O-])C2=CC=CC=C2",2.43E-04 +"OC(C)CC#C",4.17E-01 +"OC1=C(O)C=C(Cl)C=C1",1.09E-02 +"C1(O)=CC(O)=CC=C1C(=O)OC",2.72E-01 +"C=CC(=O)OCCCCCCCCCCCC", +"N1=C(Cl)C(Cl)=C(Cl)C(Cl)=C1Cl",1.87E-03 +"C1[C@H](C[C@H]([C@@H](C1)C(C)C)O)C",1.21E-01 +"C1=CN=CN1S(=O)(=O)C2=CC=C(C)C=C2",1.88E-01 +"C1=C(C(=O)C)C(Cl)=CC(Cl)=C1",6.89E-02 +"CCCCCCCCC#N",3.77E-02 +"NC1=CC(C(F)(F)F)=C(F)C=C1",1.68E-01 +"[C@H]1(CCCC[C@H]1O)C2=CC=CC=C2",2.52E-01 +"C=C(C)C(=O)OCCOCC",1.75E-01 +"OC1=C(C)C(C)=CC=C1C",6.02E-02 +"CCCCCCCCCCCC#N",2.37E-03 +"C1(OC)=CC=CC=C1C(=O)N",7.94E-01 +"C1(Cl)=CC(Cl)=CC=C1C(=O)N",5.03E-01 +"C=C(C)C(=O)OCC1OCCC1",2.04E-01 +"OC1=C(OC)C=C(Cl)C(Cl)=C1",2.32E-02 +"C=C(C)C(=O)OCC1=CC=CC=C1",2.65E-02 +"C=CC(=O)OCCCCCC",7.10E-03 +"CC(C)(C)C1=CC=C(OC(=O)NC)C=C1",4.82E-02 +"N1=C(CCN)C=CC=C1", +"C1=CC=CC=C1CN2CCNCC2",2.69E-01 +"N1=CC=CC(=C1)CCCO",1.09E+00 +"CCCCCCCCCCCCCN",3.28E-04 +"C1=CC=CC(N)=C1C(=O)C2=CC=C(Cl)C=C2",9.15E-03 +"C1(Cl)=CC=C(Cl)C=C1C(=O)OC",6.83E-02 +"S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC",9.07E-04 +"C1(OC)=CC(C=O)=CC(Br)=C1O",2.58E-01 +"C=CC(=O)OC1CCCCC1",9.60E-03 +"S(C1=CC=C(Cl)C=C1)(=O)C2=CC=C(Cl)C=C2", +"CCOC(=O)N(C(=O)OCC)C(=O)OCC",5.70E-02 +"OC1=C(O)C=C(Cl)C(Cl)=C1",4.97E-03 +"NC1=C(Cl)C(Cl)=CC(Cl)=C1Cl",1.17E-03 +"N1=C(C2=CC=CC=C2)C=CC=C1C3=CC=CC=C3",9.08E-04 +"ClC1=CC(Cl)=C([N+]([O-])=O)C=C1[N+]([O-])=O",1.92E-04 +"C1(Cl)=CC(Cl)=C(Cl)C=C1SSC2=C(Cl)C=C(Cl)C(Cl)=C2", +"C1=C(C)C(C)=CC=C1OP(=O)(OC2=CC(C)=C(C)C=C2)OC3=CC(C)=C(C)C=C3", +"CCC(C)C(C)C=O",1.40E-01 +"C(O)C#CCCCCCCC",6.94E-03 +"N1=C(O)C=CC(Cl)=C1",8.80E+00 +"CC(C)SSC(C)C",5.53E-02 +"C1(C=O)=C(OC)C=C(OC)C(OC)=C1",2.52E-01 +"C=C(C)C(=O)OC(C)C",2.96E-01 +"C=CC(O)CCC",3.04E-01 +"OC1=C(Cl)C(Cl)=C(Cl)C(Cl)=C1",1.77E-03 +"C1=CN=CC=C1CCC2=CC=NC=C2",8.20E-01 +"C1C(=O)N(CC)C(=S)N(CC)C1=O",2.25E+01 +"COC(=O)C1=CC=C(C(=O)OC)C=C1[N+]([O-])=O",2.73E-02 +"C1=CC(Cl)=CC2N=C(S)SC1=2",1.59E-02 +"COC(=O)C1=CC=C(C(=O)OC)C=C1N",4.27E-02 +"CCSCCSCC",4.01E-01 +"CN(CCCCl)C.[H]Cl",8.41E-01 +"C1=C(C(=O)C)C=C([N+]([O-])=O)C(Cl)=C1",2.76E-02 +"CC1=CC(Cl)=NC(N)=N1",9.82E-01 +"CC1=C(OC)C=CC=C1OC",1.33E-01 +"N1=C(N(C)C)C=CC=C1",1.04E+00 +"CC(C)(C)CN",5.45E+00 +"O=[C@](O)[C@@]3(C)[C@@]1([H])[C@@](CCC3)(C)[C@]2([H])C(C[C@](C=C)(C)CC2)=CC1",2.88E-03 +"C1(N)=CC=C(Cl)C=C1C#N",1.87E-01 +"ClC(Cl)(C(C)(O)C)Cl.ClC(Cl)(C(C)(O)C)Cl.[H]O[H]",3.62E-01 +"CCCCCCCCCCC(=O)C",6.40E-03 +"C1=C(/C=C/C=O)C=CC(N(C)C)=C1",3.67E-02 +"C(C(=O)O)[N+]1(=CC=CC=C1).[Cl-]",9.33E-01 +"ClC1=C([N+]([O-])=O)C(Cl)=C([N+]([O-])=O)C(Cl)=C1",8.18E-04 +"ClC1=CC=C([N+](=O)[O-])C=C1C=O",2.09E-02 +"N#CC1=C(Cl)C=CC=C1C",9.96E-02 +"N1=C(Br)C(O)=CC=C1",2.70E+00 +"N1=C(Cl)C(O)=CC=C1",4.80E+00 +"C#CCN(CC#C)CC#C",2.26E+00 +"CCOC(OCC)CN(C)CC(OCC)OCC",2.41E+00 +"NCCCN1CCN(CCCN)CC1",1.55E+01 +"OC(CC/C=C(C)/CC/C=C(C)\C)(C)C=C",6.43E-03 +"ClCCN1CCCC1.[H]Cl",9.00E-01 +"CCCCCCCCCCCN",1.23E-03 +"C#CC(O)CCCC",1.57E-02 +"C1(C=O)=CC=C(OCC)C=C1",1.87E-01 +"O=C(C(C(C1C2)(C)C)(C2)C)C1Br",2.96E-01 +"CC(C)=CC1C(C)(C)C1C(=O)OCC2=COC(CC3=CC=CC=C3)=C2",1.82E-05 +"CCOP(=S)(OCC)SCSC(C)(C)C",4.61E-05 +"BrC(Br)C1=C(C(Br)Br)C=CC=C1",1.04E-03 +"C1=C(C(=O)C)C(Cl)=C(Cl)C(Cl)=C1",8.95E-03 +"C1(OC)=C(OC)C(OC)=CC=C1C(=O)C",9.47E-01 +"CCOC(=O)C(Cl)C(=O)OCC",4.88E-03 +"CCNCC1=CC=CC=C1",4.22E-01 +"ClC1=CC=CC=[N+]1C.[I-]",7.79E-01 +"C1=CC(Br)=CC=C1C(=O)C2=CC=CN=C2",7.78E-02 +"C1=CC=CC=C1C(=O)C2=CC=NC=C2",5.62E-01 +"CC1(C)CCC(C)(C)O1",1.31E+00 +"N1=C([N+]([O-])=O)C(O)=CC=C1",1.19E+00 +"C1(CC)=CC=CC(CC)=C1N(COC)C(=O)CCl",1.85E-02 +"NC1=CC=C(CCCCCCCC)C=C1",5.84E-04 +"CSC(C)=NOC(=O)NC",1.30E-02 +"N1=C(O)C=CC=C1Cl",1.65E+00 +"NC1=NN=C(C)C(C)=N1",7.67E+00 +"C1=CC([N+]([O-])=O)=CC([N+](=O)[O-])=C1OC2=CC=C(Br)C=C2", +"O=CC1=CC=C(N(CC)CC)C=C1O",2.77E-02 +"N1=C(C)C=CC=C1Cl",1.82E+00 +"C#CC(CCC(C)C)(C)O",3.49E-01 +"CC1=C(C)OC(C)=N1",4.04E+00 +"CC(=O)C(C)CN(C)C",6.58E-02 +"C1=CC([N+](=O)[O-])=CC=C1OC2=CC(C)=C(Cl)C=C2", +"C1=CC=C(Br)C=C1C(=O)N",4.63E-01 +"O=C(C(=NOC(=O)NC)SC)N(C)C",3.09E-02 +"NC1=C(C(C)C)C=CC=C1C(C)C",8.63E-02 +"[Na+].[N-]=[N+]=[N-]",8.40E-02 +"C[N+](C1=CC=CC=C1)(C)C.[O-]S(=O)(=O)OC",1.00E+00 +"ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl", +"CC(C)(O)C(F)(C(F)F)F",3.64E+00 +"CCC(N)C",3.76E+00 +"COCCCNCC1=CC(OC)=C(OC)C(OC)=C1",5.05E-01 +"BrCC1OCCCC1",1.15E+00 +"NC1=CC=C(CCCCCCCCCC)C=C1",2.66E-04 +"NC1=CC=C(OCCCCCC)C=C1",1.56E-02 +"C1([N+](=O)[O-])=CC(Cl)=CC=C1C(=O)OC",1.28E-01 +"C1(C=O)=C([N+](=O)[O-])C=CC(O)=C1",2.51E-01 +"O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N",1.21E-05 +"C1=CC=C(OC2=CC=CC=C2)C=C1COC(=O)C3C(C)(C)C3C=C(Cl)Cl",4.09E-05 +"CCSCCCCSCC",3.40E-02 +"CCCCCCCCOC1=CC=CC=C1NC(=O)C",1.71E-03 +"C1=CC(C(C)(C)C)=CC=C1C(=O)N",1.80E-01 +"CSCCCCCCSC",5.66E-02 +"CC(O)C#C",1.67E-01 +"C1(C)=C(C)C=CC=C1OP(=O)(OC2=C(C)C(C)=CC=C2)OC3=C(C)C(C)=CC=C3", +"C1C(=CC=C[N+]=1CC2C=CC=CC=2)S(=O)(=O)[O-]",9.67E+00 +"C1=CC(C(C)(C)C)=CC=C1OC2=CC=CC(C=O)=C2",1.45E-03 +"O=C(OC(C2=CC=CC(OC3=CC=CC=C3)=C2)C#N)[C@H](C1=CC=C(OC(F)F)C=C1)[C@H](C)C",4.21E-07 +"ClC1=CC=CC(Cl)=C1OP(=O)(OC2=C(Cl)C=CC=C2Cl)OC3=C(Cl)C=CC=C3Cl", +"C1=C(C=O)C=CC=C1OC2=CC(Cl)=C(Cl)C=C2",1.12E-03 +"[Na+].O.O.[O-]C1=C([N+]([O-])=O)C=C([N+]([O-])=O)C2=CC=CC=C12",1.45E-02 +"CC(C)(C)C1=CC=C(C=C)C=C1",3.06E-03 +"O=P(OCC)(SCCSCC)OCC",6.19E-02 +"ClCC1=CC(C=C)=CC=C1",2.03E-03 diff --git a/test/data/EPAFHM.mini.csv b/test/data/EPAFHM.mini.csv new file mode 100644 index 0000000..c86cd33 --- /dev/null +++ b/test/data/EPAFHM.mini.csv @@ -0,0 +1,21 @@ +"STRUCTURE_SMILES","LC50_mmol" +"C1=CC(C=O)=CC(OC)=C1OCCCCCC",1.13E-02 +"C1(OC)=C([N+]([O-])=O)C(C=O)=CC(Br)=C1O",2.66E-01 +"CCCCCCCCOC(=O)C1=CC=CC(C(=O)OCCCCCCCC)=C1", +"C1=CC(Cl)=CC=C1OC2=C([N+](=O)[O-])C=CC=C2",7.69E-03 +"CC1=C(NC=O)C=CC=C1Cl",2.75E-01 +"CCCCOC(=O)C1=CC=CC(C(=O)OCCCC)=C1",3.23E-03 +"C(C1=CC=CC=C1)(C2=CC=CC=C2)(O)C#C",5.33E-02 +"CCCSCCSCCC",4.22E-02 +"CCCCCCCCOC(=O)C1=CC=C(C(=O)OCCCCCCCC)C=C1", +"OCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCOC(=O)C2=CC=CC=C2C(=O)OCCCCO", +"CCCSCCCCSCCC",1.45E-02 +"C1([N+](=O)[O-])=CC=C(C)C=C1OP(=O)(OC2=C([N+](=O)[O-])C=CC(C)=C2)OC3=C([N+]([O-])=O)C=CC(C)=C3", +"C1=C([N+]([O-])=O)C=CC=C1P(=O)(C2=CC([N+](=O)[O-])=CC=C2)C3=CC([N+](=O)[O-])=CC=C3", +"ClCCOC(=O)NC1CCCCC1",1.70E-01 +"O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC",2.08E+00 +"OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-]",5.92E-02 +"NC(=O)OCC",5.88E+01 +"[O-]C(C1=CC=CC=C1O)=O.[Na+]",1.25E+01 +"C1=CC=CC=C1C(=O)N",5.46E+00 +"CC[N+](CC)(CC)CC1(=CC=CC=C1).[Cl-]",7.07E-01 diff --git a/test/data/ISSCAN-multi.csv b/test/data/ISSCAN-multi.csv new file mode 100644 index 0000000..b404683 --- /dev/null +++ b/test/data/ISSCAN-multi.csv @@ -0,0 +1,59 @@ +SMILES,ISSCAN +CC(CCl)Cl,1 +C(Br)(Br)Br,1 +C=C(C)CCl,1 +O=Cc1ccco1,1 +COC34(C(COC(N)=O)C=1C(=O)C(N)=C(C)C(=O)C=1N4(CC2NC23)),1 +CC(N)Cc1ccccc1.CC(N)Cc1ccccc1,1 +Cc1cc(ccc1(N))C(=C2C=CC(=N)C=C2)c3ccc(N)cc3,1 +Oc1ccc(cc1)c2ccccc2,1 +CC(C)C=O,1 +N#CC(C#N)=Cc1ccccc1Cl,1 +Nc1ccc(cc1(N))[N+](=O)[O-],2 +NC(CCC(=O)NNc1ccc(CO)cc1)C(O)=O,2 +c1ccc2c(c1)nc(s2)SSc4nc3ccccc3s4,2 +C=CC=O,2 +CC(=O)Nc3cccc2Cc1ccccc1c23,2 +Cc1cccc2cccnc12,2 +Cc1ccc2ncccc2(c1),2 +CBr,2 +Nc1cc(ccc1(C(=O)O))[N+](=O)[O-],2 +C1N2CN3CN1CN(C2)C3,2 +O=[N+]([O-])c2cccc1ccccc12,2 +Oc1cccc2cccnc12,2 +O=CC(=C(C(=O)O)Cl)Cl,2 +CC1CN(N=O)C(=O)NC1(=O),2 +O1C2C1C3C4C2C5C3C6(C4(C(C5(C6(Cl)Cl)Cl)Cl)Cl)Cl,2 +OCCNc1ccc(cc1[N+](=O)[O-])N(CCO)CCO,2 +Cc1cc(N)ccc1(N).OS(=O)(=O)O,2 +CC(O)CCl,2 +O=[N+]([O-])C(Cl)(Cl)Cl,2 +Cc1ccc(cc1)S(=O)(=O)NC(=O)NN2CCCCCC2,2 +c1cc2ccc3cccc4ccc(c1)c2c34,2 +CC(=O)Nc1ccc(cc1)C(=O)CCl,2 +FC(F)Cl,2 +CN(N=O)c1ccc(cc1)[N+](=O)[O-],2 +C=CC,2 +Oc4c(cc1cc(ccc1c4(N=Nc2ccc(c3ccccc23)S(=O)(=O)[O-]))S(=O)(=O)[O-])S(=O)(=O)[O-],0 +CC=NN(C)C=O,0 +Nc2ccc(N=Nc1ccccc1)c(N)n2,0 +Cc3cc(C)c(N=Nc1cc(c2ccccc2(c1(O)))S(=O)(=O)[O-])c(c3)S(=O)(=O)[O-],0 +[O-]c1ccccc1c2ccccc2,0 +NNC(N)=O,0 +CNNCc1ccc(cc1)C(=O)NC(C)C,0 +c1cc(c(cc1c2ccc(c(c2Cl)Cl)Cl)Cl)Cl,0 +CCN(Cc1cccc(c1)S(=O)(=O)[O-])c2ccc(cc2)C(=C3C=CC(C=C3)=[N+](CC)Cc4cccc(c4)S(=O)(=O)[O-])c5ccc(cc5)S(=O)(=O)[O-],0 +COC(=O)C(c1ccccc1)C2CCCCN2,0 +CCCCC(CC)COS(=O)(=O)[O-],0 +Nc1ccccc1,0 +Cc1cccc(N)c1,0 +CN(C)CCN(Cc1cccs1)c2ccccn2,0 +CN(C)CCOC(C)(c1ccccc1)c2ccccn2,0 +Cc1cc(C)c(cc1(C))N=Nc3c(O)c(cc2cc(ccc23)S(=O)(=O)[O-])S(=O)(=O)[O-],0 +Cc1ccccc1(N),0 +CCC1(C(=O)N=C([O-])NC1(=O))c2ccccc2,0 +Nc5cc(cc6cc(c(N=Nc1ccc(cc1(O))c4ccc(N=Nc2c(O)c3c(N)cc(cc3(cc2S(=O)(=O)[O-]))S(=O)(=O)[O-])c(O)[c-]4)c(O)c56)S(=O)(=O)[O-])S(=O)(=O)[O-],0 +O=C1[N-]S(=O)(=O)c2ccccc12,0 +CN(C)c1ccc(cc1)C(c2ccc(cc2)N(C)C)=C3C=CC(C=C3)=[N+](C)C,0 +C13(C4(C2(C5(C(C1(C2(Cl)Cl)Cl)(C3(C(C45Cl)(Cl)Cl)Cl)Cl)Cl)Cl)Cl)Cl,0 +CCOCCc1c(nc(N)[n+]2[nH]cnc12)c3ccccc3,0 diff --git a/test/data/cpdb_100.csv b/test/data/cpdb_100.csv new file mode 100644 index 0000000..e691ccc --- /dev/null +++ b/test/data/cpdb_100.csv @@ -0,0 +1,101 @@ +"STRUCTURE_Parent_SMILES ","STRUCTURE_InChI ","ActivityOutcome_CPDBAS_MultiCellCall ","STRUCTURE_Shown ","TestSubstance_ChemicalName ","ActivityScore_CPDBAS_Rat ","TD50_Hamster_mg mg","TD50_Rat_mmol mmol","ActivityOutcome_CPDBAS_SingleCellCall ","TD50_Rat_Note ","STRUCTURE_MolecularWeight ","TD50_Dog_mg mg","TargetSites_Mouse_BothSexes ","DSSTox_CID ","STRUCTURE_ChemicalName_IUPAC ","NTP_TechnicalReport ","TD50_Cynomolgus_mg mg","ActivityOutcome_CPDBAS_Rat ","ActivityOutcome_CPDBAS_Mutagenicity ","ActivityScore_CPDBAS_Mouse ","STRUCTURE_InChIKey ","ChemicalNote ","ActivityOutcome_CPDBAS_MultiCellCall_Details ","TestSubstance_CASRN ","DSSTox_RID ","TargetSites_Mouse_Male ","TD50_Dog_Primates_Note ","STRUCTURE_Formula ","TD50_Rat_mg mg","TestSubstance_Description ","ActivityScore_CPDBAS_Hamster ","Endpoint ","TargetSites_Cynomolgus ","STRUCTURE_TestedForm_DefinedOrganic ","StudyType ","Note_CPDBAS ","TargetSites_Rhesus ","DSSTox_FileID ","TD50_Mouse_mmol mmol","ActivityOutcome_CPDBAS_Dog_Primates ","ChemicalPage_URL ","TD50_Mouse_Note ","ActivityOutcome_CPDBAS_Hamster ","TD50_Mouse_mg mg","STRUCTURE_ChemicalType ","TargetSites_Rat_Male ","TargetSites_Hamster_Female ","TargetSites_Dog ","TargetSites_Mouse_Female ","TargetSites_Hamster_BothSexes ","STRUCTURE_SMILES ","ActivityOutcome_CPDBAS_Mouse ","TargetSites_Rat_BothSexes ","TargetSites_Hamster_Male ","TD50_Hamster_mmol mmol","TD50_Hamster_Note ","Species ","TargetSites_Rat_Female ","DSSTox_Generic_SID ","TD50_Rhesus_mg mg" +"NC1C=CC2=C(N=1)NC3=CC=CC=C23","InChI=1/C11H9N3/c12-10-6-5-8-7-3-1-2-4-9(7)13-11(8)14-10/h1-6H,(H3,12,13,14)/f/h13H,12H2","active","tested chemical","A-alpha-C",blank,blank,blank,"active","blank",183.2122039794922,blank,"blank",1.0,"9H-pyrido[2,3-b]indol-2-amine","blank",blank,"blank","active",35.0,"FJTNLJLPLJDTRM-DXMPFREMCP","blank","multisite active; multisex active","26148-68-5",20001.0,"liver; vascular system","blank","C11H9N3",blank,"single chemical compound",blank,"TD50; Tumor Target Sites","blank","parent","Carcinogenicity","blank","blank","1_CPDBAS_v5d",0.2720000147819519,"blank","http://potency.berkeley.edu/chempages/A-alpha-C.html","TD50 is harmonic mean of more than one positive test","blank",49.79999923706055,"defined organic","blank","blank","blank","liver; vascular system","blank","NC1C=CC2=C(N=1)NC3=CC=CC=C23","active","blank","blank",blank,"blank","mouse","blank",20001.0,blank +"O=S(NC1=O)(OC(C)=C1)=O","InChI=1/C4H5NO4S.K/c1-3-2-4(6)5-10(7,8)9-3;/h2H,1H3,(H,5,6);/q;+1/p-1/fC4H4NO4S.K/q-1;m","inactive","tested chemical","Acesulfame-K",,,,"inactive","",201.24220275878906,,"",10606.0,"potassium 6-methyl-4-oxo-4H-1,2,3-oxathiazin-3-ide 2,2-dioxide","",,"","",0.0,"WBZFUFAFFUEMEI-COHKJUPYCC","parent [33665-90-6]","multisex inactive","55589-62-3",40770.0,"no positive results","","C4H4KNO4S",,"single chemical compound",,"TD50; Tumor Target Sites","","salt K","Carcinogenicity","Mouse added v5a; chemical added v5a","","2_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACESULFAME-K.html","no positive results","",,"defined organic","","","","no positive results","","O=S([N-]C1=O)(OC(C)=C1)=O.[K+]","inactive","","",,"","mouse","",30606.0, +"CC=O","InChI=1/C2H4O/c1-2-3/h2H,1H3","active","tested chemical","Acetaldehyde",20.0,565.0,3.4700000286102295,"active","TD50 is harmonic mean of more than one positive test",44.0526008605957,,"",2.0,"acetaldehyde","",,"active","inactive",,"IKHGUXGNUITLKF-UHFFFAOYAB","","multisite active; multisex active; multispecies active","75-07-0",20002.0,"","","C2H4O",153.0,"single chemical compound",1.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","3_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETALDEHYDE.html","","active",,"defined organic","nasal cavity","oral cavity","","","","CC=O","","","nasal cavity; oral cavity",12.800000190734863,"TD50 is harmonic mean of more than one positive test","rat; hamster","nasal cavity",39224.0, +"CC=NN(C)C=O","InChI=1/C4H8N2O/c1-3-5-6(2)4-7/h3-4H,1-2H3/b5-3+","active","tested chemical","Acetaldehyde methylformylhydrazone",,,,"active","",100.12000274658203,,"",3.0,"N'-[(1E)-ethylidene]-N-methylformic hydrazide","",,"","inactive",46.0,"IMAGWKUTFZRWSB-HWKANZROBR","","multisite active; multisex active","16568-02-8",20003.0,"lung; preputial gland","","C4H8N2O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","4_CPDBAS_v5d",0.025100000202655792,"","http://potency.berkeley.edu/chempages/ACETALDEHYDE%20METHYLFORMYLHYDRAZONE.html","TD50 is harmonic mean of more than one positive test","",2.509999990463257,"defined organic","","","","clitoral gland; lung; stomach","","CC=NN(C)C=O","active","","",,"","mouse","",39225.0, +"CC=NO","InChI=1/C2H5NO/c1-2-3-4/h2,4H,1H3/b3-2+","","tested chemical","Acetaldoxime",0.0,,,"inactive","no positive results",59.06719970703125,,"",4.0,"(1E)-acetaldehyde oxime","",,"inactive","inactive",,"FZENGILVLUJGJX-NSCUHMNNBP","","","107-29-9",20004.0,"","","C2H5NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","5_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETALDOXIME.html","","",,"defined organic","no positive results","","","","","CC=NO","","","",,"","rat","",20004.0, +"CC(=O)N","InChI=1/C2H5NO/c1-2(3)4/h1H3,(H2,3,4)/f/h3H2","active","tested chemical","Acetamide",21.0,,3.049999952316284,"active","TD50 is harmonic mean of more than one positive test",59.06719970703125,,"",5.0,"acetamide","",,"active","inactive",9.0,"DLFVBJFMPXGRIB-ZZOWFUDICC","","multisite active; multisex active; multispecies active","60-35-5",20005.0,"hematopoietic system","","C2H5NO",180.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","6_CPDBAS_v5d",51.0,"","http://potency.berkeley.edu/chempages/ACETAMIDE.html","","",3010.0,"defined organic","liver","","","no positive results","","CC(=O)N","active","","",,"","rat; mouse","liver",20005.0, +"C1(=CC=C(C=C1)O)NC(C)=O","InChI=1/C8H9NO2/c1-6(10)9-7-2-4-8(11)5-3-7/h2-5,11H,1H3,(H,9,10)/f/h9H","active","tested chemical","Acetaminophen",20.0,,3.2699999809265137,"active","TD50 is harmonic mean of more than one positive test",151.16259765625,,"",6.0,"N-(4-hydroxyphenyl)acetamide","TR 394; final call in CPDB differs due to additional data",,"active","inactive",17.0,"RZVAJINKPMORJF-BGGKNDAXCW","","multisite active; multisex active; multispecies active","103-90-2",20006.0,"liver","","C8H9NO2",495.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","7_CPDBAS_v5d",10.699999809265137,"","http://potency.berkeley.edu/chempages/ACETAMINOPHEN.html","TD50 is harmonic mean of more than one positive test","",1620.0,"defined organic","liver; urinary bladder","","","liver","","C1(=CC=C(C=C1)O)NC(C)=O","active","","",,"","rat; mouse","liver; urinary bladder",20006.0, +"O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2","InChI=1/C15H20N2O4S/c1-11(18)12-7-9-14(10-8-12)22(20,21)17-15(19)16-13-5-3-2-4-6-13/h7-10,13H,2-6H2,1H3,(H2,16,17,19)/f/h16-17H","inactive","tested chemical","Acetohexamide",0.0,,,"inactive","no positive results",324.3952941894531,,"",7.0,"4-acetyl-N-[(cyclohexylamino)carbonyl]benzenesulfonamide","TR 050",,"inactive","inactive",0.0,"VGZSUPCWNCWDAN-XQMQJMAZCC","","multisex inactive; multispecies inactive","968-81-0",20007.0,"no positive results","","C15H20N2O4S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","8_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETOHEXAMIDE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2","inactive","","",,"","rat; mouse","no positive results",20007.0, +"C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-]","InChI=1/C10H10N4O3S/c1-6(2)12-13-10-11-5-8(18-10)7-3-4-9(17-7)14(15)16/h3-5H,1-2H3,(H,11,13)/f/h13H","","tested chemical","Acetone[4-(5-nitro-2-furyl)-2-thiazolyl] hydrazone",43.0,,0.022700000554323196,"active","",266.27398681640625,,"",8.0,"propan-2-one [5-(5-nitrofuran-2-yl)-1,3-thiazol-2-yl]hydrazone","",,"active","",,"CUWVNOSSZYUJAE-NDKGDYFDCK","","","18523-69-8",20008.0,"","","C10H10N4O3S",6.050000190734863,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","9_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETONE[4-(5-NITRO-2-FURYL)-2-THIAZOLYL]HYDRAZONE.html","","",,"defined organic","","","","","","C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-]","","","",,"","rat","stomach",20008.0, +"CC#N","InChI=1/C2H3N/c1-2-3/h1H3","inactive","tested chemical","Acetonitrile ",0.0,,,"inactive","no positive results",41.05189895629883,,"",9.0,"acetonitrile","TR 447",,"inactive","inactive",0.0,"WEVYAHXRMPXWCK-UHFFFAOYAJ","","multisex inactive; multispecies inactive","75-05-8",20009.0,"no positive results","","C2H3N",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","10_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETONITRILE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","CC#N","inactive","","",,"","rat; mouse","no positive results",20009.0, +"CC(=NO)C","InChI=1/C3H7NO/c1-3(2)4-5/h5H,1-2H3","","tested chemical","Acetoxime",34.0,,0.16599999368190765,"active","",73.09380340576172,,"",10.0,"propan-2-one oxime","",,"active","",,"PXAJQJMDEXJWFB-UHFFFAOYAK","","","127-06-0",20010.0,"","","C3H7NO",12.100000381469727,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","11_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETOXIME.html","","",,"defined organic","liver","","","","","CC(=NO)C","","","",,"","rat","no positive results",20010.0, +"O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C","InChI=1/C12H12O4/c1-3-10(16-8(2)13)9-4-5-11-12(6-9)15-7-14-11/h3-6,10H,1,7H2,2H3","","tested chemical","1'-Acetoxysafrole",35.0,,0.11400000005960464,"active","TD50 is harmonic mean of more than one positive test",220.22129821777344,,"",11.0,"1-(1,3-benzodioxol-5-yl)prop-2-en-1-yl acetate","",,"active","active",0.0,"TXUCQVJZBXYDKH-UHFFFAOYAY","","","34627-78-6",20011.0,"no positive results","","C12H12O4",25.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","12_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1'-ACETOXYSAFROLE.html","no positive results","",,"defined organic","stomach","","","","","O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C","inactive","","",,"","rat; mouse","",39226.0, +"N(NC(C)=O)C1=CC=C(C=C1)CO","InChI=1/C9H12N2O2/c1-7(13)10-11-9-4-2-8(6-12)3-5-9/h2-5,11-12H,6H2,1H3,(H,10,13)/f/h10H","active","tested chemical","N'-Acetyl-4-(hydroxymethyl) phenylhydrazine",,,,"active","",180.20599365234375,,"",12.0,"N'-[4-(hydroxymethyl)phenyl]acetohydrazide","",,"","",27.0,"UFFJUAYKLIGSJF-KZFATGLACR","","multisite active; multisex active","65734-38-5",20012.0,"lung; vascular system","","C9H12N2O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","13_CPDBAS_v5d",1.340000033378601,"","http://potency.berkeley.edu/chempages/N'-ACETYL-4-(HYDROXYMETHYL)PHENYLHYDRAZINE.html","TD50 is harmonic mean of more than one positive test","",241.0,"defined organic","","","","lung; vascular system","","N(NC(C)=O)C1=CC=C(C=C1)CO","active","","",,"","mouse","",20012.0, +"N(NC(C)=O)C(C1=CC=NC=C1)=O","InChI=1/C8H9N3O2/c1-6(12)10-11-8(13)7-2-4-9-5-3-7/h2-5H,1H3,(H,10,12)(H,11,13)/f/h10-11H","active","tested chemical","1-Acetyl-2-isonicotinoylhydrazine",,,,"active","",179.17799377441406,,"",13.0,"N'-acetylpyridine-4-carbohydrazide","",,"","",25.0,"CVBGNAKQQUWBQV-PZWAIHAUCF","","multisex active","1078-38-2",20013.0,"lung","","C8H9N3O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","14_CPDBAS_v5d",1.840000033378601,"","http://potency.berkeley.edu/chempages/1-ACETYL-2-ISONICOTINOYLHYDRAZINE.html","TD50 is harmonic mean of more than one positive test","",330.0,"defined organic","","","","lung","","N(NC(C)=O)C(C1=CC=NC=C1)=O","active","","",,"","mouse","",20013.0, +"O=C1C(C(=O)OC(=C1)C)C(=O)C","InChI=1/C8H8O4/c1-4-3-6(10)7(5(2)9)8(11)12-4/h3,7H,1-2H3","inactive","tested chemical","3-Acetyl-6-methyl-2,4-pyrandione",,,,"inactive","",168.1488037109375,,"",14.0,"3-acetyl-6-methyl-2H-pyran-2,4(3H)-dione","",,"","",0.0,"PGRHXDWITVMQBC-UHFFFAOYAH","tautomers","multisex inactive","520-45-6",20014.0,"no positive results","","C8H8O4",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","15_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/3-ACETYL-6-METHYL-2,4-PYRANDIONE.html","no positive results","",,"defined organic","","","","no positive results","","O=C1C(C(=O)OC(=C1)C)C(=O)C","inactive","","",,"","mouse","",20014.0, +"C1(NNC(C)=O)=CC=CC=C1","InChI=1/C8H10N2O/c1-7(11)9-10-8-5-3-2-4-6-8/h2-6,10H,1H3,(H,9,11)/f/h9H","active","tested chemical","1-Acetyl-2-phenylhydrazine",,,,"active","",150.17779541015625,,"",15.0,"N'-phenylacetohydrazide","",,"","active",34.0,"UICBCXONCUFSOI-BGGKNDAXCP","","multisex active","114-83-0",20015.0,"vascular system","","C8H10N2O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","16_CPDBAS_v5d",0.3409999907016754,"","http://potency.berkeley.edu/chempages/1-ACETYL-2-PHENYLHYDRAZINE.html","TD50 is harmonic mean of more than one positive test","",51.20000076293945,"defined organic","","","","vascular system","","C1(NNC(C)=O)=CC=CC=C1","active","","",,"","mouse","",20015.0, +"CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2","InChI=1/C14H13NO/c1-11(16)15-14-9-7-13(8-10-14)12-5-3-2-4-6-12/h2-10H,1H3,(H,15,16)/f/h15H","","tested chemical","4-Acetylaminobiphenyl",49.0,,0.00559999980032444,"active","",211.26280212402344,,"",16.0,"N-biphenyl-4-ylacetamide","",,"active","",,"SVLDILRDQOVJED-YAQRNVERCM","","","4075-79-0",20016.0,"","","C14H13NO",1.1799999475479126,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","17_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-ACETYLAMINOBIPHENYL.html","","",,"defined organic","","","","","","CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2","","","",,"","rat","mammary gland",39243.0, +"CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1","InChI=1/C15H13NO/c1-10(17)16-15-8-4-7-13-12-6-3-2-5-11(12)9-14(13)15/h2-8H,9H2,1H3,(H,16,17)/f/h16H","","tested chemical","1-Acetylaminofluorene",0.0,,,"inactive","no positive results",223.2738037109375,,"",17.0,"N-9H-fluoren-1-ylacetamide","",,"inactive","",,"POECHIXSIXBYKI-WYUMXYHSCQ","","","28314-03-6",20017.0,"","","C15H13NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","18_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-ACETYLAMINOFLUORENE.html","","",,"defined organic","","","","","","CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1","","","",,"","rat","no positive results",20017.0, +"C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O","InChI=1/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17)/f/h16H","active","tested chemical","2-Acetylaminofluorene",49.0,17.399999618530273,0.005499999970197678,"active","TD50 is harmonic mean of more than one positive test",223.26980590820312,,"",18.0,"N-9H-fluoren-2-ylacetamide","",,"active","active",45.0,"CZIHNRWJTSTCEX-WYUMXYHSCF","","multisite active; multisex active; multispecies active","53-96-3",20018.0,"liver; urinary bladder","no positive results for Rhesus","C15H13NO",1.2200000286102295,"single chemical compound",53.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","no positive results","19_CPDBAS_v5d",0.03400000184774399,"inactive","http://potency.berkeley.edu/chempages/2-ACETYLAMINOFLUORENE.html","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results","active",7.590000152587891,"defined organic","liver; mammary gland; skin","no positive results","","liver; urinary bladder","","C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O","active","","liver",0.0778999999165535,"","rat; mouse; hamster; rhesus","liver; mammary gland; skin",39227.0, +"C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O","InChI=1/C15H13NO/c1-10(17)16-14-8-4-6-12-9-11-5-2-3-7-13(11)15(12)14/h2-8H,9H2,1H3,(H,16,17)/f/h16H","","tested chemical","4-Acetylaminofluorene",0.0,,,"inactive","no positive results",223.26980590820312,,"",19.0,"N-9H-fluoren-4-ylacetamide","",,"inactive","active",,"PHPWISAFHNEMSR-WYUMXYHSCU","","","28322-02-3",20019.0,"","","C15H13NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","20_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-ACETYLAMINOFLUORENE.html","","",,"defined organic","","","","","","C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O","","","",,"","rat","no positive results",20019.0, +"O=C(O)Cc1ccc(cc1)NC(C)=O","InChI=1/C10H11NO3/c1-7(12)11-9-4-2-8(3-5-9)6-10(13)14/h2-5H,6H2,1H3,(H,11,12)(H,13,14)/f/h11,13H","inactive","tested chemical","4-Acetylaminophenylacetic acid",0.0,,,"inactive","no positive results",193.19920349121094,,"",20.0,"[4-(acetylamino)phenyl]acetic acid","",,"inactive","",0.0,"MROJXXOCABQVEF-KZZMUEETCP","","multisex inactive; multispecies inactive","18699-02-0",20020.0,"no positive results","","C10H11NO3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a; Mouse added v2a","","21_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-ACETYLAMINOPHENYLACETIC%20ACID.html","no positive results","",,"defined organic","no positive results","","","no positive results","","O=C(O)Cc1ccc(cc1)NC(C)=O","inactive","","",,"","rat; mouse","no positive results",20020.0, +"CC(=O)N[C@@H](CS)C(=O)O","InChI=1/C5H9NO3S/c1-3(7)6-4(2-10)5(8)9/h4,10H,2H2,1H3,(H,6,7)(H,8,9)/t4-/m0/s1/f/h6,8H","","tested chemical","N-acetylcysteine",0.0,,,"inactive","no positive results",163.1949005126953,,"",21.0,"N-acetyl-L-cysteine","",,"inactive","",,"PWKSKIMOESPYIA-JVBVHTJODB","stereochem","","616-91-1",20021.0,"","","C5H9NO3S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a","","22_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/N-ACETYLCYSTEINE.html","","",,"defined organic","no positive results","","","","","CC(=O)N[C@@H](CS)C(=O)O","","","",,"","rat","",20021.0, +"OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-]","InChI=1/C14H7ClF3NO5/c15-10-5-7(14(16,17)18)1-4-12(10)24-8-2-3-11(19(22)23)9(6-8)13(20)21/h1-6H,(H,20,21)/f/h20H","active","tested chemical","Acifluorfen",,,,"active","",361.65728759765625,,"",22.0,"5-{[2-chloro-4-(trifluoromethyl)phenyl]oxy}-2-nitrobenzoic acid","",,"","",33.0,"NUFNQYOELLVIPL-UYBDAZJACV","","multisite active; multisex active","50594-66-6",20022.0,"liver; stomach","","C14H7ClF3NO5",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","23_CPDBAS_v5d",0.38999998569488525,"","http://potency.berkeley.edu/chempages/ACIFLUORFEN.html","TD50 is harmonic mean of more than one positive test","",141.0,"defined organic","","","","liver; stomach","","OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-]","active","","",,"","mouse","",20022.0, +"C=CC=O","InChI=1/C3H4O/c1-2-3-4/h2-3H,1H2","inactive","tested chemical","Acrolein ",0.0,,,"inactive","no positive results",56.06330108642578,,"",23.0,"acrylaldehyde","",,"inactive","active",0.0,"HGINCPLSRVDWNT-UHFFFAOYAQ","","multisex inactive; multispecies inactive","107-02-8",20023.0,"no positive results","","C3H4O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","24_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACROLEIN.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C=CC=O","inactive","","",,"","rat; mouse","no positive results",20023.0, +"C=CC(OCC)OCC","InChI=1/C7H14O2/c1-4-7(8-5-2)9-6-3/h4,7H,1,5-6H2,2-3H3","inactive","tested chemical","Acrolein diethylacetal",0.0,,,"inactive","no positive results",130.1864013671875,,"",24.0,"3,3-bis(ethyloxy)prop-1-ene","",,"inactive","",,"MCIPQLOKVXSHTD-UHFFFAOYAI","","multisex inactive","3054-95-3",20024.0,"","","C7H14O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","25_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACROLEIN%20DIETHYLACETAL.html","","",,"defined organic","no positive results","","","","","C=CC(OCC)OCC","","","",,"","rat","no positive results",20024.0, +"C=C/C=N/O","InChI=1/C3H5NO/c1-2-3-4-5/h2-3,5H,1H2/b4-3+","inactive","tested chemical","Acrolein oxime",0.0,,,"inactive","no positive results",71.07859802246094,,"",25.0,"(1E)-prop-2-enal oxime","",,"inactive","",,"KMNIXISXZFPRDC-ONEGZZNKBI","","multisex inactive","5314-33-0",20025.0,"","","C3H5NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","26_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACROLEIN%20OXIME.html","","",,"defined organic","no positive results","","","","","C=C/C=N/O","","","",,"","rat","no positive results",20025.0, +"CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O","InChI=1/C20H19NO3/c1-20(2)10-9-13-15(24-20)11-16(23-4)17-18(13)21(3)14-8-6-5-7-12(14)19(17)22/h5-11H,1-4H3","active","tested chemical","Acronycine",55.0,,0.0015999999595806003,"active","positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test",321.36981201171875,,"",26.0,"3,3,12-trimethyl-6-(methyloxy)-3,12-dihydro-7H-pyrano[2,3-c]acridin-7-one","TR 49",,"active","",0.0,"SMPZPKRDRQOOHT-UHFFFAOYAD","","multisite active; multisex active","7008-42-6",20026.0,"NTP bioassay inadequate","","C20H19NO3",0.5049999952316284,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","ActivityOutcome_CPDBAS_Mouse modified v5d","","27_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACRONYCINE.html","only experiment is NCI NTP bioassay inadequate","",,"defined organic","bone; peritoneal cavity","","","NTP bioassay inadequate","","CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O","unspecified","","",,"","rat; mouse","mammary gland; peritoneal cavity",20026.0, +"NC(=O)C=C","InChI=1/C3H5NO/c1-2-3(4)5/h2H,1H2,(H2,4,5)/f/h4H2","active","tested chemical","Acrylamide ",39.0,,0.052799999713897705,"active","TD50 is harmonic mean of more than one positive test",71.0779037475586,,"",27.0,"acrylamide","",,"active","inactive",,"HRPVXLWXLXDGHG-LGEMBHMGCJ","","multisite active; multisex active","79-06-1",20027.0,"","","C3H5NO",3.75,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat modified v3a","","28_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACRYLAMIDE.html","","",,"defined organic","nervous system; peritoneal cavity; thyroid gland","","","","","NC(=O)C=C","","","",,"","rat","clitoral gland; mammary gland; nervous system; oral cavity; thyroid gland; uterus",20027.0, +"OC(=O)C=C","InChI=1/C3H4O2/c1-2-3(4)5/h2H,1H2,(H,4,5)/f/h4H","inactive","tested chemical","Acrylic acid",0.0,,,"inactive","no positive results",72.06269836425781,,"",28.0,"acrylic acid","",,"inactive","inactive",,"NIXOWILDQLNWCW-JLSKMEETCA","","multisex inactive","79-10-7",20028.0,"","","C3H4O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","29_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACRYLIC%20ACID.html","","",,"defined organic","no positive results","","","","","OC(=O)C=C","","","",,"","rat","no positive results",39229.0, +"C=CC#N","InChI=1/C3H3N/c1-2-3-4/h2H,1H2","active","tested chemical","Acrylonitrile ",31.0,,0.3179999887943268,"active","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results",53.062599182128906,,"",29.0,"acrylonitrile","",,"active","active",39.0,"NLHHRLWOUZZQLW-UHFFFAOYAG","","multisite active; multisex active","107-13-1",20029.0,"harderian gland; stomach","","C3H3N",16.899999618530273,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Mouse added v5a","","30_CPDBAS_v5d",0.11900000274181366,"","http://potency.berkeley.edu/chempages/ACRYLONITRILE.html","TD50 is harmonic mean of more than one positive test","",6.320000171661377,"defined organic","ear Zymbals gland; nervous system; oral cavity; small intestine; stomach","","","harderian gland; stomach","","C=CC#N","active","","",,"","rat; mouse","ear Zymbals gland; mammary gland; nasal cavity; nervous system; oral cavity; small intestine; stomach",20029.0, +"O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N","InChI=1/C63H88N12O16/c1-17-31(8)44-61(86)75-25-19-21-38(75)59(84)71(14)27-40(77)73(16)50(30(6)7)63(88)90-35(12)46(57(82)67-44)69-55(80)41-42(64)51(78)33(10)53-48(41)65-47-36(23-22-32(9)52(47)91-53)54(79)68-45-34(11)89-62(87)49(29(4)5)72(15)39(76)26-70(13)58(83)37-20-18-24-74(37)60(85)43(28(2)3)66-56(45)81/h22-23,28-31,34-35,37-38,43-46,49-50H,17-21,24-27,64H2,1-16H3,(H,66,81)(H,67,82)(H,68,79)(H,69,80)/t31-,34+,35+,37-,38-,43+,44+,45-,46-,49-,50-/m0/s1/f/h66-69H","","representative component in mixture","Actinomycin C",0.0,,,"inactive","no positive results",1269.443603515625,,"",30.0,"2-amino-4,6-dimethyl-3-oxo-N~9~-[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-N~1~-{(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6-(1-methylethyl)","",,"inactive","",,"QCXJFISCRQIYID-IFORFJDKDU","mixture of actinomycin C1 [50-76-0] (10%), actinomycin C2 [2612-14-8] (45%), and actinomycin C3 [6156-47-4] (45%), structure shown C2, stereochem","","8052-16-2",20030.0,"","","C63H88N12O16",,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","31_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACTINOMYCIN%20C.html","","",,"defined organic","no positive results","","","","","O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N","","","",,"","rat","",20030.0, +"C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C","InChI=1/C62H86N12O16/c1-27(2)42-59(84)73-23-17-19-36(73)57(82)69(13)25-38(75)71(15)48(29(5)6)61(86)88-33(11)44(55(80)65-42)67-53(78)35-22-21-31(9)51-46(35)64-47-40(41(63)50(77)32(10)52(47)90-51)54(79)68-45-34(12)89-62(87)49(30(7)8)72(16)39(76)26-70(14)58(83)37-20-18-24-74(37)60(85)43(28(3)4)66-56(45)81/h21-22,27-30,33-34,36-37,42-45,48-49H,17-20,23-26,63H2,1-16H3,(H,65,80)(H,66,81)(H,67,78)(H,68,79)/t33-,34-,36+,37+,42-,43-,44+,45+,48+,49+/m1/s1/f/h65-68H","active","tested chemical","Actinomycin D",88.0,,0.0,"active","positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test",1255.4169921875,,"",31.0,"2-amino-4,6-dimethyl-3-oxo-N,N'-bis[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-3H-phenoxazine-1,9-dicarboxamide","",,"active","inactive",,"RJURFGZVJUQBHK-HQANWYOLDQ","stereochem","multisex active","50-76-0",20031.0,"","","C62H86N12O16",0.0010999999940395355,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat_Note modified v5a","","32_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACTINOMYCIN%20D.html","","",,"defined organic","peritoneal cavity","","","","","C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C","","","",,"","rat","peritoneal cavity",20031.0, +"NC(=O)CCCCC(=O)N","InChI=1/C6H12N2O2/c7-5(9)3-1-2-4-6(8)10/h1-4H2,(H2,7,9)(H2,8,10)/f/h7-8H2","inactive","tested chemical","Adipamide",0.0,,,"inactive","no positive results",144.1717071533203,,"",32.0,"hexanediamide","",,"inactive","inactive",0.0,"GVNWZKBFMFUVNX-UNXFWZPKCL","","multisex inactive; multispecies inactive","628-94-4",20032.0,"no positive results","","C6H12N2O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","33_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ADIPAMIDE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","NC(=O)CCCCC(=O)N","inactive","","",,"","rat; mouse","no positive results",20032.0, +"O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1","InChI=1/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14)/b8-6-/f/h12H2","active","tested chemical","AF-2",35.0,164.0,0.11800000071525574,"active","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results",248.1916046142578,,"",33.0,"(2Z)-2-(furan-2-yl)-3-(5-nitrofuran-2-yl)prop-2-enamide","",,"active","active",31.0,"LYAHJFZLDZDIOH-SDXKRDFODJ","stereochem","multisite active; multisex active; multispecies active","3688-53-7",20033.0,"stomach","","C11H8N2O5",29.399999618530273,"single chemical compound",30.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","structure modified v5b","","34_CPDBAS_v5d",0.527999997138977,"","http://potency.berkeley.edu/chempages/AF-2.html","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results","active",131.0,"defined organic","mammary gland","stomach","","stomach","","O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1","active","","esophagus; stomach",0.6610000133514404,"TD50 is harmonic mean of more than one positive test","rat; mouse; hamster","mammary gland",20033.0, +"O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC","InChI=1/C17H14O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8-9,17-18H,2-3H2,1H3/t8-,9+,17-/m0/s1","","tested chemical","Aflatoxicol",78.0,,0.0,"active","",314.29400634765625,,"",34.0,"(1R,6aS,9aS)-1-hydroxy-4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromen-11(1H)-one","",,"active","active",,"WYIWLDSPNDMZIT-BTKFHORUBM","stereochem","","29611-03-8",20034.0,"","","C17H14O6",0.0024999999441206455,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","35_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AFLATOXICOL.html","","",,"defined organic","liver","","","","","O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC","","","",,"","rat","",20034.0, +"C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC","InChI=1/C17H12O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8,17H,2-3H2,1H3","active","tested chemical","Aflatoxin B1",77.0,,0.0,"active","TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable; greater than ten-fold variation among TD50 values for positive results",312.2735900878906,,"",35.0,"4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromene-1,11-dione","",0.020099999383091927,"active","active",0.0,"OQIQSTLJSLGHID-UHFFFAOYAB","","multisite active; multisex active; multispecies active","1162-65-8",20035.0,"no positive results","Tree Shrew (TD50=0.0269; Target Sites=liver)","C17H12O6",0.0031999999191612005,"single chemical compound",,"TD50; Tumor Target Sites","gall bladder; liver; vascular system","parent","Carcinogenicity","TD50_Rat_Note modified v5a","gall bladder; liver; vascular system","36_CPDBAS_v5d",,"active","http://potency.berkeley.edu/chempages/AFLATOXIN%20B1.html","no positive results","",,"defined organic","kidney; large intestine; liver","","","no positive results","","C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC","inactive","","",,"","rat; mouse; rhesus; cynomolgus; tree shrew","large intestine; liver",20035.0,0.008200000040233135 +"O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1","InChI=1/C17H12O7/c1-20-9-6-10-12(8-3-5-22-17(8)23-10)14-11(9)7-2-4-21-15(18)13(7)16(19)24-14/h3,5-6,8,17H,2,4H2,1H3","active","representative component in mixture","Aflatoxin, crude",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",328.27301025390625,,"",36.0,"5-(methyloxy)-3,4,7a,10a-tetrahydro-1H,12H-furo[3',2':4,5]furo[2,3-h]pyrano[3,4-c]chromene-1,12-dione","",,"active","",50.0,"XWIYFDMXXLINPU-UHFFFAOYAD","mixture of aflatoxins, structure shown G1 [1165-39-5]","multisite active; multispecies active","1402-68-2",20036.0,"hematopoietic system","","C17H12O7",0.003000000026077032,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture","","37_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AFLATOXIN,%20CRUDE.html","","",0.34299999475479126,"defined organic","liver","","","","","O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1","active","","",,"","rat; mouse","",20036.0, +"","InChI=1//","inactive","no structure","Agar",0.0,,,"inactive","no positive results",,,"",,"","TR 230",,"inactive","",0.0,"MOSFIJXAXDLOML-UHFFFAOYAM","","multisex inactive; multispecies inactive","9002-18-0",20037.0,"no positive results","","",,"mixture or formulation",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","38_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AGAR.html","no positive results","",,"no structure","no positive results","","","no positive results","","","inactive","","",,"","rat; mouse","no positive results",20037.0, +"C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl","InChI=1/C11H11ClO3/c1-2-5-15-10-4-3-8(6-9(10)12)7-11(13)14/h2-4,6H,1,5,7H2,(H,13,14)/f/h13H","inactive","tested chemical","Alclofenac",0.0,,,"inactive","no positive results",226.6562042236328,,"",38.0,"[3-chloro-4-(prop-2-en-1-yloxy)phenyl]acetic acid","",,"inactive","",,"ARHWPKZXBHOEEE-NDKGDYFDCL","","multisex inactive","22131-79-9",20038.0,"","","C11H11ClO3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a","","39_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALCLOFENAC.html","","",,"defined organic","no positive results","","","","","C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl","","","",,"","rat","no positive results",20038.0, +"CC(C=NOC(=O)NC)(SC)C","InChI=1/C7H14N2O2S/c1-7(2,12-4)5-9-11-6(10)8-3/h5H,1-4H3,(H,8,10)/b9-5+/f/h8H","inactive","tested chemical","Aldicarb",0.0,,,"inactive","no positive results",190.2633056640625,,"",39.0,"(1E)-2-methyl-2-(methylthio)propanal O-[(methylamino)carbonyl]oxime","TR 136",,"inactive","inactive",0.0,"QGLZXHRNAYXIBU-RVKZGWQMDN","","multisex inactive; multispecies inactive","116-06-3",20039.0,"no positive results","","C7H14N2O2S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","40_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALDICARB.html","no positive results","",,"defined organic","no positive results","","","no positive results","","CC(C=NOC(=O)NC)(SC)C","inactive","","",,"","rat; mouse","no positive results",39223.0, +"ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2","InChI=1/C12H8Cl6/c13-8-9(14)11(16)7-5-2-1-4(3-5)6(7)10(8,15)12(11,17)18/h1-2,4-7H,3H2","","tested chemical","Aldrin",0.0,,,"active","no positive results",364.909912109375,,"liver",40.0,"1,2,3,4,10,10-hexachloro-1,4,4a,5,8,8a-hexahydro-1,4:5,8-dimethanonaphthalene","TR 21; final call in CPDB differs due to additional data",,"inactive","inactive",56.0,"QBYJBZPUGVGKQQ-UHFFFAOYAT","stereochem","","309-00-2",20040.0,"liver","","C12H8Cl6",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","41_CPDBAS_v5d",0.0035000001080334187,"","http://potency.berkeley.edu/chempages/ALDRIN.html","TD50 is harmonic mean of more than one positive test","",1.2699999809265137,"defined organic","no positive results","","","","","ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2","active","","",,"","rat; mouse","no positive results",20040.0, +"O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)(O)=O","InChI=1/C18H30O3S.Na/c1-3-4-5-6-7-8-9-10-11-16(2)17-12-14-18(15-13-17)22(19,20)21;/h12-16H,3-11H2,1-2H3,(H,19,20,21);/q;+1/p-1/fC18H29O3S.Na/q-1;m","inactive","representative isomer in mixture","Alkylbenzenesulfonate, linear",0.0,,,"inactive","no positive results",348.4757995605469,,"",41.0,"sodium 4-(dodecan-2-yl)benzenesulfonate","",,"inactive","",,"GHRHULTYHYEOQB-MFZBKVKLCJ","mixture of C10-13 alkylbenzenesulfonates average 11.6; with phenyl attachment varying in apprpx equal amounts between C-2,3,4,5 or 6; structure shown C12 attached at C2","multisex inactive","42615-29-2",20041.0,"","","C18H29NaO3S",,"mixture or formulation",,"TD50; Tumor Target Sites","","salt Na","Carcinogenicity","structure modified v5b","","42_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALKYLBENZENESULFONATE,%20LINEAR.html","","",,"defined organic","no positive results","","","","","O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)([O-])=O.[Na+]","","","",,"","rat","no positive results",20041.0, +"[O-][N+](C)(C)CCCCCCCCCC","InChI=1/C12H27NO/c1-4-5-6-7-8-9-10-11-12-13(2,3)14/h4-12H2,1-3H3","inactive","representative isomer in mixture","Alkyldimethylamine oxides, commercial grade",0.0,,,"inactive","no positive results",201.34890747070312,,"",42.0,"decyl(dimethyl)amine oxide","",,"inactive","",,"ZRKZFNZPJKEWPC-UHFFFAOYAU","mixture, C10-16 [70592-80-2], C12-18 [68955-55-5], C12-16 [68439-70-3], C14-18 [68390-99-8], structure shown C-12","multisex inactive","NOCAS",20042.0,"","","C12H27NO",,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","43_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALKYLDIMETHYLAMINE%20OXIDES,%20COMMERCIAL%20GRADE.html","","",,"defined organic","no positive results","","","","","[O-][N+](C)(C)CCCCCCCCCC","","","",,"","rat","no positive results",20042.0, +"O=C1C(NC(=O)N1)NC(=O)N","InChI=1/C4H6N4O3/c5-3(10)6-1-2(9)8-4(11)7-1/h1H,(H3,5,6,10)(H2,7,8,9,11)/f/h6-8H,5H2","inactive","tested chemical","Allantoin",0.0,,,"inactive","no positive results",158.11639404296875,,"",43.0,"1-(2,5-dioxoimidazolidin-4-yl)urea","",,"inactive","",,"POJWUDADGALRAB-BANUENCFCI","","multisex inactive","97-59-6",20043.0,"","","C4H6N4O3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","44_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLANTOIN.html","","",,"defined organic","no positive results","","","","","O=C1C(NC(=O)N1)NC(=O)N","","","",,"","rat","no positive results",20043.0, +"C=CCO","InChI=1/C3H6O/c1-2-3-4/h2,4H,1,3H2","inactive","tested chemical","Allyl alcohol",0.0,,,"inactive","no positive results",58.0791015625,,"",44.0,"prop-2-en-1-ol","",,"inactive","inactive",,"XXROGKLTLUQVRX-UHFFFAOYAC","","multisex inactive","107-18-6",20044.0,"","","C3H6O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Mutagenicity_SAL_CPDB added v3a","","45_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLYL%20ALCOHOL.html","","",,"defined organic","no positive results","","","","","C=CCO","","","",,"","rat","no positive results",20044.0, +"C=CCCl","InChI=1/C3H5Cl/c1-2-3-4/h2H,1,3H2","inactive","tested chemical","Allyl chloride",0.0,,,"inactive","only experiment is NCI NTP bioassay inadequate",76.5248031616211,,"",45.0,"3-chloroprop-1-ene","TR 73",,"unspecified","active",0.0,"OSDWBNJEKMUWAV-UHFFFAOYAQ","","multisex inactive","107-05-1",20045.0,"no positive results","","C3H5Cl",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","ActivityOutcome_CPDBAS_Mouse modified v5d","","46_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLYL%20CHLORIDE.html","no positive results","",,"defined organic","NTP bioassay inadequate","","","no positive results","","C=CCCl","inactive","","",,"","rat; mouse","NTP bioassay inadequate",39231.0, +"C=CCOCC1CO1","InChI=1/C6H10O2/c1-2-3-7-4-6-5-8-6/h2,6H,1,3-5H2","","tested chemical","Allyl glycidyl ether",0.0,,,"active","no positive results",114.14240264892578,,"",46.0,"2-[(allyloxy)methyl]oxirane","TR 376",,"inactive","active",26.0,"LSWYGACWGAICNM-UHFFFAOYAR","","","106-92-3",20046.0,"nasal cavity","","C6H10O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","47_CPDBAS_v5d",1.590000033378601,"","http://potency.berkeley.edu/chempages/ALLYL%20GLYCIDYL%20ETHER.html","","",182.0,"defined organic","no positive results","","","no positive results","","C=CCOCC1CO1","active","","",,"","rat; mouse","no positive results",39232.0, +"C=CCN=C=S","InChI=1/C4H5NS/c1-2-3-5-4-6/h2H,1,3H2","","tested chemical","Allyl isothiocyanate",26.0,,0.9679999947547913,"active","",99.1541976928711,,"",47.0,"3-isothiocyanatoprop-1-ene","TR 234",,"active","active",0.0,"ZOJBYZNEUISWFT-UHFFFAOYAS","","","57-06-7",20047.0,"no positive results","","C4H5NS",96.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","48_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLYL%20ISOTHIOCYANATE.html","no positive results","",,"defined organic","urinary bladder","","","no positive results","","C=CCN=C=S","inactive","","",,"","rat; mouse","no positive results",20047.0, +"O=C(CC(C)C)OCC=C","InChI=1/C8H14O2/c1-4-5-10-8(9)6-7(2)3/h4,7H,1,5-6H2,2-3H3","active","tested chemical","Allyl isovalerate",26.0,,0.8650000095367432,"active","",142.1956024169922,,"",48.0,"allyl 3-methylbutanoate","TR 253",,"active","inactive",32.0,"HOMAGVUCNZNWBC-UHFFFAOYAF","","multisex active; multispecies active","2835-39-4",20048.0,"no positive results","","C8H14O2",123.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","49_CPDBAS_v5d",0.44200000166893005,"","http://potency.berkeley.edu/chempages/ALLYL%20ISOVALERATE.html","","",62.79999923706055,"defined organic","hematopoietic system","","","hematopoietic system","","O=C(CC(C)C)OCC=C","active","","",,"","rat; mouse","no positive results",39233.0, +"NC(=O)N(CC=C)N=O","InChI=1/C4H7N3O2/c1-2-3-7(6-9)4(5)8/h2H,1,3H2,(H2,5,8)/f/h5H2","active","tested chemical","1-Allyl-1-nitrosourea",52.0,,0.0026000000070780516,"active","TD50 is harmonic mean of more than one positive test",129.11819458007812,,"",49.0,"1-nitroso-1-prop-2-en-1-ylurea","",,"active","",,"WBBDVRPSJSJSPC-GLFQYTTQCA","","multisite active; multisex active","760-56-5",20049.0,"","","C4H7N3O2",0.3409999907016754,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","50_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-ALLYL-1-NITROSOUREA.html","","",,"defined organic","large intestine; lung; stomach","","","","","NC(=O)N(CC=C)N=O","","","",,"","rat","mammary gland; stomach; uterus",20049.0, +"C=CCNN","InChI=1/C3H8N2.ClH/c1-2-3-5-4;/h2,5H,1,3-4H2;1H","active","tested chemical","Allylhydrazine.HCl",,,,"active","",108.57050323486328,,"",50.0,"prop-2-en-1-ylhydrazine hydrochloride","",,"","",34.0,"PWGPATVPEGLIAN-UHFFFAOYAO","parent [7422-78-8]","multisite active; multisex active","52207-83-7",20050.0,"lung","","C3H9ClN2",,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","51_CPDBAS_v5d",0.3149999976158142,"","http://potency.berkeley.edu/chempages/ALLYLHYDRAZINE.HCl.html","TD50 is harmonic mean of more than one positive test","",34.20000076293945,"defined organic","","","","lung; vascular system","","C=CCNN.HCl","active","","",,"","mouse","",20050.0, +"","InChI=1/Al.K.2H2O4S/c;;2*1-5(2,3)4/h;;2*(H2,1,2,3,4)/q+3;+1;;/p-4/fAl.K.2O4S/q2m;2*-2","inactive","tested chemical","Aluminum potassium sulfate",0.0,,,"inactive","no positive results",258.18670654296875,,"",51.0,"aluminum potassium sulfate","",,"inactive","",0.0,"GRLPQNLYRHEGIJ-MHPHYJPNCZ","","multisex inactive; multispecies inactive","10043-67-1",20051.0,"no positive results","","AlKO8S2",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","52_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALUMINUM%20POTASSIUM%20SULFATE.html","no positive results","",,"inorganic","no positive results","","","no positive results","","O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+]","inactive","","",,"","rat; mouse","no positive results",39234.0, +"O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N","InChI=1/C14H7Br2NO2/c15-8-5-9(16)12(17)11-10(8)13(18)6-3-1-2-4-7(6)14(11)19/h1-5H,17H2","active","tested chemical","1-Amino-2,4-dibromoanthraquinone",35.0,,0.12099999934434891,"active","TD50 is harmonic mean of more than one positive test",381.0188903808594,,"",52.0,"1-amino-2,4-dibromo-9,10-anthraquinone","TR 383",,"active","active",27.0,"ZINRVIQBCHAZMM-UHFFFAOYAC","","multisite active; multisex active; multispecies active","81-49-2",20052.0,"liver; lung; stomach","","C14H7Br2NO2",46.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","53_CPDBAS_v5d",1.25,"","http://potency.berkeley.edu/chempages/1-AMINO-2,4-DIBROMOANTHRAQUINONE.html","TD50 is harmonic mean of more than one positive test","",477.0,"defined organic","kidney; large intestine; liver; urinary bladder","","","liver; lung; stomach","","O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N","active","","",,"","rat; mouse","kidney; large intestine; liver; urinary bladder",39235.0, +"NC1=C(C=CC(=C1)NC(=O)C)OCC","InChI=1/C10H14N2O2/c1-3-14-10-5-4-8(6-9(10)11)12-7(2)13/h4-6H,3,11H2,1-2H3,(H,12,13)/f/h12H","","tested chemical","3-Amino-4-ethoxyacetanilide",0.0,,,"active","no positive results",194.2303924560547,,"",53.0,"N-[3-amino-4-(ethyloxy)phenyl]acetamide","TR 112",,"inactive","active",17.0,"XTXFAVHDQCHWCS-XWKXFZRBCV","","","17026-81-2",20053.0,"thyroid gland","","C10H14N2O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","54_CPDBAS_v5d",10.699999809265137,"","http://potency.berkeley.edu/chempages/3-AMINO-4-ETHOXYACETANILIDE.html","","",2070.0,"defined organic","no positive results","","","no positive results","","NC1=C(C=CC(=C1)NC(=O)C)OCC","active","","",,"","rat; mouse","no positive results",20053.0, +"CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N)","InChI=1/C14H14N2.ClH/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16;/h3-9H,2,15H2,1H3;1H","active","tested chemical","3-Amino-9-ethylcarbazole.HCl",32.0,,0.23199999332427979,"active","TD50 is harmonic mean of more than one positive test",246.7353057861328,,"",54.0,"9-ethyl-9H-carbazol-3-amine hydrochloride","TR 93",,"active","active",37.0,"UUYSTZWIFZYHRM-UHFFFAOYAB","parent [132-32-1]","multisite active; multisex active; multispecies active","6109-97-3",20054.0,"liver","","C14H15ClN2",57.20000076293945,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","55_CPDBAS_v5d",0.15600000321865082,"","http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE.HCl.html","TD50 is harmonic mean of more than one positive test","",38.599998474121094,"defined organic","ear Zymbals gland; liver; skin","","","liver","","CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl","active","","",,"","rat; mouse","ear Zymbals gland; liver; uterus",20054.0, +"CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N)","InChI=1/C14H14N2/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16/h3-9H,2,15H2,1H3","active","representative component in mixture","3-Amino-9-ethylcarbazole mixture",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",210.27439880371094,,"",55.0,"9-ethyl-9H-carbazol-3-amine","TR 93",,"active","active",50.0,"OXEUETBFKVCRNP-UHFFFAOYAV","mixture, structure shown 3-Amino-9-ethylcarbazole [132-32-1]","multisite active; multisex active; multispecies active","NOCAS",20055.0,"liver","","C14H15N2",26.399999618530273,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture","","56_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE%20MIXTURE.html","TD50 is harmonic mean of more than one positive test","",38.0,"defined organic","ear Zymbals gland; liver; skin","","","liver","","CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N)","active","","",,"","rat; mouse","ear Zymbals gland",20055.0, +"N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1","InChI=1/C9H14N8S3/c10-6-7(17-20-16-6)13-1-2-18-3-5-4-19-9(14-5)15-8(11)12/h4H,1-3H2,(H2,10,16)(H,13,17)(H4,11,12,14,15)/f/h11,13,15H,10,12H2","active","tested chemical","3-Amino-4-[2-[(2-guanidinothiazol-4-yl)methylthio], ethylamino]-1,2,5-thiadiazole",14.0,,15.100000381469727,"active","TD50 is harmonic mean of more than one positive test",330.4560852050781,,"",56.0,"1-{4-[({2-[(4-amino-1,2,5-thiadiazol-3-yl)amino]ethyl}sulfanyl)methyl]-1,3-thiazol-2-yl}guanidine","",,"active","",,"MOMKQYRYLQUFMV-GVMYFUFNCD","BL-6341","multisex active","78441-84-6",20056.0,"","","C9H14N8S3",4990.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a; CPDB lists HCl complex in some instances in tables but referenced study for this chemical does not specify HCl complex - parent is assumed correct","","57_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/3-AMINO-4-[2-[(2-GUANIDINOTHIAZOL-4-YL)METHYLTHIO].html","","",,"defined organic","stomach","","","","","N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1","","","",,"","rat","stomach",39236.0, +"O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N","InChI=1/C15H11NO2/c1-8-6-7-11-12(13(8)16)15(18)10-5-3-2-4-9(10)14(11)17/h2-7H,16H2,1H3","active","tested chemical","1-Amino-2-methylanthraquinone",32.0,,0.25,"active","TD50 is harmonic mean of more than one positive test",237.2532958984375,,"",57.0,"1-amino-2-methylanthracene-9,10-dione","TR 111",,"active","active",30.0,"ZLCUIOWQYBYEBG-UHFFFAOYAP","C.I. 60700","multisite active; multisex active; multispecies active","82-28-0",20057.0,"no positive results","","C15H11NO2",59.20000076293945,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","58_CPDBAS_v5d",0.7329999804496765,"","http://potency.berkeley.edu/chempages/1-AMINO-2-METHYLANTHRAQUINONE.html","","",174.0,"defined organic","kidney; liver","","","liver","","O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N","active","","",,"","rat; mouse","liver",20057.0, +"O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N","InChI=1/C6H4N4O4/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2","active","tested chemical","2-Amino-5-(5-nitro-2-furyl)-1,3,4-oxadiazole",44.0,,0.018699999898672104,"active","",196.1219940185547,,"",58.0,"5-(5-nitrofuran-2-yl)-1,3,4-oxadiazol-2-amine","",,"active","",,"VTWQUFUBSCXPOW-IAUQMDSZCD","","multisite active","3775-55-1",20058.0,"","","C6H4N4O4",3.6700000762939453,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","59_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-OXADIAZOLE.html","","",,"defined organic","","","","","","O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N","","","",,"","rat","kidney; lung; mammary gland; stomach",20058.0, +"NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1","InChI=1/C6H4N4O3S/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2","active","tested chemical","2-Amino-5-(5-nitro-2-furyl)-1,3,4-thiadiazole",52.0,,0.003100000089034438,"active","",212.18260192871094,,"",59.0,"5-(5-nitrofuran-2-yl)-1,3,4-thiadiazol-2-amine","",,"active","",,"SXZZHGJWUBJKHH-IAUQMDSZCG","","multisite active","712-68-5",20059.0,"","","C6H4N4O3S",0.6620000004768372,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","60_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-THIADIAZOLE.html","","",,"defined organic","","","","","","NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1","","","",,"","rat","kidney; lung; mammary gland; stomach",20059.0, +"NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1","InChI=1/C7H5N3O3S/c8-7-9-4(3-14-7)5-1-2-6(13-5)10(11)12/h1-3H,(H2,8,9)/f/h8H2","active","tested chemical","2-Amino-4-(5-nitro-2-furyl)thiazole",42.0,,0.027699999511241913,"active","",211.19479370117188,,"",60.0,"4-(5-nitrofuran-2-yl)-1,3-thiazol-2-amine","",,"active","active",44.0,"ZAVLMIGIVYJYMU-FSHFIPFOCT","","multisite active; multispecies active","38514-71-5",20060.0,"","","C7H5N3O3S",5.849999904632568,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","61_CPDBAS_v5d",0.037300001829862595,"","http://potency.berkeley.edu/chempages/2-AMINO-4-(5-NITRO-2-FURYL)THIAZOLE.html","","",7.869999885559082,"defined organic","","","","stomach","","NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1","active","","",,"","rat; mouse","stomach; urinary bladder",39237.0, +"NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1","InChI=1/C8H6N4O4/c9-8-10-6(11-16-8)3-1-5-2-4-7(15-5)12(13)14/h1-4H,(H2,9,10,11)/b3-1+/f/h9H2","active","tested chemical","trans-5-Amino-3[2-(5-nitro-2-furyl)vinyl]-1,2,4-oxadiazole",,,,"active","",222.15980529785156,,"",61.0,"3-[(E)-2-(5-nitrofuran-2-yl)ethenyl]-1,2,4-oxadiazol-5-amine","",,"","",32.0,"RMZNNIOKNRDECR-OYGOROAMDP","stereochem","multisite active; multisex active","28754-68-9",20061.0,"hematopoietic system; stomach","","C8H6N4O4",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","62_CPDBAS_v5d",0.5040000081062317,"","http://potency.berkeley.edu/chempages/trans-5-AMINO-3[2-(5-NITRO-2-FURYL)VINYL]-1,2,4-OX.html","TD50 is harmonic mean of more than one positive test","",112.0,"defined organic","","","","hematopoietic system; stomach","","NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1","active","","",,"","mouse","",20061.0, +"O=[N+](C1=CC(=C(C=C1)O)N)[O-]","InChI=1/C6H6N2O3/c7-5-3-4(8(10)11)1-2-6(5)9/h1-3,9H,7H2","","tested chemical","2-Amino-4-nitrophenol",18.0,,5.440000057220459,"active","",154.12339782714844,,"",62.0,"2-amino-4-nitrophenol","TR 339",,"active","active",0.0,"VLZVIIYRNMWPSN-UHFFFAOYAN","","","99-57-0",20062.0,"no positive results","","C6H6N2O3",839.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","63_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-4-NITROPHENOL.html","no positive results","",,"defined organic","kidney","","","no positive results","","O=[N+](C1=CC(=C(C=C1)O)N)[O-]","inactive","","",,"","rat; mouse","no positive results",20062.0, +"O=[N+](C1=CC(=C(C=C1)N)O)[O-]","InChI=1/C6H6N2O3/c7-5-2-1-4(8(10)11)3-6(5)9/h1-3,9H,7H2","","tested chemical","2-Amino-5-nitrophenol",27.0,,0.7200000286102295,"active","",154.12339782714844,,"",63.0,"2-amino-5-nitrophenol","TR 334",,"active","active",0.0,"DOPJTDJKZNWLRB-UHFFFAOYAU","","","121-88-0",20063.0,"no positive results","","C6H6N2O3",111.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","64_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-NITROPHENOL.html","no positive results","",,"defined organic","pancreas","","","no positive results","","O=[N+](C1=CC(=C(C=C1)N)O)[O-]","inactive","","",,"","rat; mouse","no positive results",20063.0, +"OC1=C(C=C(C=C1)N)[N+](=O)[O-]","InChI=1/C6H6N2O3/c7-4-1-2-6(9)5(3-4)8(10)11/h1-3,9H,7H2","","tested chemical","4-Amino-2-nitrophenol",23.0,,2.0,"active","",154.12339782714844,,"",64.0,"4-amino-2-nitrophenol","TR 94",,"active","active",0.0,"WHODQVWERNSQEO-UHFFFAOYAM","","","119-34-6",20064.0,"no positive results","","C6H6N2O3",309.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","65_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-AMINO-2-NITROPHENOL.html","no positive results","",,"defined organic","urinary bladder","","","no positive results","","OC1=C(C=C(C=C1)N)[N+](=O)[O-]","inactive","","",,"","rat; mouse","no positive results",20064.0, +"NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1","InChI=1/C9H7N3O2S/c10-9-11-8(5-15-9)6-1-3-7(4-2-6)12(13)14/h1-5H,(H2,10,11)/f/h10H2","","tested chemical","2-Amino-4-(p-nitrophenyl)thiazole",,,,"active","",221.2332000732422,,"",65.0,"4-(4-nitrophenyl)-1,3-thiazol-2-amine","",,"","",43.0,"RIKJWJIWXCUKQV-GIMVELNWCN","","","2104-09-8",20065.0,"","","C9H7N3O2S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","66_CPDBAS_v5d",0.04500000178813934,"","http://potency.berkeley.edu/chempages/2-AMINO-4-(p-NITROPHENYL)THIAZOLE.html","","",9.949999809265137,"defined organic","","","","hematopoietic system","","NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1","active","","",,"","mouse","",39238.0, +"O=[N+](C1=CN=C(S1)N)[O-]","InChI=1/C3H3N3O2S/c4-3-5-1-2(9-3)6(7)8/h1H,(H2,4,5)/f/h4H2","active","tested chemical","2-Amino-5-nitrothiazole",31.0,,0.3070000112056732,"active","",145.13980102539062,,"",66.0,"5-nitro-1,3-thiazol-2-amine","TR 53; final call in CPDB differs due to additional data; NTP-assigned level of evidence of carcinogenicity is "positive" in male rat; noting that "these experiments were particularly difficult to evaluate".",,"active","active",0.0,"MIHADVKEHAFNPG-LGEMBHMGCP","","multisite active","121-66-4",20066.0,"no positive results","","C3H3N3O2S",44.599998474121094,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TargetSites_Rat_Male modified v5d","","67_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-NITROTHIAZOLE.html","no positive results","",,"defined organic","no positive results - CPDB evaluation based on NCI Technical Report","","","no positive results","","O=[N+](C1=CN=C(S1)N)[O-]","inactive","","",,"","rat; mouse","kidney; lung; mammary gland",20066.0, +"NC1=NC(C(C2=CC=CC=C2)O1)=O","InChI=1/C9H8N2O2.Mg.2H2O/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;;;/h1-5,7H,(H2,10,11,12);;2*1H2/q;+2;;/p-2/fC9H8N2O2.Mg.2HO/h10H2;;2*1h/q;m;2*-1/rC9H8N2O2.H2MgO2/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;2-1-3/h1-5,7H,(H2,10,11,12);2-3H/f/h10H2;","","tested chemical","2-Amino-5-phenyl-2-oxazolin-4-one + Mg(OH)2",0.0,,,"inactive","no positive results",234.49400329589844,,"",67.0,"2-amino-5-phenyl-1,3-oxazol-4(5H)-one - dihydroxymagnesium (1:1)","",,"inactive","",,"JOPOQPCBCUIPFX-VWMXNRJTCY","parent [2152-34-3]","","18968-99-5",20067.0,"","","C9H10MgN2O4",,"single chemical compound",,"TD50; Tumor Target Sites","","complex Mg(OH)2","Carcinogenicity","","","68_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-PHENYL-2-OXAZOLIN-4-ONE%20+%20Mg(OH)2.html","","",,"defined organic","","","","","","NC1=NC(C(C2=CC=CC=C2)O1)=O.O[Mg]O","","","",,"","rat","no positive results",20067.0, +"O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N","InChI=1/C14H9NO2/c15-8-5-6-11-12(7-8)14(17)10-4-2-1-3-9(10)13(11)16/h1-7H,15H2","active","tested chemical","2-Aminoanthraquinone ",29.0,,0.4519999921321869,"active","",223.226806640625,,"",68.0,"2-amino-9,10-anthraquinone","TR 144",,"active","active",20.0,"XOGPDSATLSAZEK-UHFFFAOYAH","","multisite active; multisex active; multispecies active","117-79-3",20068.0,"liver","","C14H9NO2",101.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","69_CPDBAS_v5d",5.329999923706055,"","http://potency.berkeley.edu/chempages/2-AMINOANTHRAQUINONE.html","TD50 is harmonic mean of more than one positive test","",1190.0,"defined organic","liver","","","hematopoietic system; liver","","O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N","active","","",,"","rat; mouse","no positive results",20068.0, +"CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C","InChI=1/C14H15N3/c1-10-5-3-4-6-14(10)17-16-12-7-8-13(15)11(2)9-12/h3-9H,15H2,1-2H3/b17-16+","active","tested chemical","o-Aminoazotoluene",44.0,,0.017899999395012856,"active","TD50 is harmonic mean of more than one positive test",225.28900146484375,,"",69.0,"2-methyl-4-[(E)-(2-methylphenyl)diazenyl]aniline","",,"active","active",0.0,"PFRYFZZSECNQOL-WUKNDPDIBU","","multisex active","97-56-3",20069.0,"no positive results","","C14H15N3",4.039999961853027,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","70_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/o-AMINOAZOTOLUENE.html","no positive results","",,"defined organic","liver","","","","","CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C","inactive","","",,"","rat; mouse","liver",20069.0, +"OC(=O)CCCCCN","InChI=1/C6H13NO2/c7-5-3-1-2-4-6(8)9/h1-5,7H2,(H,8,9)/f/h8H","","tested chemical","6-Aminocaproic acid",0.0,,,"inactive","no positive results",131.1741943359375,,"",70.0,"6-aminohexanoic acid","",,"inactive","",,"SLXKOJJOQWFEFD-FZOZFQFYCD","","","60-32-2",20070.0,"","","C6H13NO2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","71_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/6-AMINOCAPROIC%20ACID.html","","",,"defined organic","no positive results","","","","","OC(=O)CCCCCN","","","",,"","rat","",20070.0, +"NC1=CC=C(C=C1)C2=CC=CC=C2","InChI=1/C12H11N/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10/h1-9H,13H2","active","tested chemical","4-Aminodiphenyl",,,,"active","",169.22239685058594,,"",71.0,"biphenyl-4-amine","",,"","active",50.0,"DMVOXQPQNTYEKQ-UHFFFAOYAX","","multisite active; multisex active","92-67-1",20071.0,"liver; urinary bladder","","C12H11N",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","72_CPDBAS_v5d",0.012400000356137753,"","http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.html","TD50 is harmonic mean of more than one positive test","",2.0999999046325684,"defined organic","","","","liver; urinary bladder","","NC1=CC=C(C=C1)C2=CC=CC=C2","active","","",,"","mouse","",20071.0, +"NC1(=CC=C(C=C1)C2=CC=CC=C2)","InChI=1/C12H11N.ClH/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10;/h1-9H,13H2;1H","","tested chemical","4-Aminodiphenyl.HCl",50.0,,0.004800000227987766,"active","",205.68649291992188,,"",72.0,"biphenyl-4-amine hydrochloride","",,"active","active",,"GUHXYHYUBFCYGJ-UHFFFAOYAT","parent [92-67-1]","","2113-61-3",20072.0,"","","C12H12ClN",0.9800000190734863,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","73_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.HCl.html","","",,"defined organic","","","","","","NC1(=CC=C(C=C1)C2=CC=CC=C2).[H]Cl","","","",,"","rat","mammary gland",20072.0, +"NC3=CC1=C(C=C3)OC2=C1C=CC=C2","InChI=1/C12H9NO/c13-8-5-6-12-10(7-8)9-3-1-2-4-11(9)14-12/h1-7H,13H2","active","tested chemical","2-Aminodiphenylene oxide",,,,"active","",183.20919799804688,,"",73.0,"dibenzo[b,d]furan-2-amine","",,"","",47.0,"FFYZMBQLAYDJIG-UHFFFAOYAK","","multisite active; multisex active","3693-22-9",20073.0,"liver; urinary bladder","","C12H9NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","74_CPDBAS_v5d",0.023099999874830246,"","http://potency.berkeley.edu/chempages/2-AMINODIPHENYLENE%20OXIDE.html","TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable","",4.239999771118164,"defined organic","","","","liver","","NC3=CC1=C(C=C3)OC2=C1C=CC=C2","active","","",,"","mouse","",39239.0, +"NCC1(CC(=O)O)CCCCC1","InChI=1/C9H17NO2/c10-7-9(6-8(11)12)4-2-1-3-5-9/h1-7,10H2,(H,11,12)/f/h11H","","tested chemical","1-(Aminomethyl)cyclohexaneacetic acid",10.0,,34.20000076293945,"active","",171.23880004882812,,"",74.0,"[1-(aminomethyl)cyclohexyl]acetic acid","",,"active","",,"UGJMXCAKCUNAIE-WXRBYKJCCG","","","60142-96-3",20074.0,"","","C9H17NO2",5850.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v3a","","75_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-(AMINOMETHYL)CYCLOHEXANEACETIC%20ACID.html","","",,"defined organic","pancreas","","","","","NCC1(CC(=O)O)CCCCC1","","","",,"","rat","no positive results",20074.0, +"OCCN(CCO)c1ccc(N)cc1","InChI=1/C10H16N2O2.H2O4S/c11-9-1-3-10(4-2-9)12(5-7-13)6-8-14;1-5(2,3)4/h1-4,13-14H,5-8,11H2;(H2,1,2,3,4)/f/h;1-2H","inactive","tested chemical","2,2'-[(4-Aminophenyl)imino]bisethanol sulfate",0.0,,,"inactive","no positive results",294.32470703125,,"",75.0,"2,2'-[(4-aminophenyl)imino]diethanol sulfate (salt)","",,"inactive","",,"KMCFMEHSEWDYKG-ATDHBCBACR","parent [7575-35-1]","multisex inactive","54381-16-7",20075.0,"","","C10H18N2O6S",,"single chemical compound",,"TD50; Tumor Target Sites","","complex H2SO4","Carcinogenicity","Rat added v2a","","76_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2,2'-[(4-AMINOPHENYL)IMINO]BISETHANOL%20SULFATE.html","","",,"defined organic","no positive results","","","","","OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1","","","",,"","rat","no positive results",20075.0, +"C1(N=CNN=1)N","InChI=1/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6)/f/h5H,3H2","active","tested chemical","3-Aminotriazole",35.0,,0.11800000071525574,"active","TD50 is harmonic mean of more than one positive test",84.08000183105469,,"",76.0,"1H-1,2,4-triazol-3-amine","",,"active","inactive",34.0,"KLSJWNVTNUYHDU-YPUDGCQOCD","tautomers","multisite active; multisex active; multispecies active","61-82-5",20076.0,"liver","","C2H4N4",9.9399995803833,"single chemical compound",0.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","77_CPDBAS_v5d",0.3009999990463257,"","http://potency.berkeley.edu/chempages/3-AMINOTRIAZOLE.html","TD50 is harmonic mean of more than one positive test","inactive",25.299999237060547,"defined organic","thyroid gland","no positive results","","liver","","C1(N=CNN=1)N","active","","no positive results",,"no positive results","rat; mouse; hamster","pituitary gland; thyroid gland",20076.0, +"OC(=O)CCCCCCCCCCN","InChI=1/C11H23NO2/c12-10-8-6-4-2-1-3-5-7-9-11(13)14/h1-10,12H2,(H,13,14)/f/h13H","active","tested chemical","11-Aminoundecanoic acid",18.0,,5.460000038146973,"active","",201.30580139160156,,"",77.0,"11-aminoundecanoic acid","TR 216",,"active","inactive",0.0,"GUOSQNAUYHMCRU-NDKGDYFDCZ","","multisite active","2432-99-7",20077.0,"no positive results","","C11H23NO2",1100.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","78_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/11-AMINOUNDECANOIC%20ACID.html","no positive results","",,"defined organic","liver; urinary bladder","","","no positive results","","OC(=O)CCCCCCCCCCN","inactive","","",,"","rat; mouse","no positive results",20077.0, +"","InChI=1/ClH.H3N/h1H;1H3/fCl.H4N/h1h;1H/q-1;+1","","tested chemical","Ammonium chloride",,,,"inactive","",53.49150085449219,,"",78.0,"ammonium chloride","",,"","",0.0,"NLXLAEXVIDQMFP-DWOZJLMICO","","","12125-02-9",20078.0,"","","H4ClN",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","79_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMMONIUM%20CHLORIDE.html","no positive results","",,"inorganic","","","","no positive results","","[H][N+]([H])([H])[H].[Cl-]","inactive","","",,"","mouse","",20078.0, +"C(CC(O)=O)(CC(O)=O)(C(O)=O)O","InChI=1/C6H8O7.2H3N/c7-3(8)1-6(13,5(11)12)2-4(9)10;;/h13H,1-2H2,(H,7,8)(H,9,10)(H,11,12);2*1H3/fC6H6O7.2H4N/h7H;2*1H/q-2;2*+1","","tested chemical","Ammonium citrate",0.0,,,"inactive","no positive results",226.18580627441406,,"",79.0,"diammonium 2-(carboxymethyl)-2-hydroxybutanedioate","",,"inactive","",,"YXVFQADLFFNVDS-JYGIMERMCP","parent [77-92-9]","","3012-65-5",20079.0,"","","C6H14N2O7",,"single chemical compound",,"TD50; Tumor Target Sites","","complex 2NH4","Carcinogenicity","","","80_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMMONIUM%20CITRATE.html","","",,"defined organic","no positive results","","","","","C(CC([O-])=O)(CC(O)=O)(C([O-])=O)O.[N+].[N+]","","","",,"","rat","",20079.0, +"","InChI=1/H3N.H2O/h1H3;1H2/fH4N.HO/h1H;1h/q+1;-1","inactive","tested chemical","Ammonium hydroxide",,,,"inactive","",35.045799255371094,,"",80.0,"ammonium hydroxide","",,"","",0.0,"VHUUQVKOLVNVRT-QBBVKLOVCT","","multisex inactive","1336-21-6",20080.0,"no positive results","","H5NO",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","81_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMMONIUM%20HYDROXIDE.html","no positive results","",,"inorganic","","","","no positive results","","[N+].[O-]","inactive","","",,"","mouse","",20080.0, +"N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O","InChI=1/C11H18N2O3/c1-4-11(6-5-7(2)3)8(14)12-10(16)13-9(11)15/h7H,4-6H2,1-3H3,(H2,12,13,14,15,16)/f/h12-13H","","tested chemical","Amobarbital",0.0,,,"inactive","no positive results",226.27479553222656,,"",81.0,"5-ethyl-5-(3-methylbutyl)pyrimidine-2,4,6(1H,3H,5H)-trione","",,"inactive","",,"VIROVYVQCGLCII-BAINRFMOCW","","","57-43-2",20081.0,"","","C11H18N2O3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","82_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMOBARBITAL.html","","",,"defined organic","no positive results","","","","","N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O","","","",,"","rat","",20081.0, +"C1=CC=CC=C1CC(N)C","InChI=1/2C9H13N.H2O4S/c2*1-8(10)7-9-5-3-2-4-6-9;1-5(2,3)4/h2*2-6,8H,7,10H2,1H3;(H2,1,2,3,4)/f/h;;1-2H","inactive","tested chemical","dl-Amphetamine sulfate",0.0,,,"inactive","no positive results",368.49090576171875,,"",82.0,"1-phenylpropan-2-amine sulfate (2:1)","TR 387",,"inactive","inactive",0.0,"PYHRZPFZZDCOPH-IPLSSONACD","racemic mixture of L- [51-62-7] and D- [51-63-8], parent [300-62-9], structure shown without stereochem","multisex inactive; multispecies inactive","60-13-9",20082.0,"no positive results","","C18H28N2O4S",,"single chemical compound",,"TD50; Tumor Target Sites","","complex bis H2SO4","Carcinogenicity","","","83_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/dl-AMPHETAMINE%20SULFATE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C","inactive","","",,"","rat; mouse","no positive results",20082.0, +"[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O","InChI=1/C16H19N3O4S.3H2O/c1-16(2)11(15(22)23)19-13(21)10(14(19)24-16)18-12(20)9(17)8-6-4-3-5-7-8;;;/h3-7,9-11,14H,17H2,1-2H3,(H,18,20)(H,22,23);3*1H2/t9-,10-,11+,14-;;;/m1.../s1/f/h18,22H;;;","inactive","tested chemical","Ampicillin trihydrate",0.0,,,"inactive","no positive results",403.4505920410156,,"",83.0,"(2S,5R,6R)-6-{[(2R)-2-amino-2-phenylacetyl]amino}-3,3-dimethyl-7-oxo-4-thia-1-azabicyclo[3.2.0]heptane-2-carboxylic acid trihydrate","TR 318",,"inactive","inactive",0.0,"RXDALBZNGVATNY-FQLIROBNDT","stereochem; parent [69-53-4]","multisex inactive; multispecies inactive","7177-48-2",20083.0,"no positive results","","C16H25N3O7S",,"single chemical compound",,"TD50; Tumor Target Sites","","complex 3H2O","Carcinogenicity","structure modified v5b","","84_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMPICILLIN%20TRIHYDRATE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O","inactive","","",,"","rat; mouse","no positive results",20083.0, +"O=C(N(CCCCC)N=O)N","InChI=1/C6H13N3O2/c1-2-3-4-5-9(8-11)6(7)10/h2-5H2,1H3,(H2,7,10)/f/h7H2","active","tested chemical","1-Amyl-1-nitrosourea",51.0,,0.0035000001080334187,"active","TD50 is harmonic mean of more than one positive test",159.18760681152344,,"",84.0,"1-nitroso-1-pentylurea","",,"active","",,"YYTNAQDGJQPZFU-IAUQMDSZCI","","multisite active; multisex active","10589-74-9",20084.0,"","","C6H13N3O2",0.5550000071525574,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat modified v5a","","85_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-AMYL-1-NITROSOUREA.html","","",,"defined organic","hematopoietic system; lung; stomach","","","","","O=C(N(CCCCC)N=O)N","","","",,"","rat","hematopoietic system; lung; mammary gland; stomach; uterus",20084.0, +"","InChI=1//","","no structure","Amylopectin sulfate",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",,,"",,"","",,"active","",,"MOSFIJXAXDLOML-UHFFFAOYAM","non-linear polymer of glucose (Merck - amylopectic)","","9047-13-6",20085.0,"","","",283.0,"macromolecule",,"TD50; Tumor Target Sites","","","Carcinogenicity","TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture","","86_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMYLOPECTIN%20SULFATE.html","","",,"no structure","large intestine","","","","","","","","",,"","rat","",20085.0, +"C/C=C/C1=CC=C(C=C1)OC","InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3+","inactive","tested chemical","trans-Anethole",0.0,,,"inactive","no positive results",148.2017059326172,,"",87.0,"1-(methyloxy)-4-[(1E)-prop-1-en-1-yl]benzene","",,"inactive","inactive",0.0,"RUVINXPYWBROJD-ONEGZZNKBR","stereochem","multisex inactive","4180-23-8",20087.0,"","","C10H12O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","88_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/trans-ANETHOLE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C/C=C/C1=CC=C(C=C1)OC","inactive","","",,"","rat","no positive results",20087.0, +"C/C=C/C1=CC=C(C=C1)OC","InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3+","inactive","tested chemical","trans-Anethole",0.0,,,"inactive","no positive results",148.2017059326172,,"",87.0,"1-(methyloxy)-4-[(1E)-prop-1-en-1-yl]benzene","",,"inactive","inactive",0.0,"RUVINXPYWBROJD-ONEGZZNKBR","stereochem","multisex inactive","4180-23-8",20087.0,"","","C10H12O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","88_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/trans-ANETHOLE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C/C=C/C1=CC=C(C=C1)OC","inactive","","",,"","rat","no positive results",20087.0, +"O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2","InChI=1/C8H11Cl3O6/c9-8(10,11)7-16-5-3(14)4(2(13)1-12)15-6(5)17-7/h2-7,12-14H,1H2/t2-,3+,4-,5-,6-,7-/m1/s1","inactive","tested chemical","Anhydroglucochloral",,,,"inactive","",309.5282897949219,,"",88.0,"1,2-O-[(1R)-2,2,2-trichloroethylidene]-alpha-D-glucofuranose","",,"","",0.0,"OJYGBLRPYBAHRT-IPQSZEQABF","Chlorlose-alpha, stereochem","multisex inactive","15879-93-3",20088.0,"no positive results","","C8H11Cl3O6",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","structure modified v5b","","89_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANHYDROGLUCOCHLORAL.html","no positive results","",,"defined organic","","","","no positive results","","O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2","inactive","","",,"","mouse","",20088.0, +"ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl","InChI=1/C9H5Cl3N4/c10-5-3-1-2-4-6(5)13-9-15-7(11)14-8(12)16-9/h1-4H,(H,13,14,15,16)/f/h13H","inactive","tested chemical","Anilazine",0.0,,,"inactive","no positive results",275.52178955078125,,"",89.0,"4,6-dichloro-N-(2-chlorophenyl)-1,3,5-triazin-2-amine","TR 104",,"inactive","inactive",0.0,"IMHBYKMAHXWHRP-NDKGDYFDCD","","multisex inactive; multispecies inactive","101-05-3",20089.0,"no positive results","","C9H5Cl3N4",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","90_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANILAZINE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl","inactive","","",,"","rat; mouse","no positive results",20089.0, +"NC1=CC=CC=C1","InChI=1/C6H7N/c7-6-4-2-1-3-5-6/h1-5H,7H2","","tested chemical","Aniline",0.0,,,"inactive","no positive results",93.12650299072266,,"",90.0,"aniline","",,"inactive","inactive",,"PAYRUJLWNCNPSJ-UHFFFAOYAP","","","62-53-3",20090.0,"","","C6H7N",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","91_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANILINE.html","","",,"defined organic","no positive results","","","","","NC1=CC=CC=C1","","","",,"","rat","",20090.0, +"NC1=CC=CC=C1","InChI=1/C6H7N.ClH/c7-6-4-2-1-3-5-6;/h1-5H,7H2;1H","active","tested chemical","Aniline.HCl",22.0,,2.0799999237060547,"active","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results",129.58740234375,,"",91.0,"aniline hydrochloride","TR 130",,"active","inactive",0.0,"MMCPOSDMTGQNKG-UHFFFAOYAJ","parent [62-53-3]","multisite active; multisex active","142-04-1",20091.0,"no positive results","","C6H8ClN",269.0,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","92_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANILINE.HCl.html","no positive results","",,"defined organic","peritoneal cavity; spleen; vascular system","","","no positive results","","NC1=CC=CC=C1[H]Cl","inactive","","",,"","rat; mouse","peritoneal cavity",20091.0, +"C1(=C(C=CC=C1)N)OC","InChI=1/C7H9NO.ClH/c1-9-7-5-3-2-4-6(7)8;/h2-5H,8H2,1H3;1H","active","tested chemical","o-Anisidine.HCl",33.0,,0.1860000044107437,"active","TD50 is harmonic mean of more than one positive test",159.6134033203125,,"",92.0,"2-methoxyaniline hydrochloride","TR 89",,"active","active",19.0,"XCZCWGVXRBJCCD-UHFFFAOYAX","parent [90-04-0]","multisite active; multisex active; multispecies active","134-29-2",20092.0,"urinary bladder","","C7H10ClNO",29.700000762939453,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","93_CPDBAS_v5d",6.050000190734863,"","http://potency.berkeley.edu/chempages/o-ANISIDINE.HCl.html","TD50 is harmonic mean of more than one positive test","",966.0,"defined organic","kidney; thyroid gland; urinary bladder","","","urinary bladder","","C1(=C(C=CC=C1)N)OC.[H]Cl","active","","",,"","rat; mouse","urinary bladder",20092.0, +"C1(=CC=C(N)C=C1)OC","InChI=1/C7H9NO.ClH/c1-9-7-4-2-6(8)3-5-7;/h2-5H,8H2,1H3;1H","inactive","tested chemical","p-Anisidine.HCl",0.0,,,"inactive","no positive results",159.6134033203125,,"",93.0,"4-(methyloxy)aniline hydrochloride","TR 116",,"inactive","active",0.0,"VQYJLACQFYZHCO-UHFFFAOYAH","parent [104-94-9]","multisex inactive; multispecies inactive","20265-97-8",20093.0,"no positive results","","C7H10ClNO",,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","94_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/p-ANISIDINE.HCl.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C1(=CC=C(N)C=C1)OC.[H]Cl","inactive","","",,"","rat; mouse","no positive results",20093.0, +"NC1=C(C=CC=C1)C(=O)O","InChI=1/C7H7NO2/c8-6-4-2-1-3-5(6)7(9)10/h1-4H,8H2,(H,9,10)/f/h9H","inactive","tested chemical","Anthranilic acid",0.0,,,"inactive","no positive results",137.13600158691406,,"",94.0,"2-aminobenzoic acid","TR 36",,"inactive","inactive",0.0,"RWZYAGGXGHYGMB-BGGKNDAXCO","","multisex inactive; multispecies inactive","118-92-3",20094.0,"no positive results","","C7H7NO2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","95_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANTHRANILIC%20ACID.html","no positive results","",,"defined organic","no positive results","","","no positive results","","NC1=C(C=CC=C1)C(=O)O","inactive","","",,"","rat; mouse","no positive results",20094.0, +"O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3","InChI=1/C14H8O2/c15-13-9-5-1-2-6-10(9)14(16)12-8-4-3-7-11(12)13/h1-8H","inactive","tested chemical","9,10-Anthraquinone",,,,"inactive","",208.21209716796875,,"",95.0,"9,10-anthraquinone","",,"","active",0.0,"RZVHIXYEVGDQDX-UHFFFAOYAA","","multisex inactive","84-65-1",20095.0,"no positive results","","C14H8O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","96_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/9,10-ANTHRAQUINONE.html","no positive results","",,"defined organic","","","","no positive results","","O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3","inactive","","",,"","mouse","",20095.0, +"","InChI=1/2C4H4O6.2K.3H2O.2Sb/c2*5-1(3(7)8)2(6)4(9)10;;;;;;;/h2*1-2H,(H,7,8)(H,9,10);;;3*1H2;;/q2*-2;2*+1;;;;2*+3/p-4/f2C4H2O6.2K.3H2O.2Sb/q2*-4;2m;;;;2m/rC8H6O12Sb2.2K.3H2O/c9-5(10)1-3-7(13)19-22(17-3)16-2(6(11)12)4-8(14)20-21(15-1)18-4;;;;;/h1-4H,(H,9,10)(H,11,12);;;3*1H2/q;2*+1;;;/p-2/fC8H4O12Sb2.2K.3H2O/q-2;2m;;;","","tested chemical","Antimony potassium tartrate",,,,"inactive","",667.8726196289062,,"no positive results",96.0,"dipotassium 5,11-dioxo-2,6,8,12,13,14-hexaoxa-1,7-distibatricyclo[8.2.1.1~4,7~]tetradecane-3,9-dicarboxylate trihydrate","",,"","inactive",0.0,"WBTCZEPSIIFINA-DYFLWLNICK","","","28300-74-5",20096.0,"","","C8H10K2O15Sb2",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","97_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANTIMONY%20POTASSIUM%20TARTRATE.html","","",,"organometallic","","","","","","[K+].[K+].[O-]C(=O)C2O[Sb]3OC(C(O[Sb]1OC(=O)C2O1)C([O-])=O)C(=O)O3.O.O.O","inactive","","",,"","mouse","",39240.0, +"CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl","InChI=1/C15H23ClO4S/c1-12(20-21(17)19-10-9-16)11-18-14-7-5-13(6-8-14)15(2,3)4/h5-8,12H,9-11H2,1-4H3","active","tested chemical","Aramite",31.0,,0.289000004529953,"active","TD50 is harmonic mean of more than one positive test",334.85870361328125,,"",97.0,"2-chloroethyl 2-{[4-(1,1-dimethylethyl)phenyl]oxy}-1-methylethyl sulfite","",,"active","",32.0,"YKFRAOGHWKADFJ-UHFFFAOYAL","","multispecies active","140-57-8",20097.0,"liver","","C15H23ClO4S",96.69999694824219,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","98_CPDBAS_v5d",0.47200000286102295,"","http://potency.berkeley.edu/chempages/ARAMITE.html","","",158.0,"defined organic","","","","no positive results","","CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl","active","liver","",,"","rat; mouse","",20097.0, +"O=C(OC)C1=CCCN(C)C1","InChI=1/C8H13NO2.ClH/c1-9-5-3-4-7(6-9)8(10)11-2;/h4H,3,5-6H2,1-2H3;1H","active","tested chemical","Arecoline.HCl",,,,"active","",191.6571044921875,,"",98.0,"methyl 1-methyl-1,2,5,6-tetrahydropyridine-3-carboxylate hydrochloride","",,"","",36.0,"LQSWCSYIDIBGRR-UHFFFAOYAO","parent [63-75-2]","multisite active; multisex active","61-94-9",20098.0,"lung; stomach; vascular system","","C8H14ClNO2",,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","99_CPDBAS_v5d",0.20600000023841858,"","http://potency.berkeley.edu/chempages/ARECOLINE.HCl.html","TD50 is harmonic mean of more than one positive test","",39.5,"defined organic","","","","lung; vascular system","","O=C(OC)C1=CCCN(C)C1.[H]Cl","active","","",,"","mouse","",20098.0, +"[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C(O)=O)=CC3=C2OCO3)=O","InChI=1/C17H11NO7.Na/c1-23-12-4-2-3-8-9(12)5-11(18(21)22)14-10(17(19)20)6-13-16(15(8)14)25-7-24-13;/h2-6H,7H2,1H3,(H,19,20);/q;+1/p-1/fC17H10NO7.Na/q-1;m","active","representative component in mixture","Aristolochic acid, sodium salt (77% AA I, 21% AA II)",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",363.25360107421875,,"",99.0,"sodium 8-(methyloxy)-6-nitrophenanthro[3,4-d][1,3]dioxole-5-carboxylate","",,"active","active",,"BQVOPWJSBBMGBR-KEMNOBITCY","structure shown AA I, parent [313-67-7]; AA II 6-Nitrophenanthro(3,4-d)-1,3-dioxole-5-carboxylic acid, sodium salt, AA II parent [475-80-9]","multisex active","10190-99-5",20099.0,"","","C17H10NNaO7",0.014100000262260437,"mixture or formulation",,"TD50; Tumor Target Sites","","salt Na","Carcinogenicity","kidney and urinary bladder were additional target sites but experiments too short to meet the inclusion rules of the CPDB; Rat added v2a; Mutagenicity_SAL_CPDB added v3a; TD50_Rat_mmol conversion from mg value not provided due to substance being a mixture","","100_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ARISTOLOCHIC%20ACID,%20SODIUM%20SALT%20(77%25%20AA%20I,%2021%25%20AA%20I.html","","",,"defined organic","stomach","","","","","[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+]","","","",,"","rat","stomach",20099.0, diff --git a/test/data/hamster_carcinogenicity.csv b/test/data/hamster_carcinogenicity.csv new file mode 100644 index 0000000..52d89a3 --- /dev/null +++ b/test/data/hamster_carcinogenicity.csv @@ -0,0 +1,86 @@ +SMILES, Hamster Carcinogenicity +CC=O,true +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,true +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,true +C1(N=CNN=1)N,false +Br(=O)(=O)[O-].[K+],true +[Cl-].[Cd+2].[Cl-],false +O=S(=O)([O-])[O-].[Cd+2],false +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,false +ClCOC,true +C=C(Cl)C=C,false +Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,false +O=C1OC2=C(C=CC=C2)C=C1,false +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,true +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,false +C=CCN(CC=C)N=O,true +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,false +O=C(N(C)C)Cl,true +CN(C)N,true +N(NC)C.[H]Cl.[H]Cl,true +CCO,false +O=C(N(CC)N=O)NCCO,true +O=C(N(CC)N=O)NCC(=O)C,true +C=O,false +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,true +O=CC1=CC=CO1,false +OCC1CO1,true +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,false +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,true +NN,true +OS(=O)(=O)O.NN,true +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,true +OCCNN,false +O=C(C1=CC=NC=C1)NN,false +OC(=O)C1=CC=NC=C1,false +O=C(NC1=CC=CC(=C1)Cl)OC(C)C,false +O=C(NC1=CC=CC=C1)OC(C)C,false +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],false +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,false +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,false +CN(N)C=O,true +O=C(C(=C)C)OC,false +CNN,true +O=C(C1=CC=CN=C1)CCCN(N=O)C,false +CC1=CC(=O)NC(=S)N1,true +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,false +O=N[O-].[Na+],false +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,true +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,true +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],false +N(CC(CO)O)(CC(O)C)N=O,true +N(CC(CO)O)(CC(C)=O)N=O,true +N(CC(CO)O)(CCO)N=O,false +O=C(C)CN(N=O)CCO,true +C1C(N(C(CN1N=O)C)C)C,true +N(CC(C)=O)(CC=C)N=O,true +N(CC(CO)O)(C)N=O,true +O=NN1CCOCC1,true +N1C=CC=C(C=1)C2N(N=O)CCC2,true +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,false +O=NN1CCCCC1,true +O=NN1CCCC1,true +O=C(N(CC(C)=O)N=O)NCCCl,true +N(C(=O)N)(N=O)CC(C)=O,true +C1(CCN=C=S)=CC=CC=C1,false +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,false +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,false +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,false +C1(=CC(=C(O)C=C1)O)C(O)=O,false +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,false +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,false +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,false +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,false +ClC(=CCl)Cl,false +NC(=O)OCC,true +C=CCl,true +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,false +C1(CN(CC(N1N=O)C)N=O)C,true +N(CCN(C)C)(C)N=O,true +C1(CN(N=O)CC(O1)C)C,true +O1C(N(CC1C)N=O)=O,true +CCOC(=O)N(C)N=O,true +C1N(COC1)N=O,true +O=C(N(CCC1=CC=CC=C1)N=O)N,true +O=NN1CCC1,true +F[B-](F)(F)F.[Na+],false diff --git a/test/data/hamster_carcinogenicity.mini.csv b/test/data/hamster_carcinogenicity.mini.csv new file mode 100644 index 0000000..4267235 --- /dev/null +++ b/test/data/hamster_carcinogenicity.mini.csv @@ -0,0 +1,11 @@ +SMILES, Hamster Carcinogenicity +CC=O,1 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,1 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,1 +C1(N=CNN=1)N,0 +Br(=O)(=O)[O-].[K+],1 +[Cl-].[Cd+2].[Cl-],0 +O=S(=O)([O-])[O-].[Cd+2],0 +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,0 +ClCOC,1 +C=C(Cl)C=C,0 diff --git a/test/data/hamster_carcinogenicity.sdf b/test/data/hamster_carcinogenicity.sdf new file mode 100644 index 0000000..df230d5 --- /dev/null +++ b/test/data/hamster_carcinogenicity.sdf @@ -0,0 +1,2805 @@ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 5.7640 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0213 -1.3540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8046 -2.4275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1296 -2.2921 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6712 -1.0735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8878 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5629 -0.1451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0213 -3.5106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7640 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6035 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4526 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4526 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6035 -1.1025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3017 -3.7621 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 -1.7698 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 13 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 14 1 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 17 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 18 19 0 0 0 0 0 0 0 0 2 V2000 + 3.2537 -3.5906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2537 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4062 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4062 -4.2555 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1011 -4.2555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9682 -0.2748 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6649 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1011 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8866 -2.1366 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7006 -3.5817 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0038 -3.8654 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5587 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6687 -2.7129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7733 -1.7199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5446 -5.0800 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 6.7644 -6.1527 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 8.8656 -5.2130 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 4 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 8 1 0 0 0 0 + 3 13 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 9 2 0 0 0 0 + 8 10 2 0 0 0 0 + 9 10 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 12 14 2 0 0 0 0 + 12 16 1 0 0 0 0 + 13 15 2 0 0 0 0 + 14 15 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 18 2 0 0 0 0 +M CHG 2 16 1 17 -1 +M END +> +active + +$$$$ + + + + 6 6 0 0 0 0 0 0 0 0 1 V2000 + 1.3304 -1.0738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1104 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3767 -0.4086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3767 -1.7390 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1104 -2.1509 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.0738 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 2 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 13 13 0 0 0 0 0 0 0 0 1 V2000 + 1.1541 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 -0.6703 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4553 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6094 -0.6703 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6094 -1.9972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4553 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 -1.9972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1541 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4837 -1.5134 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8175 -3.8147 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.3309 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7566 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9107 -1.9972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 12 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 1 0 0 0 0 + 8 11 1 0 0 0 0 + 12 13 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 3 0 0 0 0 0 0 0 0 0 2 V2000 + 10.0000 -0.0700 0.0000 Cl 0 5 0 0 0 0 0 0 0 0 0 0 + 4.5200 0.0000 0.0000 Cd 0 2 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.3400 0.0000 Cl 0 5 0 0 0 0 0 0 0 0 0 0 +M CHG 3 1 -1 2 2 3 -1 +M END +> +inactive + +$$$$ + + + + 6 4 0 0 0 0 0 0 0 0 2 V2000 + 2.6600 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 -1.3320 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3280 -1.3320 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 3.9880 -1.3320 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3320 0.0000 Cd 0 2 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M CHG 3 4 -1 5 -1 6 2 +M END +> +inactive + +$$$$ + + + + 0 0 0 0 0 0 0 0 0 0 1 V2000 +M END +> +inactive + +$$$$ + + + + 21 22 0 0 0 0 0 0 0 0 1 V2000 + 5.7698 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7698 -1.3315 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9111 -2.0036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9111 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7698 -3.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6158 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6158 -2.0036 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4619 -3.9945 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3079 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1540 -3.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1540 -5.3260 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.3351 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0650 -3.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2190 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2190 -2.0036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3730 -1.3315 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5269 -2.0036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5269 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3730 -3.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3730 -5.3260 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6809 -3.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 13 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 2 0 0 0 0 + 18 21 1 0 0 0 0 + 19 20 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 3.4575 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3061 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 2.2415 -0.6520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1191 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3606 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2415 -2.0836 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 1 5 1 0 0 0 0 + 2 4 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 21 22 0 0 0 0 0 0 0 0 1 V2000 + 12.5806 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2668 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9397 -1.3138 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3083 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9945 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2574 -0.1592 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3177 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9718 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3177 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9585 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2707 -2.4683 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2762 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3403 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9359 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9906 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9906 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2989 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2989 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.4683 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2668 -2.6674 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2668 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 2 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 20 1 0 0 0 0 + 2 21 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 8 2 0 0 0 0 + 4 5 1 0 0 0 0 + 4 10 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 9 2 0 0 0 0 + 7 15 2 0 0 0 0 + 8 18 1 0 0 0 0 + 9 16 1 0 0 0 0 + 10 17 2 0 0 0 0 + 12 14 1 0 0 0 0 + 13 16 2 0 0 0 0 + 13 19 1 0 0 0 0 + 13 15 1 0 0 0 0 + 14 17 1 0 0 0 0 + 14 18 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 11 12 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1518 -1.9983 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3036 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4554 -1.9983 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4554 -0.6680 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6071 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7589 -0.6680 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7589 -1.9983 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6071 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3036 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1518 -0.6680 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 18 19 0 0 0 0 0 0 0 0 1 V2000 + 3.4540 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6054 -0.6632 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6054 -1.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7567 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9080 -1.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0594 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0594 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9080 -4.6514 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7567 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2107 -4.6514 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4540 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4540 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3027 -4.6514 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3027 -1.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.6514 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7567 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 18 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 9 2 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 17 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 19 20 0 0 0 0 0 0 0 0 1 V2000 + 3.2800 -1.3268 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6068 -1.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6068 -2.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7585 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9102 -2.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0619 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0619 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9102 -5.3162 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7585 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2136 -5.3162 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4551 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4551 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3034 -5.3162 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1517 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1517 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3034 -2.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -5.3162 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6068 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9336 -1.3268 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 18 1 0 0 0 0 + 2 19 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 9 2 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 17 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 2.6588 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9976 -1.1548 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6588 -2.3049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9976 -3.4597 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6588 -4.6098 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9905 -4.6098 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6563 -3.4597 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6659 -3.4597 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3049 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 19 23 0 0 0 0 0 0 0 0 1 V2000 + 1.2310 -2.6401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6401 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6007 -3.6931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2470 -2.9219 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4113 -2.7068 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7946 -3.9008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1061 -5.0280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3001 -3.6931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8500 -2.0023 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3902 -3.1295 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6954 -3.7599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3258 -2.7068 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4159 -2.4250 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1478 -4.8203 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9749 -4.3235 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3902 -0.7787 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1318 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5522 -0.0742 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6583 -1.1643 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 7 1 0 0 0 0 + 5 9 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 8 10 1 0 0 0 0 + 9 12 1 0 0 0 0 + 9 16 1 0 0 0 0 + 9 19 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 16 1 0 0 0 0 + 10 15 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 14 1 0 0 0 0 + 12 13 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 18 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 6 5 0 0 0 0 0 0 0 0 1 V2000 + 1.3307 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9943 -1.1509 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3307 -2.3053 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9943 -3.4563 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3053 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3250 -1.1509 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 1.9950 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3292 -1.1518 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1518 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 8 5 0 0 0 0 0 0 0 0 1 V2000 + 2.7482 -0.6668 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9000 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0518 -0.6668 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5964 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6623 -1.9955 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9909 -1.9955 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9955 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3286 -1.9955 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 2 3 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 1 V2000 + 2.2999 -3.9852 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2999 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1534 -1.9891 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1534 -0.6630 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 -2.6591 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9852 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4534 -1.9891 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6068 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7533 -1.9891 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9067 -2.6591 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 12 11 0 0 0 0 0 0 0 0 1 V2000 + 2.3006 -3.9862 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3006 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1537 -1.9897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1537 -0.6632 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 -2.6598 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9862 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4543 -1.9897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6080 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7548 -1.9897 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7548 -0.6632 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9086 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 2 1 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 17 18 0 0 0 0 0 0 0 0 2 V2000 + 11.3714 -1.9900 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 10.2229 -1.3304 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 10.2229 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0743 -1.9900 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9265 -3.3204 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6302 -3.5933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9706 -2.4448 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8576 -1.4555 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6402 -2.3084 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7532 -3.2863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5365 -2.7519 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6729 -1.4328 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -1.1485 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6950 -0.5345 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4442 -1.0121 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2395 -2.3311 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.8087 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 13 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 +M CHG 2 1 -1 2 1 +M END +> +active + +$$$$ + + + + 7 7 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.5998 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -2.2653 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -1.5998 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4416 -0.2777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7417 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4072 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5169 -2.1419 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 5 5 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1519 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1519 -1.8168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3037 -1.1519 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9687 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6336 -1.1519 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 24 26 0 0 1 0 0 0 0 0 1 V2000 + 6.2320 -1.0924 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8471 -2.3097 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6298 -2.7050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6298 -3.9743 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8471 -4.3593 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5857 -3.3293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2308 -2.2369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5001 -2.2369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1347 -3.3293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4040 -3.3293 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5001 -4.4321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2308 -4.4321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5857 -5.5453 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0019 -0.9780 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9799 -0.1665 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5374 -4.6090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5374 -5.8783 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4241 -3.9743 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3213 -4.6090 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.1316 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4241 -2.7050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5374 -2.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5374 -0.7907 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6334 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 6 2 1 1 0 0 0 + 3 4 2 0 0 0 0 + 3 22 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 16 1 0 0 0 0 + 6 5 1 6 0 0 0 + 6 7 1 0 0 0 0 + 6 12 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 14 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 1 0 0 0 + 14 15 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 18 2 0 0 0 0 + 18 19 1 0 0 0 0 + 18 21 1 0 0 0 0 + 19 20 1 0 0 0 0 + 21 22 2 0 0 0 0 + 22 23 1 0 0 0 0 + 23 24 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 12 12 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.3036 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 -2.3036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3250 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9901 -2.3036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3250 -3.4581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -3.4581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 -4.6072 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9901 -4.6072 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3201 -2.3036 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9901 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 9 1 0 0 0 0 + 7 8 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 2 1 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 7 5 0 0 0 0 0 0 0 0 1 V2000 + 3.9900 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9900 -1.3300 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 -1.3300 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3200 -1.3300 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9900 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3300 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 -1.3300 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 2 0 0 0 0 + 2 5 1 0 0 0 0 + 6 7 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 18 20 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3313 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9920 -3.4593 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9920 -1.1564 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3313 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3233 -1.1564 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9938 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3251 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9858 -1.1564 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3251 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9938 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2880 -1.4284 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3666 -0.6511 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5812 -1.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7173 -2.5168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6387 -3.2942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4240 -2.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2093 -3.2942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 18 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 12 1 0 0 0 0 + 10 11 2 0 0 0 0 + 12 13 2 0 0 0 0 + 12 17 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 17 18 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1525 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -0.6638 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 10 10 0 0 0 0 0 0 0 0 1 V2000 + 4.6545 -3.4536 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9889 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6577 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9968 -3.4536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6656 -3.4536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6656 -1.1497 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9968 -1.1497 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6545 -1.1497 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9889 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 9 10 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 9 9 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6655 -1.1542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9965 -1.1542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6574 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9884 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6539 -1.1542 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9884 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6574 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 14 14 0 0 0 0 0 0 0 0 1 V2000 + 3.4524 -0.6629 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4524 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6031 -2.6606 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7539 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7539 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9047 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0555 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0555 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9047 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2063 -2.6606 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3016 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1508 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1508 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 14 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 13 13 0 0 0 0 0 0 0 0 1 V2000 + 3.4601 -0.6694 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4601 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6054 -2.6616 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7587 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7587 -0.6694 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9121 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0654 -0.6694 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0654 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9121 -2.6616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3067 -2.6616 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1534 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1534 -0.6694 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 15 6 0 0 0 0 0 0 0 0 3 V2000 + 5.7806 -4.7517 0.0000 Pb 0 2 0 0 0 2 0 0 0 0 0 0 + 5.1849 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 4.5351 -1.1507 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1849 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1949 -1.1507 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0036 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.3267 -1.1507 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0036 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1507 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6759 -4.9413 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 5.8754 -5.6452 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 11.4935 -1.8817 0.0000 Pb 0 2 0 0 0 2 0 0 0 0 0 0 + 13.5377 -1.9900 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 11.7778 -2.7075 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 3.6281 -3.4792 0.0000 Pb 0 2 0 0 0 2 0 0 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 2 0 0 0 0 +M CHG 8 1 2 2 -1 6 -1 10 -1 11 -1 12 2 13 -1 14 -1 +M CHG 1 15 2 +M END +> +inactive + +$$$$ + + + + 20 20 0 0 0 0 0 0 0 0 1 V2000 + 4.4090 -3.9937 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5672 -4.6567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7174 -3.9937 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8676 -4.6567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8676 -5.9906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7174 -6.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5672 -5.9906 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2589 -4.6567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1087 -3.9937 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8946 -4.5368 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.5464 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6630 -2.3962 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9649 -2.6678 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4090 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2589 -1.9969 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2589 -0.6630 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1087 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4090 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3307 -7.9874 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6567 -7.9874 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 14 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 2 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 13 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 18 1 0 0 0 0 + 19 20 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 33 35 0 0 1 0 0 0 0 0 1 V2000 + 14.9725 -5.3302 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 13.8197 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6668 -5.3302 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5139 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5139 -7.3216 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6668 -7.9804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.8197 -7.3216 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6668 -9.3129 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3610 -5.3302 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3610 -3.9977 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5139 -3.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6668 -3.9977 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5139 -1.9913 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3610 -1.3326 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2081 -1.9913 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2081 -3.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0552 -3.9977 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9173 -3.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9173 -1.9913 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0552 -1.3326 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -3.9977 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6115 -3.3239 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -5.3302 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6115 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4587 -5.3302 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3058 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -5.3302 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -3.9977 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -5.9890 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6115 -7.3216 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4587 -7.9804 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -7.9804 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3610 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 33 1 0 0 0 0 + 15 16 2 0 0 0 0 + 15 20 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 19 1 0 0 0 0 + 18 21 1 0 0 0 0 + 19 20 2 0 0 0 0 + 21 22 2 0 0 0 0 + 21 23 1 0 0 0 0 + 24 23 1 6 0 0 0 + 24 25 1 0 0 0 0 + 24 30 1 0 0 0 0 + 25 26 1 0 0 0 0 + 26 27 1 0 0 0 0 + 27 28 2 0 0 0 0 + 27 29 1 0 0 0 0 + 30 31 2 0 0 0 0 + 30 32 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 2.3056 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 -1.3308 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4567 -1.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3308 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 7 6 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.3052 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3306 -2.3052 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9941 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3247 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3306 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9941 -3.4560 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3247 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 6 7 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 15 15 0 0 0 0 0 0 0 0 1 V2000 + 3.4524 -3.9915 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4524 -2.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3016 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1508 -2.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1508 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3016 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6032 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7643 -2.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9151 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0659 -2.6644 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2167 -2.0009 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3675 -2.6644 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0659 -3.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 15 1 0 0 0 0 + 13 14 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 9 9 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3315 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -1.1518 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3265 -1.1518 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9899 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9899 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3265 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9899 -4.6073 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -3.4555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 23 25 0 0 0 0 0 0 0 0 1 V2000 + 1.6416 -5.7565 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2982 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1491 -3.9398 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.6074 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1491 -2.6156 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9658 -3.4583 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3010 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9576 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2928 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9604 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2928 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9576 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2846 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9522 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2764 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9440 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2764 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9522 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2846 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9522 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2764 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9440 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4583 -5.2750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 23 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 12 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 10 13 1 0 0 0 0 + 11 12 2 0 0 0 0 + 13 14 1 0 0 0 0 + 13 18 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 17 22 1 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 21 22 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 4 2 0 0 0 0 0 0 0 0 2 V2000 + 2.3030 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.1975 -1.9944 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M CHG 2 3 -1 4 1 +M END +> +inactive + +$$$$ + + + + 17 18 0 0 0 0 0 0 0 0 2 V2000 + 1.2652 -1.2985 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.7091 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.5426 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2529 -2.1863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5514 -1.9089 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2173 -3.0631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3294 -4.0508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1086 -3.5070 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5380 -3.1963 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4258 -2.2085 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6466 -2.7523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5023 -4.0730 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2039 -4.3505 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8008 -2.0865 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9439 -2.7523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9439 -4.0841 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0981 -2.0865 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 1 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 9 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 13 2 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 11 14 1 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 + 15 17 1 0 0 0 0 +M CHG 2 1 1 2 -1 +M END +> +active + +$$$$ + + + + 16 17 0 0 0 0 0 0 0 0 2 V2000 + 10.9589 -1.9945 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 9.8082 -1.3260 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 9.8082 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6575 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5151 -3.3205 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2110 -3.5945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5534 -2.4438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4411 -1.4575 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2274 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3397 -3.2877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1233 -2.7507 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2658 -1.4247 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5589 -1.1507 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2795 -0.5370 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0301 -1.0192 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.1753 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 13 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M CHG 2 1 -1 2 1 +M END +> +active + +$$$$ + + + + 15 17 0 0 0 0 0 0 0 0 2 V2000 + 4.2842 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2842 -1.3283 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 3.1294 -1.9925 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9805 -1.3283 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8257 -1.9925 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8257 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9805 -3.9910 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1294 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2842 -3.9910 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2842 -5.3193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1294 -5.9835 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9805 -5.3193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6642 -5.5168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.3620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4330 -1.9925 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 6 14 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 12 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 +M CHG 2 2 1 15 -1 +M END +> +inactive + +$$$$ + + + + 12 11 0 0 0 0 0 0 0 0 1 V2000 + 3.3277 -1.1482 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9859 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3169 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9825 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3135 -1.1482 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9825 -3.4520 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9966 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3311 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9966 -3.4520 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9859 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3169 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 1 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 12 11 0 0 0 0 0 0 0 0 1 V2000 + 3.3277 -1.1482 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9859 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3169 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9825 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3135 -1.1482 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9825 -3.4520 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9966 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3311 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9966 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3038 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9859 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3169 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 2 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 1 V2000 + 3.9901 -2.3031 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3261 -1.1486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9921 -1.1486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3280 -2.3031 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3031 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3280 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3182 -2.3031 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9822 -1.1486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3182 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3261 -3.4517 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9921 -3.4517 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 10 11 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 10 9 0 0 0 0 0 0 0 0 1 V2000 + 1.9973 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9973 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6658 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9899 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6557 -3.4592 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6658 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3046 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 10 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 3.3269 -3.4585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9925 -3.4585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3283 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9925 -1.1548 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3269 -1.1548 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3194 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9835 -1.1548 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3283 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3283 -4.6073 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 10 9 0 0 0 0 0 0 0 0 1 V2000 + 1.9973 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9973 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6658 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9899 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6557 -3.4592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6658 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3046 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 9 10 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 2.3046 -1.9992 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4569 -2.6618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6092 -1.9992 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6092 -0.6683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4569 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7615 -2.6618 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3046 -0.6683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1523 -2.6618 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9992 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 8 9 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 8 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6654 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9962 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9877 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6531 -1.1540 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9877 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 13 14 0 0 0 0 0 0 0 0 1 V2000 + 2.2670 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5961 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2606 -1.1490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5961 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2670 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5962 -1.1490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5962 -3.4532 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1427 -4.6705 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4408 -4.9438 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8507 -6.2108 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1490 -5.5587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.8941 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2795 -3.5961 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 2 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 11 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 14 15 0 0 0 0 0 0 0 0 2 V2000 + 5.5085 -1.1540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1727 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5085 -3.4554 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1800 -3.4554 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5091 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1800 -1.1540 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 3.5091 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 3.5091 -4.6027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0525 -5.8171 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0662 -6.7095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9122 -6.0453 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1873 -4.7436 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3016 -3.7573 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.0324 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 12 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 +M CHG 2 6 1 7 -1 +M END +> +inactive + +$$$$ + + + + 8 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6654 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9962 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9877 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6531 -1.1540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9877 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 7 7 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.5998 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -2.2653 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -1.5998 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4416 -0.2777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7417 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4072 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5169 -2.1419 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 13 12 0 0 0 0 0 0 0 0 1 V2000 + 3.3259 -3.4535 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9879 -2.2970 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3259 -1.1485 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9939 -1.1485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3320 -2.2970 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9939 -3.4535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.2970 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9879 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3199 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3199 -2.2970 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9818 -3.4535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3138 -3.4535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9758 -4.6020 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 10 9 0 0 0 0 0 0 0 0 1 V2000 + 2.3042 -1.9989 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3042 -0.6682 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1521 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1521 -2.6614 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9989 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 -2.6614 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6084 -1.9989 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7605 -2.6614 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6084 -0.6682 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 5.7578 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6046 -2.6612 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4595 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3063 -2.6612 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1532 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3306 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7578 -0.6693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9109 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0641 -0.6693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0641 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9109 -2.6612 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 2 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 17 18 0 0 0 0 0 0 0 0 1 V2000 + 2.3044 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3044 -1.3295 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4567 -1.9942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7640 -2.2232 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6208 -1.2039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9281 -1.4329 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3860 -2.6885 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5292 -3.7078 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2219 -3.4714 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4567 -3.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6089 -3.9884 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3044 -3.9884 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1522 -3.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9884 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1522 -1.9942 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9146 -0.7460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2219 -0.5096 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 16 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 15 1 0 0 0 0 + 16 17 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 5.7546 -2.6609 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9055 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9055 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7546 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6037 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6037 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4528 -2.6609 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3018 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 -2.6609 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3018 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0564 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2074 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2074 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0564 -2.6609 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 17 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 13 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 14 15 2 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 23 26 0 0 0 0 0 0 0 0 1 V2000 + 4.6025 -7.9798 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6025 -6.6499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4579 -5.9889 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4579 -4.6589 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3053 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1526 -4.6589 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1526 -1.9990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3053 -2.6599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1526 -5.9889 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3053 -6.6499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6025 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7552 -4.6589 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7552 -5.9889 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9078 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0604 -4.6589 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9078 -2.6599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7552 -1.9990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7552 -0.6690 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9078 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0604 -0.6690 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0604 -1.9990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 16 18 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 23 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 1.9925 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9835 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6642 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4525 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1488 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 7 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 11 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 24 24 0 0 0 0 0 0 0 0 1 V2000 + 4.6016 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6016 -1.3369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4512 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4512 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3008 -3.9901 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1504 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1504 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3008 -1.3369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3008 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9901 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6016 -3.9901 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7623 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7623 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9127 -1.3369 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9127 -3.9901 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0631 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2135 -3.9901 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2135 -5.3270 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0631 -5.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9127 -5.3270 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3639 -5.9903 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3639 -3.3268 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1819 -7.3169 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8554 -7.3169 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 6 10 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 15 1 0 0 0 0 + 13 14 1 0 0 0 0 + 15 16 2 0 0 0 0 + 15 20 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 17 22 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 21 1 0 0 0 0 + 19 20 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 25 26 0 0 0 0 0 0 0 0 1 V2000 + 10.6420 -6.9191 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9717 -8.0683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6429 -8.0683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9845 -6.9191 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6429 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9717 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9845 -4.6088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6429 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9845 -2.3104 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6429 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9717 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6420 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6420 -2.3104 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9717 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.9708 -2.3104 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6558 -4.6088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9854 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6566 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9863 -4.6088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6575 -4.6088 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6566 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9854 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6420 -9.2175 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.5609 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3288 -4.5609 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 23 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 16 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 14 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 15 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 22 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 2 0 0 0 0 + 19 21 1 0 0 0 0 + 21 22 2 0 0 0 0 + 24 25 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 24 25 0 0 0 0 0 0 0 0 1 V2000 + 7.9826 -4.6086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6532 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9826 -2.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6532 -1.1495 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9730 -1.1495 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6435 -2.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9730 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6435 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6532 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9730 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6435 -6.9076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9730 -8.0678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6532 -8.0678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9826 -6.9076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6435 -9.2173 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6522 -4.6086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9923 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6619 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9913 -4.6086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6619 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9923 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6609 -4.6086 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.5554 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3304 -4.5554 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 16 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 12 15 1 0 0 0 0 + 13 14 2 0 0 0 0 + 16 17 1 0 0 0 0 + 16 21 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 22 2 0 0 0 0 + 20 21 2 0 0 0 0 + 23 24 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 43 47 0 0 1 0 0 0 0 0 1 V2000 + 4.6024 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6024 -9.9693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -9.3118 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9112 -9.9693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 -9.3118 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2048 -9.9693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2048 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 -11.9723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9112 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -11.9723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3668 -11.9723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 -7.9815 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -7.9815 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -9.3118 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -7.9815 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6024 -7.3088 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6024 -5.9785 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -5.3210 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -3.9908 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9112 -3.3180 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9112 -1.9877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2048 -1.9877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3668 -1.3303 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2048 -3.3180 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 -3.9908 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3668 -3.9908 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -1.3303 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -5.3210 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -3.9908 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 -5.9785 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 -7.3088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1468 -7.9815 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1468 -5.3210 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -11.9723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -13.3026 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 -13.9600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1468 -13.3026 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -13.9600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1468 -11.9723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 -15.2903 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 10 1 0 0 0 0 + 1 36 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 2 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 11 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 15 14 1 1 0 0 0 + 15 16 1 0 0 0 0 + 15 33 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 1 1 0 0 0 + 17 30 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 19 1 1 0 0 0 + 20 21 1 0 0 0 0 + 20 26 1 0 0 0 0 + 21 22 1 0 0 0 0 + 21 29 1 6 0 0 0 + 22 23 1 0 0 0 0 + 22 28 1 6 0 0 0 + 23 24 1 1 0 0 0 + 23 25 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 27 1 6 0 0 0 + 30 31 1 6 0 0 0 + 30 32 1 0 0 0 0 + 32 33 1 0 0 0 0 + 32 35 1 1 0 0 0 + 33 34 1 6 0 0 0 + 36 37 2 0 0 0 0 + 36 42 1 0 0 0 0 + 37 38 1 0 0 0 0 + 38 39 2 0 0 0 0 + 38 43 1 0 0 0 0 + 39 40 1 0 0 0 0 + 39 41 1 0 0 0 0 + 41 42 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 3.4567 -1.9945 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3308 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 5 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 6 5 0 0 0 0 0 0 0 0 1 V2000 + 4.6084 -1.9954 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3042 -1.9954 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1521 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 13 12 0 0 0 0 0 0 0 0 2 V2000 + 0.0000 -1.1513 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3274 -1.1513 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 2.6611 -1.1513 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3217 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6554 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3159 -1.1513 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6554 -2.3025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3217 -2.3025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6611 -6.2911 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6611 -4.9636 0.0000 B 0 5 0 0 0 0 0 0 0 0 0 0 + 1.3274 -4.9636 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6611 -3.6299 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9885 -4.9636 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 3 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 13 1 0 0 0 0 +M CHG 2 2 1 10 -1 +M END +> +inactive + +$$$$ + + + + 12 12 0 0 0 0 0 0 0 0 1 V2000 + 3.4560 -1.3271 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6103 -1.9906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6103 -3.3247 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4560 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3017 -3.3247 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3017 -1.9906 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1543 -1.3271 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9906 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1543 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7577 -3.9882 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9120 -3.3247 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4560 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 9 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 10 11 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 4.6053 -1.9954 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4522 -1.3257 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2992 -1.9954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1530 -1.3257 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1530 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6053 -3.3210 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7514 -1.3257 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9045 -1.9954 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 8 9 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 10 10 0 0 0 0 0 0 0 0 1 V2000 + 0.6656 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9968 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6577 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9889 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6545 -1.1543 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9968 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6656 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3040 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.6079 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 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 9 9 0 0 0 0 0 0 0 0 1 V2000 + 2.1136 -0.3740 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3772 -0.7820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3772 -2.1136 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1136 -2.5272 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3316 -1.4506 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.4506 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4538 -2.8956 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6665 -2.3572 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4538 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1552 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6644 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9932 -2.3044 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6576 -1.1552 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9932 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9924 -1.1552 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6568 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6568 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9855 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 7 7 0 0 0 0 0 0 0 0 1 V2000 + 3.5169 -2.1419 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -1.5998 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4416 -0.2777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7417 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4072 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -2.2653 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.5998 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 14 14 0 0 0 0 0 0 0 0 1 V2000 + 1.9935 -3.4527 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3316 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9935 -1.1482 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3251 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9869 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3186 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9804 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3120 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9739 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3120 -3.4527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9804 -3.4527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3316 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3044 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 12 13 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 6 6 0 0 0 0 0 0 0 0 1 V2000 + 2.2694 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2694 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9376 -1.3318 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.2694 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3409 -3.5516 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9376 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 6 4 0 0 0 0 0 0 0 0 2 V2000 + 2.6600 -2.6600 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 -1.3320 0.0000 B 0 5 0 0 0 0 0 0 0 0 0 0 + 1.3280 -1.3320 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 0.0000 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9880 -1.3320 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3320 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M CHG 2 2 -1 6 1 +M END +> +inactive + diff --git a/test/data/hamster_carcinogenicity.xls b/test/data/hamster_carcinogenicity.xls new file mode 100644 index 0000000..680c30e Binary files /dev/null and b/test/data/hamster_carcinogenicity.xls differ diff --git a/test/data/hamster_carcinogenicity.yaml b/test/data/hamster_carcinogenicity.yaml new file mode 100644 index 0000000..108edd9 --- /dev/null +++ b/test/data/hamster_carcinogenicity.yaml @@ -0,0 +1,352 @@ +--- !ruby/object:OpenTox::Dataset +compounds: +- http://localhost/compound/InChI=1S/C2H4O/c1-2-3/h2H,1H3 +- http://localhost/compound/InChI=1S/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17) +- http://localhost/compound/InChI=1S/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14) +- http://localhost/compound/InChI=1S/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6) +- http://localhost/compound/InChI=1S/BrHO3.K/c2-1(3)4;/h(H,2,3,4);/q;+1/p-1 +- http://localhost/compound/InChI=1S/Cd.2ClH/h;2*1H/q+2;;/p-2 +- http://localhost/compound/InChI=1S/Cd.H2O4S/c;1-5(2,3)4/h;(H2,1,2,3,4)/q+2;/p-2 +- http://localhost/compound/InChI=1S/C14H14ClN3O2S/c1-8-4-3-5-10(9(8)2)16-12-6-11(15)17-14(18-12)21-7-13(19)20/h3-6H,7H2,1-2H3,(H,19,20)(H,16,17,18) +- http://localhost/compound/InChI=1S/C2H5ClO/c1-4-2-3/h2H2,1H3 +- http://localhost/compound/InChI=1S/C4H5Cl/c1-3-4(2)5/h3H,1-2H2 +- http://localhost/compound/InChI=1S/C17H17ClO3/c1-17(2,16(19)20)21-11-12-3-5-13(6-4-12)14-7-9-15(18)10-8-14/h3-10H,11H2,1-2H3,(H,19,20) +- http://localhost/compound/InChI=1S/C9H6O2/c10-9-6-5-7-3-1-2-4-8(7)11-9/h1-6H +- http://localhost/compound/InChI=1S/C14H8Cl4/c15-11-5-1-9(2-6-11)13(14(17)18)10-3-7-12(16)8-4-10/h1-8H +- http://localhost/compound/InChI=1S/C14H9Cl5/c15-11-5-1-9(2-6-11)13(14(17,18)19)10-3-7-12(16)8-4-10/h1-8,13H +- http://localhost/compound/InChI=1S/C6H10N2O/c1-3-5-8(7-9)6-4-2/h3-4H,1-2,5-6H2 +- http://localhost/compound/InChI=1S/C12H8Cl6O/c13-8-9(14)11(16)5-3-1-2(6-7(3)19-6)4(5)10(8,15)12(11,17)18/h2-7H,1H2 +- http://localhost/compound/InChI=1S/C3H6ClNO/c1-5(2)3(4)6/h1-2H3 +- http://localhost/compound/InChI=1S/C2H8N2/c1-4(2)3/h3H2,1-2H3 +- http://localhost/compound/InChI=1S/C2H8N2.2ClH/c1-3-4-2;;/h3-4H,1-2H3;2*1H +- http://localhost/compound/InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3 +- http://localhost/compound/InChI=1S/C5H11N3O3/c1-2-8(7-11)5(10)6-3-4-9/h9H,2-4H2,1H3,(H,6,10) +- http://localhost/compound/InChI=1S/C6H11N3O3/c1-3-9(8-12)6(11)7-4-5(2)10/h3-4H2,1-2H3,(H,7,11) +- http://localhost/compound/InChI=1S/CH2O/c1-2/h1H2 +- http://localhost/compound/InChI=1S/C8H6N4O4S/c13-4-9-11-8-10-5(3-17-8)6-1-2-7(16-6)12(14)15/h1-4H,(H,9,13)(H,10,11) +- http://localhost/compound/InChI=1S/C5H4O2/c6-4-5-2-1-3-7-5/h1-4H +- http://localhost/compound/InChI=1S/C3H6O2/c4-1-3-2-5-3/h3-4H,1-2H2 +- http://localhost/compound/InChI=1S/C17H17ClO6/c1-8-5-9(19)6-12(23-4)17(8)16(20)13-10(21-2)7-11(22-3)14(18)15(13)24-17/h6-8H,5H2,1-4H3/t8-,17?/m1/s1 +- http://localhost/compound/InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9 +- http://localhost/compound/InChI=1S/H4N2/c1-2/h1-2H2 +- http://localhost/compound/InChI=1S/H4N2.H2O4S/c1-2;1-5(2,3)4/h1-2H2;(H2,1,2,3,4) +- http://localhost/compound/InChI=1S/C15H13NO2/c1-10(17)16(18)13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9,18H,8H2,1H3 +- http://localhost/compound/InChI=1S/C2H8N2O/c3-4-1-2-5/h4-5H,1-3H2 +- http://localhost/compound/InChI=1S/C6H7N3O/c7-9-6(10)5-1-3-8-4-2-5/h1-4H,7H2,(H,9,10) +- http://localhost/compound/InChI=1S/C6H5NO2/c8-6(9)5-1-3-7-4-2-5/h1-4H,(H,8,9) +- http://localhost/compound/InChI=1S/C10H12ClNO2/c1-7(2)14-10(13)12-9-5-3-4-8(11)6-9/h3-7H,1-2H3,(H,12,13) +- http://localhost/compound/InChI=1S/C10H13NO2/c1-8(2)13-10(12)11-9-6-4-3-5-7-9/h3-8H,1-2H3,(H,11,12) +- http://localhost/compound/InChI=1S/2C2H4O2.4H2O.3Pb/c2*1-2(3)4;;;;;;;/h2*1H3,(H,3,4);4*1H2;;;/q;;;;;;3*+2/p-6 +- http://localhost/compound/InChI=1S/C14H19N3S.ClH/c1-16(2)9-10-17(12-13-6-5-11-18-13)14-7-3-4-8-15-14;/h3-8,11H,9-10,12H2,1-2H3;1H +- http://localhost/compound/InChI=1S/C20H22N8O5/c1-28(9-11-8-23-17-15(24-11)16(21)26-20(22)27-17)12-4-2-10(3-5-12)18(31)25-13(19(32)33)6-7-14(29)30/h2-5,8,13H,6-7,9H2,1H3,(H,25,31)(H,29,30)(H,32,33)(H4,21,22,23,26,27)/t13-/m0/s1 +- http://localhost/compound/InChI=1S/C2H6N2O/c1-4(3)2-5/h2H,3H2,1H3 +- http://localhost/compound/InChI=1S/C5H8O2/c1-4(2)5(6)7-3/h1H2,2-3H3 +- http://localhost/compound/InChI=1S/CH6N2/c1-3-2/h3H,2H2,1H3 +- http://localhost/compound/InChI=1S/C10H13N3O2/c1-13(12-15)7-3-5-10(14)9-4-2-6-11-8-9/h2,4,6,8H,3,5,7H2,1H3 +- http://localhost/compound/InChI=1S/C5H6N2OS/c1-3-2-4(8)7-5(9)6-3/h2H,1H3,(H2,6,7,8,9) +- http://localhost/compound/InChI=1S/C20H22O3/c1-20(2,19(21)22)23-16-12-10-15(11-13-16)18-9-5-7-14-6-3-4-8-17(14)18/h3-4,6,8,10-13,18H,5,7,9H2,1-2H3,(H,21,22) +- http://localhost/compound/InChI=1S/HNO2.Na/c2-1-3;/h(H,2,3);/q;+1/p-1 +- http://localhost/compound/InChI=1S/C9H7N3O4S/c1-5(13)10-9-11-6(4-17-9)7-2-3-8(16-7)12(14)15/h2-4H,1H3,(H,10,11,13) +- http://localhost/compound/InChI=1S/C8H5N3O4S/c12-4-9-8-10-5(3-16-8)6-1-2-7(15-6)11(13)14/h1-4H,(H,9,10,12) +- http://localhost/compound/InChI=1S/C12H9NO2/c14-13(15)11-7-6-9-5-4-8-2-1-3-10(11)12(8)9/h1-3,6-7H,4-5H2 +- http://localhost/compound/InChI=1S/C6H14N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h5-6,9-11H,2-4H2,1H3 +- http://localhost/compound/InChI=1S/C6H12N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h6,9,11H,2-4H2,1H3 +- http://localhost/compound/InChI=1S/C5H12N2O4/c8-2-1-7(6-11)3-5(10)4-9/h5,8-10H,1-4H2 +- http://localhost/compound/InChI=1S/C5H10N2O3/c1-5(9)4-7(6-10)2-3-8/h8H,2-4H2,1H3 +- http://localhost/compound/InChI=1S/C7H15N3O/c1-6-4-10(8-11)5-7(2)9(6)3/h6-7H,4-5H2,1-3H3 +- http://localhost/compound/InChI=1S/C6H10N2O2/c1-3-4-8(7-10)5-6(2)9/h3H,1,4-5H2,2H3 +- http://localhost/compound/InChI=1S/C4H10N2O3/c1-6(5-9)2-4(8)3-7/h4,7-8H,2-3H2,1H3 +- http://localhost/compound/InChI=1S/C4H8N2O2/c7-5-6-1-3-8-4-2-6/h1-4H2 +- http://localhost/compound/InChI=1S/C9H11N3O/c13-11-12-6-2-4-9(12)8-3-1-5-10-7-8/h1,3,5,7,9H,2,4,6H2 +- http://localhost/compound/InChI=1S/C9H11N3O2/c13-10-12-6-2-4-9(12)8-3-1-5-11(14)7-8/h1,3,5,7,9H,2,4,6H2 +- http://localhost/compound/InChI=1S/C5H10N2O/c8-6-7-4-2-1-3-5-7/h1-5H2 +- http://localhost/compound/InChI=1S/C4H8N2O/c7-5-6-3-1-2-4-6/h1-4H2 +- http://localhost/compound/InChI=1S/C6H10ClN3O3/c1-5(11)4-10(9-13)6(12)8-3-2-7/h2-4H2,1H3,(H,8,12) +- http://localhost/compound/InChI=1S/C4H7N3O3/c1-3(8)2-7(6-10)4(5)9/h2H2,1H3,(H2,5,9) +- http://localhost/compound/InChI=1S/C9H9NS/c11-8-10-7-6-9-4-2-1-3-5-9/h1-5H,6-7H2 +- http://localhost/compound/InChI=1S/C12H12N2O3/c1-2-12(8-6-4-3-5-7-8)9(15)13-11(17)14-10(12)16/h3-7H,2H2,1H3,(H2,13,14,15,16,17) +- http://localhost/compound/InChI=1S/C16H13N/c1-2-8-15(9-3-1)17-16-11-10-13-6-4-5-7-14(13)12-16/h1-12,17H +- http://localhost/compound/InChI=1S/C19H24N2O2/c22-18-13-20(19(23)15-7-2-1-3-8-15)12-17-16-9-5-4-6-14(16)10-11-21(17)18/h4-6,9,15,17H,1-3,7-8,10-13H2 +- http://localhost/compound/InChI=1S/C7H6O4/c8-5-2-1-4(7(10)11)3-6(5)9/h1-3,8-9H,(H,10,11) +- http://localhost/compound/InChI=1S/C15H10O7.2H2O/c16-7-4-10(19)12-11(5-7)22-15(14(21)13(12)20)6-1-2-8(17)9(18)3-6;;/h1-5,16-19,21H;2*1H2 +- http://localhost/compound/InChI=1S/C20H19N3.ClH/c1-13-12-16(6-11-19(13)23)20(14-2-7-17(21)8-3-14)15-4-9-18(22)10-5-15;/h2-12,21H,22-23H2,1H3;1H +- http://localhost/compound/InChI=1S/C19H17N3.ClH/c20-16-7-1-13(2-8-16)19(14-3-9-17(21)10-4-14)15-5-11-18(22)12-6-15;/h1-12,20H,21-22H2;1H +- http://localhost/compound/InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27?/m0/s1 +- http://localhost/compound/InChI=1S/C2HCl3/c3-1-2(4)5/h1H +- http://localhost/compound/InChI=1S/C3H7NO2/c1-2-6-3(4)5/h2H2,1H3,(H2,4,5) +- http://localhost/compound/InChI=1S/C2H3Cl/c1-2-3/h2H,1H2 +- http://localhost/compound/InChI=1S/C6H5N2.BF4/c7-8-6-4-2-1-3-5-6;2-1(3,4)5/h1-5H;/q+1;-1 +- http://localhost/compound/InChI=1S/C6H12N4O2/c1-5-3-9(7-11)4-6(2)10(5)8-12/h5-6H,3-4H2,1-2H3 +- http://localhost/compound/InChI=1S/C5H13N3O/c1-7(2)4-5-8(3)6-9/h4-5H2,1-3H3 +- http://localhost/compound/InChI=1S/C6H12N2O2/c1-5-3-8(7-9)4-6(2)10-5/h5-6H,3-4H2,1-2H3 +- http://localhost/compound/InChI=1S/C4H6N2O3/c1-3-2-6(5-8)4(7)9-3/h3H,2H2,1H3 +- http://localhost/compound/InChI=1S/C4H8N2O3/c1-3-9-4(7)6(2)5-8/h3H2,1-2H3 +- http://localhost/compound/InChI=1S/C3H6N2O2/c6-4-5-1-2-7-3-5/h1-3H2 +- http://localhost/compound/InChI=1S/C9H11N3O2/c10-9(13)12(11-14)7-6-8-4-2-1-3-5-8/h1-5H,6-7H2,(H2,10,13) +- http://localhost/compound/InChI=1S/C3H6N2O/c6-4-5-2-1-3-5/h1-3H2 +- http://localhost/compound/InChI=1S/BF4.Na/c2-1(3,4)5;/q-1;+1 +data_entries: + http://localhost/compound/InChI=1S/C14H8Cl4/c15-11-5-1-9(2-6-11)13(14(17)18)10-3-7-12(16)8-4-10/h1-8H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C3H6ClNO/c1-5(2)3(4)6/h1-2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C2H8N2O/c3-4-1-2-5/h4-5H,1-3H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C4H10N2O3/c1-6(5-9)2-4(8)3-7/h4,7-8H,2-3H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/CH2O/c1-2/h1H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C5H12N2O4/c8-2-1-7(6-11)3-5(10)4-9/h5,8-10H,1-4H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C7H15N3O/c1-6-4-10(8-11)5-7(2)9(6)3/h6-7H,4-5H2,1-3H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C4H8N2O2/c7-5-6-1-3-8-4-2-6/h1-4H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C16H13N/c1-2-8-15(9-3-1)17-16-11-10-13-6-4-5-7-14(13)12-16/h1-12,17H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C3H6O2/c4-1-3-2-5-3/h3-4H,1-2H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C4H6N2O3/c1-3-2-6(5-8)4(7)9-3/h3H,2H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H5NO2/c8-6(9)5-1-3-7-4-2-5/h1-4H,(H,8,9): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/2C2H4O2.4H2O.3Pb/c2*1-2(3)4;;;;;;;/h2*1H3,(H,3,4);4*1H2;;;/q;;;;;;3*+2/p-6: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C17H17ClO6/c1-8-5-9(19)6-12(23-4)17(8)16(20)13-10(21-2)7-11(22-3)14(18)15(13)24-17/h6-8H,5H2,1-4H3/t8-,17?/m1/s1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C3H6N2O2/c6-4-5-1-2-7-3-5/h1-3H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C3H7NO2/c1-2-6-3(4)5/h2H2,1H3,(H2,4,5): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C5H8O2/c1-4(2)5(6)7-3/h1H2,2-3H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C2H6N2O/c1-4(3)2-5/h2H,3H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H12N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h6,9,11H,2-4H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C5H4O2/c6-4-5-2-1-3-7-5/h1-4H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C4H8N2O/c7-5-6-3-1-2-4-6/h1-4H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C9H11N3O2/c10-9(13)12(11-14)7-6-8-4-2-1-3-5-8/h1-5H,6-7H2,(H2,10,13): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C14H14ClN3O2S/c1-8-4-3-5-10(9(8)2)16-12-6-11(15)17-14(18-12)21-7-13(19)20/h3-6H,7H2,1-2H3,(H,19,20)(H,16,17,18): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/H4N2.H2O4S/c1-2;1-5(2,3)4/h1-2H2;(H2,1,2,3,4): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C5H10N2O/c8-6-7-4-2-1-3-5-7/h1-5H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C10H13N3O2/c1-13(12-15)7-3-5-10(14)9-4-2-6-11-8-9/h2,4,6,8H,3,5,7H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C3H6N2O/c6-4-5-2-1-3-5/h1-3H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C4H8N2O3/c1-3-9-4(7)6(2)5-8/h3H2,1-2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H10N2O2/c1-3-4-8(7-10)5-6(2)9/h3H,1,4-5H2,2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C14H9Cl5/c15-11-5-1-9(2-6-11)13(14(17,18)19)10-3-7-12(16)8-4-10/h1-8,13H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/BrHO3.K/c2-1(3)4;/h(H,2,3,4);/q;+1/p-1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C2H5ClO/c1-4-2-3/h2H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C10H12ClNO2/c1-7(2)14-10(13)12-9-5-3-4-8(11)6-9/h3-7H,1-2H3,(H,12,13): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C8H5N3O4S/c12-4-9-8-10-5(3-16-8)6-1-2-7(15-6)11(13)14/h1-4H,(H,9,10,12): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/Cd.2ClH/h;2*1H/q+2;;/p-2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C20H19N3.ClH/c1-13-12-16(6-11-19(13)23)20(14-2-7-17(21)8-3-14)15-4-9-18(22)10-5-15;/h2-12,21H,22-23H2,1H3;1H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/BF4.Na/c2-1(3,4)5;/q-1;+1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C6H5N2.BF4/c7-8-6-4-2-1-3-5-6;2-1(3,4)5/h1-5H;/q+1;-1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C9H6O2/c10-9-6-5-7-3-1-2-4-8(7)11-9/h1-6H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C2HCl3/c3-1-2(4)5/h1H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C2H8N2/c1-4(2)3/h3H2,1-2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H7N3O/c7-9-6(10)5-1-3-8-4-2-5/h1-4H,7H2,(H,9,10): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C12H8Cl6O/c13-8-9(14)11(16)5-3-1-2(6-7(3)19-6)4(5)10(8,15)12(11,17)18/h2-7H,1H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/Cd.H2O4S/c;1-5(2,3)4/h;(H2,1,2,3,4)/q+2;/p-2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C5H10N2O3/c1-5(9)4-7(6-10)2-3-8/h8H,2-4H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27?/m0/s1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C12H12N2O3/c1-2-12(8-6-4-3-5-7-8)9(15)13-11(17)14-10(12)16/h3-7H,2H2,1H3,(H2,13,14,15,16,17): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C8H6N4O4S/c13-4-9-11-8-10-5(3-17-8)6-1-2-7(16-6)12(14)15/h1-4H,(H,9,13)(H,10,11): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C9H7N3O4S/c1-5(13)10-9-11-6(4-17-9)7-2-3-8(16-7)12(14)15/h2-4H,1H3,(H,10,11,13): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/CH6N2/c1-3-2/h3H,2H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C12H9NO2/c14-13(15)11-7-6-9-5-4-8-2-1-3-10(11)12(8)9/h1-3,6-7H,4-5H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C15H10O7.2H2O/c16-7-4-10(19)12-11(5-7)22-15(14(21)13(12)20)6-1-2-8(17)9(18)3-6;;/h1-5,16-19,21H;2*1H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C7H6O4/c8-5-2-1-4(7(10)11)3-6(5)9/h1-3,8-9H,(H,10,11): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C9H9NS/c11-8-10-7-6-9-4-2-1-3-5-9/h1-5H,6-7H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C20H22O3/c1-20(2,19(21)22)23-16-12-10-15(11-13-16)18-9-5-7-14-6-3-4-8-17(14)18/h3-4,6,8,10-13,18H,5,7,9H2,1-2H3,(H,21,22): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C6H12N2O2/c1-5-3-8(7-9)4-6(2)10-5/h5-6H,3-4H2,1-2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C10H13NO2/c1-8(2)13-10(12)11-9-6-4-3-5-7-9/h3-8H,1-2H3,(H,11,12): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C6H14N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h5-6,9-11H,2-4H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C19H24N2O2/c22-18-13-20(19(23)15-7-2-1-3-8-15)12-17-16-9-5-4-6-14(16)10-11-21(17)18/h4-6,9,15,17H,1-3,7-8,10-13H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C5H11N3O3/c1-2-8(7-11)5(10)6-3-4-9/h9H,2-4H2,1H3,(H,6,10): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C14H19N3S.ClH/c1-16(2)9-10-17(12-13-6-5-11-18-13)14-7-3-4-8-15-14;/h3-8,11H,9-10,12H2,1-2H3;1H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/H4N2/c1-2/h1-2H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C4H5Cl/c1-3-4(2)5/h3H,1-2H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C17H17ClO3/c1-17(2,16(19)20)21-11-12-3-5-13(6-4-12)14-7-9-15(18)10-8-14/h3-10H,11H2,1-2H3,(H,19,20): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C2H8N2.2ClH/c1-3-4-2;;/h3-4H,1-2H3;2*1H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H10ClN3O3/c1-5(11)4-10(9-13)6(12)8-3-2-7/h2-4H2,1H3,(H,8,12): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H11N3O3/c1-3-9(8-12)6(11)7-4-5(2)10/h3-4H2,1-2H3,(H,7,11): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C5H13N3O/c1-7(2)4-5-8(3)6-9/h4-5H2,1-3H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C5H6N2OS/c1-3-2-4(8)7-5(9)6-3/h2H,1H3,(H2,6,7,8,9): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C9H11N3O/c13-11-12-6-2-4-9(12)8-3-1-5-10-7-8/h1,3,5,7,9H,2,4,6H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H12N4O2/c1-5-3-9(7-11)4-6(2)10(5)8-12/h5-6H,3-4H2,1-2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C19H17N3.ClH/c20-16-7-1-13(2-8-16)19(14-3-9-17(21)10-4-14)15-5-11-18(22)12-6-15;/h1-12,20H,21-22H2;1H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/HNO2.Na/c2-1-3;/h(H,2,3);/q;+1/p-1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C2H3Cl/c1-2-3/h2H,1H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H10N2O/c1-3-5-8(7-9)6-4-2/h3-4H,1-2,5-6H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C9H11N3O2/c13-10-12-6-2-4-9(12)8-3-1-5-11(14)7-8/h1,3,5,7,9H,2,4,6H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C15H13NO2/c1-10(17)16(18)13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9,18H,8H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C20H22N8O5/c1-28(9-11-8-23-17-15(24-11)16(21)26-20(22)27-17)12-4-2-10(3-5-12)18(31)25-13(19(32)33)6-7-14(29)30/h2-5,8,13H,6-7,9H2,1H3,(H,25,31)(H,29,30)(H,32,33)(H4,21,22,23,26,27)/t13-/m0/s1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C4H7N3O3/c1-3(8)2-7(6-10)4(5)9/h2H2,1H3,(H2,5,9): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C2H4O/c1-2-3/h2H,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true +features: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + http://www.opentox.org/api/1.1#hasSource: hamster_carcinogenicity.csv + http://purl.org/dc/elements/1.1/title: hamster_carcinogenicity +metadata: + http://www.opentox.org/api/1.1#hasSource: hamster_carcinogenicity.csv + http://purl.org/dc/elements/1.1/title: hamster_carcinogenicity + http://www.w3.org/2001/XMLSchema#anyUri: http://localhost/dataset/1 +uri: http://localhost/dataset/1 diff --git a/test/data/hamster_carcinogenicity_with_errors.csv b/test/data/hamster_carcinogenicity_with_errors.csv new file mode 100644 index 0000000..e4f97e5 --- /dev/null +++ b/test/data/hamster_carcinogenicity_with_errors.csv @@ -0,0 +1,88 @@ +SMILES,Hamster Carcinogenicity +CC=O,1 +CC=O,1 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,1 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,1 +C1(N#C#N#N=1)N,0 +Br(=O)(=O)[O-].[K+],1 +[Cl-].[Cd+2].[Cl-],0 +O=S(=O)([O-])[O-].[Cd+2],0 +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,0 +ClCOC,1 +C=C(Cl)C=C,0 +Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,0 +O=C1OC2=C(C=CC=C2)C=C1,0 +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,1 +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,0 +C=CCN(CC=C)N=O,1 +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45, +O=C(N(C)C)Cl,1 +CN(C)N,1 +N(NC)C.[H]Cl.[H]Cl,1 +CCO,0 +O=C(N(CC)N=O)NCCO,1 +O=C(N(CC)N=O)NCC(=O)C,1 +C#O,0 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O, +O=CC1=CC=CO1,0 +OCC1CO1,1 +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,0 +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,1 +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,1 +NN,1 +OS(=O)(=O)O.NN,1 +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,1 +OccNN,0 +O=C(C1=CC=NC=C1)NN,0 +OC(=O)C1=CC=NC=C1,0 +O=C(NC1=CC=CC(=C1)Cl)OC(C)C,0 +O=C(NC1=CC=CC=C1)OC(C)C,0 +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],0 +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,0 +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,0 +CN(N)C=O,TRUE +O=C(C(=C)C)OC,0 +CNN,1 +O=C(C1=CC=CN=C1)CCCN(N=O)C,NA +CC1=CC(=O)NC(=S)N1,1 +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,0 +O=N[O-].[Na+],0 +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,1 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,1 +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],0 +stupid error,1 +N(CC(CO)O)(CC(C)=O)N=O,1 +N(CC(CO)O)(CCO)N=O,0 +O=C(C)CN(N=O)CCO,1 +C1C(N(C(CN1N=O)C)C)C,1 +N(CC(C)=O)(CC=C)N=O,1 +N(CC(CO)O)(C)N=O,1 +O=NN1CCOCC1,1 +N1C=CC=C(C=1)C2N(N=O)CCC2,1 +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,0 +O=NN1CCCCC1,1 +O=NN1CCCC1,1 +O=C(N(CC(C)=O)N=O)NCCCl,1 +N(C(=O)N)(N=O)CC(C)=O,1 +C1(CCN=C=S)=CC=CC=C1,0 +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,0 +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,0 +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,0 +C1(=CC(=C(O)C=C1)O)C(O)=O,0 +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,0 +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,0 +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,0 +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,0 +ClC(=CCl)Cl,0 +NC(=O)OCC,1 +C=CCl,1 +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,0 +C1(CN(CC(N1N=O)C)N=O)C,1 +N(CCN(C)C)(C)N=O,1 +C1(CN(N=O)CC(O1)C)C,1 +O1C(N(CC1C)N=O)=O,1 +CCOC(=O)N(C)N=O,1 +C1N(COC1)N=O,1 +O=C(N(CCC1=CC=CC=C1)N=O)N,1 +O=NN1CCC1,1 +F[B-](F)(F)F.[Na+],0 diff --git a/test/data/kazius.csv b/test/data/kazius.csv new file mode 100644 index 0000000..9dc3a74 --- /dev/null +++ b/test/data/kazius.csv @@ -0,0 +1,4069 @@ +COC1=CC=C(C=C1)C2=NC(=C([NH]2)C3=CC=CC=C3)C4=CC=CC=C4,1 +CC1=C(C=CC=C1N=C=O)N=C=O,1 +OCCC1=C[N](N=O)C2=CC=CC=C12,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)Br,1 +CN(N=O)C1=CC=CC=C1,1 +CN2C1=C(C=CC=C1)C(=O)C3=C2C4=C(C=C3O)OC(C4)C5(C)CO5,1 +CS(=O)(=O)NC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +[O-][N+](=O)C1=CC=C(C=C1)OC2=C(C=C(C=C2)Cl)Cl,1 +OC1=C(C=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +C[N]2C(=NC3=C1N=CC=NC1=C(C)C(=C23)C)N,1 +CSC1=C(C(=C(C(=C1)SC)N)C)N,1 +OC1=CC4=C(C=C1)C3=CC2=CC=CC=C2C=C3C5=CC=CC=C45,1 +CC(=O)C(Br)=C,1 +NCCNCCNCCN,1 +CN(C)C1=CC=C(C=C1)CCO,1 +COC4=CC(=O)C3=C2[NH]C1=CC=NC=C1C2=CN=C3C4=O,1 +N1C3C1C2=CSC=C2C4=CSC=C34,1 +CC1=C(C=C(C(=C1)N=NC2=CC=CC=C2)N)N,1 +NC3=CC2=NC1=CC(=CC=C1C=C2C=C3)N,1 +[O-][N+](=O)C3=C1CCC2=CC=CC(=C12)C=C3,1 +NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +COC(=O)C1(OC1(C)C(O)C(C)C)C(N)=O,1 +CC(I)C1OCC(CO)O1,1 +CN(C)CCNC(=O)C3=C2N=C1C=CC=CC1=NC2=CC=C3,1 +CC1=C(C=C(C=C1)N)C,1 +CC1=C3C(=CC=N1)C2=CC=CC=C2[NH]3,1 +OC1CN(CCO1)N=O,1 +[O-][N+](=O)C1=C(C=CC=C1)C(Cl)=O,1 +ClCCOP(OCCCl)OCCCl,1 +COC(=O)NC2=NC1=CC=CC=C1[NH]2,1 +CCOC(=O)N(CCCC(=O)C1=CN=CC=C1)N=O,1 +C1CSCCS1,1 +NC1=CC=C(C=C1)C2=CC=C(C=C2)Cl,1 +NNC2=C1C=CC=CC1=C(N=N2)NN,1 +C[N]3C(=NC4=CC=C2C=CC1=CC=C(O)C=C1C2=C34)C,1 +CC(=O)OC1=CC=C(C=C1)CCl,1 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +COC1=C(C=CC=C1)[N+]([O-])=O,1 +C1=CC2=C(C=C1)C4=C(C=C2)C3=NC=CC=C3C=C4,1 +OC2=C3C=CC4=CC=C(C5=C1C=CC=CC1=C(C=C2)C3=C45)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC(=C(C(=C1)[N+]([O-])=O)Cl)[N+]([O-])=O,1 +[O-][N+](=O)C1=C3C(=CC=C1)C2=CC=CC=C2C(O3)=O,1 +CC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)CO,1 +CC3=C2C=CC1=CC=CC=C1C2=CC4=CC=CC=C34,1 +CC1=CC=C(C=C1)S(=O)(=O)OCC2=CC=C(C=C2)[N+]([O-])=O,1 +CN1CCN(CC1)C5=CC(=O)C2=C(C4=C(C(=N2)C)C3=CC=CC=C3[NH]4)C5=O,1 +CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)O,1 +CC2C1=C(C=CC(=C1)F)C3=C2C=C(C=C3)F,1 +O=NC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +OC3C1OC1C2=C4C(=C(C=C2)O)C7=C5C(=C34)C(=CC=C5C6OC6C7=O)O,1 +OC(=O)C1=CC(=C(C=C1)Cl)[N+]([O-])=O,1 +N(C1=CC=CC=C1)C2=CC=C(C=C2)NC3=CC=CC=C3,1 +C[N+]3=C2C=CC1OC1C2=CC=C3,1 +COC1=C(C=C(C=C1)N)N,1 +CC(=O)NC1=CC=C(C=C1)C(=O)C2OC2C3=CC=CC=C3,1 +C[N]1C(=NC2=C1C=C(C)C3=NC(=CN=C23)C4=CC=CC=C4)N,1 +[O-][N+]([O-])=C1CCCC1,1 +COC2=C1OC(=CC1=C(C=C2)N(CCCl)CCCl)[N+]([O-])=O,1 +COC3=C(C=C2N=C1C=C(C(=CC1=NC2=C3)N)OC)N,1 +C[N]2C(=NC3=NC1=CC=CC=C1C=C23)N,1 +OC5C(O)C4=C(C3=NC2=C1C=CC=CC1=CC=C2C=C3C=C4)C6OC56,1 +NC3=C2C=C1C=CC=CC1=NC2=CC=C3,1 +[O-][N+](=O)C1=CC4=C2C(=C1)CCC3=C2C(=CC(=C3)[N+]([O-])=O)CC4,1 +[O-][N+](=O)C3=CC2=NC1=CC=CC=C1N=C2C=C3,1 +CCOP(=O)(OC1=CC=C(C=C1)[N+]([O-])=O)C2=CC=CC=C2,1 +[O-][N+](=O)C3=C2C=CC1=CC=CC4=C1C2=C(C=C3)C(=O)C4=O,1 +CC(C)S(Cl)(=O)=O,1 +CC3=C2C1=CC=CC=C1[NH]C2=CC(=N3)N,1 +ClCC(Cl)CBr,1 +CC2=C(N=C1C(=C(C=CC1=N2)N)C)C,1 +CC1=CC4=C(C=C1)C5=C2C=CC=CC2=CC6=C3C=CC=CC3=CC4=C56,1 +NC1=CC(=CC=C1)[N+]([O-])=O,1 +[O-][N+](=O)C2=C1SN=C(C1=CC=C2)Cl,1 +[O-][N+](=O)C4=C2C=CC=C3C1=CC=CC=C1C(=C23)C(=C4)[N+]([O-])=O,1 +[O-][N+](=O)C1=C(C=CC=C1)SSC(Cl)=C(Cl)Cl,1 +CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)Cl)[N+]([O-])=O,1 +COC4=CC(=O)C3=C2[NH]C1=C(CCCC1)C2=C(C)N=C3C4=O,1 +CC=CC=O,1 +C[N+]2=C1C=CC(=CC1=CC3=CC=CC=C23)N,1 +CC(=O)ON(C(C)=O)C1=CC=C(C=C1)SC2=CC=CC=C2,1 +CC1C=C(C=O)C(=CC2(O)CC(C)(C)CC12)C=O,1 +C1=CC2=C(C=C1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 +ClC2=C1C=CC=CC1=CC=C2,1 +C2C1=C(C=CC=C1)C3=C2C4=C(C=C3)C=CC5=C4C=CC=C5,1 +CC1=C(C=CC(=C1)N)N,1 +COC1=CC(=C(C=C1)OC)N=NC3=C2C=CC=CC2=CC=C3O,1 +CN(C)C1=CC=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3,1 +COP(=O)(OC)OC,1 +ClC(Cl)C#N,1 +[O-][N+](=O)C1=CC2=C(C=C1)NCC2,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)F,1 +C[N]1C(=NC=C1[N+]([O-])=O)C2NC(CO)(CO)CO2,1 +COC1=C(C=CC(=C1)O)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +COC(=O)C1=C(C=CC=C1)O,1 +O1C4C1C2=C(C=CC3=CC=CC=C23)C5=C4C=CC=C5,1 +CC1=CC(=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +O=C5C=C3C2=C(C=C1C=CC=CC1=C2)C4=C3C(=CC=C4)C5=O,1 +[O-][N+](=O)C1=CC=C(O1)C=CC=NN2CC(=O)NC2=O,1 +C[N]1C(=NC2=NC=C(C=C12)C3=CC=CC=C3)N,1 +BrC(=C)C=O,1 +CC(=O)NC(CSC(Cl)=C(Cl)C(Cl)=C(Cl)Cl)C(O)=O,1 +[O-][N+](=O)C2=C1C(=CC=CC1=CC=C2)[N+]([O-])=O,1 +COC4=C1C5=C(C(OC1=C3C2C=COC2OC3=C4)=O)C(CC5)O,1 +CC(=C)C2=CC=C(C)C1=CC=C(C=O)C1=C2,1 +CC1=CC=C[N]2C1=NC3=CC=C(N)N=C23,1 +C1=CC2=C(C=C1)C3=CN=C4C=CC=C5C=CC(=C2)C3=C45,1 +COC(=O)C(=CC1=CC=C(O1)[N+]([O-])=O)[N+]([O-])=O,1 +ClCC4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 +[O-][N+](=O)C1=CC(=C(C=C1)Cl)[N+]([O-])=O,1 +COC(=O)C(=CC1=CC=C(O1)[N+]([O-])=O)C#N,1 +C(N1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4)C5=CC=CC=C5,1 +OC1C(O)C5=C4C2=C1C=CC=C2C3=CC=CC=C3C4=C(C=C5)[N+]([O-])=O,1 +CN(C)C1=CC=C(C=C1)C=CC2=CC(C=C(C)O2)=C(C#N)C#N,1 +CCCCOCC1CO1,1 +OC(=O)C=CC1=CC(=CC=C1)[N+]([O-])=O,1 +NC(O)=NO,1 +FCC1CO1,1 +ClC(C(=O)NCC1=CC=CC=C1)C2=CC=CC=C2,1 +CC1(C)CC(O)CC(C)(C)N1O,1 +CC(=O)NC1=CC=C(C=C1)SC2=CC=CC=C2,1 +OC1=C(C=CC=C1)NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +CCC(=O)N(O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +O=CC1CC(=O)C(=O)CO1,1 +C(COCC1CO1)OCC2CO2,1 +C1CN1,1 +OCC(CBr)(CBr)CBr,1 +CCCCCCCCCCCCCCCCCC(=O)OCC1=CC=C2C(=CCC(C=C12)C(C)=C)C,1 +OC(=O)C1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +ONC1=CC=C(C=C1)SC2=CC=CC=C2,1 +CC1=CC=C[N]2C1=NC3=CC=C(NO)N=C23,1 +ClC1=NC=CC=C1,1 +FC2=CC1=NC=CC=C1C=C2,1 +CN(C)CCNC(=O)C2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3)=O,1 +NC1=CC=C(C=C1)N,1 +[O-][N+](=O)C3=CC2=C(C=C1C=CC=CC1=C2C=C3)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC4=C3C(=C1[N+]([O-])=O)C2=CC=CC=C2C3=CC=C4,1 +[O-][N+](=O)C1=CC=C(C=C1)C=C,1 +CN(CS(O)(=O)=O)C1=C(C)N(C)N(C1=O)C2=CC=CC=C2,1 +N1C5C1C3=C(C2=CC=CC=C2C4=CC=CC=C34)C6=C5C=CC=C6,1 +NC(=O)C(=CC1=CC=C(O1)[N+]([O-])=O)C2=CC=CO2,1 +NC2=CC=C1SN=C(Cl)C1=C2,1 +ClC1OC1CBr,1 +OC2=C1C=CC=NC1=CC=C2,1 +NC3=CC2=NC1=CC=CC(=C1N=C2C=C3)N,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)Br,1 +C1=CN=C(C=C1)C2=CC=NC=C2,1 +CC(C)C1CCC(C)CC1=O,1 +CCOS(C)(=O)=O,1 +O=NN1CCOCC1,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)C#N,1 +CCCC=CCC=O,1 +NNC(=O)CNC(=O)C=[N+]=[N-],1 +C=CCCCCC1CO1,1 +CC(=O)NC1=CC(=CC=C1)N,1 +CC1=C(C=CC=C1N)N,1 +OC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +CC1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 +[O-][N+](=O)C1=C(C=CC(=C1)N=[N+]=[N-])F,1 +COC4=CC(=O)C3=C2[NH]C1=CC=NC=C1C2=C(C)N=C3C4=O,1 +CCC=CC=CC=CC=CC=COCC(O)CO,1 +CNC(=O)ON(C(C)=O)C(=O)NC,1 +[O-][N+](=O)C1=CC(=C(C=C1)I)[N+]([O-])=O,1 +CC4=C2C=C1C=CC=CC1=CC2=C3C=CC=CC3=C4,1 +C1OC1C2=CC=CC=C2,1 +[O-][N+](=O)C1=CC(=CC(=C1)CCl)[N+]([O-])=O,1 +CC(=O)OCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +ClCC=CCl,1 +COC1=CC=C(C=C1)N=O,1 +NC1=C(C=CC=C1)C2=CC=CC=C2,1 +CNC3CC2=C1C(=CC=CC1=CC=C2)C3,1 +CC(=O)OCC1=COC=C2C(=CC=[C]12)C=O,1 +OCC[N]1C(=NC=C1[N+]([O-])=O)CO,1 +CCN1C=C(C(O)=O)C(=O)C3=C1C=C2OCOC2=C3,1 +CC3=C2[NH]C1=CC=CC=C1C2=C(C)C4=CN=CC=C34,1 +O=C2NC1(CCCCC1)C(=O)N2CCN3CC3,1 +NC1=CC3=C(C=C1)C2=CC=C(C=C2C3)N,1 +CCN(N)C1=CC=CC=C1,1 +CC(=O)NC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,1 +CCC[N]3C=C2CC1C(C=C(C)CN1C)C4=C2C3=CC=C4,1 +C[N]1C=CN=C1N=O,1 +[O-][N+](=O)C2=C1[NH]N=CC1=CC=C2,1 +ClCC2=C4C1=CC=CC=C1C=C5C=CC3=CC=CC(=C2)C3=C45,1 +NC1=C(C=CC=C1)SCCSC2=C(C=CC=C2)N,1 +C1=CC4=C(C=C1)C3=CC2=CC=CC5=C2C(=C3C=C4)C=C5,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC4=C(C=C2CC3)CCCC4,1 +[O-][N+](=O)C2=C1N=CC=CC1=CC=C2,1 +S=C1NCCN1,1 +C2=CC1=CC3=C(C=C1C=C2)C5=C4C(=C3)C=CC=C4C=C5,1 +NC1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +O=NC1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)CCCC5,1 +CC(C)N(C(C)C)C(=O)SCC(Cl)=CCl,1 +COC1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,1 +CC1CNCC(C)O1,1 +CC(C)=C(Cl)C=O,1 +[O-][N+](=O)C3=CC2=C1C=CC(=CC1=CC=C2O3)N(CCCl)CCCl,1 +ClC(=O)CC1=CC=CC=C1,1 +NC3=CC2=NC1=CC=CC=C1C(=C2C=C3)N,1 +C1=CC5=C(C=C1)C4=CC3=C2C=CC=CC2=CC=C3N=C4C=C5,1 +OC1=C4C(=CC=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +C1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)Cl,1 +NC1=CC=C(C=C1)NC2=CC=C(C=C2)[N+]([O-])=O,1 +OC1=CC=C(C=C1)C(=O)NN=CC2=CC=C(O2)[N+]([O-])=O,1 +NC3=C2C(C1=CC=CC(=C1C(C2=C(C=C3)N)=O)[N+]([O-])=O)=O,1 +[O-][N+](=O)C1=CC(=C(C=C1)C2=C(C=CC=C2)[N+]([O-])=O)[N+]([O-])=O,1 +OC2=C3C1=CC=CC=C1C4=C(C=CC5=CC=C(C=C2)C3=C45)[N+]([O-])=O,1 +CC1=CC(=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3O)C,1 +OC1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +C1=CC2=C(C=C1)C3=CC=CC4=CC=CC2=C34,1 +CC2C1=C(C=CC=C1)C3=C2C=C(C=C3)F,1 +OC4C=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C4O,1 +CCN(CC)N=O,1 +OC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +[O-][N+](=O)C1=CC=C2C=CC3=C(C=CC4=CC=C1C2=C34)[N+]([O-])=O,1 +OC2C=CC1=C3C=CC4=CC=C(C5=CC=C(C=C1C2O)C3=C45)[N+]([O-])=O,1 +OCC4OC(OC2=C1C(C3=C(OC1=CC(=C2)O)C(=CC=C3O)O)=O)C(O)C(O)C4O,1 +ClCCN(CCCl)P1(=O)OCCCN1CCCl,1 +NC1=C(C=C(C=C1Cl)[N+]([O-])=O)[N+]([O-])=O,1 +OC2C=CC1=C4C(=CC=C1C2O)C3=CC(=CC=C3C=C4)O,1 +OCCN(CCO)C1=CC=C(C=C1)N=NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +NC2=NC(=C1[NH]C=NC1=N2)NO,1 +CN(C)N,1 +CN2N(C1=CC=CC=C1)C(=O)C(=C2C)N=O,1 +ClCCNC(=O)N(CCCl)N=O,1 +C1=CC2=C(C=C1)C4=C3C(=C2)C=CC=C3C=C4,1 +OCC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +CC3=CC2=C(C1=CC=CC=C1C(=C2C=C3)C)C,1 +COC3=C(C=C2N=C1C=CC(=CC1=NC2=C3)N)N,1 +BrCC1CO1,1 +CN(C)N=O,1 +[O-][N+](=O)C1=C(C=CC=C1)[N+]([O-])=O,1 +CC(=O)C1=C(C(=C(O1)[N+]([O-])=O)C2=CC=CC=C2)C3=CC=CC=C3,1 +OS(=O)(=O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +C1OC1C2CO2,1 +[O-][N+](=O)C1=CC(=C(C=C1)Br)[N+]([O-])=O,1 +NC1=C(C=C(C(=C1)[N+]([O-])=O)N)Cl,1 +[O-][N+](=O)C1=CC2=CC=C3C=CC=C4CCC(=C1)C2=C34,1 +[O-][N+](=O)C1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)N=O,1 +CCN(CC)C3=CC=C2N=C1C=CC(=CC1=[O+]C2=C3)N(CC)CC,1 +CCN1CCOCC1,1 +OCCCBr,1 +C1=CC3=C(C=C1)C2=NC=CC=C2C=C3,1 +NC3=C(C=C2N=C1C=CC=CC1=NC2=C3)O,1 +CN(C)C2=C(C1=NC(=C(N=C1C=C2)C)C)C,1 +CC1=CC(=C(C=C1)N)N,1 +NC1=C(C(=CC=C1)N)C(O)=O,1 +OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +[O-][N+](=O)C1=C(C=CC=C1)SSC(F)=C(Cl)Cl,1 +ONC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +COC(=O)NC2=NC1=CC(=CC=C1[NH]2)C(=NO)C3=CC=C(C=C3)F,1 +C1=CC2=CC=C3N=CC=C4C=CC(=C1)C2=C34,1 +NC1=C(C=CC(=C1)[N+]([O-])=O)C(O)=O,1 +CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)F)[N+]([O-])=O,1 +CC4=C1C=CC=CC1=C3N=C2C=CC=CC2=C(C3=C4C)N,1 +NC4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 +CCC1=C3C(=CC2=CC=CC=C12)C4=C(C=C3)C(O)C(O)C5OC45,1 +ON(C=O)C1=CC=C(C=C1)[N+]([O-])=O,1 +CN(N=O)C(C)=O,1 +BrC(C=O)=CC1=CC=CC=C1,1 +C1OC1COC2=CC(=CC=C2)OCC3CO3,1 +CC1=C(C=C(C=C1)N=C=O)N=C=O,1 +N1C4C1C2=C(C=CC3=CC=CC=C23)C5=C4C=CC=C5,1 +OC(=O)CCCC1=CC=C(C=C1)N(CCCl)CCCl,1 +NCCNCCNCCNCCNCCN,1 +CC(C)NCC2CCC1=C(C=C(C(=C1)CO)[N+]([O-])=O)N2,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)Cl,1 +CC1=CC=C(C=C1)N=NNCC2=CC=CC=C2,1 +CNC(=O)OC2=C1C=CC=CC1=CC=C2,1 +CCOC(=O)N(C)C,1 +ClC(=O)C1=C(C=C(C=C1)Cl)Cl,1 +[O-][N+](=O)C2=CC(=C1C(=CC(=CC1=C2)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +COS(=O)(=O)C(F)(F)F,1 +CC1=CC(=C(C=C1)NO)C,1 +ClC(=O)C1=C(C=CC=C1)C(Cl)=O,1 +CC(=O)C=O,1 +O=C1OC5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 +ClCC1=CC=CC=C1,1 +C[N]1C(=NC2=C1C=CC3=NC(=C(C)N=C23)C)N,1 +ClC(CBr)CBr,1 +CC(=O)OC1=C2C=CC3=CC=CC4=CC=C(C(=C1)[N+]([O-])=O)C2=C34,1 +CC1=CC=C[N]2C1=NC3=C(C)C(=CN=C23)N,1 +OC1=C([NH]C2=CC=CC=C12)C4=NC3=C(C=CC=C3)C4=O,1 +OCC1=C4C(=C(C2=CC=CC=C12)CO)C3=CC=CC=C3C=C4,1 +NC1=CC3=C(C=C1)C2=CC=CC=C2O3,1 +CC4=C3C=C2C1=CC=CC=C1C=CC2=CC3=CC=C4,1 +C1CCC(CC1)N2C4C2C3=C(C=CC=C3)C5=C4C=CC=C5,1 +COC1=C(C=CC=C1)N,1 +ONC1=CC=C(C=C1)C2=CC=CC=C2,1 +CN1CC(CBr)CC2C1CC3=C[NH]C4=CC=CC2=C34,1 +CCN(CC)CCNC2=C1C(C3=C(SC1=C(C=C2)C)C=CC=C3)=O,1 +OCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +C1=CC5=C4C(=C1)C2=CC=CC3=CC=CC(=C23)C4=CC=C5,1 +C[N]2C(=NC3=C1N=C(C)C=NC1=CC(=C23)C)N,1 +CNN=O,1 +COC(=O)C(=C)C#N,1 +CN(C)C1=CC=C(C=C1)N=NC3=CC=C2N=CSC2=C3,1 +COP(=S)(OC)SCN2N=NC1=C(C=CC=C1)C2=O,1 +OCC1SCCN1N=O,1 +[O-][N+](=O)C1=C(C(=CC=C1)[N+]([O-])=O)C=O,1 +CC1=CC2=C(C=C1)C(=CC=C2)[N+]([O-])=O,1 +OC1=C(C(=CC=C1)[N+]([O-])=O)[N+]([O-])=O,1 +OC3=C(C2=CC1=CC=CC=C1C(=C2C=C3)O)O,1 +OC1=C4C(=CC=C1)C3=CC2=CC=CC5=C2C(=C3C=C4)C=C5,1 +CN2C(=O)CN=C(C1=C(C=CC=C1)F)C3=C2C=CC(=C3)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC2=C(C=C1)C(=O)OC2=O,1 +COC(=O)C1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +ClCC2=C1C3=CC=C4C=CC=C5C=CC(=CC1=CC=C2)C3=C45,1 +NC1=NC(=CC=C1)N,1 +[O-][N+](=O)C1=CC=C(O1)C=CC(=O)NN=CC2=CC=C(O2)[N+]([O-])=O,1 +OOC1CCCC2=C1C=CC=C2,1 +[O-][N+](=O)C2=CC=C1SN=C(Cl)C1=C2,1 +[O-][N+](=O)C1=CC(=CC=C1)CCl,1 +CC(O)=NO,1 +CN(C)CCNC(=O)C2=C1SC3=C(C(C1=CC=C2)=O)C=CC=C3,1 +COC1=CC=C(C=C1)CNC(=O)C(C)Br,1 +NC3=CC2=NC1=CC=C(C=C1N=C2C=C3)N,1 +OCCC1=C[NH]C2=CC(=CC=C12)[N+]([O-])=O,1 +CC1=C(C=CC=C1)N=NC2=CC(=C(C=C2)N)C,1 +CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)N,1 +[O-][N+](=O)C3=CC2=C1C(=CC=CC1=CC=C2C=C3)[N+]([O-])=O,1 +C2=CC1=NC=CN=C1C=C2,1 +[O-][N+](=O)C1=CC=C(C=C1)CCl,1 +OC(=O)C1=CC=C(C=C1)NC3=C2C=CC(=CC2=NC4=CC=CC=C34)N=[N+]=[N-],1 +COC1=C4C(=CC=C1)C3=C2OCOC2=CC(=C3C=C4)C(O)=O,1 +CC2=[N+](C1=CC=CC=C1[N+](=C2C(=O)NCCO)[O-])[O-],1 +CC(C)(C)C1=CC(=O)C=CC1=O,1 +CN(C)CCCNC2=C1C=C(C=CC1=NC3=CC=CC=C23)[N+]([O-])=O,1 +O=NC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +CC1(CO1)C2=CC=CC=C2,1 +NC2=C1SN=C(C1=CC=C2)Cl,1 +CC2C1=C(C=CC=C1)C3=C2C=C(C(=C3)C)C,1 +CC(O)C1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)[N+]([O-])=O,1 +C1=CC2=C(C=C1)C4=CC=C5C=CC6=CC3=CC=CC2=C3C4=C56,1 +[O-][N+](=O)C2=CC3=CC=C4C1=CC=CC=C1C=C5C=CC(=C2)C3=C45,1 +CC1=C(C=CC(=C1)[N+]([O-])=O)N,1 +OC1=CC=C(C=C1)N=O,1 +NC2=CC=C1SN=CC1=C2,1 +[N-]=[N+]=C1C=CC(=O)C=C1,1 +O=C2CC(=NC1=CC=CC=C1)C(=O)C3=C2C=CC=C3,1 +[O-][N+](=O)C2=CC1=CC(=CC=C1O2)N(CCCl)CCCl,1 +OC(=O)C(Br)=C(Br)C=O,1 +COC1=C4C(=CC=C1)C3=C2OCOC2=CC5=C3C(=C4)NC5=O,1 +CN(C)N=NC1=CC=C(C=C1)[N+]([O-])=O,1 +C1=CC2=C(C=C1)C5=C(C=C2)C4=C3C=CC=CC3=CC=C4C=C5,1 +COC1=C(C3=C(C(=C1)N)C(=O)C2=C(C=CC=C2)C3=O)N,1 +NC1=CC=C(C=C1)OC2=CC(=C(C=C2)N)N,1 +CC(=O)N1CCCC1C(=O)N(CC(O)=O)N=O,1 +COC1=C(C=CC(=C1)CC2CO2)O,1 +CN(C)CCCNC2=C1C=CC=CC1=NC3=CC=CC=C23,1 +CCC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)[N+]([O-])=O,1 +OC5C(O)C2=C1C6(C4=C(C1=CC=C2)C3=C(C=CC=C3)C=C4)OC56,1 +NC(CSC(Cl)=C(Cl)C(Cl)(Cl)Cl)C(O)=O,1 +C[N]2C1=CC=CC=C1C3=CC(=CC=C23)N,1 +NC1=CC=C(C=C1)OC2=C(C=C(C=C2)Cl)Cl,1 +C1=CC3=C(C=C1)C2=CC5=C(C=C2C=C3)C4=CC=CC=C4C=C5,1 +OC1C=CC=CC1O,1 +CCNN=O,1 +S3C1=CC=CC=C1C4=CC=C2C=CC=CC2=C34,1 +CC(=O)OCC1=CC=C(C=C1)N=NC2=CC=C(C=C2)COC(C)=O,1 +CCC4(O)CC(O)C2=C(C=C1C(C3=C(C(C1=C2O)=O)C(=CC=C3)O)=O)C4C(=O)OC,1 +OC5C=CC1=C(C2=CC=C3C=CC(=C4C=CC(=C1)C2=C34)[N+]([O-])=O)C5O,1 +O[N+]([O-])=C=CC1=CC=C(O1)[N+]([O-])=O,1 +NC(CS)C(O)=O,1 +CCC3=C1C4=C(C=CC1=C2C=CC=CC2=C3)C(O)C(O)C5OC45,1 +O=C3[N]2C1=CC=CC=C1N=C2C8=C6C3=CC=C7C5=NC4=CC=CC=C4[N]5C(C(=C67)C=C8)=O,1 +OCCCCl,1 +CCOC1=CC=C(C=C1)NC(=O)CC(C)O,1 +CC1=C(C(=C(C=C1[N+]([O-])=O)[N+]([O-])=O)N)[N+]([O-])=O,1 +ClCC1CO1,1 +CC(C)=CC2C(C(=O)OC1=C(C)C(CC=C)C(=O)C1)C2(C)C,1 +O=NC1=CC=C(C=C1)OC2=CC=CC=C2,1 +[O-][N+](=O)C2=C4C=CC=C5C1=CC=CC=C1C3=CC=CC(=C2)C3=C45,1 +CC(C)N(C(C)C)C(=O)SCC(Cl)=C(Cl)Cl,1 +COC(=O)NC1=CC(=CC=C1)OC(=O)NC2=CC(=CC=C2)C,1 +FC5=C3C=CC=C4C2=C1C=CC=CC1=CC=C2C(=C34)C=C5,1 +ClC(=O)OCC2C1=C(C=CC=C1)C3=C2C=CC=C3,1 +COC4=CC(=O)C1=C(C3=C(C(=N1)C)C2=CC=CC=C2[NH]3)C4=O,1 +CC1=CC(=C(C=C1)N)O,1 +CCOP(=S)(OCC)OC1=N[N](C(C)C)C(=N1)Cl,1 +[O-][N+](=O)C1=CC5=C2C(=C1)CCC4=C2C(=C3CCCCC3=C4)CC5,1 +S=P(N1CC1)(N2CC2)N3CC3,1 +C1=CC4=C(C=C1)C3=CC=C2C=NC=CC2=C3C=C4,1 +CN(C)CCNC(=O)C2=C1NC3=C(OC1=CC=C2)C=CC=C3,1 +CC1=CC=C(C=C1)CCC2CO2,1 +OC4=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C=C4,1 +NC2=C1N=C[N](C1=NC=N2)CC3=CC=CC=C3,1 +OCC(O)CI,1 +NC3=C2N=C1CCCCC1=CC2=CC=C3,1 +CN1CCN(CC1)C4=C2OCN(N3C=C(C(C(=C23)C=C4F)=O)C(O)=O)C,1 +C1=CC4=C(C=C1)C3=CC2=CC=NC=C2C=C3C=C4,1 +CCN(CC)N(O)N=O,1 +COC1=CC4=C(C=C1)C2=NC=CC3=CC(=C(C(=C23)C4=O)OC)OC,1 +ClC(=O)C1=CC=C(C=C1)C(Cl)=O,1 +NC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +[O-][N+](=O)C2=CC1=C[NH]N=C1C=C2,1 +OCC1OC(C(O)C1O)N(N=O)C2=CC=C(C=C2)[N+]([O-])=O,1 +CCCCCCCCCCSC[N]1C=C[N+](=C1)C,1 +OC4C=CC3=C(C2=CC=C1C=CC=CC1=C2C=C3)C4O,1 +CC2=C1N=CC=CC1=CC=C2,1 +OC1=C(C3=C(C(=C1)O)C(=O)C2=C(C=CC=C2)C3=O)O,1 +NC2=C1C=CC=CC1=NC3=CC=CC=C23,1 +[O-][N+](=O)C1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 +BrCC1=CC=CC=C1,1 +ClCN2C(=O)C1=C(C=CC=C1)C2=O,1 +CN(C)C1=CC=C(C=C1)C=CC2=CC=CC=C2,1 +C5=CC4=CC3=C1C=CC=CC1=C2C=CC=CC2=C3N=C4C=C5,1 +ClCC4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,1 +[O-][N+](=O)C4=CC=C3C2=C1C(=C(C=CC1=CC=C2)[N+]([O-])=O)C5=C3C4=CC=C5,1 +COC1=CC4=C(C=C1)C2=C(C(=CC3=CC=NC(=C23)C4=O)OC)OC,1 +CC1=CC(=C(C(=C1)C)N)C,1 +CC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +COP(=S)(OC)OC1=CC=C(C=C1)[N+]([O-])=O,1 +COC1=C(C4=C(C=C1)C3=C2OCOC2=CC5=C3C(=C4)N(C)C(=O)C5=O)OC,1 +ON=C1C=CC(C=C1)=NO,1 +CN(C1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +ONC2=CC1=CC=CC=C1C=C2,1 +[O-][N+](=O)C1=CC2=CC=C3C=C(C=C4C=CC(=C1)C2=C34)[N+]([O-])=O,1 +COC5=C2[C]1=CC=C(C1=C(OC2=C4C3CCOC3OC4=C5)O)O,1 +OCC(Cl)CCl,1 +O=NN1CCCCC1,1 +C1=CN=C(C=C1)C2=NC=CC=C2,1 +CC3=C(C1=CC=CC=C1C4=CC=C2C=CC=CC2=C34)[N+]([O-])=O,1 +C[N]1C(=NC2=CC=CC=C12)N,1 +CC(=O)OC1CC5=C4C1=C3C=CC2=CC=CC=C2C3=CC4=CC=C5C,1 +[O-][N+](=O)C1=C(N=C2SC=C[N]12)C3=CC=C(C=C3)Cl,1 +CN2C1=C(C=CC=C1)C(=O)C3=C2C4=C(C=C3O)OC(C4)C(C)=C,1 +[O-][N+](=O)C1=C(C=CC=C1)SSC(Cl)=C(Cl)C(F)(F)F,1 +CC(=O)N(O)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +COC1=C(C=C(C=C1)C(=O)NC2=CC=CC=C2)[N+]([O-])=O,1 +CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)N(C)C)[N+]([O-])=O,1 +NC1=CC=C(C=C1)Cl,1 +ClC3=CC2=CC1=CC=CC=C1C=C2C=C3,1 +OC(=O)C(Cl)=C(C(Cl)Cl)C(O)=O,1 +ClC(Br)C#N,1 +[O-][N+](=O)C3=C1C=CC=CC1=C2C=CC=CC2=C3,1 +NC1=CC=C(C=C1)OC2=C(C=C(C=C2Cl)Cl)Cl,1 +[O-][N+](=O)C2=CC1=C3C(=CC=C1C=C2)C(=CC=C3)[N+]([O-])=O,1 +FC2=C1N=CC=CC1=CC=C2,1 +CCC(Cl)=[N+](O)[O-],1 +CC(C)(C)CCCCCC(=O)OCC1CO1,1 +CC(=O)NNC1=CC=CC=C1,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)Cl,1 +OC2=C(C1=CC=CC=C1C=C2)[N+]([O-])=O,1 +CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC,1 +CCC2=C1[NH]C3=C(C1=CC(=C2)O)CCOC3(CC)CC(O)=O,1 +OC3C=CC2=C(C=C1C=CC(=CC1=C2)[N+]([O-])=O)C3O,1 +NC1=CC=C(C=C1)C=CC2=CC=CC=C2,1 +COCC1CO1,1 +O=NN1CCCC1C2=CN=CC=C2,1 +CCN(CC)C(=S)SCC(Cl)=C,1 +NC(=O)NCC=C,1 +O1C5C1C3=C(C2=CC=CC=C2C4=CC=CC=C34)C6=C5C=CC=C6,1 +OC5C(O)C2=C(C1=NC4=C(C=C1C=C2)C3=CC=CC=C3C=C4)C6OC56,1 +CC4=C3C1=CC=CC2=CC=CC(=C12)C3=C(C5=CC=CC=C45)C,1 +O=CCC=O,1 +NC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CC1=NSC(=C1)N,1 +N(C1=CC=C(C=C1)NC3=CC2=CC=CC=C2C=C3)C5=CC4=CC=CC=C4C=C5,1 +CCCCN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +FC5=CC=C4C=C3C2=C1C(=CC=CC1=CC=C2)C3=CC4=C5,1 +CC(=O)OCC1=CC=C(C=C1)[N+]([O-])=O,1 +CN(C)C1=CC=C(C=C1)CC2=CC=C(C=C2)N(C)C,1 +NCCNCCNCCNCCN,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=CC=C2)C3=O,1 +CC(=O)N(O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +[O-][N+](=O)C1=CC=C(C=C1)OCC2CO2,1 +C1OC1COC3=CC2=CC=CC=C2C=C3,1 +O=C2C1=C(C=CC=C1)C4=C2C=C3C=CC=CC3=C4,1 +CNC1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +CC2=C1C3=CC=C4C=CC=C5C=CC(=CC1=CC=C2)C3=C45,1 +ClC1=C(N=CC=C1)Cl,1 +[O-][N+](=O)C1=CC(=CC=C1)C#N,1 +CN(C)CCNC(=O)C2=C1OC3=C(C(C1=CC=C2)=O)C=CC=C3,1 +ClCC(CCl)OP(=O)(OC(CCl)CCl)OC(CCl)CCl,1 +COC1=C(C=CC(=C1)CNC(=O)C(C)Br)O,1 +CCN1C=C(C(O)=O)C(=O)C2=C1N=C(N=C2)N3CCNCC3,1 +COP(=O)(OC)OC1=CC(=C(C=C1)[N+]([O-])=O)C,1 +[O-][N+](=O)C1=CC2=C(C=C1)C(=CC3=CC=CC=C23)[N+]([O-])=O,1 +O[N+]([O-])=C=CC1=CC=CC=C1,1 +COC(=O)C4=C2C=CC1=C(C=CC=C1C2=C3OCOC3=C4)OC,1 +COC1=NSC2=CC(=CC=C12)[N+]([O-])=O,1 +ClCCOCC(Cl)=CCl,1 +NC2=C1C(C3=C(C(C1=C(C=C2Br)Br)=O)C=CC=C3)=O,1 +C[N]1C=NC2=C(N)N=CN=C12,1 +C[N]1C=NC2=C1C=CC3=NC=CC=C23,1 +CC2C1=C(C=CC=C1)C3=C2C=CC(=C3)C,1 +[O-][N+](=O)C2=CC=C1C(=NSC1=C2)Cl,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)[N+]([O-])=O,1 +ClC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +COC1=C(C=C(C(=C1)Cl)OC)Cl,1 +[O-][N+](=O)C1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +OC(=O)C4=C2C(=CC1=C(C=CC=C1C2=C3OCOC3=C4)O)[N+]([O-])=O,1 +NC(CCC(=O)NNC1=CC=CC=C1)C(O)=O,1 +[O-][N+](=O)C1=CC=C(C=C1)OC=C,1 +CC2(OO)C1=C(C=CC=C1)C3=C2C=CC=C3,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC(=CC=C2)C#N,1 +[O-][N+](=O)C1=CC4=C2C(=C1)CCC3=C2C(=CC=C3)CC4,1 +CC2=C1C=C4C(=CC1=CC=C2)C3=CC=CC=C3C=C4,1 +CC2=CC=C1N=C(SC1=C2)C3=CC=C(C=C3)N,1 +N1C2C1C4=C3C2=CC=CC3=CC=C4,1 +CC(C)(C)OC(=O)C(N)CN=[N+]=[N-],1 +[O-][N+](=O)C2=CC1=CC=C(C=C1O2)N(CCCl)CCCl,1 +ON(C=O)C1=CC=C(C=C1)C=CC2=CC=CC=C2,1 +CN(CCCl)CCCl,1 +CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2,1 +COS(C)(=O)=O,1 +CC2=C4C=CC=C5C=CC3=CC1=CC=CC=C1C(=C2)C3=C45,1 +ClNC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +CC(=O)NC2=CC1=CC=CN=C1C=C2,1 +[O-][N+](=O)C5=C3C=CC=C4C2=CC1=CC=CC=C1C=C2C(=C34)C=C5,1 +C1OC1CC2=CC=C(C=C2)C3=CC=CC=C3,1 +C[N]2C1=CC=CC=C1C3=CC(=CC=C23)[N+]([O-])=O,1 +CCCCCCOCC1CO1,1 +OCC1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +CCOS(=O)(=O)OCC,1 +BrCC(Br)C1=CC=CC=C1,1 +CCCNN=O,1 +OC2=CC1=CC=CC(=C1C=C2)O,1 +CC1=C(N=C3C(=C1)C2=CC=CC=C2[NH]3)N,1 +OC4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 +ClC(Cl)(Cl)C1=CC=CC=C1,1 +C=CC=O,1 +CCC(=O)C2=C1C=CC=C(C1=C(C3=C(C=CC=C23)O)O)O,1 +NC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +CN(CC(O)CO)N=O,1 +C1OC1COC3=C2C=CC=CC2=CC=C3,1 +C1OC1COC2=CC=CC=C2,1 +OCC1OC(CC1O)N2C=C(COO)C(=O)NC2=O,1 +CC(Cl)C(Br)CBr,1 +NC2=C1SN=CC1=CC=C2,1 +OC(=O)C=CCl,1 +[O-][N+](=O)C3=CC2=C1C=C(C=CC1=CC=C2C=C3)[N+]([O-])=O,1 +CC1OC1C,1 +CC1=C(C=C(C=C1)C(O)(P(O)(O)=O)P(O)(O)=O)N(CCCl)CCCl,1 +OC(=O)C(Cl)=C(Cl)C=O,1 +COC4=CC(=O)C3=C2[NH]C1=C(CCCC1)C2=CN=C3C4=O,1 +CCN(CC)CCNC2=C1C(C3=C(SC1=C(C=C2)CO)C=CC=C3)=O,1 +CC(=O)OC2=C(OC(C)=O)C4=C(C=CC5=C1C=CC=CC1=C3C=CC=C2C3=C45)[N+]([O-])=O,1 +O[N+]([O-])=CCl,1 +COC1=C(C=CC(=C1)N)NC(C)=O,1 +COC(=O)C(CSCC(C)Br)NC(C)=O,1 +ClCC(=O)NCC1=CC=CC=C1,1 +FC1=CC=C2C(=C1)C=CC3=C2C4=CC=CC5=CC=CC3=C45,1 +CC4=C2C1=CC=CC=C1[NH]C2=C3C(C(=CC(C3=N4)=O)N5CC5)=O,1 +CC(Br)C(=O)NCC1=CC=C(C=C1)Cl,1 +CC1CCCCN1CCCNCC(=O)NC2=C(C(=N[N]2C)C)C(=O)C3=C(C=CC=C3)F,1 +[O-][N+](=O)C1=CC4=C(C=C1)C3=CC=C2CCCCC2=C3CC4,1 +NC1=CC=C(C=C1)C=CC2=CC(=CC=C2)C#N,1 +CCC(=O)OCC1=CC=C(C=C1)[N+]([O-])=O,1 +CC(Br)CBr,1 +CC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CCCCOC1=CC=C(C=C1)C=NC2=CC=C(C=C2)CC,1 +OCC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +OC1COC(C(O)C1O)N(N=O)C2=CC=C(C=C2)[N+]([O-])=O,1 +CN(CC1=CC=CC=C1)N=O,1 +NC(=O)C1=CSC(=C1)[N+]([O-])=O,1 +OC2=C1C(C3=C(C(C1=C(C=C2)[N+]([O-])=O)=O)C(=CC=C3O)[N+]([O-])=O)=O,1 +OC2C1=C(C=CC=C1)OC3=C2C=CC=C3,1 +OC1=C(C=C(C=C1)Cl)C(=O)NC2=C(C=C(C=C2)[N+]([O-])=O)Cl,1 +ClC2=C1N=CC=CC1=CC=C2,1 +COC1=CC3=C(C(=C1)O)C(=O)C2=C(C=C(C=C2O)C)C3=O,1 +CC(C)(C)OC(=O)NN=CC2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 +CC(=O)N(O)C2=CC1=CC=CC=C1C=C2,1 +CCOC1=CC(=O)C(CC1=O)=NC(C)=O,1 +O1C5C1C2=C(C=C4C(=C2)C3=CC=CC=C3C=C4)C6=C5C=CC=C6,1 +C1=CC4=C(C=C1)C3=CC2=CC=NC=C2C=C3C5=CC=CC=C45,1 +CC1=CC=C(C=C1)CC2CO2,1 +OC(=O)CC1=C(C=CC=C1)[N+]([O-])=O,1 +COC1=C(C=CC(=C1)N)N,1 +NC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +COC1=C(C4=C(C=C1)C3=C2OCOC2=CC5=C3C(=C4)N(C)CC5)OC,1 +CC2=CC1=CC=CN=C1C=C2,1 +C[N]2C(=NC3=C1N=C(C)C(=NC1=CC(=C23)C)C)N,1 +OC(=O)CC=[N+](O)[O-],1 +OC1=CC(=C(C=C1)O)O,1 +OC3C=CC2=C1N=CC=CC1=CC=C2C3O,1 +COC1=CC5=C(C=C1)C3=C2OCOC2=CC4=CC=NC(=C34)C5=O,1 +OC(=O)C(Cl)=C(C(Cl)Cl)C(Cl)Cl,1 +CC2=C[N]1C(=C(N=C1S2)C3=CC=C(C=C3)[N+]([O-])=O)[N+]([O-])=O,1 +COC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)OC)OC)C3=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC=O,1 +OCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 +NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)Cl,1 +NC1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 +CC(=O)N(O)C1=CC=C(C=C1)OC2=CC=C(C=C2)Cl,1 +CCCN(N=O)C(N)=O,1 +NC1=CC=C(C=C1)C2=CC=C(C=C2)C3=CC=C(C=C3)N,1 +CC(=O)NC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +O=NC1=CC(=CC=C1)C2=CC=CC=C2,1 +C5CC4=C(C3=CC2=C1C=CC=CC1=CC=C2N=C3C=C4)C=C5,1 +O=C2C1=C(C=CC=C1)C4=C3C2=CC=CC3=CC=C4,1 +COC1=CC=C(C=C1)N,1 +NC(CCC(=O)NNC1=CC=C(C=C1)CO)C(O)=O,1 +ClC1=CC(=C(C=C1)C(Cl)(Cl)Cl)Cl,1 +[O-][N+](=O)C2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +OC1=C(C=C(C=C1)C2=CC(=CC=C2)[N+]([O-])=O)[N+]([O-])=O,1 +CC(C)CNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +FC2=C1C=CC=NC1=CC=C2,1 +CC(C)CC(=O)OC2OC=C(COC(C)=O)C3=CC(OC(=O)CC(C)C)C1(CO1)C23,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=CC=C2,1 +[O-][N+](=O)C2=C1SN=CC1=CC=C2,1 +[O-][N+](=O)C1=CC=C(C=C1)[N+]#N,1 +CC3=C2C1OC1C5=C(C2=CC4=CC=CC=C34)C=CC=C5,1 +CC1=C(C(=C(C=C1)[N+]([O-])=O)C)[N+]([O-])=O,1 +NC2=C1N=C[NH]C1=NC=N2,1 +OC2=C1N=CC=CC1=CC=C2,1 +[O-][N+](=O)C1=CC=C(C=C1)C=O,1 +NC(NC1=CC=CC=C1)=NC2=CC=CC=C2,1 +CCC2=C1[NH]C3=C(C1=CC=C2O)CCOC3(CC)CC(O)=O,1 +OC2=C(C1=C(C3=C(C(=C1C=C2)O)C(=O)C=CC3=O)O)O,1 +CC(=O)OCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +NC1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O,1 +CC(O)CN(CC(C)=O)N=O,1 +OC6C1OC1C5=C4C=C2C=CC=C3C=CC(=C23)C4=CC=C5C6O,1 +CC1=CC5=C4C(=C1)C3=CC2=CC=CC=C2C=C3C4=CC=C5,1 +ClCC2=C4C=C1C=CC=CC1=C5C=CC3=CC=CC(=C2)C3=C45,1 +[O-][N+](=O)C3=CC=C2OC1=CC=CC=C1C2=C3,1 +C2=CC1=CC4=C(C=C1C=C2)C3=NC=CC=C3C=C4,1 +NC2=C(C=C1C=CC=CC1=C2)N,1 +ClC2=C1C=CC=NC1=CC=C2,1 +COC(=O)NC2=NC1=CC=C(C=C1[NH]2)C(=O)C3=CC=CC=C3,1 +OC(CCl)CCl,1 +NC1=CC=C(C=C1)C2=CC=CC=C2,1 +OC(=O)C(Cl)=C(C=O)C(Cl)Cl,1 +[O-][N+](=O)C4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 +COP(=S)(OC)SCN2C(=O)C1=C(C=CC=C1)C2=O,1 +CNC(=O)N(O)C(C)=O,1 +CC(=O)NNC1=CC=C(C=C1)CO,1 +[NH]2C1=CC=CC=C1N=C2C3=CSC=N3,1 +CCOCC1CO1,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C(C)=O,1 +CC(C)(OO)C1=CC=CC=C1,1 +C(SSCC1=CC=CC=C1)C2=CC=CC=C2,1 +CCC(=O)C(=O)CC,1 +ClCCSCC1=CC=CC=C1,1 +ClCCNCCCNC1=C4C(=NC2=CC=CC=C12)C3=NC=CC=C3C=C4,1 +CC(C)(O)CCC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=C4C(=C3)OC5OC=CC45O)O,1 +NC(=N)NC#N,1 +BrCBr,1 +CN(C)N=NC1=CC=C(C=C1)C,1 +CN(C)CCNC(=O)C2=CC=CN3C(=O)C1=C(C=CC=C1)N=C23,1 +COC1=CC=C(C=C1)CC2CO2,1 +COC1=C(C=C(C=C1)CNC(=O)C(C)Br)OC,1 +ClC1=C(C=C(C=C1)C(Cl)(Cl)Cl)Cl,1 +[O-][N+](=O)C1=CC(=C(C=C1)SC#N)[N+]([O-])=O,1 +C1=NC=CC(=C1)C2=CC=NC=C2,1 +NNC1=CC=C(C=C1)[N+]([O-])=O,1 +OC1OC(=O)C=C1CCl,1 +NC3=C2C(=C1C(C=CC(C1=C(C2=C(C=C3)N)O)=N)=N)O,1 +CN(C)CCCNC2=C1C=CC(=CC1=NC3=CC=CC=C23)[N+]([O-])=O,1 +COC5=C2[C]1=CC=C(C1=C(OC2=C4C3C=COC3OC4=C5)O)O,1 +COC1=NSC2=CC(=CC=C12)N,1 +ClCCl,1 +OC1=CC(=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +C1CS1,1 +C1OCC2=C1C=CC=C2,1 +OCCNCCNC3=C2C(=C1C(C=CC(C1=C(C2=C(C=C3)NCCNCCO)O)=O)=O)O,1 +CC2C1=C(C=CC=C1)C3=C2C=CC=C3C,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC(=C(C=C1)Cl)Cl,1 +O=C2N(N=CC1=CC=CC=C1)N=NC3=C2[NH]C4=CC=CC=C34,1 +CC4=CC3=C(C2=CC=C1C=CC=CC1=C2N=C3C=C4)C,1 +C5=CC4=CC3=C1C=CC=CC1=C2C=CC=CC2=C3C=C4C=C5,1 +COC(=O)C2=C1C(C5=C(OC1=CC=C2)C3=C(OC4OC=CC34)C=C5OC)=O,1 +CC3=CC2=C(C1=CC=CC=C1C=C2C=C3)C,1 +C[N]2C1=CC(=CN=C1N=C2[N+]([O-])=O)C3=CC=CC=C3,1 +NC3=C(C=C2N=C1C=CC=CC1=NC2=C3)N,1 +COC2=C1C=C(OC1=C(C=C2)N(CCCl)CCCl)[N+]([O-])=O,1 +C2CCC1OC1C2,1 +OC6C1OC1C5=C4C2=CC=CC3=CC=CC(=C23)C4=CC=C5C6O,1 +OCCNC1=CC=C(C=C1)N=NC2=CC=C(C=C2)NCCO,1 +O=C(NC1=CC3=C(C=C1)C2=CC=CC=C2C3)C4=CC=CC=C4,1 +CC2=CC(=O)C1=C(C=CC=C1)C2=O,1 +CC(C)=CC3C(C(=O)OCC1=CC(=CC=C1)OC2=CC=CC=C2)C3(C)C,1 +CC(=C)C2=CC=C(C)C1=CC=C(CO)C1=C2,1 +O=C2C1=C(C=CC=C1)C3=C2C=CC4=C3C=CC=C4,1 +CCC(C)OS(C)(=O)=O,1 +CCCC(=O)C2=C1C=CC=C(C1=C(C3=C(C=CC=C23)O)O)O,1 +OC3C=CC2=C1C=C5C(=CC1=CC=C2C3O)C4=CC=CC=C4C=C5,1 +O=C2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3[N+]#N,1 +C1OC1COC2=C(C=CC=C2)CC3=CC=CC=C3,1 +NC4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,1 +CC(O)C(=O)NCCO,1 +CC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)CCl,1 +COC3=C2N=C1OC=CC1=C(C2=CC4=C3OCO4)OC,1 +ClC(Cl)C(=O)C(Cl)(Cl)Cl,1 +C[N]2C(=NC3=C1N=C(C)C=NC1=CC(=C23)CO)N,1 +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O,1 +CC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +CCCCN(CCO[N+]([O-])=O)[N+]([O-])=O,1 +ClC(=C)C=O,1 +COC4=C(C=C3C2=C1OCOC1=CC5=C2C(CC3=C4)N(C)CC5)OC,1 +CC(=O)N(O)C1=CC=C(C=C1)OC2=CC=CC=C2,1 +OC(=O)C1=C(C=CC=C1)[N+]([O-])=O,1 +[O-][N+](=O)C1=C3C=CC=C4C5=C(C2=CC=CC(=C1)C2=C34)CCCC5,1 +CC(C)OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +OC1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 +CC1=CC(=C(C=C1)N)C,1 +OC1=CC=C(C=C1)NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +CC2=C(C1=CC=CC=C1C=C2)[N+]([O-])=O,1 +OC5C=CC4=C(C=C3C1=CC=CC2=CC=CC(=C12)C3=C4)C5O,1 +[O-][N+](=O)C1=C(C=CC=C1)C=CC=O,1 +NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)C#N,1 +OC(=O)C1=CC=C(C=C1)[N+]([O-])=O,1 +CN(CC1=CC(=CC=C1)C#N)N=O,1 +CC1=C(C(=CC(=C1)N)[N+]([O-])=O)N,1 +OS(=O)(=O)C1=CC(=O)C(=O)C2=C1C=CC=C2,1 +COC1=CC(=CC=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +CC(=O)NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,1 +CC1=CC3=C(C(=C1)O)C(=O)C2=C(C=C(C=C2O)O)C3=O,1 +ONC2=C1N=C[NH]C1=NC=N2,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=CC=C2C=C3[N+]([O-])=O)[N+]([O-])=O,1 +CCN1N=C(C(O)=O)C(=O)C3=C1C=C2OCOC2=C3,1 +CN(C)C1=CC=C(C=C1)N(C)C,1 +[O-][N+](=O)C1=CC(=CC=C1)C2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +CCNC1=CC(=CC=C1)O,1 +NC1=CC(=C(C=C1)CC2=C(C=C(C=C2)N)[N+]([O-])=O)[N+]([O-])=O,1 +NC2=C1C=CC=NC1=CC=C2,1 +FC2=C1C=CC=NC1=C(C=C2)F,1 +NC1=CC3=C(C=C1)C2=CC=C(C=C2C3)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC4=C2C1=CC=CC2=CC5=C3C=CC=CC3=CC=C45,1 +COC1=CC=C(C=C1)CCC2CO2,1 +NC3=CC=C2[NH]C1=CC=CC=C1C2=C3[N+]([O-])=O,1 +COC3=CC=C2[NH]C1=C(C)C=C(N)C(=C1C2=C3)C,1 +O=NC1=C(C=CC=C1)C2=CC=CC=C2,1 +CC2=NC1=CC=CC=C1C=C2,1 +OC3C(O)C2=C(C1=NC=CC=C1C=C2)C4OC34,1 +ClCC(Cl)CCl,1 +COC1OC(=O)C(=C1C(Cl)Cl)Cl,1 +CC1=CC(=CC=C1)C(Cl)=O,1 +CC2=C[N]1C(=C(N=C1S2)C3=CC=C(C=C3)[N+]([O-])=O)N=O,1 +COC1=C(C=C(C=C1)C)N,1 +COC1=CC=C(C=C1)C=CC2=CC=C(C=C2)N,1 +OC(=O)CCOP(O)(=N)N(CCCl)CCCl,1 +S=C=NC2=C1C=CC=CC1=CC=C2,1 +COC1=CC=C(C=C1)C(Br)=CC(O)=O,1 +CCOC1=C(C=C(C=C1)N)N,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)NC(C)=O,1 +CC(=O)N(O)C1=CC=C(C=C1)OC2=C(C=C(C=C2)Cl)Cl,1 +C[N]2C(=NC3=C1N=CC=NC1=CC(=C23)C)N,1 +[O-][N+](=O)C(Br)(Br)Br,1 +OCCN(CCO)C2=C1C=CC=CC1=NC(=N2)C3=CC=C(S3)[N+]([O-])=O,1 +CC1(C)CC2C(O)(C1)C=C(C=O)C34CC23C(=O)OC4O,1 +NC3=C2N=C1C=CC=C(C1=NC2=CC=C3)N,1 +OC4C=CC3=C2C=C1C=CC=CC1=C(C2=CC=C3C4O)Cl,1 +[O-][N+](=O)C2=CC=C1SN=CC1=C2,1 +OC2C=CC1=C3C=CC4=CC=CC5=CC=C(C=C1C2O)C3=C45,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC(=CC=C2C=C3)[N+]([O-])=O,1 +[O-][N+](=O)C2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2[NH]3,1 +NC1=C(C=C(C=C1Cl)[N+]([O-])=O)Cl,1 +S=C=NCCC1=CC=CC=C1,1 +CCC=CC=CC=CC=COCC(O)CO,1 +[O-][N+](=O)C1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)CCC=C5,1 +[O-][N+](=O)C2=C3C=CC4=CC=CC5=C1CCCCC1=C(C(=C2)[N+]([O-])=O)C3=C45,1 +C1CO1,1 +CN2C1=C(C=C(C(=C1)C)C)N=C3C(=O)NC(=O)N=C23,1 +OC(=O)CC1=CC=C(C=C1)[N+]([O-])=O,1 +CC1=C(C=CC2=CC=CC=C12)[N+]([O-])=O,1 +CC(=O)ON(C(C)=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +O5C6C=CC4=C3C=C1C=CC=C2C=CC(=C12)C3=CC=C4C56,1 +NC(=O)C1=C(C=C(C(=C1)N2CC2)[N+]([O-])=O)[N+]([O-])=O,1 +OCC(Br)=C(Br)CO,1 +OC1=CC3=C(C(=C1)O)C(=O)C2=C(C(=CC=C2O)O)O3,1 +[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=CC(=C2)[N+]([O-])=O)O3,1 +OC2C=CC1OC1C2O,1 +[O-][N+](=O)C1=CC(=CC=C1)S(=O)(=O)OCC2CO2,1 +[O-][N+](=O)C1=CC=C(O1)C=NN2CC(=O)NC2=O,1 +CC1(CO1)C2=CC=C(C=C2)C#N,1 +FC5=C4C=C3C1=CC=CC2=CC=CC(=C12)C3=CC4=CC=C5,1 +OCC(O)CCl,1 +CC1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +CCC1(C(=O)NC(=O)NC1=O)C2=CC=CC=C2,1 +[O-][N+](=O)OCC(CO[N+]([O-])=O)O[N+]([O-])=O,1 +CC(=C)C(=O)OCC(Br)CBr,1 +CN(C)CCNC(=O)C3=C2C=C1C=CC=CC1=NC2=CC=C3,1 +NC1=CC=C(C=C1)C=CC2=CC(=CC=C2)N,1 +CC1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +CCCCOC3=NC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCN(CC)CCCl,1 +OCC=CCl,1 +OCC(O)C(O)C(O)C(O)C1SCCN1N=O,1 +C1OC1COC2=NSC3=CC=CC=C23,1 +C1OC1COC2=CC=C(C=C2)CC3=CC=CC=C3,1 +CN(CCC#N)C1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +[O-][N+](=O)C1=CC(=C(C(=C1)[N+]([O-])=O)NC2=C(C=C(C=C2[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +C5CC1=C(C2=CC=C3C=CC=C4C=CC(=C1)C2=C34)C=C5,1 +CCCCOC1=CC=C(C=C1)N=O,1 +CC(C)(C)OCC1CO1,1 +OC6C=CC5=C3C1=CC=CC=C1C4=CC2=CC=CC=C2C(=C34)C=C5C6O,1 +CC1=CC4=C(C=C1)C3=CC2=CC=CC=C2C=C3C=C4,1 +[O-][N+](=O)C3=CC=C2[NH]C1=CC=C(C=C1C2=C3)[N+]([O-])=O,1 +NC1=C3C=CC=C4C=CC2=CC=CC(=C1)C2=C34,1 +CCBr,1 +C1COC1,1 +[O-][N+](=O)C1=C3C=CC=C4C=CC2=CC=CC(=C1)C2=C34,1 +C(CC1=CC=C(C=C1)C2=CC=CC=C2)C3CO3,1 +ClC(=O)C1=CC(=CC=C1)Cl,1 +CC(C)=CCC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=C4C(=C3)OC5OC=CC45O)O,1 +COC1=CC=C(C=C1)[N+]([O-])=O,1 +CC1(C)CC3=C(C1)C(C=O)C2(CC2(C)C3O)C=O,1 +[O-][N+](=O)C2=CC1=NC3=C(N=C1C=C2)C(=CC=C3)[N+]([O-])=O,1 +CC1=C(C=C(C=C1)N)N,1 +OC(=O)C1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CNC2=C1C(C3=C(C(C1=C(C=C2)NCCO)=O)C=CC=C3)=O,1 +[O-][N+](=O)C4=C3C1=CC=CC=C1C2=CC=CC5=C2C3=C(C=C4)C6OC56,1 +COC2=NSC3=CC=C(OCC1CO1)C=C23,1 +CCCC(=C)C=O,1 +C1=CC3=C(C=C1)C2=CC5=C(N=C2C=C3)C4=CC=CC=C4C=C5,1 +NC1=C(C=C(C=C1Br)[N+]([O-])=O)[N+]([O-])=O,1 +OCC1CO1,1 +ClC1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +O[N+]([O-])=C(Cl)Cl,1 +NC(=O)CNC(=O)C=[N+]=[N-],1 +OC2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3)=O,1 +CC1=C(C=C(C=C1)[N+]([O-])=O)N,1 +CC1=NC(=CN=C1)C,1 +NC3=C2C=C1C=CC=CC1=CC2=CC=C3,1 +NC1=CC=C(C=C1)C2=CC(=C(C(=C2)Cl)N)Cl,1 +BrCC(Br)COC(=O)C=C,1 +O=NC1=CC=C(C=C1)SC2=CC=CC=C2,1 +ClC(=O)C1=C(C=CC=C1)Cl,1 +NC1=CC=C(C=C1)OC2=CC=CC=C2,1 +O=CCCCC=O,1 +COC2=CC=C1OC(=CC1=C2N(CCCl)CCCl)[N+]([O-])=O,1 +C=CC(=O)OCC1CO1,1 +[NH]1N=NC2=CC=CC=C12,1 +OC3C=CC2=C(C1=CC=CC=C1C=C2C3O)[N+]([O-])=O,1 +COC1=C(C=C(C=C1)CC2=C(N=C(N=C2)N)N)OC,1 +CC(=O)NC3=C2C1=CC=CC=C1CC2=CC=C3,1 +CC1(CO1)C2CO2,1 +NC(=O)C1CO1,1 +NC(=S)NN=C1C=CC(C=C1)=NN=C(N)N,1 +ClC(C(Cl)=O)C1=CC=CC=C1,1 +NC1=CC=C(C=C1)N=NC2=CC=C(C=C2)N,1 +[O-][N+](=O)C1=CC=C(O1)C=NN2CCOC2=O,1 +[O-][N+](=O)C3=C2C=CC1=CC=CC4=C1C2=C(C=C3)C5OC45,1 +[O-][N+](=O)C3=CC2=NC1=CC=C(C=C1N=C2C=C3)[N+]([O-])=O,1 +NC2=C1N=C[N](C1=NC=N2)C3=CC=C(C=C3)[N+]([O-])=O,1 +C1=CN=C(C=C1)C2=NC(=CC=C2)C3=NC=CC=C3,1 +NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)Cl)Cl,1 +C[N]3C2=CC=C1N=CC=CC1=C2N=C3[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC(=CC=C2)[N+]([O-])=O,1 +CC2=C1C=CC=CC1=C(C3=CC=CC=C23)CBr,1 +NC1=CC=C(C=C1)C=C,1 +CC1=C(C=CC(=C1)Cl)N,1 +NC(CSC(Cl)=C(Cl)Cl)C(O)=O,1 +OCC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,1 +NC2=NC1=CC=CC=C1C=C2,1 +CCCCON=O,1 +[O-][N+](=O)C1=CC=C(C=C1)Br,1 +C[N]2C1=CC=CC=C1C(=C2C3=CC=CC=C3)N=NC4=[N+](C=CS4)C,1 +CC1=C(C(=C(C(=C1)N)C)[N+]([O-])=O)N,1 +OC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC=C2)C3=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC(=CC=C2C(=C3)[N+]([O-])=O)[N+]([O-])=O,1 +OCC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)COS(O)(=O)=O,1 +ClP(=O)(N1CCOC1=O)N2CCOC2=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=C(C=C2C3)[N+]([O-])=O,1 +OCCCCCl,1 +CC1=C(C=C(C=C1[N+]([O-])=O)N)[N+]([O-])=O,1 +CC(C)CON=O,1 +ClC2=C1C=CC=CC1=NC=C2,1 +[O-][N+](=O)C3=CC2=NC1=CC(=CC=C1N=C2C=C3)[N+]([O-])=O,1 +C1=C2C=CC3=CC=C4C=CC5=CC=C6C=CC(=C1)C7=C2C3=C4C5=C67,1 +NC(CS)C(=O)NCC(O)=O,1 +[O-][N+](=O)C1=CC(=CC=C1)C=O,1 +C[N]1C(=NC2=NC=C(C=C12)C3=CC=CC=C3)NO,1 +[O-][N+](=O)C5=CC=C4C3=C2C(=CC1=CC=CC=C1C2=CC=C3)C4=C5,1 +OS(=O)(=O)C1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2C3=O)[N+]([O-])=O,1 +ClCCNCCCl,1 +BrCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 +CC(C)(C1=CC=C(C=C1)OCC2CO2)C3=CC=C(C=C3)OCC4CO4,1 +CC(=O)NC1=CC=C(C=C1)C(=O)CCl,1 +CC3=C2[NH]C1=CC=C(N)C=C1C2=C(C)C4=CN=CC=C34,1 +NC1=CC=C(C=C1)SC2=CC=C(C=C2)N,1 +COC4=CC3=C1N=CC=C2C=C(C(C(=C12)C(=C3C=C4)O)=O)OC,1 +CC1(C)CC(N)CC(C)(C)N1O,1 +ClCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +[O-][N+](=O)C4=C2C=CC=C3C1=C(C=CC=C1C(=C23)C=C4)[N+]([O-])=O,1 +COC5=C2[C]1=C(C=C(C1=C(OC2=C4C3C=COC3OC4=C5)O)O)O,1 +CCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +COCC(O)C[N]1C=C(N=C1Cl)[N+]([O-])=O,1 +ClC1=CC=C(C=C1)CCC2CO2,1 +O=C2OC1=C(C=CC=C1)C=C2,1 +CC(O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +C1=CC2=CC=C3C=NC=C4C=CC(=C1)C2=C34,1 +CC2=C1C=CC=CC1=C(C3=CC=CC=C23)CCl,1 +OC5=CC4=C2C=C1C=CC=CC1=CC2=C3C=CC=CC3=C4C=C5,1 +[O-][N+](=O)C1=CC=C(C=C1)COC(=O)C2=CC=CC=C2,1 +CC(Br)C(N)=O,1 +[O-][N+](=O)C3=C2C(C(C1=CC=CC4=C1C2=C(C=C3)C=C4)=O)=O,1 +C[N]1C(=NC2=C1C=CC3=NC(=CN=C23)C)N,1 +NC4=C2C1=CC=CC=C1C3=CC=CC(=C23)C=C4,1 +C[N]2C=C1C=CC(=CC1=N2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O,1 +O=C3C2=C(C1=CC=CC=C1C=C2)C4=C3C=CC5=C4C=CC=C5,1 +OC2=C1N=CC=CC1=C(C=C2)S(O)(=O)=O,1 +OC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)O)O)C3=O,1 +CN(CCCC(=O)C1=CN=CC=C1)N=O,1 +CN(C)C3CC2=C1C(=CC=CC1=CC=C2)C3,1 +CC4=C3C2=CC=C1C=CC=CC1=C2C=CC3=CC=C4,1 +CCN(N=O)C(N)=O,1 +CN(C)C1=CC=C(C=C1)N=NC3=CC=C2[NH]N=CC2=C3,1 +CC1=C(C=CC=C1)C2=CC(=C(C=C2)N)C,1 +C1OC1COC3=C2SN=CC2=CC=C3,1 +ONC1=CC=C(C=C1)[N+]([O-])=O,1 +COC1=C(C=C(C(=C1)N)[N+]([O-])=O)N,1 +CN(C)C(=O)N(C)C=O,1 +ClC(Cl)C(C=O)=C(Cl)Cl,1 +NC1=CC(=CC=C1)N,1 +CC4=CC3=C(C2=CC=C1C=CC=CC1=C2N=C3C(=C4)C)C,1 +CC(=O)NC1=C(C=C(C=C1)CC2=CC(=C(C=C2)N)Cl)Cl,1 +CC(=O)NC1=CC=C(C=C1)NC2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(C=C1)OC2=CC=C(C=C2)N=C=S,1 +CC1=CC=C(C=C1)N(CCO)CCO,1 +CC1=CC=C(C=C1)C=CC2=CC=C(C=C2)N,1 +[O-][N+](=O)C2=C3C=CC4=CC=C(C5=C1CCCCC1=C(C=C2)C3=C45)[N+]([O-])=O,1 +CC(=O)OCC1=CC=CO1,1 +NC1=C(C(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O)O,1 +NC3=C2C(=C1C=CC=CC1=C(C2=C(C=C3)N)O)O,1 +CC(=O)C1=CC=CO1,1 +CN(N=O)C(N)=O,1 +C1C5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 +[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=C(C=C2)[N+]([O-])=O)O3,1 +OC(=O)C1=C(C(=C(O1)[N+]([O-])=O)C2=CC=CC=C2)C3=CC=CC=C3,1 +CC4=C(C=C3C(=C2C=CC1=CC=CC=C1C2=NC3=C4)C)C,1 +NC2=C1[NH]C=NC1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O,1 +BrCC(Br)C=O,1 +[O-][N+](=O)C2=C1C=CC=CC1=CC3=CC=CC=C23,1 +OC1=CC=C(C=C1)C2=CC=CC=C2,1 +CC(=O)C=CC1=CC=CC=C1,1 +CC2=C4C1=CC=CC=C1C=C5C=CC3=CC=CC(=C2)C3=C45,1 +CC1=CC=C(C=C1)N(N)C2=CC=C(C=C2)C,1 +COC1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +CC1=C4C(=CC=C1)C3=CC2=CC=CC=C2C=C3C=C4,1 +CCC1(C(=O)NCNC1=O)C2=CC=CC=C2,1 +C2=CC1=CC4=C(C=C1C=C2)C3=CN=CC=C3C=C4,1 +O=S1(=O)CCCO1,1 +CNC(=O)NOC(=O)NC,1 +OC1=CC4=C(C=C1)C5=C2C=CC=CC2=CC6=C3C=CC=CC3=CC4=C56,1 +COC2=C1C(C5=C(OC1=CC4=C2C3C=COC3O4)C(=CC=C5O)CCC(C)(C)O)=O,1 +[O-][N+](=O)C4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4,1 +CC3=C1C4=C(C=CC1=C2C=CC=CC2=C3)C(O)C(O)C5OC45,1 +NC2=CC1=CC=CC=C1N=C2,1 +CC4=CC3=C2C=C1C=CC=CC1=CC2=CC=C3C=C4,1 +ClCBr,1 +ClC(Cl)(Cl)C1CO1,1 +[O-][N+](=O)C1=CC(=C(C=C1)C=O)[N+]([O-])=O,1 +CC(C)=CCOC2=C1OC=CC1=CC3=C2OC(C=C3)=O,1 +CC1CC(=O)O1,1 +OCC1=C(C3=C(C=C1O)C(=O)C2=C(C=CC=C2)C3=O)O,1 +[O-][N+](=O)C1=C3C(=CC=C1)C2=C(C=CC=C2C(=C3)[N+]([O-])=O)[N+]([O-])=O,1 +CCC(C)COC(=O)C=CC1=CC=C(C=C1)N=CC2=CC=C(C=C2)OC,1 +C3=CC2=CC1=CC=CC=C1C=C2C=C3,1 +CCCC(=O)C1=C(C=C(C(=C1)O)O)O,1 +CCN(CCCl)C1=CC=C(C=C1)OCCCCCNC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +CC(=O)N(O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +O1C=CC2=CC3=CC=C4C=CC=C5C=CC(=C12)C3=C45,1 +OC1OC(=O)C(=C1CCl)Cl,1 +NC1=CC=C(C=C1)C=CC2=CC(=CC=C2)Cl,1 +CCOC(=O)C(C)Br,1 +COC1=NSC2=CC(=CC=C12)OCC3CO3,1 +COC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,1 +COC1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +CC1CN(CC(C)O1)N=O,1 +O=CC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +CN(C(=O)C1=CSC(=C1)[N+]([O-])=O)C2=CC=CC=C2,1 +NC2=C1C(C3=C(C(C1=CC=C2)=O)C(=CC=C3)N)=O,1 +NC1=C(C=C(C=C1)[N+]([O-])=O)N,1 +O1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +NC1=C(C=C(C=C1)C2=CC(=C(C(=C2)Cl)N)Cl)Cl,1 +C1OC1COC2=CC=C(C=C2)C3=CC=CC=C3,1 +CCCSC(Cl)=O,1 +CC3(C)CC2C=C(C=O)C14CC1(C2C3)C(=O)OC4O,1 +NC2=C1C=C(C=CC1=NC3=CC=CC=C23)O,1 +CC(=O)NC1=CC(=C(C=C1)C)N,1 +CN(CC1=CC=C(C=C1)F)N=O,1 +CC(=C)C(=O)OCC1CO1,1 +CC1=C(C(=CC=C1N)N=NC2=CC=CC=C2)N,1 +CC1=C(C=C(C=C1)[N+]([O-])=O)N=O,1 +ClCC2=C1C=CC=CC1=C(C3=CC=CC=C23)CCl,1 +CCC(COC(=O)C=C)(COC(=O)C=C)COC(=O)C=C,1 +NC2=CC1=CC=CC=C1C=C2,1 +CCCON=O,1 +COC1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +NC3=CC=C2[NH]C1=CC=CC=C1C2=C3,1 +CNC(=O)OC1=C(C=CC=C1)OC(C)C,1 +CC1=C3C(=C(C(=C1)[N+]([O-])=O)C)C2=CC=CC=C2[NH]3,1 +COC1=CC(=C(C=C1)N)C,1 +C1=CC=C4C(=C1)C=C3C2=C(C=CC=C2)C5=C3C4=CC=C5,1 +ClCC=C,1 +CC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)CBr,1 +O=C1C=CC4=C2C1=CC=C3C=CC(C(=C23)C=C4)=O,1 +CC(=O)C(Cl)(Cl)Cl,1 +OC(=O)C1=CC(=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +COC3=C1C=COC1=NC4=CC2=C(OCO2)C=C34,1 +[O-][N+](=O)C4=C3C1OC1C2=CC=CC5=C2C3=C(C=C4)C=C5,1 +NC(CCC(=O)NC(CSN=O)C(=O)NCC(O)=O)C(O)=O,1 +OC1CCOP(=O)(N1)N(CCCl)CCCl,1 +C[N]3C2=CC=C1C=CC=CC1=C2C4=C3C=CC5=CC=CC=C45,1 +NC2=C1C=C(C=CC1=NC3=CC=CC=C23)Cl,1 +NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)N)N,1 +CC1=C(C(=CC=C1)N)C,1 +OC5=C4C=C3C1=CC=CC=C1C2=CC=CC=C2C3=CC4=CC=C5,1 +OCC(C(Cl)Cl)=C(Cl)C(O)=O,1 +N(N=NC1=CC=CC=C1)C2=CC=CC=C2,1 +C[N]1C=NC(=C1C(=O)N(C)N=O)N(C)N=O,1 +CCCCN(CC(O)C1=CC(=[N+]=[N-])C(=O)C=C1)N=O,1 +CN1CC(O)C4=C2C1CC5=C(C2=C3OCOC3=C4)C=CC=C5,1 +[O-][N+](=O)C1=CC(=C(C=C1)C2=CC=CC=C2)[N+]([O-])=O,1 +OC2=C1C(C=CC(C1=C(C=C2)O)=O)=O,1 +OC2C=CC1=CC5=C4C(=C1C2O)C3=CC=CC=C3C4=CC6=CC=CC=C56,1 +COC2=C1C=COC1=NC3=CC=CC=C23,1 +CCCCCCN(N=O)C(N)=N[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C2=CC=C(C=C2)[N+]([O-])=O,1 +NC1=CC3=C(C=C1)C(=O)C2=C(C=CC(=C2)N)C3=O,1 +CC(=O)NC3=C(C=C2C1=CC=CC=C1CC2=C3)Cl,1 +C1=CC5=C(C=C1)C4=C2C=CC3=CC=CC(=C23)C=C4C=C5,1 +[O-][N+](=O)C1=CC3=C2C1=CC=CC2=CC=C3,1 +COC2=CC=C1[N](C)C(=NC1=C2)N,1 +COC1=CC(=C(C=C1)N)OC,1 +CCNC1=C(C=CC(=C1)O)C,1 +OC5C1OC1C4=C(C3=CC=C2C=CC=CC2=C3C=C4)C5O,1 +[O-][N+](=O)C1=CC3=C2C1=CC=CC2=CC5=C3C4=CC=CC=C4C=C5,1 +OC1OC(=O)C(=C1Cl)Cl,1 +CC(=O)NC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +CN(C)CCNC(=O)C3=C2N=C1C=CC=CC1=CC2=CC=C3,1 +NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CC(CC1=CC(=C(C=C1)O)O)(NN)C(O)=O,1 +ClCC(Br)CCl,1 +CC4=CC3=NC2=C1C=CC=CC1=CC=C2C(=C3C=C4)C,1 +CC(=O)OCC2=C1C=CC=CC1=C(C3=CC=CC=C23)C,1 +CCCCC(CC)COCC1CO1,1 +COC4=CC=C3C(=O)C2=C1C(=NC=CC1=CC(=C2OC)OC)C3=C4,1 +CC(O)CBr,1 +COC(=O)C12CC1(C=O)C(C=O)C=C3CC(C)(C)CC23,1 +[O-][N+](=O)C3=CC=C2OC1=CC=C(C=C1C2=C3)[N+]([O-])=O,1 +NC2=C1N=C[N](C1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4CC(O)C(CO)O4,1 +C3CC2=C(C1=NC=CC=C1C=C2)C4OC34,1 +CCOP(=O)(OCC)N1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +NC1=CC=C(C=C1)SC2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C3=C([N]2CCSC2=N3)[N+]([O-])=O,1 +OC5=C4C1=CC=CC=C1C3=CC2=CC=CC=C2C=C3C4=CC=C5,1 +CC1=C(C=CC=C1)N,1 +O1C4C1C3=C(C=C2C=CC=CC2=C3)C5=C4C=CC=C5,1 +N1C4C1C3=C(C=C2C=CC=CC2=C3)C5=C4C=CC=C5,1 +OC1CC(=O)C5=C4C1(C2CCC(C3=C(C=CC(=C23)C4=CC=C5O)O)=O)O,1 +OC(=O)C1=CC=C(O1)[N+]([O-])=O,1 +O=C(OCC1CO1)C2=CC(=CC=C2)C(=O)OCC3CO3,1 +ClC(Cl)=C1OC(=O)C=C1,1 +[O-][N+](=O)C3=C1C=CC2=CC=CC(=C12)C=C3,1 +C[N]1C(=NC2=C1C=CC3=NC=CC=C23)NO,1 +OC1=CC=C(C=C1)C3OC2=C(C(=CC(=C2)O)O)C(=O)C3=O,1 +OCC(CO)(CBr)CBr,1 +FC5=C3C=CC=C4C2=CC1=CC=CC=C1C=C2C(=C34)C=C5,1 +BrCCOC(=O)C=C,1 +[O-][N+](=O)C3=C2C=CC1=CC=CC4=C1C2=C(C=C3)OC4=O,1 +[O-][N+](=O)C1=CC2=C(C=C1)CCN2,1 +COC3=C2N=C1C=CC=CC1=C(C2=CC=C3)NCCCNCCCl,1 +[O-][N+](=O)C2=NC1=CC=CC=C1[NH]2,1 +COC(=O)C4=C2C(=CC1=C(C=CC=C1C2=C3OCOC3=C4)OC)[N+]([O-])=O,1 +CCOCC1=C(C3=C(C=C1O)C(=O)C2=C(C=CC=C2)C3=O)O,1 +NC1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,1 +COC3=CC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCNCCCl,1 +C1CN1C2=NC(=NC(=N2)N3CC3)N4CC4,1 +CC3=C(C=C2C(=C1C=CC=CC1=C(C2=C3)C)C)C,1 +CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)C)[N+]([O-])=O,1 +CC(=O)OCC1=C4C(=C(C2=CC=CC=C12)C)C3=CC=CC=C3C=C4,1 +CC4=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C=C4,1 +OC4C=CC3=C(C2=CC=C1C=CC=CC1=C2C=C3[N+]([O-])=O)C4O,1 +OC(=O)C4=CN(C1CC1)C2=C(C=C(C(=C2)N3CCNCC3)F)C4=O,1 +CC1=C(C=CC=C1)OCC2CO2,1 +[O-][N+](=O)C1=C(C=C(C=C1)Cl)Cl,1 +COC1=CC2=C(C(=C1)O)C(C(C(O2)C3=CC(=C(C=C3)O)O)=O)=O,1 +CCCCC1C(=O)N(N(C1=O)C2=CC=C(C=C2)O)C3=CC=CC=C3,1 +CCN(CC)C1=CC=C(C=C1)C2=CC=C(C=C2)C3=CC=C(C=C3)N(CC)CC,1 +NC3=CC2=CC1=CC=CC=C1N=C2C=C3,1 +[O-][N+](=O)C1=C(C=CC(=C1)Cl)Cl,1 +ONC1=C(C=CC=C1)C2=CC=CC=C2,1 +NC2=NC1=CC(=CC=C1[NH]2)C#N,1 +CC1=CC=C2C(=C1)C=CC3=C2C4=C([NH]3)C=CC5=C4C=CC=C5,1 +CC1=C(C=C(C=C1N)[N+]([O-])=O)N,1 +CC(=O)NC1=C(C=C(C=C1)CC2=CC(=C(C=C2)NC(C)=O)Cl)Cl,1 +C=CC1CO1,1 +C1=CC5=C(C=C1)C4=NC3=C2C=CC=CC2=CC=C3C=C4C=C5,1 +CC(=O)NC1=CC3=C(C=C1)C2=CC=C(C=C2C3)NC(C)=O,1 +[O-][N+](=O)C2=C3C=CC4=C1C=CCCC1=CC5=CC=C(C=C2)C3=C45,1 +CCN1CCN(CC1)C3=C(C=C2C(C(=CN(C2=C3)C4CC4)C(O)=O)=O)F,1 +OC3C=CC2=C1C=CC=CC1=CC=C2C3O,1 +CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)C(O)=O,1 +[O-][N+](=O)C1=C2C5=C(C3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O)CCCC5,1 +OC2=C1C(C3=C(C(C1=C(C=C2)O)=O)C=CC=C3)=O,1 +CC(C)CCON=O,1 +OC3=C2C(=C1C=CC=CC1=C(C2=C(C=C3)O)O)O,1 +CCN(CC)CCCC(C)NC2=C1N=CC=CC1=CC(=C2)OC,1 +COC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,1 +CN(C)C1=CC=C(C=C1)N=NS(O)(=O)=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC(=CC=C2O3)[N+]([O-])=O,1 +CCN(CCO[N+]([O-])=O)[N+]([O-])=O,1 +OC(=O)C4=C2C(=CC1=CC=CC=C1C2=C3OCOC3=C4)[N+]([O-])=O,1 +CCC(=O)C=C,1 +ClCCOC(=O)C=C,1 +CCC(O)C=CC=CC=CC=CC=O,1 +NC2=C1C(C3=C(C(C1=C(C=C2)N)=O)C=CC=C3)=O,1 +[O-][N+](=O)C1=CC=C(O1)C=N[N]2C=CC=N2,1 +[O-][N+](=O)C3=CC=C2C(=O)C1=CC=CC=C1C2=C3,1 +CC(C)OCC1CO1,1 +CC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +N1C2C1C6=C4C3=C2C=CC=C3C=CC4=C5C=CC=CC5=C6,1 +ClC1CN(CC1Cl)N=O,1 +NNC(=O)C1=CC=NC=C1,1 +CCCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +O=NC1=CC=C(C=C1)C2=CC=CC=C2,1 +CC2=CC1=C3C=CC4=CC=CC5=CC=C(C=C1C=C2)C3=C45,1 +[O-][N+](=O)C4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 +C[N]1C(=NC2=CC(=CC=C12)C#N)N,1 +[N-]=[N+]=NCCC1=CC=CC=C1,1 +CC4=C3C2=CC1=CC=CC=C1C=C2C=CC3=CC=C4,1 +CC1=C(C=C(C(=C1)S(O)(=O)=O)N)Cl,1 +OCC1OC(CC1O)N2C=C(CO)C(=O)NC2=O,1 +C1=CC2=C(C=C1)C5=C(C=C2)C4=CC=C3C=CC=CC3=C4C=C5,1 +C1=CC2=C(C=C1)C3=CC5=CC=CC6=CC=C4C=CC2=C3C4=C56,1 +COC1=CC4=C3C(=C1OC)C2=CC5=C(C=C2CC3N(CC4)C)OCO5,1 +NC1=C(C(=CC(=C1)[N+]([O-])=O)Cl)O,1 +[O-][N+](=O)C1=CC=C(O1)C=C(C#N)C#N,1 +CCCCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CC(=O)C1=CC=C(C=C1)[N+]([O-])=O,1 +CCCC=CC=O,1 +CC1=CC(=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +CN(N=O)N(C1=CC=CC=C1)C(=O)C(=NO)C(C)=O,1 +O=NN1CCCCCC1,1 +CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)COC(C)=O,1 +CC(C)(COCC1CO1)COCC2CO2,1 +ClC1=C(Cl)C(=O)OC1,1 +COC2=NSC3=C(OCC1CO1)C=CC=C23,1 +O=C1NC4=C2C1=CC5=C(C2=C3C=CC=CC3=C4)OCO5,1 +NC1=C(C=CC(=C1)[N+]([O-])=O)O,1 +CC3=CC2=C(C1=CC=CC=C1N=C2C=C3)N,1 +CC=CCC=O,1 +OS(=O)(=O)C3=C2C(C1=CC=CC(=C1C(C2=CC=C3)=O)[N+]([O-])=O)=O,1 +OCCNC(=O)N(CCCl)N=O,1 +CN(CC1=CC=C(C=C1)Cl)N=O,1 +[N-]=[N+]=NC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +CC(=O)CN(COC(C)=O)N=O,1 +C=CCOCC1CO1,1 +NC1=CC=C(C=C1)CC2=CC(=C(C=C2)N)CC3=CC=C(C=C3)N,1 +O=NC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +CCOC(N)=O,1 +OC(=O)C2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 +NC1=CC=C(C=C1)F,1 +CC4=C1C=CC=CC1=C3C=C2C=CC=CC2=CC3=C4,1 +C=CCN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +CCCN(CCC)N=O,1 +CC(C)CN(N)CC(C)C,1 +NC1=C(C=CC=C1)S(O)(=O)=O,1 +ClC1=CC=C(C=C1)CC2CO2,1 +O=C2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3,1 +CN(C=O)N=O,1 +CC(O)CCl,1 +CC(=O)NC3=C2C=CC1=CC=CC4=C1C2=C(C=C3)C(=O)C4=O,1 +[O-][N+](=O)C2=CC1=CC=CC=C1C=C2,1 +[O-][N+](=O)C3=C2C=CC1=CC=CC=C1C2=CC=C3,1 +OCC1=CC=C(O1)C=O,1 +NC1=C3C(=CC=C1)C2=CC=CC=C2C3,1 +ClC3=C2C=CC1=CC=CC=C1C2=CC4=CC=CC=C34,1 +O1C2C1C5=C3C2=CC=CC3=CC6=C4C=CC=CC4=CC=C56,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +CC1=CC3=C(C(=C1)C)C2=CC=CC=C2C=C3,1 +CC1=C(C(=CC=C1)NO)C,1 +BrCCC(=O)N1CCN(CC1)C(=O)CCBr,1 +CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)[N+]([O-])=O,1 +CC2C1=C(C=CC=C1)C3=C2C(=CC=C3)C,1 +CC1=C(C(=CC=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CC1=CC(=O)OC2=C1C=C3CCCN4CCCC2=C34,1 +NC1=CC=C(C=C1)C2=CC=C(C=C2)[N+]([O-])=O,1 +COC2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3)=O,1 +[O-][N+](=O)C1=CC=C(C=C1)[N+]([O-])=O,1 +NC1=CC=C(C=C1)CCC2=CC=CC=C2,1 +C1=CC3=C(C=C1)C4=CC=C5C=CC=C6C2=CC=CC=C2C(=C3)C4=C56,1 +COC(=O)NC(=S)NC1=C(C=CC=C1)NC(=S)NC(=O)OC,1 +O=N[N]1C=C(CC#N)C2=CC=CC=C12,1 +COC(=O)C1=NC(=C3C(=C1)C2=CC=CC=C2[NH]3)C4=NC5=C(C=C4)C(=O)C=CC5=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +COCC=O,1 +CC1=C(C=CC=C1)C(Cl)=O,1 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)OC3=CC=C(C=C3)N,1 +OC1=NSC2=CC(=CC=C12)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC5=C2C1=CC=CC2=C4C=C3C=CC=CC3=CC4=C5,1 +NC3=C2C1=CC=CC=C1CC2=CC=C3,1 +C3C=CC4=C2C1=CC=CC=C1C=CC2=CC=C34,1 +CC(=O)C1=CC=C[N]1[N+]([O-])=O,1 +NC1=CC(=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)N)[N+]([O-])=O,1 +O=C2C1=C(C=CC=C1)C4=C3C2=NC=CC3=CC5=C4OCO5,1 +COC6=C2[C]1=CC=C(C1=C(OC2=C5C4C3OC3OC4OC5=C6)O)O,1 +CC1=C(C=CC=C1)N=NC3=C2C=CC=CC2=CC=C3O,1 +OC(=O)C=CC1=CC=C(C=C1)[N+]([O-])=O,1 +[O-][N+](=O)C1=C([NH]C=N1)C2=CC=CC=C2,1 +ClCCNP1(=O)OCCCN1CCCl,1 +NC(CSCCCl)C(O)=O,1 +[O-][N+](=O)C1=C(N=C2SCC[N]12)C3=CC=C(C=C3)Cl,1 +CC1=CC=C[N]2C1=NC3=C(C)C(=CN=C23)NO,1 +CC3=C2C1NC1C5=C(C2=CC4=CC=CC=C34)C=CC=C5,1 +[O-][N+](=O)C3=C1C=CC=C2C=CC(=C12)C=C3,1 +CC1=CC=C(C=C1)[N+]#N,1 +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)OC)N,1 +CC1=C(C=CC=C1)OP(=O)(OC2=C(C=CC=C2)C)OC3=C(C=CC=C3)C,1 +[O-][N+](=O)C3=C2OC(C1=CC=CC4=C1C2=C(C=C3)C=C4)=O,1 +NC4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4,1 +CC[N+](CC)=C4C=CC3=NC2=C1C=CC=CC1=C(C=C2OC3=C4)N,1 +C[N]2C1=CC=CC=C1N=C2[N+]([O-])=O,1 +ClCCN(N=O)C(=O)NC1CCCCC1,1 +CC1=C3C(=C(C(=C1)[N+]([O-])=O)C)C2=CC(=CC=C2[NH]3)O,1 +NC1=CC=C(C=C1)C2=CC(=C(C=C2)N)[N+]([O-])=O,1 +OC1=C(C(=CC=C1)O)O,1 +C=CC(=O)N(CC1CO1)CC2CO2,1 +NC3=C1C=CC=CC1=C2C=CC4=C(C2=C3)C=CC(O)C4O,1 +CC1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +OC1C(O)C4=C3C2=C1C=CC=C2C=CC3=C(C=C4)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC(=CC=C1)C(Cl)=O,1 +CC=CC=CC=O,1 +OC2=CC1=CC=CC=C1C(=C2)O,1 +CCCOC=CC=CC=CC=CC=CCC,1 +[O-][N+](=O)C1=CC(=CC(=C1)C(Cl)=O)[N+]([O-])=O,1 +OCC4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 +CC(C)=CC(C)=NNC2=C1C=CC=CC1=CN=N2,1 +C1CSCSC1,1 +CC2=C1C=CC=CC1=C(C3=CC=CC=C23)C,1 +NC1=C(C=C(C=C1)OC2=CC(=C(C=C2)N)Cl)Cl,1 +NC3=CC2=NC1=CC=CC=C1C=C2C=C3,1 +CC(=O)C1=C(C(=C(C=C1)Cl)Cl)Cl,1 +[O-][N+](=O)C2=C3C1=CC=CC=C1C4=CC=CC5=CC=C(C=C2)C3=C45,1 +COC4=C1C5=C(C(OC1=C3C2C=COC2OC3=C4)=O)C(OCC5)=O,1 +O4C5=C1C=CC=CC1=C3C=C2C=CC=CC2=CC3=C45,1 +NC(CN=[N+]=[N-])C(O)=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C(Cl)=O,1 +O=C4OC1=C(C=C2CCCN3CCCC1=C23)C=C4,1 +CC(=C)C=O,1 +[O-][N+](=O)C1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)C=CCC5,1 +OC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)O,1 +[O-][N+](=O)C1=C(C(=C(O1)C(=O)CBr)Cl)Cl,1 +CC1=C(C=C(C(=C1)N)C)N,1 +[O-][N+](=O)C1=C(C=CC=C1)CCl,1 +OC1=C(C=C(C=C1Cl)Cl)S(=O)C2=C(C(=CC(=C2)Cl)Cl)O,1 +OC(=O)CNC(=O)C1=CC=C(C=C1)[N+]([O-])=O,1 +O1C4C1C3=C(C2=CC=CC=C2C=C3)C5=C4C=CC=C5,1 +BrCCOC(=O)C(=O)OCCBr,1 +C2CC1OC1CC2C3CO3,1 +OC6=CC=C5C1=C2C(=CC3=CC=CC4=CC=C(C=C1)C2=C34)C5=C6,1 +NC1=C(C=C3C(=C1)C2=CC=CC=C2[NH]3)[N+]([O-])=O,1 +[O-][N+](=O)C3=CC(=C2C1=C(C=C(C=C1C(C2=C3)=O)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +[O-][N+](=O)C1=C(C(=C(O1)C(=O)CBr)C2=CC=CC=C2)C3=CC=CC=C3,1 +[O-][N+](=O)C2=C3C=CC4=C1CCCCC1=CC5=CC=C(C=C2)C3=C45,1 +CC1=C3C(=CC=C1)C2=CC=CC=C2C=C3,1 +CC1=C2C(=C(C=C1)C)C3=C(C=C2)C(O)C(O)C4OC34,1 +COC1=CC3=C(C(=C1)O)C(=O)C2=C(C(=CC=C2O)O)O3,1 +CC[N]1C(=NC2=C1C=CC3=NC(=CN=C23)C)N,1 +CC(C)COC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CC5=C3CCC4=C2C1OC1C6=C(C2=CC(=C34)C=C5)C=CC=C6,1 +OCN1C(O)C(O)N(CO)C1=O,1 +CCC(C)NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CC1(CO1)C(=O)NCC2=CC=CC=C2,1 +NC1=CC=C(C=C1)CC(O)=O,1 +[O-][N+](=O)C2=CC(=C1C=CC=CC1=C2)[N+]([O-])=O,1 +CC2=CC3=CC=C4C1=CC=CC=C1C=C5C=CC(=C2)C3=C45,1 +NC(CCC(=O)NC(CSC(=O)NCCCl)C(=O)NCC(O)=O)C(O)=O,1 +NC1=CC=C(C=C1)CCC2=CC=C(C=C2)N,1 +CC(C)(O)CCC2=C1OC5=C(C(C1=C(C=C2)O)=O)C(=C4C3C=COC3OC4=C5)O,1 +CCOP(=O)(OCC)OC1=NC(=NC(=C1)C)C(C)C,1 +CCCCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +ClCCN(CCCl)C2=CC1=CC=CC=C1C=C2,1 +CC(=O)OCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 +C[N]1C(=NC2=CC=C(C=C12)C#N)N,1 +COC(=O)C12OC1(C)C(O)(NC2=O)C(C)C,1 +NC2=CC1=NC=CC=C1C=C2,1 +CC1=CC=C(C=C1)OCC2CO2,1 +CC1CNC(=O)N1C2=NC=C(S2)[N+]([O-])=O,1 +ClC(Cl)(Cl)CC1CO1,1 +NC1=CC=C(C=C1)[N+]([O-])=O,1 +ClCCNC(=O)SC2=C1[NH]C=NC1=NC=N2,1 +CC(=O)C1=C(C(=C(O1)[N+]([O-])=O)Cl)Cl,1 +CC(=O)N(O)C1=CC=C(C=C1)SC2=CC=CC=C2,1 +OC1CC=CC2=C3C=CC4=CC=CC5=CC=C(C=C12)C3=C45,1 +COC(=O)C(Cl)Cl,1 +COC5=C2[C]1=CC=C(C1=C(OC2=C4C3(C=COC3OC4=C5)O)O)O,1 +[O-][N+](=O)C1=CC2=C(C=C1)C(=CC3=C(C=CC=C23)[N+]([O-])=O)[N+]([O-])=O,1 +OC2=C1C=CC(C(C1=C(C3=CC=CC=C23)O)=N)=N,1 +NC1=C(C=C(C=C1)Cl)N,1 +CC(=O)NC1=C2C=CC3=CC=C(C4=CC=C(C=C1)C2=C34)O,1 +CC1=C(C=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC2=C(O1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2S3,1 +CC(=O)C1=CC=C(C=C1)NO,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)COC(C)=O,1 +CN(COC(C)=O)N=O,1 +CC(Br)C(=O)NCC1=CC=CC=C1,1 +OC5C=CC4=C(C3=CC2=C1C=CC=CC1=CC=C2N=C3C=C4)C5O,1 +CC(=O)NC1=CC=C(C=C1)C=N[N]3N=N[C]2=CC=NC2=C3O,1 +[O-][N+](=O)C1=CC=C(C=C1)SC2=CC=CC=C2,1 +ClC(Cl)(Cl)SN2C(=O)C1CC=CCC1C2=O,1 +O=CNC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +BrCCBr,1 +CCOC(=O)CNC(=O)C=[N+]=[N-],1 +O1C2C1C7=C5C3=C2C=CC=C3C=C6C4=CC=CC=C4C(=C56)C=C7,1 +CC(=O)NC2=CC1=NC=CC=C1C=C2,1 +NC3=CC2=NC1=CC(=CC=C1N=C2C=C3)N,1 +C[N]2C(=NC3=NC1=CN=CC=C1C=C23)N,1 +C1=CC=C2C(=C1)C=CC3=C2C4=CC=CC5=CC=CC3=C45,1 +ClC3=C1C=CC=CC1=C2C=CC=CC2=C3,1 +CC1CCC(CC1)NC(=O)N(CCCl)N=O,1 +COC(=O)C12OC1(C)C(C)(O)NC2=O,1 +CC1=C3C(=C(C(=C1)[N+]([O-])=O)C)C2=CC(=CC=C2[NH]3)[N+]([O-])=O,1 +[O-][N+](=O)C2=C3C=CC4=CC=CC5=C1C=CC=CC1=C(C=C2)C3=C45,1 +OCCCl,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 +NC1=C(C(=CC=C1)[N+]([O-])=O)N,1 +CCN(CCCl)CCCNC3=C2C=CC1=CC=CC=C1C2=NC4=CC=CC=C34,1 +CC2=C1C=CC=CC1=C(C=C2)[N+]([O-])=O,1 +O1C2C1C5=C4C2=CC3=CC=CC=C3C4=CC6=CC=CC=C56,1 +CN(C)CCCNC1=C3C(=NC2=CC=CC=C12)C(=CC=C3)[N+]([O-])=O,1 +CC1=C(C=C(C(=C1)C)N)C,1 +OC4C=CC3=C2C=C(C1=CC=CC=C1C2=CC=C3C4O)[N+]([O-])=O,1 +CC1=C(C(=CC=C1)C)NO,1 +[O-][N+](=O)C3=C1C=CC=C2CCC(=C12)C=C3,1 +COC(=O)C1=C(C=CC(=C1)C2=CC(=C(C=C2)N)C(=O)OC)N,1 +CC(=O)N(OC1OC(CO)C(O)C(O)C1O)C2=CC=C(C=C2)OC3=CC=C(C=C3)Cl,1 +CCCC(=O)OCC1=CC=C(C=C1)[N+]([O-])=O,1 +CC(C)NC(OCC1=CC=C(C=C1)[N+]([O-])=O)=NC(C)C,1 +C1=CC4=C(C=C1)C3=CC=C2N=CC=CC2=C3C=C4,1 +C[N+](C)(C)CCNCCC1=CC=C(C=C1)N=NC2=C(C=C(C=C2)[N+]([O-])=O)Cl,1 +[O-][N+](=O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +O=C(OCC1CO1)C2CCCCC2C(=O)OCC3CO3,1 +[O-][N+](=O)C3=CC2=C1C=C(C=CC1=C(C=C2C=C3)[N+]([O-])=O)[N+]([O-])=O,1 +CCN(CC)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C2=CC=C3C1=C(C=CC=C1)C4=C(C=CC5=CC=C2C3=C45)[N+]([O-])=O,1 +NC(CSC(Cl)=CCl)C(O)=O,1 +CCOP(=O)(OCC)C(C)NC(=O)N(CCCl)N=O,1 +OCC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC=C2O)C3=O,1 +CC1=C(Cl)C(=O)OC1O,1 +C1=CC3=C(C=C1)C2=CC5=C4C(=C2C=C3)C=CC=C4C=C5,1 +NC2=C1N=C[N](C1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4=CC=C(C=C4)[N+]([O-])=O,1 +O=C3C(C2=NC1=CC=CC=C1C=C2)C(=O)C4=C3C=CC=C4,1 +O=C2C=CC1=C(C=CC=C1)C2=O,1 +CC(C)(C)ON=O,1 +COC1=C(C=CC(=C1)[N+]([O-])=O)NC(C)=O,1 +OC1=C3C(=CC=C4C=CC2=CC=CC(=C1)C2=C34)[N+]([O-])=O,1 +CC1CC(OC(C)O1)OC(C)=O,1 +CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)NC4=CC=CC=C4,1 +CC(=O)C1=C(C=C([N]1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +ClC1=C(Cl)C(=O)C(=C(Cl)C1=O)Cl,1 +NC1=C(C=CC(=C1)[N+]([O-])=O)C2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C2C=CC3=[N+](C5=C(C4=CC=C1C2=C34)C=CC=C5)[O-],1 +OC1=CC3=C(C=C1)C2=CC=C(C=C2C3)[N+]([O-])=O,1 +C[N]1C=NC(=C1[N+]([O-])=O)C2=CC=CC=C2,1 +CN(CC(C)=O)N=O,1 +ClN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +SC2=C1[NH]C=NC1=NC=N2,1 +CC1CN1,1 +ONC3=CN=C2[N]1C=CC=CC1=NC2=C3,1 +COC1=C(C=C(C=C1)CC2CO2)OC,1 +C1=CC2=CC=C3C6=C5C(=C4C=CC(=C1)C2=C34)C=CC=C5C=C6,1 +CCCCOC3=NC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCNCCCl,1 +C[N]2C(=NC3=C1C=CC=NC1=CC(=C23)C)N,1 +OC(=O)CN(CC(O)=O)N=O,1 +CCOC1=CC=C(C=C1)N=O,1 +OS(=O)(=O)OCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +COC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +C[N+]2=C1C=CC=C(C1=CC3=CC=CC=C23)N,1 +C[N]1C(=NC2=C1C=CC3=NC=CC=C23)NC(C)=O,1 +OC2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3O)=O,1 +COC1=CC4=C(C(=C1)OC2OC(CO)C(O)C(O)C2O)C(=O)C3=C(C(=CC=C3O)O)O4,1 +CCC[N]3C=C2CC1C(CC(C)CN1C#N)C4=C2C3=CC=C4,1 +[O-][N+](=O)C4=C2C1=CC=CC=C1C3=CC=CC(=C23)C=C4,1 +C[N]2C(=NC3=CC=C1N=CC=CC1=C23)N,1 +O=C1CCO1,1 +NC4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 +[O-][N+](=O)C1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,1 +O=NC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)F)F,1 +C(OCC2=C1C=CC=CC1=CC=C2)C3CO3,1 +[O-][N+](=O)C1=CC(=C(C=C1)F)[N+]([O-])=O,1 +CC2=CC(=O)C1=C(C=CC=C1O)C2=O,1 +NC(=O)NC2=NC1=CC=CC=C1[NH]2,1 +COC1=NSC2=C1C=CC=C2[N+]([O-])=O,1 +CC(C)(C)OO,1 +O=C4C=CC3=C(C2=CC=C1C=CC=CC1=C2C=C3)C4=O,1 +CCCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +OC(=O)C1=CC(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CN(C)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C2=CC=C1[NH]C=CC1=C2,1 +CC1=CC(=C(C=C1)C)N,1 +CNC(=O)ONC(C)=O,1 +COC1=CC=C(C=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +CC1=CC=C(C=C1)S(=O)(=O)N2C4C2C3=C(C=CC=C3)C5=C4C=CC=C5,1 +CC1=CC(=CC=C1)NO,1 +OC(=O)C1=C(C=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CCN(CCCl)CCCNC2=C1C=C(C=CC1=NC3=CC(=CC=C23)Cl)OC,1 +[O-][N+](=O)C1=C3C(=CC=C1)C2=CC=CC=C2O3,1 +C[N]1C=NC(=C1C(=O)N(C)N=O)N(C)C(=O)OC(C)(C)C,1 +NC1=CC(=CC=C1)O,1 +[O-][N+](=O)C1=CC=C(C=C1)OC2CO2,1 +NC1=C(C=C(C=C1)Cl)[N+]([O-])=O,1 +CC1=CC=C(C=C1)NN=NCC2=CC=C(C=C2)[N+]([O-])=O,1 +CNN=NC,1 +CC(=O)C1=C(C=CC(=C1)NC(N)=O)OCC(O)CNC(C)(C)C,1 +CCN1C=C(C(O)=O)C(=O)C2=C1C=C(C(=C2)F)N3CCN(C)CC3,1 +CCC1=C(C(=CC=C1)CC)N,1 +NC1=CC3=C(C=C1)C2=CC=CC=C2[NH]3,1 +CS(=O)(=O)NC1=CC=C(C=C1)NC3=C2C=C(C=CC2=NC4=CC=CC=C34)N=[N+]=[N-],1 +NC2=C1C(C3=C(C(C1=C(C=C2)O)=O)C=CC=C3)=O,1 +CCC1CO1,1 +CC1=C(C=C(C=C1)N=[N+]([O-])C2=CC(=C(C=C2)C)N)N,1 +OC1=CC2=C(C=C1)C3=CC5=CC=CC6=CC=C4C=CC2=C3C4=C56,1 +NC3=C(C=C2N=C1C=C(C=CC1=NC2=C3)Cl)N,1 +ClCCSCCCl,1 +NC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=C(C=C3)[N+]([O-])=O,1 +C[N]2C(=NC3=C1N=C(C)C=NC1=C(C)C(=C23)C)N,1 +CC(=O)OC1CC4=C2C1=C(C=CC2=CC5=C3C=CC=CC3=CC=C45)C,1 +CN1CCN(CC1)C2=C(C3=C(C=C2F)C(=O)C(=CN3CCF)C(O)=O)F,1 +[O-][N+](=O)C1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)CCCC5,1 +COC(=O)C12OC1(C)C(C)(O)OC2=O,1 +CC[N]1C(=NC2=C1C=CC3=NC=C(C)N=C23)N,1 +NC3=C2N=C1C=CC=CC1=NC2=CC=C3,1 +CC2=CC1=NC=CC=C1C=C2,1 +CC(C)(C)CNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +O=C1CCCCC1=O,1 +[O-][N+](=O)C1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +[O-][N+](=O)C1=CC=C(O1)C=NN2C(=O)C=C(C=C2C3=CC=CC=C3)C4=CC=CC=C4,1 +CCCCCCCC(Cl)=O,1 +CN(CC1=CC(=CC=C1)C)N=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,1 +CC1=C(C=C(C=C1N)N)[N+]([O-])=O,1 +CC1(CO1)C(=O)NC2=CC=CC=C2,1 +OCCN(CC(O)=O)N=O,1 +[O-][N+](=O)C2=C1C=CC=CC1=CC=C2,1 +N=C1CC(=O)C(=O)C2=C1C=CC=C2,1 +O=C3CN(CCN2CC(=O)N(CN1CCOCC1)C(=O)C2)CC(=O)N3CN4CCOCC4,1 +CC2=C4C=CC=C5C=CC3=C1C=CC=CC1=CC(=C2)C3=C45,1 +COP(=S)(OC)OC1=CC(=C(C=C1)N=O)C,1 +ClC(Cl)C(Cl)=O,1 +CC3=CC2=C(C(=C1C(=CC(=CC1=C2O)O)O)O)C(=O)C3=O,1 +NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)N,1 +COC2=C1C(C5=C(OC1=CC=C2Cl)C=C4OC3OC=CC3C4=C5OC)=O,1 +C[N]1C=CC3=C1C=CC4=CC=C2C=CC(=CC2=C34)O,1 +O=C(NC1CCCCC1)OC(C#C)(C2=CC=CC=C2)C3=CC=CC=C3,1 +NC3=C2C(=C1C(C=CC(C1=C(C2=C(C=C3)O)O)=N)=O)O,1 +CC(C)NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +NC1=C(C=CC=C1)SCSC2=C(C=CC=C2)N,1 +ON=C(O)C1=CC(=C(C=C1)O)O,1 +NC1=CC(=C(C=C1)NCCO)[N+]([O-])=O,1 +O=C3N(CC1CO1)C(=O)N(CC2CO2)C(=O)N3CC4CO4,1 +BrCC(Br)=C,1 +OCCNC1=C(C=C(C=C1)N(CCO)CCO)[N+]([O-])=O,1 +NC(=O)CNC(=O)N(CCCl)N=O,1 +C1=CC2=C(C=C1)C5=C4C(=C2)C=C3C=CC=CC3=C4C=C5,1 +NC(CCC(=O)NC(CSCCCl)C(=O)NCC(O)=O)C(O)=O,1 +[O-][N+](=O)C3=CC=C2SC1=CC=CC=C1C2=C3,1 +COC1=C(C=C(C(=C1)OC)C=CC)OC,1 +OC5CC1=C(C2=CC=C3C=CC=C4C=CC(=C1)C2=C34)C=C5,1 +[O-][N+](=O)C3=CC2=C(C=C1C(=CC=CC1=C2C=C3)[N+]([O-])=O)[N+]([O-])=O,1 +CC1=CC(=C(C=C1)O)N,1 +CC4=NC3=C2C1=CC(=CC=C1C=CC2=C(C=C3[NH]4)C)O,1 +CCC1=CC(=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +NC1=CC(=CC=C1)C2=CC=CC=C2,1 +[O-][N+](=O)C3=CC2=C1C(=CC=CC1=CC=C2)O3,1 +O=C2N(CC1CO1)SC3=C2C=CC(=C3)OCC4CO4,1 +COC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)O)O)C3=O,1 +NC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +CC1=C(C=CC=C1)C2=CC=C(C=C2)N,1 +CC(CN(CC(C)OC(C)=O)N=O)OC(C)=O,1 +CN1CCC4=C2C1C(C5=C(C2=C3OCOC3=C4)C=CC=C5)O,1 +COC4=C1C(C5=C(OC1=C3C2C=COC2OC3=C4)C=CC=C5O)=O,1 +ClC(Cl)(Cl)SN2C(=O)C1=C(C=CC=C1)C2=O,1 +CC(C)CCCC(C)C3CCC4C2C=CC1(CC(O)CCC1(C)C2CCC34C)OO,1 +CN(CC1=CC=C(C=C1)[N+]([O-])=O)N=O,1 +NC2=C1C(=CC=CC1=CC=C2)N,1 +C1=CC3=C(C=C1)C2=CC=CC4=C2C(=C3)C=C4,1 +CCCCC(CC)COC(=O)C1=CC(=C(C=C1)N(C)C)[N+]([O-])=O,1 +CC1COC3=C2N1C=CC(C2=C(C(=C3N4CCN(C)CC4)F)C(O)=O)=O,1 +NC2=C1C(C3=C(C(C1=C(C=C2C(O)=O)[N+]([O-])=O)=O)C=CC=C3)=O,1 +[O-][N+](=O)C1=CC=C(S1)C3NC(=O)C2=C(C=CC=C2)N3,1 +CC1=C(C=CC=C1)N=NC2=C(C(=C(C=C2)N)C)N,1 +C1=CC3=C(C=C1)C2=CC=CC=C2C4=CC=CC=C34,1 +CCN(CCCl)CCCNC2=C1C=CC=C(C1=NC3=CC=CC=C23)OC,1 +C1=CC2=C(C=C1)C4=CC=CC5=CC=C3C=CC=C2C3=C45,1 +NC1=C(C3=C(C=C1)C2=CC=CC=C2[NH]3)[N+]([O-])=O,1 +CC1=C(C=C(C=C1)C(OC(=O)NC2CCCCC2)(C#C)C3=CC=CC=C3)C,1 +ClCCCBr,1 +NC2=C1N=C[N](C1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4OC(CO)C(O)C4O,1 +NC3=C1C=CC=CC1=C2C=CC=CC2=C3,1 +CN(C)CCCNC2=C1C(=CC=CC1=NC3=CC=CC=C23)[N+]([O-])=O,1 +CCOC1=C(C=C(C=C1)NC(C)=O)N,1 +C1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +ClC4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 +CCC12OC1(C(=O)NC2(C)O)C(=O)OC,1 +OC5C(O)C4=C(C3=CC2=C1C=CC=CC1=CC=C2N=C3C=C4)C6OC56,1 +O=S1(=O)C5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2CC3,1 +CCN(CCCl)C1=CC=C(C=C1)CCCNC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +CN1CC(=CC2C1CC3=C[N](CC=C)C4=CC=CC2=C34)CO,1 +CCCCC=CC=CC=CC=CC=COCC(O)CO,1 +CC(C)(C)OOC(=O)C1=CC=CC=C1,1 +ClC2=C1C(C3=C(C(C1=CC=C2)=O)C(=CC=C3)NC(=O)C4=CC=CC=C4)=O,1 +[O-][N+](=O)C3=CC2=C1C=CC=CC1=CC=C2C=C3,1 +CN(C)C(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CN(C)C1=CC=C(C=C1)N=NC3=CC2=CC=CC=C2C=C3,1 +O1C5C1C4=C3C2=CC=CC=C2C=CC3=CC6=C4C5=CC=C6,1 +N(NC1=CC=CC=C1)C2=CC=CC=C2,1 +CCOC(=O)CNC(=O)C(C)Br,1 +OC5=CC4=CC3=C1C=CC=CC1=C2C=CC=CC2=C3C=C4C=C5,1 +C1OC1CC2=CC=C(C=C2)CC3=CC=CC=C3,1 +[O-][N+](=O)C4=CC=C3C1=CC=CC2=C(C=CC(=C12)C3=C4)[N+]([O-])=O,1 +NC1=C(C=CC=C1)N,1 +CC1=CC(=C(C=C1)C)NO,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC(=O)C2=CC=C(C=C2)[N+]([O-])=O,1 +CCC=C1OC(=O)C2=C1C=CC=C2,1 +OC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=CC=C3,1 +C[N]1C(=NC2=CC(=CC=C12)Cl)N,1 +NC3=CC2=C1C=CC=CC1=CC=C2C=C3,1 +CC1=C(C=CC=C1)N=NC2=CC(=C(C=C2)N=NC4=C3C=CC=CC3=CC=C4O)C,1 +C[N+]2=C1C=C(C=CC1=CC3=CC=CC=C23)N,1 +ClC(=O)CCC1=CC=CC=C1,1 +C1CCC2=C(C1)C6=C4C2=C3C=CC=CC3=CC4=C5C=CC=CC5=C6,1 +COC1=C(C=CC=C1)N=NC3=C2C=CC=CC2=CC=C3O,1 +CC1=CC(=C(C=C1)C)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC2=C(C=C1)C(=CC3=C2C(=CC=C3)[N+]([O-])=O)[N+]([O-])=O,1 +CC2C(O)CCC3=CC(=O)C1(OC1C23C)C4OC4CO,1 +CN(C)[N+]([O-])=O,1 +OCCC1=CC=C(C=C1)[N+]([O-])=O,1 +CC(=O)OCC1=C(C=CC(=C1)C(C)=O)OC(C)=O,1 +O1C=CC2=C1C=C3C=CC4=CC=CC5=CC=C2C3=C45,1 +OCCN(CCO)N=O,1 +CC(C)=[N+]([O-])[O-],1 +CC(=O)N(NC1=CC3=C(C=C1)C2=CC=CC=C2C3)C4=CC6=C(C=C4)C5=CC=CC=C5C6,1 +ClC=C(Cl)C(Cl)Cl,1 +OC2=C1C(C5=C(OC1=CC=C2)C3=C(OC4OC=CC34)C=C5O)=O,1 +[O-][N+](=O)C4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,1 +[O-][N+](=O)C1=CC(=CC=C1)[N+]([O-])=O,1 +NC2=C1N=C([N](C1=NC=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4=CC=C(C=C4)[N+]([O-])=O,1 +OS(=O)(=O)OC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +CC1CS(=O)(=O)CCN1N=CC2=CC=C(O2)[N+]([O-])=O,1 +COC2=CC1=C(C3=C(C(=C1C(=C2)O)O)C(=O)C=C(C)C3=O)O,1 +C1CC2(CCO1)CO2,1 +OC1CC2=C4C1=CC=C5C=CC3=CC=CC(=C2)C3=C45,1 +BrCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +CC4=C1C=CC=CC1=C3N=C2C=CC=CC2=C(C3=C4C)Cl,1 +O=NN1CCCC1,1 +CC(=O)NC1=CC=C(C=C1)C2=CC=C(C=C2)NC(C)=O,1 +C[N]2C1=CC=CC=C1C3=C(C)C=CC(=C23)C,1 +CNC2=C(C1=NC=CN=C1C=C2)C,1 +[O-][N+](=O)C2=C3C=CC4=[N+](C1=CC=CC=C1C5=CC=C(C=C2)C3=C45)[O-],1 +NC1=C(C=C(C(=C1)Cl)[N+]([O-])=O)O,1 +CN(C)CCCl,1 +NNC1=CC=CC=C1,1 +COC1=CC(=C(C=C1)C(=O)C2=C(C=CC=C2)O)O,1 +CCN(CC)C1=CC(=CC=C1)O,1 +NC3=C2C(=C1C=CC=CC1=NC2=CC=C3)N,1 +CC1CO1,1 +CC1=CC=C[N]2C1=NC3=C(C)C(=CN=C23)[N+]([O-])=O,1 +CC1=CC2=C(C=C1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 +OC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +CC3=CC2=C1C=CC=CC1=CC=C2C(=C3)C,1 +CC4CC1C(CC2=C[N](CC=C)C3=CC=CC1=C23)N(C4)C#N,1 +[O-][N+](=O)C1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,1 +CC1(CO1)C2=CC=C(C=C2)[N+]([O-])=O,1 +CNC3=NC1=C(C=CC2=NC=CC=C12)[N]3C,1 +NC1=CC(=C(C=C1)Cl)N,1 +CN(C)CCNC(=O)C2=C1N=C(C=CC1=CC=C2)C3=CC=CC=C3,1 +ONC2=C1C=CC=CC1=CC=C2,1 +OC1=NC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +CC1=C2C(=CC=C1)C3=C(C(=C2)C)C4=C(C=C3)C(O)C(O)C5OC45,1 +CCCCC1=CC=C(C=C1)N=CC2=CC=C(C=C2)OC,1 +C[N+]1=CC=C(CC1)C2=CC=CC=C2,1 +OC1=NC(=C(C=N1)N(CCCl)CCCl)O,1 +[O-][N+](=O)C1=C(C=CC=C1)SSC(Cl)=C(Cl)C(Cl)=C(Cl)Cl,1 +OC(=O)C1=CC(=CC=C1)[N+]([O-])=O,1 +COC1=C(C=CC(=C1)C2=NC(=C([NH]2)C3=CC=CC=C3)C4=CC=CC=C4)O,1 +[O-][N+](=O)C1=CC2=C(C=C1)NC(=O)C2=O,1 +COC1=NSC2=CC=CC(=C12)[N+]([O-])=O,1 +CN(CC(=O)COC(C)=O)N=O,1 +CS(=O)(=O)OCCCCOS(C)(=O)=O,1 +CCC=CC=CC=CC=CC=COCC(C)O,1 +CN(C)CCNC(=O)N2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3,1 +[O-][N+](=O)C1=CC(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +OCCBr,1 +COC1=CC(=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +NNC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +ClC(Cl)=CC=O,1 +CC3=CC2=CC1=CC=CC(=C1C(=C2C(=C3)O)O)O,1 +C[N]2C1=CC=CC=C1C3=CC=CC=C23,1 +CCC(COC(=O)C(C)=C)(COC(=O)C(C)=C)COC(=O)C(C)=C,1 +CC(=O)CN(CC(C)=O)N=O,1 +C1=CC3=C(C=C1)C2=CC=CC=C2N=C3,1 +COC1OC1(C)C,1 +CC(Cl)CCl,1 +[O-][N+](=O)C(Cl)(Cl)Cl,1 +CC4=C2C1=CC=CC=C1[NH]C2=C3C(C=CC(C3=N4)=O)=O,1 +OCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +CC(C)=CC3C(C(=O)OCN2C(=O)C1=C(CCCC1)C2=O)C3(C)C,1 +CC(C)Br,1 +CCC1=CC=C(C=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +CCCCC[N]3C=C2CC1C(C=C(C)CN1C)C4=C2C3=CC=C4,1 +C(CC1=CC=CC=C1)C2CO2,1 +C[N]2C(=NC3=C1N=CC(=NC1=C(C)C(=C23)C)C)N,1 +NC1=CC=C(C=C1)C2=C(C=C(C=C2)N)[N+]([O-])=O,1 +CCC12OC1(C(=O)OC)C(=O)OC2C,1 +NC1=CC(=C(C=C1)N)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(O1)C=CC=O,1 +NC3=CC2=NC1=CC=CC=C1N=C2C=C3,1 +CC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,1 +COC(=O)C(=CC)C=C(C)C=C(C)C=CC=C(C)C(=O)C12OC1C(O)(CCO)NC2=O,1 +OC2=C(C(=C1C(C3=C(C(C1=C2)=O)C=CC=C3)=O)O)O,1 +CCCCCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CCC(C)=NO,1 +O1C2C1C6=C4C3=C2C=CC=C3C=CC4=C5C=CC=CC5=C6,1 +[O-][N+](=O)C2=CC1=CC(=C(C=C1C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +COC3=CC2=CC1=CC(=CC(=C1C(=C2C(=C3)O)O)O)C,1 +[O-][N+](=O)C1=CC2=C(C=C1)C=CC2,1 +CC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,1 +ClC(Cl)(Cl)Br,1 +[O-][N+](=O)C1=C2C=CC3=CC=C(C4=CC=C(C=C1)C2=C34)N=O,1 +O=C(NCC1=CC=CC=C1)C2CO2,1 +CN(C)C1=CC=C(C=C1)C(=O)C2=CC=C(C=C2)N(C)C,1 +CC(C)C(NC(C)=O)C(=O)N(CC(O)=O)N=O,1 +C1=CC2=CN=C3C=CC=C4C=CC(=C1)C2=C34,1 +C(CC1CO1)C2CO2,1 +ClCC=O,1 +CN(C)C1=CC(=C(C=C1)N=NC2=CC=CC=C2)C,1 +CC1=CC=C(C=C1)S(=O)(=O)NN,1 +CN3CCC4=C2C1=CC(=CC=C1C=CC2=CC=C34)O,1 +C[N]2C(=NC3=C1N=CC(=NC1=CC(=C23)C)C)N,1 +COC3=C(C=C2C(=C1C=COC1=NC2=C3)OC)OC,1 +N1C2C1C6=C5C3=C2C=CC=C3C4NC4C5=CC=C6,1 +CNC(=O)ON,1 +NC(=O)N=NC(N)=O,1 +C5=CC=C4C=C3C2=C1C(=CC=CC1=CC=C2)C3=CC4=C5,1 +COC3=NC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCNCCCl,1 +COC(=O)C1=C(C(=C(O1)[N+]([O-])=O)Cl)Cl,1 +CC2C1=C(C=CC=C1)C3=C2C=C(C=C3)C,1 +CC4=C3N=C2C1=CC=CC=C1C=CC2=C(C3=CC=C4)C,1 +NC1=C(C=CC(=C1)Cl)O,1 +CCC1=NC4=C([NH]1)C3=C2C=C(C=CC2=CC=C3C=C4)O,1 +CC2C1=C(C=CC=C1)C3=C2C=CC=C3,1 +CCC1=C(C=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +CC1=C(C=C(C(=C1)C)[N+]([O-])=O)[N+]([O-])=O,1 +CC1=C(C=C(C=C1)N)[N+]([O-])=O,1 +CCCCCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CC(C)N(N)C(C)C,1 +COC3=C1C=CC=C2OC(=CC(=C12)C=C3)[N+]([O-])=O,1 +NC(CCC(=O)NC(CSC(Cl)=C(Cl)Cl)C(=O)NCC(O)=O)C(O)=O,1 +C4=CC3=CC2=CC1=CC=CC=C1C=C2C=C3C=C4,1 +CNC(=O)C=C(C)OP(=O)(OC)OC,1 +COC1=CC(=CC=C1)C=CC2=CC=C(C=C2)N,1 +NC1=CC(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CC(Br)C(=O)NC1=CC=CC=C1,1 +OC(=O)C(Br)Br,1 +COC3=C2N=C1C=CC=CC1=C(C2=C(C=C3)[N+]([O-])=O)NCCCN(C)C,1 +CCN(N=O)C(=O)N(C)C,1 +CC(C)(N=O)[N+]([O-])=O,1 +CC1OCC(=O)C(=O)C1O,1 +O=P2(OCC1=C(C=CC=C1)O2)OC3=CC=CC=C3,1 +CCC1=C(C(=O)OC)C(=O)OC1C,1 +COC(=O)C1=CCCN(C)C1,1 +CN(CCO[N+]([O-])=O)[N+]([O-])=O,1 +ClCC2=C4C=CC=C5C=CC3=CC1=CC=CC=C1C(=C2)C3=C45,1 +NC1=CC(=C(C=C1)C2=C(C=C(C=C2)N)Cl)Cl,1 +O=NN1CCSC1,1 +C[N]1C(=NC2=C1C=CC3=CC=CN=C23)N,1 +OC(=O)C(Cl)Br,1 +CC1=C(C=CC=C1)N=NC2=C(C=C(C(=C2)C)N)N,1 +NC3=CC=C2CC1=CC=CC=C1C2=C3,1 +CC4=CC3=NC2=C1C=CC=CC1=CC=C2C=C3C=C4,1 +COC(=O)C1=CCCN(C1)N=O,1 +OC1=CC(=CC=C1)[N+]([O-])=O,1 +CCS(=O)CCSP(=O)(OC)OC,1 +O1C2C1C6=C3C2=CC=CC3=C5C=C4C=CC=CC4=CC5=C6,1 +FC1=C(C=CC=C1)C(Cl)=O,1 +CC1=C3C(=C(C(=C1)N)C)C2=CC(=CC=C2[NH]3)O,1 +CCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 +OC2=C1C(C=CC(C1=C(C(=C2Cl)Cl)O)=O)=O,1 +CNC1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C(C)=O,1 +CC2=C1C=CC=CC1=NC=C2,1 +NC1=C(C=C(C=C1)[N+]([O-])=O)Cl,1 +[O-][N+](=O)C1=CC2=C(C=C1)C(=O)NC2=O,1 +ClC(Cl)(Cl)C=O,1 +COC(=COC(N)=O)C1=C(C(=C(C(=C1O)N2CC2)C)O)N3CC3,1 +CC1=C(C=C(C(=C1)N)[N+]([O-])=O)N,1 +[O-][N+](=O)C2=CC=C1C=N[NH]C1=C2,1 +COC2=CC1=CC=CN=C1C(=C2)NC(C)CCCN,1 +CCOC1=CC=C(C=C1)N,1 +OC1=CC=C2C(=C1)C=CC3=C2C4=C([NH]3)C=CC5=C4C=CC=C5,1 +[N-]=[N+]=C1C=NC(=O)NC1=O,1 +C(CCOCC1CO1)COCC2CO2,1 +CNC2=C(C1=NC(=CN=C1C=C2)C)C,1 +CC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC=C2O)C3=O,1 +COC1=C(C=CC(=C1)N)C,1 +CC1=C(C(=C(C(=C1)C)N)C)N,1 +ONC2=C1C=CC=CC1=[N+](C=C2)[O-],1 +COP(=O)(OC)C(O)C(Cl)(Cl)Cl,1 +NCCNCCO,1 +C1=CC5=C(C=C1)C4=CC3=C2C=NC=CC2=CC=C3C=C4C=C5,1 +CC(=O)N(Cl)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +[O-][N+](=O)C1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +CNC2=C(C1=NC=C(N=C1C=C2)C)C,1 +CC(=O)NC1=CC3=C(C=C1)C2=C(C=CC=C2C3)O,1 +[O-][N+](=O)C2=C3C=CC4=C1C=CC=CC1=NC5=CC=C(C=C2)C3=C45,1 +ON=C1CCCCC1,1 +[O-][N+](=O)C1=CC=C(O1)C=NN2CCCNC2=O,1 +CCC=CC=CC=CC=CC=CC=COCC(O)CO,1 +ClCC(Br)=C,1 +CC1=NC(=C(C=N1)CNC(=O)N(CCCl)N=O)N,1 +FC1=NC=CC=C1,1 +ON(C(=O)C1=CC=CC=C1)C2=CC4=C(C=C2)C3=CC=CC=C3C4,1 +O=CC1=CC=CO1,1 +[O-][N+](=O)C3=CN=C2[N]1C=CC=CC1=NC2=C3,1 +CC1=C2C(=CC=C1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 +CN(C)S(=O)(=O)CCNC(=O)N(CCCl)N=O,1 +CCS(=O)(=O)CC[N]1C(=NC=C1[N+]([O-])=O)C,1 +NC(=O)C1(OC1C(=O)C2=CC=CC=C2)C(N)=O,1 +COC3=CC=C2N=C1OC=CC1=C(OC)C2=C3,1 +CC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)C)N,1 +CCNN=NCC,1 +OC2=C1C(C3=C(C(C1=CC=C2)=O)C(=CC=C3)O)=O,1 +CCOC1=CC=C(C=C1)N(O)C(C)=O,1 +COC1=C(C=C(C=C1)[N+]([O-])=O)N=NC3=C2C=CC=CC2=CC(=C3O)C(=O)NC4=CC(=CC=C4)[N+]([O-])=O,1 +OCC=[N+](O)[O-],1 +BrN1C(=O)CCC1=O,1 +ON=C(O)CC1=C[N](C=N1)N=O,1 +OCC(O)CN=[N+]=[N-],1 +CC1=CC=C(C=C1)C(Cl)=O,1 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,1 +CCC1=C(C(=CC=C1)CC)NC(=O)CCl,1 +S1C=CN=C1,1 +CC(C)(Cl)[N+]([O-])=O,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC(=CC=C2)C,1 +NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)Br)Br,1 +COC1=NSC2=C(N)C=CC=C12,1 +C[N]1N=C(C)C(=C1N)C(=O)C2=C(C=CC=C2)F,1 +CC1=CC(=CC(=C1)C)NO,1 +COC1=CC=C(C=C1)N=[N+]([O-])C2=CC=C(C=C2)OC,1 +[O-][N+](=O)C1=C2C(=CC=C1)C(=CC=C2)[N+]([O-])=O,1 +C(OCC1=CC=CC=C1)C2CO2,1 +CC(C)(C)C1=CC(=O)C=C(C1=O)C2=CC(=O)C=C(C2=O)C(C)(C)C,1 +CCC=CC=CC=CC=CC=COCC(O)C1=CC=CC=C1,1 +CC(=O)N(O)C1=C(C=CC=C1)C,1 +COC1=C(C=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +CC1=CC=C(C=C1)S(=O)(=O)OCC2CO2,1 +COC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CC(C)=CC2C(C(=O)OCC1=CC=C(O1)CC#C)C2(C)C,1 +OC1OC(=O)C(=C1C(Cl)Cl)Cl,1 +ClCCNCCCNC2=C1C=CC=CC1=NC3=CC=CC=C23,1 +C1C4=C3C2=C1C=CC=C2C=CC3=CC=C4,1 +O=CC1CO1,1 +NC1=C(C=C(C=C1)CC2=CC(=C(C=C2)N)Cl)Cl,1 +NC(=S)C1=C(C=CC=C1Cl)Cl,1 +CC(C)(C)C1=CC=C(C=C1)OCC2CO2,1 +COC1=CC=C2C(=C1)C=CC3=C2C=C(O3)[N+]([O-])=O,1 +ClCC(Cl)=C,1 +CC1OC(CC(N)C1O)OC2=CC(O)(CC5=C2C(=C4C(=C3C=CC=CC3=C(C4=C5O)O)O)O)C(C)=O,1 +C=CCCC1CO1,1 +BrCC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,1 +[O-][N+](=O)C2=C3C=CC4=C1CCC=CC1=CC5=CC=C(C=C2)C3=C45,1 +ClC1=CC3=C(C=C1)C2=CC=CC=C2O3,1 +C([N]1C=CN=C1)C2=CC=CC=C2,1 +OS(=O)(=O)OCC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,1 +CC1=CC(=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3O)[N+]([O-])=O,1 +NC3=C(C=C2C1=CC=CC=C1[NH]C2=C3)[N+]([O-])=O,1 +OC(=O)COC1=CC=C(C=C1)N(CCCl)CCCl,1 +NC2=C1N=C[N](C1=NC=N2)CC(O)CN=[N+]=[N-],1 +C[N]2C(=NC3=C1N=C(C)C(=NC1=C(C)C(=C23)C)C)N,1 +CC3=C2C=CC1=CC=CC=C1C2=NC4=CC=CC=C34,1 +FC1=CC=C(C=C1)C(=O)C2OC2C3=CC=CC=C3,1 +[O-][N+](=O)C1=C(C=CC=C1)CC#N,1 +COC(=O)C12OC1(C)C(OC2=O)C(C)C,1 +[O-][N+](=O)C3=CC2=CC1=CC=CC=C1C=C2C=C3,1 +ClCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 +BrCC(Br)CBr,1 +NCCC1=C(C=C(C(=C1)O)O)O,1 +ONC1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=C(C=C2C3=O)[N+]([O-])=O)[N+]([O-])=O,1 +CC(=O)OC(OC(C)=O)C1=CC=C(O1)[N+]([O-])=O,1 +COC1=CC=CC=CC1,1 +NC1=NC3=C(C=C1)C2=CC=CC=C2[NH]3,1 +BrCC(=O)NCC1=CC=CC=C1,1 +COC(=O)C1=CC=C(O1)[N+]([O-])=O,1 +CC1=CC=C2C=C4C(=C3CCC1=C23)C=CC5=CC=CC=C45,1 +COC(=O)C(C)=CC1=CC=C(O1)[N+]([O-])=O,1 +NC1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +CNC2=C(C1=NC(=C(N=C1C=C2)C)C)C,1 +ClC(=O)C1=C(C=CC=C1Cl)Cl,1 +O=C(NC1=CC=CC=C1)C2CO2,1 +[O-][N+](=O)C1=NC=C[N]1CC(=O)NCC2=CC=CC=C2,1 +N1C4C1C3=C(C2=CC=CC=C2C=C3)C5=C4C=CC=C5,1 +O1C3C1C2=CSC=C2C4=CSC=C34,1 +CBr,1 +OC3C=CC2=C1C(=CC4=C(C1=CC=C2C3O)CCC4=O)C(F)(F)F,1 +CNC3=CC2=C1C=C(C=CC1=CC=C2C=C3)O,1 +CC3(C)CC2C=C(CO)C1(CC1(C)C2C3)C=O,1 +ClCC1=CC(=O)OC1,1 +CCOP(=S)(OCC)OP(=S)(OCC)OCC,1 +N1C6C1C2=C(C=C4C(=C2)C3=CC=CC=C3C5NC45)C7=C6C=CC=C7,1 +CC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,1 +OC(CC1=C[N](N=O)C2=CC=CC=C12)C(O)=O,1 +CC1=NC=C([N]1CCO)[N+]([O-])=O,1 +ClC3C6(Cl)C4C2C1OC1C5C2C3(Cl)C(Cl)(C45)C6(Cl)Cl,1 +[O-][N+](=O)C1=CC(=CC=C1)Br,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)C3=O,1 +COC1=CC4=C3C(=C1OC)C2=CC=CC=C2C(C3=NC=C4)=O,1 +CCCCN(CCCCO)N=O,1 +COS(=O)(=O)OC,1 +OCC(O)C1CO1,1 +ClC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +C(CC2=C1C=CC=CC1=CC=C2)C3CO3,1 +[O-][N+](=O)C2=C(C=C1OC3=C(OC1=C2)C=C(Cl)C(=C3)Cl)Cl,1 +CC1(C)C(C=C(Cl)Cl)C1C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=CC=C2,1 +OC4=C3C2=CC=C1C=CC=CC1=C2C=CC3=CC=C4,1 +CCN(CC)C1=CC=C(C=C1)N,1 +C[N]2C(=NC3=CC1=NC=C(C)N=C1C(=C23)C)N,1 +OCCC1=C(C=CC=C1)[N+]([O-])=O,1 +CC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,1 +OC1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +CC3=CC2=CC1=CC=CC=C1C=C2C=C3,1 +CCC1=C(C(=CC=C1)CC)N(COC)C(=O)CCl,1 +[NH]3C2=CC=C1C=CC=CC1=C2C4=C3C=CC5=CC=CC=C45,1 +CC(=O)C=C,1 +[O-][N+](=O)C1=CC(=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +CN1CCC4=C2C1CC5=C(C2=C3OCOC3=C4)C=CC=C5,1 +CC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +CC(=O)OCC(O)CO,1 +CC(C)CCCC(C)C3CCC4C2C(OO)C=C1CC(O)CCC1(C)C2CCC34C,1 +CC(=O)C(Cl)Cl,1 +[O-][N+](=O)C2=C1C=CC=C3C1=C(C=C2)C4=C(C=CC5=CC=CC3=C45)[N+]([O-])=O,1 +C1=CC2=C5C=CC=C6C=CC4=CC=C3C=CC(=C1)C2=C3C4=C56,1 +[O-][N+](=O)C3=CC=C2OC(=O)C1=CC=CC=C1C2=C3,1 +CC(=O)NC1=CC=C(C=C1)OC2=CC=CC=C2,1 +CC4CC3(OC1OC(CO)C(O)C(O)C1O)C=C(C)C2(CC2)C(C)(O)C3C4=O,1 +C1OC1COC2=C(C=CC=C2)C3=CC=CC=C3,1 +COC(=O)C(CSCCBr)NC(C)=O,1 +CC5=C3CCC4=C2C1NC1C6=C(C2=CC(=C34)C=C5)C=CC=C6,1 +CC(C)OS(C)(=O)=O,1 +CN(C)C1=CC=C(C=C1)C,1 +CNC(=O)OC1=CC=C(C=C1)C2=CC=CC=C2,1 +C6CCC5=C3C1=CC=CC=C1C4=CC2=CC=CC=C2C(=C34)C=C5C6,1 +NC1=C3C(=CC=C1)C2=CC=CC=C2C=C3,1 +OP(=O)(OCC(Br)CBr)OCC(Br)CBr,1 +[O-][N+](=O)C1=CC=C(C=C1)OC2=CC=CC=C2,1 +CC1=C3C(=C(C=C1)C)C2=CC(=CC=C2[NH]3)[N+]([O-])=O,1 +CC1=CC=C(C=C1)NCCCl,1 +O=NC2=CC1=CC=CC=C1C=C2,1 +C[N]1C(=NC2=C1C=CC3=CC=NC=C23)N,1 +C2=CC1=CC4=C(C=C1C=C2)C3=CC=CC=C3C=C4,1 +OP1(=NCCCO1)N(CCCl)CCCl,1 +OC2C1=C(C=CC=C1)C3=C2C=C(C=C3)[N+]([O-])=O,1 +C1OC1COC3=CC=C2SN=CC2=C3,1 +[O-][N+](=O)C1=CC=C(C=C1)C3=C([N]2C=CSC2=N3)N=O,1 +C1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +CC(=O)ON(C(C)=O)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +NC1=C(C=C(C=C1)[N+]([O-])=O)O,1 +COC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)OC)O)C3=O,1 +OC2=C1C(C=CC(C1=CC=C2)=O)=O,1 +CC3=CC(=O)C2=C(C(=C1C=CC=CC1=C2O)O)C3=O,1 +CN(C)C(Cl)=O,1 +COC1=C(C=CC(=C1)N=NC2=CC=CC=C2)N,1 +CC(C)CC(=O)OCC1=COC=C2C(=CC=[C]12)C=O,1 +CC(=O)OCC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,1 +COC1=C(C=CC(=C1)[N+]([O-])=O)N,1 +N1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +CNC(=O)CSP(=S)(OC)OC,1 +CC1=C(C=CC=C1)NO,1 +OC5=CC4=C3C2=C1C=CC=CC1=CC=C2[NH]C3=CC=C4C=C5,1 +C=CC(=O)NCNC(=O)C=C,1 +CCOC1=CC=C(C=C1)[N+]([O-])=O,1 +CC(C)(C)N(CC(=O)C1=CC(=C(C=C1)O)CO)CC2=CC=CC=C2,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2C(O3)=O,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)Cl,1 +NC1=C(C=C(C(=C1)[N+]([O-])=O)N)F,1 +OC1=CC2=C(C(=C1)O)C(C(C(O2)C3=CC(=C(C=C3)O)O)=O)=O,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC(=CC=C2)CCl,1 +CC(Br)C(Br)CCl,1 +C[N]1C(=NC2=C1C=C(C)C3=NC=CN=C23)N,1 +C4CC3=C(C2=C1C=CC=CC1=CC=C2C=C3)C4,1 +COCC4CN(C)C3CC1=C[N](C)C2=CC=CC(=C12)C3=C4,1 +[O-][N+](=O)C1=CC(=C(C(=C1)[N+]([O-])=O)C2=CC=CC=C2)[N+]([O-])=O,1 +C3=CC2=CC1=CC=CC=C1N=C2C=C3,1 +CCN1C=C(C(O)=O)C(=O)C2=C1N=C(C(=C2)F)N3CCNCC3,1 +CC(=O)NC(CSCCCl)C(O)=O,1 +ClC(Cl)C1=CC=CC=C1,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC(=CC=C2)Cl,1 +[O-][N+](=O)C1=CC(=C(C=C1)C2=CC(=C(C=C2)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +CCCCN(CCCC)N=O,1 +CNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +COC1=C(C=CC(=C1)NS(C)(=O)=O)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +C[N]1C=NC(=C1N=O)C2=CC=CC=C2,1 +[O-][N+](=O)C2=C3C=CC4=NC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +N#CC1=CC3=C2C1=CC=CC2=CC=C3,1 +NC3=CC2=C(C1=CC=CC=C1N=C2C=C3)N,1 +ONC1=CC=CC=C1,1 +ClC2=CC1=CC=CN=C1C=C2,1 +C1=CC3=C(C=C1)C4=C2C=CC=CC2=C5C=CC=C6C=CC(=C3)C4=C56,1 +CCC(C)OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +OC1=C2C=CC3=CC=C(C4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 +ClC=C(Cl)SCC1=CC=CC=C1,1 +S(SC2=NC1=CC=CC=C1S2)C4=NC3=CC=CC=C3S4,1 +N1C5C1C2=C(C=C4C(=C2)C3=CC=CC=C3C=C4)C6=C5C=CC=C6,1 +CC(=O)NC2=C1N=CC=CC1=CC=C2,1 +CN1CN=C2C(=[N+](O)[C-]N=C12)N,1 +CC=C(Cl)C=O,1 +NC(=N)NC(=O)C1=C(N=C(C(=N1)Cl)N)N,1 +C[N]1C(=NC2=C1C=CC3=NC=C(C)N=C23)N,1 +COC3=CC(=C2N=C1OC=CC1=C(OC)C2=C3)OC,1 +CN(COC(C)=O)[N+]([O-])=O,1 +CC(Cl)(Cl)[N+]([O-])=O,1 +CN(C)C(=S)SSC(=S)N(C)C,1 +NC1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +NC1=CC=C(C=C1)SC2=CC=CC=C2,1 +CC1=C3C(=CC2=CC=CC=C12)C4=C(C=C3)C(O)C(O)C5OC45,1 +[O-][N+](=O)C1=CN=C(S1)N2CCN(C(=O)C(Cl)Cl)C2=O,1 +COC1=NSC2=CC=C(N)C=C12,1 +[O-][N+](=O)C1=CC=C2C=CC3=C(C5=C(C4=CC=C1C2=C34)C=CC=C5)[N+]([O-])=O,1 +CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)N(CCO)CCO)[N+]([O-])=O,1 +CC1=CC=C(C=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +ClC(Cl)=C(Cl)C=O,1 +COC3=C2N=C1OC=CC1=C(C2=CC=C3)OC,1 +COC1=C(C5=C(C(=C1)O)C(=O)C2=C(C3=C(C=C2OC)OC4OC=CC34)O5)OC,1 +[O-][N+](=O)C1=CC=C(C=C1)NC2=CC=C(C=C2)Cl,1 +NC1=CC=C(C=C1)CC2=CC=C(C=C2)N,1 +NC(CCC(=O)NC(CSC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O)C(=O)NCC(O)=O)C(O)=O,1 +NC(CSC(Cl)=C(Cl)C(Cl)=C(Cl)Cl)C(O)=O,1 +CNC1=C([N](C=N1)C)C(=O)N(C)N=O,1 +CC3=CC2=C1C=C(C=CC1=CC=C2C=C3)C,1 +COC1=C(C=CC(=C1)NS(C)(=O)=O)NC3=C2C=CC=C(C2=NC4=CC(=CC=C34)N=[N+]=[N-])C,1 +CCN(CCCl)CCCNC2=C1C=CC=CC1=NC3=CC=CC=C23,1 +CC(O)CN(C)C1=NN=C(C=C1)NN,1 +CC4=CC3=CC2=C1C=CC=CC1=CC=C2C=C3C=C4,1 +CC1(C)COC1=O,1 +CC(O)CN(CC(C)O)N=O,1 +CC(Cl)CO,1 +CC1=C(C=C(C=C1)N=NC2=CC(=C(C=C2)C)N)N,1 +ClC(Cl)C(=O)C(Cl)Cl,1 +COC2=C1OC=CC1=CC3=C2OC(C=C3)=O,1 +CC4=C2C=C1C=CC=CC1=CC2=C3C=CC(C(C3=C4)O)O,1 +NC2=C1C=CC=CC1=C(C=C2)N,1 +O=NC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +C[N]2C(=NC3=C1C=CC=NC1=CC(=C23)C)NC(C)=O,1 +C1=CN=C(C=C1)C2=CN=CC=C2,1 +CC(=O)NC1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,1 +CC1=C4C(=C(C2=CC=CC=C12)CBr)C3=CC=CC=C3C=C4,1 +O=C1NCNC(=O)N1,1 +CC(=O)NC1=C(C(=CC=C1)N)C(O)=O,1 +C1OC1CC2=CC=CC=C2,1 +OC1=C(C=C(C=C1[N+]([O-])=O)C2=CC=CC=C2)[N+]([O-])=O,1 +C[N+]2=C1C=CC=CC1=C(C3=CC=CC=C23)N,1 +CCOC1=C(C=CC=C1)[N+]([O-])=O,1 +CCCCCN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +CC2=CC1=CC4=C(N=C1C=C2)C3=CC=CC=C3C=C4,1 +CC1=C3C(=C(C=C1)C)C2=CC=CC=C2C=C3,1 +C1=CC3=C(C=C1)C4=CC=C5C2=CC=CC=C2C=C6C=CC(=C3)C4=C56,1 +O1C2C=CC=CC12,1 +COC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +NC4=C1C=CC=CC1=C3N=C2C=CC(C=C2OC3=C4)=N,1 +NC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,1 +COC1=CC3=C(C(=C1)OC)C(=O)C2=C(C(=CC=C2O)OC)O3,1 +O=C1C=CC3=C2C1=CC=CC2=CC=C3,1 +CCC2=C(N=C1C(=C(C=CC1=N2)NC)C)CC,1 +[O-][N+](=O)C2=CC=C1[NH]C=NC1=C2,1 +CN(C)C1=CC(=CC=C1)O,1 +[N-]=[N+]=NCC1=CC=CC=C1,1 +[O-][N+](=O)C1=CC=[N+](C=C1)[O-],1 +CC4=C1C=CC=CC1=C3N=C2C=CC=CC2=C(C3=C4)C,1 +COC1=C(C=CC(=C1)NS(C)(=O)=O)NC3=C2C=CC(=CC2=NC4=CC=CC=C34)N=[N+]=[N-],1 +O=CC=O,1 +CC2=NC1=CC(=C(C=C1C(=C2)C)C)N,1 +COC1=C(C5=C(C=C1)C2=C(C4=C(C=C2)C=C3OCOC3=C4)N(C)C5=O)OC,1 +CC1(C)CC2C(O)(C1)C=C(C=O)C3(CC23C)C=O,1 +CC=C1CC(=C)C(O)(CO)C(=O)OCC2=CCN3CCC(OC1=O)C23,1 +CC(=O)NC1=CC=C(C=C1)N,1 +ClC1=NC(=CC=C1)C(Cl)(Cl)Cl,1 +CCOS(=O)(=O)C1=CC=C(C=C1)C,1 +[O-][N+](=O)C4=CC=C3C2=C1C(=CC=CC1=CC=C2)C5=C3C4=CC=C5,1 +CC(=O)NN=CC2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 +CCN(CC)CCCC(C)NC2=C1C=CC(=CC1=NC=C2)Cl,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +S2C4=CC=CC5=CC=C3C1=CC=CC=C1C=C2C3=C45,1 +NC2=C1C(C4=C(C(C1=C(C=C2OC3=CC=CC=C3)O)=O)C=CC=C4)=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC5=C(C=C2CC3)C4=CC=CC=C4CC5,1 +O=C1C=CC(=O)C2=C1C=CC=C2,1 +NC3=CN=C2[N]1C=CC=CC1=NC2=C3,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)F,1 +NC1=CC(=C(C=C1)O)[N+]([O-])=O,1 +CC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +CC1=CC=C(C=C1)NO,1 +NC3=CC2=CC1=CC=CC=C1C=C2C=C3,1 +OC5C=C3C2=C(C1=CC=CC=C1C=C2)C4=C3C(=CC=C4)C5O,1 +ClC1=C(Cl)C(=O)NC1=O,1 +OCCN1CN(CCO)CN(CCO)C1,1 +CSC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +NC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +[O-][N+](=O)C4=C1C=CC=CC1=C3C=CC2=CC=CC5=C2C3=C4CC5,1 +OCCNC2=C1C=CC=CC1=NC(=N2)C3=CC=C(S3)[N+]([O-])=O,1 +ClCC=CCCl,1 +ClCC1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,1 +C[N]1C=NC2=C(NO)N=CN=C12,1 +O=CC(=O)C1=CC=CC=C1,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=C(C=C2C=C3)[N+]([O-])=O,1 +OCCN(CCO)C2=CC1=CC=CC=C1C=C2,1 +C=O,1 +CN(C)C1=CC=C(C=C1)N,1 +C[N]1C(=NC2=C1C=CC3=CN=CC=C23)N,1 +ClCC2=C4C=CC=C5C=CC3=C1C=CC=CC1=CC(=C2)C3=C45,1 +CC1=CC=C(C=C1)NC2=CC=C(C=C2)[N+]([O-])=O,1 +CCCCCC=CC(=O)CCC1=CC(=C(C=C1)O)OC,1 +CC1(CO1)C2=CC=C(C=C2)C3=CC=CC=C3,1 +COP(=S)(OC)OC1=CC(=C(C=C1)N)C,1 +CCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +OC5C=CC4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4C5O,1 +COC1=C(C=CC(=C1)CNC(=O)CCCCCCC(C)C)O,1 +O=C(OCC=CC1=CC=CC=C1)C=CC2=CC=CC=C2,1 +C[N]1C(=NC2=C1C=CC3=NC=CC=C23)N,1 +ClC1=CC=C(C=C1)C3=C([N]2C=CSC2=N3)N=O,1 +COC1=C(C=CC=C1)CC2CO2,1 +[O-][N+](=O)C1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +CC(=O)N(OC(=O)C1=CC=CC=C1)C2=CC4=C(C=C2)C3=CC=CC=C3C4,1 +CC(=O)C1=CC(=CC=C1)[N+]([O-])=O,1 +FC2=CC1=CC=CN=C1C=C2,1 +OC1=C2C=CC3=CC=CC4=CC=C(C(=C1)[N+]([O-])=O)C2=C34,1 +C5CC4=C3C=C2C1=CC=CC=C1C=CC2=NC3=CC=C4C=C5,1 +ON(C=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +COC4=CC(=O)C3=C2[NH]C1=CC=CC=C1C2=C(C)N=C3C4=O,1 +OC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=C(C=C3)N=NC4=CC=CC=C4,1 +C[N]1C(=NC2=C1C=CC3=NC(=CC=C23)O)N,1 +ClCC(=O)CCl,1 +OP(O)(=N)N(CCCl)CCCl,1 +C[N]2C=C1C=CC=C(C1=N2)[N+]([O-])=O,1 +FC2=C1C=CC=CC1=NC=C2,1 +O=C1C4=C3C2=C1C=CC=C2C=CC3=CC=C4,1 +ClCC1=C(Cl)C(=O)OC1,1 +C1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 +CC1=C(C=CC=C1)N=O,1 +OC1=C2C(=CC=C1)C3=C(C=C2)[NH]C4=C3C5=C(C=C4)C=CC=C5,1 +CC(=O)C(C)=O,1 +CC1=C(C=C(C=C1)NO)C,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)Br,1 +[O-][N+](=O)C2=CC1=C3C=CC4=CC=CC5=CC=C(C=C1O2)C3=C45,1 +CN(C)C(=O)NC1=CC(=C(C=C1)Cl)Cl,1 +CC1=C3C(=C(C=C1)C)C2=CC=CC=C2[NH]3,1 +[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=CC=C2)O3,1 +NC(=O)NN=CC1=CC=C(O1)[N+]([O-])=O,1 +C[N]1C(=NC2=C1C=C(C)C3=NC(=C(C)N=C23)C)N,1 +C=CCN=C=S,1 +[O-][N+](=O)C([N+]([O-])=O)([N+]([O-])=O)[N+]([O-])=O,1 +C1COCC2(C1)CO2,1 +ClC3=CC=C2OC1=CC=CC=C1C2=C3,1 +OC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +CC1=C(C=C(C=C1N)[N+]([O-])=O)[N+]([O-])=O,1 +[O-][N+](=NC1=CC=CC=C1)C2=CC=CC=C2,1 +ClC(=O)C1=CC=CC=C1,1 +COC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC(=C2)O)O3,1 +ClC2=C(Cl)C(=O)C1=C(C=CC=C1)C2=O,1 +OC1=C3C=CC(=C4C=CC2=CC=CC(=C1)C2=C34)[N+]([O-])=O,1 +COC3=CC=C2C(=C1C=COC1=NC2=C3)OC,1 +C1CSCN1,1 +C1=CC3=C(C=C1)C2=CC5=C(C=C2C=C3)C4=CN=CC=C4C=C5,1 +CC2=CC1=CC=CC=C1N=C2,1 +[O-][N+](=O)C1=C(C=CC=C1)Br,1 +CC(C)(C)OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +C[N]1C=NC(=C1SC3=C2[NH]C=NC2=NC=N3)[N+]([O-])=O,1 +NC1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 +NC2=C1C=CC=CC1=CC=C2,1 +BrCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +NC(=O)OC1CO1,1 +CCN(C=O)N=O,1 +C[N]1C(=NC2=C1C=CC3=NC=C(C)N=C23)NO,1 +OC1=C(C=C(C=C1)Cl)CC2=C(C=CC(=C2)Cl)O,1 +CCCCN(N=O)C(N)=O,1 +CC(C)(C)NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=CC=C2C3)[N+]([O-])=O,1 +COC(=O)NN=CC2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 +NC1=CC=C(C=C1)C2=CC=C(C=C2)N,1 +CCN(C)N=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=C(C=C2CC3)[N+]([O-])=O,1 +CCOC1=CC=C(C=C1)NO,1 +OC(CN=[N+]=[N-])CN=[N+]=[N-],1 +NC1=C(C=C(C=C1)F)F,1 +CC5=C1C=CC=CC1=C4C3=C2C=CC=CC2=C(C=C3[NH]C4=C5)C,1 +[O-][N+](=O)C3=CC=C2[NH]C1=CC=CC=C1C2=C3,1 +CC(O)CN(CC(O)CO)N=O,1 +CC1=C(C=C(C=C1)N)O,1 +[O-][N+](=O)C2=C3C=CC4=C(C1=CC=CC=C1C5=CC=C(C=C2)C3=C45)[N+]([O-])=O,1 +CN(C)N=NC1=CC=C(C=C1)Cl,1 +NC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +CN(C)CCNC(=O)C2=C1OC3=C(OC1=CC=C2)C=CC=C3,1 +CC#CC(OC(=O)NC1CCCCC1)(C2=CC=CC=C2)C3=CC=CC=C3,1 +C[N]3C=CC4=CC=C2C=CC1=CC=C(O)C=C1C2=C34,1 +ClCC2=C1C=CC=CC1=C(C3=CC=CC=C23)Cl,1 +ON=C(O)C1=CC=CC=C1,1 +C[N]1C=CN=C1[N+]([O-])=O,1 +CC2=CC1=CC4=C(C=C1C=C2)C3=CC=CC=C3C=C4,1 +CC(=O)NC1=C2C=CC3=CC=CC4=CC=C(C(=C1)O)C2=C34,1 +C2=CC1=CC=CN=C1C=C2,1 +[O-][N+](=O)C1=CC=C(C=C1)S,1 +CC3=C2C=CC1=CC=CC=C1C2=C(C4=CC=CC=C34)C,1 +CCN1C=C(C(O)=O)C(=O)C2=C1C=C(C(=C2)F)N3CCNCC3,1 +ClCC4=C2C1=CC=CC=C1C3=CC=CC(=C23)C=C4,1 +[O-][N+](=O)C1=CN=C(S1)N2CCNC2=O,1 +CC3=C(C2=NC1=CC(=C(C=C1N=C2C=C3)C)N)N,1 +C[N]1C(=NC2=C1C=C(C)C3=NC=C(C)N=C23)N,1 +NC2=C1C=CC=C(C1=CC=C2)N,1 +C[N]1C(=NC2=C1C=C(C)C3=NC=C(N=C23)C4=CC=CC=C4)N,1 +C[N+]2=C1C=CC=CC1=CC3=CC=CC=C23,1 +OC(=O)CC1=CC(=C(C=C1)O)O,1 +C[N]1C(=NC2=CC(=CC=C12)C)N,1 +COP(=O)(OC)OC=C(Cl)Cl,1 +COC4=C2C1=CC=CC=C1CC3N(CCC(=C23)C=C4O)C,1 +OCC(Br)CBr,1 +[O-][N+](=O)C1=CC2=CC=C3C=C(C=C4CCC(=C1)C2=C34)[N+]([O-])=O,1 +O=C1C(=O)C3=C2C1=CC=CC2=CC=C3,1 +ClCC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +[O-][N+](=O)C1=CC=C(O1)C=O,1 +CC3=C2C1=CC=CC=C1[NH]C2=C(C(=N3)N)C,1 +O=C1C=CC4=C2C1=CC=C3C(C=CC(=C23)C=C4)=O,1 +CNC2=C(C1=NC(=CN=C1C=C2)C3=CC=CC=C3)C,1 +CC(=O)NC1=CC=C(C=C1)C2=CC=C(C=C2)N,1 +O2C3C=CC1=C(N=CC=C1)C23,1 +CCC(=C)C=O,1 +CC2=C(N=C1C=C(C=CC1=N2)N)C,1 +OS(=O)(=O)C1=C(C=CC(=C1)NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O)NC3=CC=CC=C3,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)C=O,1 +CNC1=C(C=C(C=C1)N(CCO)CCO)[N+]([O-])=O,1 +O=C1C5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 +COC(=O)C3=C2N=C1C=CC=CC1=C(C2=C(C=C3)[N+]([O-])=O)NCCCN(C)C,1 +ClC(Cl)C1=C(Cl)C(=O)OC1,1 +CC1=C(C=C(C(=C1C)N)[N+]([O-])=O)N,1 +CC5CC2C(CC3=C[N](C1CCCC1)C4=CC=CC2=C34)N(C)C5,1 +CC1=C(C=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +C[N]1C(=NC3=C1C=CC4=CC=C2C=CC(=CC2=C34)O)C,1 +[O-][N+](=O)C1=CC=C(C=C1)C(=O)OCC2CO2,1 +[O-][N+](=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +CC1=C(C(=CC=C1)N)N,1 +[O-][N+](=O)C1=C2C=CC3=CC=CC4=CC=C(C(=C1)[N+]([O-])=O)C2=C34,1 +CNC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +CC(=O)C1=CC=C[NH]1,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC5=C(C=C2C=C3)C4=CC=CC=C4C=C5,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)F,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2O3,1 +BrCC(=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +O=C1NC(=O)C=C1,1 +CC(=O)NC1=CC=C(C=C1)N=NC2=C(C=CC(=C2)C)O,1 +CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)CO,1 +NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)[N+]([O-])=O)[N+]([O-])=O,1 +NC1=CC(=C(C=C1)CO)[N+]([O-])=O,1 +[O-][N+](=O)C4=C2C(=CC=C3C1=CC=CC=C1C(=C23)C=C4)[N+]([O-])=O,1 +[NH]1C(=NC(=C1C2=CC=CC=C2)C3=CC=CC=C3)C4=CC=CC=C4,1 +CC(=O)NN,1 +CC(O)CN,1 +CC4=C2C=C1C(C(C=CC1=CC2=C3C=CC=CC3=C4)O)O,1 +NC3=CC=C2N=C1C=CC=C[N]1C2=N3,1 +NC1=C(C=CC(=C1)[N+]([O-])=O)CO,1 +O=C1C(=O)C5=C3C2=C1C=CC=C2C=CC3=C4C=CC=CC4=C5,1 +NC1=CC=C(C=C1)OC2=CC(=CC=C2)OC3=CC=C(C=C3)N,1 +C1=CC2=CC4=CC=C5C=CC=C6C=C3C=CC(=C1)C2=C3C4=C56,1 +ClCC4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4,1 +C[N]1C(=NC=C1[N+]([O-])=O)C,1 +CN(C)CCNC(=O)C3=C2N=C1C=CC=CC1=C(C2=CC=C3)N,1 +CC(=O)N(O)C1=CC=C(C=C1)[N+]([O-])=O,1 +C5CCC4=C3C=C2C1=CC=CC=C1C=CC2=NC3=CC=C4C5,1 +[O-][N+](=O)C2=CC1=CC=CN=C1C=C2,1 +C(CCC1CO1)CC2CO2,1 +O=C2CC(=O)C1=C(C=CC=C1)C2=O,1 +C[N]1C(=NC2=C1C=C(C)C3=NC(=CN=C23)C)N,1 +[O-][N+](=O)C2=C1C=CC=CC1=[N+](C=C2)[O-],1 +OC5C=CC4=C3C=C1C=CC=C2C=CC(=C12)C3=CC=C4C5O,1 +NC1=CC(=C(C=C1)[N+]([O-])=O)N,1 +OC1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +CC(O)CN(C)N=O,1 +CC1=C(C(=CC=C1)C)C,1 +C1N2CN3CN1CN(C2)C3,1 +CC4=C2C1=CC=CC=C1[NH]C2=C3C(C=C(C(C3=N4)=O)N5CC5)=O,1 +CN(C)CCNC(=O)C3=C2C=C1C=CC=CC1=CC2=CC=C3,1 +CC2=C4C=C1C=CC=CC1=C5C=CC3=CC=CC(=C2)C3=C45,1 +[O-][N+](=O)C1=CC=C(C=C1)C(=O)C2OC2C3=CC=CC=C3,1 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,1 +OC3=C1C=CC=CC1=C2C=CC=CC2=C3,1 +BrC=CBr,1 +CCCC=CC(=O)OC1C(C)(C)CC2C1(O)C=C(C=O)C34CC23C(=O)OC4O,1 +[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=C(C(=C2)Cl)Cl)O3,1 +NCCCNCCCCN(CCCN)N(O)N=O,1 +CC3=C2C1OC1C5=C(C2=C(C4=CC=CC=C34)C)C=CC=C5,1 +[O-][N+](=O)C1=CC=C(C=C1)C3=C([N]2C=CSC2=N3)[N+]([O-])=O,1 +CN(C)N=NC1=CC=C(C=C1)Br,1 +[O-][N+](=O)C3=CC=C2CC1=CC=CC=C1C2=C3,1 +NC(=NO)C1=CC=C(O1)[N+]([O-])=O,1 +C1=CC3=C(C=C1)C2=CC=CN=C2C=C3,1 +[O-][N+](=O)C1=C3C(=CC=C1)C2=CC=CC=C2[NH]3,1 +NC2=C1N=CC=CC1=CC=C2,1 +CC[N+]2=C(C1=CC(=CC=C1C3=CC=C(C=C23)N)N)C4=CC=CC=C4,1 +ON(N=O)C1=CC=CC=C1,1 +CC3=C(C=C2N=C1C=C(C(=CC1=CC2=C3)C)N)N,1 +NC1=CC(=C(C=C1)O)N,1 +NC2=C1C=CC=CC1=NC3=C2CCCC3,1 +CCN(CC)C1=CC=C(C=C1)C(C2=CC=C(C=C2)N(CC)CC)=C3C=CC(C=C3)=[N+](CC)CC,1 +CN(C)C1=CC=C(C=C1)C(=N)C2=CC=C(C=C2)N(C)C,1 +CC1=CC(=C(C=C1)N=NC3=C2C=CC(=CC2=CC(=C3O)S(O)(=O)=O)S(O)(=O)=O)C,1 +ClC=CC[N+]23CN1CN(CN(C1)C2)C3,1 +COC3=CC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NC(C)CCCN(CCCl)CCCl,1 +CC3=C(C=C2[N+](=C1C=C(C(=CC1=NC2=C3)C)N)C4=CC=CC=C4)N,1 +CN(C)CCCCl,1 +NC1=CC=C(C=C1)C(C2=CC=C(C=C2)N)=C3C=CC(=N)C=C3,1 +CN(C)C3=CC2=[S+]C1=CC(=CC=C1N=C2C=C3)N(C)C,1 +CC(COC1=CC=CC=C1)N(CCCl)CC2=CC=CC=C2,1 +CC1=C(C=CC(=C1)C(C2=CC=C(C=C2)N)=C3C=CC(=N)C=C3)N,1 +CN(C)C3=CC2=NC1=CC(=CC=C1C=C2C=C3)N(C)C,1 +CCN(CC)CCCC(C)NC2=C1C=C(C=CC1=NC3=CC(=CC=C23)Cl)OC,1 +ClCC1=NC=CC=C1,1 +ClCC1=CN=CC=C1,1 +CCN(CC)C1=CC3=C(C=C1)C(=C2C=CC(=CC2=[O+]3)N(CC)CC)C4=C(C=CC=C4)C(O)=O,1 +C[N+]2=C1C=C(C=CC1=CC3=CC=C(C=C23)N)N,1 +CN(C)C3=CC2=[S+]C1=CC(=C(C=C1N=C2C=C3)C)N,1 +NC(COC(=O)C=[N+]=[N-])C(O)=O,1 +NC1=NC=C(S1)[N+]([O-])=O,1 +CC(C)CCCC(C)C4CCC5C3CC1OC12CC(O)CCC2(C)C3CCC45C,1 +CCCCN(N=O)C(=N)N[N+]([O-])=O,1 +NC(CC1=CC=C(C=C1)N(CCCl)CCCl)C(O)=O,1 +COC2=CC=C1N=C(N)SC1=C2,1 +CN(N=O)C(=O)NC(C=O)C(O)C(O)C(O)CO,1 +CC2=CN(C1CC(N=[N+]=[N-])C(CO)O1)C(=O)NC2=O,1 +NC1=NC(=O)N(C=N1)C2OC(CO)C(O)C2O,1 +BrC2=C1C=C4C(=CC1=CC=C2)C3=CC=CC=C3C=C4,1 +OC2=C1C=CC(=CC1=C(N=N2)O)[N+]([O-])=O,1 +CCN(N=O)C(=N)N[N+]([O-])=O,1 +CN(C)N=NC1=C([NH]C=N1)C(N)=O,1 +OC1=NC(=NN=C1)O,1 +OC(CBr)C(O)C(O)C(O)CBr,1 +COC24C1NC1CN2C3=C(C(=C(C(=C3O)C)N)O)C4=COC(N)=O,1 +SC2=C1N=C[NH]C1=NC=N2,1 +OCC1OC(C(O)C1O)[N]2C=NC3=C(S)N=CN=C23,1 +NC(CC1=CC(=C(C=C1)O)O)C(O)=O,1 +NC(=NO)C1=CC=CC=C1,1 +CC(=O)NC(CS)C(O)=O,1 +CC1=C(C=CC(=C1)N)C2=CC=C(C=C2)O,1 +NC2=NC1=CC=C(C=C1S2)[N+]([O-])=O,1 +OCC1OC(CC1O)N2C=C(C(=O)NC2=O)C(F)(F)F,1 +CN(N=O)C(=N)N[N+]([O-])=O,1 +NC2=C1N=C[NH]C1=NC=[N+]2[O-],1 +NC2=C1N=C[N](C1=NC=N2)C3OC(CO)CC3O,1 +NC1=NC=CS1,1 +[O-][N+](=O)C1=CC=C(C=C1)CBr,1 +C=CC#N,1 +CCOP(=O)(OCC)OC1=CC=C(C=C1)[N+]([O-])=O,1 +ClCC(Br)CBr,1 +ClCCCl,1 +CC2=C1C(O)C(C)(C)C=C1C(=O)C(C)(O)C23CC3,1 +CC2=C1C(O)C(C)(CO)C=C1C(=O)C(C)(O)C23CC3,1 +CCCN(C(N)=NN=O)[N+]([O-])=O,1 +CCCCCN(N=O)C(=N)N[N+]([O-])=O,1 +CC(C)(O)C3CC2=C(C=C1OC(C=CC1=C2)=O)O3,1 +CN1C(SC2=C1C=CC=C2)=NN,1 +NC(CO)C(=O)NNCC1=C(C(=C(C=C1)O)O)O,1 +N1C(C1C2=CC=CC=C2)C3=CC=CC=C3,1 +CC(C)CC(=O)OCC1=COC(OC(=O)CC(C)C)C2C1CC(OC(C)=O)C23CO3,1 +C[N]1C(=CN=C1C2=NN=C(S2)N)[N+]([O-])=O,1 +C1=CC=C3C(=C1)C=C4C=CC=C5C2=C(C=CC=C2)C3=C45,1 +NC2=C1N=C([NH]C1=NC=N2)C3=CC=C(C=C3)[N+]([O-])=O,1 +COC4=C3C(=C2C(=C1C(CC(CC1=C(C2=C(C3=CC=C4)O)O)(O)C(C)=O)=O)O)O,1 +COC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=CC5=C3C4C=COC4O5)OC,1 +NC(CSC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O)C(O)=O,1 +ClCCN(CCCl)P1(=O)OCC(=O)CO1,1 +C[N+]2=C1C=CC=CC1=NC3=CC=CC=C23,1 +CS(=O)(=O)OCC(O)C(O)COS(C)(=O)=O,1 +CC(C)(N=NC(C)(C)C(N)=N)C(N)=N,1 +C[N+]([O-])(CCCl)CCCl,1 +N=NC1=NNC=C2C=CC=CC12,1 +[O-][N+](=O)C1=CC=C(S1)NC(=O)NCCCl,1 +OCC1OC(C(O)C1O)[N]2C=NC3=C(NO)N=CN=C23,1 +CCOC(=O)NNC2=C1C=CC=CC1=CN=N2,1 +CCN(CCCl)CCCNC2=C1N=C(C=CC1=NC3=CC(=CC=C23)Cl)OC,1 +CCN(CCCl)CCCNC1=C4C(=NC2=CC=CC=C12)C3=NC=CC=C3C=C4,1 +CC=C1CC(=C)C(C)(O)C(=O)OCC2=CCN3CCC(OC1=O)C23,1 +NCC(=O)NC1=CC=CC=C1,1 +CC(C)CN(N=O)C(N)=N[N+]([O-])=O,1 +CN1CC(=CC2C1CC3=C[NH]C4=CC=CC2=C34)C,1 +CC4CC1C(CC2=C[NH]C3=CC=CC1=C23)N(C)C4,1 +NC3=CC2=[S+]C1=CC(=CC=C1N=C2C=C3)N,1 +CC[N]2C1=CC=CC=C1C3=CC(=CC=C23)N,1 +CC2=CC=C1N=C(N)[NH]C1=C2,1 +CCN(CC)C1=CC=C(C=C1)C(C2=CC=CC=C2)=C3C=CC(C=C3)=[N+](CC)CC,1 +NC1=CC3=C(C=C1)C2=NC4=C(C(N2C3)=O)C=CC=C4,1 +C1OC1CC3=C2C=CC=CC2=CC=C3,1 +NC(CCC(=O)NC(CS)C(=O)NCC(O)=O)C(O)=O,1 +O=C(C1OC1C2=CC=CC=C2)C3=CC=CC=C3,1 +COC2=C(C1=NC3=C(C(=C1C=C2)OC)CCO3)OC,1 +NN=C1N=NC=C2C=CC=CC12,1 +NC(=O)CC1CO1,1 +CCC(C)ON=O,1 +CC3(C[N]1C=CN=N1)C(N2C(CC2=O)S3(=O)=O)C(O)=O,0 +CN(C)CCOC(=O)C=C,0 +ClC1=C(C=C(C(=C1)Cl)Cl)Cl,0 +CCOC(=O)COC1=CC2=C(C=C1)C(=O)C=C(O2)C3=CC=CC=C3,0 +CCCCCCCCCCCCC1=CC=CC=C1,0 +CCOC(=O)CC(C)C,0 +CCCCCOC(=O)C(C)=C,0 +CC1CCCC2(C)CCCCC12O,0 +CC(=C)C(=O)OCCOC(=O)C(C)=C,0 +ClC1=C(C=CC=C1)C=O,0 +OC1=C(C(=C(C=C1Cl)Cl)Cl)[N+]([O-])=O,0 +CCOC1=CC2=C(C=C1)NC(C)(C)C=C2C,0 +CCCCC(CC)COC(=O)C1=C(C=CC=C1)C(=O)OCC(CC)CCCC,0 +CCCCC(CC)COC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 +CCN(CC)CC#CC(C)(C)OC(=O)C(O)(C1CCCCC1)C2=CC=CC=C2,0 +CC(C)(C)COC(=O)C=C,0 +FC(Cl)C(F)(F)C(F)(F)Cl,0 +NC2=NC1=NC(=C(N=C1C(=N2)N)C3=CC=CC=C3)N,0 +COC(=O)C1=CC=C(C=C1)C(=O)OC,0 +ClC2=CC1=CC=CC=C1N=C2,0 +CC(=C)C(=O)OCCCCCOC(=O)C(C)=C,0 +CC(CC1=CC(=C(C=C1)O)O)C(C)CC2=CC(=C(C=C2)O)O,0 +OC1=C(C=C(C=C1)Cl)SC2=C(C=CC(=C2)Cl)O,0 +CC(=O)CC(=O)NC1=C(C=CC=C1)C,0 +C1CCOC1,0 +CCOCCC1=C(N=C([N]2N=CN=C12)N)C3=CC=CC=C3,0 +NCCS,0 +CC(C)(C)NC(=O)C3CCC4C2CC=C1C=C(CCC1(C)C2CCC34C)C(O)=O,0 +OC1=CC=C(C=C1)C2=CC=C(C=C2)O,0 +CC1=CC=C(C=C1)Br,0 +ClC3=C2C=C1C=CC=CC1=CC2=CC=C3,0 +COC2=C1OC=CC1=C(OC)C3=C2OC(C=C3)=O,0 +C2C1=C(C=CC=C1)C3=C2C=CC=C3,0 +CC2CCCC(=O)CCCC=CC1=C(C(=CC(=C1)O)O)C(=O)O2,0 +NC(CCC(O)=O)C(O)=O,0 +CC(O)C[N+](C)(C)NC(=O)C(C)=C,0 +CCOC(=O)OCC,0 +ClCC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,0 +C3CCC2OCCOCCOC1CCCCC1OCCOCCOC2C3,0 +ON1C(=O)CCC1=O,0 +CCN(CC)CCCN,0 +CC(C)CCOC(C)=O,0 +CC1=C(C(=CC(=C1)C2=CC(=C(C(=C2)C)N)C)C)N,0 +CCCCCCC(O)=O,0 +CC(C)C1C(C)C(C)(C)C2=C1C=C(C(=C2)C)C(C)=O,0 +OC(=O)CC(O)(CC(O)=O)C(O)=O,0 +ICI,0 +COC1=CC(=CC=C1)C(=O)CBr,0 +CCN(CC)CCO,0 +CC3CC1=C(C(=C(C=C1)C(=O)NC(CC2=CC=CC=C2)C(O)=O)O)C(=O)O3,0 +CCCCC1CO1,0 +CCOCOCC,0 +CC(=C)C(=O)OCCO,0 +COC1=CC=C(C=C1)C3=COC2=C(C(=CC(=C2)O)O)C3=O,0 +OCC(O)C1=C(C(=C(O1)O)O)O,0 +COC(=O)C1=CC=C(C=C1)C,0 +ClC1=CC(=CC(=C1)Cl)Cl,0 +NC(N)=O,0 +CCCCCl,0 +[O-][N+](=O)C1=CC=CC=C1,0 +C[N]1C=NC2=C1C(NC(N2C)=O)=O,0 +CC1=CC=NC=C1,0 +OC(=O)CCC1=C[NH]C2=CC=CC=C12,0 +CC(C)(C)NCC(O)COC2=C1CC(C(CC1=CC=C2)O)O,0 +NC(CC(=O)C1=C(C(=CC=C1)O)N)C(O)=O,0 +CC(N)CCN,0 +CC(S)C(=O)NCC(O)=O,0 +N#CCCCCC#N,0 +CCCCC(CC)COC(=O)C=CC1=CC=C(C=C1)OC,0 +CC1(C)CC(CC(C)(CN=C=O)C1)N=C=O,0 +CC1NC(CC2=C1[NH]C3=CC=CC=C23)C(O)=O,0 +CCOP(=S)(OCC)OC2=NC1=CC=CC=C1N=C2,0 +CCCCC(CC)COP(=O)(OCC(CC)CCCC)OCC(CC)CCCC,0 +CNS(=O)(=O)C1=CC=C(C=C1)NC(C)=O,0 +OC1=CC(=C(C(=C1)Cl)Cl)Cl,0 +CCOC1=CC=C(C=C1)N=[N+]([O-])C2=CC=C(C=C2)OCC,0 +C1=CC=C(C=C1)C2=CC=C(C=C2)C3=CC=CC=C3,0 +CCCCCCCCN1SC=CC1=O,0 +OC(=O)C1=C(C=CC(=C1)Cl)O,0 +NC1=NC(=NC(=N1)N)Cl,0 +CC1=C(C=C(C(=C1)O)C(C)(C)C)SC2=C(C=C(C(=C2)C(C)(C)C)O)C,0 +NC2C1=C(C=CC=C1)C3=C2C=CC=C3,0 +COC(N)=O,0 +FC2=CN(C1CCCO1)C(=O)NC2=O,0 +CC3(C)SC2C(NC(=O)COC1=CC=CC=C1)C(=O)N2C3C(O)=O,0 +COC1=CC=C(C=C1)C=C,0 +CC(=O)C2=CC1=CC=CC=C1C=C2,0 +NC1=NCNC2=C1N=C[N]2C3OC(CO)C(O)C3=O,0 +OC1=CC2=C(C=C1)C4=C(C(O2)=O)C3=CC=C(C=C3O4)O,0 +CCCCCCCC(=O)CCC1=CC(=C(C=C1)O)OC,0 +CC1CC(CC(C)(C)C1)OC(=O)C2=C(C=CC=C2)O,0 +OC(=O)CCCCCCCCC(O)=O,0 +COP(=O)(SC)SC,0 +OC(CC(O)=O)C(O)=O,0 +CC(=C)C(=O)OCC(C)(C)C,0 +CC(C)NCC(O)COC1=C(C=CC=C1)CC=C,0 +C1COCCOCCOCCOCCOCCOCCO1,0 +C=CC1=CC=NC=C1,0 +CC(NC(=O)CC1=C(N=C(N=C1)C)N)=C(CCOC(=O)C2=CC=CC=C2)SC(=O)C3=CC=CC=C3,0 +COC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 +CC(Cl)=O,0 +CCOC1=CC(=CC=C1)[N+]([O-])=O,0 +CC1=NC=C[NH]1,0 +CC(=O)NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)N,0 +CCOC(=O)CNC(=O)CBr,0 +OC(=O)C=CC(O)=O,0 +CN2C(CSCC(F)(F)F)NC1=C(C=C(C(=C1)Cl)S(N)(=O)=O)S2(=O)=O,0 +NC1CCC(CC1)CC2CCC(N)CC2,0 +CCCCC#N,0 +CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C,0 +CC2(N(O)C1=C(C=CC=C1)C2=O)C3=CC=CC=C3,0 +CC1=NC=C(N=C1)C,0 +CC(C)CCCCCOC(=O)C=C,0 +NC1=C(C=CC=C1)C(O)=O,0 +OC1=CC=CC=C1,0 +NC(=O)N(C1=CC=CC=C1)C2=CC=CC=C2,0 +CCCCCCCCCCCCS,0 +CC(C)N=C=NC(C)C,0 +COC1=CC=C(C=C1)CN(CCN(C)C)C2=NC=CC=C2,0 +CN(C(=O)CN(CCO)CC(=O)N(C)C(C)(C)CC1=CC=CC=C1)C(C)(C)CC2=CC=CC=C2,0 +CCOP(=S)(OCC)OC1=C(C=C(C(=N1)Cl)Cl)Cl,0 +CC(C)CC(C)=O,0 +OCC=CC1=CC=CC=C1,0 +NC1=CC(=CC(=C1)Cl)Cl,0 +CN1CCC(CC1)=C3C2=C(C=CC=C2)C=CC4=C3C=CC=C4,0 +COC1=CC=C(C=C1)O,0 +CCC(=C)C(=O)C1=C(C(=C(C=C1)OCC(O)=O)Cl)Cl,0 +CS(C)(=O)=O,0 +CC(C)(N=NC(C)(C)C#N)C#N,0 +CCC(O)=O,0 +CC(C)CN(CC(C)C)CC(C)C,0 +OC1=CC2=C(C(=C1)O)C(C(C(O2)C3=CC=CC=C3)=O)=O,0 +OCC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,0 +CCCCCC=CCC=CCCCCCCCC(O)=O,0 +CC1=C(C2=C(C=C1[N+]([O-])=O)C(CC2(C)C)(C)C)[N+]([O-])=O,0 +CCCCCCCCCCC1CO1,0 +O=P(OC1=CC=CC=C1)(OC2=CC=CC=C2)OC3=CC=CC=C3,0 +OC1=C(C(=C(C=C1Cl)Cl)Cl)Cl,0 +OCC(=O)N(O)C1=CC=C(C=C1)Cl,0 +CNP1(=NP(=NP(=N1)(NC)NC)(NC)NC)NC,0 +CC(C)(C#N)C(C)(C)C#N,0 +CS(=N)(=O)CCC(N)C(O)=O,0 +CCN(CC)C1=CC2=C(C=C1)C=C(C(=O)O2)C4=NC3=CC=CC=C3[N]4C,0 +NC(CC1=C[NH]C2=CC=C(O)C=C12)C(O)=O,0 +NC1=C(C=CC=C1)C(=O)OCCC2=CC=CC=C2,0 +OC(=O)C=CC1=C(C=CC=C1)[N+]([O-])=O,0 +CC1=CC3=C(C=C1)C2=CC=C(C=C2C3)C,0 +NC(=O)CCCCC(N)=O,0 +NC(=O)C1=C(C=CC=C1)O,0 +NC(CSC=CCl)C(O)=O,0 +O3C4C1OC1C2=C(C=CC=N2)C34,0 +C[N]2C(=NC3=NC1=NC=CC=C1C=C23)N,0 +CC1=C(C=CC=C1)C=O,0 +CCCCCN(CCCCC)CCCCC,0 +CC(=O)OC2=C1N=CC=CC1=CC=C2,0 +OC(=O)C2=C(C=C1C=CC=CC1=C2)O,0 +CCCCC(CC)CNCC(CC)CCCC,0 +CC(C)NC1=NC(=NC(=N1)N)Cl,0 +[NH]1C=CN=C1,0 +OC(=O)CC(NC(=O)COC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 +OCCS,0 +O=S1(=O)CCCC1,0 +CC(C)C(C(=O)OC(C#N)C1=CC(=CC=C1)OC2=CC=CC=C2)C3=CC=C(C=C3)Cl,0 +CCC(C)N,0 +CCCCNC(=O)[N]1C(=NC2=CC=CC=C12)NC(=O)OC,0 +O(C1=CC=CC=C1)C2=CC=CC=C2,0 +CC(C)(C)NCC(O)C1=CC(=C(C=C1)O)NC(N)=O,0 +CN2C(=O)CC(=O)N(C1=CC=CC=C1)C3=C2C=CC(=C3)Cl,0 +CN(CCO)CCO,0 +CC1=C(C(=CC=C1)O)N,0 +CCC(CO)=[N+](O)[O-],0 +OC(=O)C(F)(F)C(F)(Cl)C(F)(F)C(F)(Cl)C(F)(F)Cl,0 +CC(C)OC(=O)CC(O)(CC(O)=O)C(O)=O,0 +CC(C)(C)OC(=O)OC(=O)OC(C)(C)C,0 +ClN1C(=O)N(Cl)C(=O)N(Cl)C1=O,0 +OC1=CC(=CC=C1)NC2=CC=CC=C2,0 +CC1=C(C=CC=C1N=[N+]([O-])C2=C(C(=CC=C2)[N+]([O-])=O)C)[N+]([O-])=O,0 +NC=O,0 +OC1=C(C=C(C=C1)Cl)CC2=CC=CC=C2,0 +CN(N)C=O,0 +CC2=CC=C1N=N[NH]C1=C2,0 +CCCCCCCC(O)=O,0 +CC1=CC=C(C=C1)N(O)C(C)=O,0 +COC1=C(C=C(C(=C1)N)C)N,0 +COC(=O)C1=CC=C(C=C1)O,0 +OC(=O)CC(=CC(O)=O)C(O)=O,0 +NC(=O)C1=NC=CN=C1,0 +CCN(CC1=CC=CC=C1)C2=CC=CC=C2,0 +CNC(=O)ON=CC(C)(C)SC,0 +O=CC2=C1C=CC=CC1=CC3=CC=CC=C23,0 +C1COCO1,0 +OC(=O)C(Br)=C,0 +C=CC1=C(C=CC=C1)C=C,0 +OS(=O)(=O)C1=CC=CC=C1,0 +CCCCCN(CCCOC)C(=O)C(CCC(O)=O)NC(=O)C1=CC(=C(C=C1)Cl)Cl,0 +C=CC(=O)OCCCCOC(=O)C=C,0 +C(OCC1=CC=CC=C1)C2=CC=CC=C2,0 +BrC1=C(C2=C(C(=C1Br)Br)C(=O)OC2=O)Br,0 +CC(C)N2C(=O)C1=C(C=CC=C1)NS2(=O)=O,0 +CCOP(=S)(OCC)SCN1C(=O)OC2=C1C=CC(=C2)Cl,0 +C=CCN(CC=C)CC=C,0 +CCNC1=CC=CC=C1,0 +NC1=C(C=CC=C1O)[N+]([O-])=O,0 +CC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O,0 +CC(C)(OC1=CC=C(C=C1)C(=O)C2=CC=C(C=C2)Cl)C(O)=O,0 +CCOC(=O)C4=CC1=C(C3=C2C(=C1)CCCN2CCC3)OC4=O,0 +COC(=O)C(=CC1=C(C=CC=C1)Br)C#N,0 +CCCCC1C(=O)N(N(C1=O)C2=CC=CC=C2)C3=CC=CC=C3,0 +CC(C)(C)OOC(C)(C)C,0 +CC1=C(C=CC=C1)C(N)=O,0 +CC(C)(OOC(C)(C)C1=CC=CC=C1)C2=CC=CC=C2,0 +CCCCOC(=O)CCC,0 +CCCCOCCCC,0 +CCC(C)=[N+](O)[O-],0 +NC(=O)C1CCCN1C(=O)C(CC2=C[NH]C=N2)NC(=O)C3CCC(=O)N3,0 +CCCC=C(CC)C=O,0 +CC1=CC=C(C=C1)C#N,0 +C2=CC1=CN=NC=C1C=C2,0 +ClC1=C(C(=CC=C1)Cl)C=O,0 +COC1=C(C=CC(=C1)C(C)=O)O,0 +CC(C)COC(=O)C(C)=C,0 +CC(C)(C)C1=C(C=CC(=C1)O)O,0 +NC1CCCC(N)C1,0 +CCCCOC(=O)C1=CC=C(C=C1)N,0 +CC1CCC(CC1)C(C)C,0 +NCCCN,0 +CC1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O,0 +OC1=CC=C(C=C1)NC3=CC2=CC=CC=C2C=C3,0 +CCCCC(CC)C(O)=O,0 +ClCC(Cl)C=C,0 +CC(C)CCOC(=O)CC(C)C,0 +NCC(O)=O,0 +OCC1=CC=C(C=C1)F,0 +CCCCOCCOCCSC#N,0 +O=C2N(SC1CCCCC1)C(=O)C3=C2C=CC=C3,0 +CC3=NN=C4CN=C(C1=C(C=CC=C1)Cl)C2=CC(=CC=C2[N]34)Cl,0 +OC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 +ON(C=O)C1=CC=CC=C1,0 +[O-][N+](=O)C1=CC(=CC=C1)Cl,0 +[O-][N+](=O)C1=CC2=C(C=C1)NC(=O)CN=C2C3=CC=CC=C3,0 +OC(C(O)C(O)=O)C(O)=O,0 +CS(=O)(=O)C=C,0 +CC(C)CC(C)O,0 +O=CC=CC1=CC=CC=C1,0 +CC(C)CNCC(C)C,0 +BrC1=C(C=CC=C1)C2=CC=CC=C2,0 +NC1=CC=C(C=C1)S(=O)(=O)NC3=NC2=CC=CC(=C2N=C3)Cl,0 +CN2C(=O)N(C)C1=C(N=C[NH]1)C2=O,0 +COC=O,0 +OC(=O)C(O)=O,0 +ClC(Cl)(Cl)C(Cl)(Cl)Cl,0 +CSCCC(NC(=O)COC1=C(C=C(C(=C1)Cl)Cl)Cl)C(O)=O,0 +CCCCCCCCCCCCCCCCCCO,0 +OC(=O)CN(CC(O)=O)CC(O)=O,0 +CCCN(CCC)C(=O)SCC,0 +CC1=C(C=C(C=C1)NCCO)O,0 +CC=O,0 +CC1(C)C=C(C(O)=O)C(C)(C)N1O,0 +OC(O)=O,0 +CCCCCCC1CO1,0 +CCCCCC(=O)CC2=C1C(OC3=C(OC1=CC(=C2)O)C(=C(C(O)=O)C(=C3)O)CCCCC)=O,0 +COC1=C(C=C(C=C1)CC=C)OC,0 +CC1=CC(=CC=C1)OP(=O)(OC2=CC=CC=C2)OC3=CC=CC=C3,0 +[O-][N+](=O)C1=CC=C(C=C1)OC2=C(C=C(C=C2Cl)Cl)Cl,0 +O=C3OC2=C1C=COC1=CC=C2C=C3,0 +COC1=C(C(=CC(=C1)C(C)=O)OC)O,0 +COC1(CCCC1)OC5CCC6C4CCC3CC2SC2CC3(C)C4CCC56C,0 +OCC(O)COP(O)(O)=O,0 +CCCCCCNCCCCCC,0 +CSCCC=O,0 +OCCOCCO,0 +CN(C)C1=CC=C(C=C1)C(=C2C=CC(=N)C=C2)C3=CC=C(C=C3)N(C)C,0 +O=C1NC(=O)C2CC=CCC12,0 +CN1CCCC1=O,0 +C=CC1=NC=CC=C1,0 +CCCCC(CC)COP(=O)(OC1=CC=CC=C1)OC2=CC=CC=C2,0 +OC1=CC3=C(C=C1)C(=O)C2=C(C=CC(=C2)O)C3=O,0 +C3CCC2OCCOCCOCCOC1CCCCC1OCCOCCOCCOC2C3,0 +CCCCCCCCCCCCCC[N+](C)(C)CC1=CC=CC=C1,0 +NCC(=O)NCC(=O)NCC(=O)NCC(O)=O,0 +OC1=C(C=CC=C1)C3=NC2=CC=CC=C2O3,0 +CCOP(=O)(CC)OCC,0 +CC(C)=CCC2C(=O)C(=O)C1=C(C=CC=C1)C2=O,0 +BrCC1=CC=C(C=C1)Br,0 +CC1=CC(=O)C=C(C)C1=O,0 +CC5CC2C(CC3=C[N](CC1CC1)C4=CC(=CC2=C34)Br)N(C)C5,0 +CC(=C)C(=O)OCCOCCOCCOC(=O)C(C)=C,0 +OC[P+](CO)(CO)CO,0 +OC2=CC1=C(C=C(C=C1C=C2)S(O)(=O)=O)S(O)(=O)=O,0 +CC(=O)OC3(CCC4C2C=C(Cl)C1=CC(=O)OCC1(C)C2CCC34C)C(C)=O,0 +C1=CC=C4C(=C1)N=C3C2=C(C=CC=C2)C6=C3C4=C5C=CC=CC5=N6,0 +CC1=CC=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3O,0 +COC1=CC(=C(C(=C1)OC)Cl)N2C(=CC(=O)C(=C2C3=CC=C(C=C3)F)C)C4=CC=CC=C4,0 +COC1=CC=C(C=C1)C(Cl)=C(C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC,0 +ClCC1=C(C=CC=C1)CCl,0 +CCC(=C(CC)C1=CC=C(C=C1)OP(O)(O)=O)C2=CC=C(C=C2)OP(O)(O)=O,0 +CC1=NOC(=C1C)NS(=O)(=O)C2=CC=C(C=C2)N,0 +CCCCCCCCCCCCCCCCC1CO1,0 +COC(=O)C1=C(C)NC(=C(C1C2=C(C=CC=C2)[N+]([O-])=O)C(=O)OC)C,0 +OC1=CC=C(C=C1)CC=C,0 +ClC1=CC(=CC=C1)Cl,0 +CC1=C(C=C(C=C1)[N+]([O-])=O)NO,0 +CC3(O)CCC4C2CCC1CC(=O)C(CC1(C)C2CCC34C)C=O,0 +CC1=C(C(=CC=C1)C)NC2=NC(=NC(=C2)Cl)SCC(=O)NCCO,0 +CCOC(=O)C1=C(C=CC=C1)N,0 +CCCC(O)=O,0 +NC3=NC(=C2N=C(O)[N](C1CC(O)C(CO)O1)C2=N3)O,0 +ClC1=CC(=C(N=C1)OC2=CC=C(C=C2)OC3=C(C=C(C=N3)Cl)Cl)Cl,0 +COC1=C(C=CC(=C1)CCC(C)=O)O,0 +NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)N,0 +NC(=O)C1=CC=C(C=C1)N,0 +CC=[N+](O)[O-],0 +OC(=O)CCC(=O)NC1=CC(=C(C=C1)Cl)Cl,0 +CCCC(C)(COC(N)=O)COC(=O)NC(C)C,0 +COC2=CC1=CC=C(C=C1C=C2)CCC(C)=O,0 +OC(=O)COC1=C(C=C(C(=C1)Cl)Cl)Cl,0 +OCCN(CCO)CCO,0 +OC(C1CC1)(C2=CC=C(C=C2)Cl)C3=CC=C(C=C3)Cl,0 +CC(=O)N(O)C1=CC=C(C=C1)Cl,0 +ClC1=C(C(=CC=C1)Cl)Cl,0 +CC(C)[N+](C)(CCOC(=O)C2C1=C(C=CC=C1)OC3=C2C=CC=C3)C(C)C,0 +ClC1=CC=C(C=C1)Cl,0 +COC1=C(C=CC(=C1)C=CC(O)=O)O,0 +CCCCCCC1=CC=C(C=C1)C2=CC=C(C=C2)C#N,0 +CCN1C=C(C(O)=O)C(=O)C2=C1C(=C(C(=C2)F)C3=CC=NC=C3)F,0 +CC1=CC=CO1,0 +OCC1OC(CC1O)N2C=C(CCCl)C(=O)NC2=O,0 +NC1=NC(=CC(=N1)Cl)Cl,0 +OC1=C(C=CC=C1)C(=O)OCC2=CC=CC=C2,0 +C2=NC=C1C=NN=CC1=C2,0 +FC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 +NC(=O)C1=C(C=CC=C1)C(N)=O,0 +CC(=O)NC1=CC=C(C=C1)CC2=CC=C(C=C2)N,0 +COC3=C1C(N(C(C2=CC=CC(=C12)C=C3)=O)C)=O,0 +CCCCOC(=O)C=C,0 +O=C1OCC=C1,0 +[O-][N+](=NC1=CC3=C(C=C1)C2=CC=CC=C2C3)C4=CC6=C(C=C4)C5=CC=CC=C5C6,0 +CC(CS)C1CCC(C)C(S)C1,0 +CC(=O)C1C(=O)OC(=CC1=O)C,0 +NC(=O)NN=CC(O)=O,0 +CCCCCCNC(=O)N1C=C(F)C(=O)NC1=O,0 +N#CCC#N,0 +CC(CCC(O)=O)C3CCC4C2CCC1CC(O)CCC1(C)C2CCC34C,0 +[O-][N+](=O)C1=C(C=CC=C1)C(F)(F)F,0 +COC1=C(C(=C(C(=C1Cl)Cl)[N+]([O-])=O)Cl)Cl,0 +CCCCN(N)CCCC,0 +CCOC(=O)OC(C1CC2CCN1CC2C=C)C4=C3C=C(C=CC3=NC=C4)OC,0 +BrC1=CC=C(C=C1)C2=CC=CC=C2,0 +ClCC(CCl)(CCl)CCl,0 +ClC1=CC=C(C=C1)C3=NC2=CC=CC=C2O3,0 +FC(F)(F)C(F)(F)C(Cl)Cl,0 +CN(C)CCN(CC1=CSC=C1)C2=NC=CC=C2,0 +CC1=C(C=C(C=C1)[N+]([O-])=O)N=[N+]([O-])C2=C(C=CC(=C2)[N+]([O-])=O)C,0 +O=C(C=CC=CC1=CC2=C(C=C1)OCO2)N3CCCCC3,0 +CC(O)CNCC(C)O,0 +CCN(CC)C1=CC(=C(C=C1)N=O)O,0 +COC1=CC=C(C=C1)OC,0 +NC1=CC(=C(C(=C1)C(O)=O)O)S(O)(=O)=O,0 +NC1=C(C=CC(=C1)S(O)(=O)=O)O,0 +CCOP(O)(OC1=CC(=C(C=C1)SC)C)=NC(C)C,0 +FC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 +CC(Br)C1=CC=CC=C1,0 +OCCN1CCNCC1,0 +COC1=CC=C(C=C1)C2=NOC(=C2C3=CC=C(C=C3)OC)CC(O)=O,0 +OC1=C(C=C(C=C1Cl)Cl)NC(=O)C2=C(C(=CC(=C2O)Cl)Cl)Cl,0 +[O-][N+](=O)C1=C(C=CC=C1)C=CC(=O)C2=CC=CC=C2,0 +OC(=O)C1=CC=CC=C1,0 +S=C(NC1CCCCC1)NC2CCCCC2,0 +OC1=C(C=C(C=C1Br)C#N)Br,0 +CC1(C)CC(C(O)=O)C(C)(C)N1O,0 +OC1=C(C(=CC(=C1)Cl)Cl)Cl,0 +CC13CCC(=O)CC1=C2CC2C4C3CCC6(C)C4C5CC5C67CCC(=O)O7,0 +CN2C(=O)CN=C(C1=CC=CC=C1)C3=C2C=CC(=C3)Cl,0 +CC5=CC4=C3C=CC2=C1C=CC=C(C1=CC=C2C3=CC=C4C=C5)C,0 +CCCCCOC(=O)C=C,0 +CCCCOC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,0 +CNC(O)=NO,0 +CC1=CC(=CC(=C1)C)C,0 +CNCC(O)C1=CC(=C(C=C1)O)O,0 +O2C1=CC=CC=C1N=C2C3=CC=CC=C3,0 +CCCCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCCC,0 +O=C1CN(CC2N1CCC3=C2C=CC=C3)C(=O)C4CCCCC4,0 +OCC1=CC=CC=C1,0 +CCN(CC)CC,0 +BrC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 +NC1=CC3=C(C=C1)C(=C2C=CC(C=C2O3)=N)C4=C(C=CC=C4)C(O)=O,0 +BrCC1=CC(=CC=C1)CBr,0 +OC1=C(C(=CC=C1)Cl)Cl,0 +CNCCO,0 +O=C(OC1CCCCC1)C2=C(C=CC=C2)C(=O)OC3CCCCC3,0 +CN(C)C(=O)C1=N[N](C(=N1)CNC(=O)CN)C2=C(C=C(C=C2)Cl)C(=O)C3=C(C=CC=C3)Cl,0 +CC(=C)C(=O)OCCCCCCOC(=O)C(C)=C,0 +CC(CCO)CCC=C(C)C,0 +CCSC(Cl)=O,0 +NC1=C(C(=CC(=C1)Cl)Cl)O,0 +ClN1C(=O)NC(=O)N(Cl)C1=O,0 +C[N+](C)(C)NCCC(O)=O,0 +ClC1=CC=C(C=C1)C(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl,0 +OC(=O)C2=NC1=CC=CC=C1C(=C2)O,0 +ClC2=C(Cl)C3(Cl)C1COS(=O)OCC1C2(Cl)C3(Cl)Cl,0 +OC2=CC1=NC=CC=C1C=C2,0 +CC(=O)C1=C(C=CC=C1)[N+]([O-])=O,0 +CCNS(=O)(=O)C1=CC=C(C=C1)C,0 +CC(Cl)(Cl)C(O)=O,0 +C1=CC=C(C=C1)C2=CC(=CC=C2)C3=CC=CC=C3,0 +COC1=C(C(=CC=C1Cl)Cl)C(O)=O,0 +CCOC(=O)C(C)=C,0 +NCCC1=C[NH]C=N1,0 +CC(COC(=O)C1=CC=CC=C1)(COC(=O)C2=CC=CC=C2)COC(=O)C3=CC=CC=C3,0 +OC(=O)C1=CC=C(C=C1)C(O)=O,0 +O=CC1=CC(=CC=C1)C2=CC=CC=C2,0 +NCCCCCCN,0 +CNCC(O)=O,0 +OC1=CC(=CC(=C1)O)O,0 +CC(=O)C1=CC3=C(C=C1)OC2(CC2)C3=O,0 +CC(=C)C(=O)OCC(C)(C)COC(=O)C(C)=C,0 +OC1=C(C(=C(C=C1[N+]([O-])=O)[N+]([O-])=O)O)[N+]([O-])=O,0 +CCC(C)C=O,0 +NC1=C(C=CC(=C1)C(F)(F)F)Cl,0 +CN(C)C,0 +CC(C)NC1=CC=CC=C1,0 +OC(=O)C1=CC=C(C=C1)N=NC2=CC(=C(C=C2)O)C(O)=O,0 +OC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)O,0 +CN(C)C1=CC=CC=C1,0 +ClC1=CC=NC=C1,0 +FC(Cl)(Cl)Cl,0 +CC1(C)SSCC(NC1=O)C(O)=O,0 +C2=CC1=CC5=C(C=C1C=C2)C4=CC=C3C=CC=CC3=C4C=C5,0 +CC1=CC=C(C=C1)C3=NC2=CC=CC=C2O3,0 +CCCCCCCOC1=C(C=CC=C1)NC(=O)OC(C)CN(CC)CC,0 +CC(CCC(O)=O)C3CCC4C2C(O)CC1CC(O)CCC1(C)C2CCC34C,0 +CCOP(=S)(OCC)OC1=CC2=C(C=C1)C(=C(Cl)C(=O)O2)C,0 +FC1=C(C(=C(C(=C1F)Cl)F)Cl)F,0 +COC1=CC=C(C=C1)CCl,0 +NC1=C(C(=CC=C1)[N+]([O-])=O)O,0 +O=C3CCC(N2C(=O)C1=C(C=CC=C1)C2=O)C(=O)N3,0 +NC(=N)C1=CC=CC=C1,0 +CC(=C)C1CC=C(C)C(=O)C1,0 +CN(C)C1=CC=C(C=C1)N=NC2=CN=CC=C2,0 +ClCC(=O)C1=CC=CC=C1,0 +NC(CCCCNCC(N)C(O)=O)C(O)=O,0 +OC(=O)CCC(O)=O,0 +CC34C=CC2=C1CCC(=O)CC1=CCC2C3CCC4O,0 +OC(=O)C1=CN=CC=C1,0 +CC1=CC=C(C=C1)C=O,0 +CC(=C)C1CC=C(C)C(O)C1,0 +C2CCCCCC1OC1CCCC2,0 +CC(C)CN,0 +CC(=O)C=CC1=CC=CO1,0 +CCC2=C1[NH]C=C(C1=CC=C2)CCO,0 +CC2CC(C)(C)C1=C(C=C(C(=C1)C(C)=O)C)C2(C)C,0 +CCCCCCCCCCCC(=O)N(CCO)CCO,0 +CNC(CC(O)=O)C(=O)N(C2C1SC(C)(C)C(N1C2=O)C(O)=O)C(C(N)=O)C3=CC=C(C=C3)O,0 +CC1(C)C(C=C(Cl)Cl)C1C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3,0 +NC2=NC(=C1[NH]C=NC1=N2)N,0 +OC1COC2C(COC12)O[N+]([O-])=O,0 +CC(C)CC(=O)OCC=C,0 +CCCC(=O)OC1CCCCC1,0 +COC3=CC(=C2C(=O)OC1=CC(=CC(=C1C2=C3)C)O)O,0 +ClC1=NC(=NC(=C1)Cl)Cl,0 +[O-][N+](=O)C1=C(C=CC=C1)NC2=CC=CC=C2,0 +OC(=O)C3CC1=C([NH]C2=CC=CC=C12)C(N3)C4=CC=CC=C4,0 +OCCC#N,0 +CC(C)CC(NC(=O)COC1=C(C=C(C(=C1)Cl)Cl)Cl)C(O)=O,0 +OC(=O)CCCC1=C[NH]C2=CC=CC=C12,0 +COP(=O)(OC)SC,0 +CCCCCCCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCCCCCC,0 +OCC1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O,0 +CN1CCCN(C)C1=O,0 +OC2(CCN(CCCC(=O)C1=CC=C(C=C1)F)CC2)C3=CC=C(C=C3)Cl,0 +ClC1=CC(=C(C=C1)C=O)Cl,0 +CC1=CC(=CC=C1)N,0 +CC1(C)C2CCC1(C)C(O)C2,0 +BrC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 +C=CCOC(=O)C=C,0 +CCCCCC=[N+](O)[O-],0 +CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC,0 +CS(O)(=O)=O,0 +O=C3C(=O)C1=C(C=CC2=CC=CC=C12)C4=C3C=CC=C4,0 +CC(C)=CC1C(C(O)=O)C1(C)C,0 +NC2=CC1=CC=CN=C1C=C2,0 +CCCCOCCOP(=O)(OCCOCCCC)OCCOCCCC,0 +OC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 +OCC1=CC(=CC=C1)[N+]([O-])=O,0 +NC1=CC=C(C=C1)S(=O)(=O)NC2=NC=CS2,0 +ON=CC(=O)NC1=CC=CC=C1,0 +CC(C=O)=CC=CC(C)=CC=CC=C(C)C=CC=C(C)C=CC1=C(C)CCCC1(C)C,0 +CC(C)C1=CC(=C(C=C1)C)O,0 +CC(=O)CCC(C)=O,0 +OC(=O)CC1=C[NH]C2=CC=C(O)C=C12,0 +CCCCC(CC)COC(=O)C(C#N)=C(C1=CC=CC=C1)C2=CC=CC=C2,0 +CC(=O)CC(=O)CCC(O)=O,0 +OC(=O)C=CC1=CC(=C(C=C1)O)O,0 +OC2=C1N=CC=CC1=C(C=C2I)Cl,0 +CC(C)(C)C(=O)C(OC1=CC=C(C=C1)Cl)[N]2C=CN=C2,0 +CC3=C2C=C1C=CC=CC1=CC2=CC=C3,0 +OC1OCC=C2OC(=O)C=C12,0 +CC3=C2C1=CC(=CC(=C1C(OC2=CC(=C3)O)=O)O)O,0 +CC(=C)C(=O)OCCOCCOC(=O)C(C)=C,0 +CCCCC(CC)C=O,0 +CCC2=CN(C1CC(O)C(CO)O1)C(=O)NC2=O,0 +NS(=O)(=O)C1=C(C=C2C(=C1)S(NCN2)(=O)=O)Cl,0 +CC(C)C1=C(C=C(C=C1)C)O,0 +ClC1=CC(=CN=C1)Cl,0 +CCC2NC(=O)C1=C(C=C(C(=C1)S(N)(=O)=O)Cl)N2,0 +CN(C)C1=CC=C(C=C1)C=CC=O,0 +CC(C)NCC(O)COC2=C1C=CC=CC1=CC=C2,0 +O=CC1=CC=CC=C1,0 +CC(C(O)=O)C1=CC=C(C=C1)OC2=NC=CS2,0 +ClC2=C(C1=CC=CC=C1C(=C2Cl)Cl)Cl,0 +CCNCC#CC(C)(C)OC(=O)C(O)(C1CCCCC1)C2=CC=CC=C2,0 +O=C(C=CC1=CC=C(C=C1)C2=CC=CC=C2)C3=CC=CC=C3,0 +COC2=CC1=C(C=CN=C1C=C2)C(O)C3CC4CCN3CC4C=C,0 +ClCC1=CC(=CC=C1)CCl,0 +CCN=C=S,0 +NC1CCC(N)CC1,0 +OC1=C(C=CC=C1)C2=C(C=CC=C2)O,0 +FCC(F)(F)F,0 +FC(F)(F)C1=CC=CC=C1,0 +OC2=C(C1=CC=C(C=C1C=C2)S(O)(=O)=O)N=NC3=CC=C(C=C3)S(O)(=O)=O,0 +CC(CCC=C(C)C)CC=O,0 +ClCCN(CCCl)CCCl,0 +ClCC1=CC=C(C=C1)Br,0 +CCCCCCCCC1CO1,0 +O=C1CCCO1,0 +ClC1=C(C3=C(C(=C1Cl)Cl)OC2=C(C(=C(C(=C2Cl)Cl)Cl)Cl)O3)Cl,0 +CCOC(=O)C(C)=O,0 +CCCCCCCCC,0 +O=C1C=CC(=O)N1C2=CC=C(C=C2)CC3=CC=C(C=C3)N4C(=O)C=CC4=O,0 +FC1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,0 +CCC1=CC=C(C=C1)C,0 +C2CC1OC1CCC3OC23,0 +CC1=CC(=CC=C1)Br,0 +CCSC(=O)N1CCCCCC1,0 +CN(C)CC1=CC=CC=C1,0 +CC1=CC(=CC=C1)C,0 +O(P(OC1=CC=CC=C1)OC2=CC=CC=C2)C3=CC=CC=C3,0 +ClC=CCl,0 +CSSC,0 +N#CC=CC#N,0 +CN3C(=O)C24CC1=CC=CC(O)C1N2C(=O)C3(CO)SS4,0 +OC(=O)C=CC=CC(O)=O,0 +C=CC(=O)N1CCN(CC1)C2=CC=CC=C2,0 +COC1=CC=C(C=C1)C=O,0 +ClC1=CC=C(C=C1)CSC2=CC=C(C=C2)Cl,0 +ClC1C(Cl)C(Cl)C(Cl)C(Cl)C1Cl,0 +CC1=C(SCCO1)C(=O)NC2=CC=CC=C2,0 +CCOC(=O)C(SP(=S)(OC)OC)C1=CC=CC=C1,0 +CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C,0 +CN3C(C(=O)NC1=NC=CC=C1)C(=O)C2=C(C=CS2)S3(=O)=O,0 +CCOP(=S)(OCC)SCSCC,0 +CCCCOCCOCCO,0 +COC1=CC=C(C=C1)CO,0 +OC3=C2C(=C1C(=CC=CC1=CC2=CC=C3)O)O,0 +CC1=C(C(=C(C(=C1C)[N+]([O-])=O)C(C)(C)C)[N+]([O-])=O)C,0 +CCCCCC(=O)OCC,0 +C[N]1C=CC=C1,0 +OC(C#N)C1=CC=CC=C1,0 +CC(O)C2C1SC(=C(N1C2=O)C(O)=O)C3CCCO3,0 +CCC(C)(C)C1=CC=C(C=C1)O,0 +OCC(O)C(O)C(O)C(O)CO,0 +ClC1=CC=C(C=C1)C=O,0 +FC1=C(C(=C(C(=C1F)F)Cl)F)F,0 +[O-][N+](=O)C1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,0 +O=C(NC1=CC=CC=C1)NC2=CC=CC=C2,0 +CC(C)(C)C2=CC(=CC=C1C=C(C(=O)C(=C1)C(C)(C)C)C(C)(C)C)C=C(C2=O)C(C)(C)C,0 +CCC1(CC(O)=O)OCCC2=C1[NH]C3=C(C=CC=C23)C(C)O,0 +O[N+]([O-])=C=CC1=CC=CO1,0 +CC(C)C1CC=C(C)C2CC=C(C)CC12,0 +[O-][N+](=O)C1=C(C=CC=C1)CBr,0 +CC1(C)C2CCC(=C)C1C2,0 +N#CC1=CC=CC=C1,0 +OS(=O)(=O)C1=C(C=CC=C1)[N+]([O-])=O,0 +CCCCC(CC)COC(=O)CCCCC(=O)OCC(CC)CCCC,0 +CC(=O)NC1=CC=C(C=C1)CC(O)=O,0 +CC4SC5=C(C(O)=O)C(=O)C1=C(C=C(C(=C1)F)N2CCN(CC2)CC3=C(C)OC(=O)O3)N45,0 +CCCCCCCCOC1=CC=C(C=C1)C(O)=O,0 +CN(C)C1=CC=C(C=C1)C(C2=CC=CC=C2)C3=CC=C(C=C3)N(C)C,0 +N#CC(C#N)=C(C#N)C#N,0 +CC1=CN=CC=C1,0 +[O-][N+](=O)C2=C1C=CC=CC1=C(C3=CC=CC=C23)[N+]([O-])=O,0 +CCOCCO,0 +CN(C(C)=O)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C(C)=O,0 +CC(C)CCCCCCCOC(=O)C(C)=C,0 +CCC(C(C)O)=[N+](O)[O-],0 +CCC34CCC1C(CCC2=CC(=O)CCC12)C3CCC4(O)C#C,0 +OCC2=C1C=CC=CC1=NC=C2,0 +OC2=CC1=CC=CN=C1C=C2,0 +NC1=C(C=CC=C1)C(=O)OCC=C,0 +NC1=NC=CC=C1,0 +CCCC=O,0 +CC(=O)CC(C)(C)NC(=O)C=C,0 +CCOP(=S)(OCC)SCCl,0 +ClC1=C(C(=CC=C1)C=O)Cl,0 +CCCCCCCCCCCCCCCCCCCC,0 +CC(=O)OCC=C(C)C=CC=C(C)C=CC1=C(C)CCCC1(C)C,0 +CC(C)COC(=O)CCCCC(=O)OCC(C)C,0 +OC(=O)C1=CC=C(C=C1)Cl,0 +CC(C)(N)C1CCC(C)(N)CC1,0 +CCCCCCCCCCCC(=O)OOC(=O)CCCCCCCCCCC,0 +CC1=C(C=C(C(=C1)C)S(O)(=O)=O)N=NC3=C(C2=CC=CC=C2C(=C3)S(O)(=O)=O)O,0 +COC2=CC=C1[NH]C=C(CCNC(C)=O)C1=C2,0 +CC(C)NC1=NC(=NC(=N1)Cl)NC(C)C,0 +CC(C)COC(=O)CC1=CC=CC=C1,0 +CC(=C)C(=O)OC(C)(C)C,0 +COC(C)(C)CC(C)=O,0 +CC1=C(C=C(C(=N1)O)C#N)C2=CC=NC=C2,0 +CCOP(=O)(OCC)OC(=CBr)C1=C(C=C(C=C1)Cl)Cl,0 +COC1=CC=C(C=C1)CN(C)N=O,0 +CCOP(=S)(OCC)SCSC(C)(C)C,0 +FC1=C(C=CC=C1)C2=CC=CC=C2,0 +ClC2=CC1=CC=CC=C1C=C2,0 +OC(=O)C1CSCN1,0 +OC1=NSC2=CC=CC=C12,0 +NC1=C(C(=CC=C1)[N+]([O-])=O)CO,0 +N#CC1=CC(=CC=C1)C#N,0 +CCOC(=O)CNC(=O)CCCCSC2=C1N=C[NH]C1=NC=N2,0 +CCOCCOC(=O)C=CC1=CC=C(C=C1)OC,0 +CCCCCCCCCC=C,0 +CC(=O)CC(C)(C)O,0 +CCNC1=NC(=NC(=N1)N)Cl,0 +CC(C)=CCCC(C)=CCO,0 +CCCCC(CC)COC(=O)CCCCCCCCC(=O)OCC(CC)CCCC,0 +CC1=CC=C(C=C1)CO,0 +CCC(C)(C)OC,0 +ClC1=C(C=CC=C1)Cl,0 +CCOC1=C(C=CC=C1)N,0 +OCC1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,0 +OCC1OC(CC1O)N2C=C(C=CBr)C(=O)NC2=O,0 +CC(=O)OC1=CC2=C(C=C1)C(=CC(=O)O2)CBr,0 +CCN(C(=O)N(CC)C1=CC=CC=C1)C2=CC=CC=C2,0 +CC(=O)NC1=CC=CC=C1,0 +CC1=CC(=CC=C1)OP(=O)(OC2=CC(=CC=C2)C)OC3=CC(=CC=C3)C,0 +CCNC(=O)NC1=CC(=C(C=C1)OCC(O)CNC(C)(C)C)C(C)=O,0 +OCC(COC(=O)C=C)(COC(=O)C=C)COC(=O)C=C,0 +ClC1=CC(=C(C(=C1)Cl)Cl)Cl,0 +CC(CCC(O)=O)C1CCC2C4C(CCC12C)C3(C)CCC(O)CC3CC4=O,0 +CCCCCCOC(=O)C(C)=C,0 +ClC1=CC=C(C=C1)N2C(=O)CCC2=O,0 +NC1=C(C=CC=C1O)C(O)=O,0 +CCCCOP(=O)(OCCCC)OCCCC,0 +C[N+]1=CC=C(C=C1)C2=CC=CC=C2,0 +CC(OC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 +[O-][N+](=O)C1=CC=C(C=C1)COC2=CC=CC=C2,0 +COC1=CC(=O)C=CC1=O,0 +CN(C)CCCN,0 +ON=CC1=CC=NC=C1,0 +OC(=O)CC1=CC(=CC=C1)[N+]([O-])=O,0 +CC1(C)C2CCC1(C)C(C)(O)C2,0 +C1=CC=C(C=C1)N(C2=CC=CC=C2)C3=CC=CC=C3,0 +CC(Br)(CCl)CBr,0 +COC1=CC(=C(C=C1)O)C(C)(C)C,0 +CCCCCNCCCCC,0 +OC1C(=O)C(=O)C1=O,0 +OCC1=CC=C(C=C1)C(F)(F)F,0 +OC2=C(C1=CC=CC=C1C=C2)N=NC4=C(C3=CC=CC=C3C=C4)S(O)(=O)=O,0 +CCOCC(O)=O,0 +CCC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,0 +CC(C)=C,0 +OC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,0 +COC1=C(C2=C(C(=C1)OC)C(=O)C3(O2)C(C)CC(=O)C=C3OC)Cl,0 +O[N+]([O-])=C,0 +CCCCN(CC)CC,0 +NC(CCC(=O)NC1=CC=C(C=C1)[N+]([O-])=O)C(O)=O,0 +COP(=O)(OC)N1CCOCC1,0 +CC1=C(C=C(C=C1O)[N+]([O-])=O)[N+]([O-])=O,0 +[NH]1C=CC2=CC=CC=C12,0 +CCCCOC(=O)C1=C(C=CC=C1)C(=O)OCC2=CC=CC=C2,0 +FC(F)(F)C1=CC(=CC=C1)Cl,0 +OC2=C1C(C5=C(OC1=CC=C2)C=C4OC3OC=CC3C4=C5O)=O,0 +CC(C)CC(C)N,0 +CC(O)CN1CC(C)OC1=O,0 +CC1=CC(=C(C=C1)N)S(O)(=O)=O,0 +CC1=CC=C(C=C1)NC(=O)CBr,0 +[NH]1C=NC2=CC=CC=C12,0 +CCCCCCC(=O)OCC,0 +C1=CC3=C(N=C1)C2=NC=CC=C2C=C3,0 +CC(=O)NC1=CC=C(C=C1)CC2=CC=C(C=C2)NC(C)=O,0 +CC1=CC(=CC=C1)C#N,0 +NN(C1=CC=CC=C1)C2=CC=CC=C2,0 +CN(C)C1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 +C=CN1CCCC1=O,0 +CC(C)CCCCCCCOP(=O)(OC1=CC=CC=C1)OC2=CC=CC=C2,0 +CC1=CC=C(C=C1)C(C)(C)C,0 +NC(=N)C1=CC=C(C=C1)C3=CC2=CC=C(C=C2[NH]3)C(N)=N,0 +CCCCC(CC)COC(=O)C1=C(C=CC=C1)C(O)=O,0 +CCN(CC)C(=O)NC1=CC(=C(C=C1)OCC(O)CNC(C)(C)C)C(C)=O,0 +CCCCCCCCCCCC=C,0 +S=C(NC1=CC=CC=C1)NC2=CC=CC=C2,0 +CCOC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,0 +CCCCCCCCCCCCCC=C,0 +OC(=O)C1=C(C=CC=C1)C(O)=O,0 +CC(=O)NC1=CC=C(C=C1)[N+]([O-])=O,0 +CN(C)[P+](O[N]1N=NC2=CC=CC=C12)(N(C)C)N(C)C,0 +CC(=C)C#N,0 +CCSCCC(N)C(O)=O,0 +CN(C)NC(=O)CCC(O)=O,0 +CSC(C)(C)C=NO,0 +CNC(=O)C1=CC(=CC=C1)NCC(=O)NCCC2=CC(=C(C=C2)OC)OC,0 +OC(=O)C1=CC=CO1,0 +ClC1=C(Cl)C(=O)C(=C(C#N)C1=O)C#N,0 +CC1=C(C=CC=C1)C#N,0 +CN(C)C(=S)N(C)C,0 +ClC1=CC(=O)C=CC1=O,0 +CCCCCCCCCC1=CC=C(C=C1)O,0 +CC([N]1C=CN=C1)=C(OCCOC2=CC=C(C=C2)Cl)C3=C(C=C(C=C3)Cl)Cl,0 +CC1=NC(=C(N=C1)C)C,0 +ONC1=CC=C(C=C1)Cl,0 +CC(CNC(=O)C1=CN=CC=C1)NC(=O)C2=CN=CC=C2,0 +CCOC(=O)CCl,0 +OC1=C(C=CC(=C1)Cl)Cl,0 +CC(C=CC(O)C1CC1)C2CCC3C(CCCC23C)=CC=C4CC(O)CC(O)C4=C,0 +CC1=C(N=CC=N1)C,0 +CCOC(=O)C1C(C=C(C)C)C1(C)C,0 +OC3N=C(C1=CC=CC=C1)C2=C(C=CC(=C2)Cl)NC3=O,0 +NCCS(O)(=O)=O,0 +CN1CCN(CC1)C3=CC=C2[NH]C(=NC2=C3)C5=CC=C4[NH]C(=NC4=C5)C6=CC=C(C=C6)O,0 +CC(CO)=[N+](O)[O-],0 +CC(C)NCC(O)COC3=C2C1=CC=CC=C1[NH]C2=CC=C3,0 +OCCOC(=O)C=C,0 +CC(C)(C)N(CCO)CCO,0 +C1CN=C(N1)C2=CC=C(C=C2)C4=CC3=CC=C(C=C3[NH]4)C5=NCCN5,0 +CCCCO,0 +CC1=C(C(=CC=C1)C)NC(=O)CN2CCCC2=O,0 +CCCCCOC1=CC(=CC=C1)NC(=O)OC2CCCCC2N3CCCC3,0 +CC(=O)NC1=CC(=CC=C1)C,0 +OC1=N[NH]C2=CC=CC=C12,0 +CCN(CC)C1=CC2=C(C=C1)C(=CC(O2)=O)C(F)(F)F,0 +CSCCC(NC=O)C(=O)NC(CC1=CC=CC=C1)C(O)=O,0 +CN(C)C1=CC=C(C=C1)C4CC2(C)C(CCC2(O)CCCO)C5CC=C3CC(=O)CCC3=C45,0 +[O-][N+](=O)C1=CC=C(C=C1)NC2=CC=C(C=C2)N=C=S,0 +CC1=CC(=C(C(=C1)CC2=C(C(=CC(=C2)C)C(C)(C)C)O)O)C(C)(C)C,0 +CC1SCC(NC1=O)C(=O)NC(CC2=C[NH]C=N2)C(=O)N3CCCC3C(N)=O,0 +CC(=O)NC1=CC=C(C=C1)OC2=CC=C(C=C2)NC(C)=O,0 +CON(C)C(=O)NC1=CC=C(C=C1)Br,0 +CC(=O)OC1=C(C=CC=C1)C(=O)OC2=C(C=CC=C2)C(O)=O,0 +CC1=CC(=C(C=C1)OP(=O)(OC2=C(C=C(C=C2)C)C)OC3=C(C=C(C=C3)C)C)C,0 +NC(=O)CN1CC(O)CC1=O,0 +CC(N)=S,0 +CCC1=NC=CN=C1,0 +CC(C)(S)C(=O)NC(CS)C(O)=O,0 +NN(CC1=CC=CC=C1)CC2=CC=CC=C2,0 +OC(=O)C(=O)NC1=CC(=CC=C1)C2=N[NH]N=N2,0 +OCCN1C(=O)N(CCO)C(=O)N(CCO)C1=O,0 +CC(=C)C1CCC(=CC1)C,0 +[O-][N+](=O)C1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0 +ClC1=CC(=CC=C1)C=O,0 +NC1=CC(=CC=C1)S(O)(=O)=O,0 +C1=CC=C(C=C1)C=CC2=CC=CC=C2,0 +O=C1OC(=O)C2=C1C=CC=C2,0 +COC(=O)C1=C(C=CC=C1)N,0 +OC(=O)C1CSCN1C(=O)C2CCC(=O)N2,0 +CNC(=O)N(C)C2=NC1=CC=CC=C1S2,0 +CCCCOC(=O)C1=C(C=CC=C1)C(=O)OC2CCCCC2,0 +COCCO,0 +CCCCCCCCCCCCC1CO1,0 +CNC(=O)NC,0 +COC1=CC=C(C=C1)NC2=CC=C(C=C2)OC,0 +[O-][N+](=O)C3=C2C=CC1=CC=CC=C1C2=CC4=CC=CC=C34,0 +CCCCOCC(O)=O,0 +NC1=C(C=CC=C1)Cl,0 +CN1CCNCC1,0 +COC(=O)CC(C)=O,0 +FC(F)(F)C(Cl)Br,0 +CCC(C)(C)C,0 +O=C(C=CC1=CC=CC=C1)C2=CC=C(C=C2)C3=CC=CC=C3,0 +CC(C)OC(C)=O,0 +CC3(C)C(C(=O)OC(C#N)C1=CC(=CC=C1)OC2=CC=CC=C2)C3(C)C,0 +CC(=O)C1=C2C(=CC(=C1)C(C)(C)C)C(CC2)(C)C,0 +NC2=C(C1=C(C=C(C=C1C=C2)S(O)(=O)=O)O)N=NC3=C(C=C(C=C3)[N+]([O-])=O)S(O)(=O)=O,0 +C1=NC=CN=C1,0 +[O-][N+](=O)C1=CC(=CC=C1)C(F)(F)F,0 +COC5=C1OC2C(C=CC3C4CC(=C1C23CCN4C)C=C5)O,0 +CC1=CC=CS1,0 +CC2CCC1C(OC(=O)C1=C)C3(C)C(=O)CC=C23,0 +OC1=C(C=CC=C1)[N+]([O-])=O,0 +NC1=CC(=C(C(=C1)Cl)Cl)Cl,0 +N(C1=CC=CC=C1)C3=C2C=CC=CC2=CC=C3,0 +OC1=C(C=C(C=C1)C2=CC=CC=C2)[N+]([O-])=O,0 +NC(=O)NNC(N)=O,0 +[O-][N+](=O)C1=C(C=CC(=C1)C(F)(F)F)Cl,0 +CCN(CC)C1=CC=C(C=C1)N=NC2=CC=CC=C2,0 +ON=C,0 +OC2=C1C=CC=CC1=NC=C2,0 +NCCN1CCNCC1,0 +O=C2C1=C(C=CC=C1)C3=C2C=CC=C3,0 +CC(C)(COC(=O)C=C)COC(=O)C=C,0 +CC(C)(Br)C(=O)NC1=CC=CC=C1,0 +CC(C)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C(O)=O,0 +CC(C)C1CCC(C)CC1OC(=O)C2=C(C=CC=C2)N,0 +OC1=C(C=C(C=C1Br)Br)C(=O)NC2=CC=C(C=C2)Br,0 +C1=CC=C(C=C1)P(C2=CC=CC=C2)C3=CC=CC=C3,0 +COC(=O)NC2=NC1=CC(=CC=C1[NH]2)SC3=CC=CC=C3,0 +O=NN(C1=CC=CC=C1)C2=CC=CC=C2,0 +O=C2NC1=C(CCC1)C(=O)N2C3CCCCC3,0 +NC1=C(C=CC=C1)C(=O)OCC=CC2=CC=CC=C2,0 +C1CSCCO1,0 +O=C(C=CC1=CC=CC=C1)C2=CC=CC=C2,0 +CC1=CC2=C(C(=C1)O)C(=O)C=C(C2=O)C3=C(C4=C(C=C3C)C(=O)C=CC4=O)O,0 +CC1=NN(C(=O)C1)C2=CC=CC=C2,0 +NC1=CC(=CC=C1)C(F)(F)F,0 +NC(=O)C1=CC=[N+](C=C1)COC[N+]2=C(C=CC=C2)C=NO,0 +NCC=C,0 +COP(=S)(OC)OC1=C(C=C(C(=N1)Cl)Cl)Cl,0 +CC1OCCC2=C1C=C3C(=C2)C(C(C3(C)C)C)(C)C,0 +NC1=CC(=C(C=C1)N)S(O)(=O)=O,0 +CCC1=C(C=CC=C1)O,0 +CCCCCC(=O)OCC=C,0 +CC1=C(C=C(C=C1)N=[N+]([O-])C2=CC(=C(C=C2)C)[N+]([O-])=O)[N+]([O-])=O,0 +NN2C(=O)C1=C(C=CC=C1)C2=O,0 +CC(=O)C1=NC=CC=C1,0 +COC4=C1C(C5=C(OC1=C3C2CCOC2OC3=C4)C=CC=C5O)=O,0 +CCOCN(C(=O)CCl)C1=C(C=CC=C1C)CC,0 +CC(N)=O,0 +OC(=O)COC1=CC=C(C=C1)Cl,0 +NC1=CC(=C(C=C1)Cl)Cl,0 +ClC1=CN=CC=C1,0 +O=C1CNC(=O)N1,0 +CCCC(O)C(CC)CO,0 +CC(=O)C1=C(C=CC(=C1)N)OCC(O)CNC(C)(C)C,0 +OC1(CCCCC1)C#N,0 +O=C(C1=CC=CC=C1)C(=O)C2=CC=CC=C2,0 +C=CC(=O)OCCOCCOCCOCCOC(=O)C=C,0 +CC(C)C=O,0 +[O-][N+](=O)C1=C(C=CC=C1)C2=CC=CC=C2,0 +CS(=O)C1=CC=C(C=C1)Cl,0 +OCC1OC(CC1O)N2CC(=O)C(=N)NC2=O,0 +OC(=O)C(Cl)(Cl)Cl,0 +CCC1=C(C=CC=C1)[N+]([O-])=O,0 +NC(=N)NC(N)=NCCC1=CC=CC=C1,0 +CC1=CC(C)(C)NC2=C1C=CC=C2,0 +COP(=S)(OC)SCC(=O)NCC=O,0 +CC(C)OC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 +CC(C)[N]2C1=CC=CC=C1C(=C2C=CC(O)CC(O)CC(O)=O)C3=CC=C(C=C3)F,0 +CCOC(C)(C)C,0 +CCCCCCCCCCCCC=C,0 +CCCCCCCCCC,0 +C1COCCOCCOCCOCCO1,0 +CC2=NC1=C(C=CC=C1)C2(C)C,0 +CCCCCCCCCC(O)=O,0 +CCC=O,0 +CCCCCCCCCC=CCC1CC(=O)OC1=O,0 +COC3=C(C=C2C1C(C5=C(OC1COC2=C3)C4=C(OC(C4)C(C)=C)C=C5)=O)OC,0 +COC1=CC(=O)C(=O)C(=C1)C(C)(C)C,0 +CC(=O)OCC(=O)NCCCOC1=CC(=CC=C1)CN2CCCCC2,0 +CC1=C(C=CC=C1)Br,0 +C[N+]1([O-])CCCC1C2=CN=CC=C2,0 +CC(C)NC(=O)NS(=O)(=O)C1=C(C=CN=C1)NC2=CC(=CC=C2)C,0 +CCNC3=C(C=C2C(=C1C=C(C(C=C1OC2=C3)=NCC)C)C4=C(C=CC=C4)C(=O)OCC)C,0 +O=C4C2=CC=C1N=C(SC1=C2C(=O)C5=CC=C3N=C(SC3=C45)C6=CC=CC=C6)C7=CC=CC=C7,0 +CC5=C2C1=CC=CC=C1C=CC2=C4C3OC3C(C(C4=C5)O)O,0 +CC(C)CC1NC(=O)CNC1=O,0 +OC2=CC1=CC=CC=C1N=C2,0 +CCOC(=O)C(CCC1=CC=CC=C1)NC(C)C(=O)N(CC(O)=O)C3CC2=C(C=CC=C2)C3,0 +CCCCN(CCO)CCCC,0 +ClNC1=NC(=NC(=N1)NCl)NCl,0 +CC1CN(CCN1)C3=C(C(=C2C(C(=CN(C2=C3)C4CC4)C(O)=O)=O)C)F,0 +OCC(O)CO,0 +CNC(=O)C1=CC=CC=C1,0 +CCC1=C(C=CC=C1)N,0 +OC(=O)C1=CC2=C(C=C1)C(=O)OC2=O,0 +CC(C)CC(C)NC1=CC=C(C=C1)NC2=CC=CC=C2,0 +O=C3OC2=C(C=C1C=COC1=C2)C=C3,0 +NC1=C(C=CC(=C1)Cl)Cl,0 +CCCCOC(=O)C=CC(=O)OCCCC,0 +CNNC,0 +O=C1C=CC(=O)C(=C1)C2=CC=CC=C2,0 +CC(N)CN,0 +CCOC2=C1N=CC=CC1=CC=C2,0 +CC1=C(C=CC=C1)C3=NC2=CC=CC=C2O3,0 +NC(N)=S,0 +BrCC1=CC=C(C=C1)CBr,0 +OC(=O)C(=O)C(O)=O,0 +OC(=O)C1=CC3=C(C(=C1)O)C(=O)C2=C(C=C(C=C2O)O)C3=O,0 +ClCC1=CC=NC=C1,0 +CC(N(C)C)C1=CC=CC=C1,0 +CC2COC1=C(C(=CC3=C1N2C=C(C(O)=O)C3=O)F)C4(N)CC4,0 +[O-][N+](=O)C1=CC=C(C=C1)NC2=CC=CC=C2,0 +O=C(OOC(=O)C1=CC=CC=C1)C2=CC=CC=C2,0 +CCC2=C1[NH]C3=C(C1=CC=C2)CCOC3(C)CC,0 +COC2=CC1=CC=C(C=C1C=C2)C(C)C(O)=O,0 +CN1C(CCC1=O)C2=CN=CC=C2,0 +CCCCCC=CC=CC=O,0 +COC1=C(C=CC(=C1)C3OC2=C(C(=CC(=C2)O)O)C(=O)C3=O)O,0 +COC(C)(C)C,0 +O=C2CCC1=C(C=CC=C1)O2,0 +CC=CC=CC(O)=O,0 +CCN(CC)S(=O)(=O)C1=CC=C(C=C1)N,0 +OCNC(=O)C=C,0 +CC(C)=CCCC(C)=CC=O,0 +CC2=NC1=CC=CC=C1N=C2,0 +CC(O)CCC(=O)C1=COC=C1,0 +CN(C)C(C)=O,0 +CN1CCOCC1,0 +CC(=C)OC(C)=O,0 +CCOC(=O)CC(C)=O,0 +OS(=O)(=O)C1=CC(=CC=C1)[N+]([O-])=O,0 +CSC(C)(C)C(=O)NC(CS)C(O)=O,0 +ClC1=NC(=NC(=N1)Cl)NC2=C(C=CC=C2)Cl,0 +CC1COC3=C2N1C=C(C(C2=CC(=C3N4CCN(C)CC4)F)=O)C(O)=O,0 +COC(=O)C(=CC1=CC=CO1)C#N,0 +CC(=C)C=C,0 +C1=CC=CC=C1,0 +CCCCC(CC)COCCCN,0 +[O-][N+](=O)C1=CC(=CC=C1)CBr,0 +CN(C)C=NC1=C(C=C(C=C1)Cl)C,0 +COC(=O)C1=C(C)NC(=C(C1C2=C(C=CC=C2)[N+]([O-])=O)C(=O)OCC(C)=O)C,0 +NCC1CCC(CC1)C(=O)C2=CC=C(C=C2)CCC(O)=O,0 +CCOC(=O)C1OC1C(=O)NC(CC(C)C)C(=O)NCCC(C)C,0 +CC1=CC(=O)OC2=C1C(=CC(=C2)O)O,0 +CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)C,0 +CC(=O)NC1=CC=C(C=C1)OC(=O)C2=C(C=CC=C2)OC(C)=O,0 +C1CCC2(CC1)CO2,0 +NC(=S)NCC=C,0 +CC(CCC(O)=O)C3CCC4C2CCC1CC(O)CCC1(C)C2CC(O)C34C,0 +CC(=O)NC1=CC=C(C=C1)S(=O)(=O)NC2=NC=CC=C2,0 +CCCCCC(C)(O)C=CC1C(O)CC(=O)C1CC=CCCCC(O)=O,0 +CC(=C)C1=CC=CC=C1,0 +O=CC=CC1=CC=CO1,0 +CCCCCCCCCCCCCCCCCC(O)=O,0 +CCCCCCCCCCCCCCCCN,0 +CCNC1=NC(=NC(=N1)Cl)NCC,0 +COP(=S)(OC)OC,0 +ClC1=C(C(=C(C(=C1)Cl)Cl)Cl)Cl,0 +CCCC=[N+](O)[O-],0 +CNC1=CC=CC=C1,0 +OC(=O)C=C,0 +CCCCCCCCCCCCCCCCCCN,0 +COC1=CC2=C(C=C1)C(=CC(=O)O2)CBr,0 +CCC#N,0 +CC=C1CC2CC1C=C2,0 +CC(C)C(C)C,0 +COCC(O)=O,0 +CNC(=O)NC1=CC=CC=C1,0 +O2C1=C(C=CC=C1)SC3=C2C=CC=C3,0 +C=CC(=O)OCCOC(=O)C=C,0 +CC1=CC=C(C=C1)S(=O)(=O)NC2CCCCC2,0 +CCC(C)NC1=CC=C(C=C1)NC(C)CC,0 +CC(C)OC(=O)C(C)(C)OC1=CC=C(C=C1)C(=O)C2=CC=C(C=C2)Cl,0 +OC1=CC(=C(C=C1)Cl)Cl,0 +CCNC2=C(C=C1C(=CC(OC1=C2)=O)C)C,0 +CCOP(=O)(OCC)OC(=CCl)C1=C(C=C(C=C1)Cl)Cl,0 +OC1=NC(=NC(=N1)Cl)Cl,0 +COC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 +COC1=C(C=C(C(=C1)S(O)(=O)=O)C)N=NC3=C2C=CC(=CC2=CC=C3O)S(O)(=O)=O,0 +CC(=O)CC(=O)NC1=CC=C(C=C1)C,0 +CCCCNCC,0 +NS(=O)(=O)C1=C(C=C(C(=C1)C(O)=O)NCC2=CC=CO2)Cl,0 +CC(C)NCC(O)COC1=CC=C(C=C1)NC(C)=O,0 +CC(F)(F)F,0 +CCCCCCCCC=O,0 +C1=CC=C(C=C1)C2=CC=CC=C2,0 +FC(F)(F)C1=C(C=CC=C1)Cl,0 +CC(C)CC(=O)CC(C)C,0 +CCCCCC(C=O)=CC1=CC=CC=C1,0 +CN(C)CC(O)=O,0 +CCOC(=O)CC(=O)CCl,0 +OC(=O)COC1=CC=CC=C1,0 +BrC1=CC(=CC=C1)C2=CC=CC=C2,0 +CC1=C(C=CC=C1)C,0 +CCC1=C4C(=C(C2=CC=CC=C12)C)C3=CC=CC=C3C=C4,0 +CC(C)CCCCCCOC(=O)CCCCC(=O)OCCCCCCC(C)C,0 +OC1=C(C=CC=C1)O,0 +NC1=C(C=CC=C1)C(=O)OC2CCCCC2,0 +C1CCNC1,0 +CCCCN(CCCC)CCCC,0 +CC(C)C2=C(C)N(C)N(C1=CC=CC=C1)C2=O,0 +C(SCC1=CC=CC=C1)C2=CC=CC=C2,0 +COC(=O)C1=CC=CO1,0 +OC1=C(C=C(C=C1I)C#N)[N+]([O-])=O,0 +COC1=C(C=C(C=C1)C=O)OC,0 +O=C2C(=O)C1=C(C=CC=C1)C3=C2C=CC=C3,0 +CCO,0 +CC(=O)N=C1C=CC(=O)C=C1,0 +CC(C)(C)OOC(C)(C)C1=CC(=CC=C1)C(C)(C)OOC(C)(C)C,0 +CSC1=CC=C(C=C1)Cl,0 +O=C2C1=C(C=CC=C1)C6=C4C2=CC=C5C3=CC=CC=C3C(C(=C45)C=C6)=O,0 +OC1=CC=C(C=C1)C2(OC(=O)C3=C2C=CC=C3)C4=CC=C(C=C4)O,0 +ClCC1=CC=C(C=C1)CCl,0 +S=C1SSC2=NCCN12,0 +CC(O)C(C)O,0 +NCCO,0 +CCNC1=NC(=NC(=N1)Cl)NC(C)C,0 +OC(=O)CCC(=O)NC1=CC=C(C=C1)Cl,0 +OCC1NC(CC2=C1[NH]C3=CC=CC=C23)C(O)=O,0 +COC(=O)C=C,0 +CC(C)NC1=CC=C(C=C1)NC2=CC=CC=C2,0 +CCCC(=O)OCCC(C)C,0 +COC(=O)C1=C(C)NC(=C(C1C2=CC(=CC=C2)[N+]([O-])=O)C(=O)OCC=CC3=CC=CC=C3)C,0 +CCN=[N+]([O-])CC,0 +CNC(=O)OC2=C1OC(CC1=CC=C2)(C)C,0 +CN(C)C1=CC=NC=C1,0 +CCCCCCCCCCCC(=O)NCCO,0 +CC(=C)C(O)=O,0 +CC1=CC(=CC(=C1)C)N=NC3=C2C=CC=CC2=CC=C3O,0 +CCCCCCCC1CCC(=O)O1,0 +NC1=CC(=C(C=C1)O)C(O)=O,0 +CCOP(=O)(C#N)N(C)C,0 +CC(C)(C)C1=C(C(=CC(=C1)C=CC2=CC(=C(C(=C2)C(C)(C)C)O)C(C)(C)C)C(C)(C)C)O,0 +NC1=C(C=C(C=C1Cl)Cl)Cl,0 +OC(=O)CS,0 +CC(C)COC(=O)C=C,0 +CC1(C)CC(N)CC(C)(CN)C1,0 +CC1=C(C=C(C=C1)NO)[N+]([O-])=O,0 +ClC(Cl)=C(Cl)C1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0 +CNC(=O)OC1=CC=CC=C1,0 +NC1=CC=C(C=C1)C=CC(O)=O,0 +OC2(O)C(=O)C1=C(C=CC=C1)C2=O,0 +CC1=N[N](C(=C1)C)C2=C4C(=C(N=N2)NN)C3=CC=CC=C3[NH]4,0 +NC1=NC(=NC(=N1)N)N,0 +CC1=C(C(=C(C=C1)C)C)C,0 +CC1=C(C(=C(C(=C1C)N)C)C)N,0 +CC(C)COC(=O)C1=C(C=CC=C1)N,0 +CCOC1=C(C=CC=C1)OCC2CNCCO2,0 +CC1=CC=C(C=C1)NC(N)=O,0 +OC(=O)CCl,0 +OC(=O)C1CSC(N1C(=O)CCS)C2=C(C=CC=C2)O,0 +CC2=NC1=CC=CC=C1S2,0 +[O-][N+](=O)C1=CC=C(C=C1)S(=O)(=O)NC2=NC=CC=C2,0 +CC1(C)CCCC(C)(C)N1O,0 +CCCCCCCCCCC=CC1CC(=O)OC1=O,0 +CCOP(=O)(OCC)OC1=C(C=C(C(=N1)Cl)Cl)Cl,0 +CC(O)C(O)=O,0 +NCCCCC(NC(CCC1=CC=CC=C1)C(O)=O)C(=O)N2CCCC2C(O)=O,0 +NC1=CC(=C(C=C1)C=CC2=C(C=C(C=C2)N)S(O)(=O)=O)S(O)(=O)=O,0 +C1CN(CCO1)SC3=NC2=CC=CC=C2S3,0 +CCCCOCCOC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 +CCOC(=O)C(CCC1=CC=CC=C1)NC(C)C(=O)N3C2CCCCC2CC3C(O)=O,0 +OC1=C(C=CC=C1)C=O,0 +ClC1=CN=C(C=C1)Cl,0 +CCC(=O)NC1=CC(=C(C=C1)Cl)Cl,0 +N#CCCNCCC#N,0 +COC(=O)C(C)(C)OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl,0 +CCCNCCC,0 +CCCCCCC(CC=CCCCCCCCC(=O)OC)OC(C)=O,0 +[O-][N+](=O)C1=C(C(=CC(=C1)C(F)(F)F)[N+]([O-])=O)Cl,0 +CCOC(=O)CC(SP(=O)(OC)SC)C(=O)OCC,0 +OCC3OC1C(OC2=NC(=N)C=CN12)C3O,0 +OC(C(COC(=O)CCC(O)=O)NC(=O)C(Cl)Cl)C1=CC=C(C=C1)[N+]([O-])=O,0 +CC(C)(C)C(=O)C2C(=O)C1=C(C=CC=C1)C2=O,0 +CC(=O)NS(=O)(=O)C1=CC=C(C=C1)N,0 +CC(=C)C(=O)OCCOC(=O)NNC(=O)OCCOC(=O)C(C)=C,0 +FC1=CC=C(C=C1)C(=O)CCCN2CCN(CC2)C3=NC=CC=C3,0 +CNCCS(O)(=O)=O,0 +[O-][N+](=O)C1=C(C=CC=C1)C#N,0 +CC=C(C)C#N,0 +OC(=O)C1=C(C=CC(=C1)N=NC2=CC=C(C=C2)S(=O)(=O)NC3=NC=CC=C3)O,0 +CCCCCCCCC1OC1CCCCCCCC(=O)OCC(CC)CCCC,0 +O=C(C1=CC=CC=C1)C2=CC=CC=C2,0 +BrCCCBr,0 +CC(=O)OC(C)(C)C3CC2=C(C=C1OC(C(=CC1=C2)C(C)(C)C=C)=O)O3,0 +OC1=C5C(=CC=C1)C4=CC3=C2C=CC=CC2=CC=C3N=C4C=C5,0 +CN3CCC14C5OC2=C1C(=CC=C2O)CC3C4C=CC5O,0 +NC1=C(C=CC=C1)C(F)(F)F,0 +CN(C)CCN(CC1=CC=C(S1)Cl)C2=NC=CC=C2,0 +C2COCCOC1=C(C=CC=C1)OCCOCCO2,0 +CC1CS1,0 +CC(CCC(O)=O)C3CCC4C2CCC1CC(O)CCC1(C)C2CC(=O)C34C,0 +OC1=C(C=C(C(=C1)Cl)O)Cl,0 +OCC(CO)NC1CC(O)(CO)C(O)C(O)C1O,0 +CC(=O)NC1=CC=C(C=C1)S(N)(=O)=O,0 +CCCCCCCCC1=CC=C(C=C1)NC2=CC=C(C=C2)CCCCCCCC,0 +CCOC(=O)C(=C)C#N,0 +CC1=CC(=O)C=CC1=O,0 +CC34CCC1C(CCC2=C1C=CC(=C2)O)C35CCC4(O)C(O)C5,0 +OC3C(O)C1=C(C=CC2=CC=CC=C12)C4=C3C=CC=C4,0 +CC(=C)C(=O)OCCCCOC(=O)C(C)=C,0 +OC(=O)C1=CC(=CC=C1)Cl,0 +OC(=O)C(Cl)CCl,0 +CNS(=O)(=O)C1=CC=C(C=C1)N,0 +CC(C)NC(C)C,0 +OC1=C(C(=C(C(=C1)Cl)Cl)Cl)Cl,0 +BrCC#N,0 +OCNC(=O)CCl,0 +CCCCCCCCC=CCCCCCCCC(O)=O,0 +CC1=C(C=C(C(=C1)N)S(O)(=O)=O)Cl,0 +OC1=CC=C(C=C1)[N+]([O-])=O,0 +NC(=O)NCC(O)=O,0 +CN1CCN(C)CC1,0 +CN(C)N=NC1=CC=C(C=C1)C(O)=O,0 +CC(OC1=C(C=C(C=C1)Cl)C)C(O)=O,0 +ClC2=C(N=C1C=CC=CC1=N2)Cl,0 +CN(C)CCN(C)C,0 +OC=O,0 +CCCCCCOC(=O)C=C,0 +COC1=C(OC)C(=O)C(=CC1=O)C,0 +COC(=O)C1=C(C2=C(C(=C1)OC)OCO2)C3=C(C=C(C4=C3OCO4)OC)C(=O)OC,0 +C1CC3=C2C1=CC=CC2=CC=C3,0 +OC(=O)C=CC1=CN=C[NH]1,0 +N(C1=CC=CC=C1)C3=CC2=CC=CC=C2C=C3,0 +CC(C)CC1=CC=C(C=C1)C(C)C(O)=O,0 +COC(=O)NC2=NC1=CC(=CC=C1[NH]2)C(=O)C3=CC=C(C=C3)F,0 +OC(=O)C1=C(C=CC=C1)NC2=CC(=CC=C2)C(F)(F)F,0 +ClC1=CC=C(C=C1)C(=C(Cl)Cl)C2=CC=C(C=C2)Cl,0 +CC(C)N,0 +OCC1CCCO1,0 +CC(O)C(C)=O,0 +CC2C(C)(C)C1=C(C(=O)CCC1)C2(C)C,0 +CC2C(C)(C)C1=C(C=C(C(=C1)C)C(C)=O)C2(C)C,0 +CCCCCC,0 +CCCSSCC=C,0 +C[N]2C(=NC3=NC1=CC=NC=C1C=C23)N,0 +NC1=CC=C(C=C1)S(N)(=O)=O,0 +NC1=C(C(=CC(=C1)Cl)S(O)(=O)=O)O,0 +ClC1=CC=CC=C1,0 +COC(=O)C1=CC=CC=C1,0 +CC4=C2C1=CC=CC=C1C=CC2=C3CCCC3=C4,0 +CCNCC,0 +CCC(C1=CC=C(C=C1)O)=C(CC)C2=CC=C(C=C2)O,0 +CC(=O)NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)NC(C)=O,0 +COC(=O)CCl,0 +CC(=C)C(C)=O,0 +CC(C)OC1=CC=C(C=C1)NC2=CC=CC=C2,0 +CC1=CC(=O)C(=CC1=O)C,0 +O=C3N2CC1=C(C=CC=C1)C(=O)N2CC4=C3C=CC=C4,0 +CCCCCCCCOC(=O)C(C)=C,0 +CC(C)OC(=O)CCl,0 +CC(C)(O)C#N,0 +CC1=C(C=CC(=C1)Cl)OCC(O)=O,0 +CC(C)NCC(O)COC2=C1OCC(CC1=CC=C2)O,0 +[O-][N+](=O)C1=CC=C(C=C1)CNC3=C2[NH]C=NC2=NC=N3,0 +CC(=O)OC(C)=O,0 +CC(C)(C)CBr,0 +OC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 +NC1=C(N=CC(=C1)C2=CC=NC=C2)O,0 +CC1=CC(=C(C(=C1)C(C)(C)C)O)C(C)(C)C,0 +BrCC1=C(C=CC=C1)CBr,0 +CC(C)OP(C)(F)=O,0 +O=C1C(=O)C4=C3C2=C1C=CC=C2C=CC3=CC=C4,0 +CC(C)(C)CC(C)(S)CC(C)(C)C,0 +C=CCOC(=O)C1=C(C=CC=C1)C(=O)OCC=C,0 +OC1=CC2=C(C(=C1)O)C(=O)C=C(O2)C3=CC(=C(C=C3)O)O,0 +OCC1OC(CC1O)[N]2C=NC3=C2N=C[N]4C=CN=C34,0 +CN(C)P(=O)(N(C)C)N(C)C,0 +CC(=O)NC2=CC1=CC=CC=C1N=C2,0 +CC(O)C1=CC=CC=C1,0 +[O-][N+](=O)C1=CC=C(C=C1)C#N,0 +NCCNCCN,0 +CC(CC(O)=O)C(O)=O,0 +CCCCCCCCCCCCOCC1CO1,0 +OCC1=CC=CO1,0 +CCC=CCCC=CC=O,0 +CN1CCC(=CC1)C2=CC=CC=C2,0 +ClCC#N,0 +OC(=O)C(F)(F)C(F)(Cl)C(F)(F)C(F)(Cl)C(F)(F)C(F)(Cl)C(F)(F)Cl,0 +COCCCN,0 +N2C1=C(C=CC=C1)SC3=C2C=CC=C3,0 +CC3(C)SC2C(NC(=O)C(N)C1=CC=CC=C1)C(=O)N2C3C(O)=O,0 +CC(C)(C)[N+]([O-])=O,0 +CC(C)C(O)CCC(C)C1CCC2C(CCCC12C)=CC=C3CC(O)CC(O)C3=C,0 +OC(=O)CC1=C(C=CC=C1)Cl,0 +OC2=CC1=CC=C(C=C1C=C2)SSC4=CC3=CC=C(C=C3C=C4)O,0 +CC(=O)OCC1=CC2=C(C=C1)OCO2,0 +CN(C)C#N,0 +CCCCC(CC)COC(=O)C1=CC=C(C=C1)C(=O)OCC(CC)CCCC,0 +O=C1CCC(=O)O1,0 +COC(=O)C1=CC=C(C=C1)C=O,0 +CC(=O)C=CC1=CC2=C(C=C1)OCO2,0 +COC1=CC(=CC=C1)[N+]([O-])=O,0 +OCC1OC(C(O)C1O)[N]4C=NC5=C(NCC(O)COC3=C2C=CC=CC2=CC=C3)N=CN=C45,0 +C1=CC=C(C=C1)C(C2=CC=CC=C2)C3=CC=CC=C3,0 +CC1=CCC(CC1)C(C)(C)O,0 +COC1=C(C=C(C=C1)C(=O)N2CCN(CC2)C3=CC4=C(C=C3)NC(=O)CC4)OC,0 +NC(=N)C1=CC=C(C=C1)OCCCCCOC2=CC=C(C=C2)C(N)=N,0 +OCC1=C(C=CC=C1)[N+]([O-])=O,0 +CC(=O)NC3=C(C=C2C1=CC=CC=C1CC2=C3)O,0 +CC(=O)C1=C(C=CC(=C1)NC(=O)NC(C)(C)C)OCC(O)CNC(C)(C)C,0 +BrCC(=O)NC1=CC=CC=C1,0 +C2CC=CCCC1OC1CCC=C2,0 +CC(=O)NC1=CC(=CC=C1)O,0 +C=CCNCC=C,0 +C[N]1C=NC2=C1C(N(C(N2C)=O)C)=O,0 +ClC1=C(C=C(C=C1)C=O)Cl,0 +CC(C)NCC(O)COC2=C1OCC(CC1=CC=C2)O[N+]([O-])=O,0 +CC=NN(C)C=O,0 +CC2=C(C=C1C=CC=CC1=C2)[N+]([O-])=O,0 +CC(C)(C)C1=C(C(=CC(=C1)CC2=CC(=C(C(=C2)C(C)(C)C)O)C(C)(C)C)C(C)(C)C)O,0 +C1CN(CCN1)C2=CC=CC=C2,0 +FC1=NC(=CC=C1)F,0 +CCCCCCCCCCCCCCC1CO1,0 +ClC1=CC(=C(C=C1)Cl)Cl,0 +C1CNCCN1,0 +CC=C1CC(C)C(O)(CO)C(=O)OCC2=CC[N+]3([O-])CCC(OC1=O)C23,0 +CC1=C(C=CC=C1)Cl,0 +CCC1=C4C(=C(C2=CC=CC=C12)CC)C3=CC=CC=C3C=C4,0 +CCSCCOP(=S)(OC)OC,0 +CCOC(=O)C(Cl)C(C)=O,0 +CC2=C1C=CC=CC1=C3C(=C2)C4=C(C=C3)C(O)C(O)C5OC45,0 +NC1=CC=C(C=C1)Br,0 +C1COCCOCCOCCO1,0 +O=C1CCCCCN1,0 +[O-][N+](=O)C1=C(C(=C(C(=C1)Cl)Cl)Cl)Cl,0 +OCC1OC(C(O)C1O)N2CC(=O)C(=N)NC2=O,0 +OCCCC1=CC=CC=C1,0 +CC1=NC(=NC(=C1)C)SC(=O)OC(C)(C)C,0 +OC(=O)C=CC1=CC=CC=C1,0 +CCOP(=O)(OCC)OC1=NOC(=C1)C2=CC=CC=C2,0 +CC(O)=O,0 +N#CCC1=CC=CC=C1,0 +CC1(C)N(Cl)C(=O)N(Cl)C1=O,0 +CCC(C)=O,0 +OC1=C(C(=C(C(=C1Br)Br)Br)Br)Br,0 +CCN(CC)C1=CC2=C(C=C1)C(=CC(=O)O2)C,0 +NCCCNCCCN,0 +CCOC1=C(C=CC(=C1)C=O)O,0 +CN1N(C(=O)C=C1C)C2=CC=CC=C2,0 +COC1=C(C=C(C(=C1)OC)C=O)OC,0 +CCCNC(=O)NS(=O)(=O)C1=CC=C(C=C1)Cl,0 +CC(NC(=O)COC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 +C[N]2C(=NC3=NC1=CC=CN=C1C=C23)N,0 +OS(=O)(=O)C2=C1N=CC=CC1=CC=C2,0 +CC1=NC2=C(C=N1)CCC2,0 +CN(C1CCN(CC1)C3=NC2=CC=CC=C2[N]3CC4=CC=C(C=C4)F)C5=NC(=CC=N5)O,0 +OC1=CC=C(C=C1)C3CC(=O)C2=C(C=C(C=C2O)O)O3,0 +CC(=O)C(=O)C1=CC=CC=C1,0 +O=C(CN1C(=O)SC2=C1C=CC=C2)OCC3=CC=CC=C3,0 +ClC1=C(Cl)C(Cl)(Cl)C(=C1Cl)Cl,0 +BrCC(=O)C1=CC=CC=C1,0 +CCCCCCC=O,0 +O2C1=CC=CC=C1C3=CC=CC=C23,0 +CC1=CC=C(O1)C=O,0 +C2CCCC1OC1CC2,0 +C1COCCN1,0 +OC2=NC1=CC=CC=C1O2,0 +NC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=CC=C3,0 +O=CNC1=CC=CC=C1,0 +CCSCCSP(=S)(OC)OC,0 +COP(O)(SC)=NC(C)=O,0 +CC(C)(C)OOC(C)(C)CCC(C)(C)OOC(C)(C)C,0 +CC1=C(C=C(C=C1)Cl)[N+]([O-])=O,0 +CCOC(=O)C1OC1(C)C2=CC=CC=C2,0 +COC(=O)CCC(=O)OC,0 +CCCCCCCOC1=C(C=CC=C1)NC(=O)OCCN2CCCCC2,0 +CC(=C)C1=C(C=C(C(=C1)O)C)O,0 +O1C=CC2=CC=CC=C12,0 +CC(=O)C1=CC=CC=C1,0 +CCCCSCCC(N)C(O)=O,0 +OCC1=CC=C(C=C1)[N+]([O-])=O,0 +CC(C)(C)OC(=O)ON=C(C#N)C1=CC=CC=C1,0 +CCCOC(=O)C(C)=C,0 +CC(=O)[N]1C=CN=C1,0 +OC(=O)C2=NC1=C(C=CC=C1C(=C2)O)O,0 +ON=CC=NO,0 +N#CCCC#N,0 +NC1=CC=C(C=C1)S(O)(=O)=O,0 +OC2=C1C=C(C(OC1=CC=C2)=O)C4CCC3=C(C=CC=C3)C4,0 +CC1=CC(=O)OC2=C1C=CC(=C2)N,0 +CC(=O)NC1=C(C3=C(C=C1)C2=CC=CC=C2C3)O,0 +CC(O)CN(CCN(CC(C)O)CC(C)O)CC(C)O,0 +CCCCOCCOCCOCC2=C(C=C1OCOC1=C2)CCC,0 +CC(=O)OC1=CC=C(C=C1)CO,0 +CO,0 +COCCOCCOC,0 +CCC(=O)C(C)=O,0 +CC1(C)CC(C(N)=O)C(C)(C)N1O,0 +CC1=C(C=CC(=C1)Cl)OCCCC(O)=O,0 +O=C1OC(=O)C=C1,0 +CCCCC(CC)CN,0 +CC(C)C1=CC3=C(C=C1)OC2=C(C=C(C(=N2)N)C(O)=O)C3=O,0 +FC(F)(F)C1=CC=C(C=C1)Cl,0 +CC1=NN=C(S1)NS(=O)(=O)C2=CC=C(C=C2)N,0 +CCN(CC)S(=O)(=O)C1=CC=C(C=C1)NC(C)=O,0 +OC1=CC2=C(C=C1)OCO2,0 +CCC(C)C(C)CO,0 +OC1(O)C(=O)NC(=O)NC1=O,0 +NC(CC(O)=O)C(O)=O,0 +CC(C)OC(=O)C(C)=C,0 +COC1=C(C=CC(=C1)C=C)O,0 +CCCCCCCCCCC,0 +CC(=O)OC1=C(C=CC=C1)C(O)=O,0 +CCCCOC(=O)C1=C(C=CC=C1)N,0 +CC3=C(C2=C1C=CC=CC1=CC=C2C=C3)C,0 +NC(=O)C1=CN=CC=C1,0 +CC2(C)C3CCC1(CO1)C2C3,0 +BrC1=CC=CC=C1,0 +CCCCCCCCCCCCCC(O)=O,0 +NC(C#N)C(=N)C#N,0 +ClC2=NC1=CC=CC=C1C=C2,0 +OC1=CC(=C(C=C1)N=NC2=CC=C(C=C2)[N+]([O-])=O)O,0 +O=C4C=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C4=O,0 +CC1=CC=C(C=C1)C(=O)C2=CC(=C(C(=C2)O)O)[N+]([O-])=O,0 +CN(C)C1=CC=C(C=C1)C4CC2(C)C(CCC2(O)C=CCO)C5CC=C3CC(=O)CCC3=C45,0 +CCCC(C1=C(C=C(C(=C1)C(C)(C)C)O)C)C2=C(C=C(C(=C2)C(C)(C)C)O)C,0 +CN(C)CCO,0 +OC1=C(C=C(C=C1)Cl)Cl,0 +OC(=O)C2=C1N=CC=CC1=CC=C2,0 +C1=CC=NC=C1,0 +ON=CC1=NC=CC=C1,0 +OCCOC1=C(C=C(C(=C1)Cl)Cl)Cl,0 +OCCO,0 +OS(=O)(=O)C1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,0 +OC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,0 +CCN(CC)C(=O)CC1=CC=CC=C1,0 +OC1COC(O)(CN(CC(O)=O)N=O)C(O)C1O,0 +C[N+]1=CC=C(C=C1)C2=CC=[N+](C=C2)C,0 +COC4=C1C5=C(C(OC1=C3C2CCOC2OC3=C4)=O)C(OCC5)=O,0 +CC(C)CCCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCCC(C)C,0 +CC(=O)OCC1=CC=CC=C1,0 +OC2=CC=C1[NH]C=CC1=C2,0 +CC(Br)Br,0 +COC(=O)C1=C(C)NC(=C(C1C2=C(C(=CC=C2)Cl)Cl)C(=O)OC(C)C)COC(N)=O,0 +OCC(CO)(CO)CO,0 +OC1=CC(=CC(=C1)Cl)Cl,0 +CC1=C(C=C(C=C1)N)Cl,0 +CCCCCCCCCCOC(=O)C(C)=C,0 +COC1=CC(=CC(=C1)OC2=C(C=C(C=C2)Cl)Cl)[N+]([O-])=O,0 +ClC1=CC=C(C=C1)NC(=O)NC2=CC(=C(C=C2)Cl)Cl,0 +C=CC1CCC=CC1,0 +NCCC1=C[NH]C2=CC=C(O)C=C12,0 +COC1=C(C=CC(=C1)C=O)O,0 +COP(=O)(OC)OC(=CCl)C1=C(C=C(C(=C1)Cl)Cl)Cl,0 +CC(C=O)=CC1=CC=CC=C1,0 +CC(C)C1=CC3=C(C=C1)C2=CC=CC(=C2C=C3)C,0 +OC1=CC=C(C=C1)C2(CCCCC2)C3=CC=C(C=C3)O,0 +COC(=CC(O)=O)C(=O)C(C)=C,0 +C=CC(=O)OCCOCCOC(=O)C=C,0 +C=CC(=O)OCCCCCCOC(=O)C=C,0 +OCC=O,0 +CN(C)C=O,0 +COC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=CC5=C3C4CCOC4O5)OC,0 +CC(C)CCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCC(C)C,0 +C1COCCOCCOCCOCCOCCO1,0 +CC1CCCC(C)N1CCCC(O)(C2=CC=CC=C2)C3=NC=CC=C3,0 +CC(C)COC(=O)C1=C(C=CC=C1)C(=O)OCC(C)C,0 +CCCCCCCCCCCCCl,0 +CNC(=O)N(C1=CC=CC=C1)C2=CC=CC=C2,0 +CCCCCC(O)=O,0 +CCCCC(CC)COP(OCC(CC)CCCC)OCC(CC)CCCC,0 +OC2=NC1=CC=CC=C1C=C2,0 +OC1=C(C(=C(C=C1)Cl)Cl)Cl,0 +OCC1=CC=C(C=C1)Br,0 +CC1=NC=CC=C1,0 +COC1=C(C2=C(C=C1O)OC(=CC2=O)C3=CC=C(C=C3)O)O,0 +CC(C)NCC(O)COC1=C(C=CC=C1)OCC=C,0 +CCCCCC1=CC(=CC(=C1)O)O,0 +C=CC(=O)OCCCCCOC(=O)C=C,0 +CC(=O)C(C)=NO,0 +CCC1(CC(O)=O)OCCC2=C1[N](C3=CC=CC=C23)C,0 +COC3=C1C=COC1=NC4=C(O)C2=C(OCO2)C(=C34)CC=C(C)C,0 +COC3=C(C=C2C16CCN7CC5=CCOC4C(C1N(C2=C3)C(C4)=O)C5CC67)OC,0 +OC(=O)COC2=CC1=CC=CC=C1C=C2,0 +CCC=CC#N,0 +CC1=C(C=CC(=C1C)N)N,0 +OC1=C2C=CC3=CC=CC4=CC=C(C=N1)C2=C34,0 +CNCC1=CC=C(O1)CSCCNC(NS(C)(=O)=O)=NCC(O)C2=CC=C(C=C2)O,0 +CNNCC1=CC=C(C=C1)C(=O)NC(C)C,0 +CC1=CC=C(C=C1)N(CCCl)CCCl,0 +CN(C)S(=O)(=O)N(SC(F)(Cl)Cl)C1=CC=CC=C1,0 +OCCNCCO,0 +CC(C)(C)C1CCC2(CC1)CO2,0 +COC(F)(F)C(Cl)Cl,0 +OC2=C1N=CC=CC1=C(C=C2Cl)Cl,0 +CCCCC=O,0 +CC(=O)C=CC1=C(C)CCCC1(C)C,0 +CC1=C(C=C(C=C1)S(O)(=O)=O)C,0 +CCC2=C1OC(=CC1=CC=C2)C(O)CNC(C)(C)C,0 +CC(C)=CCCC(C)(OC(=O)C1=C(C=CC=C1)N)C=C,0 +CC4=C3N=C2C1=CC=CC=C1C=CC2=CC3=CC=C4,0 +ClCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,0 +OC1=CC=C(C=C1)C3=COC2=C(C=CC(=C2)O)C3=O,0 +O=C1NC(=O)C(N1)(C2=CC=CC=C2)C3=CC=CC=C3,0 +CCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCC,0 +[NH]1C=CC=C1,0 +CCC1=C(C(=CC(=C1)N)C)CC2=C(C=C(C=C2C)N)CC,0 +OCC#N,0 +CC(=O)CC(C)=O,0 +OC(=O)CC1=C[NH]C2=CC=CC=C12,0 +O=C2CN(CCCN1CC(=O)NC(=O)C1)CC(=O)N2,0 +CC(C)C2=CC=C(C)C1=C(C=C(C)C1=C2)S(O)(=O)=O,0 +CC(=O)C1=C(C(=C(C(=C1C)[N+]([O-])=O)C(C)(C)C)[N+]([O-])=O)C,0 +ClCC1(CCl)C2CC(Cl)(Cl)C1(CCl)C(Cl)C2Cl,0 +ClC1=C(C(=C(C=C1)Cl)Cl)Cl,0 +COC1=C(C=CC=C1)O,0 +FC(F)(F)C1=CC=C(C=C1)CCl,0 +OC(=O)CCC1=CC=CC=C1,0 +COC4=CC2C3CC1=C(C(=C(C=C1)OC)O)C2(CCN3C)CC4=O,0 +OC2=C(C1=CC=CC=C1C=C2)N=O,0 +COC3=CC=C2C1=C(C(=NCC1)C)[NH]C2=C3,0 +CNC1=C(C=CC=C1)C(=O)OC,0 +OC(=O)CCCOC1=C(C=C(C=C1)Cl)Cl,0 +ClC(Cl)C(C1=CC=C(C=C1)Cl)C2=C(C=CC=C2)Cl,0 +CCCCC(CC)CO,0 +CC(C)=CCCC(C)(O)C=C,0 +CC(C)(C)C(Br)C(=O)NC1=CC=CC=C1,0 +OS(=O)(=O)C1=CC=C(C=C1)[N+]([O-])=O,0 +CS(=O)(=O)C1=CC=C(C=C1)Cl,0 +CCC2=C1[NH]C3=C(C1=CC=C2)CCOC3(CC)CC(O)=O,0 +CCCCOC(=O)CC(CC(=O)OCCCC)(OC(C)=O)C(=O)OCCCC,0 +CC(=O)C1(CCNCC1)C2=CC=CC=C2,0 +CCN(CC)C(=S)SSC(=S)N(CC)CC,0 +NC1=CC=C(C=C1)C(O)=O,0 +CC(C(O)=O)C1=CC(=CC=C1)C(=O)C2=CC=CC=C2,0 +ClC1=C(C=CC=C1)C=C,0 +CN(C)C(=N)N(C)C,0 +CC4=C(COC(=O)C1N3C(SC1(C)C)C(NC(=O)C(N)C2=CC=CC=C2)C3=O)OC(=O)O4,0 +N#CSCSC#N,0 +OC(=O)C1=C(C=CC(=C1)Cl)Cl,0 +CCCCC(CC)COC(=O)C=C,0 +OC(=O)CCCCC(O)=O,0 +BrCC(=O)C1=CC=C(C=C1)Br,0 +C2CCC1=C(C=CC=C1)C2,0 +CCC(C1=CC=CC=C1)=C(C2=CC=CC=C2)C3=CC=C(C=C3)OCCN(C)C,0 +CC(=C)C1CCC(=CC1)C=O,0 +OC(C(F)(F)F)C(F)(F)F,0 +CC(C)CC=O,0 +ClC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,0 +CC1(CO1)C=C,0 +CC(C)CCC(C)NC1=CC=C(C=C1)NC(C)CCC(C)C,0 +COC(C)=O,0 +CC(C)(C)N,0 +CNC,0 +CC1=CC(O)C2CC1C2(C)C,0 +CN(C)C(=O)NC1=CC=C(C=C1)Cl,0 +CCOP(=O)(OCC)OCC,0 +CC(OC1=C(C=C(C(=C1)Cl)Cl)Cl)C(O)=O,0 +NC1=NC(=O)N(C=C1)C2OC(COP(O)(O)=O)C(O)C2O,0 +CC(C)O,0 +CC1=CC(=O)CC(C)(C)C1,0 +CCCN(CCC)S(=O)(=O)C1=CC=C(C=C1)C(O)=O,0 +OC(=O)C1=C(C=CC=C1Cl)Cl,0 +CC1=CC=C(C=C1)C,0 +CCCO,0 +S1C=CC=C1,0 +O=S1(=O)CC=CC1,0 +NC1=C(C(=CC(=C1)[N+]([O-])=O)S(O)(=O)=O)O,0 +CC(=O)OC2C1OC(=O)C(OC(C)=O)C1OC2=O,0 +ClCC1=CC=C(C=C1)C#N,0 +OC(=O)CN(CCN(CC(O)=O)CC(O)=O)CC(O)=O,0 +CCCCCCCCC=C,0 +ClC2=C(C=C1OC3=C(OC1=C2)C=C(Cl)C(=C3)Cl)Cl,0 +OC1=CC=C(C=C1)C2(NC(=O)NC2=O)C3=CC=CC=C3,0 +C1=CC=C(C=C1)C2=C(C=CC=C2)C3=CC=CC=C3,0 +CC1=CC=C(C=C1)CCl,0 +O=C([N]1C=CN=C1)[N]2C=CN=C2,0 +CC(=O)CC(=O)NC1=CC=CC=C1,0 +[O-][N+](=O)C1=CC=C(C=C1)[N]2N=C(N=[N+]2C3=CC=C(C=C3)I)C4=CC=CC=C4,0 +CCC(C)C1=C(C=CC=C1)O,0 +C1CN2CCN1CC2,0 +COP(=O)(OC)OC(=CBr)C1=C(C=C(C=C1)Cl)Cl,0 +CC(O)COCC(C)O,0 +COP(=S)(OC)OC1=CC(=C(C=C1)[N+]([O-])=O)C,0 +CCCCCCCCCCCC(O)=O,0 +NC(=O)C1=CC=CC=C1,0 +CC(=O)CCl,0 +NC(CC1=CC=C(C=C1)F)C(O)=O,0 +COC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 +ClC2=C1C=CC=CC1=CN=N2,0 +CCC1=CC=CC=C1,0 +COC1=C(C=CC(=C1)C=CC(=O)CC(=O)C=CC2=CC(=C(C=C2)O)OC)O,0 +CC(=O)NNC(=O)C1=NC=CC=C1,0 +COC2=C(C=C1[NH]C=C(C1=C2)CCNC(C)=O)O,0 +BrCC(Br)C1CCC(Br)C(Br)C1,0 +NCCC#N,0 +OC1=CC=C(C=C1)CCC(=O)C2=C(C=C(C=C2O)O)O,0 +CC(Cl)Cl,0 +OC2=C1C=CC=CC1=NC3=CC=CC=C23,0 +OC4C(O)C3=C(C=C2C1=CC=CC=C1C=CC2=N3)C5=C4C=CC=C5,0 +CCC1=NC=CC(=C1)C(N)=S,0 +CCCC,0 +OC(=O)C=CC1=CC=C(C=C1)Cl,0 +CCCCN,0 +CCC(C)(C)C1=CC(=C(C(=C1)N3NC2=C(C=CC=C2)N3)O)C(C)(C)CC,0 +NC1=CC=C(C=C1)O,0 +OC1CCCCC1,0 +[O-][N+](=O)C1=CC(=CC=C1)C=CC(=O)C2=CC=CC=C2,0 +COP(C)(=O)OC,0 +CCCCCCCCCCCCO,0 +ClC1=C(C2=C(C(=C1Cl)Cl)C(=O)OC2=O)Cl,0 +S=C1SC=C(S1)C2=CC=CC=C2,0 +OC(=O)C1=C(N=CC=C1)NC2=CC(=CC=C2)C(F)(F)F,0 +CC1CCCC1,0 +OC2CC13OC1(C2)C=CC=C3,0 +CC(C)(C)OC(=O)C=C,0 +CC1=CSC=C1,0 +COP(=O)(OC)C(OC(=O)CCl)C(Cl)(Cl)Cl,0 +OCC1=CC=C(C=C1)Cl,0 +ClC1=C(Cl)C(=O)C(Cl)(Cl)C1=O,0 +CCCCCCCCOP(=O)(OCCCCCCCC)OCCCCCCCC,0 +CCC1=CC=CO1,0 +OC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,0 +CC1=C(C=CC(=C1)S(O)(=O)=O)N,0 +CCN(CC)C(=O)C1=CC(=CC=C1)C,0 +CC(C(O)=O)C1=CC3=C(C=C1)C2=CC(=CC=C2[NH]3)Cl,0 +OCC(O)C(O)C(OC1OC(CO)C(O)C(O)C1O)C(O)CO,0 +CCN,0 +NS(=O)(=O)C2=C1N=CC=CC1=CC=C2,0 +CC1=C(C(=CC=C1)NC2=NC(=NC(=C2)Cl)SCC(O)=O)C,0 +CC1=C(C=C(C(=C1)C)C)C,0 +CCCCOC(=O)CCCCCCCCC(=O)OCCCC,0 +CCCCCCC1=C(C=C(C=C1)O)O,0 +CC(O)CN(CC(C)O)CC(C)O,0 +OC(=O)C2=N[N](CC1=C(C=C(C=C1)Cl)Cl)C3=CC=CC=C23,0 +OC1=C(C=C(C=C1Br)Br)Br,0 +NC2=NC=C1N=C[NH]C1=N2,0 +N(C1=CC=CC=C1)C2=CC=CC=C2,0 +CCOC(=O)C(C)(C)OC1=CC=C(C=C1)Cl,0 +OCCCCO,0 +CCCCOP(=O)(OCCCC)OC1=CC=CC=C1,0 +NC2=C1C(C4=C(C(C1=C(C=C2S(O)(=O)=O)NC3CCCCC3)=O)C=CC=C4)=O,0 +NC(=O)CBr,0 +[O-][N+](=NC1=CC(=C(C=C1)Cl)Cl)C2=CC(=C(C=C2)Cl)Cl,0 +FC(F)C(F)(F)F,0 +CCC1=CC(=C(C(=C1)C(C)(C)C)O)C(C)(C)C,0 +O=C1OC4=C3C2=C1C=CC=C2C=CC3=CC=C4,0 +NC(=O)CI,0 +CC1=C(SSC1=S)C2=NC=CN=C2,0 +NC1=C(C(=C(C=C1)Cl)Cl)Cl,0 +CC1=C(C(=C(C(=C1[N+]([O-])=O)C)[N+]([O-])=O)C(C)(C)C)[N+]([O-])=O,0 +O=C2C1=C(C=CC=C1)CCC3=C2C=CC=C3,0 +CC1=CC(=C(C=C1)C)C,0 +ClC(=O)OCC1=CC=CC=C1,0 +OC2=C1C(C5=C(OC1=CC=C2)C3=C(OC4OCCC34)C=C5O)=O,0 +OC(=O)CC(Cl)C(O)=O,0 +CC1=CCC(=O)O1,0 +ClC2=C1C=CC=CC1=C(N=N2)Cl,0 +OCC4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,0 +CC1=C(C(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O)C,0 +C1COCCO1,0 +CC1=CC=C(O1)C,0 +OCC1=CC=C(C=C1)O,0 +O[N+]([O-])=C2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3,0 +CC(=O)OC3CC2C1(C)CCCC(C)(C)C1CCC2(C)C4(O)CC(=C(C=O)C34C)C=O,0 +COC2=C(C(=C1C(OCC1=C2C)=O)O)CC=C(C)CCC(O)=O,0 +CC(C)C(=O)NC1=CC=CC=C1,0 +OC(=O)CC1=CC=C(C=C1)Cl,0 +C2=CC1=CC=NC=C1C=C2,0 +OC1=C(C4=C2C(=C1)C(=O)OC3=C2C(=CC(=C3O)O)C(=O)O4)O,0 +OC1=C(C(=CC(=C1Cl)Cl)Cl)Cl,0 +CC1=CC=CC=C1,0 +ClC1=C(C(=CC=C1)Cl)C#N,0 +CC(C)OC1=CC2=C(C=C1)C(C(=CO2)C3=CC=CC=C3)=O,0 +[O-][N+]2=C1C=CC=CC1=CC=C2,0 +CCN(CC)CC1=C(C=CC(=C1)NC3=C2C=CC(=CC2=NC=C3)Cl)O,0 +C1CCC(CC1)NSC3=NC2=CC=CC=C2S3,0 +CCN(N=O)C1=CC=CC=C1,0 +O=C1CC(=O)C1=O,0 +CC(C)(C1=CC=C(C=C1)O)C2=CC=C(C=C2)O,0 +CC(=O)NC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 +CC(=O)OO,0 +CC(=O)C1=CC=C(C=C1)S(=O)(=O)NC(=O)NC2CCCCC2,0 +CC(C)(C)O,0 +CC(C)(OC1=CC=C(C=C1)C2CC2(Cl)Cl)C(O)=O,0 +CC1=CC(=CC=C1)[N+]([O-])=O,0 +CCC=[N+](O)[O-],0 +C1OCOCO1,0 +CCC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)C,0 +CCOC(C)=O,0 +CCOC1=CC=C(C=C1)NC(N)=O,0 +CC(C)=O,0 +CC1=CC=C(C=C1)Cl,0 +CCCCC(CC)COCCC#N,0 +ClCC1=CC=C(C=C1)Cl,0 +OC1=C(C=CC=C1)C(=O)OC2=CC=CC=C2,0 +ClC(=C)C#N,0 +CCOC(=O)OC(=O)OCC,0 +CC(CCN(C)C)N(C)C,0 +CC1=C(C)C(=O)C(=C(C)C1=O)C,0 +C=CCN1C(=O)N(CC=C)C(=O)N(CC=C)C1=O,0 +OC(=O)C1CC2=C(CN1)[NH]C3=CC=CC=C23,0 +CCCCCN,0 +[O-][N+](=O)OCC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O,0 +COC1=C(C5=C(C(=C1)O)C(=O)C2=C(C3=C(C=C2OC)OC4OCCC34)O5)OC,0 +OC(=O)C1=C(C=CC=C1)Cl,0 +O=C1CCCCC1,0 +CC1=CC=C(C=C1)OP(=O)(OC2=CC(=CC=C2)C)OC3=CC(=CC=C3)C,0 +OC(=O)C1=C(C=CC=C1)NC2=C(C=CC(=C2)Cl)C(O)=O,0 +CCCCCC(N)=O,0 +CCCCCCCCCCCC(=O)OCCS(O)(=O)=O,0 +OC1=C(C=C(C=C1Cl)Cl)SC2=C(C(=CC(=C2)Cl)Cl)O,0 +[O-][N+]4=C2C=CC1=CC=CC=C1C2=CC5=C3C=CC=CC3=CC=C45,0 +ClC1=CC=C(C=C1)S(=O)(=O)C2=C(C=C(C(=C2)Cl)Cl)Cl,0 +CC(OP(C)(Cl)=O)C(C)(C)C,0 +ClC1=CC(=CC(=C1)Cl)N2C(=O)CCC2=O,0 +NCC1=CC(=CC=C1)CN,0 +OC(=O)COC1=C(C(=C(C=C1)C(=O)C2=CC=CS2)Cl)Cl,0 +O=C1C5=C4C3=C2C1=CC=CC2=CC=C3C=CC4=CC=C5,0 +CC1=NC=CN=C1,0 +CCC(O)CN,0 +CC(=O)C3C(=O)C=C2OC1=C(C(=C(C(=C1C(C)=O)O)C)O)C2(C)C3=O,0 +O=C1CSC(=S)N1,0 +FC2=CC1=CC=CC=C1N=C2,0 +OC1=CC=C(C=C1)C3=CC(=O)C2=C(C=C(C=C2O)O)O3,0 +OC(=O)C1=CC(=C(C(=C1)O)O)O,0 +C=COC(=O)C=C,0 +CC(CCl)OP(=O)(OC(C)CCl)OC(C)CCl,0 +CC1(C)C2CCC1(C)C(=O)C2=O,0 +NC1=CC=C(C=C1)C(=O)OCCCOC(=O)C2=CC=C(C=C2)N,0 +COC1=C(C=CC(=C1)C=CC)O,0 +CC(C)CC(NC(=O)COC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 +OC(=O)C1=CC(=CC(=C1)Cl)Cl,0 +CCCCOC(C)=O,0 +C2CCC1CCCCC1C2,0 +CCC1=CC=C(C=C1)[N+]([O-])=O,0 +CC1=C(C(=C(C(=C1Br)Br)Br)Br)Br,0 +C[N+](C)(C)CC1=CC=CC=C1,0 +CC#N,0 +CC(C)(C)CC(C)(C)C1=CC=C(C=C1)OCCOCC[N+](C)(C)CC2=CC=CC=C2,0 +CCCCCCCCCCCCCCCCCC[N+](C)(C)CC1=CC=CC=C1,0 +CCCCC(CC)COS(O)(=O)=O,0 +OCCN4CCN(CCCN2C1=C(C=CC=C1)SC3=C2C=C(C=C3)C(F)(F)F)CC4,0 +OC(COC2=C1C(C=C(OC1=CC=C2)C(O)=O)=O)COC4=C3C(C=C(OC3=CC=C4)C(O)=O)=O,0 +OC2=C(C1=CC=C(C=C1C=C2)S(O)(=O)=O)N=NC3=CC=CC=C3,0 +OC2=C(C1=C(C=C(C=C1C=C2)S(O)(=O)=O)S(O)(=O)=O)N=NC3=CC=CC=C3,0 +CN(C)CCN(CC1=CC=CC=C1)C2=CC=CC=C2,0 +CC(C)C1CCC(C)CC1O,0 +COC(=O)C(C1CCCCN1)C2=CC=CC=C2,0 +CC(CCC1=CC=CC=C1)NCC(O)C2=CC(=C(C=C2)O)C(N)=O,0 +NC2=C1C(=C(C(=CC1=CC(=C2)S(O)(=O)=O)S(O)(=O)=O)N=NC3=CC=CC=C3)O,0 +CC3=C(OC1=C(C=CC=C1C(=O)OCCN2CCCCC2)C3=O)C4=CC=CC=C4,0 +CC(CN2C1=C(C=CC=C1)SC3=C2C=CC=C3)N(C)C,0 +CC(C)CCCC(C)CCCC(C)CCCC2(C)CCC1=C(C(=C(C(=C1C)O)C)C)O2,0 +C[N+](C)(C)CC(O)=O,0 +CON,0 +OC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=C(C=C3)S(O)(=O)=O,0 +CC1=NC(=C(C=N1)C[N+]2=CSC(=C2C)CCO)N,0 +OC1=NC(=NC(=N1)O)O,0 +OC2=C1[N+](=CC=CC1=CC=C2)[O-],0 +OC(=O)C1C(C(O)=O)C2(Cl)C(=C(Cl)C1(Cl)C2(Cl)Cl)Cl,0 +OC2=C1C=CC=CC1=CN=N2,0 +C(NC2=C1[NH]C=NC1=NC=N2)C3=CC=CC=C3,0 +CC=C1CC(C)C(C)(O)C(=O)OCC2=CCN3CCC(OC1=O)C23,0 +NC2=NC1=N[NH]N=C1C(=N2)O,0 +CCCCCCCCCCCCCCCC(=O)OCC(O)C1=C(C(=C(O1)O)O)O,0 +CCCCCC(CC)OC(=O)C1=CC(=CC=C1)C(=O)OC(CC)CCCCC,0 +OC2=C1C=CC=CC1=C(N=N2)O,0 +SC2=NC1=CC=CC=C1S2,0 +OCC(O)C(O)CO,0 +CC2(C)C3CC1OC1(C)C2C3,0 +CC(=O)C1=C(O)[N]5C(=C1O)C2C(CC4=C3C2=C[NH]C3=CC=C4)C5(C)C,0 +CC(C)CC(=O)OC4CC1(OC(C)=O)C(OC2C(O)C(OC(C)=O)C1(C)C23CO3)C=C4C,0 +CC(=O)OCC12CCC(=CC1OC3C(O)C(OC(C)=O)C2(C)C34CO4)C,0 +CC4CC3OC1C(O)C(OC(C)=O)C(C)(C12CO2)C3(CO)C(=O)C4=O,0 +CC4CC3OC1C(O)C(O)C(C)(C12CO2)C3(CO)C(=O)C4=O,0 +NC1=NN=C(S1)S,0 +ClCC1C(CCl)C2(Cl)C(=C(Cl)C1(Cl)C2(Cl)Cl)Cl,0 +ClC1=CC3=C(C=C1)N2C=NNC2=CN=C3C4=CC=CC=C4,0 +C=CC1CC2CC1C=C2,0 +ClC3=C(Cl)C4(Cl)C2C1CC(C=C1)C2C3(Cl)C4(Cl)Cl,0 +CC1C(=O)OC2CCN3CC=C(COC(=O)C(C)(O)C1(C)O)C23,0 +OC2CC(O)(CC(OC(=O)C=CC1=CC(=C(C=C1)O)O)C2O)C(O)=O,0 +CN(C=NC=NC1=C(C=C(C=C1)C)C)C2=C(C=C(C=C2)C)C,0 +NC3=NC(=C2N=C(O)[N](C1OC(CO)C(O)C1O)C2=N3)O,0 +CC1(CO)C(O)CCC2(C)C1CCC3CC4CC23CCC4(O)CO,0 +CNC(=N)N[N+]([O-])=O,0 +CC(=O)OC4(CCC5C3C=C(Cl)C2=CC(=O)C1CC1C2(C)C3CCC45C)C(C)=O,0 +CC12CCC(CC1)C(C)(C)O2,0 +CC12CCCC(C)(C1CCC34CC(=C)C(O)(CCC23)C4)C(O)=O,0 +CNC3=C1CC(=O)C(=CC=C1C2=C(C(=C(C=C2CC3)OC)OC)OC)OC,0 +CC34CC(O)C1C(CCC2=CC(=O)C=CC12C)C3CCC4(O)C(O)C=O,0 +CC34CCC1C(CCC2=C1C=CC(=C2)O)C3CC(O)C4O,0 +CC34CCC1C(CCC2=C1C=CC(=C2)O)C3CCC4O,0 +CC2=CN(C1CC(O)C(CO)O1)C(=O)NC2=O,0 +OC1=NC(=C(C=N1)F)O,0 +CC(=O)OC3(CCC4C2CCC1=C(CCC(=O)C1)C2CCC34C)C#C,0 +CC1CCC6(OC1)OC5CC4C3CC=C2CC(O)CCC2(C)C3CCC4(C)C5C6C,0 +CC4CC3OC1C(O)CC(C)(C12CO2)C3(CO)C(=O)C4=O,0 +OC3=C(C=C2C1C4=C(OCC1(CC2=C3)O)C(=C(O)C=C4)O)O,0 +COC1=C(C(=CC(=C1)C3C2C(COC2=O)C(O)C5=C3C=C4OCOC4=C5)OC)OC,0 +CC2OC=C1C(=O)C(C(O)=O)C(=O)C(=C1C2C)C,0 +NC2=C1C(=NN=C(C1=CC=C2)O)O,0 +CC34CCC1C(CC=C2CC(O)CCC12C)C3CCC4=O,0 +CN1CCCC1C2=CN=CC=C2,0 +OCC1OC(CC1O)N2C=C(I)C(=O)NC2=O,0 +CC(C)C12CC1C(C)C(=O)C2,0 +CC(N)(CC1=CC(=C(C=C1)O)O)C(O)=O,0 +CC1=NC(=NC(=C1)O)S,0 +CC34CCC1C(CCC2=C1C=CC(=C2)O)C3CCC4(O)C#C,0 +CC(=O)C3CCC4C2CC=C1CC(=O)CCC1(C)C2CCC34C,0 +NC2=C1N=C[N](C1=NC=N2)C3OC(CO)C(O)C3O,0 +OC(=O)CCCCC1SCC2NC(=O)NC12,0 +NS(=O)(=O)C1=C(C=C2C(=C1)S(NC=N2)(=O)=O)Cl,0 +SC2=NC1=CC=CC=C1[NH]2,0 +OCC1OC(CC1O)N2C=C(Br)C(=O)NC2=O,0 +NC2=NC1=NC=C(N=C1C(=N2)O)CNC3=CC=C(C=C3)C(=O)NC(CCC(O)=O)C(O)=O,0 +CC1=C(N=C(N=C1)S)O,0 +CC=CC(=O)OC2CC3OC1=CC(C)C(=O)CC1(C)C2(C)C34CO4,0 +CC(C)CCCC(C)C1CCC2C(CCCC12C)=CC=C3CC(O)CCC3=C,0 +NC(CC1=CC=CC=C1)C(O)=O,0 +CC34CCC1C(CC=C2CC(=O)CCC12)C3CCC4(O)C#C,0 +CC(=O)OC3(CCC4C2CC(=C1CC(=O)CCC1(C)C2CCC34C)C)C(C)=O,0 +CC14C(O)C=CC5(OC1=O)C2CCC3(O)CC2(CC3=C)C(C45)C(O)=O,0 +C2C=CC3C1CC(C=C1)C23,0 +CC1=CCC2CC1C2(C)C,0 +CC6CCC5C(C)C3C(CC4C2CC=C1CC(O)CCC1(C)C2CCC34C)N5C6,0 +CC(CCC(O)=O)C3CCC4C2C(O)CC1CC(O)CCC1(C)C2CC(O)C34C,0 +[O-][N+](=O)OC1COC2C(COC12)O[N+]([O-])=O,0 +CC2=CCCC(=C)C1CC(C)(C)C1CC2,0 +CC1=C(N=C(N=N1)O)O,0 +OCC1OC(CC1O)N2C=CC(=O)NC2=O,0 +NC2=C1N=C[N](C1=NC=N2)C3CC(O)C(CO)O3,0 +CCCC(=O)OCC,0 +CC(=O)C1=CC=NC=C1,0 +ClC1=NC(=CC=C1)Cl,0 +CC(O)CO,0 +CC(C)CO,0 +CC1CCC(=O)C1=O,0 +CC1=CC(=O)OC2=C1C=CC(=C2)O,0 +CCN(CC)C1=CC=CC=C1,0 +CCCCOC(=O)C(C)=C,0 +CN(C)C(=O)OC1=C[N+](=CC=C1)C,0 +CCC(CO)NCCNC(CC)CO,0 +CC12CCC(CC1O2)C=C,0 +NC2=C1C=CC=CC1=CC=C2O,0 +CN1CCC(C1)CN3C2=C(C=CC=C2)SC4=C3C=CC=C4,0 +CCCCCC(=O)OC3(CCC4C2CCC1=C(CCC(=O)C1)C2CCC34C)C(C)=O,0 +O=C1NS(=O)(=O)C2=C1C=CC=C2,0 +OC2=C(C=C1C=C(C=CC1=C2)S(O)(=O)=O)S(O)(=O)=O,0 +NC1=CC=CC=C1,0 +COC1=C(C4=C(C=C1Cl)C3(C(C25SSC(C(N2C3N4C)=O)(C)N(C5=O)C)O)O)OC,0 +CCCCCCCCCCCCOS(O)(=O)=O,0 +OC(=O)CC1=C(C=CC=C1)NC2=C(C=CC=C2Cl)Cl,0 +NC2=C1N=C[N](C1=NC(=N2)O)C3OC(CO)C(O)C3O,0 +COC1=C(C(=CC(=C1)CC2NCCC3=C2C=C(C(=C3)O)O)OC)OC,0 +OC(=O)C2=NN(C1=CC=C(C=C1)S(O)(=O)=O)C(=O)C2N=NC3=CC=C(C=C3)S(O)(=O)=O,0 +CN(C)C4C3C(O)C2C(C(=O)C1=C(C=CC=C1O)C2(C)O)C(=O)C3(O)C(=O)C(C(N)=O)C4=O,0 +CCNC1=NC(=NC(=N1)O)NC(C)C,0 +ON1CN(Cl)CN(Cl)C1,0 +C[N+]1(C)CCOCC1,0 +ClC1=CC=C(C=C1)COC(C[N]2C=CN=C2)C3=C(C=C(C=C3)Cl)Cl,0 +O[N]1N=NC2=CC=CC=C12,0 +CN2CCN=C(C1=CC=CC=C1)C3=C2C=CC(=C3)Cl,0 +CC(CCC(O)=O)C3CCC4C2CCC1CC(=O)CCC1(C)C2CC(=O)C34C,0 +NC(CSCC1=CC=CC=C1)C(O)=O,0 +CCNC(=O)CCC(N)C(O)=O,0 +CCC3CN2CCC1=C(C=C(C(=C1)OC)OC)C2CC3CC4NCCC5=C4C=C(C(=C5)OC)OC,0 +NC1=CC(=C(C=C1)Cl)C(F)(F)F,0 +CCN(CC)CCCN(C2CC1=C(C=CC=C1)C2)C3=CC=CC=C3,0 +OC1C(O)C(OC1COP(O)(O)=O)N2C=CC(=O)NC2=O,0 +NCCC1=C[NH]C2=CC=CC=C12,0 +CCCC(=O)NC1=CC(=C(C=C1)OCC(O)CNC(C)C)C(C)=O,0 +FC1=CC=C(C=C1)CCl,0 +CCCC(=O)NC2=C1N=C[N](C1=NC=N2)C4OC3COP(O)(=O)OC3C4OC(=O)CCC,0 +FC1=CN=CC=C1,0 +CCCCCCC(=O)OC3(CCC4C2CCC1=CC(=O)CCC1C2CCC34C)C#C,0 +OCC1OC(C(O)C1O)[N]3C=NC4=C(NCC2=CC=C(C=C2)[N+]([O-])=O)N=CN=C34,0 +OCC1OC(CC1O)N2C=C(C=O)C(=O)NC2=O,0 +OC1C(O)C(OC1COP(O)(O)=O)[N]2C=NC3=C(O)N=CN=C23,0 +OC2=C1C=CC=CC1=NC=N2,0 +CCC5=C(CC1NCCC2=C1C=C(C(=C2)OC)OC)CC3N(CCC4=C3C=C(C(=C4)OC)OC)C5,0 +CC(C)C3=CC2=CCC1C(C)(CCCC1(C)C(O)=O)C2CC3,0 +OC1=CC2=C(C=C1)C4(C3=C(O2)C=C(O)C=C3)OC(=O)C5=C4C=CC=C5,0 +OC2=CC(=C1C=C(O)C(=[O+]C1=C2)C3=CC(=C(C(=C3)O)O)O)O,0 +CCCCCCC(O)CC=CCCCCCCCC(O)=O,0 +C[N+]1=CC(=CC=C1)C(O)=O,0 +OC(=O)C1=C(C=CC=C1)O,0 +NC2=NC1=CC=C(C=C1[NH]2)Cl,0 +CCCOC(C(=O)OC1CCN(C)CC1)(C2=CC=CC=C2)C3=CC=CC=C3,0 +NC3=NC(=C2N=C[N](C1OC(COP(O)(O)=O)C(O)C1O)C2=N3)O,0 +CNC(=O)OC1=CC2=C(C=C1)N(C)C3N(C)CCC23C,0 +CC(C)CCCC(C)C3CCC4C2CC=C1CCCCC1(C)C2CCC34C,0 +CC4CC2(C)C(CCC3C1CCC(O)C1(C)CCC23)CC4=O,0 +CC1=C(C(=C(C=N1)CO)CO)O,0 +CC1=CC(=C(C=C1)N=NC3=C2C=CC=CC2=CC(=C3O)C(O)=O)S(O)(=O)=O,0 +CN,0 +CC1=C(C(=CC=C1)OCC(O)CNC(C)(C)C)C,0 +CN[N+]([O-])=O,0 +ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl,0 +CC(C)CC(NC(=O)C(CC1=CC=CC=C1)NC(=O)CNC(=O)CN)C(O)=O,0 +CC1=NCCC2=C1[NH]C3=CC(=CC=C23)O,0 +CC(C)CCCC(C)C3CCC4C2CC=C1CC(CCC1(C)C2CCC34C)OC(C)=O,0 +CNCC(O)C1=CC(=CC=C1)O,0 +NC1=NC=N[NH]1,0 +NC1=NC(=O)N(C=C1I)C2CC(O)C(CO)O2,0 +NC(CC1=CC(=C(C=C1)O)[N+]([O-])=O)C(O)=O,0 +COC1=CC=C(C=C1)CN(CCN(C)C)C2=NC=CC=N2,0 +CN(C)C4C3CC2C(C(=O)C1=C(C=CC=C1O)C2(C)O)C(=O)C3(O)C(=O)C(C(N)=O)C4=O,0 +COC1=CC=C2C(=CC1=O)C(CCC3=C2C(=C(C(=C3)OC)OC)OC)NC(C)=O,0 +CN1C2CC(CC1C3OC23)OC(=O)C(CO)C4=CC=CC=C4,0 +CNC(C=[N+](O)[O-])=NCCSCC1=CC=C(O1)CN(C)C,0 +OCC1OC(C(O)C1O)N2C=CC(=N)NC2=O,0 +OC1=NC(=NC=N1)O,0 +CC2(C)C1CCC(C1)C2=C,0 +CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCO,0 +OCC1=CC(C(O)C1O)N2C=CC(=N)NC2=O,0 +O=C1NC(=S)NC(=O)C1C(=O)NC2=CC=CC=C2,0 diff --git a/test/data/multi_cell_call.csv b/test/data/multi_cell_call.csv new file mode 100644 index 0000000..a4f4762 --- /dev/null +++ b/test/data/multi_cell_call.csv @@ -0,0 +1,1067 @@ +SMILES, Rodent carcinogenicity +C12(C(=C(/N=N/C3=C(C4=C(C(=C3)S(=O)(=O)[O-])C=CC=C4)O)C=CC=1S(=O)(=O)[O-])C=CC=C2).[Na+].[Na+], 0 +O=C(C2=CC=CC=C2)S\C(CCOC(C3=CC=CC=C3)=O)=C(C)/N(C=O)CC1=CN=C(C)N=C1N.Cl, 0 +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2, 0 +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2, 1 +BrC(CCl)CBr, 1 +NC(=S)NNC(=S)N, 0 +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC, 0 +[O-][N+](=O)C1=CC=CC(=C1)NC(=O)C2=CC3=CC=CC=C3C(=C2O)/N=N/C4=CC(=CC=C4OC)[N+]([O-])=O, 0 +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr, 1 +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+], 1 +BrCCBr, 1 +ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl, 1 +ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2], 1 +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr, 1 +C(CCCCCCCC)CCCNC(N)=N.CC(=O)O, 0 +CC1=CC=CC=C1, 1 +C1(=CC(=C2C(=C1)N=CC=C2)Br)Br, 0 +C1CCCNCCC1, 0 +O=C(N(CCCC)N=O)NCCCC, 1 +[Na+].C1(=CC=C2C(=C1S([O-])(=O)=O)C=CC=C2)/N=N/C3=C(C=CC4=C3C=CC=C4)O, 0 +CC(=O)O[Sn](OC(=O)C)(CCCC)CCCC, 0 +CC1=CC(C)=C(/N=N/C2=C(C(S([O-])(=O)=O)=CC3=C2C=CC(S([O-])(=O)=O)=C3)O)C=C1C.[Na+].[Na+], 1 +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 +NC1=CC=CC(C)=C1.[H]Cl, 1 +C1=C(Cl)C=C3C(=C1)N(CCO)C(=O)C(O)N=C3C2=CC=CC=C2F, 0 +Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl, 1 +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OCC)OCC, 0 +C1(=CC=C(N)C=C1)C.[H]Cl, 1 +[O-]C1=C(I)C=C(C(C2=C(C([O-])=O)C=CC=C2)=C3C=C(C(C(I)=C3O4)=O)I)C4=C1I.[Na+].[Na+], 0 +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2, 1 +Cl[C@@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl, 1 +CC(C)(O)CC[C@@H](O)[C@@H](C)[C@H]2CC[C@@]1(O)C/3=C/C(=O)[C@@H]4C[C@@H](O)[C@@H](O)C[C@]4(C)[C@H]\3CC[C@@]12C, 1 +Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl, 1 +N12([C@@H]([C@@H](C1=O)NC(COC3=CC=CC=C3)=O)SC([C@@H]2C(=O)[O-])(C)C).[K+], 0 +ClCC/C(C2=CC=CC=C2)=C(C3=CC=CC=C3)/C1=CC=C(C=C1)OCCN(C)C.OC(C(O)=O)(CC(O)=O)CC(O)=O, 0 +[Na+].[O-]S(=O)(=O)c4ccc(c1c3cc(C)c(cc3[o+]c2cc(c(C)cc12)N(CC)CC)N(CC)CC)c(c4)S([O-])(=O)=O, 0 +Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl, 1 +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl, 1 +C1(=C(C=C(N)C=C1)[N+](=O)[O-])NCCO, 0 +ClC(C(Cl)Cl)(Cl)Cl, 1 +O=CC(\Cl)=C(\Cl)C(O)=O, 0 +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC, 1 +C1(C(=CC=C(C=1)NC(C(C)=C)=O)Cl)Cl, 0 +C([O-])(=O)CN(CC(=O)O)CCN(CC([O-])=O)CC([O-])=O.[Na+].[Na+].[Na+].[H]O[H].[H]O[H].[H]O[H], 0 +ClC1(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 0 +OC1=CC(=CC=C1)O, 0 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 +O=C1C2=C(C=CC=C2)C(=O)C(=C1Cl)Cl, 0 +ClC(C(Cl)(Cl)Cl)(Cl)Cl, 1 +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CC(=O)O)C)C)C, 0 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 +O=[N+](C1=CC(=C(C(=C1)Cl)N)Cl)[O-], 0 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 +NC1=C(C=C(C=C1Cl)N)Cl, 1 +OC(=O)C(Cl)Cl, 1 +OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl, 0 +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)C)C)C)C, 1 +ClC#CCl, 1 +C12C(C3C(CC1C3)NC(N(C)C)=O)CCC2, 0 +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N, 1 +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)CCCCCCCCCCCCCCC)C)C)C, 0 +C1N2CN3CN(C2)CN1C3, 0 +BrC(Br)Br, 1 +CCCC/C=N/N(C=O)C, 1 +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45, 0 +N1=C(N=C(N(CO)CO)N=C1N(CO)CO)N(CO)CO, 1 +O=C(OCC)C4=C(C=CC=C4)C(C(C=C(C)C(NCC)=C3)=C3O1)=C(C=C2C)C1=C/C2=N/CC.Cl, 0 +ClC1=C(C=CC=C1)Cl, 0 +FC(C(F)Cl)(OC(F)F)F, 0 +[O-][N+](=O)C1=C(Cl)C(=C(Cl)C(=C1)[N+]([O-])=O)Cl, 0 +CCCCCNN.[H]Cl, 1 +ClC1=CC=C(C=C1)Cl, 1 +CCCCC/C=N/N(C=O)C, 1 +C(C(F)(Cl)Cl)(F)(F)Cl, 0 +O=C(CN=C2C3=CC=CC=C3)NC1=C2N(N=C1C)CC, 1 +ClC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)Cl)N, 1 +ClC(C(=O)O)(Cl)Cl, 1 +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl, 0 +OC(=O)\C=C/C(O)=O.C(C(C1CCCCC1)C2CCCCC2)C3CCCCN3, 0 +FC(F)Cl, 0 +O=S(O)(O)=O.O[C@@H]([C@H](C)NC)[C@@]1=CC=CC=C1.O[C@@H]([C@H](C)NC)[C@@]2=CC=CC=C2, 0 +NC1=C(C=C(C=C1Cl)Cl)Cl, 1 +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl, 1 +CN1CC[C@H]2OC(=O)C3(C[C@@H](C)[C@@](C)(O)C(=O)OC\C(=C\C1)C2=O)O[C@@H]3C, 1 +ClCC1CO1, 1 +O=C(N(CCCCCC)N=O)N, 1 +O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1, 0 +CC(=O)NC1=CC=C(C=C1)OCC, 1 +C([N+](C)(C)C)CCl.[Cl-], 0 +ClC1=CC2=C(C=C1)OC3=C(C=CC(=C3)Cl)O2, 0 +OC1=C(C=CC(=C1)O)CCCCCC, 0 +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O.O=S(O)(O)=O, 0 +CN1N(C2=CC=CC=C2)C(=O)C=C1C, 1 +FC(F)(Cl)Cl, 0 +ClC(CCl)Cl, 1 +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl, 1 +FCCl, 1 +CC(Cl)Cl, 0 +CCC1CO1, 1 +CC(Cl)(Cl)Cl, 0 +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1, 1 +ClC(Cl)Cl, 1 +ClCCCl, 1 +ClC(=CCl)Cl, 1 +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O, 0 +ClCOC, 1 +ClC1=C(C=CC(=C1)Cl)O, 0 +ClC(=CCl)Cl, 1 +C12=C(C(=O)NS1(=O)=O)C=CC=C2, 0 +OC1(=C(O)C(=O)O[C@H]1[C@@H](C[O-])O).[Na+], 0 +C1(C=CC=CN=1)CCl.Cl, 0 +FC(Cl)(Cl)Cl, 0 +O=C(O[C@H](CC)[C@](O)(C)[C@H](O)[C@@H](C)C2=O)[C@H](C)[C@@H](O[C@H]3C[C@](OC)(C)[C@@H](O)[C@H](C)O3)[C@H](C)[C@H]([C@@](O)(C)C[C@H]2C)O[C@H]1[C@H](O)[C@@H]([N@H+](C)C)C[C@@H](C)O1.[O-]C(CCCCCCCCCCCCCCCCC)=O, 0 +C1(=CC=CN=C1)CCl.[H]Cl, 1 +O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl, 1 +C1(CCNC(NC(N)=N)=N)=CC=CC=C1.[H]Cl, 0 +ClC1=C(OC(C)C(O)=O)C=CC(Cl)=C1, 0 +C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2)=NN=C4, 0 +OC1=C(C=C(C=C1Cl)Cl)Cl, 1 +C=CCC1=CC=C2C(=C1)OCO2, 1 +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC, 1 +ClC1=C(C=C(C=C1)Cl)OC(C(=O)O)C, 0 +ClC1=C(C=C(C(=C1)Cl)Cl)OC(C(=O)O)C, 0 +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+], 1 +O=S(=O)(C1=CC=C(C=C1)Cl)OC2=CC=C(C=C2)Cl, 0 +ClC1=C(C=CC(=C1)Cl)OCC(=O)O, 0 +ClCCN(CCCl)C1=CC=C(CC(OC3=CC=C(C4=C3)[C@]2([H])[C@](CC4)([H])[C@@](CC[C@@H]5OC(CC6=CC=C(N(CCCl)CCCl)C=C6)=O)([H])[C@]5(C)CC2)=O)C=C1, 1 +ClC1=C(C=C(C(=C1)Cl)Cl)OCC(=O)O, 0 +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3, 1 +OC1=CC=CC=C1, 0 +O=C(N(C)C)NC1=CC=C(C=C1)Cl, 1 +ClC1=C(C=CC(=C1)Cl)OCC(=O)OCCCC, 0 +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O, 1 +ClC4=C(C=CC=C4)C2=NC(C)C1=NN=C(C)N1C3=C2C=C(CCC5=CC=C(CC(C)C)C=C5)S3, 0 +O=C([C@H](CO)[C@]2=CC=CC=C2)O[C@@H]1C[C@H](N4C)[C@@H](O3)[C@@H]3[C@@H]4C1.Br.O.O.O, 0 +N1C2=C(C=CC=C2)SC3=CC=CC=C13, 0 +C(N)(=O)OC(C#C)(C1C=CC=CC=1)C2C=CC(=CC=2)Cl, 1 +ClC1=CC(=CC=C1OCC(=O)OC(C)C)Cl, 0 +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl, 1 +ClC1=CC(=C(C=C1SC2=CC=C(C=C2)Cl)Cl)Cl, 0 +ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl, 0 +ClCC(Cl)CCl, 1 +ClC([N+](=O)[O-])(Cl)Cl, 0 +ClC1=C(C=CC(=C1)Cl)OS(=O)(=O)C2=CC=CC=C2, 0 +NC(CCSCC)C(=O)O, 1 +S=C=NC1=CC=CC=C1, 0 +C=C(Cl)C=C, 1 +CC(Cl)CCl, 1 +OCCN(CCO)CCO, 1 +O=P(OC=C(Cl)Cl)(OC)OC, 1 +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O, 1 +O=C1N(C2=CC=CC=C2)N=C(C1)C, 0 +ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N, 1 +O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-], 1 +S=C(S[Se](SC(=S)N(C)C)(SC(=S)N(C)C)SC(=S)N(C)C)N(C)C, 0 +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2, 0 +CC1=CC(NC2=C1C=C(C=C2)OCC)(C)C, 0 +NC1(=CC=C(C=C1)NC2=CC=CC=C2).[H]Cl, 0 +O=NN(C)CCCCCCCCCCCC, 1 +S=C(NC1CCCCC1)NC1CCCCC1, 0 +O=C(OCC)C=C, 1 +O=C(C(C)=C2C)C(C(CCCCCC(O)=O)C1=CC=CC=C1)=C(C)C2=O, 0 +[Se]=S, 1 +OC(=O)CCCC\C=C(\c1cccnc1)c2ccccc2, 0 +O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O, 1 +C13CC(C4C3O4)C2C1C5C(O5)C2, 0 +CCO, 1 +CC1=CC(=C(C=C1C)N)C, 1 +NC(=S)NC1=CC=CC=C1, 0 +C[N+](CCC(C1=CC=C(C=C1)Cl)C2=NC=CC=C2)C.C(\C(=C(/C(=O)[O-])[H])[H])(=O)O, 0 +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45, 1 +[O-]\[N+](CC)=N/CC, 1 +C1=C(C(=CC(=C1N)C)C)C.[H]Cl, 1 +OC1=CC2=C(C=C1)OCO2, 1 +OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2, 1 +C1=CC=CC(=C1)CCN(C)N=O, 1 +O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC, 0 +ClC6C4(Cl)C3C1C5C(C3C2OC12)C4(Cl)C(Cl)(Cl)C56Cl, 0 +[O-]\[N+](CC)=N/C, 1 +ClC1=NC(=NC(=N1)NCC)NCC, 0 +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC, 1 +N(CCCCCCCCCCCCCC)(C)N=O, 1 +C(O)(=O)[O-].[Na+], 0 +NC1=CC(=CC=C1)N, 0 +N(CCCCCCCCCC)(C)N=O, 1 +OCC1=C(C(=C(C(=C1)/N=N/C2=C3C=CC=CC3=C(C=C2)S(=O)(=O)[O-])O)/N=N/C4=C5C=CC=CC5=C(C=C4)S(=O)(=O)[O-])O.[Na+].[Na+], 0 +NC1=CC=C(C=C1)N, 0 +CN(C(=O)N)N=O, 1 +C([N+](C)(C)C)CO.[Cl-], 0 +ClC(C(C1=CC=C(C=C1)CC)C2=CC=C(C=C2)CC)Cl, 0 +C1(=C(C=CC=C1N)N).[H]Cl.[H]Cl, 0 +C1N(C(OC1)=O)N=O, 1 +S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC, 0 +C1(SC2=C(C(=CC(=C2)Cl)Cl)[O-])(=C(C(=CC(=C1)Cl)Cl)[O-]).[Na+].[Na+], 0 +O=C(C)CN(N=O)CCO, 1 +CC(=O)[O-].[O-]C(=O)C.[O-]C(=O)C.[Cr+3], 0 +.[Na+].[Cl-], 0 +N(N)(CC)C=O, 1 +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O, 1 +[Na+].[O-]Cl=O, 0 +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl, 1 +CC1(C2=CC=CC=C2)C(O1)C(=O)OCC, 0 +C1(CSCCNC(NC)=NC#N)=C(C)NC=N1, 0 +O=C([O-])C(C(/C(CC([O-])=O)=C([C@@H](CCC([O-])=O)[C@@H]5C)\N=C5/C=C4\[N-]\C(C(C=C)=C4C)=C3)=N2)=C(C)/C2=C/C1=C(CC)C(C)=C/3[N-]1.[Na+].[Na+].[Na+].[Cu+2], 0 +C1(=CC(=CC=C1N)N).[H]Cl.[H]Cl, 0 +N=C(N(CC)N=O)N[N+]([O-])=O, 1 +C1([C@H](CNC)O)(=CC(=CC=C1)O).[H]Cl, 0 +O=C(C(O)(C2=CC=CC=C2)C1CCCCC1)OC(C)(C)C#CCN(CC)CC.O.Cl, 0 +NC(=O)N(CC)N=O, 1 +O=NN(CC=C1)CC1, 1 +O.[Na+].O.O.CCN(CC)C([S-])=S, 0 +S=C(S[Te](SC(=S)N(CC)CC)(SC(=S)N(CC)CC)SC(=S)N(CC)CC)N(CC)CC, 0 +N(CC(F)(F)F)(CC)N=O, 1 +Cl[O-].[Na+], 0 +C1(=CC=CC=C1)CCNN.S(O)(O)(=O)=O, 1 +ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl, 1 +OC(=O)C=CC=CC, 0 +O(C1=CC=CC=C1)CC2CO2, 1 +OCCBr, 1 +CCC1=CC=CC=C1, 1 +C1C(N(C(CN1N=O)C)C)C, 1 +OC(CNC(C)C)C1=CC=C(NS(=O)(C)=O)C=C1.[H]Cl, 0 +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1, 1 +C(CO)O, 0 +N(CC(CO)O)(CC=C)N=O, 1 +[O-]C12[C@@H](CC[N+](C)1CC=C2COC([C@](OC(C)=O)(C)[C@@H](C)\C=C3C=C)=O)OC/3=O, 1 +S=C(NCC)NCC, 1 +N(CC(C)O)(CC=C)N=O, 1 +NNC1=CC=CC=C1.[H]Cl, 1 +C=CC=C, 1 +NC(CCCN)(C(=O)O)C(F)F, 0 +C1CN1, 1 +N(CC(C)=O)(CC=C)N=O, 1 +CC(CC1=CC=CC=C1)NN.[H]Cl, 0 +CC(C)(C)O, 1 +CC(OC1=CC=C(C=C1)Cl)(C(=O)OCC)C, 1 +O=CNNC=O, 1 +N(CC=C)(CCO)N=O, 1 +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC, 1 +O=C1N2CC3=CC=CC=C3C(=O)N2CC4C=CC=CC1=4, 1 +O=C(N(CCCCC)N=O)OCC, 1 +O=[C@](O[C@H](O[C@H](CO)[C@H]1O)[C@H](O)[C@H]1O)[C@@]5(C)[C@](CC3)([H])[C@](CCC5)(C)[C@@](CC4)([H])[C@@](C2)3C[C@]4(O[C@H]6[C@H](O[C@H]7[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O7)[C@@H](O)[C@H](O)[C@@H](CO)O6)[C@@]2=C, 0 +CCCCCl, 0 +OCCN.O=C(C1=C(C=CC(=C1)Cl)O)NC2=CC=C(C=C2Cl)[N+](=O)[O-], 0 +N(N1CCCCC1C2=CC=CN=C2)=O, 1 +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O, 1 +CC(=O)O[Hg]C1=CC=CC=C1, 0 +OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-], 0 +O=S([N-]C1=O)(OC(C)=C1)=O.[K+], 0 +Cl[C@@]1(C(C)2C)C(Cl)(Cl)C(Cl)([C@](Cl)(C2=C)C1Cl)Cl, 1 +C1=C(C=CC=C1OCC2CO2)OCC3CO3, 1 +N(N)(CCCC)C=O, 1 +C=CC1=CC=CC=C1, 1 +OC1=CC=C(C=C1)C2=CC=CC=C2, 0 +C(C1=CC=C(C=C1)O)(=O)OCCCC, 0 +[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2, 1 +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O, 1 +O=NN(CC(C)O)CC(C)O, 1 +N#[N+]C1=CC=CC=C1.O=S([O-])(O)=O, 1 +C1C(C2=CC=CC=C2)O1, 1 +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl, 1 +O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4, 0 +O=NN(CC(=O)C)CC(=O)C, 1 +O=C1OC(=O)CC1, 0 +O=C1OC2=C(C=CC=C2)CC1, 1 +N(N(CC(F)(F)F)CC(F)(F)F)=O, 0 +CCCCOCCO, 1 +N(CCCCO)(CCCC)N=O, 1 +O[C@H]1[C@H](O[C@H](CO)[C@@H](O)[C@@H]1O)O[C@]2(CO)O[C@H](CO)[C@@H](O)[C@@H]2O, 0 +OC1=CC(C2=NC(N(C(C)C)C3=C2C=CC(C)=C3)=O)=CC=C1, 0 +CCCC1=CC2=C(C=C1)OCO2, 1 +O=NN(C)C2=NC1=CC=C(Cl)C=C1C(C3=CC=CC=C3)=[N+]([O-])C2, 0 +OC1=C(C=C(C=C1C(C)(C)C)CO)C(C)(C)C, 0 +S=C(N(CC)CC)SCC(=C)Cl, 1 +P, 0 +O=NN(/C(=N\C#N)NCCSCC1=C(N=CN1)C)C, 0 +C[C@@H]3O[C@]1(CS3)C2CCN(CC2)C1.C[C@@H]6O[C@]4(CS6)C5CCN(CC5)C4.O.Cl.Cl, 0 +NC(=O)C1=C(C=CC=C1)C(=O)N, 0 +C1(=C(C=CC(=C1)[C@H](CN[C@@H](CCC2=CC=CC=C2)C)O)O)C(N)=O.[H]Cl, 0 +O=NN(CCCC)CCCC, 1 +CC(=C)CCl, 1 +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Cu+2], 0 +O=C1C2=C(C=CC=C2)C(=O)O1, 0 +O=NN(CCO)CCO, 1 +C=C(Cl)C=C, 0 +O=C(N(CCCC)N=O)N, 1 +N1=CC=CC2=CC=CC(=C12)O[Cu]OC3=CC=CC4=CC=CN=C34, 0 +O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C, 1 +S=P(SCC(=O)NC)(OC)OC, 0 +CCN(CC)N=O, 1 +CC(=O)NN, 1 +CC1=C(Cl)C(=O)OC2=C1C=CC(=C2)OP(=S)(OCC)OCC, 0 +CN(N=O)C, 1 +OC(=O)CCl, 0 +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C, 1 +O=C1OC2=C(C=CC=C2)C=C1, 1 +C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2, 0 +ClC1=C(Cl)N=C(C(O)=O)C(Cl)=C1N, 0 +NN(CCCC)CCCC, 1 +COC1=CC(=C(C=C1)N)C, 1 +[O-]S(S(=O)[O-])(=O)=O.[K+].[K+], 0 +OC(CN(C1=CC=C(N=N1)NN)C)C.Cl.Cl, 0 +O=C/C=C/C1=CC=CC=C1, 0 +O[As](O)(C)=O, 0 +CC1CC(OC(O1)C)OC(=O)C, 1 +Cl.CCCCNN, 1 +O=S1(=O)CC=CC1, 0 +c1(n(cnc1)C)C[C@@H]2[C@@H](C(=O)OC2)CC, 0 +[Na+].[O-]C(=O)[C@@H](N)CC(O)=O, 0 +CC1CC(OC(O1)C)OC(=O)C, 0 +N(NCCCC)CCCC.Cl.Cl, 1 +O=NN(C1=CC=CC=C1)C2=CC=CC=C2, 1 +C\1=C/C(O[C@@H](C/C=C/C=C/C=C/C=C/[C@@H](C[C@@H]3O[C@](C[C@H](C[C@H]2O[C@H]/12)O)(C[C@@H]([C@H]3C(O)=O)O)O)O[C@@H]4O[C@@H]([C@H]([C@@H]([C@@H]4O)N)O)C)C)=O, 0 +NC1=CC(=CC=C1OC)C, 1 +NC1=CC=C(/C=C/C2=CC(OC)=CC=C2OC)C=C1, 1 +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2, 1 +OC(=O)CCC(=O)OCC2(CCCC)C(=O)N(c1ccccc1)N(C2=O)c3ccccc3, 0 +C1CNCCN1, 0 +O=C(NC2=C(Cl)C=NC=C2Cl)C1=CC(OC3CCCC3)=C(OC)C=C1, 1 +C1(=CC(=CC=C1N)OC)OC.[H]Cl, 0 +O=NN(CCC)CCC, 1 +CC(C)C(O)(C(C)O)C(=O)OC\C1=C\CN2CC[C@@H](OC(=O)C(\C)=C\C)[C@@H]12, 1 +C1CCNCC1, 0 +[Na+].O=C([O-])[C@@H](N)CCC(O)=O, 0 +CC(C)(C)c1cc(O)ccc1O, 0 +[N+].C1(N(N=O)[O-])=CC=CC=C1, 1 +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O, 1 +O=C3[C@@]2(C)CC[C@]1([H])[C@](CC[C@H](OS(=O)(O)=O)C4)(C)C4=CC[C@]([H])1[C@@]([H])2CC3, 0 +CC(C)CC(=O)O[C@H]1C[C@]2(COC(C)=O)[C@@]4(C)[C@H](OC(C)=O)[C@@H](O)[C@@H](O[C@@H]2/C=C1/C)[C@]34CO3, 1 +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2, 1 +C(CCC(=O)O)([O-])=O.[Na+], 0 +[Ca+2].[N-2]C#N, 0 +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl, 1 +O=NN(CCCCCC1)CCCCCC1, 1 +ClC(=C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC, 0 +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2, 0 +NC(=O)NCCCC, 0 +NC(=N)NC#N, 0 +C1=CC=CC=C1C(O)C(N(C)N=O)C, 1 +S(=O)(=O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2, 0 +O=[N+]([O-])C3=CC=C(O3)/C=N/N1C(O[C@@H](CN2CCOCC2)C1)=O.Cl, 1 +C1(NS(=O)(=O)[O-])CCCCC1.[Na+], 1 +CN(CC)N=O, 1 +CCN(CC)C(=O)C1=CC=CC(C)=C1, 0 +Cl.CC3CCCC(C)N3CCCC(O)(c1ccccc1)c2ccccn2, 0 +O=C1CCCO1, 0 +O=C(N(CC)N=O)OCC, 1 +[Cd+2].[O-]C(C)=O.[O-]C(C)=O, 0 +N=C\2/N=C3/O[C@H]1[C@H](O)[C@@H](CO)O[C@H]1N3/C=C/2, 0 +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C, 1 +[Cl-].[Cd+2].[Cl-], 1 +O[C@@H]8[C@@H](O)[C@@H]1O[C@H](CO)[C@H]8O[C@H]7O[C@H](CO)[C@@H](O[C@H]6O[C@H](CO)[C@@H](O[C@H]5O[C@H](CO)[C@@H](O[C@H]4O[C@H](CO)[C@@H](O[C@H]3O[C@H](CO)[C@@H](O[C@H]2O[C@H](CO)[C@@H](O1)[C@H](O)[C@H]2O)[C@H](O)[C@H]3O)[C@H](O)[C@H]4O)[C@H](O)[C@H]5O)[C, 0 +O=NN1CCCCCCC1, 1 +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC, 1 +[Cd+2].[Cl-].[Cl-].[H]O[H], 0 +O=C1CCCCC1, 0 +O(CC1(C)C)C1=O, 1 +C1=C2C(=CC=C1)C=CC=C2, 1 +O=C(C)NCCSP(=S)(OC)OC, 0 +N(C([S-])=S)(CC)CC.[S-]C(N(CC)CC)=S.[Cd+2], 0 +NC(=O)CC1=C2C(=CC=C1)C=CC=C2, 0 +O=S(=O)([O-])[O-].[Cd+2], 1 +O=NN1CCCCCC1, 1 +N1=C(SNC2CCCCC2)SC3=C1C=CC=C3, 0 +C1(NC(CN1N=O)=O)=O, 1 +OC(=O)CC1=C2C(=CC=C1)C=CC=C2, 0 +C1(CCCCC1)N.[H]Cl, 0 +O=P(H)(OC)OC, 1 +O=[C@]([C@@H]1C[C@@H](O)CN1N=O)O, 0 +[Cd+2].[Cd+2].[Cd+2].[O-]S(=O)(=O)[O-].[O-]S([O-])(=O)=O.[O-]S([O-])(=O)=O.O.O.O.O.O.O.O.O, 0 +C1(CCCCC1[N+]).O=S(=O)([O-])O, 0 +N(N(CC(O)=O)CC(O)=O)=O, 0 +O=C1c2c(O)cc(C)cc2C(=O)c3cc(O)cc(O)c13, 0 +NC1=C2C(=CC=C1)C(=CC=C2)N, 1 +OC1=C(C=CC(=C1)/C=C/C(=O)O)O, 1 +P(=O)(OC)(OC)N1CCOCC1, 1 +N(CC(CO)O)(C)N=O, 1 +C1=C(CO)OC=C1, 1 +C12C(=CC=CC=1NCCN)C=CC=C2.[H]Cl.[H]Cl, 0 +C(O)(=O)[O-].[K+], 1 +O=C1C2=C(N=CN2C)N(C(=O)N1C)C, 0 +ClCCN(CCCl)[P]1(=O)NCCCO1, 1 +C1(=CC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)C)C, 1 +CN(CCO)N=O, 1 +O=CCCCC=O, 0 +C1=C2C(=CC=C1NC3=CC=C(C=C3)NC4=CC=C5C(=C4)C=CC=C5)C=CC=C2, 0 +.[K+].[Cl-], 0 +C[C@H](C\C=C\C)[C@@H](O)[C@@H]1N(C)C(=O)[C@H](C(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](NC(=O)[C@H](CC(C)C)N(C)C(=O)CN(C)C(=O)[C@H](CC)NC1=O)C(C)C, 0 +N(N(CCCO)C)=O, 1 +NC(=S)NC1=C2C(=CC=C1)C=CC=C2, 0 +CC(C)NCC(O)COc1ccc(cc1)NC(C)=O, 0 +O=[As](O)(O)[O-].[Na+], 0 +O=C1[C@H]3[C@H](C3)[C@@]([C@]4([H])[C@@]([C@@]5([H])[C@]([C@@](CC5)(OC(C)=O)[C@@](C)=O)(C)CC4)([H])C=C2Cl)(C)C2=C1, 1 +O=C(C1=CC=C(C=C1)C(=O)OC)OC, 0 +CC(O)CN(C)N=O, 1 +[As]21O[As]3O[As](O1)O[As](O2)O3, 0 +O=C(O)[C@H](CS)N.Cl, 0 +CN(C)C(C)=O, 0 +CN(CC(C)=O)N=O, 1 +[Na+].[As](=O)[O-], 0 +C(C(C)O)(O[Ca]OC(C(C)O)=O)=O, 0 +O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+], 1 +O=NN(C)CCOS(C1=CC=C(C)C=C1)(=O)=O, 1 +NC1=CC2=C(C=CC=C2)C=C1, 1 +O.O=C(Nc3cccc1c3O/C(=C\C1=O)C2=N\N\N=N2)c5ccc(OCCCCc4ccccc4)cc5.O=C(Nc3cccc1c3O/C(=C\C1=O)/C=2N\N=N/N=2)c5ccc(OCCCCc4ccccc4)cc5, 0 +O=C(N)C1=C(N=CN1)/N=N/N(C)C, 1 +C1(=C2C(=CC=C1N)C=CC=C2)S(=O)(O)=O, 0 +O=C1N(C2=CC=C(C=C2C(=NC1)C3=CC=CC=C3)Cl)CC4CC4, 0 +OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO, 0 +O=C(CN1C(=O)CCC1)NC2=C(C=CC=C2C)C, 0 +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4, 0 +O=C([C@H](CC1=CC=CC=C1)NC(=O)[C@H](CC(=O)O)N)OC, 0 +CC(OC(=O)OC1CCCCC1)OC(=O)c5cccc6nc(OCC)n(Cc2ccc(cc2)c3ccccc3C\4=N\N=N/N/4)c56, 0 +[Ni], 0 +O=C(CCC(=O)O)NN(C)C, 1 +OC(=O)C1=C(C=CC=C1)OC(=O)C, 0 +C([O-])(C)=O.[O-]C(C)=O.[Ni+2], 0 +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N, 1 +OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)/C=C\[C@]1(C)[C@H]4C(=O)C[C@@]23C, 0 +CN(C1=CC=CC=C1)N=O, 1 +O=C1CCCCCN1, 0 +ClC(C(C1=C(C=CC=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 0 +C1=CC=C(C(C(=O)OC)C2N(N=O)CCCC2)C=C1, 0 +S=C(N(CCCC)CCCC)S[Ni]SC(=S)N(CCCC)CCCC, 0 +OC1=C(C=C(C=C1)CNC(=O)CCCC/C=C/C(C)C)OC, 1 +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 1 +CC1=CC=CC=C1OCC(O)CNCCN2/C=C(/C)C(=O)NC2=O.[H]Cl, 0 +CN(CCCCCCCCCCC)N=O, 1 +O=S(=O)([O-])[O-].O.O.O.O.O.O.[Ni+2], 0 +C1=CC=C5C(=C1)N(CC2=CC=C(F)C=C2)C(NC4CCN(CCC3=CC=C(OC)C=C3)CC4)=N5, 0 +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2, 1 +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 1 +O=NN1CCOCC1, 1 +NC(=O)C1=CC=CN=C1, 0 +CC(C)NCC(O)COC1(=CC=C(C=C1)CC(=O)N).[H]Cl, 0 +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl, 1 +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl, 1 +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O, 1 +ClC1=NC(=NC(=N1)NC(C)C)NCC, 1 +C(NN)(N)=O.Cl, 1 +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br, 1 +O=NN(CCC1)C(C1)C(=O)O, 0 +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1, 0 +O=C(O[C@@H]2C[C@@H](CC3)N(C)[C@H]3C2)C(CO)C1=CC=CC=C1, 0 +NC(=O)NNC1=CC=CC=C1, 1 +O=NN(CCN1)CC1, 1 +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1.Cl, 0 +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl, 1 +O[As](=O)(C1=CC=C(C=C1)NC(=O)N)O, 0 +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl, 1 +NC(N3C)=NC2=C3C(C)=CC1=NC=CC=C12, 1 +OC(=O)C1=CC=CN=C1, 0 +CC(=O)O[C@H]1[C@@H]([C@H](O[C@H]([C@@H]1OC(=O)C)COC(=O)C)S[Au]=P(CC)(CC)CC)OC(=O)C, 0 +O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3, 1 +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N, 1 +O=C(C1=CC=CN=C1)NN, 1 +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O, 1 +C12C3=C(C=CC=C3)NC1=CC=CC=2, 1 +N1(C2C(SC3=C1C=CC=C3)=CC=CC=2)CC(N(C)C)C.[H]Cl, 0 +O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C, 0 +O=NN1CCCCC1, 1 +C1=CC=C2C(=C1)C=C(C=C2)C(CNC(C)C)O, 0 +OC(C(C=CC=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=C(C)S3)=O, 0 +CC(=O)O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3, 1 +O=NN1CCC[C@H]1[C@@](O)=O, 0 +C12=C(C=CC(=C1)C(CNC(C)C)O)C=CC=C2.[H]Cl, 0 +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O, 1 +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O, 1 +Br/C(Br)=C/[C@H]3[C@@H](C(=O)O[C@H](C#N)c2cccc(Oc1ccccc1)c2)C3(C)C, 0 +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O, 1 +O=NN1CCCC1, 1 +O=S1(=O)CCCO1, 1 +OC(CC(C1)C)C(C1)C(C)C, 0 +O=[N+]([O-])[O-].[Na+], 0 +ClC(Cl)(Cl)Cl, 1 +CC1SC(SC(N1N=O)C)C, 1 +ClC1=NC(=NC(=N1)NC(C)C)NC(C)C, 0 +N(C(=O)N)(N=O)CC(=O)O, 1 +O=NN1CCSCC1, 1 +O=C1CCO1, 1 +[O-][N+](C1=CC=CC(C2C(C(OC3CN(C(C5=CC=CC=C5)C4=CC=CC=C4)C3)=O)=C(NC(C)=C2C(OC(C)C)=O)N)=C1)=O, 0 +BrC(C(=O)NC(=O)N)(CC)CC, 0 +CC1=C(C=CC=C1)N=O, 1 +OC(COC1=CC=CC2=C1C=CC=C2)CNC(C)C.[H]Cl, 0 +SC1=NC2=C(C=CC=C2)S1, 1 +OC(=O)CN(CC(=O)O)CC(=O)O, 1 +[Na+].[N-]=[N+]=[N-], 0 +CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C, 0 +N#[N+][O-], 0 +O=C(N(CCCC)CC)SCCC, 0 +[S-]C1=NC(C=CC=C2)=C2S1.[S-]C3=NC(C=CC=C4)=C4S3.[Zn+2], 0 +O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC, 0 +C1(/N=N/C2=CC=CC=C2)=CC=CC=C1, 1 +N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O, 1 +C[N+](=NC)[O-], 1 +O=C1C[C@H](C\C=C1\C)C(C)=C, 0 +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1, 0 +O=N[O-].[Na+], 1 +[N+](=N/CCC)(/CCC)[O-], 1 +OC1=C(C=CC=C1)O, 1 +CC(N(C1=CC=CC2=C1CC3=C2C=CC=C3)C(C)=O)=O, 1 +S=C1NC=NC2=C1N=CN2, 0 +O=[N+](C1=CC(=C(C=C1)OC)N)[O-], 1 +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2, 1 +C1(=C(C=CC(=C1)NC(N(CC)CC)=O)OCC(CNC(C)(C)C)O)C(C)=O, 0 +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-], 1 +CC(=O)NNC(=O)C, 0 +COc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C)c4cc3, 0 +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O, 1 +[O-][N+](C3=CC=C(O3)C1=CN=C2N1C=CC=C2)=O, 1 +O=C(C1=C(C=CC=C1)C(=O)OCC=C)OCC=C, 0 +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl, 0 +CN(C)CCN(CC1=CC=CO1)C2=CC=CC=N2, 0 +N(N)(CC=C)CC=C, 1 +CC(=O)[O-].[O-]C(=O)C.[Ba+2], 0 +N(NCC=C)CC=C.[H]Cl.[H]Cl, 1 +CN(C)CCN(CC1=CC=CS1)C2=CC=CC=C2, 0 +O=C(C)NCC1=NC(=NO1)C2=CC=C(O2)[N+]([O-])=O, 1 +[Cl-].[Ba+2].[Cl-].O.O, 0 +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl, 1 +C=CCN(CC=C)N=O, 1 +C(C\C=C/CCCCCCCC)CCCCCC(=O)[O-].[Na+], 0 +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl, 1 +NC2=NC(C3=CC=CC=C3)=C(CCOCC)C1=NC=NN12, 1 +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O, 1 +NC1C=CC2=C(N=1)NC3=CC=CC=C23, 1 +O=C(C1=CC(=CC=C1O)/N=N/C2=CC=C(C=C2)C(=O)O)O, 0 +C1(=C(/C=C/C2=C(S(=O)(=O)[O-])C=C(C=C2)N)C=CC(=C1)N)S(=O)(=O)[O-].[Na+].[Na+], 0 +CC1=C(SSC1=S)C2=CN=CC=N2, 0 +[O-][N+](C2=CC=C(O2)C1=CSC=N1)=O, 1 +CC=O, 1 +O=CC1=CC=CC=C1, 1 +O=C1C(=C(C(=O)C(=C1Cl)Cl)Cl)Cl, 0 +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O, 1 +N/1C(N(\C=C\1)C)=S, 1 +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O, 1 +CC=NN(C)C=O, 1 +C1=CC=CC=C1, 1 +ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12, 1 +NC1=CC=C(C=C1)/N=N/C2=CC=C(C=C2)N, 0 +NC(C(=O)O)CCSC, 0 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O, 1 +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O, 1 +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C, 0 +CC(=O)N, 1 +NC1=CC=C(C2=CC=C(N)C=C2)C=C1, 1 +O=S(C1=NC2=C(C=CC(=C2)OC)N1)CC3=C(C(=C(C=N3)C)OC)C, 1 +NC2=CC=C(C(OC)=C2)\N=N/C1=CC=CC=C1, 0 +C1(=CC=C(C=C1)O)NC(C)=O, 1 +C1(C2=CC=C(C=C2)N)=CC=C(C=C1)N.[H]Cl.[H]Cl, 1 +O[As](=O)(C1=CC(=C(C=C1)O)[N+](=O)[O-])O, 0 +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2, 0 +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5, 1 +C12(=C(C=C(C=C1C=CC(=C2/N=N/C3=CC=CC=C3)O)S(=O)(=O)[O-])S(=O)(=O)[O-]).[Na+].[Na+], 0 +NC1=C(C=C2C3=C(C=CC=C3)OC2=C1)OC, 1 +O=[N+](C1=CC(=C(C=C1)N)N)[O-], 0 +O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].Cl[O-].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+], 0 +CC#N, 0 +ClC(C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)(Cl)Cl, 0 +O=[N+](C1=CC(=C(C=C1)C)N)[O-], 1 +C1(=CC=CC=C1)C(=O)[O-].[Na+], 0 +C1=COC2=C1C=CC=C2, 1 +ClCl, 0 +O=C(C(=NOC(=O)NC)SC)N(C)C, 0 +COC1=CC=C(C=C1)O, 1 +NC1=NC(=NC(=N1)N)C2=CC=CC=C2, 0 +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3, 1 +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-], 1 +C1=CC=C(C(OC)C(=O)O)C=C1, 0 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)Cl, 1 +O=C(C)NC3=CC=C(C2=C3)C1=C(C2=O)C=CC=C1, 1 +O=[N+](C1=CC=C(C=C1)N)[O-], 0 +N(NC(C)=O)C1=CC=C(C=C1)CO, 1 +C1=CC=CC(=C1)C(C(C2=CC=CC=C2)=O)O, 0 +O=C1OC(O)C(C(Cl)Cl)=C1Cl, 1 +N(NC(C)=O)C(C1=CC=NC=C1)=O, 1 +O=C1C=CC(=O)C=C1, 1 +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2, 1 +COC1=C(C=CC=C1)[N+](=O)[O-], 1 +O=C1C(C(=O)OC(=C1)C)C(=O)C, 0 +N1=C(SSC2=NC3=C(C=CC=C3)S2)SC4=C1C=CC=C4, 0 +ClC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-], 0 +[O-]\[N+](C)=N/CC, 1 +O=[N+](C1=CC(=C(C=C1)C(=O)O)N)[O-], 0 +C1(NNC(C)=O)=CC=CC=C1, 1 +N1C2=C(C=CC=C2)N=N1, 0 +CC(=C)CCl, 1 +O=C(N(CC(C)=O)N=O)NCCCl, 1 +N[C@@H](C\C1=C\N=C/N1)C(O)=O.Cl, 0 +CBr, 0 +O=[N+](C1=CC=CC=C1)[O-], 1 +ClC(C1=CC=CC=C1)(Cl)Cl, 1 +N(C(=O)N)(N=O)CC(C)=O, 1 +CC(OC)(C)C, 1 +O=[N+](C1=CC2=C(C=C1)NC=N2)[O-], 1 +O=C(C1=CC=CC=C1)NN, 1 +NN, 1 +NC(=O)OC, 1 +ClC1=C(C=CC=C1)[N+](=O)[O-], 1 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O, 1 +OC(CNC(C)C)COC1=CC=CC=C1OCC=C.Cl, 0 +OS(=O)(=O)O.NN, 1 +O=C(NN)OC, 0 +O=[N+](C1=CC=C(C=C1)Cl)[O-], 1 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N, 1 +C1(N=C(SC=1)NN)C2=CC=C(C=C2)N, 1 +O=C(C(C)(OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl)C)OC, 1 +Cl.O=P1(OCC(C)(C)CO1)C\4=C(/C)NC(/C)=C(/C(=O)OCCN(Cc2ccccc2)c3ccccc3)C/4c5cccc(c5)[N+]([O-])=O.CCO, 0 +NC1=C(C=CC(=C1)N)Cl, 1 +S=C(N1CCOCC1)SN1CCOCC1, 1 +NNC1=NC(=CS1)C2=CC=C(O2)[N+]([O-])=O, 1 +[K+].C1(=CC=C2C(=N1)N(C=C(C2=O)C([O-])=O)C)/C=C/C3=CC=C(O3)[N+]([O-])=O, 1 +O=[N+](CC)[O-], 0 +CC(=O)OCC1=CC=CC=C1, 1 +NC1=C(C=CC(=C1)Cl)N, 1 +N1=C(SC2=C1C=CC=C2)SN3CCOCC3, 0 +NNC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1, 1 +OCC1=CC=CC=C1, 0 +Nc1cc(Cl)c(N)cc1.OS(O)(=O)=O, 0 +O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.Cl, 0 +O=C(O)Cc1ccc(cc1)NC(C)=O, 0 +ClCC1=CC=CC=C1, 1 +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-], 1 +ClC1=C(C=CC(=C1)N)C, 0 +O=C(OC)C1=C(C)NC(C)=C(C(OCC(C)(C)CN(CC3=CC=CC=C3)C)=O)C1C2=CC([N+]([O-])=O)=CC=C2F.Cl, 0 +[O-][N+](=O)c1ccc2c3ccccc3Cc2c1, 1 +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-], 1 +NC1=CC(=CC=C1C)Cl, 1 +CN(N)C=O, 1 +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-], 1 +C1(=CC=C(NN)C=C1)C(O)=O.[H]Cl, 1 +C=CC=O, 0 +C1(=C(C=CC(=C1)Cl)N)C.[H]Cl, 1 +O=C(C3)C(C(O)=CC(O[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]5[C@H](O)[C@H](O)[C@@H](O)[C@H](C)O5)O4)=C2)=C2O[C@@H]3[C@@]1=CC(OC)=C(OC)C=C1, 0 +[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O, 1 +C=CC(OCC)OCC, 0 +C(CCl)(F)(F)F, 1 +N(C1=CC=CC=C1)NC2=CC=CC=C2, 1 +C=C/C=N/O, 0 +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O, 1 +NC(=O)Cc2c([O-])on[n+]2Cc1ccccc1, 1 +ClC(Cl)C(F)(F)F, 1 +O=C(C(=C)C)OC, 0 +NC(=O)C=C, 1 +[Be+2].O=S(=O)([O-])[O-], 0 +O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1, 0 +CS(=O)(=O)OC, 1 +[O-][N+](C)=O, 1 +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C, 1 +OC(=O)C=C, 0 +OCC(=O)[C@@]2(O)CC[C@H]3[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4[C@@H](O)C[C@]23C, 0 +N=C(N(N=O)C)N[N+](=O)[O-], 1 +O=[N+](C1=C2C(=CC=C1)C=CC=C2)[O-], 0 +ClC1=NC(SCC(NCCO)=O)=NC(NC2=CC=CC(C)=C2C)=C1, 1 +C=CC#N, 1 +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-], 1 +O=C(OCC2=CC=CC(C3=CC=CC=C3)=C2C)C1C(C)(C)C1/C=C(Cl)/C(F)(F)F, 0 +OC1=CC=C(C=C1)O, 1 +C1=C(C=CC=C1)C2=CC=CC=C2, 0 +O=C(C1=CC=CC=C1)CCl, 0 +OC1=CC=C(C=C1)OCC2=CC=CC=C2, 0 +OC(=O)C(C)(C)CCCOc1ccc(OCCCC(C)(C)C(O)=O)c(c1)c2ccccc2, 1 +ClCC(=O)C1=CC=C(NC(=O)C)C=C1, 0 +O=[N+](CCC)[O-], 0 +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C, 1 +NC1=CC=C(C=C1)Cl, 0 +CC([N+](=O)[O-])C, 0 +NC(=O)CCCCC(=O)N, 0 +OCC(CO)(CBr)CBr, 1 +C1(=CC=C(Cl)C=C1)N.[H]Cl, 1 +C(C1C=CC=CC=1)(=O)N(N=O)C, 1 +OC(=O)CC[N+](=O)[O-], 0 +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2, 1 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1, 1 +C1C(CC(CC1(OOC(C)(C)C)OOC(C)(C)C)(C)C)C, 0 +ClC1=CC=CC=C1C=C(C#N)C#N, 0 +C1(=CC(=CC(=C1N)C)C)C.[H]Cl, 1 +CN(N=O)C(=O)NCCC[C@H](N)C(O)=O, 1 +O=[N+](C1=CC=C2C3=C4C(=CC=C13)C=CC=C4C=C2)[O-], 1 +CCCC[Sn](O[Sn](CCCC)(CCCC)CCCC)(CCCC)CCCC, 0 +O=[N+](C1=CC2=CC=CN=C2C=C1)[O-], 0 +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC, 1 +CC(CCl)OC(C)CCl, 1 +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC, 1 +O=[N+](C1=CC=CC2=CC=CN=C12)[O-], 1 +O=C1C2=C(C=CC=C2C(=O)C3=C1C=CC=C3)O, 1 +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OC)OC, 0 +N(CCCC(F)(F)F)(CCCC(F)(F)F)N=O, 1 +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl, 0 +CC(C1=C(C(=C(C(=C1[N+](=O)[O-])C)[N+](=O)[O-])C)[N+](=O)[O-])(C)C, 1 +O=C1N(CCC1)C, 1 +N1C(N(CC(C1=O)C)N=O)=O, 0 +CC(C=NOC(=O)NC)(SC)C, 0 +[O-][N+](C1=CC([N+]([O-])=O)=CC([N+]([O-])=O)=C1)=O, 0 +CNC1=NC=NC2=C1N=CN2, 0 +O=NN1CCC(=O)NC1=O, 1 +O=C(N(CCO)N=O)NCC, 1 +O=[N+](OC(CO[N+](=O)[O-])CO[N+](=O)[O-])[O-], 1 +O[C@H]([C@@H]2O)[C@@H](O[C@@H]2CO)N1C(N=CN=C3NC)=C3N=C1, 0 +O=C(N(CCO)N=O)N, 1 +CC(=O)O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3, 0 +O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3, 0 +ClCOCCl, 1 +N(CC(CO)O)(CC(O)C)N=O, 1 +O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.[Mg+2], 1 +N(CC(CO)O)(CC(C)=O)N=O, 1 +O=C1C(NC(=O)N1)NC(=O)N, 0 +CC(C/C=N/N(C=O)C)C, 1 +O=C(N(CCCO)N=O)N, 1 +CC3=CC=C(C=C3)\C(C2=CC=CC=N2)=C/CN1CCCC1.O.Cl, 0 +C=CCO, 0 +C1=CC=C2C(=C1)N=C(N=C2N(CCO)CCO)C3=CC=C(S3)[N+]([O-])=O, 1 +OC1=C(C=CC(=C1)C)O, 1 +O=P(OCCCl)(OCCCl)OCCCl, 1 +C=CCCl, 0 +OC1=CC=CC2=CC=CN=C12, 0 +O=C(N(CCO)N=O)NCCCl, 1 +OC(C=C)C1=CC=C2OCOC2=C1, 1 +Oc1ccc(C[C@](C)(N)C(O)=O)cc1O.OC(=O)[C@@](C)(N)Cc1cc(O)c(O)cc1.O.O.O, 0 +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br, 1 +C1CO1, 1 +C1(=C(C=CC(=C1)CCNC)OC(C(C)C)=O)OC(C(C)C)=O.[H]Cl, 0 +O=C(N(CC(C)O)N=O)NCCCl, 1 +O=C(CC(C)C)OCC=C, 1 +S=C1NCCN1, 1 +C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1, 1 +ClC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N, 1 +N(CC(C)O)(CCO)N=O, 1 +NC(=O)N(CC=C)N=O, 1 +O=C1NCCN1, 0 +FC(F)(F)CNC(=N)Nc1ccn(CCCCC(N)=O)n1, 1 +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O, 1 +[Na+].[Na+].S=C(NCCNC(=S)[S-])[S-], 0 +CS(=O)(=O)OCCCNCCCOS(C)(=O)=O.[H]Cl, 0 +CC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)C)N, 1 +S=C(N(C)C)S[Bi](SC(=S)N(C)C)SC(=S)N(C)C, 0 +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O, 1 +N(CC(=O)[O-])CC(=O)O.[Na+], 0 +ClCCl, 1 +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1, 1 +C=CCNN.HCl, 1 +C(C1C=CC(=CC=1)O)(C2=CC=C(C=C2)O)(C)C, 0 +O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2, 0 +CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC, 1 +OC(=O)CC1=CNC2=C1C=CC=C2, 0 +O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+], 0 +C12C(=C(C=CC=1NC(C)=O)S(=O)(=O)[O-])C=C(C(=C2O)/N=N/C3=C4C(=C(C=C3)/N=N\C5=CC=C(C=C5)S(=O)(=O)[O-])C=CC(=C4)S(=O)(=O)[O-])S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+], 0 +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC, 1 +O=C(NC2=C1C=C(C3=NNC(CC3)=O)C=C2)C1(C)C, 1 +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N, 1 +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+], 1 +OC1=C(C=C(C=C1C(C)(C)C)C)CC2=CC(=CC(=C2O)C(C)(C)C)C, 0 +O=S(C1=C(/N=N/C2=CC=C(C3=CC=C(\N=N/C4=C(S(=O)([O-])=O)C=C5C(C(N)=CC(S(=O)([O-])=O)=C5)=C4O)C=C3)C=C2)C(O)=C(C(N)=CC(S(=O)([O-])=O)=C6)C6=C1)([O-])=O.[Na+].[Na+].[Na+].[Na+], 1 +O=[W](=O)([O-])[O-].[Na+].[Na+], 0 +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl, 1 +CCNN.[H]Cl, 1 +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl, 1 +C12C(=CC(=C(C=1O)/N=N/C3=C(C=C(C=C3)C4=CC(=C(C=C4)/N=N/C5=C(C=C6C(=C5O)C(=CC(=C6)S(=O)(=O)[O-])N)S(=O)(=O)[O-])OC)OC)S(=O)(=O)[O-])C=C(C=C2N)S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+], 1 +O=C(N(CC)N=O)NCCO, 1 +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+], 1 +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1, 1 +O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N, 1 +O=C(O[C@H](CC)C(/C=C(C)/C=C/C4=O)CO[C@H](O[C@H](C)[C@H]2O)[C@H](OC)[C@@H]2OC)C[C@@H](O)[C@H](C)[C@H]([C@@H](CC=O)C[C@H]4C)O[C@H]1[C@H](O)[C@@H](N(C)C)[C@H](O[C@H](O[C@@H](C)[C@@H]3O)C[C@@]3(C)O)[C@@H](C)O1.OC(C)C(O)=O, 0 +O=C(N(CC)N=O)NCC(=O)C, 1 +CNN, 1 +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N, 1 +O=S(=O)(C1=C(C=CC=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+], 0 +O=C1NC(=O)NC=C1, 1 +N#CN(CC)N=O, 1 +IC(I)I, 0 +N(C)[N+].S(=O)(=O)([O-])O, 1 +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N, 1 +COc3ccccc3N2CCN(CCCN\C1=C\C(=O)N(C)C(=O)N1C)CC2, 0 +O=C(NCCCN(CC)CC)CN1N=CC(C3=CC=CC=C3)=C1C2=CC=CC=C2.O=C(O)/C([H])=C([H])/C(O)=O, 0 +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1, 1 +C(N)(N)=O, 0 +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C, 1 +CC1=C2C(=CC=C1)C=CC=C2, 0 +C1(=C2/C(C3=CC(S(=O)(=O)[O-])=CC=C3N2)=O)/C(C4=CC(S(=O)(=O)[O-])=CC=C4N1)=O.[Na+].[Na+], 0 +NC(=O)OCC, 1 +CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O, 0 +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C.[H]Cl, 1 +CC2=CC1=CC=CC=C1C=C2, 0 +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O, 1 +O=S(=O)([O-])[O-].[V+2]=O, 0 +CCC1(C2=C(C3=C(C(=CC=C3)CC)N2)CCO1)CC(=O)O, 0 +O=C(O[C@@H]1CC[N+]2([O-])[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C, 1 +CN[N+](=O)[O-], 1 +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1, 1 +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1, 1 +C1(=C(C=CC(=C1)N(CCO)CCO)NCCO)[N+]([O-])=O, 0 +OC1=C(C=C(C=C1)CC=C)OC, 0 +C1(C(OCC(C)C)=O)=CC=C(O)C=C1, 0 +OB(O)O, 0 +Cl.N#Cc1ccc(cc1)C3CCCc2cncn23, 0 +Br(=O)(=O)[O-].[K+], 1 +C(CCCN(N=O)C)(O)C1C=NC=CC=1, 1 +O=CCBr, 0 +O=C(C1=CC=CN=C1)CCCN(N=O)C, 1 +CC(=O)OC=C, 1 +[Na+].CN(C)c1ccc(/N=N/S([O-])(=O)=O)cc1, 0 +CC(CON=O)C, 1 +C=CBr, 1 +O.O.O.O.NC(=O)[C@@H]3CCCN3C(=O)[C@@H](NC(=O)[C@@H]1CC(=O)N(C)C(=O)N1)C\C2=C\N=C/N2, 0 +O=[N+](C1=CN=C(S1)N)[O-], 1 +ClC(Cl)Br, 1 +O=NN(C)C1=NC=NC2=C1N=CN2[C@@H]3O[C@H](CO)[C@@H](O)[C@H]3O, 1 +NC(=O)OC=C, 1 +CC/C(C2=CC=CC=C2)=C(C1=CC=CC=C1)/C(C=C3)=CC=C3OCCN(C)C.OC(C(CC(O)=O)(O)CC(O)=O)=O, 1 +CCBr, 1 +S=P(OC1=CC(=C(C=C1)SC)C)(OC)OC, 0 +FC(C(OC(F)F)Cl)(F)F, 0 +C=CCl, 1 +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N, 1 +O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N, 0 +O=C(NCO)C=C, 1 +C=CF, 1 +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C, 1 +.[Cl-].[Fe+3].[Cl-].[Cl-], 0 +COC1C=C(C=CC=1C2NC3=CN=CC=C3N=2)S(C)=O, 1 +C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl, 1 +NCCS(O)(=O)=O, 0 +[Fe+3].O=C([O-])CC(O)(CC(=O)[O-])C([O-])=O.O.O.O.O, 0 +O=C(C1=CC=NC=C1)NN, 1 +CC1=CC2=CC=CN=C2C=C1, 0 +O=C(N1)N(C2OCCC2)C=C(F)C1=O, 0 +N(C)(C)C([S-])=S.[Fe+3].[S-]C(=S)N(C)C.[S-]C(=S)N(C)C, 0 +NC(=O)C1=CC=NC=C1, 0 +CC1=CC=CC2=CC=CN=C12, 0 +C=C(Cl)Cl, 1 +Cl/C2=C(\Cl)C3(Cl)C1C(Cl)OC(Cl)C1C2(Cl)C3(Cl)Cl, 0 +OC(=O)C1=CC=NC=C1, 0 +C=CC1=CC=C(C=C1)C, 0 +C=C(F)F, 0 +C1(C(NCC2CCCCN2)=O)=C(C=CC(=C1)OCC(F)(F)F)OCC(F)(F)F.CC(=O)O, 0 +COC1=C(O)C=CC(=C1)C=NNC(=O)C2=CC=NC=C2, 1 +NC1=CC=C(C=C1)C2=CC=CC=C2, 1 +CC1(CC(=CC(=O)C1)C)C, 1 +CN1C2=CC=C(C=C2C(=NC(C1=O)O)C3=CC=CC=C3)Cl, 0 +O=C(NC1=CC=CC(=C1)C(F)(F)F)N(C)C, 0 +NC3=CC1=C(C=C3)OC2=C1C=CC=C2, 1 +O=C1N(C=C)CCC1, 1 +CN1CCN(CC1)/C2=N/C3=CC=CC=C3SC4C=CC(C)=CC2=4, 0 +O=C(C(F)(F)F)NC1=CC3=C(C2=CC=CC=C2C3)C=C1, 1 +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+], 1 +ClCCN[P]1(=O)OCCCN1CCCl, 1 +N1(C(=CN=C1C)[N+](=O)[O-])CCO, 1 +OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1, 0 +O[C@H]1[C@@H](NC(CO)CO)C[C@](O)(CO)[C@@H](O)[C@@H]1O, 0 +CC(=C)C=C, 1 +CC1=C(C(=CC(=C1)OC(=O)NC)C)N(C)C, 0 +C1(N=CNN=1)N, 1 +O=C(OC)C1=C(C)NC(C)=C(C(OCCC3=CC=C(N4CCN(C(C6=CC=CC=C6)C5=CC=CC=C5)CC4)C=C3)=O)C1C2=CC([N+]([O-])=O)=CC=C2.Cl.Cl, 0 +[Na+].[F-], 0 +OC(C)C, 0 +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C, 1 +OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C, 0 +OC(=O)CCCCCCCCCCN, 1 +NC2=CC=C(C=C2N)C1=CC=C(N)C(N)=C1.Cl.Cl.Cl.Cl, 1 +NC1=CC=C(C=C1)C2=CC=C(C=C2)F, 1 +CC(OC1=CC=C(C=C1)NC2=CC=CC=C2)C, 0 +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl, 1 +Cl.CC(C)(C)NCC(O)COc1cccc(C)c1C, 0 +Clc1c([N+]([O-])=O)c(Cl)c(Cl)c(OC)c1Cl, 0 +Cl.CC(=O)O[C@@H](CC)C(C[C@H](C)N(C)C)(c1ccccc1)c2ccccc2, 1 +O=C(NC1=CC=CC(=C1)Cl)OC(C)C, 0 +CC(C)C=O, 0 +ClC1=CC(=C(C=C1C2=C(C=C(C(=C2)Cl)N)Cl)Cl)N, 0 +O=C(C(C1=CC=CC=C1)(C2=CC=CC=C2)CC(N(C)C)C)CC.[H]Cl, 0 +N(=C(C=1)C)N(C(C)C)C=1OC(=O)N(C)C, 0 +C1(C[C@H]([C@@H]([C@H]1CCCCCCC(=O)OC)/C=C/CC(O)(CCCC)C)O)=O, 0 +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2, 1 +CN(C)CNc2nnc(/C=C/c1ccc(o1)[N+]([O-])=O)o2, 1 +O=C1C(=CNC(=O)N1)F, 1 +O=C(NC1=CC=CC=C1)OC(C)C, 0 +O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H], 1 +CC(=O)O[C@@H]3CC(=O)O[C@H](C)C\C=C\C=C\[C@H](O)[C@H](C)C[C@H](CC=O)[C@H](O[C@@H]2O[C@H](C)[C@@H](O[C@H]1C[C@@](C)(O)[C@H](OC(=O)CC(C)C)[C@H](C)O1)[C@H](N(C)C)[C@H]2O)C3OC, 0 +O=S(=O)(C1=CC(=C(C=C1Cl)Cl)Cl)C2=CC=C(C=C2)Cl, 0 +C1=C(C(=C(C=C1O)C)N(C)C)C, 0 +C(NC)CC(OC1=CC=C(C=C1)C(F)(F)F)C2=CC=CC=C2.[H]Cl, 0 +C/C=C/C1=CC2=C(C=C1)OCO2, 0 +O=[Mo](=O)=O, 1 +[N+].[O-], 0 +C1(C(=CC=C(C=1)C)C)N.[H]Cl, 1 +ClC(CCl)(Cl)Cl, 1 +O=C1N(C2=CC=CC=C2)N(C(=C1N(C)C)C)C, 0 +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC=C(C=C3)O, 0 +O=C1C(O)=COC(CO)=C1, 1 +ClC(C(Cl)Cl)Cl, 1 +C=O, 1 +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C, 0 +CC(=C)C#N, 0 +ClC(=C(Cl)Cl)Cl, 1 +O=NN(CCN(C)C)C(=O)[NH2+]CC.[O-]N=O, 1 +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O, 0 +O=C(O)COC1=C(C)C=C(Cl)C=C1, 0 +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C, 1 +O=C(N(CCCCC)N=O)N, 1 +CCC(C)=NO, 1 +C1=CC=C(NC(=O)C(/N=N/C2=C(Cl)C=C(C3=CC(Cl)=C(/N=N/C(C(=O)NC4=CC=CC=C4)C(=O)C)C=C3)C=C2)C(=O)C)C=C1, 0 +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl, 1 +O(C)c1cc(CC=C)ccc1OC, 1 +ClC1=CC(Cl)=C(/N=N/C(C(=O)NC2=C(C=C(C3=CC(C)=C(NC(=O)C(/N=N/C4=C(Cl)C=C(Cl)C=C4)C(=O)C)C=C3)C=C2)C)C(=O)C)C=C1, 0 +CC1=NC=CN1, 1 +C1(C2=CC=C(C(=C2)Cl)N=NC(C(C)=O)C(=O)NC3=C(C=C(C(=C3)OC)Cl)OC)=CC(=C(C=C1)N=NC(C(C)=O)C(=O)NC4=CC(=C(C=C4OC)Cl)OC)Cl, 0 +Cl.CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(cccc1O)[C@@](C)(O)[C@H]4C[C@@H]23, 0 +C/C=C/C1=CC=C(C=C1)OC, 0 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O, 1 +[H][C@]12N(CC=C2COC([C@@](O)(C(O)(C)C)[C@H](C)OC)=O)CC[C@@H]1OC(\C(C)=C/C)=O, 1 +S=C(N(CC)CC)SSC(=S)N(CC)CC, 0 +S=C([S-])NCCNC([S-])=S.[Zn+2], 0 +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2, 0 +O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+], 0 +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl, 0 +O=CNN, 1 +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2], 1 +O=S(C1=CC=C2C(C=CC(O)=C2\N=N/C3=CC=C(S(=O)([O-])=O)C=C3)=C1)([O-])=O.[Na+].[Na+], 0 +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl, 1 +S=C(S[Pb]SC(N(C)C)=S)N(C)C, 0 +F/C(F)=C(\F)F, 1 +[N+](=O)([O-])c1ccccc1C, 1 +O=C(N(C)C)Cl, 1 +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O, 1 +OCCNC1=C(OCCO)C=C([N+]([O-])=O)C=C1, 0 +C(S)(=S)N(C)C.N(C)C, 0 +O=C2C1=C(CCC2)C(OC[C@@H](O)CNC(C)(C)C)=CC=C1.Cl, 0 +O=C(O)\C=C/C(O)=O.O=C(NC3CC(N4C)CCC4C3)C1=C2C(CC(C)(C)O2)=CC(Cl)=C1, 0 +OC2=C1[C@@](C=C(C)CC3)([H])[C@]3([H])C(C)(C)OC1=CC(CCCCC)=C2, 0 +NC1=CC=CC=C1[H]Cl, 1 +C[N+](CCCCCCCCCCCC)(C)[O-], 0 +C1=COC=C1, 1 +C1CCCO1, 1 +C1(=C(C=CC=C1)N)OC.[H]Cl, 1 +O=S(\N=C(NCCSCC2=CC=C(CNC)O2)/NCC(C1=CC=C(O)C=C1)O)(C)=O, 1 +CN(C=O)C, 0 +O=CC1=CC=CO1, 1 +O=C(O)CC[C@@H](C)[C@]3([H])[C@](CC2)(C)[C@](CC3)([H])[C@@](CC4)([H])[C@@]2([H])[C@]1(C)[C@@]4([H])C[C@H](O)CC1, 0 +C1(=CC=C(N)C=C1)OC.[H]Cl, 0 +O=C3C[C@@H]4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](C)(O)CC[C@@H]12)[C@@]4(C)C\C3=C\O, 1 +CN(C)N, 1 +OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O, 1 +C1=CC=CC=C1C(COC(N)=O)COC(N)=O, 1 +NC1=C(C=CC=C1)C(=O)O, 0 +N(NC)C.[H]Cl.[H]Cl, 1 +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3, 0 +[O-][N+](C2=CC=C(O2)C1=CSC(NN(C)C)=N1)=O, 1 +S=C([S-])N(CCCC)CCCC.[S-]C(N(CCCC)CCCC)=S.[Zn+2], 0 +[Cl-].OC[P+](CO)(CO)CO, 0 +C1(=N\CCN/1)C(C)OC2C(=CC=CC=2Cl)Cl.[H]Cl, 0 +[O-][N+](=O)N(C)C, 1 +S=C([S-])N(CC)CC.[S-]C(N(CC)CC)=S.[Zn+2], 0 +OC[P+](CO)(CO)CO.[O-]S([O-])(=O)=O.OC[P+](CO)(CO)CO, 0 +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl, 1 +OC(=O)C1=NN(C2=C1C=CC=C2)CC3=CC=C(C=C3Cl)Cl, 0 +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2], 1 +S=C(N(C)C)SSC(=S)N(C)C, 0 +NN(C=O)CCC, 1 +O=C(OC)C1=CCCN(C)C1.[H]Cl, 1 +CC(C)(CO)CCCCCCC(C)(C)CO, 0 +OC(C(SC(Cl)=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=CC=C3)=O, 0 +S=C(N(C)C)SC(=S)N(C)C, 0 +O=C(C1=CC(=C(C(=C1)O)O)O)OCCC, 0 +[K+].[I-], 1 +C\C(C)=C/Cl, 1 +C[C@@H](CC)C(=O)O[C@H]2C[C@@H](C)\C=C3\C=C/[C@H](C)[C@H](CC[C@@H]1C[C@@H](O)CC(=O)O1)[C@@H]23, 1 +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-], 1 +CCCOC(=O)[CH]1[CH](C)CC2=C(C=C3OCOC3=C2)[CH]1C(=O)OCCC, 0 +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2, 1 +C(=O)(/C=C/C)OC1=C(C(CCCCCC)C)C=C(C=C1[N+]([O-])=O)[N+]([O-])=O, 0 +[Cl-].C/[N+](C)=C1\C=C/C(C=C1)=C(\c2ccc(cc2)N(C)C)c3ccc(cc3)N(C)C, 1 +Cn3nc(CO)nc3NCCCOc2cc(CN1CCCCC1)ccc2, 1 +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F, 0 +S1C=CC(=C1)CN(C2=NC=CC=C2)CCN(C)C, 0 +OC(COC(C)(C)C)C, 1 +CS(=O)(=O)OC1=C(C=C(C=C1C(C)(C)C)[N+]([O-])=O)[N+](=O)[O-], 0 +Cl.Cl.Cl.Cc1ccc(cn1)C\C2=C\N/C(=N\C2=O)NCCSCc3ccc(CN(C)C)o3, 1 +O=C2C=1/N=C\NC=1N(C)C(=O)N2C, 0 +N1=CC=CC=C1, 1 +O=NN(C(=O)N)CCC, 1 +O=C1C23C4C5C6(C(=O)C7=C(O)C(C)=CC(=C7C(C6=C(C2C5O)O)=O)O)C(C4O)C(=C3C(=O)C8=C1C(O)=C(C)C=C8O)O, 1 +N(CCN(C)C)(C)N=O, 1 +N1C(=NC2=C1C=CC=C2)C3=CSC=N3, 0 +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O, 1 +CC=C, 0 +OC(=O)[C@@H]3[C@]51C[C@@](O)(CC[C@H]1[C@@]24\C=C/[C@H](O)[C@@](C)(C(=O)O2)[C@@H]34)C(=C)C5, 0 +OC[C@@H](NC(C(Cl)Cl)=O)[C@H](O)C1=CC=C(S(=O)(C)=O)C=C1, 0 +CC(CO)O, 0 +O=NN(CCN1N=O)CCC1, 1 +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N, 1 +Cl[Mg]Cl.O.O.O.O.O.O, 0 +S=P(N1CC1)(N1CC1)N1CC1, 1 +ClC1=C(Cl)C=CC([C@H]2C3=C(C=CC=C3)[C@@H](NC)CC2)=C1.Cl, 0 +CC1CO1, 1 +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2, 1 +C1(CN(N=O)CC(O1)C)C, 1 +[O-]P(=O)=O.[Na+], 0 +NNCCC.[H]Cl, 1 +O=NN1CCN(N=O)CC1, 1 +O=C1C=C(NC(=S)N1)CCC, 1 +O=C(C(SP(=O)(OC)OC)CC(=O)OCC)OCC, 0 +CCOC(=O)N(C)N=O, 1 +CC(=S)N, 1 +O[C@@H]1[C@@](O[C@@H](O[C@H](CO)[C@@H]2Cl)[C@H](O)[C@H]2O)(CCl)O[C@H](CCl)[C@H]1O, 0 +O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC, 0 +C1N(COC1)N=O, 1 +CC(C1=CC(=C(C=C1O)C)SC2=CC(=C(C=C2C)O)C(C)(C)C)(C)C, 0 +O=C1C=CC(=O)NN1, 0 +O=C(N(CCC1=CC=CC=C1)N=O)N, 1 +OC1=C(C=C(C=C1SC2=C(C(=CC(=C2)Cl)Cl)O)Cl)Cl, 0 +O=C(O[C@@H]1[C@@](O[C@@H](O[C@H](COC(C)=O)[C@H]2OC(C(C)C)=O)[C@H](OC(C(C)C)=O)[C@H]2OC(C(C)C)=O)(COC(C)=O)O[C@H](COC(C(C)C)=O)[C@H]1OC(C(C)C)=O)C(C)C, 0 +C1(=CC=C2C(=C1)N(C(\N=C/2C3=CC=CC=C3)=O)C(C)C)C, 0 +C1=CC(=CC=C1NNC(CC[C@@H](C(O)=O)N)=O)CO, 0 +C(=C/C=O)\[O-].[Na+], 1 +C([S-])#N.[Na+], 0 +CCCCOP(=O)(OCCCC)OCCCC, 1 +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N, 1 +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-], 0 +O=S(=O)([O-])[O-].O.[Mn+2], 0 +N1C=CC=C(C=1)C2N(N=O)CCC2, 1 +F[B-](F)(F)F.[Na+], 0 +O=P(OC(CCl)CCl)(OC(CCl)CCl)OC(CCl)CCl, 1 +OC(CO)CCl, 0 +Cl.Cl.[O-][N+](=O)c1cccc(c1)C/2C(\C(=O)OC)=C(\C)NC(\C)=C\2C(=O)OCCN3CCN(CC3)C(c4ccccc4)c5ccccc5, 0 +O=C(C1=CC=C(C=C1)N)NC2=CC=C(C=C2)N, 0 +NC(=S)NN, 0 +C1COCCO1, 1 +O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO, 0 +O=C(NC3=CC2=C(C=C3)C1=CC=C(NC(C)=O)C=C1C2)C, 0 +O=C1NC(=S)NC=C1, 1 +NC(=O)C1=NC=CN=C1, 0 +S=P(SC1C(SP(=S)(OCC)OCC)OCCO1)(OCC)OCC, 0 +OCC1CO1, 1 +NC1=C(C=CC(=C1)N)C, 1 +COC2=CC=C(C=C2)CN(CCN(C)C)C1=NC=CC=C1.OC(\C=C/C(O)=O)=O, 1 +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C, 1 +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl, 1 +S=C(N1CCCCC1)SSSSSSC(=S)N1CCCCC1, 0 +CN(C)[C@@H]2/C=C\CC[C@@]2(c1ccccc1)C(=O)OCC.OC(=O)\C=C\C(O)=O, 0 +NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl, 0 +C1(=CC(=C(C(=C1)N)C)N).[H]Cl.[H]Cl, 0 +O=NN(CCCCC)CCCCC, 1 +OCC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4, 0 +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O, 1 +NC1=C(C)C=C(N)C=C1.O=S(O)(O)=O, 0 +C(C1=CC=CC=C1)(C2=CC=CC=C2)OCCN(C)C.[H]Cl, 0 +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O, 0 +CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3, 0 +N(C1=CC=C(C=C1)NC2=CC=CC=C2)C3=CC=CC=C3, 0 +Cl.CC(C)(C)NCC(O)CO/C1=C/N(C)C(=O)c2ccccc12, 0 +S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC, 0 +N#CC(C1=CC=CC=C1)C2=CC=CC=C2, 0 +[Sn+2].[Cl-].[Cl-], 0 +[Na+].[Na+].OC(=O)[C@]5(C)C[C@H]6/C7=C/C(=O)[C@H]4[C@@](C)(CC[C@@H]3[C@]4(C)CC[C@H](OC2O[C@H](C([O-])=O)[C@@H](O)[C@H](O)[C@H]2O[C@H]1O[C@@H]([C@@H](O)[C@H](O)[C@H]1O)C([O-])=O)C3(C)C)[C@]7(C)CC[C@@]6(C)CC5, 0 +O=[Ti]=O, 0 +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](\CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=CC=C5.[Na+], 1 +C(C(=O)[O-])(O[Ti](OC(C(=O)[O-])=O)=O)=O.[K+].[K+], 0 +Cl.CCOC(=O)[C@H](CCc1ccccc1)N[C@@H](C)C(=O)N2Cc3ccccc3C[C@H]2C(O)=O, 0 +O=C(OC1=CC=CC=C1)OC2=CC=CC=C2, 0 +[Ti+2](C1=CC=CC1)C2(=CC=CC2).[Cl-].[Cl-], 0 +C(/C1=C(C=C(C=C1)O)S(=O)(=O)[O-])(C2=CC=C(C=C2)N(CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)=C4/C=C/C(C=C4)=[N+](\CC5=CC(=CC=C5)S(=O)(=O)[O-])CC.[Na+].[Na+], 0 +Cl.O=C(c2cn(C)c1ccccc12)[C@H]3CC=4N\C=N/C=4CC3, 0 +O1C2=C(C=CC=C2)OC3=CC=CC=C13, 0 +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O, 1 +C1(=C(C)C2OC(CCC=2C(=C1OC(=O)C)C)(CCCC(CCCC(CCCC(C)C)C)C)C)C, 0 +CC1=CC(C4=CC(C)=C(/N=N/C5=CC=C(OS(=O)(C6=CC=C(C)C=C6)=O)C=C5)C=C4)=CC=C1/N=N/C2=C(O)C=CC3=CC(S(=O)([O-])=O)=CC(S(=O)([O-])=O)=C23.[Na+].[Na+], 1 +N1(C2=CC=CC=C2)C(C(N(CS(=O)(=O)[O-])C)=C(N1C)C)=O.[Na+], 1 diff --git a/test/data/multicolumn.csv b/test/data/multicolumn.csv new file mode 100644 index 0000000..2fa9a1c --- /dev/null +++ b/test/data/multicolumn.csv @@ -0,0 +1,5 @@ +SMILES, Hamster Carcinogenicity, numeric feature, classification, mixed, string +c1ccccc1NN , 1, 1, true , true , "test" +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O , 1, 2, false, 7.5 , "test" +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1, 1, 3, true , 5 , "test" +C1(N=CNN=1)N , 0, 4, false, false, "test" diff --git a/test/feature.rb b/test/feature.rb index c389e8f..1308e77 100644 --- a/test/feature.rb +++ b/test/feature.rb @@ -1,8 +1,6 @@ -$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' ) -require 'rubygems' -require 'opentox-ruby-minimal' require 'test/unit' -#require 'validate-owl' +$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') +require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' class FeatureTest < Test::Unit::TestCase @@ -18,7 +16,7 @@ class FeatureTest < Test::Unit::TestCase def test_feature @features.each do |uri| f = OpenTox::Feature.new(uri) - assert_equal RDF::OT.Feature, f.metadata[RDF.type] + assert_equal RDF::OT1.Feature, f.metadata[RDF.type] end end diff --git a/test/rest.rb b/test/rest.rb index 1000b4e..bb91b68 100644 --- a/test/rest.rb +++ b/test/rest.rb @@ -1,19 +1,15 @@ -$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' ) -require 'rubygems' -require 'opentox-ruby-minimal.rb' require 'test/unit' +$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') +require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' class RestTest < Test::Unit::TestCase def test_post_get_delete - uristring = "http://ot-dev.in-silico.ch/dataset" - uri = uristring + uri = "http://ot-dev.in-silico.ch/dataset" dataset_service = OpenTox::Dataset.new uri - assert_match /#{uristring}/, dataset_service.get - dataset_uri = dataset_service.post - assert_match /#{uristring}/, dataset_uri.to_s - dataset = OpenTox::Dataset.new dataset_uri - assert_equal dataset_uri, dataset.uri + assert_match /#{uri}/, dataset_service.get + dataset = dataset_service.post + assert_match /#{uri}/, dataset.uri.to_s metadata = dataset.metadata assert_equal RDF::OT.Dataset, metadata[RDF.type] assert_equal dataset.uri, metadata[RDF::XSD.anyURI] diff --git a/test/ruby-api.rb b/test/ruby-api.rb index be828fb..0c9386b 100644 --- a/test/ruby-api.rb +++ b/test/ruby-api.rb @@ -1,17 +1,34 @@ -$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' ) -require 'rubygems' -require 'opentox-ruby-minimal.rb' require 'test/unit' +$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') +require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' class RubyAPITest < Test::Unit::TestCase + def test_all + datasets = OpenTox::Dataset.all "http://ot-dev.in-silico.ch/dataset" + assert_equal OpenTox::Dataset, datasets.first.class + assert_equal RDF::OT.Dataset, datasets.last.metadata[RDF.type] + end +=begin + def test_create - d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset"#, {RDF::DC.title => "test dataset"} + d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset" + puts d.inspect assert_equal OpenTox::Dataset, d.class assert_equal RDF::OT.Dataset, d.metadata[RDF.type] + d.delete end def test_save + d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset" + d.metadata + d.metadata[RDF::DC.title] = "test" + d.save + # TODO: save does not work with datasets + #puts d.response.code.inspect + #assert_equal "test", d.metadata[RDF::DC.title] # should reload metadata + d.delete end +=end end diff --git a/test/task.rb b/test/task.rb new file mode 100644 index 0000000..1f0c9c2 --- /dev/null +++ b/test/task.rb @@ -0,0 +1,34 @@ +require 'test/unit' +$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') +require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' +#require "./validate-owl.rb" +# +TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" + +class TaskTest < Test::Unit::TestCase + + def setup + end + + def teardown + end + + def test_create_and_complete + task = OpenTox::Task.create TASK_SERVICE_URI + assert_equal "Running", task.status + task.completed "http://test.org" + assert_equal "Completed", task.status + assert_equal "http://test.org", task.result_uri + end + + + def test_rdf + task = OpenTox::Task.all(TASK_SERVICE_URI).last + assert_equal OpenTox::Task, task.class + #validate_owl(task.uri) + #puts task.uri + end +=begin +=end + +end -- cgit v1.2.3 From 76e2c84c766fd37d702c45e76dc666230afcd136 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 13 Feb 2012 16:30:05 +0000 Subject: task.rb modified (untested) --- lib/spork.rb | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/task.rb | 68 ++++++++++++++++++++---------------------------- 2 files changed, 112 insertions(+), 40 deletions(-) create mode 100644 lib/spork.rb diff --git a/lib/spork.rb b/lib/spork.rb new file mode 100644 index 0000000..40c458b --- /dev/null +++ b/lib/spork.rb @@ -0,0 +1,84 @@ +# A way to cleanly handle process forking in Sinatra when using Passenger, aka "sporking some code". +# This will allow you to properly execute some code asynchronously, which otherwise does not work correctly. +# +# Written by Ron Evans +# More info at http://deadprogrammersociety.com +# +# Mostly lifted from the Spawn plugin for Rails (http://github.com/tra/spawn) +# but with all of the Rails stuff removed.... cause you are using Sinatra. If you are using Rails, Spawn is +# what you need. If you are using something else besides Sinatra that is Rack-based under Passenger, and you are having trouble with +# asynch processing, let me know if spork helped you. +# +module Spork + # things to close in child process + @@resources = [] + def self.resources + @@resources + end + + # set the resource to disconnect from in the child process (when forking) + def self.resource_to_close(resource) + @@resources << resource + end + + # close all the resources added by calls to resource_to_close + def self.close_resources + @@resources.each do |resource| + resource.close if resource && resource.respond_to?(:close) && !resource.closed? + end + @@resources = [] + end + + # actually perform the fork... er, spork + # valid options are: + # :priority => to set the process priority of the child + # :logger => a logger object to use from the child + # :no_detach => true if you want to keep the child process under the parent control. usually you do NOT want this + def self.spork(options={}) + logger = options[:logger] + logger.debug "spork> parent PID = #{Process.pid}" if logger + + child = fork do + begin + start = Time.now + logger.debug "spork> child PID = #{Process.pid}" if logger + + # set the nice priority if needed + Process.setpriority(Process::PRIO_PROCESS, 0, options[:priority]) if options[:priority] + + # disconnect from the rack + Spork.close_resources + + # run the block of code that takes so long + yield + + rescue => ex + #raise ex + logger.error "spork> Exception in child[#{Process.pid}] - #{ex.class}: #{ex.message}" if logger + ensure + logger.info "spork> child[#{Process.pid}] took #{Time.now - start} sec" if logger + # this form of exit doesn't call at_exit handlers + exit!(0) + end + end + + # detach from child process (parent may still wait for detached process if they wish) + Process.detach(child) unless options[:no_detach] + + return child + end + +end + +# Patch to work with passenger +if defined? Passenger::Rack::RequestHandler + class Passenger::Rack::RequestHandler + alias_method :orig_process_request, :process_request + def process_request(env, input, output) + Spork.resource_to_close(input) + Spork.resource_to_close(output) + orig_process_request(env, input, output) + end + end +end + diff --git a/lib/task.rb b/lib/task.rb index 0adb7a0..cd5aa79 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,62 +1,31 @@ +require File.join(File.dirname(__FILE__),'spork') DEFAULT_TASK_MAX_DURATION = 36000 module OpenTox # Class for handling asynchronous tasks class Task - - def self.create service_uri - Task.new RestClient.post(service_uri,{}).chomp - #eval("#{self}.new(\"#{uri}\", #{subjectid})") - end - - def http_code - get(@uri).code - end - - def status - metadata[RDF::OT.hasStatus].to_s - end - - def result_uri - metadata[RDF::OT.resultURI] + def self.create service_uri, params + task = Task.new RestClient.post(service_uri,params).chomp + pid = Spork.spork { yield } + task.pid = pid + task end def description metadata[RDF::DC.description] end - def errorReport - metadata[RDF::OT.errorReport] - end - def cancel - RestClient.put(File.join(@uri,'Cancelled'),{:cannot_be => "empty"}) + RestClient.put(File.join(@uri,'Cancelled'),{}) end def completed(uri) RestClient.put(File.join(@uri,'Completed'),{:resultURI => uri}) end - def error(error_report) - raise "no error report" unless error_report.is_a?(OpenTox::ErrorReport) - RestClient.put(File.join(@uri,'Error'),{:errorReport => error_report.to_yaml}) - end - - def pid=(pid) - RestClient.put(File.join(@uri,'pid'), {:pid => pid}) - end - - def running? - metadata[RDF::OT.hasStatus] == 'Running' - end - - def completed? - metadata[RDF::OT.hasStatus] == 'Completed' - end - - def error? - metadata[RDF::OT.hasStatus] == 'Error' + def error(error) + RestClient.put(File.join(@uri,'Error'),{:errorReport => OpenTox::Error.new(error)}) end # waits for a task, unless time exceeds or state is no longer running @@ -69,4 +38,23 @@ module OpenTox end end + def method_missing(method,*args) + method = method.to_s + begin + case method + when /=/ + res = RestClient.put(File.join(@uri,method.sub(/=/,'')),{}) + super unless res.code == 200 + when /?/ + return metadata[RDF::OT.hasStatus] == method.sub(/\?/,'').capitalize + else + return metadata[RDF::OT[method]] + end + rescue + super + end + end + + #TODO: subtasks + end -- cgit v1.2.3 From 9ed209b262e0b540af967e24e9b9845600a0669c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 15 Feb 2012 18:06:46 +0100 Subject: tests fixed for new task api --- lib/error.rb | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/spork.rb | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/task.rb | 68 +++++++++++++++++------------------------ test/rest.rb | 4 +-- test/task.rb | 6 ++-- 5 files changed, 214 insertions(+), 46 deletions(-) create mode 100644 lib/error.rb create mode 100644 lib/spork.rb diff --git a/lib/error.rb b/lib/error.rb new file mode 100644 index 0000000..b92f2a4 --- /dev/null +++ b/lib/error.rb @@ -0,0 +1,99 @@ + +# adding additional fields to Exception class to format errors according to OT-API +class Exception + attr_accessor :errorCause + def http_code; 500; end +end + +module OpenTox + + class BadRequestError < RuntimeError + def http_code; 400; end + end + + class NotAuthorizedError < RuntimeError + def http_code; 401; end + end + + class NotFoundError < RuntimeError + def http_code; 404; end + end + + class ServiceUnavailableError < RuntimeError + def http_code; 503; end + end + + class RestCallError < RuntimeError + attr_accessor :rest_params + def http_code; 502; end + end + + class ErrorReport + + # TODO replace params with URIs (errorCause -> OT.errorCause) + attr_reader :message, :actor, :errorCause, :http_code, :errorDetails, :errorType + + private + def initialize( http_code, erroType, message, actor, errorCause, rest_params=nil, backtrace=nil ) + @http_code = http_code + @errorType = erroType + @message = message + @actor = actor + @errorCause = errorCause + @rest_params = rest_params + @backtrace = backtrace + end + + public + # creates a error report object, from an ruby-exception object + # @param [Exception] error + # @param [String] actor, URI of the call that cause the error + def self.create( error, actor ) + rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params + backtrace = error.backtrace.short_backtrace if CONFIG[:backtrace] + ErrorReport.new( error.http_code, error.class.to_s, error.message, actor, error.errorCause, rest_params, backtrace ) + end + + def self.from_rdf(rdf) + metadata = OpenTox::Parser::Owl.from_rdf( rdf, OT.ErrorReport ).metadata + ErrorReport.new(metadata[OT.statusCode], metadata[OT.errorCode], metadata[OT.message], metadata[OT.actor], metadata[OT.errorCause]) + end + + # overwrite sorting to make easier readable + def to_yaml_properties + p = super + p = ( p - ["@backtrace"]) + ["@backtrace"] if @backtrace + p = ( p - ["@errorCause"]) + ["@errorCause"] if @errorCause + p + end + + def rdf_content() + c = { + RDF.type => [OT.ErrorReport], + OT.statusCode => @http_code, + OT.message => @message, + OT.actor => @actor, + OT.errorCode => @errorType, + } + c[OT.errorCause] = @errorCause.rdf_content if @errorCause + c + end + + def to_rdfxml + s = Serializer::Owl.new + s.add_resource(CONFIG[:services]["opentox-task"]+"/tmpId/ErrorReport/tmpId", OT.errorReport, rdf_content) + s.to_rdfxml + end + end +end + +class Array + def short_backtrace + short = [] + each do |c| + break if c =~ /sinatra\/base/ + short << c + end + short.join("\n") + end +end diff --git a/lib/spork.rb b/lib/spork.rb new file mode 100644 index 0000000..c77b5b5 --- /dev/null +++ b/lib/spork.rb @@ -0,0 +1,83 @@ +# A way to cleanly handle process forking in Sinatra when using Passenger, aka "sporking some code". +# This will allow you to properly execute some code asynchronously, which otherwise does not work correctly. +# +# Written by Ron Evans +# More info at http://deadprogrammersociety.com +# +# Mostly lifted from the Spawn plugin for Rails (http://github.com/tra/spawn) +# but with all of the Rails stuff removed.... cause you are using Sinatra. If you are using Rails, Spawn is +# what you need. If you are using something else besides Sinatra that is Rack-based under Passenger, and you are having trouble with +# asynch processing, let me know if spork helped you. +# +module Spork + # things to close in child process + @@resources = [] + def self.resources + @@resources + end + + # set the resource to disconnect from in the child process (when forking) + def self.resource_to_close(resource) + @@resources << resource + end + + # close all the resources added by calls to resource_to_close + def self.close_resources + @@resources.each do |resource| + resource.close if resource && resource.respond_to?(:close) && !resource.closed? + end + @@resources = [] + end + + # actually perform the fork... er, spork + # valid options are: + # :priority => to set the process priority of the child + # :logger => a logger object to use from the child + # :no_detach => true if you want to keep the child process under the parent control. usually you do NOT want this + def self.spork(options={}) + logger = options[:logger] + logger.debug "spork> parent PID = #{Process.pid}" if logger + + child = fork do + begin + start = Time.now + logger.debug "spork> child PID = #{Process.pid}" if logger + + # set the nice priority if needed + Process.setpriority(Process::PRIO_PROCESS, 0, options[:priority]) if options[:priority] + + # disconnect from the rack + Spork.close_resources + + # run the block of code that takes so long + yield + + rescue => ex + #raise ex + logger.error "spork> Exception in child[#{Process.pid}] - #{ex.class}: #{ex.message}" if logger + ensure + logger.info "spork> child[#{Process.pid}] took #{Time.now - start} sec" if logger + # this form of exit doesn't call at_exit handlers + exit!(0) + end + end + + # detach from child process (parent may still wait for detached process if they wish) + Process.detach(child) unless options[:no_detach] + + return child + end + +end + +# Patch to work with passenger +if defined? Passenger::Rack::RequestHandler + class Passenger::Rack::RequestHandler + alias_method :orig_process_request, :process_request + def process_request(env, input, output) + Spork.resource_to_close(input) + Spork.resource_to_close(output) + orig_process_request(env, input, output) + end + end +end diff --git a/lib/task.rb b/lib/task.rb index 0adb7a0..aee6c62 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,62 +1,31 @@ +require File.join(File.dirname(__FILE__),'spork') DEFAULT_TASK_MAX_DURATION = 36000 module OpenTox # Class for handling asynchronous tasks class Task - - def self.create service_uri - Task.new RestClient.post(service_uri,{}).chomp - #eval("#{self}.new(\"#{uri}\", #{subjectid})") - end - - def http_code - get(@uri).code - end - - def status - metadata[RDF::OT.hasStatus].to_s - end - - def result_uri - metadata[RDF::OT.resultURI] + def self.create service_uri, params={} + task = Task.new RestClient.post(service_uri,params).chomp + pid = Spork.spork { yield } + task.pid = pid + task end def description metadata[RDF::DC.description] end - def errorReport - metadata[RDF::OT.errorReport] - end - def cancel - RestClient.put(File.join(@uri,'Cancelled'),{:cannot_be => "empty"}) + RestClient.put(File.join(@uri,'Cancelled'),{}) end def completed(uri) RestClient.put(File.join(@uri,'Completed'),{:resultURI => uri}) end - def error(error_report) - raise "no error report" unless error_report.is_a?(OpenTox::ErrorReport) - RestClient.put(File.join(@uri,'Error'),{:errorReport => error_report.to_yaml}) - end - - def pid=(pid) - RestClient.put(File.join(@uri,'pid'), {:pid => pid}) - end - - def running? - metadata[RDF::OT.hasStatus] == 'Running' - end - - def completed? - metadata[RDF::OT.hasStatus] == 'Completed' - end - - def error? - metadata[RDF::OT.hasStatus] == 'Error' + def error(error) + RestClient.put(File.join(@uri,'Error'),{:errorReport => OpenTox::Error.new(error)}) end # waits for a task, unless time exceeds or state is no longer running @@ -69,4 +38,23 @@ module OpenTox end end + def method_missing(method,*args) + method = method.to_s + begin + case method + when /=/ + res = RestClient.put(File.join(@uri,method.sub(/=/,'')),{}) + super unless res.code == 200 + when /\?/ + return metadata[RDF::OT.hasStatus] == method.sub(/\?/,'').capitalize + else + return metadata[RDF::OT[method]].to_s + end + rescue + super + end + end + + #TODO: subtasks + end diff --git a/test/rest.rb b/test/rest.rb index bb91b68..52ca55d 100644 --- a/test/rest.rb +++ b/test/rest.rb @@ -6,9 +6,7 @@ class RestTest < Test::Unit::TestCase def test_post_get_delete uri = "http://ot-dev.in-silico.ch/dataset" - dataset_service = OpenTox::Dataset.new uri - assert_match /#{uri}/, dataset_service.get - dataset = dataset_service.post + dataset = OpenTox::Dataset.create uri assert_match /#{uri}/, dataset.uri.to_s metadata = dataset.metadata assert_equal RDF::OT.Dataset, metadata[RDF.type] diff --git a/test/task.rb b/test/task.rb index 1f0c9c2..5828223 100644 --- a/test/task.rb +++ b/test/task.rb @@ -15,10 +15,10 @@ class TaskTest < Test::Unit::TestCase def test_create_and_complete task = OpenTox::Task.create TASK_SERVICE_URI - assert_equal "Running", task.status + assert_equal "Running", task.hasStatus task.completed "http://test.org" - assert_equal "Completed", task.status - assert_equal "http://test.org", task.result_uri + assert_equal "Completed", task.hasStatus + assert_equal "http://test.org", task.resultURI end -- cgit v1.2.3 From 6d88f38d61dbabd355a48e65bb49e94ba87a350c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 15 Feb 2012 22:53:14 +0000 Subject: empty subjectids fixed, adjustments for ree 1.8.7 --- lib/opentox-client.rb | 9 +++++---- lib/opentox.rb | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index bc297b5..7c7fb11 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -1,7 +1,8 @@ +require 'rubygems' require 'rdf' require 'rdf/raptor' require "rest-client" -require "opentox" -require "task" -require "compound" -require "dataset" +require File.join(File.dirname(__FILE__),"opentox.rb") +require File.join(File.dirname(__FILE__),"task.rb") +require File.join(File.dirname(__FILE__),"compound.rb") +require File.join(File.dirname(__FILE__),"dataset.rb") diff --git a/lib/opentox.rb b/lib/opentox.rb index a9cbeab..51bc17a 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -154,7 +154,7 @@ module OpenTox def create service_uri, subjectid=nil uri = RestClient.post(service_uri, {}, :subjectid => subjectid).chomp - eval("#{self}.new(\"#{uri}\", #{subjectid})") + subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")") end def from_file service_uri, file, subjectid=nil @@ -163,7 +163,7 @@ module OpenTox def all service_uri, subjectid=nil uris = RestClient.get(service_uri, {:accept => 'text/uri-list'}).split("\n").compact - uris.collect{|uri| eval "#{self}.new(\"#{uri}\", #{subjectid})"} + uris.collect{|uri| subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")")} end end -- cgit v1.2.3 From 6cacf7bbc3545ed87e21d0ca5a19ab4300699fdc Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 16 Feb 2012 15:10:19 +0000 Subject: bundler instead of jeweller for gem management --- Gemfile | 2 ++ Rakefile | 7 +++---- lib/opentox-client/version.rb | 5 +++++ opentox-client.gemspec | 26 ++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 Gemfile create mode 100644 lib/opentox-client/version.rb create mode 100644 opentox-client.gemspec diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..f98dbde --- /dev/null +++ b/Gemfile @@ -0,0 +1,2 @@ +source :gemcutter +gemspec diff --git a/Rakefile b/Rakefile index 2c791a6..980b5ba 100644 --- a/Rakefile +++ b/Rakefile @@ -1,7 +1,6 @@ -require 'rubygems' -require 'rake' +require "bundler/gem_tasks" -begin +=begin require 'jeweler' Jeweler::Tasks.new do |gem| gem.name = "opentox-client" @@ -20,7 +19,7 @@ begin Jeweler::GemcutterTasks.new rescue LoadError puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler" -end +=end require 'rake/testtask' Rake::TestTask.new do |t| diff --git a/lib/opentox-client/version.rb b/lib/opentox-client/version.rb new file mode 100644 index 0000000..d90a728 --- /dev/null +++ b/lib/opentox-client/version.rb @@ -0,0 +1,5 @@ +module Opentox + module Client + VERSION = "0.0.1" + end +end diff --git a/opentox-client.gemspec b/opentox-client.gemspec new file mode 100644 index 0000000..5477004 --- /dev/null +++ b/opentox-client.gemspec @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- +$:.push File.expand_path("../lib", __FILE__) +require "opentox-client/version" + +Gem::Specification.new do |s| + s.name = "opentox-client" + s.version = Opentox::Client::VERSION + s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] + s.email = ["helma@in-silico.ch"] + s.homepage = "http://github.com/opentox/opentox-client" + s.summary = %q{Ruby wrapper for the OpenTox REST API} + s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} + + s.rubyforge_project = "opentox-client" + + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } + s.require_paths = ["lib"] + + # specify any dependencies here; for example: + # s.add_development_dependency "rspec" + s.add_runtime_dependency "rest-client" + s.add_runtime_dependency "rdf" + s.add_runtime_dependency "rdf-raptor" +end -- cgit v1.2.3 From 0600fdc62e7446caa75ffcff4d097338818e0df9 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 16 Feb 2012 22:17:50 +0000 Subject: Task.wait_for_completion fixed --- lib/opentox-client.rb | 2 ++ lib/task.rb | 11 +++++++++-- test/task.rb | 12 ++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 7c7fb11..0bd048c 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -1,4 +1,6 @@ +require "opentox-client/version" require 'rubygems' +require "bundler/setup" require 'rdf' require 'rdf/raptor' require "rest-client" diff --git a/lib/task.rb b/lib/task.rb index aee6c62..50616d7 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -7,7 +7,13 @@ module OpenTox def self.create service_uri, params={} task = Task.new RestClient.post(service_uri,params).chomp - pid = Spork.spork { yield } + pid = Spork.spork do + begin + task.completed yield + rescue => error + task.error error + end + end task.pid = pid task end @@ -33,6 +39,7 @@ module OpenTox def wait_for_completion(dur=0.3) due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION while self.running? + sleep dur raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) end end @@ -46,7 +53,7 @@ module OpenTox res = RestClient.put(File.join(@uri,method.sub(/=/,'')),{}) super unless res.code == 200 when /\?/ - return metadata[RDF::OT.hasStatus] == method.sub(/\?/,'').capitalize + return hasStatus == method.sub(/\?/,'').capitalize else return metadata[RDF::OT[method]].to_s end diff --git a/test/task.rb b/test/task.rb index 5828223..41316d1 100644 --- a/test/task.rb +++ b/test/task.rb @@ -2,7 +2,7 @@ require 'test/unit' $LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' #require "./validate-owl.rb" -# + TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" class TaskTest < Test::Unit::TestCase @@ -14,9 +14,12 @@ class TaskTest < Test::Unit::TestCase end def test_create_and_complete - task = OpenTox::Task.create TASK_SERVICE_URI + task = OpenTox::Task.create TASK_SERVICE_URI do + sleep 1 + "http://test.org" + end assert_equal "Running", task.hasStatus - task.completed "http://test.org" + task.wait_for_completion assert_equal "Completed", task.hasStatus assert_equal "http://test.org", task.resultURI end @@ -26,9 +29,6 @@ class TaskTest < Test::Unit::TestCase task = OpenTox::Task.all(TASK_SERVICE_URI).last assert_equal OpenTox::Task, task.class #validate_owl(task.uri) - #puts task.uri end -=begin -=end end -- cgit v1.2.3 From 9fe1f6870cfd12c34eb4efef8f4e199e8324c1af Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 19 Feb 2012 16:03:10 +0000 Subject: task handling fixed for http codes > 202 --- .gitignore | 13 ++---- Rakefile | 21 --------- lib/authorization.rb | 30 ++++++------- lib/error.rb | 3 +- lib/opentox-client.rb | 5 ++- lib/opentox.rb | 117 +++++++++++++++++++++---------------------------- lib/spork.rb | 83 ----------------------------------- lib/task.rb | 68 +++++++++++++++++++++++----- opentox-client.gemspec | 1 + test/task.rb | 38 ++++++++++++---- 10 files changed, 163 insertions(+), 216 deletions(-) delete mode 100644 lib/spork.rb diff --git a/.gitignore b/.gitignore index 75924e1..4040c6c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,4 @@ -*.sw? -.DS_Store -coverage -rdoc -pkg -.yardoc -doc -mysql-bak.rb -*~ +*.gem +.bundle +Gemfile.lock +pkg/* diff --git a/Rakefile b/Rakefile index 980b5ba..5bcc76a 100644 --- a/Rakefile +++ b/Rakefile @@ -1,26 +1,5 @@ require "bundler/gem_tasks" -=begin - require 'jeweler' - Jeweler::Tasks.new do |gem| - gem.name = "opentox-client" - gem.summary = %Q{Ruby wrapper for the OpenTox REST API} - gem.description = %Q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} - gem.email = "helma@in-silico.ch" - gem.homepage = "http://github.com/opentox/opentox-ruby-minimal" - gem.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] - # dependencies with versions - gem.add_dependency "rest-client" - gem.add_dependency "rdf" - gem.add_dependency "rdf-raptor" - gem.add_development_dependency 'jeweler' - gem.files = FileList["[A-Z]*", "{bin,generators,lib,test}/**/*", 'lib/jeweler/templates/.gitignore'] - end - Jeweler::GemcutterTasks.new -rescue LoadError - puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler" -=end - require 'rake/testtask' Rake::TestTask.new do |t| t.libs << 'lib' diff --git a/lib/authorization.rb b/lib/authorization.rb index d447f88..1938814 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -41,8 +41,8 @@ module OpenTox xml = get_xml(uri) ret = false ret = Authorization.create_policy(xml, @subjectid) - LOGGER.debug "Policy send with subjectid: #{@subjectid}" - LOGGER.warn "Not created Policy is: #{xml}" if !ret + @@logger.debug "Policy send with subjectid: #{@subjectid}" + @@logger.warn "Not created Policy is: #{xml}" if !ret ret end @@ -200,7 +200,7 @@ module OpenTox def self.create_policy(policy, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/Pol/opensso-pol") - LOGGER.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s + @@logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s return true if resource.post(policy, :subjectid => subjectid, :content_type => "application/xml") rescue return false @@ -213,7 +213,7 @@ module OpenTox def self.delete_policy(policy, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/pol") - LOGGER.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" + @@logger.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" return true if resource.delete(:subjectid => subjectid, :id => policy) rescue return nil @@ -279,7 +279,7 @@ module OpenTox return true if !AA_SERVER aa = Authorization::AA.new(subjectid) ret = aa.send(uri) - LOGGER.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{subjectid} - policy created: #{ret}" + @@logger.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{subjectid} - policy created: #{ret}" ret end @@ -291,7 +291,7 @@ module OpenTox if policies policies.each do |policy| ret = delete_policy(policy, subjectid) - LOGGER.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" + @@logger.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" end end return true @@ -304,11 +304,11 @@ module OpenTox def self.check_policy(uri, subjectid) return true unless uri and subjectid token_valid = OpenTox::Authorization.is_token_valid(subjectid) - LOGGER.debug "OpenTox::Authorization.check_policy with uri: #{uri}, subjectid: #{subjectid} is valid: #{token_valid}" + @@logger.debug "OpenTox::Authorization.check_policy with uri: #{uri}, subjectid: #{subjectid} is valid: #{token_valid}" # check if subjectid is valid unless token_valid # abort if invalid - LOGGER.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{subjectid}" + @@logger.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{subjectid}" return false end @@ -320,7 +320,7 @@ module OpenTox if authorize(uri, "POST", subjectid) true else - LOGGER.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{subjectid}" + @@logger.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{subjectid}" false end end @@ -338,25 +338,25 @@ module OpenTox # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method, subjectid) if CONFIG[:authorization][:free_request].include?(request_method) - #LOGGER.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + #@@logger.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true elsif OpenTox::Authorization.free_uri?(uri, request_method) - #LOGGER.debug "authorized? >>true<< (uris is free_uri), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + #@@logger.debug "authorized? >>true<< (uris is free_uri), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true elsif CONFIG[:authorization][:authenticate_request].include?(request_method) ret = OpenTox::Authorization.is_token_valid(subjectid) - LOGGER.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + @@logger.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret elsif OpenTox::Authorization.authorize_exception?(uri, request_method) ret = OpenTox::Authorization.is_token_valid(subjectid) - LOGGER.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + @@logger.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret elsif CONFIG[:authorization][:authorize_request].include?(request_method) ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) - LOGGER.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + @@logger.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret else - LOGGER.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + @@logger.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" false end end diff --git a/lib/error.rb b/lib/error.rb index b92f2a4..64cc4eb 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,4 +1,3 @@ - # adding additional fields to Exception class to format errors according to OT-API class Exception attr_accessor :errorCause @@ -50,7 +49,7 @@ module OpenTox # @param [String] actor, URI of the call that cause the error def self.create( error, actor ) rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params - backtrace = error.backtrace.short_backtrace if CONFIG[:backtrace] + backtrace = error.backtrace.short_backtrace #if CONFIG[:backtrace] ErrorReport.new( error.http_code, error.class.to_s, error.message, actor, error.errorCause, rest_params, backtrace ) end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 0bd048c..c5c701b 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -1,9 +1,12 @@ -require "opentox-client/version" require 'rubygems' require "bundler/setup" require 'rdf' require 'rdf/raptor' require "rest-client" +require 'uri' +require 'yaml' +require File.join(File.dirname(__FILE__),"error.rb") +require File.join(File.dirname(__FILE__),"logger.rb") require File.join(File.dirname(__FILE__),"opentox.rb") require File.join(File.dirname(__FILE__),"task.rb") require File.join(File.dirname(__FILE__),"compound.rb") diff --git a/lib/opentox.rb b/lib/opentox.rb index 51bc17a..ab5c95f 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -1,5 +1,4 @@ #TODO: switch services to 1.2 -#TODO: error handling RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' @@ -11,83 +10,62 @@ RestClient.add_before_execution_proc do |req, params| end class String - def to_object - # TODO: fix, this is unsafe - self =~ /dataset/ ? uri = File.join(self.chomp,"metadata") : uri = self.chomp - raise "#{uri} is not a valid URI." unless RDF::URI.new(uri).uri? - RDF::Reader.open(uri) do |reader| - reader.each_statement do |statement| - if statement.predicate == RDF.type and statement.subject == uri - klass = "OpenTox::#{statement.object.to_s.split("#").last}" - object = eval "#{klass}.new \"#{uri}\"" - end - end - end - # fallback: guess class from uri - # TODO: fix services and remove - unless object - case uri - when /compound/ - object = OpenTox::Compound.new uri - when /feature/ - object = OpenTox::Feature.new uri - when /dataset/ - object = OpenTox::Dataset.new uri.sub(/\/metadata/,'') - when /algorithm/ - object = OpenTox::Algorithm.new uri - when /model/ - object = OpenTox::Model.new uri - when /validation/ - object = OpenTox::Validation.new uri - when /task/ - object = OpenTox::Task.new uri - else - raise "Class for #{uri} not found." - end - end - if object.class == Task # wait for tasks - object.wait_for_completion - object = object.result_uri.to_s.to_object - end - object - end - -=begin - def object_from_uri + def to_object # TODO: fix, this is unsafe self =~ /dataset/ ? uri = File.join(self.chomp,"metadata") : uri = self.chomp + raise "#{uri} is not a valid URI." unless RDF::URI.new(uri).uri? RDF::Reader.open(uri) do |reader| reader.each_statement do |statement| if statement.predicate == RDF.type and statement.subject == uri klass = "OpenTox::#{statement.object.to_s.split("#").last}" - return eval "#{klass}.new \"#{uri}\"" + object = eval "#{klass}.new \"#{uri}\"" end end end - # guess class from uri + # fallback: guess class from uri # TODO: fix services and remove - case uri - when /compound/ - return OpenTox::Compound.new uri - when /feature/ - return OpenTox::Feature.new uri - when /dataset/ - return OpenTox::Dataset.new uri.sub(/\/metadata/,'') - when /algorithm/ - return OpenTox::Algorithm.new uri - when /model/ - return OpenTox::Model.new uri - when /validation/ - return OpenTox::Validation.new uri - when /task/ - return OpenTox::Task.new uri - else - raise "Class for #{uri} not found." + unless object + case uri + when /compound/ + object = OpenTox::Compound.new uri + when /feature/ + object = OpenTox::Feature.new uri + when /dataset/ + object = OpenTox::Dataset.new uri.sub(/\/metadata/,'') + when /algorithm/ + object = OpenTox::Algorithm.new uri + when /model/ + object = OpenTox::Model.new uri + when /validation/ + object = OpenTox::Validation.new uri + when /task/ + object = OpenTox::Task.new uri + else + raise "Class for #{uri} not found." + end + end + if object.class == Task # wait for tasks + object.wait_for_completion + object = object.result_uri.to_s.to_object + end + object + end + + def uri? + begin + Net::HTTP.get_response(URI.parse(self)) + true + rescue + false end end -=end end + +# defaults to stderr, may be changed to file output +$logger = OTLogger.new(STDERR) # no rotation +$logger.level = Logger::DEBUG + module OpenTox attr_accessor :subjectid, :uri, :response @@ -103,10 +81,15 @@ module OpenTox def metadata reload=true if reload @metadata = {} - RDF::Reader.open(@uri) do |reader| - reader.each_statement do |statement| - @metadata[statement.predicate] = statement.object if statement.subject == @uri + begin + RDF::Reader.open(@uri) do |reader| + reader.each_statement do |statement| + @metadata[statement.predicate] = statement.object if statement.subject == @uri + end end + rescue + $logger.error "Cannot read RDF metadata from #{@uri}: #{$!}.\n#{$!.backtrace.join("\n")}" + raise end end @metadata diff --git a/lib/spork.rb b/lib/spork.rb deleted file mode 100644 index c77b5b5..0000000 --- a/lib/spork.rb +++ /dev/null @@ -1,83 +0,0 @@ -# A way to cleanly handle process forking in Sinatra when using Passenger, aka "sporking some code". -# This will allow you to properly execute some code asynchronously, which otherwise does not work correctly. -# -# Written by Ron Evans -# More info at http://deadprogrammersociety.com -# -# Mostly lifted from the Spawn plugin for Rails (http://github.com/tra/spawn) -# but with all of the Rails stuff removed.... cause you are using Sinatra. If you are using Rails, Spawn is -# what you need. If you are using something else besides Sinatra that is Rack-based under Passenger, and you are having trouble with -# asynch processing, let me know if spork helped you. -# -module Spork - # things to close in child process - @@resources = [] - def self.resources - @@resources - end - - # set the resource to disconnect from in the child process (when forking) - def self.resource_to_close(resource) - @@resources << resource - end - - # close all the resources added by calls to resource_to_close - def self.close_resources - @@resources.each do |resource| - resource.close if resource && resource.respond_to?(:close) && !resource.closed? - end - @@resources = [] - end - - # actually perform the fork... er, spork - # valid options are: - # :priority => to set the process priority of the child - # :logger => a logger object to use from the child - # :no_detach => true if you want to keep the child process under the parent control. usually you do NOT want this - def self.spork(options={}) - logger = options[:logger] - logger.debug "spork> parent PID = #{Process.pid}" if logger - - child = fork do - begin - start = Time.now - logger.debug "spork> child PID = #{Process.pid}" if logger - - # set the nice priority if needed - Process.setpriority(Process::PRIO_PROCESS, 0, options[:priority]) if options[:priority] - - # disconnect from the rack - Spork.close_resources - - # run the block of code that takes so long - yield - - rescue => ex - #raise ex - logger.error "spork> Exception in child[#{Process.pid}] - #{ex.class}: #{ex.message}" if logger - ensure - logger.info "spork> child[#{Process.pid}] took #{Time.now - start} sec" if logger - # this form of exit doesn't call at_exit handlers - exit!(0) - end - end - - # detach from child process (parent may still wait for detached process if they wish) - Process.detach(child) unless options[:no_detach] - - return child - end - -end - -# Patch to work with passenger -if defined? Passenger::Rack::RequestHandler - class Passenger::Rack::RequestHandler - alias_method :orig_process_request, :process_request - def process_request(env, input, output) - Spork.resource_to_close(input) - Spork.resource_to_close(output) - orig_process_request(env, input, output) - end - end -end diff --git a/lib/task.rb b/lib/task.rb index 50616d7..52d4a30 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,28 +1,47 @@ -require File.join(File.dirname(__FILE__),'spork') +require File.join(File.dirname(__FILE__),'error') DEFAULT_TASK_MAX_DURATION = 36000 module OpenTox # Class for handling asynchronous tasks class Task + attr_accessor :pid def self.create service_uri, params={} task = Task.new RestClient.post(service_uri,params).chomp - pid = Spork.spork do + pid = fork do begin - task.completed yield - rescue => error - task.error error + result_uri = yield + if result_uri.uri? + task.completed result_uri + else + raise "#{result_uri} is not a valid URI" + end + rescue + # TODO add service URI to Kernel.raise + # serialize error and send to task service + #task.error $! + task.error $! + raise end end + Process.detach(pid) task.pid = pid task end + def kill + begin + Process.kill(9,pid) + rescue + end + end + def description metadata[RDF::DC.description] end def cancel + kill RestClient.put(File.join(@uri,'Cancelled'),{}) end @@ -30,19 +49,24 @@ module OpenTox RestClient.put(File.join(@uri,'Completed'),{:resultURI => uri}) end - def error(error) - RestClient.put(File.join(@uri,'Error'),{:errorReport => OpenTox::Error.new(error)}) + def error error + $logger.error self if $logger + kill + report = ErrorReport.create(error,"http://localhost") + RestClient.put(File.join(@uri,'Error'),{:errorReport => report}) + #RestClient.put(File.join(@uri,'Error'),{:message => error, :backtrace => error.backtrace}) end # waits for a task, unless time exceeds or state is no longer running - # @param [optional,Numeric] dur seconds pausing before cheking again for completion + # @param [optional,Numeric] dur seconds pausing before checking again for completion def wait_for_completion(dur=0.3) due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION - while self.running? + while running? sleep dur raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) end end + end def method_missing(method,*args) @@ -55,13 +79,37 @@ module OpenTox when /\?/ return hasStatus == method.sub(/\?/,'').capitalize else - return metadata[RDF::OT[method]].to_s + response = metadata[RDF::OT[method]].to_s + response = metadata[RDF::OT1[method]].to_s #if response.empty? # API 1.1 compatibility + if response.empty? + $logger.error "No #{method} metadata for #{@uri} " + raise "No #{method} metadata for #{@uri} " + end + return response end rescue + $logger.error "Unknown #{self.class} method #{method}" super end end + # override to read all error codes + def metadata reload=true + if reload + @metadata = {} + # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader + RestClient.get(@uri) do |response, request, result, &block| + $logger.warn "#{@uri} returned #{result}" unless response.code == 200 or response.code == 202 + RDF::Reader.for(:rdfxml).new(response) do |reader| + reader.each_statement do |statement| + @metadata[statement.predicate] = statement.object if statement.subject == @uri + end + end + end + end + @metadata + end + #TODO: subtasks end diff --git a/opentox-client.gemspec b/opentox-client.gemspec index 5477004..7ba3ab0 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -20,6 +20,7 @@ Gem::Specification.new do |s| # specify any dependencies here; for example: # s.add_development_dependency "rspec" + s.add_runtime_dependency "bundler" s.add_runtime_dependency "rest-client" s.add_runtime_dependency "rdf" s.add_runtime_dependency "rdf-raptor" diff --git a/test/task.rb b/test/task.rb index 41316d1..b217ec2 100644 --- a/test/task.rb +++ b/test/task.rb @@ -3,32 +3,54 @@ $LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' #require "./validate-owl.rb" -TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" +#TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" +TASK_SERVICE_URI = "http://ot-test.in-silico.ch/task" +#TASK_SERVICE_URI = "https://ambit.uni-plovdiv.bg:8443/ambit2/task" #not compatible class TaskTest < Test::Unit::TestCase - def setup - end - def teardown + def test_all + t = OpenTox::Task.all(TASK_SERVICE_URI) + assert_equal Array, t.class + assert_equal RDF::OT1.Task, t.last.metadata[RDF.type] end def test_create_and_complete - task = OpenTox::Task.create TASK_SERVICE_URI do + task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test" do sleep 1 - "http://test.org" + TASK_SERVICE_URI end assert_equal "Running", task.hasStatus task.wait_for_completion assert_equal "Completed", task.hasStatus - assert_equal "http://test.org", task.resultURI + assert_equal TASK_SERVICE_URI, task.resultURI end - def test_rdf task = OpenTox::Task.all(TASK_SERVICE_URI).last assert_equal OpenTox::Task, task.class #validate_owl(task.uri) end + def test_create_and_fail + task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test failure", :creator => "http://test.org/fake_creator" do + sleep 1 + raise "an error occured" + end + assert_equal "Running", task.hasStatus + task.wait_for_completion + assert_equal "Error", task.hasStatus + end + + def test_wrong_result_uri + task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test wrong result uri", :creator => "http://test.org/fake_creator" do + sleep 1 + "Asasadasd" + end + assert_equal "Running", task.hasStatus + task.wait_for_completion + assert_equal "Error", task.hasStatus + end + end -- cgit v1.2.3 From 64135ae320998a836725786f95a4efd3b63f585c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 19 Feb 2012 16:06:46 +0000 Subject: logger.rb added --- lib/logger.rb | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/logger.rb diff --git a/lib/logger.rb b/lib/logger.rb new file mode 100644 index 0000000..c98f1ca --- /dev/null +++ b/lib/logger.rb @@ -0,0 +1,46 @@ +require 'logger' +class OTLogger < Logger + + def pwd + path = Dir.pwd.to_s + index = path.rindex(/\//) + return path if index==nil + path[(index+1)..-1] + end + + def trace() + lines = caller(0) + n = 2 + line = lines[n] + + while (line =~ /spork.rb/ or line =~ /create/ or line =~ /overwrite.rb/) + n += 1 + line = lines[n] + end + + index = line.rindex(/\/.*\.rb/) + return line if index==nil + line[index..-1] + end + + def format(msg) + pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace + end + + def debug(msg) + super format(msg) + end + + def info(msg) + super format(msg) + end + + def warn(msg) + super format(msg) + end + + def error(msg) + super format(msg) + end + +end -- cgit v1.2.3 From b6134b992fde8784c3556fbca32925e721700d32 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 20 Feb 2012 16:16:56 +0000 Subject: task catches and reports errors (some dataset tests still fail) --- Rakefile | 1 + lib/error.rb | 9 +++++++++ lib/logger.rb | 46 ---------------------------------------------- lib/opentox-client.rb | 5 +++-- lib/opentox.rb | 13 ++++++------- lib/otlogger.rb | 45 +++++++++++++++++++++++++++++++++++++++++++++ lib/task.rb | 2 +- test/rest.rb | 12 +++++++++--- 8 files changed, 74 insertions(+), 59 deletions(-) delete mode 100644 lib/logger.rb create mode 100644 lib/otlogger.rb diff --git a/Rakefile b/Rakefile index 5bcc76a..ca1db1c 100644 --- a/Rakefile +++ b/Rakefile @@ -1,3 +1,4 @@ +require File.join(File.dirname(__FILE__),"lib","opentox-client.rb") require "bundler/gem_tasks" require 'rake/testtask' diff --git a/lib/error.rb b/lib/error.rb index 64cc4eb..6987f35 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -17,16 +17,22 @@ module OpenTox class NotFoundError < RuntimeError def http_code; 404; end end + + class LockedError < RuntimeError + def http_code; 423; end + end class ServiceUnavailableError < RuntimeError def http_code; 503; end end + # TODO: add to RestClientCalls class RestCallError < RuntimeError attr_accessor :rest_params def http_code; 502; end end + # TODO: add to Exception class?? class ErrorReport # TODO replace params with URIs (errorCause -> OT.errorCause) @@ -78,11 +84,14 @@ module OpenTox c end + # TODO: use rdf.rb def to_rdfxml s = Serializer::Owl.new s.add_resource(CONFIG[:services]["opentox-task"]+"/tmpId/ErrorReport/tmpId", OT.errorReport, rdf_content) s.to_rdfxml end +=begin +=end end end diff --git a/lib/logger.rb b/lib/logger.rb deleted file mode 100644 index c98f1ca..0000000 --- a/lib/logger.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'logger' -class OTLogger < Logger - - def pwd - path = Dir.pwd.to_s - index = path.rindex(/\//) - return path if index==nil - path[(index+1)..-1] - end - - def trace() - lines = caller(0) - n = 2 - line = lines[n] - - while (line =~ /spork.rb/ or line =~ /create/ or line =~ /overwrite.rb/) - n += 1 - line = lines[n] - end - - index = line.rindex(/\/.*\.rb/) - return line if index==nil - line[index..-1] - end - - def format(msg) - pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace - end - - def debug(msg) - super format(msg) - end - - def info(msg) - super format(msg) - end - - def warn(msg) - super format(msg) - end - - def error(msg) - super format(msg) - end - -end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index c5c701b..fc6cbd1 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -5,9 +5,10 @@ require 'rdf/raptor' require "rest-client" require 'uri' require 'yaml' +require 'logger' require File.join(File.dirname(__FILE__),"error.rb") -require File.join(File.dirname(__FILE__),"logger.rb") +require File.join(File.dirname(__FILE__),"otlogger.rb") # avoid require conflicts with logger require File.join(File.dirname(__FILE__),"opentox.rb") require File.join(File.dirname(__FILE__),"task.rb") require File.join(File.dirname(__FILE__),"compound.rb") -require File.join(File.dirname(__FILE__),"dataset.rb") +#require File.join(File.dirname(__FILE__),"dataset.rb") diff --git a/lib/opentox.rb b/lib/opentox.rb index ab5c95f..01de3e7 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -13,7 +13,8 @@ class String def to_object # TODO: fix, this is unsafe self =~ /dataset/ ? uri = File.join(self.chomp,"metadata") : uri = self.chomp - raise "#{uri} is not a valid URI." unless RDF::URI.new(uri).uri? + #raise "#{uri} is not a valid URI." unless RDF::URI.new(uri).uri? + raise "#{uri} is not a valid URI." unless uri.uri? RDF::Reader.open(uri) do |reader| reader.each_statement do |statement| if statement.predicate == RDF.type and statement.subject == uri @@ -82,7 +83,10 @@ module OpenTox if reload @metadata = {} begin - RDF::Reader.open(@uri) do |reader| + #puts self.class + #self.kind_of?(OpenTox::Dataset) ? uri = URI.join(@uri,"metadata") : uri = @uri + #$logger.debug uri + RDF::Reader.open(uri) do |reader| reader.each_statement do |statement| @metadata[statement.predicate] = statement.object if statement.subject == @uri end @@ -151,9 +155,6 @@ module OpenTox end - class FromUri - end - # create default classes SERVICES.each do |s| eval "class #{s} @@ -162,7 +163,5 @@ module OpenTox end" end - private - end diff --git a/lib/otlogger.rb b/lib/otlogger.rb new file mode 100644 index 0000000..295d0c1 --- /dev/null +++ b/lib/otlogger.rb @@ -0,0 +1,45 @@ +class OTLogger < Logger + + def pwd + path = Dir.pwd.to_s + index = path.rindex(/\//) + return path if index==nil + path[(index+1)..-1] + end + + def trace() + lines = caller(0) + n = 2 + line = lines[n] + + while (line =~ /spork.rb/ or line =~ /create/ or line =~ /overwrite.rb/) + n += 1 + line = lines[n] + end + + index = line.rindex(/\/.*\.rb/) + return line if index==nil + line[index..-1] + end + + def format(msg) + pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace + end + + def debug(msg) + super format(msg) + end + + def info(msg) + super format(msg) + end + + def warn(msg) + super format(msg) + end + + def error(msg) + super format(msg) + end + +end diff --git a/lib/task.rb b/lib/task.rb index 52d4a30..582f592 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -89,7 +89,7 @@ module OpenTox end rescue $logger.error "Unknown #{self.class} method #{method}" - super + #super end end diff --git a/test/rest.rb b/test/rest.rb index 52ca55d..412e265 100644 --- a/test/rest.rb +++ b/test/rest.rb @@ -5,12 +5,18 @@ require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' class RestTest < Test::Unit::TestCase def test_post_get_delete - uri = "http://ot-dev.in-silico.ch/dataset" - dataset = OpenTox::Dataset.create uri - assert_match /#{uri}/, dataset.uri.to_s + service_uri = "http://ot-dev.in-silico.ch/dataset" + dataset = OpenTox::Dataset.create service_uri + assert_match /#{service_uri}/, dataset.uri.to_s + puts dataset.uri + puts dataset.class + puts dataset.to_yaml metadata = dataset.metadata + puts dataset.class +=begin assert_equal RDF::OT.Dataset, metadata[RDF.type] assert_equal dataset.uri, metadata[RDF::XSD.anyURI] +=end dataset.delete end -- cgit v1.2.3 From b651c4d199a7b4d6a06cdefb281601bddd2fc885 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 23 Feb 2012 16:20:39 +0000 Subject: integrated features and tests from feature/typhoeus, tests pass reliably (as opposed to feature/typhoeus) --- lib/opentox.rb | 100 ++++++++++++++++++++++---------------------------------- lib/otlogger.rb | 2 +- lib/task.rb | 67 ++++++++++++++++++++++--------------- test/task.rb | 27 +++++++++++---- 4 files changed, 100 insertions(+), 96 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 01de3e7..2fbf9dc 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -2,66 +2,46 @@ RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' -SERVICES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task"] +SERVICES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] -# not working -RestClient.add_before_execution_proc do |req, params| - params[:subjectid] = @subjectid +class String + def underscore + self.gsub(/::/, '/'). + gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). + gsub(/([a-z\d])([A-Z])/,'\1_\2'). + tr("-", "_"). + downcase + end end -class String - def to_object - # TODO: fix, this is unsafe - self =~ /dataset/ ? uri = File.join(self.chomp,"metadata") : uri = self.chomp - #raise "#{uri} is not a valid URI." unless RDF::URI.new(uri).uri? - raise "#{uri} is not a valid URI." unless uri.uri? - RDF::Reader.open(uri) do |reader| - reader.each_statement do |statement| - if statement.predicate == RDF.type and statement.subject == uri - klass = "OpenTox::#{statement.object.to_s.split("#").last}" - object = eval "#{klass}.new \"#{uri}\"" - end - end - end - # fallback: guess class from uri - # TODO: fix services and remove - unless object - case uri - when /compound/ - object = OpenTox::Compound.new uri - when /feature/ - object = OpenTox::Feature.new uri - when /dataset/ - object = OpenTox::Dataset.new uri.sub(/\/metadata/,'') - when /algorithm/ - object = OpenTox::Algorithm.new uri - when /model/ - object = OpenTox::Model.new uri - when /validation/ - object = OpenTox::Validation.new uri - when /task/ - object = OpenTox::Task.new uri - else - raise "Class for #{uri} not found." - end - end - if object.class == Task # wait for tasks - object.wait_for_completion - object = object.result_uri.to_s.to_object - end - object +module URI + + def self.task? uri + uri =~ /task/ and URI.valid? uri + end + + def self.dataset? uri, subjectid=nil + uri =~ /dataset/ and URI.accessible? uri, subjectid=nil + end + + def self.model? uri, subjectid=nil + uri =~ /model/ and URI.accessible? uri, subjectid=nil end - def uri? - begin - Net::HTTP.get_response(URI.parse(self)) - true - rescue - false - end + def self.accessible? uri, subjectid=nil + Net::HTTP.get_response(URI.parse(uri)) + true + rescue + false end -end + def self.valid? uri + u = URI::parse(uri) + u.scheme!=nil and u.host!=nil + rescue URI::InvalidURIError + false + end +end # defaults to stderr, may be changed to file output $logger = OTLogger.new(STDERR) # no rotation @@ -79,21 +59,19 @@ module OpenTox # Ruby interface + + # override to read all error codes def metadata reload=true if reload @metadata = {} - begin - #puts self.class - #self.kind_of?(OpenTox::Dataset) ? uri = URI.join(@uri,"metadata") : uri = @uri - #$logger.debug uri - RDF::Reader.open(uri) do |reader| + # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader + RestClient.get(@uri) do |response, request, result, &block| + $logger.warn "#{@uri} returned #{result}" unless response.code == 200 or response.code == 202 or URI.task? @uri + RDF::Reader.for(:rdfxml).new(response) do |reader| reader.each_statement do |statement| @metadata[statement.predicate] = statement.object if statement.subject == @uri end end - rescue - $logger.error "Cannot read RDF metadata from #{@uri}: #{$!}.\n#{$!.backtrace.join("\n")}" - raise end end @metadata diff --git a/lib/otlogger.rb b/lib/otlogger.rb index 295d0c1..e9fbc4d 100644 --- a/lib/otlogger.rb +++ b/lib/otlogger.rb @@ -12,7 +12,7 @@ class OTLogger < Logger n = 2 line = lines[n] - while (line =~ /spork.rb/ or line =~ /create/ or line =~ /overwrite.rb/) + while (line =~ /spork.rb/ or line =~ /create/ or line =~ /#{File.basename(__FILE__)}/) n += 1 line = lines[n] end diff --git a/lib/task.rb b/lib/task.rb index 582f592..9aaee04 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -5,13 +5,13 @@ module OpenTox # Class for handling asynchronous tasks class Task - attr_accessor :pid + attr_accessor :pid, :observer_pid def self.create service_uri, params={} task = Task.new RestClient.post(service_uri,params).chomp pid = fork do begin result_uri = yield - if result_uri.uri? + if URI.accessible?(result_uri) task.completed result_uri else raise "#{result_uri} is not a valid URI" @@ -26,14 +26,25 @@ module OpenTox end Process.detach(pid) task.pid = pid + + # watch if task has been cancelled + observer_pid = fork do + task.wait_for_completion + begin + Process.kill(9,task.pid) if task.cancelled? + rescue + $logger.warn "Could not kill process of task #{task.uri}, pid: #{task.pid}" + end + end + Process.detach(observer_pid) + task.observer_pid = observer_pid task end def kill - begin - Process.kill(9,pid) - rescue - end + Process.kill(9,@pid) + Process.kill(9,@observer_pid) + rescue # no need to raise an aexeption if processes are not running end def description @@ -46,15 +57,17 @@ module OpenTox end def completed(uri) + #TODO: subjectid? + #TODO: error code + raise "\"#{uri}\" does not exist." unless URI.accessible? uri RestClient.put(File.join(@uri,'Completed'),{:resultURI => uri}) end def error error $logger.error self if $logger - kill report = ErrorReport.create(error,"http://localhost") RestClient.put(File.join(@uri,'Error'),{:errorReport => report}) - #RestClient.put(File.join(@uri,'Error'),{:message => error, :backtrace => error.backtrace}) + kill end # waits for a task, unless time exceeds or state is no longer running @@ -69,6 +82,23 @@ module OpenTox end + # get only header for ststus requests + def running? + RestClient.head(@uri){ |response, request, result| result.code.to_i == 202 } + end + + def cancelled? + RestClient.head(@uri){ |response, request, result| result.code.to_i == 503 } + end + + def completed? + RestClient.head(@uri){ |response, request, result| result.code.to_i == 200 } + end + + def error? + RestClient.head(@uri){ |response, request, result| result.code.to_i == 500 } + end + def method_missing(method,*args) method = method.to_s begin @@ -76,8 +106,8 @@ module OpenTox when /=/ res = RestClient.put(File.join(@uri,method.sub(/=/,'')),{}) super unless res.code == 200 - when /\?/ - return hasStatus == method.sub(/\?/,'').capitalize + #when /\?/ + #return hasStatus == method.sub(/\?/,'').capitalize else response = metadata[RDF::OT[method]].to_s response = metadata[RDF::OT1[method]].to_s #if response.empty? # API 1.1 compatibility @@ -93,23 +123,6 @@ module OpenTox end end - # override to read all error codes - def metadata reload=true - if reload - @metadata = {} - # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader - RestClient.get(@uri) do |response, request, result, &block| - $logger.warn "#{@uri} returned #{result}" unless response.code == 200 or response.code == 202 - RDF::Reader.for(:rdfxml).new(response) do |reader| - reader.each_statement do |statement| - @metadata[statement.predicate] = statement.object if statement.subject == @uri - end - end - end - end - @metadata - end - #TODO: subtasks end diff --git a/test/task.rb b/test/task.rb index b217ec2..56b21cf 100644 --- a/test/task.rb +++ b/test/task.rb @@ -11,9 +11,11 @@ class TaskTest < Test::Unit::TestCase def test_all - t = OpenTox::Task.all(TASK_SERVICE_URI) - assert_equal Array, t.class - assert_equal RDF::OT1.Task, t.last.metadata[RDF.type] + all = OpenTox::Task.all(TASK_SERVICE_URI) + assert_equal Array, all.class + t = all.last + assert_equal OpenTox::Task, t.class + assert_equal RDF::OT1.Task, t.metadata[RDF.type] end def test_create_and_complete @@ -21,16 +23,23 @@ class TaskTest < Test::Unit::TestCase sleep 1 TASK_SERVICE_URI end + assert task.running? assert_equal "Running", task.hasStatus task.wait_for_completion + assert task.completed? assert_equal "Completed", task.hasStatus assert_equal TASK_SERVICE_URI, task.resultURI end - def test_rdf - task = OpenTox::Task.all(TASK_SERVICE_URI).last - assert_equal OpenTox::Task, task.class - #validate_owl(task.uri) + + def test_create_and_cancel + task = OpenTox::Task.create TASK_SERVICE_URI do + sleep 2 + TASK_SERVICE_URI + end + assert task.running? + task.cancel + assert task.cancelled? end def test_create_and_fail @@ -38,8 +47,10 @@ class TaskTest < Test::Unit::TestCase sleep 1 raise "an error occured" end + assert task.running? assert_equal "Running", task.hasStatus task.wait_for_completion + assert task.error? assert_equal "Error", task.hasStatus end @@ -48,8 +59,10 @@ class TaskTest < Test::Unit::TestCase sleep 1 "Asasadasd" end + assert task.running? assert_equal "Running", task.hasStatus task.wait_for_completion + assert task.error? assert_equal "Error", task.hasStatus end -- cgit v1.2.3 From fa9069e13fb6b1c8bb4ebcdf82f1cf1c04ad71ca Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 23 Feb 2012 17:56:46 +0000 Subject: (partially) switched back to RestClientWrapper --- lib/compound.rb | 8 +- lib/opentox-client.rb | 2 + lib/opentox.rb | 67 ++++------------- lib/overwrite.rb | 39 ++++++++++ lib/rest_client_wrapper.rb | 182 +++++++++++++++++++++++++++++++++++++++++++++ lib/task.rb | 10 +-- test/rest.rb | 23 ------ test/ruby-api.rb | 34 --------- 8 files changed, 245 insertions(+), 120 deletions(-) create mode 100644 lib/overwrite.rb create mode 100644 lib/rest_client_wrapper.rb delete mode 100644 test/rest.rb delete mode 100644 test/ruby-api.rb diff --git a/lib/compound.rb b/lib/compound.rb index 8761d50..ce0fdbf 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -11,21 +11,21 @@ module OpenTox # @param [String] smiles Smiles string # @return [OpenTox::Compound] Compound def self.from_smiles service_uri, smiles, subjectid=nil - Compound.new RestClient.post(service_uri, smiles, {:content_type => 'chemical/x-daylight-smiles', :subjectid => subjectid}) + Compound.new RestClientWrapper.post(service_uri, smiles, {:content_type => 'chemical/x-daylight-smiles', :subjectid => subjectid}) end # Create a compound from inchi string # @param [String] smiles InChI string # @return [OpenTox::Compound] Compound def self.from_inchi service_uri, inchi, subjectid=nil - Compound.new RestClient.post(service_uri, inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) + Compound.new RestClientWrapper.post(service_uri, inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) end # Create a compound from sdf string # @param [String] smiles SDF string # @return [OpenTox::Compound] Compound def self.from_sdf service_uri, sdf, subjectid=nil - Compound.new RestClient.post(service_uri, sdf, {:content_type => 'chemical/x-mdl-sdfile', :subjectid => subjectid}) + Compound.new RestClientWrapper.post(service_uri, sdf, {:content_type => 'chemical/x-mdl-sdfile', :subjectid => subjectid}) end # Create a compound from name. Relies on an external service for name lookups. @@ -34,7 +34,7 @@ module OpenTox # @param [String] name name can be also an InChI/InChiKey, CAS number, etc # @return [OpenTox::Compound] Compound def self.from_name service_uri, name, subjectid=nil - Compound.new RestClient.post(service_uri, name, {:content_type => 'text/plain', :subjectid => subjectid}) + Compound.new RestClientWrapper.post(service_uri, name, {:content_type => 'text/plain', :subjectid => subjectid}) end # Get InChI diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index fc6cbd1..1a5e7c3 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -6,7 +6,9 @@ require "rest-client" require 'uri' require 'yaml' require 'logger' +require File.join(File.dirname(__FILE__),"overwrite.rb") require File.join(File.dirname(__FILE__),"error.rb") +require File.join(File.dirname(__FILE__),"rest_client_wrapper.rb") require File.join(File.dirname(__FILE__),"otlogger.rb") # avoid require conflicts with logger require File.join(File.dirname(__FILE__),"opentox.rb") require File.join(File.dirname(__FILE__),"task.rb") diff --git a/lib/opentox.rb b/lib/opentox.rb index 2fbf9dc..f81ae10 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -4,45 +4,6 @@ RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' SERVICES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] -class String - def underscore - self.gsub(/::/, '/'). - gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). - gsub(/([a-z\d])([A-Z])/,'\1_\2'). - tr("-", "_"). - downcase - end -end - -module URI - - def self.task? uri - uri =~ /task/ and URI.valid? uri - end - - def self.dataset? uri, subjectid=nil - uri =~ /dataset/ and URI.accessible? uri, subjectid=nil - end - - def self.model? uri, subjectid=nil - uri =~ /model/ and URI.accessible? uri, subjectid=nil - end - - def self.accessible? uri, subjectid=nil - Net::HTTP.get_response(URI.parse(uri)) - true - rescue - false - end - - def self.valid? uri - u = URI::parse(uri) - u.scheme!=nil and u.host!=nil - rescue URI::InvalidURIError - false - end -end - # defaults to stderr, may be changed to file output $logger = OTLogger.new(STDERR) # no rotation $logger.level = Logger::DEBUG @@ -59,13 +20,15 @@ module OpenTox # Ruby interface - # override to read all error codes def metadata reload=true - if reload + if reload or @metadata.empty? @metadata = {} # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader - RestClient.get(@uri) do |response, request, result, &block| + # TODO: convert to RestClientWrapper + kind_of?(OpenTox::Dataset) ? uri = File.join(@uri,"metadata") : uri = @uri + RestClient.get(uri) do |response, request, result| + #response = RestClientWrapper.get(@uri) #do |response, request, result| $logger.warn "#{@uri} returned #{result}" unless response.code == 200 or response.code == 202 or URI.task? @uri RDF::Reader.for(:rdfxml).new(response) do |reader| reader.each_statement do |statement| @@ -74,6 +37,7 @@ module OpenTox end end end + #puts @metadata.inspect @metadata end @@ -88,46 +52,41 @@ module OpenTox def get params={} params[:subjectid] ||= @subjectid params[:accept] ||= 'application/rdf+xml' - @response = RestClient.get @uri, params + @response = RestClientWrapper.get @uri, params end def post payload={}, params={} params[:subjectid] ||= @subjectid params[:accept] ||= 'application/rdf+xml' - @response = RestClient.post(@uri.to_s, payload, params) - begin - @response.to_s.to_object - rescue - @response - end + @response = RestClientWrapper.post(@uri.to_s, payload, params) end def put payload={}, params={} params[:subjectid] ||= @subjectid params[:accept] ||= 'application/rdf+xml' - @response = RestClient.put(@uri.to_s, payload, params) + @response = RestClientWrapper.put(@uri.to_s, payload, params) end def delete params={} params[:subjectid] ||= @subjectid params[:accept] ||= 'application/rdf+xml' - @response = RestClient.delete(@uri.to_s,:subjectid => @subjectid) + @response = RestClientWrapper.delete(@uri.to_s,:subjectid => @subjectid) end # class methods module ClassMethods def create service_uri, subjectid=nil - uri = RestClient.post(service_uri, {}, :subjectid => subjectid).chomp + uri = RestClientWrapper.post(service_uri, {}, :subjectid => subjectid).chomp subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")") end def from_file service_uri, file, subjectid=nil - RestClient.post(service_uri, :file => File.new(file), :subjectid => subjectid).chomp.to_object + RestClientWrapper.post(service_uri, :file => File.new(file), :subjectid => subjectid).chomp.to_object end def all service_uri, subjectid=nil - uris = RestClient.get(service_uri, {:accept => 'text/uri-list'}).split("\n").compact + uris = RestClientWrapper.get(service_uri, {:accept => 'text/uri-list'}).split("\n").compact uris.collect{|uri| subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")")} end diff --git a/lib/overwrite.rb b/lib/overwrite.rb new file mode 100644 index 0000000..e883d45 --- /dev/null +++ b/lib/overwrite.rb @@ -0,0 +1,39 @@ +class String + def underscore + self.gsub(/::/, '/'). + gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). + gsub(/([a-z\d])([A-Z])/,'\1_\2'). + tr("-", "_"). + downcase + end +end + +module URI + + def self.task? uri + uri =~ /task/ and URI.valid? uri + end + + def self.dataset? uri, subjectid=nil + uri =~ /dataset/ and URI.accessible? uri, subjectid=nil + end + + def self.model? uri, subjectid=nil + uri =~ /model/ and URI.accessible? uri, subjectid=nil + end + + def self.accessible? uri, subjectid=nil + Net::HTTP.get_response(URI.parse(uri)) + true + rescue + false + end + + def self.valid? uri + u = URI::parse(uri) + u.scheme!=nil and u.host!=nil + rescue URI::InvalidURIError + false + end +end + diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb new file mode 100644 index 0000000..89de277 --- /dev/null +++ b/lib/rest_client_wrapper.rb @@ -0,0 +1,182 @@ +module OpenTox + + class WrapperResult < String + attr_accessor :content_type, :code + end + + class RestClientWrapper + + # performs a GET REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # per default: waits for Task to finish and returns result URI of Task + # @param [String] uri destination URI + # @param [optional,Hash] headers contains params like accept-header + # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param [wait,Boolean] wait set to false to NOT wait for task if result is task + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def self.get(uri, headers={}, waiting_task=nil, wait=true ) + execute( "get", uri, nil, headers, waiting_task, wait) + end + + # performs a POST REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # per default: waits for Task to finish and returns result URI of Task + # @param [String] uri destination URI + # @param [optional,String] payload data posted to the service + # @param [optional,Hash] headers contains params like accept-header + # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param [wait,Boolean] wait set to false to NOT wait for task if result is task + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def self.post(uri, payload=nil, headers={}, waiting_task=nil, wait=true ) + execute( "post", uri, payload, headers, waiting_task, wait ) + end + + # performs a PUT REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # @param [String] uri destination URI + # @param [optional,Hash] headers contains params like accept-header + # @param [optional,String] payload data put to the service + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def self.put(uri, payload=nil, headers={} ) + execute( "put", uri, payload, headers ) + end + + # performs a DELETE REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # @param [String] uri destination URI + # @param [optional,Hash] headers contains params like accept-header + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def self.delete(uri, headers=nil ) + execute( "delete", uri, nil, headers) + end + + private + def self.execute( rest_call, uri, payload=nil, headers={}, waiting_task=nil, wait=true ) + + raise OpenTox::BadRequestError.new "uri is null" unless uri + raise OpenTox::BadRequestError.new "not a uri: "+uri.to_s unless URI.valid? uri.to_s + raise "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) + raise OpenTox::BadRequestError.new "accept should go into the headers" if payload and payload.is_a?(Hash) and payload[:accept] + raise OpenTox::BadRequestError.new "content_type should go into the headers" if payload and payload.is_a?(Hash) and payload[:content_type] + raise "__waiting_task__ must be 'nil' or '(sub)task', is "+waiting_task.class.to_s if + waiting_task!=nil and !(waiting_task.is_a?(Task) || waiting_task.is_a?(SubTask)) + headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems + ## PENDING partner services accept subjectid only in header + headers = {} unless headers + headers[:subjectid] = payload.delete(:subjectid) if payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) + + # PENDING needed for NUTA, until we finally agree on how to send subjectid + headers[:subjectid] = payload.delete(:subjectid) if uri=~/ntua/ and payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) + + begin + #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect+" "+payload.inspect + resource = RestClient::Resource.new(uri,{:timeout => 600}) + if rest_call=="post" || rest_call=="put" + result = resource.send(rest_call, payload, headers){|response, request, result| response } + else + result = resource.send(rest_call, headers){|response, request, result| response } + end + #LOGGER.debug "result body size: #{result.body.size}" + + # PENDING NTUA does return errors with 200 + raise RestClient::ExceptionWithResponse.new(result) if uri=~/ntua/ and result.body =~ /about.*http:\/\/anonymous.org\/error/ + + # result is a string, with the additional fields content_type and code + res = WrapperResult.new(result.body) + res.content_type = result.headers[:content_type] + raise "content-type not set" unless res.content_type + res.code = result.code + + # TODO: Ambit returns task representation with 200 instead of result URI + return res if res.code==200 || !wait + + while (res.code==201 || res.code==202) + res = wait_for_task(res, uri, waiting_task) + end + raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200 + return res + + rescue RestClient::RequestTimeout => ex + received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue Errno::ETIMEDOUT => ex + received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue Errno::ECONNREFUSED => ex + received_error ex.message, 500, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue RestClient::ExceptionWithResponse => ex + # error comming from a different webservice, + received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue OpenTox::RestCallError => ex + # already a rest-error, probably comes from wait_for_task, just pass through + raise ex + rescue => ex + # some internal error occuring in rest_client_wrapper, just pass through + raise ex + end + end + + def self.wait_for_task( res, base_uri, waiting_task=nil ) + #TODO remove TUM hack + res.content_type = "text/uri-list" if base_uri =~/tu-muenchen/ and res.content_type == "application/x-www-form-urlencoded;charset=UTF-8" + + task = nil + case res.content_type + when /application\/rdf\+xml/ + task = OpenTox::Task.from_rdfxml(res) + when /yaml/ + task = OpenTox::Task.from_yaml(res) + when /text\// + raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task + task = OpenTox::Task.find(res.to_s.chomp) if res.to_s.uri? + else + raise "unknown content-type for task : '"+res.content_type.to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+res[0..200].to_s + end + + #LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" + task.wait_for_completion waiting_task + unless task.completed? # maybe task was cancelled / error + if task.errorReport + received_error task.errorReport, task.http_code, nil, {:rest_uri => task.uri, :rest_code => task.http_code} + else + raise "status of task '"+task.uri.to_s+"' is no longer running (hasStatus is '"+task.status+ + "'), but it is neither completed nor has an errorReport" + end + end + + res = WrapperResult.new task.result_uri + res.code = task.http_code + res.content_type = "text/uri-list" + return res + end + + def self.received_error( body, code, content_type=nil, params=nil ) + + # try to parse body + report = nil + if body.is_a?(OpenTox::ErrorReport) + report = body + else + case content_type + when /yaml/ + report = YAML.load(body) + when /rdf/ + report = OpenTox::ErrorReport.from_rdf(body) + end + end + + unless report + # parsing was not successfull + # raise 'plain' RestCallError + err = OpenTox::RestCallError.new("REST call returned error: '"+body.to_s+"'") + err.rest_params = params + raise err + else + # parsing sucessfull + # raise RestCallError with parsed report as error cause + err = OpenTox::RestCallError.new("REST call subsequent error") + err.errorCause = report + err.rest_params = params + raise err + end + end + end +end diff --git a/lib/task.rb b/lib/task.rb index 9aaee04..286e998 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -7,7 +7,7 @@ module OpenTox attr_accessor :pid, :observer_pid def self.create service_uri, params={} - task = Task.new RestClient.post(service_uri,params).chomp + task = Task.new RestClientWrapper.post(service_uri,params).chomp pid = fork do begin result_uri = yield @@ -53,20 +53,20 @@ module OpenTox def cancel kill - RestClient.put(File.join(@uri,'Cancelled'),{}) + RestClientWrapper.put(File.join(@uri,'Cancelled'),{}) end def completed(uri) #TODO: subjectid? #TODO: error code raise "\"#{uri}\" does not exist." unless URI.accessible? uri - RestClient.put(File.join(@uri,'Completed'),{:resultURI => uri}) + RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) end def error error $logger.error self if $logger report = ErrorReport.create(error,"http://localhost") - RestClient.put(File.join(@uri,'Error'),{:errorReport => report}) + RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => report}) kill end @@ -104,7 +104,7 @@ module OpenTox begin case method when /=/ - res = RestClient.put(File.join(@uri,method.sub(/=/,'')),{}) + res = RestClientWrapper.put(File.join(@uri,method.sub(/=/,'')),{}) super unless res.code == 200 #when /\?/ #return hasStatus == method.sub(/\?/,'').capitalize diff --git a/test/rest.rb b/test/rest.rb deleted file mode 100644 index 412e265..0000000 --- a/test/rest.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'test/unit' -$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') -require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' - -class RestTest < Test::Unit::TestCase - - def test_post_get_delete - service_uri = "http://ot-dev.in-silico.ch/dataset" - dataset = OpenTox::Dataset.create service_uri - assert_match /#{service_uri}/, dataset.uri.to_s - puts dataset.uri - puts dataset.class - puts dataset.to_yaml - metadata = dataset.metadata - puts dataset.class -=begin - assert_equal RDF::OT.Dataset, metadata[RDF.type] - assert_equal dataset.uri, metadata[RDF::XSD.anyURI] -=end - dataset.delete - end - -end diff --git a/test/ruby-api.rb b/test/ruby-api.rb deleted file mode 100644 index 0c9386b..0000000 --- a/test/ruby-api.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'test/unit' -$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') -require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' - -class RubyAPITest < Test::Unit::TestCase - - def test_all - datasets = OpenTox::Dataset.all "http://ot-dev.in-silico.ch/dataset" - assert_equal OpenTox::Dataset, datasets.first.class - assert_equal RDF::OT.Dataset, datasets.last.metadata[RDF.type] - end -=begin - - def test_create - d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset" - puts d.inspect - assert_equal OpenTox::Dataset, d.class - assert_equal RDF::OT.Dataset, d.metadata[RDF.type] - d.delete - end - - def test_save - d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset" - d.metadata - d.metadata[RDF::DC.title] = "test" - d.save - # TODO: save does not work with datasets - #puts d.response.code.inspect - #assert_equal "test", d.metadata[RDF::DC.title] # should reload metadata - d.delete - end -=end - -end -- cgit v1.2.3 From f40871b9b60ae706c0668c9ac4cfbfff866ce5dc Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 28 Feb 2012 17:13:20 +0000 Subject: generic rest-client calls ignoring http errors from task services --- lib/error.rb | 2 +- lib/opentox-client.rb | 2 +- lib/opentox.rb | 16 +-- lib/rest-client-wrapper.rb | 280 +++++++++++++++++++++++++++++++++++++++++++++ lib/rest_client_wrapper.rb | 182 ----------------------------- lib/task.rb | 32 +++--- test/task.rb | 6 +- 7 files changed, 306 insertions(+), 214 deletions(-) create mode 100644 lib/rest-client-wrapper.rb delete mode 100644 lib/rest_client_wrapper.rb diff --git a/lib/error.rb b/lib/error.rb index 6987f35..1866585 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,6 +1,6 @@ # adding additional fields to Exception class to format errors according to OT-API class Exception - attr_accessor :errorCause + attr_accessor :errorCause # is errorReport def http_code; 500; end end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 1a5e7c3..a587aa5 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -8,7 +8,7 @@ require 'yaml' require 'logger' require File.join(File.dirname(__FILE__),"overwrite.rb") require File.join(File.dirname(__FILE__),"error.rb") -require File.join(File.dirname(__FILE__),"rest_client_wrapper.rb") +require File.join(File.dirname(__FILE__),"rest-client-wrapper.rb") require File.join(File.dirname(__FILE__),"otlogger.rb") # avoid require conflicts with logger require File.join(File.dirname(__FILE__),"opentox.rb") require File.join(File.dirname(__FILE__),"task.rb") diff --git a/lib/opentox.rb b/lib/opentox.rb index f81ae10..145aeb6 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -20,24 +20,16 @@ module OpenTox # Ruby interface - # override to read all error codes def metadata reload=true if reload or @metadata.empty? @metadata = {} - # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader - # TODO: convert to RestClientWrapper kind_of?(OpenTox::Dataset) ? uri = File.join(@uri,"metadata") : uri = @uri - RestClient.get(uri) do |response, request, result| - #response = RestClientWrapper.get(@uri) #do |response, request, result| - $logger.warn "#{@uri} returned #{result}" unless response.code == 200 or response.code == 202 or URI.task? @uri - RDF::Reader.for(:rdfxml).new(response) do |reader| - reader.each_statement do |statement| - @metadata[statement.predicate] = statement.object if statement.subject == @uri - end + RDF::Reader.for(:rdfxml).new( RestClientWrapper.get(@uri) ) do |reader| + reader.each_statement do |statement| + @metadata[statement.predicate] = statement.object if statement.subject == @uri end end end - #puts @metadata.inspect @metadata end @@ -52,7 +44,7 @@ module OpenTox def get params={} params[:subjectid] ||= @subjectid params[:accept] ||= 'application/rdf+xml' - @response = RestClientWrapper.get @uri, params + @response = RestClientWrapper.get @uri, {}, params end def post payload={}, params={} diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb new file mode 100644 index 0000000..95aee8e --- /dev/null +++ b/lib/rest-client-wrapper.rb @@ -0,0 +1,280 @@ +module OpenTox + + class WrapperResult < String + attr_accessor :content_type, :code + end + + class RestClientWrapper + + # create REST class methods + [:head,:get,:post,:put,:dealete].each do |method| + + #define_singleton_method method do |uri,args={},headers={},waiting_task=nil, wait=true| + define_singleton_method method do |uri,payload={},headers={},waiting_task=nil, wait=true| + + args={} + args[:method] = method + args[:url] = uri + args[:timeout] = 600 + args[:payload] = payload + args[:headers] = headers + #raise OpenTox::BadRequestError.new "Empty URI." unless uri # error raised at method call + raise OpenTox::BadRequestError.new "Invalid URI: '#{uri}'" unless URI.valid? uri + raise OpenTox::BadRequestError.new "Unreachable URI: '#{uri}'" unless URI.accessible? uri +=begin + raise "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) + # TODO: loop over accept, contant_type, subjectid + raise OpenTox::BadRequestError.new "accept should go into the headers" if payload and payload.is_a?(Hash) and payload[:accept] + raise OpenTox::BadRequestError.new "content_type should go into the headers" if payload and payload.is_a?(Hash) and payload[:content_type] + raise OpenTox::BadRequestError.new "subjectid should go into the headers" if payload and payload.is_a?(Hash) and payload[:subjectid] + raise "__waiting_task__ must be 'nil' or '(sub)task', is "+waiting_task.class.to_s if + waiting_task!=nil and !(waiting_task.is_a?(Task) || waiting_task.is_a?(SubTask)) + headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems + ## PENDING partner services accept subjectid only in header + headers = {} unless headers + #headers[:subjectid] = payload.delete(:subjectid) if payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) + + # PENDING needed for NUTA, until we finally agree on how to send subjectid + #headers[:subjectid] = payload.delete(:subjectid) if uri=~/ntua/ and payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) +=end + + begin + #$logger.debug "RestCall: "+method.to_s+" "+uri.to_s+" "+headers.inspect+" "+args.inspect + request = RestClient::Request.new(args) + result = request.execute do |response, request, result| + unless response.code < 400 or URI.task? uri + $logger.error "#{uri} returned #{result.inspect}" + raise OpenTox::RestCallError result.inspect + end + return response + end + # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader + #LOGGER.debug "result body size: #{result.body.size}" + + # PENDING NTUA does return errors with 200 + raise RestClient::ExceptionWithResponse.new(result) if uri=~/ntua/ and result.body =~ /about.*http:\/\/anonymous.org\/error/ + + # result is a string, with the additional fields content_type and code + res = WrapperResult.new(result.body) + res.content_type = result.headers[:content_type] + raise "content-type not set" unless res.content_type + res.code = result.code + + # TODO: Ambit returns task representation with 200 instead of result URI + return res if res.code==200 || !wait + + while (res.code==201 || res.code==202) + res = wait_for_task(res, uri, waiting_task) + end + raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200 + return res + + rescue RestClient::RequestTimeout => ex + received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue Errno::ETIMEDOUT => ex + received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue Errno::ECONNREFUSED => ex + received_error ex.message, 500, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue RestClient::ExceptionWithResponse => ex + # error comming from a different webservice, + received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue OpenTox::RestCallError => ex + # already a rest-error, probably comes from wait_for_task, just pass through + raise ex + rescue => ex + # some internal error occuring in rest-client-wrapper, just pass through + raise ex + end + end + end + +=begin + # performs a GET REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # per default: waits for Task to finish and returns result URI of Task + # @param [String] uri destination URI + # @param [optional,Hash] headers contains params like accept-header + # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param [wait,Boolean] wait set to false to NOT wait for task if result is task + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def self.get(uri, headers={}, waiting_task=nil, wait=true ) + execute( "get", uri, nil, headers, waiting_task, wait) + end + + # performs a POST REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # per default: waits for Task to finish and returns result URI of Task + # @param [String] uri destination URI + # @param [optional,String] payload data posted to the service + # @param [optional,Hash] headers contains params like accept-header + # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param [wait,Boolean] wait set to false to NOT wait for task if result is task + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def self.post(uri, payload=nil, headers={}, waiting_task=nil, wait=true ) + execute( "post", uri, payload, headers, waiting_task, wait ) + end + + # performs a PUT REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # @param [String] uri destination URI + # @param [optional,Hash] headers contains params like accept-header + # @param [optional,String] payload data put to the service + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def self.put(uri, payload=nil, headers={} ) + execute( "put", uri, payload, headers ) + end + + # performs a DELETE REST call + # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # @param [String] uri destination URI + # @param [optional,Hash] headers contains params like accept-header + # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call + def self.delete(uri, headers=nil ) + execute( "delete", uri, nil, headers) + end + + def self.head(uri) + execute("head",uri) + end + + private + def self.execute( rest_call, uri, payload=nil, headers={}, waiting_task=nil, wait=true ) + + raise OpenTox::BadRequestError.new "Empty URI." unless uri + raise OpenTox::BadRequestError.new "Invalid URI: '#{uri}'" unless URI.valid? uri + raise OpenTox::BadRequestError.new "Unreachable URI: '#{uri}'" unless URI.accessible? uri + raise "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) + # TODO: loop over accept, contant_type, subjectid + raise OpenTox::BadRequestError.new "accept should go into the headers" if payload and payload.is_a?(Hash) and payload[:accept] + raise OpenTox::BadRequestError.new "content_type should go into the headers" if payload and payload.is_a?(Hash) and payload[:content_type] + raise OpenTox::BadRequestError.new "subjectid should go into the headers" if payload and payload.is_a?(Hash) and payload[:subjectid] + raise "__waiting_task__ must be 'nil' or '(sub)task', is "+waiting_task.class.to_s if + waiting_task!=nil and !(waiting_task.is_a?(Task) || waiting_task.is_a?(SubTask)) + headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems + ## PENDING partner services accept subjectid only in header + headers = {} unless headers + #headers[:subjectid] = payload.delete(:subjectid) if payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) + + # PENDING needed for NUTA, until we finally agree on how to send subjectid + #headers[:subjectid] = payload.delete(:subjectid) if uri=~/ntua/ and payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) + + begin + #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect+" "+payload.inspect + resource = RestClient::Resource.new(uri,{:timeout => 600}) + if rest_call=="post" || rest_call=="put" + result = resource.send(rest_call, payload, headers){|response, request, result| return response } + elsif rest_call == "head" + result = resource.send(rest_call){ |response, request, result| return response } + else + result = resource.send(rest_call, headers){|response, request, result| return response } + end + # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader + unless result.code < 400 or URI.task? @uri + $logger.error "#{@uri} returned #{result}" + raise OpenTox::RestCallError result + end + #LOGGER.debug "result body size: #{result.body.size}" + + # PENDING NTUA does return errors with 200 + raise RestClient::ExceptionWithResponse.new(result) if uri=~/ntua/ and result.body =~ /about.*http:\/\/anonymous.org\/error/ + + # result is a string, with the additional fields content_type and code + res = WrapperResult.new(result.body) + res.content_type = result.headers[:content_type] + raise "content-type not set" unless res.content_type + res.code = result.code + + # TODO: Ambit returns task representation with 200 instead of result URI + return res if res.code==200 || !wait + + while (res.code==201 || res.code==202) + res = wait_for_task(res, uri, waiting_task) + end + raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200 + return res + + rescue RestClient::RequestTimeout => ex + received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue Errno::ETIMEDOUT => ex + received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue Errno::ECONNREFUSED => ex + received_error ex.message, 500, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue RestClient::ExceptionWithResponse => ex + # error comming from a different webservice, + received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue OpenTox::RestCallError => ex + # already a rest-error, probably comes from wait_for_task, just pass through + raise ex + rescue => ex + # some internal error occuring in rest-client-wrapper, just pass through + raise ex + end + end +=end + + def self.wait_for_task( res, base_uri, waiting_task=nil ) + #TODO remove TUM hack + res.content_type = "text/uri-list" if base_uri =~/tu-muenchen/ and res.content_type == "application/x-www-form-urlencoded;charset=UTF-8" + + task = nil + case res.content_type + when /application\/rdf\+xml/ + task = OpenTox::Task.from_rdfxml(res) + when /yaml/ + task = OpenTox::Task.from_yaml(res) + when /text\// + raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task + task = OpenTox::Task.find(res.to_s.chomp) if res.to_s.uri? + else + raise "unknown content-type for task : '"+res.content_type.to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+res[0..200].to_s + end + + #LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" + task.wait waiting_task + unless task.completed? # maybe task was cancelled / error + if task.errorReport + received_error task.errorReport, task.http_code, nil, {:rest_uri => task.uri, :rest_code => task.http_code} + else + raise "status of task '"+task.uri.to_s+"' is no longer running (hasStatus is '"+task.status+ + "'), but it is neither completed nor has an errorReport" + end + end + + res = WrapperResult.new task.result_uri + res.code = task.http_code + res.content_type ="text/uri-list" + return res + end + + def self.received_error( body, code, content_type=nil, params=nil ) + + # try to parse body + report = nil + if body.is_a?(OpenTox::ErrorReport) + report = body + else + case content_type + when /yaml/ + report = YAML.load(body) + when /rdf/ + report = OpenTox::ErrorReport.from_rdf(body) + end + end + + unless report + # parsing was not successfull + # raise 'plain' RestCallError + err = OpenTox::RestCallError.new("REST call returned error: '"+body.to_s+"'") + err.rest_params = params + raise err + else + # parsing sucessfull + # raise RestCallError with parsed report as error cause + err = OpenTox::RestCallError.new("REST call subsequent error") + err.errorCause = report + err.rest_params = params + raise err + end + end + end +end diff --git a/lib/rest_client_wrapper.rb b/lib/rest_client_wrapper.rb deleted file mode 100644 index 89de277..0000000 --- a/lib/rest_client_wrapper.rb +++ /dev/null @@ -1,182 +0,0 @@ -module OpenTox - - class WrapperResult < String - attr_accessor :content_type, :code - end - - class RestClientWrapper - - # performs a GET REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # per default: waits for Task to finish and returns result URI of Task - # @param [String] uri destination URI - # @param [optional,Hash] headers contains params like accept-header - # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @param [wait,Boolean] wait set to false to NOT wait for task if result is task - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.get(uri, headers={}, waiting_task=nil, wait=true ) - execute( "get", uri, nil, headers, waiting_task, wait) - end - - # performs a POST REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # per default: waits for Task to finish and returns result URI of Task - # @param [String] uri destination URI - # @param [optional,String] payload data posted to the service - # @param [optional,Hash] headers contains params like accept-header - # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @param [wait,Boolean] wait set to false to NOT wait for task if result is task - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.post(uri, payload=nil, headers={}, waiting_task=nil, wait=true ) - execute( "post", uri, payload, headers, waiting_task, wait ) - end - - # performs a PUT REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # @param [String] uri destination URI - # @param [optional,Hash] headers contains params like accept-header - # @param [optional,String] payload data put to the service - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.put(uri, payload=nil, headers={} ) - execute( "put", uri, payload, headers ) - end - - # performs a DELETE REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # @param [String] uri destination URI - # @param [optional,Hash] headers contains params like accept-header - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.delete(uri, headers=nil ) - execute( "delete", uri, nil, headers) - end - - private - def self.execute( rest_call, uri, payload=nil, headers={}, waiting_task=nil, wait=true ) - - raise OpenTox::BadRequestError.new "uri is null" unless uri - raise OpenTox::BadRequestError.new "not a uri: "+uri.to_s unless URI.valid? uri.to_s - raise "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) - raise OpenTox::BadRequestError.new "accept should go into the headers" if payload and payload.is_a?(Hash) and payload[:accept] - raise OpenTox::BadRequestError.new "content_type should go into the headers" if payload and payload.is_a?(Hash) and payload[:content_type] - raise "__waiting_task__ must be 'nil' or '(sub)task', is "+waiting_task.class.to_s if - waiting_task!=nil and !(waiting_task.is_a?(Task) || waiting_task.is_a?(SubTask)) - headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems - ## PENDING partner services accept subjectid only in header - headers = {} unless headers - headers[:subjectid] = payload.delete(:subjectid) if payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) - - # PENDING needed for NUTA, until we finally agree on how to send subjectid - headers[:subjectid] = payload.delete(:subjectid) if uri=~/ntua/ and payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) - - begin - #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect+" "+payload.inspect - resource = RestClient::Resource.new(uri,{:timeout => 600}) - if rest_call=="post" || rest_call=="put" - result = resource.send(rest_call, payload, headers){|response, request, result| response } - else - result = resource.send(rest_call, headers){|response, request, result| response } - end - #LOGGER.debug "result body size: #{result.body.size}" - - # PENDING NTUA does return errors with 200 - raise RestClient::ExceptionWithResponse.new(result) if uri=~/ntua/ and result.body =~ /about.*http:\/\/anonymous.org\/error/ - - # result is a string, with the additional fields content_type and code - res = WrapperResult.new(result.body) - res.content_type = result.headers[:content_type] - raise "content-type not set" unless res.content_type - res.code = result.code - - # TODO: Ambit returns task representation with 200 instead of result URI - return res if res.code==200 || !wait - - while (res.code==201 || res.code==202) - res = wait_for_task(res, uri, waiting_task) - end - raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200 - return res - - rescue RestClient::RequestTimeout => ex - received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue Errno::ETIMEDOUT => ex - received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue Errno::ECONNREFUSED => ex - received_error ex.message, 500, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue RestClient::ExceptionWithResponse => ex - # error comming from a different webservice, - received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue OpenTox::RestCallError => ex - # already a rest-error, probably comes from wait_for_task, just pass through - raise ex - rescue => ex - # some internal error occuring in rest_client_wrapper, just pass through - raise ex - end - end - - def self.wait_for_task( res, base_uri, waiting_task=nil ) - #TODO remove TUM hack - res.content_type = "text/uri-list" if base_uri =~/tu-muenchen/ and res.content_type == "application/x-www-form-urlencoded;charset=UTF-8" - - task = nil - case res.content_type - when /application\/rdf\+xml/ - task = OpenTox::Task.from_rdfxml(res) - when /yaml/ - task = OpenTox::Task.from_yaml(res) - when /text\// - raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task - task = OpenTox::Task.find(res.to_s.chomp) if res.to_s.uri? - else - raise "unknown content-type for task : '"+res.content_type.to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+res[0..200].to_s - end - - #LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" - task.wait_for_completion waiting_task - unless task.completed? # maybe task was cancelled / error - if task.errorReport - received_error task.errorReport, task.http_code, nil, {:rest_uri => task.uri, :rest_code => task.http_code} - else - raise "status of task '"+task.uri.to_s+"' is no longer running (hasStatus is '"+task.status+ - "'), but it is neither completed nor has an errorReport" - end - end - - res = WrapperResult.new task.result_uri - res.code = task.http_code - res.content_type = "text/uri-list" - return res - end - - def self.received_error( body, code, content_type=nil, params=nil ) - - # try to parse body - report = nil - if body.is_a?(OpenTox::ErrorReport) - report = body - else - case content_type - when /yaml/ - report = YAML.load(body) - when /rdf/ - report = OpenTox::ErrorReport.from_rdf(body) - end - end - - unless report - # parsing was not successfull - # raise 'plain' RestCallError - err = OpenTox::RestCallError.new("REST call returned error: '"+body.to_s+"'") - err.rest_params = params - raise err - else - # parsing sucessfull - # raise RestCallError with parsed report as error cause - err = OpenTox::RestCallError.new("REST call subsequent error") - err.errorCause = report - err.rest_params = params - raise err - end - end - end -end diff --git a/lib/task.rb b/lib/task.rb index 286e998..635584f 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -6,7 +6,9 @@ module OpenTox class Task attr_accessor :pid, :observer_pid + def self.create service_uri, params={} + task = Task.new RestClientWrapper.post(service_uri,params).chomp pid = fork do begin @@ -17,19 +19,15 @@ module OpenTox raise "#{result_uri} is not a valid URI" end rescue - # TODO add service URI to Kernel.raise - # serialize error and send to task service - #task.error $! task.error $! - raise end end Process.detach(pid) task.pid = pid - # watch if task has been cancelled + # watch if task has been cancelled observer_pid = fork do - task.wait_for_completion + task.wait begin Process.kill(9,task.pid) if task.cancelled? rescue @@ -39,6 +37,7 @@ module OpenTox Process.detach(observer_pid) task.observer_pid = observer_pid task + end def kill @@ -50,6 +49,10 @@ module OpenTox def description metadata[RDF::DC.description] end + + def creator + metadata[RDF::DC.creator] + end def cancel kill @@ -64,15 +67,16 @@ module OpenTox end def error error - $logger.error self if $logger - report = ErrorReport.create(error,"http://localhost") + $logger.error self + report = ErrorReport.create(error,self.creator) RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => report}) kill + raise error end # waits for a task, unless time exceeds or state is no longer running # @param [optional,Numeric] dur seconds pausing before checking again for completion - def wait_for_completion(dur=0.3) + def wait(dur=0.3) due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION while running? sleep dur @@ -84,19 +88,19 @@ module OpenTox # get only header for ststus requests def running? - RestClient.head(@uri){ |response, request, result| result.code.to_i == 202 } + RestClientWrapper.head(@uri).code == 202 end def cancelled? - RestClient.head(@uri){ |response, request, result| result.code.to_i == 503 } + RestClientWrapper.head(@uri).code == 503 end def completed? - RestClient.head(@uri){ |response, request, result| result.code.to_i == 200 } + RestClientWrapper.head(@uri).code == 200 end def error? - RestClient.head(@uri){ |response, request, result| result.code.to_i == 500 } + RestClientWrapper.head(@uri).code == 500 end def method_missing(method,*args) @@ -106,8 +110,6 @@ module OpenTox when /=/ res = RestClientWrapper.put(File.join(@uri,method.sub(/=/,'')),{}) super unless res.code == 200 - #when /\?/ - #return hasStatus == method.sub(/\?/,'').capitalize else response = metadata[RDF::OT[method]].to_s response = metadata[RDF::OT1[method]].to_s #if response.empty? # API 1.1 compatibility diff --git a/test/task.rb b/test/task.rb index 56b21cf..662a24d 100644 --- a/test/task.rb +++ b/test/task.rb @@ -25,7 +25,7 @@ class TaskTest < Test::Unit::TestCase end assert task.running? assert_equal "Running", task.hasStatus - task.wait_for_completion + task.wait assert task.completed? assert_equal "Completed", task.hasStatus assert_equal TASK_SERVICE_URI, task.resultURI @@ -49,7 +49,7 @@ class TaskTest < Test::Unit::TestCase end assert task.running? assert_equal "Running", task.hasStatus - task.wait_for_completion + task.wait assert task.error? assert_equal "Error", task.hasStatus end @@ -61,7 +61,7 @@ class TaskTest < Test::Unit::TestCase end assert task.running? assert_equal "Running", task.hasStatus - task.wait_for_completion + task.wait assert task.error? assert_equal "Error", task.hasStatus end -- cgit v1.2.3 From f0d38b06cbdcfd59494c220e6f4685f2e5aa38fd Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 29 Feb 2012 15:06:27 +0000 Subject: logging in error.rb, dynamic class methods in rest-client-wrapper.rb --- lib/error.rb | 17 +++- lib/opentox.rb | 32 +++---- lib/rest-client-wrapper.rb | 232 +++++++++------------------------------------ test/task.rb | 4 +- 4 files changed, 77 insertions(+), 208 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 1866585..b832ef4 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,6 +1,15 @@ # adding additional fields to Exception class to format errors according to OT-API +=begin class Exception +end +=end + +class RuntimeError attr_accessor :errorCause # is errorReport + def initialize msg=nil + $logger.error msg + super msg + end def http_code; 500; end end @@ -26,13 +35,15 @@ module OpenTox def http_code; 503; end end - # TODO: add to RestClientCalls class RestCallError < RuntimeError - attr_accessor :rest_params + def initialize request, response, expectation=nil + msg = "REST request: #{request.inspect}\nREST response: #{response.inspect}" + msg += "\n"+expectation if expectation + super msg + end def http_code; 502; end end - # TODO: add to Exception class?? class ErrorReport # TODO replace params with URIs (errorCause -> OT.errorCause) diff --git a/lib/opentox.rb b/lib/opentox.rb index 145aeb6..4c2a668 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -41,27 +41,27 @@ module OpenTox end # REST API - def get params={} - params[:subjectid] ||= @subjectid - params[:accept] ||= 'application/rdf+xml' - @response = RestClientWrapper.get @uri, {}, params + def get headers={} + headers[:subjectid] ||= @subjectid + headers[:accept] ||= 'application/rdf+xml' + @response = RestClientWrapper.get @uri, {}, headers end - def post payload={}, params={} - params[:subjectid] ||= @subjectid - params[:accept] ||= 'application/rdf+xml' - @response = RestClientWrapper.post(@uri.to_s, payload, params) + def post payload={}, headers={} + headers[:subjectid] ||= @subjectid + headers[:accept] ||= 'application/rdf+xml' + @response = RestClientWrapper.post(@uri.to_s, payload, headers) end - def put payload={}, params={} - params[:subjectid] ||= @subjectid - params[:accept] ||= 'application/rdf+xml' - @response = RestClientWrapper.put(@uri.to_s, payload, params) + def put payload={}, headers={} + headers[:subjectid] ||= @subjectid + headers[:accept] ||= 'application/rdf+xml' + @response = RestClientWrapper.put(@uri.to_s, payload, headers) end - def delete params={} - params[:subjectid] ||= @subjectid - params[:accept] ||= 'application/rdf+xml' + def delete headers={} + headers[:subjectid] ||= @subjectid + headers[:accept] ||= 'application/rdf+xml' @response = RestClientWrapper.delete(@uri.to_s,:subjectid => @subjectid) end @@ -78,7 +78,7 @@ module OpenTox end def all service_uri, subjectid=nil - uris = RestClientWrapper.get(service_uri, {:accept => 'text/uri-list'}).split("\n").compact + uris = RestClientWrapper.get(service_uri, nil, {:accept => 'text/uri-list'}).split("\n").compact uris.collect{|uri| subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")")} end diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 95aee8e..27538e4 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -1,73 +1,57 @@ module OpenTox - class WrapperResult < String - attr_accessor :content_type, :code - end - class RestClientWrapper - # create REST class methods + # REST methods + # Raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) + # Waits for Task to finish and returns result URI of Task per default + # @param [String] destination URI + # @param [optional,Hash|String] Payload data posted to the service + # @param [optional,Hash] Headers with params like :accept, :content_type, :subjectid + # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param [wait,Boolean] Set to false to NOT wait for task if result is a task + # @return [RestClient::Response] REST call response [:head,:get,:post,:put,:dealete].each do |method| - #define_singleton_method method do |uri,args={},headers={},waiting_task=nil, wait=true| define_singleton_method method do |uri,payload={},headers={},waiting_task=nil, wait=true| + # catch input errors + raise OpenTox::BadRequestError.new "Invalid URI: '#{uri}'" unless URI.valid? uri + raise OpenTox::BadRequestError.new "Unreachable URI: '#{uri}'" unless URI.accessible? uri + raise OpenTox::BadRequestError.new "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) + [:accept,:content_type,:subjectid].each do |header| + raise OpenTox::BadRequestError.new "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] + end + raise OpenTox::BadRequestError "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) + args={} args[:method] = method args[:url] = uri args[:timeout] = 600 args[:payload] = payload - args[:headers] = headers - #raise OpenTox::BadRequestError.new "Empty URI." unless uri # error raised at method call - raise OpenTox::BadRequestError.new "Invalid URI: '#{uri}'" unless URI.valid? uri - raise OpenTox::BadRequestError.new "Unreachable URI: '#{uri}'" unless URI.accessible? uri -=begin - raise "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) - # TODO: loop over accept, contant_type, subjectid - raise OpenTox::BadRequestError.new "accept should go into the headers" if payload and payload.is_a?(Hash) and payload[:accept] - raise OpenTox::BadRequestError.new "content_type should go into the headers" if payload and payload.is_a?(Hash) and payload[:content_type] - raise OpenTox::BadRequestError.new "subjectid should go into the headers" if payload and payload.is_a?(Hash) and payload[:subjectid] - raise "__waiting_task__ must be 'nil' or '(sub)task', is "+waiting_task.class.to_s if - waiting_task!=nil and !(waiting_task.is_a?(Task) || waiting_task.is_a?(SubTask)) headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems - ## PENDING partner services accept subjectid only in header - headers = {} unless headers - #headers[:subjectid] = payload.delete(:subjectid) if payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) - - # PENDING needed for NUTA, until we finally agree on how to send subjectid - #headers[:subjectid] = payload.delete(:subjectid) if uri=~/ntua/ and payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) -=end + args[:headers] = headers + begin - #$logger.debug "RestCall: "+method.to_s+" "+uri.to_s+" "+headers.inspect+" "+args.inspect request = RestClient::Request.new(args) - result = request.execute do |response, request, result| - unless response.code < 400 or URI.task? uri - $logger.error "#{uri} returned #{result.inspect}" - raise OpenTox::RestCallError result.inspect - end + response = request.execute do |response, request, result| + # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader + raise OpenTox::RestCallError request, response unless response.code < 400 or URI.task? uri return response end - # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader - #LOGGER.debug "result body size: #{result.body.size}" + # TODO: tests for workarounds # PENDING NTUA does return errors with 200 - raise RestClient::ExceptionWithResponse.new(result) if uri=~/ntua/ and result.body =~ /about.*http:\/\/anonymous.org\/error/ - - # result is a string, with the additional fields content_type and code - res = WrapperResult.new(result.body) - res.content_type = result.headers[:content_type] - raise "content-type not set" unless res.content_type - res.code = result.code + #raise RestClient::ExceptionWithResponse.new(response) if uri=~/ntua/ and response.body =~ /about.*http:\/\/anonymous.org\/error/ - # TODO: Ambit returns task representation with 200 instead of result URI - return res if res.code==200 || !wait - - while (res.code==201 || res.code==202) - res = wait_for_task(res, uri, waiting_task) + return response if response.code==200 or wait.false? + + # wait for task + while response.code==201 or response.code==202 + response = wait_for_task(response, uri, waiting_task) end - raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200 - return res + return response rescue RestClient::RequestTimeout => ex received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} @@ -87,146 +71,24 @@ module OpenTox end end end - -=begin - # performs a GET REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # per default: waits for Task to finish and returns result URI of Task - # @param [String] uri destination URI - # @param [optional,Hash] headers contains params like accept-header - # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @param [wait,Boolean] wait set to false to NOT wait for task if result is task - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.get(uri, headers={}, waiting_task=nil, wait=true ) - execute( "get", uri, nil, headers, waiting_task, wait) - end - - # performs a POST REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # per default: waits for Task to finish and returns result URI of Task - # @param [String] uri destination URI - # @param [optional,String] payload data posted to the service - # @param [optional,Hash] headers contains params like accept-header - # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @param [wait,Boolean] wait set to false to NOT wait for task if result is task - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.post(uri, payload=nil, headers={}, waiting_task=nil, wait=true ) - execute( "post", uri, payload, headers, waiting_task, wait ) - end - - # performs a PUT REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # @param [String] uri destination URI - # @param [optional,Hash] headers contains params like accept-header - # @param [optional,String] payload data put to the service - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.put(uri, payload=nil, headers={} ) - execute( "put", uri, payload, headers ) - end - - # performs a DELETE REST call - # raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # @param [String] uri destination URI - # @param [optional,Hash] headers contains params like accept-header - # @return [OpenTox::WrapperResult] a String containing the result-body of the REST call - def self.delete(uri, headers=nil ) - execute( "delete", uri, nil, headers) - end - - def self.head(uri) - execute("head",uri) - end - - private - def self.execute( rest_call, uri, payload=nil, headers={}, waiting_task=nil, wait=true ) - - raise OpenTox::BadRequestError.new "Empty URI." unless uri - raise OpenTox::BadRequestError.new "Invalid URI: '#{uri}'" unless URI.valid? uri - raise OpenTox::BadRequestError.new "Unreachable URI: '#{uri}'" unless URI.accessible? uri - raise "headers are no hash: "+headers.inspect unless headers==nil or headers.is_a?(Hash) - # TODO: loop over accept, contant_type, subjectid - raise OpenTox::BadRequestError.new "accept should go into the headers" if payload and payload.is_a?(Hash) and payload[:accept] - raise OpenTox::BadRequestError.new "content_type should go into the headers" if payload and payload.is_a?(Hash) and payload[:content_type] - raise OpenTox::BadRequestError.new "subjectid should go into the headers" if payload and payload.is_a?(Hash) and payload[:subjectid] - raise "__waiting_task__ must be 'nil' or '(sub)task', is "+waiting_task.class.to_s if - waiting_task!=nil and !(waiting_task.is_a?(Task) || waiting_task.is_a?(SubTask)) - headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems - ## PENDING partner services accept subjectid only in header - headers = {} unless headers - #headers[:subjectid] = payload.delete(:subjectid) if payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) - - # PENDING needed for NUTA, until we finally agree on how to send subjectid - #headers[:subjectid] = payload.delete(:subjectid) if uri=~/ntua/ and payload and payload.is_a?(Hash) and payload.has_key?(:subjectid) - - begin - #LOGGER.debug "RestCall: "+rest_call.to_s+" "+uri.to_s+" "+headers.inspect+" "+payload.inspect - resource = RestClient::Resource.new(uri,{:timeout => 600}) - if rest_call=="post" || rest_call=="put" - result = resource.send(rest_call, payload, headers){|response, request, result| return response } - elsif rest_call == "head" - result = resource.send(rest_call){ |response, request, result| return response } - else - result = resource.send(rest_call, headers){|response, request, result| return response } - end - # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader - unless result.code < 400 or URI.task? @uri - $logger.error "#{@uri} returned #{result}" - raise OpenTox::RestCallError result - end - #LOGGER.debug "result body size: #{result.body.size}" - - # PENDING NTUA does return errors with 200 - raise RestClient::ExceptionWithResponse.new(result) if uri=~/ntua/ and result.body =~ /about.*http:\/\/anonymous.org\/error/ - - # result is a string, with the additional fields content_type and code - res = WrapperResult.new(result.body) - res.content_type = result.headers[:content_type] - raise "content-type not set" unless res.content_type - res.code = result.code - - # TODO: Ambit returns task representation with 200 instead of result URI - return res if res.code==200 || !wait - - while (res.code==201 || res.code==202) - res = wait_for_task(res, uri, waiting_task) - end - raise "illegal status code: '"+res.code.to_s+"'" unless res.code==200 - return res - - rescue RestClient::RequestTimeout => ex - received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue Errno::ETIMEDOUT => ex - received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue Errno::ECONNREFUSED => ex - received_error ex.message, 500, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue RestClient::ExceptionWithResponse => ex - # error comming from a different webservice, - received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue OpenTox::RestCallError => ex - # already a rest-error, probably comes from wait_for_task, just pass through - raise ex - rescue => ex - # some internal error occuring in rest-client-wrapper, just pass through - raise ex - end - end -=end - def self.wait_for_task( res, base_uri, waiting_task=nil ) + def self.wait_for_task( response, base_uri, waiting_task=nil ) #TODO remove TUM hack - res.content_type = "text/uri-list" if base_uri =~/tu-muenchen/ and res.content_type == "application/x-www-form-urlencoded;charset=UTF-8" + # response.headers[:content_type] = "text/uri-list" if base_uri =~/tu-muenchen/ and response.headers[:content_type] == "application/x-www-form-urlencoded;charset=UTF-8" + puts "TASK" + puts response.inspect task = nil - case res.content_type + case response.headers[:content_type] when /application\/rdf\+xml/ - task = OpenTox::Task.from_rdfxml(res) - when /yaml/ - task = OpenTox::Task.from_yaml(res) - when /text\// - raise "uri list has more than one entry, should be a task" if res.content_type=~/text\/uri-list/ and res.split("\n").size > 1 #if uri list contains more then one uri, its not a task - task = OpenTox::Task.find(res.to_s.chomp) if res.to_s.uri? + # TODO: task uri from rdf + #task = OpenTox::Task.from_rdfxml(response) + #task = OpenTox::Task.from_rdfxml(response) + when /text\/uri-list/ + raise OpenTox::RestCallError nil, response, "Uri list has more than one entry, should be a single task" if response.split("\n").size > 1 #if uri list contains more then one uri, its not a task + task = OpenTox::Task.new(response.to_s.chomp) if URI.available? response.to_s else - raise "unknown content-type for task : '"+res.content_type.to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+res[0..200].to_s + raise OpenTox::RestCallError nil, response, "Unknown content-type for task : '"+response.headers[:content_type].to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+response[0..200].to_s end #LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" @@ -235,15 +97,11 @@ module OpenTox if task.errorReport received_error task.errorReport, task.http_code, nil, {:rest_uri => task.uri, :rest_code => task.http_code} else - raise "status of task '"+task.uri.to_s+"' is no longer running (hasStatus is '"+task.status+ + raise OpenTox::RestCallError nil, response, "Status of task '"+task.uri.to_s+"' is no longer running (hasStatus is '"+task.status+ "'), but it is neither completed nor has an errorReport" end end - - res = WrapperResult.new task.result_uri - res.code = task.http_code - res.content_type ="text/uri-list" - return res + response end def self.received_error( body, code, content_type=nil, params=nil ) diff --git a/test/task.rb b/test/task.rb index 662a24d..ea5ee2f 100644 --- a/test/task.rb +++ b/test/task.rb @@ -3,8 +3,8 @@ $LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' #require "./validate-owl.rb" -#TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" -TASK_SERVICE_URI = "http://ot-test.in-silico.ch/task" +TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" +#TASK_SERVICE_URI = "http://ot-test.in-silico.ch/task" #TASK_SERVICE_URI = "https://ambit.uni-plovdiv.bg:8443/ambit2/task" #not compatible class TaskTest < Test::Unit::TestCase -- cgit v1.2.3 From 77a5576782b85f2e3fdaf1b65eda2543eedb6b12 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 29 Feb 2012 15:17:27 +0000 Subject: request and response as RestClientWrapper instance variables --- lib/rest-client-wrapper.rb | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 27538e4..67114fb 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -2,6 +2,8 @@ module OpenTox class RestClientWrapper + attr_accessor :request, :response + # REST methods # Raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) # Waits for Task to finish and returns result URI of Task per default @@ -34,24 +36,24 @@ module OpenTox begin - request = RestClient::Request.new(args) - response = request.execute do |response, request, result| + @request = RestClient::Request.new(args) + @response = @request.execute do |response, request, result| # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader - raise OpenTox::RestCallError request, response unless response.code < 400 or URI.task? uri + rest_call_error unless response.code < 400 or URI.task? uri return response end # TODO: tests for workarounds # PENDING NTUA does return errors with 200 - #raise RestClient::ExceptionWithResponse.new(response) if uri=~/ntua/ and response.body =~ /about.*http:\/\/anonymous.org\/error/ + #raise RestClient::ExceptionWithResponse.new(@response) if uri=~/ntua/ and @response.body =~ /about.*http:\/\/anonymous.org\/error/ - return response if response.code==200 or wait.false? + return @response if @response.code==200 or wait.false? # wait for task - while response.code==201 or response.code==202 - response = wait_for_task(response, uri, waiting_task) + while @response.code==201 or @response.code==202 + @response = wait_for_task(@response, uri, waiting_task) end - return response + return @response rescue RestClient::RequestTimeout => ex received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} @@ -74,21 +76,19 @@ module OpenTox def self.wait_for_task( response, base_uri, waiting_task=nil ) #TODO remove TUM hack - # response.headers[:content_type] = "text/uri-list" if base_uri =~/tu-muenchen/ and response.headers[:content_type] == "application/x-www-form-urlencoded;charset=UTF-8" + # @response.headers[:content_type] = "text/uri-list" if base_uri =~/tu-muenchen/ and @response.headers[:content_type] == "application/x-www-form-urlencoded;charset=UTF-8" - puts "TASK" - puts response.inspect task = nil - case response.headers[:content_type] + case @response.headers[:content_type] when /application\/rdf\+xml/ # TODO: task uri from rdf - #task = OpenTox::Task.from_rdfxml(response) - #task = OpenTox::Task.from_rdfxml(response) + #task = OpenTox::Task.from_rdfxml(@response) + #task = OpenTox::Task.from_rdfxml(@response) when /text\/uri-list/ - raise OpenTox::RestCallError nil, response, "Uri list has more than one entry, should be a single task" if response.split("\n").size > 1 #if uri list contains more then one uri, its not a task - task = OpenTox::Task.new(response.to_s.chomp) if URI.available? response.to_s + rest_call_error "Uri list has more than one entry, should be a single task" if @response.split("\n").size > 1 #if uri list contains more then one uri, its not a task + task = OpenTox::Task.new(@response.to_s.chomp) if URI.available? @response.to_s else - raise OpenTox::RestCallError nil, response, "Unknown content-type for task : '"+response.headers[:content_type].to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+response[0..200].to_s + rest_call_error @response, "Unknown content-type for task : '"+@response.headers[:content_type].to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+@response[0..200].to_s end #LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" @@ -97,11 +97,15 @@ module OpenTox if task.errorReport received_error task.errorReport, task.http_code, nil, {:rest_uri => task.uri, :rest_code => task.http_code} else - raise OpenTox::RestCallError nil, response, "Status of task '"+task.uri.to_s+"' is no longer running (hasStatus is '"+task.status+ + rest_call_error "Status of task '"+task.uri.to_s+"' is no longer running (hasStatus is '"+task.status+ "'), but it is neither completed nor has an errorReport" end end - response + @response + end + + def rest_call_error message + raise OpenTox::RestCallError @request, @response, message end def self.received_error( body, code, content_type=nil, params=nil ) -- cgit v1.2.3 From c2986f418ede0ea443df0a1f7690c433b637dc57 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 29 Feb 2012 18:50:41 +0000 Subject: TaskError implemented, logging still partially redundant --- lib/error.rb | 72 +++++++++++++++++-------------------- lib/otlogger.rb | 2 +- lib/rest-client-wrapper.rb | 88 ++++++++++++++++++++++++++++++++-------------- lib/task.rb | 10 +++--- test/task.rb | 6 +++- 5 files changed, 104 insertions(+), 74 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index b832ef4..0e467d9 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,47 +1,38 @@ # adding additional fields to Exception class to format errors according to OT-API -=begin -class Exception -end -=end class RuntimeError - attr_accessor :errorCause # is errorReport - def initialize msg=nil - $logger.error msg - super msg - end - def http_code; 500; end + attr_accessor :http_code + @http_code = 500 end module OpenTox - - class BadRequestError < RuntimeError - def http_code; 400; end - end - - class NotAuthorizedError < RuntimeError - def http_code; 401; end - end - - class NotFoundError < RuntimeError - def http_code; 404; end - end - - class LockedError < RuntimeError - def http_code; 423; end - end - class ServiceUnavailableError < RuntimeError - def http_code; 503; end + # Errors received from RestClientWrapper calls + class RestError < RuntimeError + attr_accessor :request, :response, :cause + def initialize args + @request = args[:request] + @response = args[:response] + args[:http_code] ? @http_code = args[:http_code] : @http_code = @response.code if @response + @cause = args[:cause] + msg = args.to_yaml + $logger.error msg + super msg + end end - - class RestCallError < RuntimeError - def initialize request, response, expectation=nil - msg = "REST request: #{request.inspect}\nREST response: #{response.inspect}" - msg += "\n"+expectation if expectation + + # Errors rescued from task blocks + class TaskError < RuntimeError + attr_reader :error, :actor, :report + def initialize error, actor=nil + @error = error + @actor = actor + @report = ErrorReport.create error, actor + msg = "\nActor: \"#{actor}\"\n" + msg += @error.to_yaml + #$logger.error msg super msg end - def http_code; 502; end end class ErrorReport @@ -52,7 +43,7 @@ module OpenTox private def initialize( http_code, erroType, message, actor, errorCause, rest_params=nil, backtrace=nil ) @http_code = http_code - @errorType = erroType + #@errorType = erroType @message = message @actor = actor @errorCause = errorCause @@ -65,9 +56,11 @@ module OpenTox # @param [Exception] error # @param [String] actor, URI of the call that cause the error def self.create( error, actor ) - rest_params = error.rest_params if error.is_a?(OpenTox::RestCallError) and error.rest_params - backtrace = error.backtrace.short_backtrace #if CONFIG[:backtrace] - ErrorReport.new( error.http_code, error.class.to_s, error.message, actor, error.errorCause, rest_params, backtrace ) + rest_params = error.request if error.respond_to? :request + backtrace = error.backtrace.short_backtrace if error.respond_to? :backtrace and error.backtrace #if CONFIG[:backtrace] + error.respond_to?(:http_code) ? http_code = error.http_code : http_code = 500 + error.respond_to?(:cause) ? cause = error.cause : cause = 'Unknown' + ErrorReport.new( http_code, error.class.to_s, error.message, actor, cause, rest_params, backtrace ) end def self.from_rdf(rdf) @@ -101,8 +94,7 @@ module OpenTox s.add_resource(CONFIG[:services]["opentox-task"]+"/tmpId/ErrorReport/tmpId", OT.errorReport, rdf_content) s.to_rdfxml end -=begin -=end + end end diff --git a/lib/otlogger.rb b/lib/otlogger.rb index e9fbc4d..57b8170 100644 --- a/lib/otlogger.rb +++ b/lib/otlogger.rb @@ -12,7 +12,7 @@ class OTLogger < Logger n = 2 line = lines[n] - while (line =~ /spork.rb/ or line =~ /create/ or line =~ /#{File.basename(__FILE__)}/) + while (line =~ /error.rb/ or line =~ /create/ or line =~ /#{File.basename(__FILE__)}/) n += 1 line = lines[n] end diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 67114fb..1e871b0 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -17,15 +17,7 @@ module OpenTox define_singleton_method method do |uri,payload={},headers={},waiting_task=nil, wait=true| - # catch input errors - raise OpenTox::BadRequestError.new "Invalid URI: '#{uri}'" unless URI.valid? uri - raise OpenTox::BadRequestError.new "Unreachable URI: '#{uri}'" unless URI.accessible? uri - raise OpenTox::BadRequestError.new "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) - [:accept,:content_type,:subjectid].each do |header| - raise OpenTox::BadRequestError.new "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] - end - raise OpenTox::BadRequestError "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) - + # create request args={} args[:method] = method args[:url] = uri @@ -33,13 +25,23 @@ module OpenTox args[:payload] = payload headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems args[:headers] = headers + @request = RestClient::Request.new(args) + + # catch input errors + rest_error "Invalid URI: '#{uri}'" unless URI.valid? uri + rest_error "Unreachable URI: '#{uri}'" unless URI.accessible? uri + rest_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) + # make sure that no header parameters are set in payload + [:accept,:content_type,:subjectid].each do |header| + rest_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] + end + rest_error "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) begin - @request = RestClient::Request.new(args) @response = @request.execute do |response, request, result| # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader - rest_call_error unless response.code < 400 or URI.task? uri + rest_error unless response.code < 400 or URI.task? uri return response end @@ -55,26 +57,34 @@ module OpenTox end return @response - rescue RestClient::RequestTimeout => ex - received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue Errno::ETIMEDOUT => ex - received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue Errno::ECONNREFUSED => ex - received_error ex.message, 500, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue RestClient::ExceptionWithResponse => ex + rescue + rest_error $!.message + end +=begin + rescue RestClient::RequestTimeout + raise OpenTox::Error @request, @response, $!.message + #received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue Errno::ETIMEDOUT + raise OpenTox::Error @request, @response, $!.message + #received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue Errno::ECONNREFUSED + raise OpenTox::Error $!.message + #received_error ex.message, 500, nil, {:rest_uri => uri, :headers => headers, :payload => payload} + rescue RestClient::ExceptionWithResponse # error comming from a different webservice, received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue OpenTox::RestCallError => ex + #rescue OpenTox::RestCallError => ex # already a rest-error, probably comes from wait_for_task, just pass through - raise ex - rescue => ex + #raise ex + #rescue => ex # some internal error occuring in rest-client-wrapper, just pass through - raise ex + #raise ex end +=end end end - def self.wait_for_task( response, base_uri, waiting_task=nil ) + def wait_for_task( response, base_uri, waiting_task=nil ) #TODO remove TUM hack # @response.headers[:content_type] = "text/uri-list" if base_uri =~/tu-muenchen/ and @response.headers[:content_type] == "application/x-www-form-urlencoded;charset=UTF-8" @@ -85,10 +95,10 @@ module OpenTox #task = OpenTox::Task.from_rdfxml(@response) #task = OpenTox::Task.from_rdfxml(@response) when /text\/uri-list/ - rest_call_error "Uri list has more than one entry, should be a single task" if @response.split("\n").size > 1 #if uri list contains more then one uri, its not a task + rest_error "Uri list has more than one entry, should be a single task" if @response.split("\n").size > 1 #if uri list contains more then one uri, its not a task task = OpenTox::Task.new(@response.to_s.chomp) if URI.available? @response.to_s else - rest_call_error @response, "Unknown content-type for task : '"+@response.headers[:content_type].to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+@response[0..200].to_s + rest_error @response, "Unknown content-type for task : '"+@response.headers[:content_type].to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+@response[0..200].to_s end #LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" @@ -104,14 +114,37 @@ module OpenTox @response end - def rest_call_error message - raise OpenTox::RestCallError @request, @response, message + def self.rest_error message + raise OpenTox::RestError.new :request => @request, :response => @response, :cause => message + end + +=begin + def self.bad_request_error message + raise OpenTox::Error.new message + end + + def self.not_found_error message + raise OpenTox::NotFoundError.new message end + def self.received_error( body, code, content_type=nil, params=nil ) + + # try to parse body TODO + body.is_a?(OpenTox::ErrorReport) ? report = body : report = OpenTox::ErrorReport.from_rdf(body) + rest_call_error "REST call returned error: '"+body.to_s+"'" unless report + # parsing sucessfull + # raise RestCallError with parsed report as error cause + err = OpenTox::RestCallError.new(@request, @response, "REST call subsequent error") + err.errorCause = report + raise err + end +=end +=begin def self.received_error( body, code, content_type=nil, params=nil ) # try to parse body report = nil + #report = OpenTox::ErrorReport.from_rdf(body) if body.is_a?(OpenTox::ErrorReport) report = body else @@ -138,5 +171,6 @@ module OpenTox raise err end end +=end end end diff --git a/lib/task.rb b/lib/task.rb index 635584f..a28a0aa 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -9,6 +9,7 @@ module OpenTox def self.create service_uri, params={} + # TODO set request uri task = Task.new RestClientWrapper.post(service_uri,params).chomp pid = fork do begin @@ -16,7 +17,7 @@ module OpenTox if URI.accessible?(result_uri) task.completed result_uri else - raise "#{result_uri} is not a valid URI" + task.error OpenTox::RestError.new :http_code => 404, :cause => "#{result_uri} is not a valid URI", :actor => params[:creator] end rescue task.error $! @@ -62,14 +63,13 @@ module OpenTox def completed(uri) #TODO: subjectid? #TODO: error code - raise "\"#{uri}\" does not exist." unless URI.accessible? uri + error OpenTox::RestError.new :http_code => 404, :cause => "\"#{uri}\" does not exist.", :actor => creator unless URI.accessible? uri RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) end def error error - $logger.error self - report = ErrorReport.create(error,self.creator) - RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => report}) + error = OpenTox::TaskError.new error, self.creator + RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => error.report}) kill raise error end diff --git a/test/task.rb b/test/task.rb index ea5ee2f..f01282b 100644 --- a/test/task.rb +++ b/test/task.rb @@ -10,6 +10,8 @@ TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" class TaskTest < Test::Unit::TestCase +=begin +=end def test_all all = OpenTox::Task.all(TASK_SERVICE_URI) assert_equal Array, all.class @@ -45,7 +47,7 @@ class TaskTest < Test::Unit::TestCase def test_create_and_fail task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test failure", :creator => "http://test.org/fake_creator" do sleep 1 - raise "an error occured" + raise "an unexpected error occured" end assert task.running? assert_equal "Running", task.hasStatus @@ -65,5 +67,7 @@ class TaskTest < Test::Unit::TestCase assert task.error? assert_equal "Error", task.hasStatus end +=begin +=end end -- cgit v1.2.3 From dd39ae3a5479eed32d57d1d3934d907a82048486 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 29 Feb 2012 19:45:15 +0000 Subject: duplicated error logs not yet solved --- lib/error.rb | 9 ++++++--- lib/task.rb | 14 +++++++------- test/task.rb | 4 ---- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 0e467d9..88c8be8 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -28,9 +28,12 @@ module OpenTox @error = error @actor = actor @report = ErrorReport.create error, actor + # TODO avoid error log duplication, improve output msg = "\nActor: \"#{actor}\"\n" - msg += @error.to_yaml - #$logger.error msg + msg += "\nCode: #{@report.http_code}" + msg += "\nerrorCause: #{@report.errorCause}\n" + msg += @report.message + $logger.error msg super msg end end @@ -43,7 +46,7 @@ module OpenTox private def initialize( http_code, erroType, message, actor, errorCause, rest_params=nil, backtrace=nil ) @http_code = http_code - #@errorType = erroType + @errorType = erroType @message = message @actor = actor @errorCause = errorCause diff --git a/lib/task.rb b/lib/task.rb index a28a0aa..d3b6312 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -9,7 +9,7 @@ module OpenTox def self.create service_uri, params={} - # TODO set request uri + # TODO set/enforce request uri task = Task.new RestClientWrapper.post(service_uri,params).chomp pid = fork do begin @@ -17,7 +17,8 @@ module OpenTox if URI.accessible?(result_uri) task.completed result_uri else - task.error OpenTox::RestError.new :http_code => 404, :cause => "#{result_uri} is not a valid URI", :actor => params[:creator] + raise "\"#{result_uri}\" is not a valid result URI" + #task.error OpenTox::RestError.new :http_code => 404, :cause => "#{result_uri} is not a valid URI", :actor => params[:creator] end rescue task.error $! @@ -44,7 +45,7 @@ module OpenTox def kill Process.kill(9,@pid) Process.kill(9,@observer_pid) - rescue # no need to raise an aexeption if processes are not running + rescue # no need to raise an exeption if processes are not running end def description @@ -61,14 +62,13 @@ module OpenTox end def completed(uri) - #TODO: subjectid? - #TODO: error code - error OpenTox::RestError.new :http_code => 404, :cause => "\"#{uri}\" does not exist.", :actor => creator unless URI.accessible? uri + #error OpenTox::RestError.new :http_code => 404, :cause => "\"#{uri}\" does not exist.", :actor => creator unless URI.accessible? uri + raise "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) end def error error - error = OpenTox::TaskError.new error, self.creator + error = OpenTox::TaskError.new error, creator RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => error.report}) kill raise error diff --git a/test/task.rb b/test/task.rb index f01282b..7ea30b9 100644 --- a/test/task.rb +++ b/test/task.rb @@ -10,8 +10,6 @@ TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" class TaskTest < Test::Unit::TestCase -=begin -=end def test_all all = OpenTox::Task.all(TASK_SERVICE_URI) assert_equal Array, all.class @@ -67,7 +65,5 @@ class TaskTest < Test::Unit::TestCase assert task.error? assert_equal "Error", task.hasStatus end -=begin -=end end -- cgit v1.2.3 From cbc5f08e92c92601009f0c11c8ec67ede2894858 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 2 Mar 2012 09:33:44 +0000 Subject: error report fixed for old task services --- lib/error.rb | 160 +++++++++++++++++++++++---------------------- lib/opentox.rb | 8 ++- lib/rest-client-wrapper.rb | 28 ++++---- lib/task.rb | 25 ++++--- test/task.rb | 25 +++++-- 5 files changed, 137 insertions(+), 109 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 88c8be8..8368404 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,101 +1,107 @@ # adding additional fields to Exception class to format errors according to OT-API class RuntimeError - attr_accessor :http_code - @http_code = 500 + attr_accessor :report, :http_code + def initialize message + super message + @http_code ||= 500 + @report = OpenTox::ErrorReport.create self + $logger.error "\n"+@report.to_ntriples + end end module OpenTox - # Errors received from RestClientWrapper calls - class RestError < RuntimeError - attr_accessor :request, :response, :cause - def initialize args - @request = args[:request] - @response = args[:response] - args[:http_code] ? @http_code = args[:http_code] : @http_code = @response.code if @response - @cause = args[:cause] - msg = args.to_yaml - $logger.error msg - super msg + class Error < RuntimeError + def initialize code, message + @http_code = code + super message end end - # Errors rescued from task blocks - class TaskError < RuntimeError - attr_reader :error, :actor, :report - def initialize error, actor=nil - @error = error - @actor = actor - @report = ErrorReport.create error, actor - # TODO avoid error log duplication, improve output - msg = "\nActor: \"#{actor}\"\n" - msg += "\nCode: #{@report.http_code}" - msg += "\nerrorCause: #{@report.errorCause}\n" - msg += @report.message - $logger.error msg - super msg + # create error classes dynamically + { + "BadRequestError" => 400, + "NotAuthorizedError" => 401, + "NotFoundError" => 404, + "ServiceUnavailableError" => 503, + "TimeOutError" => 504, + }.each do |klass,code| + c = Class.new Error do + define_method :initialize do |message| + super code, message + end + end + OpenTox.const_set klass,c + end + + # Errors received from RestClientWrapper calls + class RestCallError < Error + attr_accessor :request, :response + def initialize request, response, message + @request = request + @response = response + super 502, message end end class ErrorReport - # TODO replace params with URIs (errorCause -> OT.errorCause) - attr_reader :message, :actor, :errorCause, :http_code, :errorDetails, :errorType + attr_accessor :rdf # RDF Graph + attr_accessor :http_code # TODO: remove when task service is fixed - private - def initialize( http_code, erroType, message, actor, errorCause, rest_params=nil, backtrace=nil ) - @http_code = http_code - @errorType = erroType - @message = message - @actor = actor - @errorCause = errorCause - @rest_params = rest_params - @backtrace = backtrace + def initialize + @rdf = RDF::Graph.new end - - public + # creates a error report object, from an ruby-exception object # @param [Exception] error - # @param [String] actor, URI of the call that cause the error - def self.create( error, actor ) - rest_params = error.request if error.respond_to? :request - backtrace = error.backtrace.short_backtrace if error.respond_to? :backtrace and error.backtrace #if CONFIG[:backtrace] - error.respond_to?(:http_code) ? http_code = error.http_code : http_code = 500 - error.respond_to?(:cause) ? cause = error.cause : cause = 'Unknown' - ErrorReport.new( http_code, error.class.to_s, error.message, actor, cause, rest_params, backtrace ) - end - - def self.from_rdf(rdf) - metadata = OpenTox::Parser::Owl.from_rdf( rdf, OT.ErrorReport ).metadata - ErrorReport.new(metadata[OT.statusCode], metadata[OT.errorCode], metadata[OT.message], metadata[OT.actor], metadata[OT.errorCause]) - end - - # overwrite sorting to make easier readable - def to_yaml_properties - p = super - p = ( p - ["@backtrace"]) + ["@backtrace"] if @backtrace - p = ( p - ["@errorCause"]) + ["@errorCause"] if @errorCause - p - end - - def rdf_content() - c = { - RDF.type => [OT.ErrorReport], - OT.statusCode => @http_code, - OT.message => @message, - OT.actor => @actor, - OT.errorCode => @errorType, - } - c[OT.errorCause] = @errorCause.rdf_content if @errorCause - c + def self.create error + report = ErrorReport.new + subject = RDF::Node.new + report.rdf << [subject, RDF.type, RDF::OT.ErrorReport] + message = error.message + errorDetails = "" + if error.respond_to? :request + report.rdf << [subject, RDF::OT.actor, error.request.url ] + errorDetails += "REST paramenters:\n#{error.request.args.inspect}" + end + error.respond_to?(:http_code) ? statusCode = error.http_code : statusCode = 500 + if error.respond_to? :response + statusCode = error.response.code + message = error.body + end + statusCode = error.http_code if error.respond_to? :http_code + report.rdf << [subject, RDF::OT.statusCode, statusCode ] + report.rdf << [subject, RDF::OT.errorCode, error.class.to_s ] + # TODO: remove kludge for old task services + report.http_code = statusCode + report.rdf << [subject, RDF::OT.message , message ] + + errorDetails += "\nBacktrace:\n" + error.backtrace.short_backtrace if error.respond_to?(:backtrace) and error.backtrace + report.rdf << [subject, RDF::OT.errorDetails, errorDetails ] + # TODO Error cause + #report.rdf << [subject, OT.errorCause, error.report] if error.respond_to?(:report) and !error.report.empty? + report end - # TODO: use rdf.rb - def to_rdfxml - s = Serializer::Owl.new - s.add_resource(CONFIG[:services]["opentox-task"]+"/tmpId/ErrorReport/tmpId", OT.errorReport, rdf_content) - s.to_rdfxml + # define to_ and self.from_ methods for various rdf formats + [:rdfxml,:ntriples].each do |format| + + define_singleton_method ("from_#{format}").to_sym do |rdf| + report = ErrorReport.new + RDF::Reader.for(format).new(rdf) do |reader| + reader.each_statement{ |statement| report.rdf << statement } + end + report + end + + send :define_method, ("to_#{format}").to_sym do + rdfxml = RDF::Writer.for(format).buffer do |writer| + @rdf.each{|statement| writer << statement} + end + rdfxml + end end end diff --git a/lib/opentox.rb b/lib/opentox.rb index 4c2a668..10c7895 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -24,7 +24,7 @@ module OpenTox if reload or @metadata.empty? @metadata = {} kind_of?(OpenTox::Dataset) ? uri = File.join(@uri,"metadata") : uri = @uri - RDF::Reader.for(:rdfxml).new( RestClientWrapper.get(@uri) ) do |reader| + RDF::Reader.for(:rdfxml).new( RestClientWrapper.get(uri) ) do |reader| reader.each_statement do |statement| @metadata[statement.predicate] = statement.object if statement.subject == @uri end @@ -34,10 +34,14 @@ module OpenTox end def save + post self.to_rdfxml, { :content_type => 'application/rdf+xml'} + end + + def to_rdfxml rdf = RDF::Writer.for(:rdfxml).buffer do |writer| @metadata.each { |p,o| writer << RDF::Statement.new(RDF::URI.new(@uri), p, o) } end - post rdf, { :content_type => 'application/rdf+xml'} + rdf end # REST API diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 1e871b0..0780dd5 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -27,29 +27,25 @@ module OpenTox args[:headers] = headers @request = RestClient::Request.new(args) - # catch input errors - rest_error "Invalid URI: '#{uri}'" unless URI.valid? uri - rest_error "Unreachable URI: '#{uri}'" unless URI.accessible? uri - rest_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) - # make sure that no header parameters are set in payload + # check input + raise OpenTox::Error.new 400, "Invalid URI: '#{uri}'" unless URI.valid? uri + raise OpenTox::Error.new 400, "Unreachable URI: '#{uri}'" unless URI.accessible? uri + raise OpenTox::Error.new 400, "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) + # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| - rest_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] + raise OpenTox::Error.new 400, "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] end - rest_error "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) + raise OpenTox::Error.new 400, "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) begin @response = @request.execute do |response, request, result| # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader - rest_error unless response.code < 400 or URI.task? uri + rest_error "Response code is #{response.code}" unless response.code < 400 or URI.task? uri return response end - - # TODO: tests for workarounds - # PENDING NTUA does return errors with 200 - #raise RestClient::ExceptionWithResponse.new(@response) if uri=~/ntua/ and @response.body =~ /about.*http:\/\/anonymous.org\/error/ - return @response if @response.code==200 or wait.false? + return @response if @response.code==200 or !wait # wait for task while @response.code==201 or @response.code==202 @@ -98,7 +94,7 @@ module OpenTox rest_error "Uri list has more than one entry, should be a single task" if @response.split("\n").size > 1 #if uri list contains more then one uri, its not a task task = OpenTox::Task.new(@response.to_s.chomp) if URI.available? @response.to_s else - rest_error @response, "Unknown content-type for task : '"+@response.headers[:content_type].to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+@response[0..200].to_s + rest_error "Unknown content-type for task : '"+@response.headers[:content_type].to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+@response[0..200].to_s end #LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" @@ -107,7 +103,7 @@ module OpenTox if task.errorReport received_error task.errorReport, task.http_code, nil, {:rest_uri => task.uri, :rest_code => task.http_code} else - rest_call_error "Status of task '"+task.uri.to_s+"' is no longer running (hasStatus is '"+task.status+ + rest_error "Status of task '"+task.uri.to_s+"' is no longer running (hasStatus is '"+task.status+ "'), but it is neither completed nor has an errorReport" end end @@ -115,7 +111,7 @@ module OpenTox end def self.rest_error message - raise OpenTox::RestError.new :request => @request, :response => @response, :cause => message + raise OpenTox::RestCallError.new @request, @response, message end =begin diff --git a/lib/task.rb b/lib/task.rb index d3b6312..f75f87d 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -17,7 +17,7 @@ module OpenTox if URI.accessible?(result_uri) task.completed result_uri else - raise "\"#{result_uri}\" is not a valid result URI" + raise NotFoundError.new "\"#{result_uri}\" is not a valid result URI" #task.error OpenTox::RestError.new :http_code => 404, :cause => "#{result_uri} is not a valid URI", :actor => params[:creator] end rescue @@ -53,7 +53,7 @@ module OpenTox end def creator - metadata[RDF::DC.creator] + metadata[RDF::DC.creator] end def cancel @@ -63,13 +63,16 @@ module OpenTox def completed(uri) #error OpenTox::RestError.new :http_code => 404, :cause => "\"#{uri}\" does not exist.", :actor => creator unless URI.accessible? uri - raise "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri + raise NotFoundError.new "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) end def error error - error = OpenTox::TaskError.new error, creator - RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => error.report}) + # TODO: switch task service to rdf + #RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => error.report.to_rdfxml}) + # create report for non-runtime errors + error.respond_to?(:reporti) ? report = error.report : report = OpenTox::ErrorReport.create(error) + RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => report.to_yaml}) kill raise error end @@ -80,7 +83,7 @@ module OpenTox due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION while running? sleep dur - raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) + raise TimeOutError.new "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) end end @@ -100,7 +103,8 @@ module OpenTox end def error? - RestClientWrapper.head(@uri).code == 500 + code = RestClientWrapper.head(@uri).code + code >= 400 and code != 503 end def method_missing(method,*args) @@ -114,14 +118,15 @@ module OpenTox response = metadata[RDF::OT[method]].to_s response = metadata[RDF::OT1[method]].to_s #if response.empty? # API 1.1 compatibility if response.empty? - $logger.error "No #{method} metadata for #{@uri} " - raise "No #{method} metadata for #{@uri} " + raise NotFoundError.new "No #{method} metadata for #{@uri} " end return response end + rescue OpenTox::Error + raise $! rescue $logger.error "Unknown #{self.class} method #{method}" - #super + super end end diff --git a/test/task.rb b/test/task.rb index 7ea30b9..d49871f 100644 --- a/test/task.rb +++ b/test/task.rb @@ -10,6 +10,8 @@ TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" class TaskTest < Test::Unit::TestCase +=begin +=end def test_all all = OpenTox::Task.all(TASK_SERVICE_URI) assert_equal Array, all.class @@ -44,8 +46,20 @@ class TaskTest < Test::Unit::TestCase def test_create_and_fail task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test failure", :creator => "http://test.org/fake_creator" do - sleep 1 - raise "an unexpected error occured" + sleep 0.5 + raise "A runtime error occured" + end + assert task.running? + assert_equal "Running", task.hasStatus + task.wait + assert task.error? + assert_equal "Error", task.hasStatus + end + + def test_create_and_fail_with_opentox_error + task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test failure", :creator => "http://test.org/fake_creator" do + sleep 0.5 + raise OpenTox::Error.new 500, "An OpenTox::Error occured" end assert task.running? assert_equal "Running", task.hasStatus @@ -56,14 +70,17 @@ class TaskTest < Test::Unit::TestCase def test_wrong_result_uri task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test wrong result uri", :creator => "http://test.org/fake_creator" do - sleep 1 + sleep 0.5 "Asasadasd" end assert task.running? assert_equal "Running", task.hasStatus + puts task.uri task.wait assert task.error? - assert_equal "Error", task.hasStatus + #assert_equal "Error", task.hasStatus end +=begin +=end end -- cgit v1.2.3 From 53fe462b9c310bc84df50d058500772b7f3cbc3c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 2 Mar 2012 09:40:08 +0000 Subject: error test fixed --- lib/rest-client-wrapper.rb | 10 +++++----- test/task.rb | 7 +------ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 0780dd5..17e1cd0 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -28,14 +28,14 @@ module OpenTox @request = RestClient::Request.new(args) # check input - raise OpenTox::Error.new 400, "Invalid URI: '#{uri}'" unless URI.valid? uri - raise OpenTox::Error.new 400, "Unreachable URI: '#{uri}'" unless URI.accessible? uri - raise OpenTox::Error.new 400, "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) + raise OpenTox::BadRequestError.new "Invalid URI: '#{uri}'" unless URI.valid? uri + raise OpenTox::BadRequestError.new "Unreachable URI: '#{uri}'" unless URI.accessible? uri + raise OpenTox::BadRequestError.new "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| - raise OpenTox::Error.new 400, "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] + raise OpenTox::BadRequestError.new "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] end - raise OpenTox::Error.new 400, "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) + raise OpenTox::BadRequestError.new "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) begin diff --git a/test/task.rb b/test/task.rb index d49871f..932d5c9 100644 --- a/test/task.rb +++ b/test/task.rb @@ -10,8 +10,6 @@ TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" class TaskTest < Test::Unit::TestCase -=begin -=end def test_all all = OpenTox::Task.all(TASK_SERVICE_URI) assert_equal Array, all.class @@ -75,12 +73,9 @@ class TaskTest < Test::Unit::TestCase end assert task.running? assert_equal "Running", task.hasStatus - puts task.uri task.wait assert task.error? - #assert_equal "Error", task.hasStatus + assert_equal "Error", task.hasStatus end -=begin -=end end -- cgit v1.2.3 From a5f8c658ba87a00950766182966b65c65d5e2b66 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 2 Mar 2012 19:04:02 +0000 Subject: additional OpenTox errors, *_error methods in rest-client-wrapper --- lib/error.rb | 14 +++++++++++--- lib/rest-client-wrapper.rb | 10 +++++----- lib/task.rb | 12 +++++------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 8368404..29f4234 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -19,20 +19,28 @@ module OpenTox end end - # create error classes dynamically + # OpenTox errors { "BadRequestError" => 400, "NotAuthorizedError" => 401, "NotFoundError" => 404, "ServiceUnavailableError" => 503, "TimeOutError" => 504, + "LockedError" => 423, + "NotImplementedError" => 501, }.each do |klass,code| + # create error classes c = Class.new Error do define_method :initialize do |message| super code, message end end OpenTox.const_set klass,c + + # define global methods for raising errors, eg. bad_request_error + Object.send(:define_method, klass.underscore.to_sym) do |message| + raise c.new message + end end # Errors received from RestClientWrapper calls @@ -88,7 +96,7 @@ module OpenTox # define to_ and self.from_ methods for various rdf formats [:rdfxml,:ntriples].each do |format| - define_singleton_method ("from_#{format}").to_sym do |rdf| + define_singleton_method "from_#{format}".to_sym do |rdf| report = ErrorReport.new RDF::Reader.for(format).new(rdf) do |reader| reader.each_statement{ |statement| report.rdf << statement } @@ -96,7 +104,7 @@ module OpenTox report end - send :define_method, ("to_#{format}").to_sym do + send :define_method, "to_#{format}".to_sym do rdfxml = RDF::Writer.for(format).buffer do |writer| @rdf.each{|statement| writer << statement} end diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 17e1cd0..64c7d7e 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -28,14 +28,14 @@ module OpenTox @request = RestClient::Request.new(args) # check input - raise OpenTox::BadRequestError.new "Invalid URI: '#{uri}'" unless URI.valid? uri - raise OpenTox::BadRequestError.new "Unreachable URI: '#{uri}'" unless URI.accessible? uri - raise OpenTox::BadRequestError.new "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) + bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri + bad_request_error "Unreachable URI: '#{uri}'" unless URI.accessible? uri + bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| - raise OpenTox::BadRequestError.new "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] + bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] end - raise OpenTox::BadRequestError.new "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) + bad_request_error "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) begin diff --git a/lib/task.rb b/lib/task.rb index f75f87d..d7ad539 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -17,8 +17,7 @@ module OpenTox if URI.accessible?(result_uri) task.completed result_uri else - raise NotFoundError.new "\"#{result_uri}\" is not a valid result URI" - #task.error OpenTox::RestError.new :http_code => 404, :cause => "#{result_uri} is not a valid URI", :actor => params[:creator] + not_found_error "\"#{result_uri}\" is not a valid result URI" end rescue task.error $! @@ -62,8 +61,7 @@ module OpenTox end def completed(uri) - #error OpenTox::RestError.new :http_code => 404, :cause => "\"#{uri}\" does not exist.", :actor => creator unless URI.accessible? uri - raise NotFoundError.new "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri + not_found_error "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) end @@ -83,7 +81,7 @@ module OpenTox due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION while running? sleep dur - raise TimeOutError.new "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) + time_out_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) end end @@ -116,9 +114,9 @@ module OpenTox super unless res.code == 200 else response = metadata[RDF::OT[method]].to_s - response = metadata[RDF::OT1[method]].to_s #if response.empty? # API 1.1 compatibility + response = metadata[RDF::OT1[method]].to_s if response.empty? # API 1.1 compatibility if response.empty? - raise NotFoundError.new "No #{method} metadata for #{@uri} " + not_found_error "No #{method} metadata for #{@uri} " end return response end -- cgit v1.2.3 From 7588adffdbd48a73d8b22be2379a5afee79e5bea Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 6 Mar 2012 10:59:11 +0000 Subject: backtick operator overwrite to catch system call errors --- lib/error.rb | 16 ++++++++++++++-- lib/task.rb | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 29f4234..81ec979 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -24,10 +24,11 @@ module OpenTox "BadRequestError" => 400, "NotAuthorizedError" => 401, "NotFoundError" => 404, - "ServiceUnavailableError" => 503, - "TimeOutError" => 504, "LockedError" => 423, + "InternalServerError" => 500, "NotImplementedError" => 501, + "ServiceUnavailableError" => 503, + "TimeOutError" => 504, }.each do |klass,code| # create error classes c = Class.new Error do @@ -115,6 +116,17 @@ module OpenTox end end + # overwrite backtick operator to catch system errors +class Object + def `(code) + msg = super("#{code} 2>&1").chomp + internal_server_error msg unless $?.to_i == 0 + msg + rescue Errno::ENOENT => e + internal_server_error e + end +end + class Array def short_backtrace short = [] diff --git a/lib/task.rb b/lib/task.rb index d7ad539..3a52dee 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -10,6 +10,7 @@ module OpenTox def self.create service_uri, params={} # TODO set/enforce request uri + # TODO: run observer in same process? task = Task.new RestClientWrapper.post(service_uri,params).chomp pid = fork do begin -- cgit v1.2.3 From 2e3db6f6532ded28dfada22d4445038b79271814 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 7 Mar 2012 13:51:45 +0100 Subject: actor for error reports, turtle output for error reports --- lib/error.rb | 13 +++++++++++-- lib/opentox.rb | 9 +++++++-- lib/overwrite.rb | 1 + 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 81ec979..90b55e3 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -93,9 +93,18 @@ module OpenTox #report.rdf << [subject, OT.errorCause, error.report] if error.respond_to?(:report) and !error.report.empty? report end + + def actor=(uri) + # TODO: test actor assignement (in opentox-server) + subject = RDF::Query.execute(@rdf) do + pattern [:subject, RDF.type, RDF::OT.ErrorReport] + end.limit(1).select(:subject) + }) + @rdf << [subject, RDF::OT.actor, uri] + end # define to_ and self.from_ methods for various rdf formats - [:rdfxml,:ntriples].each do |format| + [:rdfxml,:ntriples,:turtle].each do |format| define_singleton_method "from_#{format}".to_sym do |rdf| report = ErrorReport.new @@ -116,7 +125,7 @@ module OpenTox end end - # overwrite backtick operator to catch system errors +# overwrite backtick operator to catch system errors class Object def `(code) msg = super("#{code} 2>&1").chomp diff --git a/lib/opentox.rb b/lib/opentox.rb index 10c7895..566c458 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -2,10 +2,15 @@ RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' + SERVICES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] -# defaults to stderr, may be changed to file output -$logger = OTLogger.new(STDERR) # no rotation +# Regular expressions for parsing classification data +TRUE_REGEXP = /^(true|active|1|1.0|tox|activating|carcinogen|mutagenic)$/i +FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-mutagenic)$/i + +# defaults to stderr, may be changed to file output (e.g in opentox-service) +$logger = OTLogger.new(STDERR) $logger.level = Logger::DEBUG module OpenTox diff --git a/lib/overwrite.rb b/lib/overwrite.rb index e883d45..f0dcda9 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -35,5 +35,6 @@ module URI rescue URI::InvalidURIError false end + end -- cgit v1.2.3 From 8fc11578aadcf1e7d152764c926e12e553bd8d65 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 7 Mar 2012 13:28:51 +0000 Subject: fixed stdout, stderr in overwritten backtick operator, error report in turtle --- lib/error.rb | 34 ++++++++++++++++++++++++---------- opentox-client.gemspec | 1 + 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 90b55e3..b65651f 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,12 +1,13 @@ -# adding additional fields to Exception class to format errors according to OT-API +require 'open4' +# adding additional fields to Exception class to format errors according to OT-API class RuntimeError attr_accessor :report, :http_code def initialize message super message @http_code ||= 500 @report = OpenTox::ErrorReport.create self - $logger.error "\n"+@report.to_ntriples + $logger.error "\n"+@report.to_turtle end end @@ -99,7 +100,6 @@ module OpenTox subject = RDF::Query.execute(@rdf) do pattern [:subject, RDF.type, RDF::OT.ErrorReport] end.limit(1).select(:subject) - }) @rdf << [subject, RDF::OT.actor, uri] end @@ -126,13 +126,27 @@ module OpenTox end # overwrite backtick operator to catch system errors -class Object - def `(code) - msg = super("#{code} 2>&1").chomp - internal_server_error msg unless $?.to_i == 0 - msg - rescue Errno::ENOENT => e - internal_server_error e +module Kernel + + # Override raises an error if _cmd_ returns a non-zero exit status. + # Returns stdout if _cmd_ succeeds. Note that these are simply concatenated; STDERR is not inline. + def ` cmd + stdout, stderr = '' + status = Open4::popen4(cmd) do |pid, stdin_stream, stdout_stream, stderr_stream| + stdout = stdout_stream.read + stderr = stderr_stream.read + end + raise stderr.strip if !status.success? + return stdout + rescue Exception + internal_server_error "'#{cmd}' failed with: '#{$!.message}'" + end + + alias_method :system!, :system + + def system cmd + `#{cmd}` + return true end end diff --git a/opentox-client.gemspec b/opentox-client.gemspec index 7ba3ab0..82a5bef 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -24,4 +24,5 @@ Gem::Specification.new do |s| s.add_runtime_dependency "rest-client" s.add_runtime_dependency "rdf" s.add_runtime_dependency "rdf-raptor" + s.add_runtime_dependency "open4" end -- cgit v1.2.3 From 2f6d5c75fc1fece5fc10cc7c45ad59cf6b820d64 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 7 Mar 2012 17:13:48 +0000 Subject: error and dataset tests added, wait_for_task moved to URI.to_object --- lib/error.rb | 10 ++++--- lib/opentox.rb | 20 +++++++------ lib/overwrite.rb | 27 +++++++++++++++-- lib/rest-client-wrapper.rb | 73 +++++++++++++--------------------------------- test/dataset.rb | 57 ++++++++++++++++++++++++++++++++++++ test/error.rb | 35 ++++++++++++++++++++++ 6 files changed, 154 insertions(+), 68 deletions(-) create mode 100644 test/dataset.rb create mode 100644 test/error.rb diff --git a/lib/error.rb b/lib/error.rb index b65651f..2033c1e 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -5,7 +5,9 @@ class RuntimeError attr_accessor :report, :http_code def initialize message super message + self.set_backtrace message.backtrace if message.is_a? Exception @http_code ||= 500 + puts self.class @report = OpenTox::ErrorReport.create self $logger.error "\n"+@report.to_turtle end @@ -77,9 +79,10 @@ module OpenTox errorDetails += "REST paramenters:\n#{error.request.args.inspect}" end error.respond_to?(:http_code) ? statusCode = error.http_code : statusCode = 500 + puts error.inspect if error.respond_to? :response - statusCode = error.response.code - message = error.body + statusCode = error.response.code if error.response + message = error.response.body end statusCode = error.http_code if error.respond_to? :http_code report.rdf << [subject, RDF::OT.statusCode, statusCode ] @@ -87,7 +90,6 @@ module OpenTox # TODO: remove kludge for old task services report.http_code = statusCode report.rdf << [subject, RDF::OT.message , message ] - errorDetails += "\nBacktrace:\n" + error.backtrace.short_backtrace if error.respond_to?(:backtrace) and error.backtrace report.rdf << [subject, RDF::OT.errorDetails, errorDetails ] # TODO Error cause @@ -139,7 +141,7 @@ module Kernel raise stderr.strip if !status.success? return stdout rescue Exception - internal_server_error "'#{cmd}' failed with: '#{$!.message}'" + internal_server_error $! end alias_method :system!, :system diff --git a/lib/opentox.rb b/lib/opentox.rb index 566c458..9ba64bd 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -70,8 +70,7 @@ module OpenTox def delete headers={} headers[:subjectid] ||= @subjectid - headers[:accept] ||= 'application/rdf+xml' - @response = RestClientWrapper.delete(@uri.to_s,:subjectid => @subjectid) + @response = RestClientWrapper.delete(@uri.to_s,nil,nil,headers) end # class methods @@ -82,23 +81,26 @@ module OpenTox subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")") end - def from_file service_uri, file, subjectid=nil - RestClientWrapper.post(service_uri, :file => File.new(file), :subjectid => subjectid).chomp.to_object + def from_file service_uri, filename, subjectid=nil + file = File.new filename + uri = RestClientWrapper.post(service_uri, {:file => file}, {:subjectid => subjectid, :content_type => file.mime_type, :accept => "text/uri-list"}) + puts uri end def all service_uri, subjectid=nil - uris = RestClientWrapper.get(service_uri, nil, {:accept => 'text/uri-list'}).split("\n").compact + uris = RestClientWrapper.get(service_uri, {}, :accept => 'text/uri-list').split("\n").compact uris.collect{|uri| subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")")} end end - # create default classes - SERVICES.each do |s| - eval "class #{s} + # create default OpenTox classes + SERVICES.each do |klass| + c = Class.new do include OpenTox extend OpenTox::ClassMethods - end" + end + OpenTox.const_set klass,c end end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index f0dcda9..c7a1d43 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -23,8 +23,13 @@ module URI end def self.accessible? uri, subjectid=nil - Net::HTTP.get_response(URI.parse(uri)) - true + if URI.task? uri + # just ry to get a response, valid tasks may return codes > 400 + Net::HTTP.get_response(URI.parse(uri)) + true + else + Net::HTTP.get_response(URI.parse(uri)).code.to_i < 400 + end rescue false end @@ -36,5 +41,23 @@ module URI false end + def self.to_object uri, wait=true + + # TODO add waiting task + if task? uri and wait + t = OpenTox::Task.new(uri) + t.wait + uri = t.resultURI + end + + klass = + subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")") + end + end +class File + def mime_type + `file -ib #{self.path}`.chomp + end +end diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 64c7d7e..e594729 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -13,7 +13,7 @@ module OpenTox # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @param [wait,Boolean] Set to false to NOT wait for task if result is a task # @return [RestClient::Response] REST call response - [:head,:get,:post,:put,:dealete].each do |method| + [:head,:get,:post,:put,:delete].each do |method| define_singleton_method method do |uri,payload={},headers={},waiting_task=nil, wait=true| @@ -25,64 +25,40 @@ module OpenTox args[:payload] = payload headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems args[:headers] = headers - @request = RestClient::Request.new(args) # check input bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri - bad_request_error "Unreachable URI: '#{uri}'" unless URI.accessible? uri + not_found_error "URI '#{uri}' not found." unless URI.accessible? uri bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] end - bad_request_error "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) + #bad_request_error "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) - - begin - @response = @request.execute do |response, request, result| - # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader - rest_error "Response code is #{response.code}" unless response.code < 400 or URI.task? uri - return response - end - - return @response if @response.code==200 or !wait + # perform request + @request = RestClient::Request.new(args) + #begin + # do not throw RestClient exceptions in order to create a @response object (needed for error reports) in every case + @response = @request.execute { |response, request, result| return response } + # ignore error codes from Task services (may return error codes >= 400 according to API, which causes exceptions in RestClient and RDF::Reader) + raise OpenTox::RestCallError.new @request, @response, "Response code is #{@response.code}." unless @response.code < 400 or URI.task? uri + #return @response if @response.code==200 or !wait # wait for task - while @response.code==201 or @response.code==202 - @response = wait_for_task(@response, uri, waiting_task) - end - return @response + #while @response.code==201 or @response.code==202 + #@response = wait_for_task(@response, uri, waiting_task) + #end + @response - rescue - rest_error $!.message - end -=begin - rescue RestClient::RequestTimeout - raise OpenTox::Error @request, @response, $!.message - #received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue Errno::ETIMEDOUT - raise OpenTox::Error @request, @response, $!.message - #received_error ex.message, 408, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue Errno::ECONNREFUSED - raise OpenTox::Error $!.message - #received_error ex.message, 500, nil, {:rest_uri => uri, :headers => headers, :payload => payload} - rescue RestClient::ExceptionWithResponse - # error comming from a different webservice, - received_error ex.http_body, ex.http_code, ex.response.net_http_res.content_type, {:rest_uri => uri, :headers => headers, :payload => payload} - #rescue OpenTox::RestCallError => ex - # already a rest-error, probably comes from wait_for_task, just pass through - #raise ex - #rescue => ex - # some internal error occuring in rest-client-wrapper, just pass through - #raise ex - end -=end + #rescue + #rest_error $!.message + #end end end +=begin def wait_for_task( response, base_uri, waiting_task=nil ) - #TODO remove TUM hack - # @response.headers[:content_type] = "text/uri-list" if base_uri =~/tu-muenchen/ and @response.headers[:content_type] == "application/x-www-form-urlencoded;charset=UTF-8" task = nil case @response.headers[:content_type] @@ -97,7 +73,6 @@ module OpenTox rest_error "Unknown content-type for task : '"+@response.headers[:content_type].to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+@response[0..200].to_s end - #LOGGER.debug "result is a task '"+task.uri.to_s+"', wait for completion" task.wait waiting_task unless task.completed? # maybe task was cancelled / error if task.errorReport @@ -111,18 +86,10 @@ module OpenTox end def self.rest_error message + puts message raise OpenTox::RestCallError.new @request, @response, message end -=begin - def self.bad_request_error message - raise OpenTox::Error.new message - end - - def self.not_found_error message - raise OpenTox::NotFoundError.new message - end - def self.received_error( body, code, content_type=nil, params=nil ) # try to parse body TODO diff --git a/test/dataset.rb b/test/dataset.rb new file mode 100644 index 0000000..13012bd --- /dev/null +++ b/test/dataset.rb @@ -0,0 +1,57 @@ +require 'test/unit' +$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') +require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' + +class DatasetTest < Test::Unit::TestCase + +=begin + def test_post_get_delete + service_uri = "http://ot-dev.in-silico.ch/dataset" + dataset = OpenTox::Dataset.create service_uri + assert_match /#{service_uri}/, dataset.uri.to_s + puts dataset.uri + puts dataset.class + puts dataset.to_yaml + metadata = dataset.metadata + puts dataset.class + assert_equal RDF::OT.Dataset, metadata[RDF.type] + assert_equal dataset.uri, metadata[RDF::XSD.anyURI] + dataset.delete + end + def test_all + datasets = OpenTox::Dataset.all "http://ot-dev.in-silico.ch/dataset" + assert_equal OpenTox::Dataset, datasets.first.class + end + + def test_create + d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset" + assert_equal OpenTox::Dataset, d.class + puts d.delete + assert_raise OpenTox::NotFoundError do + puts d.get(:accept => 'application/x-yaml') + end + end +=end + + def test_create_from_file + d = OpenTox::Dataset.from_file "http://ot-dev.in-silico.ch/dataset", "data/EPAFHM.mini.csv" + assert_equal OpenTox::Dataset, d.class + puts d.inspect + + end + +=begin + def test_save + d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset" + d.metadata + d.metadata[RDF::DC.title] = "test" + d.save + # TODO: save does not work with datasets + #puts d.response.code.inspect + #assert_equal "test", d.metadata[RDF::DC.title] # should reload metadata + d.delete + end +=end + + +end diff --git a/test/error.rb b/test/error.rb new file mode 100644 index 0000000..af5db52 --- /dev/null +++ b/test/error.rb @@ -0,0 +1,35 @@ +require 'test/unit' +$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') +require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' + +class ErrorTest < Test::Unit::TestCase + + def test_bad_request + object = OpenTox::Feature.new "http://this-is-a/fantasy/url" + assert_raise OpenTox::BadRequestError do + response = object.get + end + end + + def test_error_methods + assert_raise OpenTox::NotFoundError do + not_found_error "This is a test" + end + end + + def test_exception + assert_raise Exception do + raise Exception.new "Basic Exception" + end + end + + def test_backtick + assert_raise OpenTox::InternalServerError do + `this call will not work` + end + assert_raise OpenTox::InternalServerError do + `ls inexisting_directory` + end + end + +end -- cgit v1.2.3 From 63fcd8f8feed58af4b1e1ff0e5fdaa09791c9596 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 8 Mar 2012 15:23:43 +0000 Subject: improved integration of error reports, call stack added as errorDetails --- lib/error.rb | 147 ++++++++++++++------------------------------- lib/opentox-client.rb | 16 +++++ lib/opentox.rb | 118 ++++++++++++++++++++++++------------ lib/overwrite.rb | 55 ++++++++++++----- lib/rest-client-wrapper.rb | 122 +++++-------------------------------- lib/task.rb | 37 ++++-------- test/dataset.rb | 44 ++++++-------- test/error.rb | 2 +- test/feature.rb | 4 +- test/task.rb | 6 +- 10 files changed, 236 insertions(+), 315 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 2033c1e..0ab2c73 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,24 +1,27 @@ require 'open4' -# adding additional fields to Exception class to format errors according to OT-API +# add additional fields to Exception class to format errors according to OT-API class RuntimeError - attr_accessor :report, :http_code - def initialize message + attr_accessor :http_code, :uri + def initialize message, uri=nil super message - self.set_backtrace message.backtrace if message.is_a? Exception + @uri = uri @http_code ||= 500 - puts self.class - @report = OpenTox::ErrorReport.create self - $logger.error "\n"+@report.to_turtle + $logger.error "\n"+self.report.to_turtle + end + + def report + # TODO: remove kludge for old task services + OpenTox::ErrorReport.new(@http_code, self) end end module OpenTox class Error < RuntimeError - def initialize code, message + def initialize code, message, uri=nil @http_code = code - super message + super message, uri end end @@ -35,15 +38,16 @@ module OpenTox }.each do |klass,code| # create error classes c = Class.new Error do - define_method :initialize do |message| - super code, message + define_method :initialize do |message, uri=nil| + super code, message, uri end end OpenTox.const_set klass,c # define global methods for raising errors, eg. bad_request_error Object.send(:define_method, klass.underscore.to_sym) do |message| - raise c.new message + defined?(@uri) ? uri = @uri : uri=nil + raise c, message, uri end end @@ -53,61 +57,41 @@ module OpenTox def initialize request, response, message @request = request @response = response - super 502, message + super 502, message, request.url end end + # TODO: create reports directly from errors, requires modified task service class ErrorReport - - attr_accessor :rdf # RDF Graph - attr_accessor :http_code # TODO: remove when task service is fixed - - def initialize - @rdf = RDF::Graph.new - end - - # creates a error report object, from an ruby-exception object - # @param [Exception] error - def self.create error - report = ErrorReport.new - subject = RDF::Node.new - report.rdf << [subject, RDF.type, RDF::OT.ErrorReport] - message = error.message - errorDetails = "" - if error.respond_to? :request - report.rdf << [subject, RDF::OT.actor, error.request.url ] - errorDetails += "REST paramenters:\n#{error.request.args.inspect}" - end - error.respond_to?(:http_code) ? statusCode = error.http_code : statusCode = 500 - puts error.inspect - if error.respond_to? :response - statusCode = error.response.code if error.response - message = error.response.body - end - statusCode = error.http_code if error.respond_to? :http_code - report.rdf << [subject, RDF::OT.statusCode, statusCode ] - report.rdf << [subject, RDF::OT.errorCode, error.class.to_s ] - # TODO: remove kludge for old task services - report.http_code = statusCode - report.rdf << [subject, RDF::OT.message , message ] - errorDetails += "\nBacktrace:\n" + error.backtrace.short_backtrace if error.respond_to?(:backtrace) and error.backtrace - report.rdf << [subject, RDF::OT.errorDetails, errorDetails ] - # TODO Error cause - #report.rdf << [subject, OT.errorCause, error.report] if error.respond_to?(:report) and !error.report.empty? - report + def initialize http_code, error + @http_code = http_code + #@report = report#.to_yaml + @report = {} + @report[RDF::OT.actor] = error.uri + @report[RDF::OT.message] = error.message + @report[RDF::OT.statusCode] = @http_code + @report[RDF::OT.errorCode] = error.class.to_s + @report[RDF::OT.errorDetails] = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact.join("\n") + @report[RDF::OT.errorDetails] += "REST paramenters:\n#{error.request.args.inspect}" if defined? error.request + @report[RDF::OT.message] += "\n" + error.response.body if defined? error.response + # TODO fix Error cause + #report[RDF::OT.errorCause] = @report if defined?(@report) end - def actor=(uri) - # TODO: test actor assignement (in opentox-server) - subject = RDF::Query.execute(@rdf) do - pattern [:subject, RDF.type, RDF::OT.ErrorReport] - end.limit(1).select(:subject) - @rdf << [subject, RDF::OT.actor, uri] - end - # define to_ and self.from_ methods for various rdf formats - [:rdfxml,:ntriples,:turtle].each do |format| + RDF_FORMATS.each do |format| + + send :define_method, "to_#{format}".to_sym do + rdf = RDF::Writer.for(format).buffer do |writer| + subject = RDF::Node.new + @report.each do |predicate,object| + writer << [subject, predicate, object] if object + end + end + rdf + end +=begin define_singleton_method "from_#{format}".to_sym do |rdf| report = ErrorReport.new RDF::Reader.for(format).new(rdf) do |reader| @@ -115,50 +99,7 @@ module OpenTox end report end - - send :define_method, "to_#{format}".to_sym do - rdfxml = RDF::Writer.for(format).buffer do |writer| - @rdf.each{|statement| writer << statement} - end - rdfxml - end - end - - end -end - -# overwrite backtick operator to catch system errors -module Kernel - - # Override raises an error if _cmd_ returns a non-zero exit status. - # Returns stdout if _cmd_ succeeds. Note that these are simply concatenated; STDERR is not inline. - def ` cmd - stdout, stderr = '' - status = Open4::popen4(cmd) do |pid, stdin_stream, stdout_stream, stderr_stream| - stdout = stdout_stream.read - stderr = stderr_stream.read - end - raise stderr.strip if !status.success? - return stdout - rescue Exception - internal_server_error $! - end - - alias_method :system!, :system - - def system cmd - `#{cmd}` - return true - end -end - -class Array - def short_backtrace - short = [] - each do |c| - break if c =~ /sinatra\/base/ - short << c +=end end - short.join("\n") end end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index a587aa5..7d9329d 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -6,6 +6,22 @@ require "rest-client" require 'uri' require 'yaml' require 'logger' + +# define constants and global variables +#TODO: switch services to 1.2 +RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' +RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' +RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' + +#CLASSES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "ErrorReport", "Investigation"] +CLASSES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] +RDF_FORMATS = [:rdfxml,:ntriples,:turtle] +$default_rdf = "application/rdf+xml" + +# Regular expressions for parsing classification data +TRUE_REGEXP = /^(true|active|1|1.0|tox|activating|carcinogen|mutagenic)$/i +FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-mutagenic)$/i + require File.join(File.dirname(__FILE__),"overwrite.rb") require File.join(File.dirname(__FILE__),"error.rb") require File.join(File.dirname(__FILE__),"rest-client-wrapper.rb") diff --git a/lib/opentox.rb b/lib/opentox.rb index 9ba64bd..342b04e 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -1,52 +1,73 @@ -#TODO: switch services to 1.2 -RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' -RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' -RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' - -SERVICES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] - -# Regular expressions for parsing classification data -TRUE_REGEXP = /^(true|active|1|1.0|tox|activating|carcinogen|mutagenic)$/i -FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-mutagenic)$/i - # defaults to stderr, may be changed to file output (e.g in opentox-service) $logger = OTLogger.new(STDERR) $logger.level = Logger::DEBUG module OpenTox - attr_accessor :subjectid, :uri, :response - attr_writer :metadata + attr_accessor :uri, :subjectid, :rdf, :response + # Ruby interface + + # Create a new OpenTox object (does not load data from service) + # @param [optional,String] URI + # @param [optional,String] subjectid + # @return [OpenTox] OpenTox object def initialize uri=nil, subjectid=nil - @uri = uri.chomp + @uri = uri.to_s.chomp @subjectid = subjectid + @rdf = RDF::Graph.new end - # Ruby interface + # Load metadata from service + def pull + kind_of?(OpenTox::Dataset) ? uri = File.join(@uri,"metadata") : uri = @uri + # TODO generic method for all formats + parse_rdfxml RestClientWrapper.get(uri,{},{:accept => $default_rdf, :subjectid => @subjectid}) + end - def metadata reload=true - if reload or @metadata.empty? - @metadata = {} - kind_of?(OpenTox::Dataset) ? uri = File.join(@uri,"metadata") : uri = @uri - RDF::Reader.for(:rdfxml).new( RestClientWrapper.get(uri) ) do |reader| - reader.each_statement do |statement| - @metadata[statement.predicate] = statement.object if statement.subject == @uri - end - end + # Get object metadata + # @return [Hash] Metadata + def metadata + pull if @rdf.empty? + metadata = {} + @rdf.query([RDF::URI.new(@uri),nil,nil]).collect do |statement| + metadata[statement.predicate] ||= [] + metadata[statement.predicate] << statement.object end - @metadata + metadata + end + + # Get metadata values + # @param [RDF] Key from RDF Vocabularies + # @return [Array] Values for supplied key + def [](key) + pull if @rdf.empty? + @rdf.query([RDF::URI.new(@uri),key,nil]).collect{|statement| statement.object} end + # Save object at service def save - post self.to_rdfxml, { :content_type => 'application/rdf+xml'} + #TODO: dynamic assignment + post self.to_rdfxml, { :content_type => $default_rdf} end - def to_rdfxml - rdf = RDF::Writer.for(:rdfxml).buffer do |writer| - @metadata.each { |p,o| writer << RDF::Statement.new(RDF::URI.new(@uri), p, o) } + RDF_FORMATS.each do |format| + + # rdf parse methods for all formats e.g. parse_rdfxml + send :define_method, "parse_#{format}".to_sym do |rdf| + @rdf = RDF::Graph.new + RDF::Reader.for(format).new(rdf) do |reader| + reader.each_statement{ |statement| @rdf << statement } + end + end + + # rdf serialization methods for all formats e.g. to_rdfxml + send :define_method, "to_#{format}".to_sym do + rdf = RDF::Writer.for(format).buffer do |writer| + @rdf.each{|statement| writer << statement} + end + rdf end - rdf end # REST API @@ -70,32 +91,49 @@ module OpenTox def delete headers={} headers[:subjectid] ||= @subjectid - @response = RestClientWrapper.delete(@uri.to_s,nil,nil,headers) + @response = RestClientWrapper.delete(@uri.to_s,nil,headers) end # class methods module ClassMethods + def all service_uri, subjectid=nil + uris = RestClientWrapper.get(service_uri, {}, :accept => 'text/uri-list').split("\n").compact + uris.collect{|uri| URI.task?(service_uri) ? from_uri(uri, subjectid, false) : from_uri(uri, subjectid)} + end + def create service_uri, subjectid=nil - uri = RestClientWrapper.post(service_uri, {}, :subjectid => subjectid).chomp - subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")") + uri = RestClientWrapper.post(service_uri, {}, {:accept => 'text/uri-list', :subjectid => subjectid}) + URI.task?(service_uri) ? from_uri(uri, subjectid, false) : from_uri(uri, subjectid) end def from_file service_uri, filename, subjectid=nil file = File.new filename - uri = RestClientWrapper.post(service_uri, {:file => file}, {:subjectid => subjectid, :content_type => file.mime_type, :accept => "text/uri-list"}) - puts uri + from_uri RestClientWrapper.post(service_uri, {:file => file}, {:subjectid => subjectid, :content_type => file.mime_type, :accept => "text/uri-list"}), subjectid end - def all service_uri, subjectid=nil - uris = RestClientWrapper.get(service_uri, {}, :accept => 'text/uri-list').split("\n").compact - uris.collect{|uri| subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")")} - end + private + def from_uri uri, subjectid=nil, wait=true + + uri.chomp! + # TODO add waiting task + if URI.task? uri and wait + t = OpenTox::Task.new(uri) + t.wait + uri = t.resultURI + end + # guess class from uri, this is potentially unsafe, but polling metadata from large uri lists is way too slow (and not all service provide RDF.type in their metadata) + result = CLASSES.collect{|s| s if uri =~ /#{s.downcase}/}.compact + internal_server_error "Cannot determine class from URI: '#{uri}.\nCandidate classes are #{result.inspect}" unless result.size == 1 + klass = result.first + # initialize with/without subjectid + subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")") + end end # create default OpenTox classes - SERVICES.each do |klass| + CLASSES.each do |klass| c = Class.new do include OpenTox extend OpenTox::ClassMethods diff --git a/lib/overwrite.rb b/lib/overwrite.rb index c7a1d43..7b6cb4f 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -10,6 +10,10 @@ end module URI + def self.compound? uri + uri =~ /compound/ and URI.valid? uri + end + def self.task? uri uri =~ /task/ and URI.valid? uri end @@ -23,8 +27,8 @@ module URI end def self.accessible? uri, subjectid=nil - if URI.task? uri - # just ry to get a response, valid tasks may return codes > 400 + if URI.task? uri or URI.compound? uri + # just try to get a response, valid tasks may return codes > 400 Net::HTTP.get_response(URI.parse(uri)) true else @@ -41,23 +45,46 @@ module URI false end - def self.to_object uri, wait=true +end - # TODO add waiting task - if task? uri and wait - t = OpenTox::Task.new(uri) - t.wait - uri = t.resultURI - end +class File + def mime_type + `file -ib #{self.path}`.chomp + end +end - klass = - subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")") +# overwrite backtick operator to catch system errors +module Kernel + + # Override raises an error if _cmd_ returns a non-zero exit status. + # Returns stdout if _cmd_ succeeds. Note that these are simply concatenated; STDERR is not inline. + def ` cmd + stdout, stderr = '' + status = Open4::popen4(cmd) do |pid, stdin_stream, stdout_stream, stderr_stream| + stdout = stdout_stream.read + stderr = stderr_stream.read + end + raise stderr.strip if !status.success? + return stdout + rescue Exception + internal_server_error $! end + alias_method :system!, :system + + def system cmd + `#{cmd}` + return true + end end -class File - def mime_type - `file -ib #{self.path}`.chomp +class Array + def short_backtrace + short = [] + each do |c| + break if c =~ /sinatra\/base/ + short << c + end + short.join("\n") end end diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index e594729..c9e6bbb 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -10,21 +10,10 @@ module OpenTox # @param [String] destination URI # @param [optional,Hash|String] Payload data posted to the service # @param [optional,Hash] Headers with params like :accept, :content_type, :subjectid - # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @param [wait,Boolean] Set to false to NOT wait for task if result is a task # @return [RestClient::Response] REST call response [:head,:get,:post,:put,:delete].each do |method| - define_singleton_method method do |uri,payload={},headers={},waiting_task=nil, wait=true| - - # create request - args={} - args[:method] = method - args[:url] = uri - args[:timeout] = 600 - args[:payload] = payload - headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems - args[:headers] = headers + define_singleton_method method do |uri,payload={},headers={}| # check input bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri @@ -34,106 +23,25 @@ module OpenTox [:accept,:content_type,:subjectid].each do |header| bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] end - #bad_request_error "waiting_task is not 'nil', OpenTox::SubTask or OpenTox::Task: #{waiting_task.class}" unless waiting_task.nil? or waiting_task.is_a?(OpenTox::Task) or waiting_task.is_a?(OpenTox::SubTask) + + # create request + args={} + args[:method] = method + args[:url] = uri + args[:timeout] = 600 + args[:payload] = payload + headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems + args[:headers] = headers # perform request @request = RestClient::Request.new(args) - #begin - # do not throw RestClient exceptions in order to create a @response object (needed for error reports) in every case - @response = @request.execute { |response, request, result| return response } - # ignore error codes from Task services (may return error codes >= 400 according to API, which causes exceptions in RestClient and RDF::Reader) - raise OpenTox::RestCallError.new @request, @response, "Response code is #{@response.code}." unless @response.code < 400 or URI.task? uri - #return @response if @response.code==200 or !wait - - # wait for task - #while @response.code==201 or @response.code==202 - #@response = wait_for_task(@response, uri, waiting_task) - #end - @response - - #rescue - #rest_error $!.message - #end - end - end - -=begin - def wait_for_task( response, base_uri, waiting_task=nil ) - - task = nil - case @response.headers[:content_type] - when /application\/rdf\+xml/ - # TODO: task uri from rdf - #task = OpenTox::Task.from_rdfxml(@response) - #task = OpenTox::Task.from_rdfxml(@response) - when /text\/uri-list/ - rest_error "Uri list has more than one entry, should be a single task" if @response.split("\n").size > 1 #if uri list contains more then one uri, its not a task - task = OpenTox::Task.new(@response.to_s.chomp) if URI.available? @response.to_s - else - rest_error "Unknown content-type for task : '"+@response.headers[:content_type].to_s+"'"+" base-uri: "+base_uri.to_s+" content: "+@response[0..200].to_s + # do not throw RestClient exceptions in order to create a @response object (needed for error reports) in every case + @response = @request.execute { |response, request, result| return response } + # ignore error codes from Task services (may return error codes >= 400 according to API, which causes exceptions in RestClient and RDF::Reader) + raise OpenTox::RestCallError.new @request, @response, "Response code is #{@response.code}." unless @response.code < 400 or URI.task? uri + @response end - - task.wait waiting_task - unless task.completed? # maybe task was cancelled / error - if task.errorReport - received_error task.errorReport, task.http_code, nil, {:rest_uri => task.uri, :rest_code => task.http_code} - else - rest_error "Status of task '"+task.uri.to_s+"' is no longer running (hasStatus is '"+task.status+ - "'), but it is neither completed nor has an errorReport" - end - end - @response - end - - def self.rest_error message - puts message - raise OpenTox::RestCallError.new @request, @response, message end - def self.received_error( body, code, content_type=nil, params=nil ) - - # try to parse body TODO - body.is_a?(OpenTox::ErrorReport) ? report = body : report = OpenTox::ErrorReport.from_rdf(body) - rest_call_error "REST call returned error: '"+body.to_s+"'" unless report - # parsing sucessfull - # raise RestCallError with parsed report as error cause - err = OpenTox::RestCallError.new(@request, @response, "REST call subsequent error") - err.errorCause = report - raise err - end -=end -=begin - def self.received_error( body, code, content_type=nil, params=nil ) - - # try to parse body - report = nil - #report = OpenTox::ErrorReport.from_rdf(body) - if body.is_a?(OpenTox::ErrorReport) - report = body - else - case content_type - when /yaml/ - report = YAML.load(body) - when /rdf/ - report = OpenTox::ErrorReport.from_rdf(body) - end - end - - unless report - # parsing was not successfull - # raise 'plain' RestCallError - err = OpenTox::RestCallError.new("REST call returned error: '"+body.to_s+"'") - err.rest_params = params - raise err - else - # parsing sucessfull - # raise RestCallError with parsed report as error cause - err = OpenTox::RestCallError.new("REST call subsequent error") - err.errorCause = report - err.rest_params = params - raise err - end - end -=end end end diff --git a/lib/task.rb b/lib/task.rb index 3a52dee..0562dc7 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -15,13 +15,11 @@ module OpenTox pid = fork do begin result_uri = yield - if URI.accessible?(result_uri) - task.completed result_uri - else - not_found_error "\"#{result_uri}\" is not a valid result URI" - end + task.completed result_uri rescue - task.error $! + RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.report.to_yaml}) + task.kill + #raise $! end end Process.detach(pid) @@ -49,11 +47,13 @@ module OpenTox end def description - metadata[RDF::DC.description] + pull + self.[](RDF::DC.description).uniq.first end def creator - metadata[RDF::DC.creator] + pull + self.[](RDF::DC.creator).uniq.first end def cancel @@ -66,16 +66,6 @@ module OpenTox RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) end - def error error - # TODO: switch task service to rdf - #RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => error.report.to_rdfxml}) - # create report for non-runtime errors - error.respond_to?(:reporti) ? report = error.report : report = OpenTox::ErrorReport.create(error) - RestClientWrapper.put(File.join(@uri,'Error'),{:errorReport => report.to_yaml}) - kill - raise error - end - # waits for a task, unless time exceeds or state is no longer running # @param [optional,Numeric] dur seconds pausing before checking again for completion def wait(dur=0.3) @@ -114,12 +104,11 @@ module OpenTox res = RestClientWrapper.put(File.join(@uri,method.sub(/=/,'')),{}) super unless res.code == 200 else - response = metadata[RDF::OT[method]].to_s - response = metadata[RDF::OT1[method]].to_s if response.empty? # API 1.1 compatibility - if response.empty? - not_found_error "No #{method} metadata for #{@uri} " - end - return response + pull + response = self.[](RDF::OT[method]) + response = self.[](RDF::OT1[method]) if response.empty? # API 1.1 compatibility + internal_server_error "No #{method} metadata for #{@uri} " if response.empty? + return response.uniq.first.to_s end rescue OpenTox::Error raise $! diff --git a/test/dataset.rb b/test/dataset.rb index 13012bd..d2c8d57 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -4,43 +4,39 @@ require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' class DatasetTest < Test::Unit::TestCase -=begin - def test_post_get_delete - service_uri = "http://ot-dev.in-silico.ch/dataset" - dataset = OpenTox::Dataset.create service_uri - assert_match /#{service_uri}/, dataset.uri.to_s - puts dataset.uri - puts dataset.class - puts dataset.to_yaml - metadata = dataset.metadata - puts dataset.class - assert_equal RDF::OT.Dataset, metadata[RDF.type] - assert_equal dataset.uri, metadata[RDF::XSD.anyURI] - dataset.delete - end def test_all datasets = OpenTox::Dataset.all "http://ot-dev.in-silico.ch/dataset" assert_equal OpenTox::Dataset, datasets.first.class end - def test_create - d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset" + def test_create_empty + service_uri = "http://ot-dev.in-silico.ch/dataset" + d = OpenTox::Dataset.create service_uri assert_equal OpenTox::Dataset, d.class - puts d.delete - assert_raise OpenTox::NotFoundError do - puts d.get(:accept => 'application/x-yaml') - end + assert_match /#{service_uri}/, d.uri.to_s + d.delete end -=end def test_create_from_file - d = OpenTox::Dataset.from_file "http://ot-dev.in-silico.ch/dataset", "data/EPAFHM.mini.csv" + d = OpenTox::Dataset.from_file "http://ot-dev.in-silico.ch/dataset", File.join(File.dirname(__FILE__),"data","EPAFHM.mini.csv") assert_equal OpenTox::Dataset, d.class - puts d.inspect - + d.delete + assert_raise OpenTox::NotFoundError do + d.get + end end + =begin + def test_metadata + d = OpenTox::Dataset.from_file "http://ot-dev.in-silico.ch/dataset", "data/EPAFHM.mini.csv" + assert_equal OpenTox::Dataset, d.class + # TODO fix metadata retrieval + metadata = d.metadata + assert_equal RDF::OT.Dataset, metadata[RDF.type] + assert_equal dataset.uri, metadata[RDF::XSD.anyURI] + d.delete + end def test_save d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset" d.metadata diff --git a/test/error.rb b/test/error.rb index af5db52..d736620 100644 --- a/test/error.rb +++ b/test/error.rb @@ -6,7 +6,7 @@ class ErrorTest < Test::Unit::TestCase def test_bad_request object = OpenTox::Feature.new "http://this-is-a/fantasy/url" - assert_raise OpenTox::BadRequestError do + assert_raise OpenTox::NotFoundError do response = object.get end end diff --git a/test/feature.rb b/test/feature.rb index 1308e77..01c2206 100644 --- a/test/feature.rb +++ b/test/feature.rb @@ -16,7 +16,9 @@ class FeatureTest < Test::Unit::TestCase def test_feature @features.each do |uri| f = OpenTox::Feature.new(uri) - assert_equal RDF::OT1.Feature, f.metadata[RDF.type] + assert_equal [RDF::OT1.TUM_CDK_nAtom], f[RDF::OWL.sameAs] + assert_equal RDF::OT1.TUM_CDK_nAtom, f.metadata[RDF::OWL.sameAs].first + assert_equal [RDF::OT1.Feature,RDF::OT1.NumericFeature].sort, f[RDF.type].sort end end diff --git a/test/task.rb b/test/task.rb index 932d5c9..adbba12 100644 --- a/test/task.rb +++ b/test/task.rb @@ -10,12 +10,14 @@ TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" class TaskTest < Test::Unit::TestCase +=begin +=end def test_all all = OpenTox::Task.all(TASK_SERVICE_URI) assert_equal Array, all.class t = all.last assert_equal OpenTox::Task, t.class - assert_equal RDF::OT1.Task, t.metadata[RDF.type] + assert_equal RDF::OT1.Task, t[RDF.type].first end def test_create_and_complete @@ -77,5 +79,7 @@ class TaskTest < Test::Unit::TestCase assert task.error? assert_equal "Error", task.hasStatus end +=begin +=end end -- cgit v1.2.3 From 47672c664cda9f139fbd8d522a7ffbdf6813dd27 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 8 Mar 2012 19:16:21 +0000 Subject: TODO reminder --- lib/error.rb | 1 + opentox-client.gemspec | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/error.rb b/lib/error.rb index 0ab2c73..7fc2461 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -47,6 +47,7 @@ module OpenTox # define global methods for raising errors, eg. bad_request_error Object.send(:define_method, klass.underscore.to_sym) do |message| defined?(@uri) ? uri = @uri : uri=nil + # TODO: insert uri from sinatra raise c, message, uri end end diff --git a/opentox-client.gemspec b/opentox-client.gemspec index 82a5bef..0dfa86a 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -19,7 +19,6 @@ Gem::Specification.new do |s| s.require_paths = ["lib"] # specify any dependencies here; for example: - # s.add_development_dependency "rspec" s.add_runtime_dependency "bundler" s.add_runtime_dependency "rest-client" s.add_runtime_dependency "rdf" -- cgit v1.2.3 From edfdc45754c05507deb63b16cb09dbdca6c8400f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 9 Mar 2012 21:52:20 +0000 Subject: gemspec updated --- Rakefile | 3 ++- lib/opentox-client/version.rb | 5 ----- opentox-client.gemspec | 3 +-- 3 files changed, 3 insertions(+), 8 deletions(-) delete mode 100644 lib/opentox-client/version.rb diff --git a/Rakefile b/Rakefile index ca1db1c..8cbd043 100644 --- a/Rakefile +++ b/Rakefile @@ -1,9 +1,10 @@ require File.join(File.dirname(__FILE__),"lib","opentox-client.rb") require "bundler/gem_tasks" - require 'rake/testtask' + Rake::TestTask.new do |t| t.libs << 'lib' + t.libs << 'test' t.test_files = FileList['test/*.rb'] t.verbose = true end diff --git a/lib/opentox-client/version.rb b/lib/opentox-client/version.rb deleted file mode 100644 index d90a728..0000000 --- a/lib/opentox-client/version.rb +++ /dev/null @@ -1,5 +0,0 @@ -module Opentox - module Client - VERSION = "0.0.1" - end -end diff --git a/opentox-client.gemspec b/opentox-client.gemspec index 0dfa86a..f8fb9a4 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -1,10 +1,9 @@ # -*- encoding: utf-8 -*- $:.push File.expand_path("../lib", __FILE__) -require "opentox-client/version" Gem::Specification.new do |s| s.name = "opentox-client" - s.version = Opentox::Client::VERSION + s.version = "0.0.1pre" s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] s.email = ["helma@in-silico.ch"] s.homepage = "http://github.com/opentox/opentox-client" -- cgit v1.2.3 From e11e5c3a521561cc42b80c667c12e71438ea12e1 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 9 Mar 2012 22:04:06 +0000 Subject: gemspec updated --- README.markdown | 32 +++----------------------------- opentox-client.gemspec | 1 + 2 files changed, 4 insertions(+), 29 deletions(-) diff --git a/README.markdown b/README.markdown index 5f12ad9..f4e20f4 100644 --- a/README.markdown +++ b/README.markdown @@ -6,38 +6,12 @@ Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API Installation ------------ - sudo gem install opentox-ruby-minimal + gem install opentox-client -opentox-ruby depends on [rapper](http://librdf.org/raptor/rapper.html) for parsing OWL-DL in RDFXML format. - -Quickstart ----------- - -This example shows how to create a lazar model and predict a compound, it assumes that you have access to a working installation of OpenTox services with corresponding settings in $HOME/.opentox/config. Run the following code in irb or from a ruby script: - - require 'rubygems' - require 'opentox-ruby' - - # Authenticate - subjectid = OpenTox::Authorization.authenticate(USER,PASSWORD) - - # Upload a dataset - training_dataset = OpenTox::Dataset.create_from_csv_file(TRAINING_DATASET, subjectid) - - # Create a prediction model - model_uri = OpenTox::Algorithm::Lazar.new.run({:dataset_uri => training_dataset.uri, :subjectid => subjectid}).to_s - lazar = OpenTox::Model::Lazar.find model_uri, subjectid - - # Predict a compound - compound = OpenTox::Compound.from_smiles("c1ccccc1NN") - prediction_uri = lazar.run(:compound_uri => compound.uri, :subjectid => subjectid) - prediction = OpenTox::LazarPrediction.find(prediction_uri, subjectid) - puts prediction.to_yaml - -[API documentation](http://rdoc.info/gems/opentox-ruby-minimal) +[API documentation](http://rdoc.info/gems/opentox-client) ------------------------------------------------------------------- Copyright --------- -Copyright (c) 2009-2011 Christoph Helma, Martin Guetlein, Micha Rautenberg, Andreas Maunz, David Vorgrimmler, Denis Gebele. See LICENSE for details. +Copyright (c) 2009-2012 Christoph Helma, Martin Guetlein, Micha Rautenberg, Andreas Maunz, David Vorgrimmler, Denis Gebele. See LICENSE for details. diff --git a/opentox-client.gemspec b/opentox-client.gemspec index f8fb9a4..198a6ed 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -9,6 +9,7 @@ Gem::Specification.new do |s| s.homepage = "http://github.com/opentox/opentox-client" s.summary = %q{Ruby wrapper for the OpenTox REST API} s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} + s.license = 'GPL-3' s.rubyforge_project = "opentox-client" -- cgit v1.2.3 From 44154fd1a1f2113a6439d2c00e49e6ac60a404b6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 9 Mar 2012 22:05:15 +0000 Subject: VERSION removed --- VERSION | 1 - 1 file changed, 1 deletion(-) delete mode 100644 VERSION diff --git a/VERSION b/VERSION deleted file mode 100644 index 8acdd82..0000000 --- a/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.0.1 -- cgit v1.2.3 From a6d8cafba8142e9020a388f0b48366c3d0d40d72 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 9 Mar 2012 22:05:51 +0000 Subject: .document removed --- .document | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .document diff --git a/.document b/.document deleted file mode 100644 index ecf3673..0000000 --- a/.document +++ /dev/null @@ -1,5 +0,0 @@ -README.rdoc -lib/**/*.rb -bin/* -features/**/*.feature -LICENSE -- cgit v1.2.3 From 9cf20c9fa99bac82c8a4e455eb6c97ecb3f26776 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 12 Mar 2012 14:27:08 +0100 Subject: actor uri added --- lib/error.rb | 9 +++++---- lib/task.rb | 7 +++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 7fc2461..e3329be 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -47,7 +47,6 @@ module OpenTox # define global methods for raising errors, eg. bad_request_error Object.send(:define_method, klass.underscore.to_sym) do |message| defined?(@uri) ? uri = @uri : uri=nil - # TODO: insert uri from sinatra raise c, message, uri end end @@ -68,14 +67,16 @@ module OpenTox @http_code = http_code #@report = report#.to_yaml @report = {} - @report[RDF::OT.actor] = error.uri - @report[RDF::OT.message] = error.message + @report[RDF::OT.actor] = error.uri.to_s + @report[RDF::OT.message] = error.message.to_s @report[RDF::OT.statusCode] = @http_code @report[RDF::OT.errorCode] = error.class.to_s @report[RDF::OT.errorDetails] = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact.join("\n") @report[RDF::OT.errorDetails] += "REST paramenters:\n#{error.request.args.inspect}" if defined? error.request - @report[RDF::OT.message] += "\n" + error.response.body if defined? error.response + @report[RDF::OT.message] += "\n" + error.response.body.to_s if defined? error.response # TODO fix Error cause + # should point to another errorReport, but errorReports do not have URIs + # create a separate service? #report[RDF::OT.errorCause] = @report if defined?(@report) end diff --git a/lib/task.rb b/lib/task.rb index 0562dc7..3f1b691 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,4 +1,3 @@ -require File.join(File.dirname(__FILE__),'error') DEFAULT_TASK_MAX_DURATION = 36000 module OpenTox @@ -9,7 +8,6 @@ module OpenTox def self.create service_uri, params={} - # TODO set/enforce request uri # TODO: run observer in same process? task = Task.new RestClientWrapper.post(service_uri,params).chomp pid = fork do @@ -19,7 +17,6 @@ module OpenTox rescue RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.report.to_yaml}) task.kill - #raise $! end end Process.detach(pid) @@ -43,7 +40,7 @@ module OpenTox def kill Process.kill(9,@pid) Process.kill(9,@observer_pid) - rescue # no need to raise an exeption if processes are not running + rescue # no need to raise an exeption if processes are not running end def description @@ -91,6 +88,8 @@ module OpenTox RestClientWrapper.head(@uri).code == 200 end + # TODO: add queued? + def error? code = RestClientWrapper.head(@uri).code code >= 400 and code != 503 -- cgit v1.2.3 From 625c88673e90053f898423dfc96bda1d6c0fa8eb Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 13 Mar 2012 20:52:45 +0100 Subject: short backtrace for errorDetails --- lib/error.rb | 12 +++++++++++- lib/overwrite.rb | 10 ---------- lib/task.rb | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index e3329be..cc87f47 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -71,7 +71,14 @@ module OpenTox @report[RDF::OT.message] = error.message.to_s @report[RDF::OT.statusCode] = @http_code @report[RDF::OT.errorCode] = error.class.to_s - @report[RDF::OT.errorDetails] = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact.join("\n") + + # cut backtrace + backtrace = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact + cut_index = backtrace.find_index{|line| line.match /sinatra|minitest/} + cut_index ||= backtrace.size + cut_index -= 1 + cut_index = backtrace.size-1 if cut_index < 0 + @report[RDF::OT.errorDetails] = backtrace[0..cut_index].join("\n") @report[RDF::OT.errorDetails] += "REST paramenters:\n#{error.request.args.inspect}" if defined? error.request @report[RDF::OT.message] += "\n" + error.response.body.to_s if defined? error.response # TODO fix Error cause @@ -85,6 +92,9 @@ module OpenTox send :define_method, "to_#{format}".to_sym do rdf = RDF::Writer.for(format).buffer do |writer| + # TODO: not used for turtle + # http://rdf.rubyforge.org/RDF/Writer.html# + writer.prefix :ot, RDF::URI('http://www.opentox.org/api/1.2#') subject = RDF::Node.new @report.each do |predicate,object| writer << [subject, predicate, object] if object diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 7b6cb4f..97c35aa 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -78,13 +78,3 @@ module Kernel end end -class Array - def short_backtrace - short = [] - each do |c| - break if c =~ /sinatra\/base/ - short << c - end - short.join("\n") - end -end diff --git a/lib/task.rb b/lib/task.rb index 3f1b691..be02deb 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -15,7 +15,7 @@ module OpenTox result_uri = yield task.completed result_uri rescue - RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.report.to_yaml}) + RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.report.to_yaml}) if $!.respond_to? :report task.kill end end -- cgit v1.2.3 From 87458637a9cdcee5066f2f3d087f8052fe89f064 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 14 Mar 2012 11:14:50 +0100 Subject: dataset metadata fixed --- lib/opentox.rb | 7 ++++--- test/dataset.rb | 12 ++---------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 342b04e..6ce9a12 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -31,8 +31,8 @@ module OpenTox pull if @rdf.empty? metadata = {} @rdf.query([RDF::URI.new(@uri),nil,nil]).collect do |statement| - metadata[statement.predicate] ||= [] - metadata[statement.predicate] << statement.object + metadata[statement.predicate.to_s] ||= [] + metadata[statement.predicate.to_s] << statement.object.to_s end metadata end @@ -42,7 +42,8 @@ module OpenTox # @return [Array] Values for supplied key def [](key) pull if @rdf.empty? - @rdf.query([RDF::URI.new(@uri),key,nil]).collect{|statement| statement.object} + result = @rdf.query([RDF::URI.new(@uri),key,nil]).collect{|statement| statement.object.to_s} + result.size == 1 ? result.first : result end # Save object at service diff --git a/test/dataset.rb b/test/dataset.rb index d2c8d57..aab08e9 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -20,23 +20,15 @@ class DatasetTest < Test::Unit::TestCase def test_create_from_file d = OpenTox::Dataset.from_file "http://ot-dev.in-silico.ch/dataset", File.join(File.dirname(__FILE__),"data","EPAFHM.mini.csv") assert_equal OpenTox::Dataset, d.class + assert_equal d.uri, d[RDF::XSD.anyURI] + assert_equal "EPAFHM.mini", d.metadata["http://purl.org/dc/elements/1.1/title"] # DC.title is http://purl.org/dc/terms/title d.delete assert_raise OpenTox::NotFoundError do d.get end end - =begin - def test_metadata - d = OpenTox::Dataset.from_file "http://ot-dev.in-silico.ch/dataset", "data/EPAFHM.mini.csv" - assert_equal OpenTox::Dataset, d.class - # TODO fix metadata retrieval - metadata = d.metadata - assert_equal RDF::OT.Dataset, metadata[RDF.type] - assert_equal dataset.uri, metadata[RDF::XSD.anyURI] - d.delete - end def test_save d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset" d.metadata -- cgit v1.2.3 From d657955ef09c69ce66e2eda3a03dbf4b87461915 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 14 Mar 2012 10:15:36 +0000 Subject: Fallback for OpenTox class if URI is ambiguous --- lib/opentox-client.rb | 2 +- lib/opentox.rb | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 7d9329d..e68fd7f 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -14,7 +14,7 @@ RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' #CLASSES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "ErrorReport", "Investigation"] -CLASSES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] +CLASSES = ["Generic", "Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] RDF_FORMATS = [:rdfxml,:ntriples,:turtle] $default_rdf = "application/rdf+xml" diff --git a/lib/opentox.rb b/lib/opentox.rb index 342b04e..944eda5 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -125,8 +125,12 @@ module OpenTox # guess class from uri, this is potentially unsafe, but polling metadata from large uri lists is way too slow (and not all service provide RDF.type in their metadata) result = CLASSES.collect{|s| s if uri =~ /#{s.downcase}/}.compact - internal_server_error "Cannot determine class from URI: '#{uri}.\nCandidate classes are #{result.inspect}" unless result.size == 1 - klass = result.first + if result.size == 1 + klass = result.first + else + klass = OpenTox::Generic.new(uri)[RDF.type] + internal_server_error "Cannot determine class from URI '#{uri} (Candidate classes are #{result.inspect}) or matadata." unless klass + end # initialize with/without subjectid subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")") end -- cgit v1.2.3 From 1652bc3f3e635948fc3a73817f407adc6dee071a Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 14 Mar 2012 11:44:53 +0000 Subject: metadata methods fixed --- lib/opentox.rb | 8 ++++---- lib/task.rb | 22 ++++------------------ test/dataset.rb | 2 +- test/feature.rb | 4 ++-- test/task.rb | 12 ++++++------ 5 files changed, 17 insertions(+), 31 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 0d88eaa..9493362 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -31,10 +31,10 @@ module OpenTox pull if @rdf.empty? metadata = {} @rdf.query([RDF::URI.new(@uri),nil,nil]).collect do |statement| - metadata[statement.predicate.to_s] ||= [] - metadata[statement.predicate.to_s] << statement.object.to_s + metadata[statement.predicate] ||= [] + metadata[statement.predicate] << statement.object end - metadata + metadata.each{|k,v| metadata[k] = v.first if v.size == 1} end # Get metadata values @@ -42,7 +42,7 @@ module OpenTox # @return [Array] Values for supplied key def [](key) pull if @rdf.empty? - result = @rdf.query([RDF::URI.new(@uri),key,nil]).collect{|statement| statement.object.to_s} + result = @rdf.query([RDF::URI.new(@uri),key,nil]).collect{|statement| statement.object} result.size == 1 ? result.first : result end diff --git a/lib/task.rb b/lib/task.rb index be02deb..9921c4c 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -97,24 +97,10 @@ module OpenTox def method_missing(method,*args) method = method.to_s - begin - case method - when /=/ - res = RestClientWrapper.put(File.join(@uri,method.sub(/=/,'')),{}) - super unless res.code == 200 - else - pull - response = self.[](RDF::OT[method]) - response = self.[](RDF::OT1[method]) if response.empty? # API 1.1 compatibility - internal_server_error "No #{method} metadata for #{@uri} " if response.empty? - return response.uniq.first.to_s - end - rescue OpenTox::Error - raise $! - rescue - $logger.error "Unknown #{self.class} method #{method}" - super - end + response = self.[](RDF::OT[method]) + response = self.[](RDF::OT1[method]) if response.empty? # API 1.1 compatibility + internal_server_error "Unknown #{self.class} method #{method} for #{@uri}" if response.is_a? Array and response.empty? + return response.to_s end #TODO: subtasks diff --git a/test/dataset.rb b/test/dataset.rb index aab08e9..be68f7d 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -21,7 +21,7 @@ class DatasetTest < Test::Unit::TestCase d = OpenTox::Dataset.from_file "http://ot-dev.in-silico.ch/dataset", File.join(File.dirname(__FILE__),"data","EPAFHM.mini.csv") assert_equal OpenTox::Dataset, d.class assert_equal d.uri, d[RDF::XSD.anyURI] - assert_equal "EPAFHM.mini", d.metadata["http://purl.org/dc/elements/1.1/title"] # DC.title is http://purl.org/dc/terms/title + assert_equal "EPAFHM.mini", d.metadata[RDF::URI("http://purl.org/dc/elements/1.1/title")].to_s # DC.title is http://purl.org/dc/terms/title d.delete assert_raise OpenTox::NotFoundError do d.get diff --git a/test/feature.rb b/test/feature.rb index 01c2206..8983c11 100644 --- a/test/feature.rb +++ b/test/feature.rb @@ -16,8 +16,8 @@ class FeatureTest < Test::Unit::TestCase def test_feature @features.each do |uri| f = OpenTox::Feature.new(uri) - assert_equal [RDF::OT1.TUM_CDK_nAtom], f[RDF::OWL.sameAs] - assert_equal RDF::OT1.TUM_CDK_nAtom, f.metadata[RDF::OWL.sameAs].first + assert_equal RDF::OT1.TUM_CDK_nAtom, f[RDF::OWL.sameAs] + assert_equal RDF::OT1.TUM_CDK_nAtom, f.metadata[RDF::OWL.sameAs] assert_equal [RDF::OT1.Feature,RDF::OT1.NumericFeature].sort, f[RDF.type].sort end end diff --git a/test/task.rb b/test/task.rb index adbba12..955d67a 100644 --- a/test/task.rb +++ b/test/task.rb @@ -17,7 +17,7 @@ class TaskTest < Test::Unit::TestCase assert_equal Array, all.class t = all.last assert_equal OpenTox::Task, t.class - assert_equal RDF::OT1.Task, t[RDF.type].first + assert_equal RDF::OT1.Task, t[RDF.type] end def test_create_and_complete @@ -26,10 +26,10 @@ class TaskTest < Test::Unit::TestCase TASK_SERVICE_URI end assert task.running? - assert_equal "Running", task.hasStatus + #assert_equal "Running", task.hasStatus task.wait assert task.completed? - assert_equal "Completed", task.hasStatus + #assert_equal "Completed", task.hasStatus assert_equal TASK_SERVICE_URI, task.resultURI end @@ -50,7 +50,7 @@ class TaskTest < Test::Unit::TestCase raise "A runtime error occured" end assert task.running? - assert_equal "Running", task.hasStatus + #assert_equal "Running", task.hasStatus task.wait assert task.error? assert_equal "Error", task.hasStatus @@ -62,7 +62,7 @@ class TaskTest < Test::Unit::TestCase raise OpenTox::Error.new 500, "An OpenTox::Error occured" end assert task.running? - assert_equal "Running", task.hasStatus + #assert_equal "Running", task.hasStatus task.wait assert task.error? assert_equal "Error", task.hasStatus @@ -74,7 +74,7 @@ class TaskTest < Test::Unit::TestCase "Asasadasd" end assert task.running? - assert_equal "Running", task.hasStatus + #assert_equal "Running", task.hasStatus task.wait assert task.error? assert_equal "Error", task.hasStatus -- cgit v1.2.3 From e7f1ecb35d0522890a31b9ba44ebf10b05da80a8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 15 Mar 2012 12:24:47 +0100 Subject: dynamic adjustment of task poll times --- lib/task.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/task.rb b/lib/task.rb index 9921c4c..2f79cf1 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -65,10 +65,14 @@ module OpenTox # waits for a task, unless time exceeds or state is no longer running # @param [optional,Numeric] dur seconds pausing before checking again for completion - def wait(dur=0.3) - due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION - while running? + # TODO: add waiting task + def wait + start_time = Time.new + due_to_time = start_time + DEFAULT_TASK_MAX_DURATION + dur = 0 + while running? sleep dur + dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min time_out_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) end end @@ -88,8 +92,6 @@ module OpenTox RestClientWrapper.head(@uri).code == 200 end - # TODO: add queued? - def error? code = RestClientWrapper.head(@uri).code code >= 400 and code != 503 -- cgit v1.2.3 From 585a0185af082bc3999375bfcd78677f4dc25059 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 15 Mar 2012 13:13:44 +0100 Subject: metadata reload fixed --- lib/opentox.rb | 9 ++++++--- lib/task.rb | 12 ++++++------ test/task.rb | 16 ++++++++-------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 9493362..4338302 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -27,8 +27,9 @@ module OpenTox # Get object metadata # @return [Hash] Metadata + # TODO: rename to_hash? or store in object variables def metadata - pull if @rdf.empty? + pull # force update metadata = {} @rdf.query([RDF::URI.new(@uri),nil,nil]).collect do |statement| metadata[statement.predicate] ||= [] @@ -41,9 +42,11 @@ module OpenTox # @param [RDF] Key from RDF Vocabularies # @return [Array] Values for supplied key def [](key) - pull if @rdf.empty? + pull # force update result = @rdf.query([RDF::URI.new(@uri),key,nil]).collect{|statement| statement.object} - result.size == 1 ? result.first : result + return nil if result.empty? + return result.first.to_s if result.size == 1 + return result.collect{|r| r.to_s} end # Save object at service diff --git a/lib/task.rb b/lib/task.rb index 2f79cf1..7452012 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -97,12 +97,12 @@ module OpenTox code >= 400 and code != 503 end - def method_missing(method,*args) - method = method.to_s - response = self.[](RDF::OT[method]) - response = self.[](RDF::OT1[method]) if response.empty? # API 1.1 compatibility - internal_server_error "Unknown #{self.class} method #{method} for #{@uri}" if response.is_a? Array and response.empty? - return response.to_s + [:hasStatus, :resultURI].each do |method| + define_method method do + response = self.[](RDF::OT[method]) + response = self.[](RDF::OT1[method]) unless response # API 1.1 compatibility + response + end end #TODO: subtasks diff --git a/test/task.rb b/test/task.rb index 955d67a..ae323e8 100644 --- a/test/task.rb +++ b/test/task.rb @@ -26,10 +26,10 @@ class TaskTest < Test::Unit::TestCase TASK_SERVICE_URI end assert task.running? - #assert_equal "Running", task.hasStatus + assert_equal "Running", task.hasStatus task.wait assert task.completed? - #assert_equal "Completed", task.hasStatus + assert_equal "Completed", task.hasStatus assert_equal TASK_SERVICE_URI, task.resultURI end @@ -46,11 +46,11 @@ class TaskTest < Test::Unit::TestCase def test_create_and_fail task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test failure", :creator => "http://test.org/fake_creator" do - sleep 0.5 + sleep 1 raise "A runtime error occured" end assert task.running? - #assert_equal "Running", task.hasStatus + assert_equal "Running", task.hasStatus task.wait assert task.error? assert_equal "Error", task.hasStatus @@ -58,11 +58,11 @@ class TaskTest < Test::Unit::TestCase def test_create_and_fail_with_opentox_error task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test failure", :creator => "http://test.org/fake_creator" do - sleep 0.5 + sleep 1 raise OpenTox::Error.new 500, "An OpenTox::Error occured" end assert task.running? - #assert_equal "Running", task.hasStatus + assert_equal "Running", task.hasStatus task.wait assert task.error? assert_equal "Error", task.hasStatus @@ -70,11 +70,11 @@ class TaskTest < Test::Unit::TestCase def test_wrong_result_uri task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test wrong result uri", :creator => "http://test.org/fake_creator" do - sleep 0.5 + sleep 1 "Asasadasd" end assert task.running? - #assert_equal "Running", task.hasStatus + assert_equal "Running", task.hasStatus task.wait assert task.error? assert_equal "Error", task.hasStatus -- cgit v1.2.3 From 2a900b8d19887ca64061dc72a82aae4bdb449fb1 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 15 Mar 2012 18:23:08 +0100 Subject: dataset upload tests added --- test/dataset.rb | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 7 deletions(-) diff --git a/test/dataset.rb b/test/dataset.rb index be68f7d..e41db8e 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -1,36 +1,73 @@ require 'test/unit' $LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' +DATASET = "http://ot-dev.in-silico.ch/dataset" +DATA_DIR = File.join(File.dirname(__FILE__),"data") +# TODO: add subjectids + class DatasetTest < Test::Unit::TestCase def test_all - datasets = OpenTox::Dataset.all "http://ot-dev.in-silico.ch/dataset" + datasets = OpenTox::Dataset.all DATASET assert_equal OpenTox::Dataset, datasets.first.class end def test_create_empty - service_uri = "http://ot-dev.in-silico.ch/dataset" - d = OpenTox::Dataset.create service_uri + d = OpenTox::Dataset.create DATASET assert_equal OpenTox::Dataset, d.class - assert_match /#{service_uri}/, d.uri.to_s + assert_match /#{DATASET}/, d.uri.to_s d.delete end def test_create_from_file - d = OpenTox::Dataset.from_file "http://ot-dev.in-silico.ch/dataset", File.join(File.dirname(__FILE__),"data","EPAFHM.mini.csv") + d = OpenTox::Dataset.from_file DATASET, File.join(DATA_DIR,"EPAFHM.mini.csv") assert_equal OpenTox::Dataset, d.class assert_equal d.uri, d[RDF::XSD.anyURI] - assert_equal "EPAFHM.mini", d.metadata[RDF::URI("http://purl.org/dc/elements/1.1/title")].to_s # DC.title is http://purl.org/dc/terms/title + assert_equal "EPAFHM.mini", d.metadata[RDF::URI("http://purl.org/dc/elements/1.1/title")].first.to_s # DC.title is http://purl.org/dc/terms/title + assert_equal "EPAFHM.mini", d[RDF::URI("http://purl.org/dc/elements/1.1/title")] d.delete assert_raise OpenTox::NotFoundError do d.get end end + def test_from_yaml + @dataset = OpenTox::Dataset.from_file DATASET, File.join(DATA_DIR,"hamster_carcinogenicity.yaml") + assert_equal OpenTox::Dataset, @dataset.class + assert_equal "hamster_carcinogenicity", @dataset[RDF::URI("http://purl.org/dc/elements/1.1/title")] + hamster_carc? + @dataset.delete + end + +=begin +# TODO: fix (mime type??0 and add Egons example + def test_sdf_with_multiple_features + @dataset = OpenTox::Dataset.from_file DATASET, "#{DATA_DIR}/CPDBAS_v5c_1547_29Apr2008part.sdf" + assert_equal OpenTox::Dataset, @dataset.class + puts @dataset.features.size + puts @dataset.compounds.size + @dataset.delete + end +=end + + def test_multicolumn_csv + @dataset = OpenTox::Dataset.from_file DATASET, "#{DATA_DIR}/multicolumn.csv" + assert_equal 5, @dataset.features.size + assert_equal 4, @dataset.compounds.size + @dataset.delete + end + + def test_from_csv + @dataset = OpenTox::Dataset.from_file DATASET, "#{DATA_DIR}/hamster_carcinogenicity.csv" + assert_equal OpenTox::Dataset, @dataset.class + hamster_carc? + @dataset.delete + end + =begin def test_save - d = OpenTox::Dataset.create "http://ot-dev.in-silico.ch/dataset" + d = OpenTox::Dataset.create DATASET d.metadata d.metadata[RDF::DC.title] = "test" d.save @@ -40,6 +77,17 @@ class DatasetTest < Test::Unit::TestCase d.delete end =end +=begin +=end + def hamster_carc? + assert_kind_of OpenTox::Dataset, @dataset + #require 'yaml' + #puts @dataset.data_entries.to_yaml + assert_equal 85, @dataset.data_entries.size + assert_equal 85, @dataset.compounds.size + assert_equal 1, @dataset.features.size + assert_equal @dataset.uri, @dataset[RDF::XSD.anyURI] + end end -- cgit v1.2.3 From 2fd7dcb2d011e3a2029de56f48aca5722685ee80 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 15 Mar 2012 18:23:44 +0100 Subject: dataset methods implemented --- lib/dataset.rb | 323 +++----------------------------------------------- lib/opentox-client.rb | 3 +- lib/opentox.rb | 36 ++++-- test/feature.rb | 2 +- 4 files changed, 43 insertions(+), 321 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 3de9d1f..8032533 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -1,318 +1,29 @@ module OpenTox - + # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). - # TODO: fix API Doc class Dataset - #include OpenTox - - #attr_reader :features, :compounds, :data_entries, :metadata - - # Create dataset with optional URI. Does not load data into the dataset - you will need to execute one of the load_* methods to pull data from a service or to insert it from other representations. - # @example Create an empty dataset - # dataset = OpenTox::Dataset.new - # @example Create an empty dataset with URI - # dataset = OpenTox::Dataset.new("http:://webservices.in-silico/ch/dataset/1") - # @param [optional, String] uri Dataset URI - # @return [OpenTox::Dataset] Dataset object - def initialize(uri=nil,subjectid=nil) - super uri, subjectid - @features = {} - @compounds = [] - @data_entries = {} - end - -=begin - # Load YAML representation into the dataset - # @param [String] yaml YAML representation of the dataset - # @return [OpenTox::Dataset] Dataset object with YAML data - def self.from_yaml service_uri, yaml, subjectid=nil - Dataset.create(service_uri, subjectid).post yaml, :content_type => "application/x-yaml" - end - - # Load RDF/XML representation from a file - # @param [String] file File with RDF/XML representation of the dataset - # @return [OpenTox::Dataset] Dataset object with RDF/XML data - def self.from_rdfxml service_uri, rdfxml, subjectid=nil - Dataset.create(service_uri, subjectid).post rdfxml, :content_type => "application/rdf+xml" - end - - # Load CSV string (format specification: http://toxcreate.org/help) - # - loads data_entries, compounds, features - # - sets metadata (warnings) for parser errors - # - you will have to set remaining metadata manually - # @param [String] csv CSV representation of the dataset - # @return [OpenTox::Dataset] Dataset object with CSV data - def self.from_csv service_uri, csv, subjectid=nil - Dataset.from_file(service_uri, csv, subjectid) - end - - # Load Spreadsheet book (created with roo gem http://roo.rubyforge.org/, excel format specification: http://toxcreate.org/help) - # - loads data_entries, compounds, features - # - sets metadata (warnings) for parser errors - # - you will have to set remaining metadata manually - # @param [Excel] book Excel workbook object (created with roo gem) - # @return [OpenTox::Dataset] Dataset object with Excel data - def self.from_xls service_uri, xls, subjectid=nil - Dataset.create(service_uri, subjectid).post xls, :content_type => "application/vnd.ms-excel" - end - - def self.from_sdf service_uri, sdf, subjectid=nil - Dataset.create(service_uri, subjectid).post sdf, :content_type => 'chemical/x-mdl-sdfile' - end -=end - - # Load all data (metadata, data_entries, compounds and features) from URI - # TODO: move to opentox-server - def data_entries reload=true - if reload - file = Tempfile.new("ot-rdfxml") - file.puts get :accept => "application/rdf+xml" - file.close - to_delete = file.path - - data = {} - feature_values = {} - feature = {} - feature_accept_values = {} - other_statements = {} - `rapper -i rdfxml -o ntriples #{file.path} 2>/dev/null`.each_line do |line| - triple = line.chomp.split(' ',3) - triple = triple[0..2].collect{|i| i.sub(/\s+.$/,'').gsub(/[<>"]/,'')} - case triple[1] - when /#{RDF::OT.values}|#{RDF::OT1.values}/i - data[triple[0]] = {:compound => "", :values => []} unless data[triple[0]] - data[triple[0]][:values] << triple[2] - when /#{RDF::OT.value}|#{RDF::OT1.value}/i - feature_values[triple[0]] = triple[2] - when /#{RDF::OT.compound}|#{RDF::OT1.compound}/i - data[triple[0]] = {:compound => "", :values => []} unless data[triple[0]] - data[triple[0]][:compound] = triple[2] - when /#{RDF::OT.feature}|#{RDF::OT1.feature}/i - feature[triple[0]] = triple[2] - when /#{RDF.type}/i - if triple[2]=~/#{RDF::OT.Compound}|#{RDF::OT1.Compound}/i and !data[triple[0]] - data[triple[0]] = {:compound => triple[0], :values => []} - end - when /#{RDF::OT.acceptValue}|#{RDF::OT1.acceptValue}/i # acceptValue in ambit datasets is only provided in dataset/ no in dataset//features - feature_accept_values[triple[0]] = [] unless feature_accept_values[triple[0]] - feature_accept_values[triple[0]] << triple[2] - else - end - end - File.delete(to_delete) if to_delete - data.each do |id,entry| - if entry[:values].size==0 - # no feature values add plain compounds - @compounds << entry[:compound] unless @compounds.include? entry[:compound] - else - entry[:values].each do |value_id| - if feature_values[value_id] - split = feature_values[value_id].split(/\^\^/) - case split[-1] - when RDF::XSD.double, RDF::XSD.float - value = split.first.to_f - when RDF::XSD.boolean - value = split.first=~/(?i)true/ ? true : false - else - value = split.first - end - end - @compounds << entry[:compound] unless @compounds.include? entry[:compound] - @features[feature[value_id][value_id]] = {} unless @features[feature[value_id]] - @data_entries[entry[:compound].to_s] = {} unless @data_entries[entry[:compound].to_s] - @data_entries[entry[:compound].to_s][feature[value_id]] = [] unless @data_entries[entry[:compound]][feature[value_id]] - @data_entries[entry[:compound].to_s][feature[value_id]] << value if value!=nil - end - end - end - features subjectid - #feature_accept_values.each do |feature, values| - #self.features[feature][OT.acceptValue] = values - #end - self.metadata = metadata(subjectid) - end - @data_entries - end - - # Load and return only compound URIs from the dataset service - # @return [Array] Compound URIs in the dataset - def compounds reload=true - reload ? @compounds = Compound.all(File.join(@uri,"compounds")) : @compounds - end - - # Load and return only features from the dataset service - # @return [Hash] Features of the dataset - def features reload=true - reload ? @features = Feature.all(File.join(@uri,"features")) : @features - end - -=begin - # returns the accept_values of a feature, i.e. the classification domain / all possible feature values - # @param [String] feature the URI of the feature - # @return [Array] return array with strings, nil if value is not set (e.g. when feature is numeric) - def accept_values(feature) - load_features - accept_values = features[feature][OT.acceptValue] - accept_values.sort if accept_values - accept_values - end - - # Detect feature type(s) in the dataset - # @return [String] `classification", "regression", "mixed" or unknown` - def feature_type - load_features - feature_types = @features.collect{|f,metadata| metadata[RDF.type]}.flatten.uniq - if feature_types.include?(OT.NominalFeature) - "classification" - elsif feature_types.include?(OT.NumericFeature) - "regression" - else - "unknown" - end + def data_entries + # TODO fix for api 1.2 + data_entries = [] + pull + @reload = false + metadata[RDF::OT1.dataEntry].collect{|data_entry| + data_entries << @rdf.to_hash[data_entry] + } + @reload = true + data_entries end -=end - # Get Excel representation (alias for to_spreadsheet) - # @return [Spreadsheet::Workbook] Workbook which can be written with the spreadsheet gem (data_entries only, metadata will will be discarded)) - def to_xls - get :accept => "application/vnd.ms-excel" + def compounds + uri = File.join(@uri,"compounds") + RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n").collect{|uri| OpenTox::Compound.new uri} end - # Get CSV string representation (data_entries only, metadata will be discarded) - # @return [String] CSV representation - def to_csv - get :accept => "text/csv" + def features + uri = File.join(@uri,"features") + RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n").collect{|uri| OpenTox::Feature.new uri} end - def to_sdf - get :accept => 'chemical/x-mdl-sdfile' - end - - - # Get OWL-DL in ntriples format - # @return [String] N-Triples representation - def to_ntriples - get :accept => "application/rdf+xml" - end - - # Get OWL-DL in RDF/XML format - # @return [String] RDF/XML representation - def to_rdfxml - get :accept => "application/rdf+xml" - end - - # Get name (DC.title) of a feature - # @param [String] feature Feature URI - # @return [String] Feture title - def feature_name(feature) - features[feature][DC.title] - end - - def title - metadata[DC.title] - end - - # Insert a statement (compound_uri,feature_uri,value) - # @example Insert a statement (compound_uri,feature_uri,value) - # dataset.add "http://webservices.in-silico.ch/compound/InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9", "http://webservices.in-silico.ch/dataset/1/feature/hamster_carcinogenicity", true - # @param [String] compound Compound URI - # @param [String] feature Compound URI - # @param [Boolean,Float] value Feature value - def add (compound,feature,value) - @compounds << compound unless @compounds.include? compound - @features[feature] = {} unless @features[feature] - @data_entries[compound] = {} unless @data_entries[compound] - @data_entries[compound][feature] = [] unless @data_entries[compound][feature] - @data_entries[compound][feature] << value if value!=nil - end - - # Add a feature - # @param [String] feature Feature URI - # @param [Hash] metadata Hash with feature metadata - def add_feature(feature,metadata={}) - @features[feature] = metadata - end - - # Add/modify metadata for a feature - # @param [String] feature Feature URI - # @param [Hash] metadata Hash with feature metadata - def add_feature_metadata(feature,metadata) - metadata.each { |k,v| @features[feature][k] = v } - end - - # Add a new compound - # @param [String] compound Compound URI - def add_compound (compound) - @compounds << compound unless @compounds.include? compound - end - - # Creates a new dataset, by splitting the current dataset, i.e. using only a subset of compounds and features - # @param [Array] compounds List of compound URIs - # @param [Array] features List of feature URIs - # @param [Hash] metadata Hash containing the metadata for the new dataset - # @param [String] subjectid - # @return [OpenTox::Dataset] newly created dataset, already saved - def split( compounds, features, metadata) - LOGGER.debug "split dataset using "+compounds.size.to_s+"/"+@compounds.size.to_s+" compounds" - raise "no new compounds selected" unless compounds and compounds.size>0 - dataset = OpenTox::Dataset.create(CONFIG[:services]["opentox-dataset"],@subjectid) - if features.size==0 - compounds.each{ |c| dataset.add_compound(c) } - else - compounds.each do |c| - features.each do |f| - if @data_entries[c]==nil or @data_entries[c][f]==nil - dataset.add(c,f,nil) - else - @data_entries[c][f].each do |v| - dataset.add(c,f,v) - end - end - end - end - end - # set feature metadata in new dataset accordingly (including accept values) - features.each do |f| - self.features[f].each do |k,v| - dataset.features[f][k] = v - end - end - dataset.add_metadata(metadata) - dataset.save - dataset - end - - # Save dataset at the dataset service - # - creates a new dataset if uri is not set - # - overwrites dataset if uri exists - # @return [String] Dataset URI - def save - @compounds.uniq! - # create dataset if uri is empty - self.uri = RestClientWrapper.post(CONFIG[:services]["opentox-dataset"],{:subjectid => @subjectid}).to_s.chomp unless @uri - if (CONFIG[:yaml_hosts].include?(URI.parse(@uri).host)) - RestClientWrapper.post(@uri,self.to_yaml,{:content_type => "application/x-yaml", :subjectid => @subjectid}) - else - s = Serializer::Owl.new - s.add_dataset(self) - RestClientWrapper.post(@uri, s.to_rdfxml,{:content_type => "application/rdf+xml" , :subjectid => @subjectid}) - end - @uri - end - - private - # Copy a dataset (rewrites URI) - def copy(dataset) - @metadata = dataset.metadata - @data_entries = dataset.data_entries - @compounds = dataset.compounds - @features = dataset.features - if @uri - self.uri = @uri - else - @uri = dataset.metadata[XSD.anyURI] - end - end end end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index e68fd7f..8616995 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -5,6 +5,7 @@ require 'rdf/raptor' require "rest-client" require 'uri' require 'yaml' +require 'json' require 'logger' # define constants and global variables @@ -29,4 +30,4 @@ require File.join(File.dirname(__FILE__),"otlogger.rb") # avoid require conflict require File.join(File.dirname(__FILE__),"opentox.rb") require File.join(File.dirname(__FILE__),"task.rb") require File.join(File.dirname(__FILE__),"compound.rb") -#require File.join(File.dirname(__FILE__),"dataset.rb") +require File.join(File.dirname(__FILE__),"dataset.rb") diff --git a/lib/opentox.rb b/lib/opentox.rb index 4338302..4b43547 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -4,7 +4,7 @@ $logger.level = Logger::DEBUG module OpenTox - attr_accessor :uri, :subjectid, :rdf, :response + attr_accessor :uri, :subjectid, :rdf, :response, :reload # Ruby interface @@ -15,38 +15,34 @@ module OpenTox def initialize uri=nil, subjectid=nil @uri = uri.to_s.chomp @subjectid = subjectid + @reload = true @rdf = RDF::Graph.new end # Load metadata from service def pull - kind_of?(OpenTox::Dataset) ? uri = File.join(@uri,"metadata") : uri = @uri # TODO generic method for all formats - parse_rdfxml RestClientWrapper.get(uri,{},{:accept => $default_rdf, :subjectid => @subjectid}) + parse_rdfxml RestClientWrapper.get(@uri,{},{:accept => $default_rdf, :subjectid => @subjectid}) end # Get object metadata # @return [Hash] Metadata - # TODO: rename to_hash? or store in object variables def metadata - pull # force update - metadata = {} - @rdf.query([RDF::URI.new(@uri),nil,nil]).collect do |statement| - metadata[statement.predicate] ||= [] - metadata[statement.predicate] << statement.object - end - metadata.each{|k,v| metadata[k] = v.first if v.size == 1} + pull if @reload # force update + @rdf.to_hash[RDF::URI.new(@uri)] end # Get metadata values # @param [RDF] Key from RDF Vocabularies # @return [Array] Values for supplied key def [](key) - pull # force update + pull if @reload # force update result = @rdf.query([RDF::URI.new(@uri),key,nil]).collect{|statement| statement.object} - return nil if result.empty? + # TODO: convert to OpenTox objects?? + return nil if result and result.empty? return result.first.to_s if result.size == 1 return result.collect{|r| r.to_s} + result end # Save object at service @@ -74,6 +70,20 @@ module OpenTox end end +# def to_hash +# hash = {} +# metadata.each{|k,v| v.is_a?(Array) ? hash[k.to_s] = v.collect{|i| i.to_s} : hash[k.to_s] = v.to_s} +# hash +# end + + def to_yaml + @rdf.to_hash.to_yaml + end + + def to_json + to_hash.to_json + end + # REST API def get headers={} headers[:subjectid] ||= @subjectid diff --git a/test/feature.rb b/test/feature.rb index 8983c11..f37f298 100644 --- a/test/feature.rb +++ b/test/feature.rb @@ -17,7 +17,7 @@ class FeatureTest < Test::Unit::TestCase @features.each do |uri| f = OpenTox::Feature.new(uri) assert_equal RDF::OT1.TUM_CDK_nAtom, f[RDF::OWL.sameAs] - assert_equal RDF::OT1.TUM_CDK_nAtom, f.metadata[RDF::OWL.sameAs] + assert_equal RDF::OT1.TUM_CDK_nAtom, f.metadata[RDF::OWL.sameAs].first.to_s assert_equal [RDF::OT1.Feature,RDF::OT1.NumericFeature].sort, f[RDF.type].sort end end -- cgit v1.2.3 From fc990e6dae8af7cfdf7d12b4e1d9ccd3b557418a Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 19 Mar 2012 18:57:31 +0100 Subject: libraptor1-dev dependency added --- README.markdown | 5 +++++ lib/error.rb | 5 ++--- lib/opentox-client.rb | 2 ++ lib/overwrite.rb | 4 +--- lib/task.rb | 1 + opentox-client.gemspec | 4 ++++ 6 files changed, 15 insertions(+), 6 deletions(-) diff --git a/README.markdown b/README.markdown index f4e20f4..41b7a28 100644 --- a/README.markdown +++ b/README.markdown @@ -3,6 +3,11 @@ opentox-ruby-minimal Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API +Dependencies +------------ + + libraptor1-dev + Installation ------------ diff --git a/lib/error.rb b/lib/error.rb index cc87f47..e12f140 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -45,8 +45,7 @@ module OpenTox OpenTox.const_set klass,c # define global methods for raising errors, eg. bad_request_error - Object.send(:define_method, klass.underscore.to_sym) do |message| - defined?(@uri) ? uri = @uri : uri=nil + Object.send(:define_method, klass.underscore.to_sym) do |message,uri=nil| raise c, message, uri end end @@ -65,7 +64,6 @@ module OpenTox class ErrorReport def initialize http_code, error @http_code = http_code - #@report = report#.to_yaml @report = {} @report[RDF::OT.actor] = error.uri.to_s @report[RDF::OT.message] = error.message.to_s @@ -95,6 +93,7 @@ module OpenTox # TODO: not used for turtle # http://rdf.rubyforge.org/RDF/Writer.html# writer.prefix :ot, RDF::URI('http://www.opentox.org/api/1.2#') + writer.prefix :ot1_1, RDF::URI('http://www.opentox.org/api/1.1#') subject = RDF::Node.new @report.each do |predicate,object| writer << [subject, predicate, object] if object diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 8616995..dec3512 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -26,6 +26,8 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m require File.join(File.dirname(__FILE__),"overwrite.rb") require File.join(File.dirname(__FILE__),"error.rb") require File.join(File.dirname(__FILE__),"rest-client-wrapper.rb") +require File.join(File.dirname(__FILE__),"authorization.rb") +require File.join(File.dirname(__FILE__),"policy.rb") require File.join(File.dirname(__FILE__),"otlogger.rb") # avoid require conflicts with logger require File.join(File.dirname(__FILE__),"opentox.rb") require File.join(File.dirname(__FILE__),"task.rb") diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 97c35aa..e3f72ad 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -64,10 +64,8 @@ module Kernel stdout = stdout_stream.read stderr = stderr_stream.read end - raise stderr.strip if !status.success? + internal_server_error stdout + stderr if !status.success? return stdout - rescue Exception - internal_server_error $! end alias_method :system!, :system diff --git a/lib/task.rb b/lib/task.rb index 7452012..f19a918 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -15,6 +15,7 @@ module OpenTox result_uri = yield task.completed result_uri rescue + puts $!.report.to_yaml RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.report.to_yaml}) if $!.respond_to? :report task.kill end diff --git a/opentox-client.gemspec b/opentox-client.gemspec index 198a6ed..52456a5 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -24,4 +24,8 @@ Gem::Specification.new do |s| s.add_runtime_dependency "rdf" s.add_runtime_dependency "rdf-raptor" s.add_runtime_dependency "open4" + + # external requirements + ["libraptor-dev"].each{|r| s.requirements << r} + s.post_install_message = "Please check the version of your libraptor library, if installation of rdf.rb fails" end -- cgit v1.2.3 From a6d1725caa7d350f2526ea82af3478a12a34f93d Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 21 Mar 2012 09:31:40 +0100 Subject: authorization with changed logger call --- lib/authorization.rb | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 1938814..c14d406 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -41,8 +41,8 @@ module OpenTox xml = get_xml(uri) ret = false ret = Authorization.create_policy(xml, @subjectid) - @@logger.debug "Policy send with subjectid: #{@subjectid}" - @@logger.warn "Not created Policy is: #{xml}" if !ret + $logger.debug "Policy send with subjectid: #{@subjectid}" + $logger.warn "Not created Policy is: #{xml}" if !ret ret end @@ -200,7 +200,7 @@ module OpenTox def self.create_policy(policy, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/Pol/opensso-pol") - @@logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s + $logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s return true if resource.post(policy, :subjectid => subjectid, :content_type => "application/xml") rescue return false @@ -213,7 +213,7 @@ module OpenTox def self.delete_policy(policy, subjectid) begin resource = RestClient::Resource.new("#{AA_SERVER}/pol") - @@logger.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" + $logger.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" return true if resource.delete(:subjectid => subjectid, :id => policy) rescue return nil @@ -279,7 +279,7 @@ module OpenTox return true if !AA_SERVER aa = Authorization::AA.new(subjectid) ret = aa.send(uri) - @@logger.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{subjectid} - policy created: #{ret}" + $logger.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{subjectid} - policy created: #{ret}" ret end @@ -291,7 +291,7 @@ module OpenTox if policies policies.each do |policy| ret = delete_policy(policy, subjectid) - @@logger.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" + $logger.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" end end return true @@ -304,11 +304,11 @@ module OpenTox def self.check_policy(uri, subjectid) return true unless uri and subjectid token_valid = OpenTox::Authorization.is_token_valid(subjectid) - @@logger.debug "OpenTox::Authorization.check_policy with uri: #{uri}, subjectid: #{subjectid} is valid: #{token_valid}" + $logger.debug "OpenTox::Authorization.check_policy with uri: #{uri}, subjectid: #{subjectid} is valid: #{token_valid}" # check if subjectid is valid unless token_valid # abort if invalid - @@logger.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{subjectid}" + $logger.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{subjectid}" return false end @@ -320,7 +320,7 @@ module OpenTox if authorize(uri, "POST", subjectid) true else - @@logger.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{subjectid}" + $logger.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{subjectid}" false end end @@ -338,25 +338,25 @@ module OpenTox # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method, subjectid) if CONFIG[:authorization][:free_request].include?(request_method) - #@@logger.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + #$logger.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true elsif OpenTox::Authorization.free_uri?(uri, request_method) - #@@logger.debug "authorized? >>true<< (uris is free_uri), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + #$logger.debug "authorized? >>true<< (uris is free_uri), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true elsif CONFIG[:authorization][:authenticate_request].include?(request_method) ret = OpenTox::Authorization.is_token_valid(subjectid) - @@logger.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + $logger.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret elsif OpenTox::Authorization.authorize_exception?(uri, request_method) ret = OpenTox::Authorization.is_token_valid(subjectid) - @@logger.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + $logger.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret elsif CONFIG[:authorization][:authorize_request].include?(request_method) ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) - @@logger.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + $logger.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret else - @@logger.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + $logger.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" false end end -- cgit v1.2.3 From 7883965d1ddca56520d0219c447821d056ed22d1 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 21 Mar 2012 11:48:04 +0100 Subject: authorization added, tests not yet working --- lib/authorization.rb | 77 +++++++++++++++++----------------- test/authorization.rb | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+), 38 deletions(-) create mode 100644 test/authorization.rb diff --git a/lib/authorization.rb b/lib/authorization.rb index 1938814..e57eda3 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -1,21 +1,22 @@ module OpenTox + AA ||= "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml #Module for Authorization and Authentication #@example Authentication # require "opentox-client" - # OpenTox::Authorization::AA_SERVER = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml + # OpenTox::Authorization::AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml # token = OpenTox::Authorization.authenticate("benutzer", "passwort") #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification module Authorization - #Helper Class AA to create and send default policies out of xml templates + #Helper Class to create and send default policies out of xml templates #@example Creating a default policy to a URI # aa=OpenTox::Authorization::AA.new(tok) # xml=aa.get_xml('http://uri....') # OpenTox::Authorization.create_policy(xml,tok) - class AA + class Helper attr_accessor :user, :subjectid, :policy #Generates AA object - requires subjectid @@ -41,8 +42,8 @@ module OpenTox xml = get_xml(uri) ret = false ret = Authorization.create_policy(xml, @subjectid) - @@logger.debug "Policy send with subjectid: #{@subjectid}" - @@logger.warn "Not created Policy is: #{xml}" if !ret + $logger.debug "Policy send with subjectid: #{@subjectid}" + $logger.warn "Not created Policy is: #{xml}" if !ret ret end @@ -51,16 +52,16 @@ module OpenTox #Returns the open-sso server set in the config file .opentox/config/[environment].yaml # @return [String, nil] the openSSO server URI or nil def self.server - return AA_SERVER + return AA end #Authentication against OpenSSO. Returns token. Requires Username and Password. # @param [String, String]Username,Password # @return [String, nil] gives subjectid or nil def self.authenticate(user, pw) - return nil if !AA_SERVER + return nil if !AA begin - resource = RestClient::Resource.new("#{AA_SERVER}/auth/authenticate") + resource = RestClient::Resource.new("#{AA}/auth/authenticate") out = resource.post(:username=>user, :password => pw).sub("token.id=","").sub("\n","") return out rescue @@ -73,7 +74,7 @@ module OpenTox # @return [Boolean] true if logout is OK def self.logout(subjectid) begin - resource = RestClient::Resource.new("#{AA_SERVER}/auth/logout") + resource = RestClient::Resource.new("#{AA}/auth/logout") resource.post(:subjectid => subjectid) return true rescue @@ -85,9 +86,9 @@ module OpenTox # @param [String,String,String]uri,action,subjectid # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). def self.authorize(uri, action, subjectid) - return true if !AA_SERVER + return true if !AA begin - resource = RestClient::Resource.new("#{AA_SERVER}/auth/authorize") + resource = RestClient::Resource.new("#{AA}/auth/authorize") return true if resource.post(:uri => uri, :action => action, :subjectid => subjectid) == "boolean=true\n" rescue return nil @@ -98,9 +99,9 @@ module OpenTox # @param [String]subjectid subjectid from openSSO session # @return [Boolean] subjectid is valid or not. def self.is_token_valid(subjectid) - return true if !AA_SERVER + return true if !AA begin - resource = RestClient::Resource.new("#{AA_SERVER}/auth/isTokenValid") + resource = RestClient::Resource.new("#{AA}/auth/isTokenValid") return true if resource.post(:tokenid => subjectid) == "boolean=true\n" rescue return false @@ -112,7 +113,7 @@ module OpenTox # @return [Array, nil] returns an Array of policy names or nil if request fails def self.list_policies(subjectid) begin - resource = RestClient::Resource.new("#{AA_SERVER}/pol") + resource = RestClient::Resource.new("#{AA}/pol") out = resource.get(:subjectid => subjectid) return out.split("\n") rescue RestClient::InternalServerError => e @@ -127,7 +128,7 @@ module OpenTox # @return [String] XML of the policy def self.list_policy(policy, subjectid) begin - resource = RestClient::Resource.new("#{AA_SERVER}/pol") + resource = RestClient::Resource.new("#{AA}/pol") return resource.get(:subjectid => subjectid,:id => policy) rescue return nil @@ -160,7 +161,7 @@ module OpenTox # return [String, nil]owner,nil returns owner of the URI def self.get_uri_owner(uri, subjectid) begin - resource = RestClient::Resource.new("#{AA_SERVER}/pol") + resource = RestClient::Resource.new("#{AA}/pol") return resource.get(:uri => uri, :subjectid => subjectid).sub("\n","") rescue return nil @@ -181,7 +182,7 @@ module OpenTox # return [Array, nil] returns an Array of policy names or nil if request fails def self.list_uri_policies(uri, subjectid) begin - resource = RestClient::Resource.new("#{AA_SERVER}/pol") + resource = RestClient::Resource.new("#{AA}/pol") out = resource.get(:uri => uri, :polnames => true, :subjectid => subjectid) policies = []; notfirstline = false out.split("\n").each do |line| @@ -199,8 +200,8 @@ module OpenTox # return [Boolean] returns true if policy is created def self.create_policy(policy, subjectid) begin - resource = RestClient::Resource.new("#{AA_SERVER}/Pol/opensso-pol") - @@logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s + resource = RestClient::Resource.new("#{AA}/Pol/opensso-pol") + $logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s return true if resource.post(policy, :subjectid => subjectid, :content_type => "application/xml") rescue return false @@ -212,8 +213,8 @@ module OpenTox # @return [Boolean,nil] def self.delete_policy(policy, subjectid) begin - resource = RestClient::Resource.new("#{AA_SERVER}/pol") - @@logger.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" + resource = RestClient::Resource.new("#{AA}/pol") + $logger.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" return true if resource.delete(:subjectid => subjectid, :id => policy) rescue return nil @@ -225,7 +226,7 @@ module OpenTox # @return [Array] def self.list_groups(subjectid) begin - resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/search") + resource = RestClient::Resource.new("#{AA}/opensso/identity/search") grps = resource.post(:admin => subjectid, :attributes_names => "objecttype", :attributes_values_objecttype => "group") grps = grps.split("\n").collect{|x| x.sub("string=","")} grps.delete_if{|g|g=="MemberManagement"||g=="Webmasters"} @@ -240,7 +241,7 @@ module OpenTox # @return [Array] gives array of LDAP groups of a user def self.list_user_groups(user, subjectid) begin - resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/read") + resource = RestClient::Resource.new("#{AA}/opensso/identity/read") out = resource.post(:name => user, :admin => subjectid, :attributes_names => "group") grps = [] out.split("\n").each do |line| @@ -257,7 +258,7 @@ module OpenTox # @return [String]user def self.get_user(subjectid) begin - resource = RestClient::Resource.new("#{AA_SERVER}/opensso/identity/attributes") + resource = RestClient::Resource.new("#{AA}/opensso/identity/attributes") out = resource.post(:subjectid => subjectid, :attributes_names => "uid") user = ""; check = false out.split("\n").each do |line| @@ -273,13 +274,13 @@ module OpenTox end end - #Send default policy with Authorization::AA class + #Send default policy with Authorization::Helper class # @param [String, String]URI,subjectid def self.send_policy(uri, subjectid) - return true if !AA_SERVER - aa = Authorization::AA.new(subjectid) + return true if !AA + aa = Authorization::Helper.new(subjectid) ret = aa.send(uri) - @@logger.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{subjectid} - policy created: #{ret}" + $logger.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{subjectid} - policy created: #{ret}" ret end @@ -291,7 +292,7 @@ module OpenTox if policies policies.each do |policy| ret = delete_policy(policy, subjectid) - @@logger.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" + $logger.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" end end return true @@ -304,11 +305,11 @@ module OpenTox def self.check_policy(uri, subjectid) return true unless uri and subjectid token_valid = OpenTox::Authorization.is_token_valid(subjectid) - @@logger.debug "OpenTox::Authorization.check_policy with uri: #{uri}, subjectid: #{subjectid} is valid: #{token_valid}" + $logger.debug "OpenTox::Authorization.check_policy with uri: #{uri}, subjectid: #{subjectid} is valid: #{token_valid}" # check if subjectid is valid unless token_valid # abort if invalid - @@logger.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{subjectid}" + $logger.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{subjectid}" return false end @@ -320,7 +321,7 @@ module OpenTox if authorize(uri, "POST", subjectid) true else - @@logger.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{subjectid}" + $logger.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{subjectid}" false end end @@ -338,25 +339,25 @@ module OpenTox # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method, subjectid) if CONFIG[:authorization][:free_request].include?(request_method) - #@@logger.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + #$logger.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true elsif OpenTox::Authorization.free_uri?(uri, request_method) - #@@logger.debug "authorized? >>true<< (uris is free_uri), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + #$logger.debug "authorized? >>true<< (uris is free_uri), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true elsif CONFIG[:authorization][:authenticate_request].include?(request_method) ret = OpenTox::Authorization.is_token_valid(subjectid) - @@logger.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + $logger.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret elsif OpenTox::Authorization.authorize_exception?(uri, request_method) ret = OpenTox::Authorization.is_token_valid(subjectid) - @@logger.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + $logger.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret elsif CONFIG[:authorization][:authorize_request].include?(request_method) ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) - @@logger.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + $logger.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret else - @@logger.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + $logger.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" false end end diff --git a/test/authorization.rb b/test/authorization.rb new file mode 100644 index 0000000..ffb2d65 --- /dev/null +++ b/test/authorization.rb @@ -0,0 +1,112 @@ +require 'test/unit' +$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') +require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','opentox-client.rb')) +TEST_URI = "http://only_a_test/test/" + rand(1000000).to_s +#AA = "https://opensso.in-silico.ch" +AA_USER = "guest" +AA_PASS = "guest" +#unless defined? AA #overwrite turned off A&A server for testing + @@subjectid = OpenTox::Authorization.authenticate(AA_USER,AA_PASS) +#end + +class TestOpenToxAuthorizationBasic < Test::Unit::TestCase + + def test_01_server + assert_equal(AA, OpenTox::Authorization.server) + end + + def test_02_get_token + assert_not_nil @@subjectid + end + + def test_03_is_valid_token + tok = login + assert_not_nil tok + assert OpenTox::Authorization.is_token_valid(tok) + logout(tok) + end + + def test_04_logout + tok = login + assert logout(tok) + end + + def test_05_list_policies + assert_kind_of Array, OpenTox::Authorization.list_policies(@@subjectid) + end + +end + +class TestOpenToxAuthorizationLDAP < Test::Unit::TestCase + + def test_01_list_groups + assert_kind_of Array, OpenTox::Authorization.list_groups(@@subjectid) + end + + def test_02_list_user_groups + assert_kind_of Array, OpenTox::Authorization.list_user_groups(AA_USER, @@subjectid) + end + + def test_03_get_user + assert_equal AA_USER, OpenTox::Authorization.get_user(@@subjectid) + end + +end + +class TestOpenToxAuthorizationLDAP < Test::Unit::TestCase + + def test_01_create_check_delete_default_policies + res = OpenTox::Authorization.send_policy(TEST_URI, @@subjectid) + assert res + assert OpenTox::Authorization.uri_has_policy(TEST_URI, @@subjectid) + policies = OpenTox::Authorization.list_uri_policies(TEST_URI, @@subjectid) + assert_kind_of Array, policies + policies.each do |policy| + assert OpenTox::Authorization.delete_policy(policy, @@subjectid) + end + assert_equal false, OpenTox::Authorization.uri_has_policy(TEST_URI, @@subjectid) + end + + def test_02_check_policy_rules + tok_anonymous = OpenTox::Authorization.authenticate("anonymous","anonymous") + assert_not_nil tok_anonymous + res = OpenTox::Authorization.send_policy(TEST_URI, @@subjectid) + assert res + assert OpenTox::Authorization.uri_has_policy(TEST_URI, @@subjectid) + owner_rights = {"GET" => true, "POST" => true, "PUT" => true, "DELETE" => true} + groupmember_rights = {"GET" => true, "POST" => nil, "PUT" => nil, "DELETE" => nil} + owner_rights.each do |request, right| + assert_equal right, OpenTox::Authorization.authorize(TEST_URI, request, @@subjectid), "#{AA_USER} requests #{request} to #{TEST_URI}" + end + groupmember_rights.each do |request, r| + assert_equal r, OpenTox::Authorization.authorize(TEST_URI, request, tok_anonymous), "anonymous requests #{request} to #{TEST_URI}" + end + + policies = OpenTox::Authorization.list_uri_policies(TEST_URI, @@subjectid) + assert_kind_of Array, policies + policies.each do |policy| + assert OpenTox::Authorization.delete_policy(policy, @@subjectid) + end + logout(tok_anonymous) + end + + def test_03_check_different_uris + res = OpenTox::Authorization.send_policy(TEST_URI, @@subjectid) + assert OpenTox::Authorization.uri_has_policy(TEST_URI, @@subjectid) + assert OpenTox::Authorization.authorize(TEST_URI, "GET", @@subjectid), "GET request" + policies = OpenTox::Authorization.list_uri_policies(TEST_URI, @@subjectid) + policies.each do |policy| + assert OpenTox::Authorization.delete_policy(policy, @@subjectid) + end + + end +end + + +def logout (token) + OpenTox::Authorization.logout(token) +end + +def login + OpenTox::Authorization.authenticate(AA_USER,AA_PASS) +end -- cgit v1.2.3 From 556b33d064d5c639f520bfebc043432531a0eaa6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 21 Mar 2012 12:14:18 +0100 Subject: backtick errors fixed --- lib/overwrite.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index e3f72ad..10a3a82 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -66,6 +66,8 @@ module Kernel end internal_server_error stdout + stderr if !status.success? return stdout + rescue + internal_server_error $!.message end alias_method :system!, :system -- cgit v1.2.3 From 9b51fd3f058d96263e32665b3dd83e38ab30563d Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 21 Mar 2012 16:26:32 +0100 Subject: prevent ssl uris from URI.accessible? check --- lib/rest-client-wrapper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index c9e6bbb..13ccf09 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -17,11 +17,11 @@ module OpenTox # check input bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri - not_found_error "URI '#{uri}' not found." unless URI.accessible? uri + not_found_error "URI '#{uri}' not found." unless URI.accessible? uri unless URI.ssl?(uri) bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| - bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] + bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] unless URI(uri).host == URI(AA).host end # create request -- cgit v1.2.3 From e2c7ee88523091bfa824a5837c48cb2f4391e393 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 21 Mar 2012 16:27:10 +0100 Subject: check if https uri --- lib/overwrite.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index e3f72ad..6a1f151 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -21,11 +21,15 @@ module URI def self.dataset? uri, subjectid=nil uri =~ /dataset/ and URI.accessible? uri, subjectid=nil end - + def self.model? uri, subjectid=nil uri =~ /model/ and URI.accessible? uri, subjectid=nil end + def self.ssl? uri, subjectid=nil + URI.parse(uri).instance_of? URI::HTTPS + end + def self.accessible? uri, subjectid=nil if URI.task? uri or URI.compound? uri # just try to get a response, valid tasks may return codes > 400 -- cgit v1.2.3 From 882bec0b303048d59b313e65f493eba1db6d82f6 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 21 Mar 2012 16:28:29 +0100 Subject: change RestClient methods to RestClientWrapper, remove list_groups method --- lib/authorization.rb | 69 +++++++++++++++------------------------------------- 1 file changed, 20 insertions(+), 49 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index e57eda3..4d54c41 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -1,10 +1,10 @@ module OpenTox - AA ||= "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml + AA ||= "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml #Module for Authorization and Authentication #@example Authentication # require "opentox-client" - # OpenTox::Authorization::AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml + # OpenTox::Authorization::AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml # token = OpenTox::Authorization.authenticate("benutzer", "passwort") #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification @@ -61,8 +61,7 @@ module OpenTox def self.authenticate(user, pw) return nil if !AA begin - resource = RestClient::Resource.new("#{AA}/auth/authenticate") - out = resource.post(:username=>user, :password => pw).sub("token.id=","").sub("\n","") + out = RestClientWrapper.post("#{AA}/auth/authenticate",{:username=>user, :password => pw}).sub("token.id=","").sub("\n","") return out rescue return nil @@ -74,12 +73,12 @@ module OpenTox # @return [Boolean] true if logout is OK def self.logout(subjectid) begin - resource = RestClient::Resource.new("#{AA}/auth/logout") - resource.post(:subjectid => subjectid) - return true + out = RestClientWrapper.post("#{AA}/auth/logout",:subjectid => subjectid) + return true unless is_token_valid(subjectid) rescue return false end + return false end #Authorization against OpenSSO for a URI with request-method (action) [GET/POST/PUT/DELETE] @@ -88,8 +87,7 @@ module OpenTox def self.authorize(uri, action, subjectid) return true if !AA begin - resource = RestClient::Resource.new("#{AA}/auth/authorize") - return true if resource.post(:uri => uri, :action => action, :subjectid => subjectid) == "boolean=true\n" + return true if RestClientWrapper.post("#{AA}/auth/authorize",{:uri => uri, :action => action, :subjectid => subjectid})== "boolean=true\n" rescue return nil end @@ -101,11 +99,9 @@ module OpenTox def self.is_token_valid(subjectid) return true if !AA begin - resource = RestClient::Resource.new("#{AA}/auth/isTokenValid") - return true if resource.post(:tokenid => subjectid) == "boolean=true\n" - rescue - return false + return true if RestClientWrapper.post("#{AA}/auth/isTokenValid",:tokenid => subjectid) == "boolean=true\n" end + return false end #Returns array with all policies of the token owner @@ -113,11 +109,8 @@ module OpenTox # @return [Array, nil] returns an Array of policy names or nil if request fails def self.list_policies(subjectid) begin - resource = RestClient::Resource.new("#{AA}/pol") - out = resource.get(:subjectid => subjectid) + out = RestClientWrapper.get("#{AA}/pol",nil,:subjectid => subjectid) return out.split("\n") - rescue RestClient::InternalServerError => e - raise e.response rescue return nil end @@ -128,8 +121,7 @@ module OpenTox # @return [String] XML of the policy def self.list_policy(policy, subjectid) begin - resource = RestClient::Resource.new("#{AA}/pol") - return resource.get(:subjectid => subjectid,:id => policy) + return RestClientWrapper.get("#{AA}/pol",nil,{:subjectid => subjectid,:id => policy}) rescue return nil end @@ -161,8 +153,7 @@ module OpenTox # return [String, nil]owner,nil returns owner of the URI def self.get_uri_owner(uri, subjectid) begin - resource = RestClient::Resource.new("#{AA}/pol") - return resource.get(:uri => uri, :subjectid => subjectid).sub("\n","") + return RestClientWrapper.get("#{AA}/pol",nil,{:subjectid => subjectid, :uri => uri}).sub("\n","") rescue return nil end @@ -182,8 +173,7 @@ module OpenTox # return [Array, nil] returns an Array of policy names or nil if request fails def self.list_uri_policies(uri, subjectid) begin - resource = RestClient::Resource.new("#{AA}/pol") - out = resource.get(:uri => uri, :polnames => true, :subjectid => subjectid) + out = RestClientWrapper.get("#{AA}/pol",nil,{:uri => uri, :polnames => true, :subjectid => subjectid}) policies = []; notfirstline = false out.split("\n").each do |line| policies << line if notfirstline @@ -200,9 +190,8 @@ module OpenTox # return [Boolean] returns true if policy is created def self.create_policy(policy, subjectid) begin - resource = RestClient::Resource.new("#{AA}/Pol/opensso-pol") - $logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s - return true if resource.post(policy, :subjectid => subjectid, :content_type => "application/xml") + $logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s + return true if RestClientWrapper.post("#{AA}/Pol/opensso-pol",policy, {:subjectid => subjectid, :content_type => "application/xml"}) rescue return false end @@ -213,36 +202,19 @@ module OpenTox # @return [Boolean,nil] def self.delete_policy(policy, subjectid) begin - resource = RestClient::Resource.new("#{AA}/pol") $logger.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" - return true if resource.delete(:subjectid => subjectid, :id => policy) + return true if RestClientWrapper.delete("#{AA}/pol",nil, {:subjectid => subjectid, :id => policy}) rescue return nil end end - #Returns array of all possible LDAP-Groups - # @param [String]subjectid - # @return [Array] - def self.list_groups(subjectid) - begin - resource = RestClient::Resource.new("#{AA}/opensso/identity/search") - grps = resource.post(:admin => subjectid, :attributes_names => "objecttype", :attributes_values_objecttype => "group") - grps = grps.split("\n").collect{|x| x.sub("string=","")} - grps.delete_if{|g|g=="MemberManagement"||g=="Webmasters"} - grps - rescue - [] - end - end - #Returns array of the LDAP-Groups of an user # @param [String]subjectid # @return [Array] gives array of LDAP groups of a user def self.list_user_groups(user, subjectid) begin - resource = RestClient::Resource.new("#{AA}/opensso/identity/read") - out = resource.post(:name => user, :admin => subjectid, :attributes_names => "group") + out = RestClientWrapper.post("#{AA}/opensso/identity/read", {:name => user, :admin => subjectid, :attributes_names => "group"}) grps = [] out.split("\n").each do |line| grps << line.sub("identitydetails.group=","") if line.include?("identitydetails.group=") @@ -258,8 +230,7 @@ module OpenTox # @return [String]user def self.get_user(subjectid) begin - resource = RestClient::Resource.new("#{AA}/opensso/identity/attributes") - out = resource.post(:subjectid => subjectid, :attributes_names => "uid") + out = RestClientWrapper.post("#{AA}/opensso/identity/attributes", {:subjectid => subjectid, :attributes_names => "uid"}) user = ""; check = false out.split("\n").each do |line| if check @@ -301,7 +272,7 @@ module OpenTox # Checks (if subjectid is valid) if a policy exist and create default policy if not # @param [String] uri # @param [String] subjectid - # @return [Boolean] true if policy checked/created successfully (or no uri/subjectid given), false else + # @return [Boolean] true if policy checked/created successfully (or no uri/subjectid given), false else def self.check_policy(uri, subjectid) return true unless uri and subjectid token_valid = OpenTox::Authorization.is_token_valid(subjectid) @@ -321,7 +292,7 @@ module OpenTox if authorize(uri, "POST", subjectid) true else - $logger.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{subjectid}" + $logger.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{subjectid}" false end end -- cgit v1.2.3 From e7d213bfbe7ae07e5935a62b2ec0d5eee6318711 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 22 Mar 2012 09:56:57 +0100 Subject: fix AA tests to new AA version --- test/authorization.rb | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/test/authorization.rb b/test/authorization.rb index ffb2d65..e446ff7 100644 --- a/test/authorization.rb +++ b/test/authorization.rb @@ -2,12 +2,10 @@ require 'test/unit' $LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','opentox-client.rb')) TEST_URI = "http://only_a_test/test/" + rand(1000000).to_s -#AA = "https://opensso.in-silico.ch" +AA ||= "https://opensso.in-silico.ch" AA_USER = "guest" AA_PASS = "guest" -#unless defined? AA #overwrite turned off A&A server for testing - @@subjectid = OpenTox::Authorization.authenticate(AA_USER,AA_PASS) -#end +@@subjectid = OpenTox::Authorization.authenticate(AA_USER,AA_PASS) class TestOpenToxAuthorizationBasic < Test::Unit::TestCase @@ -27,8 +25,9 @@ class TestOpenToxAuthorizationBasic < Test::Unit::TestCase end def test_04_logout - tok = login - assert logout(tok) + tok = login + assert logout(tok) + assert_equal false, OpenTox::Authorization.is_token_valid(tok) end def test_05_list_policies @@ -39,15 +38,11 @@ end class TestOpenToxAuthorizationLDAP < Test::Unit::TestCase - def test_01_list_groups - assert_kind_of Array, OpenTox::Authorization.list_groups(@@subjectid) - end - - def test_02_list_user_groups + def test_01_list_user_groups assert_kind_of Array, OpenTox::Authorization.list_user_groups(AA_USER, @@subjectid) end - def test_03_get_user + def test_02_get_user assert_equal AA_USER, OpenTox::Authorization.get_user(@@subjectid) end -- cgit v1.2.3 From b9249a71bc4fd6323f2ec879018f497027a4545a Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 22 Mar 2012 12:21:31 +0100 Subject: retry opensso if connection fails (1x) log error if fails twice --- lib/authorization.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 4d54c41..470ecd8 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -5,7 +5,7 @@ module OpenTox #@example Authentication # require "opentox-client" # OpenTox::Authorization::AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml - # token = OpenTox::Authorization.authenticate("benutzer", "passwort") + # token = OpenTox::Authorization.authenticate("username", "password") #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification module Authorization @@ -42,11 +42,12 @@ module OpenTox xml = get_xml(uri) ret = false ret = Authorization.create_policy(xml, @subjectid) + $logger.warn "Create policy on openSSO failed for URI: #{uri} subjectid: #{@subjectid}. Will try again." if !ret + ret = Authorization.create_policy(xml, @subjectid) if !ret $logger.debug "Policy send with subjectid: #{@subjectid}" - $logger.warn "Not created Policy is: #{xml}" if !ret + $logger.error "Not created Policy is: #{xml}" if !ret ret end - end #Returns the open-sso server set in the config file .opentox/config/[environment].yaml -- cgit v1.2.3 From 3bf0e33c86cd4cd460412c01eed9a37afacad4d5 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 22 Mar 2012 12:23:09 +0100 Subject: add policy-lib mods from feature/policy and add policy tests --- lib/policy.rb | 331 +++++++++++++++++++++++++++++++++++---------------------- test/policy.rb | 120 +++++++++++++++++++++ 2 files changed, 324 insertions(+), 127 deletions(-) create mode 100644 test/policy.rb diff --git a/lib/policy.rb b/lib/policy.rb index 8591d52..56a90b7 100644 --- a/lib/policy.rb +++ b/lib/policy.rb @@ -1,28 +1,29 @@ module OpenTox require "rexml/document" - #Module for policy-processing + #Module for policy-processing # @see also http://www.opentox.org/dev/apis/api-1.2/AA for opentox API specs # Class Policies corresponds to container of an xml-policy-fle - class Policies - - attr_accessor :name, :policies - + class Policies + + #Hash for policy objects see {Policy Policy} + attr_accessor :policies, :name + def initialize() @policies = {} end - + #create new policy instance with name # @param [String]name of the policy def new_policy(name) @policies[name] = Policy.new(name) end - + #drop a specific policy in a policies instance # @param [String]name of the policy # @return [Boolean] def drop_policy(name) - return true if @policies.delete(name) + return true if @policies.delete(name) end #drop all policies in a policies instance @@ -32,58 +33,63 @@ module OpenTox end return true end - + # @return [Array] set of arrays affected by policies def uris - @policies.collect{ |k,v| v.uris }.flatten.uniq + @policies.collect{ |k,v| v.uri }.flatten.uniq end - #drop all policies in a policies instance + #list all policy names in a policies instance + # @return [Array] def names out = [] @policies.each do |name, policy| - out << name + out << name end return out end - #loads a default policy template in policies instance - def load_default_policy(user, uri, group="member") + # Loads a default policy template in a policies instance + # @param [String]user username in LDAP string of user policy: 'uid=,ou=people,dc=opentox,dc=org' + # @param [String]uri URI + # @param [String]group groupname in LDAP string of group policy: 'cn=,ou=groups,dc=opentox,dc=org' + def load_default_policy(user, uri, group="member") template = case user when "guest", "anonymous" then "default_guest_policy" - else "default_policy" + else "default_policy" end xml = File.read(File.join(File.dirname(__FILE__), "templates/#{template}.xml")) self.load_xml(xml) datestring = Time.now.strftime("%Y-%m-%d-%H-%M-%S-x") + rand(1000).to_s - + @policies["policy_user"].name = "policy_user_#{user}_#{datestring}" - @policies["policy_user"].rules["rule_user"].uri = uri - @policies["policy_user"].rules["rule_user"].name = "rule_user_#{user}_#{datestring}" - @policies["policy_user"].subjects["subject_user"].name = "subject_user_#{user}_#{datestring}" - @policies["policy_user"].subjects["subject_user"].value = "uid=#{user},ou=people,dc=opentox,dc=org" + @policies["policy_user"].rule.uri = uri + @policies["policy_user"].rule.name = "rule_user_#{user}_#{datestring}" + @policies["policy_user"].subject.name = "subject_user_#{user}_#{datestring}" + @policies["policy_user"].subject.value = "uid=#{user},ou=people,dc=opentox,dc=org" @policies["policy_user"].subject_group = "subjects_user_#{user}_#{datestring}" - - @policies["policy_group"].name = "policy_group_#{group}_#{datestring}" - @policies["policy_group"].rules["rule_group"].uri = uri - @policies["policy_group"].rules["rule_group"].name = "rule_group_#{group}_#{datestring}" - @policies["policy_group"].subjects["subject_group"].name = "subject_group_#{group}_#{datestring}" - @policies["policy_group"].subjects["subject_group"].value = "cn=#{group},ou=groups,dc=opentox,dc=org" - @policies["policy_group"].subject_group = "subjects_#{group}_#{datestring}" + + @policies["policy_group"].name = "policy_group_#{group}_#{datestring}" + @policies["policy_group"].rule.uri = uri + @policies["policy_group"].rule.name = "rule_group_#{group}_#{datestring}" + @policies["policy_group"].subject.name = "subject_group_#{group}_#{datestring}" + @policies["policy_group"].subject.value = "cn=#{group},ou=groups,dc=opentox,dc=org" + @policies["policy_group"].subject_group = "subjects_#{group}_#{datestring}" return true - end + end - #loads a xml template + #loads a xml template def load_xml(xml) rexml = REXML::Document.new(xml) rexml.elements.each("Policies/Policy") do |pol| #Policies policy_name = pol.attributes["name"] new_policy(policy_name) - #@policies[policy_name] = Policy.new(policy_name) + #@policies[policy_name] = Policy.new(policy_name) rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Rule") do |r| #Rules - rule_name = r.attributes["name"] + rule_name = r.attributes["name"] uri = rexml.elements["Policies/Policy[@name='#{policy_name}']/Rule[@name='#{rule_name}']/ResourceName"].attributes["name"] - @policies[policy_name].rules[rule_name] = @policies[policy_name].new_rule(rule_name, uri) + @policies[policy_name].rule.name = rule_name + @policies[policy_name].uri = uri rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Rule[@name='#{rule_name}']/AttributeValuePair") do |attribute_pairs| action=nil; value=nil; attribute_pairs.each_element do |elem| @@ -93,163 +99,234 @@ module OpenTox if action and value case action when "GET" - @policies[policy_name].rules[rule_name].get = value + @policies[policy_name].rule.get = value when "POST" - @policies[policy_name].rules[rule_name].post = value + @policies[policy_name].rule.post = value when "PUT" - @policies[policy_name].rules[rule_name].put = value - when "DELETE" - @policies[policy_name].rules[rule_name].delete = value + @policies[policy_name].rule.put = value + when "DELETE" + @policies[policy_name].rule.delete = value end end - end + end end rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Subjects") do |subjects| #Subjects - @policies[policy_name].subject_group = subjects.attributes["name"] + @policies[policy_name].subject_group = subjects.attributes["name"] rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Subjects[@name='#{@policies[policy_name].subject_group}']/Subject") do |s| #Subject subject_name = s.attributes["name"] subject_type = s.attributes["type"] subject_value = rexml.elements["Policies/Policy[@name='#{policy_name}']/Subjects[@name='#{@policies[policy_name].subject_group}']/Subject[@name='#{subject_name}']/AttributeValuePair/Value"].text - @policies[policy_name].new_subject(subject_name, subject_type, subject_value) if subject_name and subject_type and subject_value + if subject_name and subject_type and subject_value + @policies[policy_name].subject.name = subject_name + @policies[policy_name].type = subject_type + @policies[policy_name].value = subject_value + end end - end - end + end + end end - + #generates xml from policies instance def to_xml doc = REXML::Document.new() doc << REXML::DocType.new("Policies", "PUBLIC \"-//Sun Java System Access Manager7.1 2006Q3\n Admin CLI DTD//EN\" \"jar://com/sun/identity/policy/policyAdmin.dtd\"") doc.add_element(REXML::Element.new("Policies")) - + @policies.each do |name, pol| policy = REXML::Element.new("Policy") policy.attributes["name"] = pol.name policy.attributes["referralPolicy"] = false policy.attributes["active"] = true - @policies[name].rules.each do |r,rl| - rule = @policies[name].rules[r] - out_rule = REXML::Element.new("Rule") - out_rule.attributes["name"] = rule.name - servicename = REXML::Element.new("ServiceName") - servicename.attributes["name"]="iPlanetAMWebAgentService" - out_rule.add_element(servicename) - rescourcename = REXML::Element.new("ResourceName") - rescourcename.attributes["name"] = rule.uri - out_rule.add_element(rescourcename) - - ["get","post","delete","put"].each do |act| - if rule.method(act).call - attribute = REXML::Element.new("Attribute") - attribute.attributes["name"] = act.upcase - attributevaluepair = REXML::Element.new("AttributeValuePair") - attributevaluepair.add_element(attribute) - attributevalue = REXML::Element.new("Value") - attributevaluepair.add_element(attributevalue) - attributevalue.add_text REXML::Text.new(rule.method(act).call) - out_rule.add_element(attributevaluepair) - - end + rule = @policies[name].rule + out_rule = REXML::Element.new("Rule") + out_rule.attributes["name"] = rule.name + servicename = REXML::Element.new("ServiceName") + servicename.attributes["name"]="iPlanetAMWebAgentService" + out_rule.add_element(servicename) + rescourcename = REXML::Element.new("ResourceName") + rescourcename.attributes["name"] = rule.uri + out_rule.add_element(rescourcename) + + ["get","post","delete","put"].each do |act| + if rule.method(act).call + attribute = REXML::Element.new("Attribute") + attribute.attributes["name"] = act.upcase + attributevaluepair = REXML::Element.new("AttributeValuePair") + attributevaluepair.add_element(attribute) + attributevalue = REXML::Element.new("Value") + attributevaluepair.add_element(attributevalue) + attributevalue.add_text REXML::Text.new(rule.method(act).call) + out_rule.add_element(attributevaluepair) end - policy.add_element(out_rule) - end + end + policy.add_element(out_rule) subjects = REXML::Element.new("Subjects") subjects.attributes["name"] = pol.subject_group subjects.attributes["description"] = "" - @policies[name].subjects.each do |subj, subjs| - subject = REXML::Element.new("Subject") - subject.attributes["name"] = pol.subjects[subj].name - subject.attributes["type"] = pol.subjects[subj].type - subject.attributes["includeType"] = "inclusive" - attributevaluepair = REXML::Element.new("AttributeValuePair") - attribute = REXML::Element.new("Attribute") - attribute.attributes["name"] = "Values" - attributevaluepair.add_element(attribute) - attributevalue = REXML::Element.new("Value") - attributevalue.add_text REXML::Text.new(pol.subjects[subj].value) - attributevaluepair.add_element(attributevalue) - subject.add_element(attributevaluepair) - subjects.add_element(subject) - end + subj = @policies[name].subject.name + subject = REXML::Element.new("Subject") + subject.attributes["name"] = pol.subject.name + subject.attributes["type"] = pol.subject.type + subject.attributes["includeType"] = "inclusive" + attributevaluepair = REXML::Element.new("AttributeValuePair") + attribute = REXML::Element.new("Attribute") + attribute.attributes["name"] = "Values" + attributevaluepair.add_element(attribute) + attributevalue = REXML::Element.new("Value") + attributevalue.add_text REXML::Text.new(pol.subject.value) + attributevaluepair.add_element(attributevalue) + subject.add_element(attributevaluepair) + subjects.add_element(subject) policy.add_element(subjects) doc.root.add_element(policy) - end + end out = "" doc.write(out, 2) return out - end - + end + end - - #single policy in a policies instance - class Policy - - attr_accessor :name, :rules, :subject_group, :subjects - + + #single policy in a {Policies Policies} instance + class Policy + + attr_accessor :name, :rule, :subject_group, :subject, :value, :type, :uri, :group, :user + def initialize(name) @name = name - @rules = {} - @subject_group = "" - @subjects = {} + @rule = Rule.new("#{name}_rule", nil) + @subject_group = "#{name}_subjects" + @subject = Subject.new("#{name}_subject", nil, nil) end - - #create a new rule instance for the policy - def new_rule(name, uri) - @rules[name] = Rule.new(name, uri) + + # Subject type LDAPUsers or LDAPGroups + def type + @subject.type end - - #create a new subject instance for the policy - def new_subject(name, type, value) - @subjects[name] = Subject.new(name, type, value) + + # Set subject type + # @param [String],type + def type=(type) + @subject.type = type end - - # @return [Array] set of uris affected by policy - def uris - @rules.collect{ |k,v| v.uri }.uniq + + # returns LDAP Distinguished Name (DN) e.g. uid=username,ou=people,dc=opentox,dc=org or cn=membergroup,ou=groups,dc=opentox,dc=org + def value + @subject.value + end + + # sets LDAP Distinguished Name (DN) for policy e.g. + # @param [String],LDAPString + def value=(value) + @subject.value = value + end + + # uri affected by policy + # @return uri affected by policy + def uri + @rule.uri + end + + # sets uri affected by policy + # @param [String] set URI + def uri=(uri) + @rule.uri = uri + end + + # Get the groupname from within the LDAP Distinguished Name (DN) + def group + return false if !value && type != "LDAPGroups" + value.split(",").each{|part| return part.gsub("cn=","") if part.match("cn=")} + end + + # Get the username from within the LDAP Distinguished Name (DN) + def user + return false if !value && type != "LDAPUsers" + value.split(",").each{|part| return part.gsub("uid=","") if part.match("uid=")} + end + + # helper method sets value and type to opentox LDAP Distinguished Name (DN) of a user + def set_ot_user(username) + self.value = "uid=#{username},ou=people,dc=opentox,dc=org" + self.type = "LDAPUsers" + true + end + + def set_ot_group(groupname) + self.value = "cn=#{groupname},ou=groups,dc=opentox,dc=org" + self.type = "LDAPGroups" + true end - + #rule inside a policy class Rule - - attr_accessor :name, :uri, :get, :post, :put, :delete - + + attr_accessor :name, :uri, :get, :post, :put, :delete, :read, :readwrite + def initialize(name, uri) @name = name @uri = uri end - - def rename(new, old) - self[new] = self.delete(old) - self[new].name = new - end - + + #Set Rule attribute for request-method GET + # @param [String]value (allow,deny,nil) def get=(value) @get = check_value(value, @get) end - + + #Set Rule attribute for request-method POST + # @param [String]value (allow,deny,nil) def post=(value) @post = check_value(value, @post) end - + + #Set Rule attribute for request-method DELETE + # @param [String]value (allow,deny,nil) def delete=(value) @delete = check_value(value, @delete) end - + + #Set Rule attribute for request-method PUT + # @param [String]value (allow,deny,nil) def put=(value) @put = check_value(value, @put) end - + + def read + return true if @get == "allow" && (@put == "deny" || !@put) && (@post == "deny" || !@post) + end + + def readwrite + return true if @get == "allow" && @put == "allow" && @post == "allow" + end + + def read=(value) + if value + @get = "allow"; @put = nil; @post = nil + else + @get = nil; @put = nil; @post = nil + end + end + + def readwrite=(value) + if value + @get = "allow"; @put = "allow"; @post = "allow" + else + @get = nil; @put = nil; @post = nil + end + end + private - #checks if value is allow or deny. returns old value if not valid. + #checks if value is allow, deny or nil. returns old value if not valid. def check_value(new_value, old_value) - return (new_value=="allow" || new_value=="deny" || new_value==nil) ? new_value : old_value + return (new_value=="allow" || new_value=="deny" || new_value==nil) ? new_value : old_value end end - + class Subject - attr_accessor :name, :type, :value + attr_accessor :name, :type, :value def initialize(name, type, value) @name = name @@ -258,4 +335,4 @@ module OpenTox end end end -end \ No newline at end of file +end diff --git a/test/policy.rb b/test/policy.rb new file mode 100644 index 0000000..eb7e2b6 --- /dev/null +++ b/test/policy.rb @@ -0,0 +1,120 @@ +require 'test/unit' +$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') +require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','opentox-client.rb')) + +TEST_URI = "http://only_a_test/test/" + rand(1000000).to_s +USER_TYPE = "LDAPUsers" +USER_VALUE = "uid=guest,ou=people,dc=opentox,dc=org" +USER_GROUP = "member" +GROUP_TYPE = "LDAPGroups" +GROUP_VALUE = "cn=member,ou=groups,dc=opentox,dc=org" +POLICY_NAME = "test_policy_#{rand(100000)}" +RULE_NAME = "test_rule_#{rand(100000)}" +SUBJECT_NAME = "test_subject_#{rand(100000)}" + +AA ||= "https://opensso.in-silico.ch" +AA_USER = "guest" +AA_PASS = "guest" + +@@subjectid = OpenTox::Authorization.authenticate(AA_USER,AA_PASS) + +class PolicyTest < Test::Unit::TestCase + + def test_01_class + policies = OpenTox::Policies.new() + assert_equal(policies.class, OpenTox::Policies) + assert_kind_of Array, policies.names + assert_kind_of Array, policies.uris + assert_kind_of Array, policies.names + end + + def test_02_subclasses + policies = OpenTox::Policies.new() + policies.new_policy(POLICY_NAME) + assert_equal(policies.names[0], POLICY_NAME) + assert_equal(policies.policies[policies.names[0]].class, OpenTox::Policy) + policy = policies.policies[policies.names[0]] + policy.rule.name = RULE_NAME + policy.uri = TEST_URI + assert_equal(policy.rule.class, OpenTox::Policy::Rule) + assert_equal(policy.rule.name, RULE_NAME) + assert_equal(policy.rule.uri, TEST_URI) + assert_equal(policy.uri, TEST_URI) + policy.subject.name = SUBJECT_NAME + policy.type = USER_TYPE + policy.value = USER_VALUE + assert_equal(policy.subject.class, OpenTox::Policy::Subject) + assert_equal(policy.subject.name, SUBJECT_NAME) + assert_equal(policy.subject.type, USER_TYPE) + assert_equal(policy.type, USER_TYPE) + assert_equal(policy.subject.value, USER_VALUE) + assert_equal(policy.value, USER_VALUE) + end + + def test_03_read_readwrite + policies = OpenTox::Policies.new() + policies.new_policy(POLICY_NAME) + policy = policies.policies[policies.names[0]] + policy.rule.name = RULE_NAME + policy.uri = TEST_URI + policy.rule.get = "allow" + assert policy.rule.read + assert !policy.rule.readwrite + policy.rule.post = "allow" + policy.rule.put = "allow" + assert !policy.rule.read + assert policy.rule.readwrite + end + + def test_04_group_user + policies = OpenTox::Policies.new() + policies.load_default_policy(AA_USER, TEST_URI, "member") + assert_equal "member", policies.policies["policy_group"].group + assert_equal AA_USER, policies.policies["policy_user"].user + end + + def test_05_DN + policies = OpenTox::Policies.new() + policies.new_policy(POLICY_NAME) + policy = policies.policies[policies.names[0]] + policy.set_ot_user(AA_USER) + assert_equal USER_VALUE, policy.value + assert_equal USER_TYPE, policy.type + policy.set_ot_group(USER_GROUP) + assert_equal GROUP_VALUE, policy.value + assert_equal GROUP_TYPE, policy.type + end + + def test_06_load_xml_and_check_defaults + policies = OpenTox::Policies.new() + xml = File.read(File.join(File.dirname(__FILE__), "../lib/templates/default_policy.xml")) + policies.load_xml(xml) + # check user policy + policy = policies.policies["policy_user"] + assert policy.name == "policy_user" + assert policy.rule.name == "rule_user" + assert policy.rule.uri == "uri" + assert policy.rule.get == "allow" + assert policy.rule.post == "allow" + assert policy.rule.delete == "allow" + assert policy.rule.put == "allow" + assert policy.subject_group == "subjects_user" + assert policy.subject.name == "subject_user" + assert policy.subject.type == USER_TYPE + assert policy.subject.value == USER_VALUE + # check group policy + policy = policies.policies["policy_group"] + assert policy.name == "policy_group" + assert policy.rule.name == "rule_group" + assert policy.rule.uri == "uri" + assert policy.rule.get == "allow" + assert !policy.rule.post + assert !policy.rule.delete + assert !policy.rule.put + assert policy.subject_group == "subjects_group" + assert policy.subject.name == "subject_group" + assert policy.subject.type == GROUP_TYPE + assert policy.subject.value == GROUP_VALUE + end + +end \ No newline at end of file -- cgit v1.2.3 From 792de68f0b3e10379fc69a9565747d978fb6f4be Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 22 Mar 2012 12:55:18 +0100 Subject: improved error reporting for failed system calls --- lib/overwrite.rb | 8 +------- lib/task.rb | 11 +++++++---- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index d99e5a2..4ba6811 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -68,17 +68,11 @@ module Kernel stdout = stdout_stream.read stderr = stderr_stream.read end - internal_server_error stdout + stderr if !status.success? + internal_server_error "`" + cmd + "` failed.\n" + stdout + stderr if !status.success? return stdout rescue internal_server_error $!.message end - alias_method :system!, :system - - def system cmd - `#{cmd}` - return true - end end diff --git a/lib/task.rb b/lib/task.rb index f19a918..6923e28 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -8,14 +8,12 @@ module OpenTox def self.create service_uri, params={} - # TODO: run observer in same process? task = Task.new RestClientWrapper.post(service_uri,params).chomp pid = fork do begin result_uri = yield task.completed result_uri rescue - puts $!.report.to_yaml RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.report.to_yaml}) if $!.respond_to? :report task.kill end @@ -80,7 +78,7 @@ module OpenTox end - # get only header for ststus requests + # get only header for status requests def running? RestClientWrapper.head(@uri).code == 202 end @@ -98,6 +96,11 @@ module OpenTox code >= 400 and code != 503 end + def errorReport + # TODO: fix rdf output at task service + not_implemented_error "RDF output of errorReports has to be fixed at task service" + end + [:hasStatus, :resultURI].each do |method| define_method method do response = self.[](RDF::OT[method]) @@ -106,6 +109,6 @@ module OpenTox end end - #TODO: subtasks + #TODO: subtasks (only for progress) end -- cgit v1.2.3 From 0071cbd5f91cd3456a6e46b27155e8e408b384c1 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 23 Mar 2012 17:22:35 +0100 Subject: fix subjectid quoting in eval --- lib/opentox.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 4b43547..2232063 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -146,7 +146,7 @@ module OpenTox internal_server_error "Cannot determine class from URI '#{uri} (Candidate classes are #{result.inspect}) or matadata." unless klass end # initialize with/without subjectid - subjectid ? eval("#{self}.new(\"#{uri}\", #{subjectid})") : eval("#{self}.new(\"#{uri}\")") + subjectid ? eval("#{self}.new(\"#{uri}\", \"#{subjectid}\")") : eval("#{self}.new(\"#{uri}\")") end end -- cgit v1.2.3 From 3cbfaf2c2be98c0d79d48063427785f08b032e15 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 28 Mar 2012 10:10:08 +0000 Subject: result uri check in task temporarily removed --- lib/task.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/task.rb b/lib/task.rb index 6923e28..bcf806e 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -58,7 +58,7 @@ module OpenTox end def completed(uri) - not_found_error "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri + #not_found_error "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) end -- cgit v1.2.3 From a8fa38376624cdc5212e63e74b308ba1af32ae53 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 28 Mar 2012 12:54:05 +0200 Subject: aa to new config --- lib/authorization.rb | 20 ++++++++++---------- test/dataset.rb | 18 ++++++++++++------ 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 470ecd8..33fa0a4 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -1,6 +1,6 @@ module OpenTox - - AA ||= "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml + AA = $aa[:uri] if defined? $aa + AA ||= "https://opensso.in-silico.ch" #if not set in .opentox/conf/[application]/[test].rb #Module for Authorization and Authentication #@example Authentication # require "opentox-client" @@ -310,13 +310,13 @@ module OpenTox # @param [String] subjectid # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method, subjectid) - if CONFIG[:authorization][:free_request].include?(request_method) + if $aa[:free_request].include?(request_method) #$logger.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true elsif OpenTox::Authorization.free_uri?(uri, request_method) #$logger.debug "authorized? >>true<< (uris is free_uri), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true - elsif CONFIG[:authorization][:authenticate_request].include?(request_method) + elsif $aa[:authenticate_request].include?(request_method) ret = OpenTox::Authorization.is_token_valid(subjectid) $logger.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret @@ -324,7 +324,7 @@ module OpenTox ret = OpenTox::Authorization.is_token_valid(subjectid) $logger.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret - elsif CONFIG[:authorization][:authorize_request].include?(request_method) + elsif $aa[:authorize_request].include?(request_method) ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) $logger.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret ret @@ -336,9 +336,9 @@ module OpenTox private def self.free_uri?(uri, request_method) - if CONFIG[:authorization][:free_uris] - CONFIG[:authorization][:free_uris].each do |request_methods,uris| - if request_methods and uris and request_methods.include?(request_method.to_sym) + if $aa[:free_uris] + $aa[:free_uris].each do |request_methods,uris| + if request_methods and uris and request_methods.include?(request_method.to_s) uris.each do |u| return true if u.match uri end @@ -349,8 +349,8 @@ module OpenTox end def self.authorize_exception?(uri, request_method) - if CONFIG[:authorization][:authorize_exceptions] - CONFIG[:authorization][:authorize_exceptions].each do |request_methods,uris| + if $aa[:authorize_exceptions] + $aa[:authorize_exceptions].each do |request_methods,uris| if request_methods and uris and request_methods.include?(request_method.to_sym) uris.each do |u| return true if u.match uri diff --git a/test/dataset.rb b/test/dataset.rb index e41db8e..b3190b8 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -2,6 +2,11 @@ require 'test/unit' $LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' DATASET = "http://ot-dev.in-silico.ch/dataset" +AA ||= "https://opensso.in-silico.ch" +AA_USER = "guest" +AA_PASS = "guest" +@@subjectid = OpenTox::Authorization.authenticate(AA_USER,AA_PASS) + DATA_DIR = File.join(File.dirname(__FILE__),"data") # TODO: add subjectids @@ -9,19 +14,20 @@ DATA_DIR = File.join(File.dirname(__FILE__),"data") class DatasetTest < Test::Unit::TestCase def test_all - datasets = OpenTox::Dataset.all DATASET + puts @@subjectid + datasets = OpenTox::Dataset.all(DATASET, @@subjectid) assert_equal OpenTox::Dataset, datasets.first.class end def test_create_empty - d = OpenTox::Dataset.create DATASET + d = OpenTox::Dataset.create(DATASET, @@subjectid) assert_equal OpenTox::Dataset, d.class assert_match /#{DATASET}/, d.uri.to_s d.delete end def test_create_from_file - d = OpenTox::Dataset.from_file DATASET, File.join(DATA_DIR,"EPAFHM.mini.csv") + d = OpenTox::Dataset.from_file DATASET, File.join(DATA_DIR,"EPAFHM.mini.csv"), @@subjectid assert_equal OpenTox::Dataset, d.class assert_equal d.uri, d[RDF::XSD.anyURI] assert_equal "EPAFHM.mini", d.metadata[RDF::URI("http://purl.org/dc/elements/1.1/title")].first.to_s # DC.title is http://purl.org/dc/terms/title @@ -33,7 +39,7 @@ class DatasetTest < Test::Unit::TestCase end def test_from_yaml - @dataset = OpenTox::Dataset.from_file DATASET, File.join(DATA_DIR,"hamster_carcinogenicity.yaml") + @dataset = OpenTox::Dataset.from_file DATASET, File.join(DATA_DIR,"hamster_carcinogenicity.yaml"), @@subjectid assert_equal OpenTox::Dataset, @dataset.class assert_equal "hamster_carcinogenicity", @dataset[RDF::URI("http://purl.org/dc/elements/1.1/title")] hamster_carc? @@ -52,14 +58,14 @@ class DatasetTest < Test::Unit::TestCase =end def test_multicolumn_csv - @dataset = OpenTox::Dataset.from_file DATASET, "#{DATA_DIR}/multicolumn.csv" + @dataset = OpenTox::Dataset.from_file DATASET, "#{DATA_DIR}/multicolumn.csv", @@subjectid assert_equal 5, @dataset.features.size assert_equal 4, @dataset.compounds.size @dataset.delete end def test_from_csv - @dataset = OpenTox::Dataset.from_file DATASET, "#{DATA_DIR}/hamster_carcinogenicity.csv" + @dataset = OpenTox::Dataset.from_file DATASET, "#{DATA_DIR}/hamster_carcinogenicity.csv", @@subjectid assert_equal OpenTox::Dataset, @dataset.class hamster_carc? @dataset.delete -- cgit v1.2.3 From 0d457e40c005ba4209ec7e3093aa06d73d65a442 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 28 Mar 2012 18:26:19 +0200 Subject: change for new aa variables --- lib/overwrite.rb | 4 ++-- lib/rest-client-wrapper.rb | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 4ba6811..d98769e 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -30,13 +30,13 @@ module URI URI.parse(uri).instance_of? URI::HTTPS end - def self.accessible? uri, subjectid=nil + def self.accessible?(uri, subjectid=nil) if URI.task? uri or URI.compound? uri # just try to get a response, valid tasks may return codes > 400 Net::HTTP.get_response(URI.parse(uri)) true else - Net::HTTP.get_response(URI.parse(uri)).code.to_i < 400 + Net::HTTP.get_response(URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : ""))).code.to_i < 400 end rescue false diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 13ccf09..30292de 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -16,12 +16,13 @@ module OpenTox define_singleton_method method do |uri,payload={},headers={}| # check input + @subjectid = headers[:subjectid] ? headers[:subjectid] : nil bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri - not_found_error "URI '#{uri}' not found." unless URI.accessible? uri unless URI.ssl?(uri) + not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| - bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] unless URI(uri).host == URI(AA).host + bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] unless URI(uri).host == URI($aa[:uri]).host end # create request -- cgit v1.2.3 From ef6b74aa8167c1cd2685e8c7ab97f6905d5a03b9 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 29 Mar 2012 13:24:27 +0200 Subject: let subjectid in header if aa is defined and request go to opensso --- lib/rest-client-wrapper.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 30292de..a5adc80 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -16,13 +16,16 @@ module OpenTox define_singleton_method method do |uri,payload={},headers={}| # check input - @subjectid = headers[:subjectid] ? headers[:subjectid] : nil + @subjectid = headers[:subjectid] ? headers[:subjectid] : nil bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| - bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] unless URI(uri).host == URI($aa[:uri]).host + if defined? $aa || URI(uri).host == URI($aa[:uri]).host + else + bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] + end end # create request -- cgit v1.2.3 From 97f9367b05a9a665022adc5c3f0a988acb1c4fa3 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 29 Mar 2012 14:50:03 +0200 Subject: RestClientWrapper follows redirects --- lib/error.rb | 11 ++++++----- lib/opentox.rb | 6 ------ lib/rest-client-wrapper.rb | 13 ++++++++----- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index e12f140..579f42b 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -52,11 +52,12 @@ module OpenTox # Errors received from RestClientWrapper calls class RestCallError < Error - attr_accessor :request, :response - def initialize request, response, message + attr_accessor :request#, :response + def initialize message, request, uri + #def initialize request, response, message @request = request - @response = response - super 502, message, request.url + #@response = response + super 502, message, uri end end @@ -78,7 +79,7 @@ module OpenTox cut_index = backtrace.size-1 if cut_index < 0 @report[RDF::OT.errorDetails] = backtrace[0..cut_index].join("\n") @report[RDF::OT.errorDetails] += "REST paramenters:\n#{error.request.args.inspect}" if defined? error.request - @report[RDF::OT.message] += "\n" + error.response.body.to_s if defined? error.response + #@report[RDF::OT.message] += "\n" + error.response.body.to_s if defined? error.response # TODO fix Error cause # should point to another errorReport, but errorReports do not have URIs # create a separate service? diff --git a/lib/opentox.rb b/lib/opentox.rb index 2232063..187eb08 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -70,12 +70,6 @@ module OpenTox end end -# def to_hash -# hash = {} -# metadata.each{|k,v| v.is_a?(Array) ? hash[k.to_s] = v.collect{|i| i.to_s} : hash[k.to_s] = v.to_s} -# hash -# end - def to_yaml @rdf.to_hash.to_yaml end diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 30292de..aa5d9c4 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -34,13 +34,16 @@ module OpenTox headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems args[:headers] = headers - # perform request @request = RestClient::Request.new(args) - # do not throw RestClient exceptions in order to create a @response object (needed for error reports) in every case - @response = @request.execute { |response, request, result| return response } # ignore error codes from Task services (may return error codes >= 400 according to API, which causes exceptions in RestClient and RDF::Reader) - raise OpenTox::RestCallError.new @request, @response, "Response code is #{@response.code}." unless @response.code < 400 or URI.task? uri - @response + @response = @request.execute do |response, request, result| + if [301, 302, 307].include? response.code and request.method == :get + response.follow_redirection(request, result) + else + raise OpenTox::RestCallError.new response.to_s, request, uri unless response.code < 400 or URI.task? uri + response + end + end end end -- cgit v1.2.3 From 2551ed827399c20f571fa72edef5a59682ec5700 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 29 Mar 2012 18:08:26 +0200 Subject: fix logout error --- lib/authorization.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/authorization.rb b/lib/authorization.rb index 33fa0a4..a6d584c 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -101,6 +101,8 @@ module OpenTox return true if !AA begin return true if RestClientWrapper.post("#{AA}/auth/isTokenValid",:tokenid => subjectid) == "boolean=true\n" + rescue + return false end return false end -- cgit v1.2.3 From 1f208faa81c0e14314ddb6734e4889affa530c5d Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 30 Mar 2012 09:47:57 +0200 Subject: wrong result uri test temporariliy removed --- test/task.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/task.rb b/test/task.rb index ae323e8..399c66e 100644 --- a/test/task.rb +++ b/test/task.rb @@ -68,6 +68,7 @@ class TaskTest < Test::Unit::TestCase assert_equal "Error", task.hasStatus end +=begin def test_wrong_result_uri task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test wrong result uri", :creator => "http://test.org/fake_creator" do sleep 1 @@ -79,7 +80,6 @@ class TaskTest < Test::Unit::TestCase assert task.error? assert_equal "Error", task.hasStatus end -=begin =end end -- cgit v1.2.3 From 57f51d8ca7f6578eccb38deff1ab0c518f7a1df6 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 30 Mar 2012 13:54:35 +0200 Subject: fix request comparison --- lib/authorization.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/authorization.rb b/lib/authorization.rb index a6d584c..fd20f68 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -312,6 +312,7 @@ module OpenTox # @param [String] subjectid # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method, subjectid) + request_method = request_method.to_sym if request_method if $aa[:free_request].include?(request_method) #$logger.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true -- cgit v1.2.3 From e55a25e9fb0c91a581f898ce894a27e8bdd3d780 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 2 Apr 2012 12:47:29 +0000 Subject: version 0.0.2.pre --- opentox-client.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentox-client.gemspec b/opentox-client.gemspec index 52456a5..a51fdc6 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = "opentox-client" - s.version = "0.0.1pre" + s.version = "0.0.2pre" s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] s.email = ["helma@in-silico.ch"] s.homepage = "http://github.com/opentox/opentox-client" -- cgit v1.2.3 From b01dce14f765875d7c75edb545323b444fa2b140 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 10 Apr 2012 18:11:59 +0200 Subject: documentation for policy lib, seperate method to load default template xml --- lib/policy.rb | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/policy.rb b/lib/policy.rb index 56a90b7..3e7c143 100644 --- a/lib/policy.rb +++ b/lib/policy.rb @@ -58,7 +58,7 @@ module OpenTox when "guest", "anonymous" then "default_guest_policy" else "default_policy" end - xml = File.read(File.join(File.dirname(__FILE__), "templates/#{template}.xml")) + xml = get_xml_template(template) self.load_xml(xml) datestring = Time.now.strftime("%Y-%m-%d-%H-%M-%S-x") + rand(1000).to_s @@ -78,6 +78,10 @@ module OpenTox return true end + def get_xml_template(template) + File.read(File.join(File.dirname(__FILE__), "templates/#{template}.xml")) + end + #loads a xml template def load_xml(xml) rexml = REXML::Document.new(xml) @@ -247,19 +251,22 @@ module OpenTox end # helper method sets value and type to opentox LDAP Distinguished Name (DN) of a user + # @param [String]Username set a username into LDAP DN def set_ot_user(username) self.value = "uid=#{username},ou=people,dc=opentox,dc=org" self.type = "LDAPUsers" true end + # @param [String]Username set a groupname into LDAP DN def set_ot_group(groupname) self.value = "cn=#{groupname},ou=groups,dc=opentox,dc=org" self.type = "LDAPGroups" true end - #rule inside a policy + # policyrule + # sets the permission for REST actions (GET, POST, PUT, DELETE) of a specific URI to allow/deny/nil class Rule attr_accessor :name, :uri, :get, :post, :put, :delete, :read, :readwrite @@ -293,14 +300,18 @@ module OpenTox @put = check_value(value, @put) end + # read getter method def read return true if @get == "allow" && (@put == "deny" || !@put) && (@post == "deny" || !@post) end + # readwrite getter method def readwrite return true if @get == "allow" && @put == "allow" && @post == "allow" end + # Set(true case) or remove read(GET=allow) permissions. + # @param [Boolean]value (true,false) def read=(value) if value @get = "allow"; @put = nil; @post = nil @@ -309,6 +320,8 @@ module OpenTox end end + # Set(true case) or remove readwrite(GET=allow,POST=allow,PUT=allow) permissions. + # @param [Boolean]value (true,false) def readwrite=(value) if value @get = "allow"; @put = "allow"; @post = "allow" @@ -324,6 +337,8 @@ module OpenTox end end + # Subject of a policy + # name(subjectname), type('LDAPUsers' or 'LDAPGroups'), value(LDAP DN e.G.:'uid=guest,ou=people,dc=opentox,dc=org') class Subject attr_accessor :name, :type, :value -- cgit v1.2.3 From f8b6f8d19566d372e47edba7968ce66ff09052c9 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 26 Apr 2012 16:04:05 +0200 Subject: tests removed, URI.accessible? check temporarily removed --- lib/opentox.rb | 1 + lib/rest-client-wrapper.rb | 3 +- test/authorization.rb | 107 - test/compound.rb | 52 - test/data/CPDBAS_v5c_1547_29Apr2008part.sdf | 13553 -------------------- test/data/EPAFHM.csv | 618 - test/data/EPAFHM.mini.csv | 21 - test/data/ISSCAN-multi.csv | 59 - test/data/cpdb_100.csv | 101 - test/data/hamster_carcinogenicity.csv | 86 - test/data/hamster_carcinogenicity.mini.csv | 11 - test/data/hamster_carcinogenicity.sdf | 2805 ---- test/data/hamster_carcinogenicity.xls | Bin 12288 -> 0 bytes test/data/hamster_carcinogenicity.yaml | 352 - test/data/hamster_carcinogenicity_with_errors.csv | 88 - test/data/kazius.csv | 4069 ------ test/data/multi_cell_call.csv | 1067 -- test/data/multicolumn.csv | 5 - test/dataset.rb | 99 - test/error.rb | 35 - test/feature.rb | 36 - test/policy.rb | 120 - test/task.rb | 85 - 23 files changed, 3 insertions(+), 23370 deletions(-) delete mode 100644 test/authorization.rb delete mode 100644 test/compound.rb delete mode 100644 test/data/CPDBAS_v5c_1547_29Apr2008part.sdf delete mode 100644 test/data/EPAFHM.csv delete mode 100644 test/data/EPAFHM.mini.csv delete mode 100644 test/data/ISSCAN-multi.csv delete mode 100644 test/data/cpdb_100.csv delete mode 100644 test/data/hamster_carcinogenicity.csv delete mode 100644 test/data/hamster_carcinogenicity.mini.csv delete mode 100644 test/data/hamster_carcinogenicity.sdf delete mode 100644 test/data/hamster_carcinogenicity.xls delete mode 100644 test/data/hamster_carcinogenicity.yaml delete mode 100644 test/data/hamster_carcinogenicity_with_errors.csv delete mode 100644 test/data/kazius.csv delete mode 100644 test/data/multi_cell_call.csv delete mode 100644 test/data/multicolumn.csv delete mode 100644 test/dataset.rb delete mode 100644 test/error.rb delete mode 100644 test/feature.rb delete mode 100644 test/policy.rb delete mode 100644 test/task.rb diff --git a/lib/opentox.rb b/lib/opentox.rb index 187eb08..6ce439d 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -111,6 +111,7 @@ module OpenTox end def create service_uri, subjectid=nil + #uri = uri(SecureRandom.uuid) uri = RestClientWrapper.post(service_uri, {}, {:accept => 'text/uri-list', :subjectid => subjectid}) URI.task?(service_uri) ? from_uri(uri, subjectid, false) : from_uri(uri, subjectid) end diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 479d5a5..3071432 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -18,7 +18,8 @@ module OpenTox # check input @subjectid = headers[:subjectid] ? headers[:subjectid] : nil bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri - not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) + #TODO fix for internal installations + #not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| diff --git a/test/authorization.rb b/test/authorization.rb deleted file mode 100644 index e446ff7..0000000 --- a/test/authorization.rb +++ /dev/null @@ -1,107 +0,0 @@ -require 'test/unit' -$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') -require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','opentox-client.rb')) -TEST_URI = "http://only_a_test/test/" + rand(1000000).to_s -AA ||= "https://opensso.in-silico.ch" -AA_USER = "guest" -AA_PASS = "guest" -@@subjectid = OpenTox::Authorization.authenticate(AA_USER,AA_PASS) - -class TestOpenToxAuthorizationBasic < Test::Unit::TestCase - - def test_01_server - assert_equal(AA, OpenTox::Authorization.server) - end - - def test_02_get_token - assert_not_nil @@subjectid - end - - def test_03_is_valid_token - tok = login - assert_not_nil tok - assert OpenTox::Authorization.is_token_valid(tok) - logout(tok) - end - - def test_04_logout - tok = login - assert logout(tok) - assert_equal false, OpenTox::Authorization.is_token_valid(tok) - end - - def test_05_list_policies - assert_kind_of Array, OpenTox::Authorization.list_policies(@@subjectid) - end - -end - -class TestOpenToxAuthorizationLDAP < Test::Unit::TestCase - - def test_01_list_user_groups - assert_kind_of Array, OpenTox::Authorization.list_user_groups(AA_USER, @@subjectid) - end - - def test_02_get_user - assert_equal AA_USER, OpenTox::Authorization.get_user(@@subjectid) - end - -end - -class TestOpenToxAuthorizationLDAP < Test::Unit::TestCase - - def test_01_create_check_delete_default_policies - res = OpenTox::Authorization.send_policy(TEST_URI, @@subjectid) - assert res - assert OpenTox::Authorization.uri_has_policy(TEST_URI, @@subjectid) - policies = OpenTox::Authorization.list_uri_policies(TEST_URI, @@subjectid) - assert_kind_of Array, policies - policies.each do |policy| - assert OpenTox::Authorization.delete_policy(policy, @@subjectid) - end - assert_equal false, OpenTox::Authorization.uri_has_policy(TEST_URI, @@subjectid) - end - - def test_02_check_policy_rules - tok_anonymous = OpenTox::Authorization.authenticate("anonymous","anonymous") - assert_not_nil tok_anonymous - res = OpenTox::Authorization.send_policy(TEST_URI, @@subjectid) - assert res - assert OpenTox::Authorization.uri_has_policy(TEST_URI, @@subjectid) - owner_rights = {"GET" => true, "POST" => true, "PUT" => true, "DELETE" => true} - groupmember_rights = {"GET" => true, "POST" => nil, "PUT" => nil, "DELETE" => nil} - owner_rights.each do |request, right| - assert_equal right, OpenTox::Authorization.authorize(TEST_URI, request, @@subjectid), "#{AA_USER} requests #{request} to #{TEST_URI}" - end - groupmember_rights.each do |request, r| - assert_equal r, OpenTox::Authorization.authorize(TEST_URI, request, tok_anonymous), "anonymous requests #{request} to #{TEST_URI}" - end - - policies = OpenTox::Authorization.list_uri_policies(TEST_URI, @@subjectid) - assert_kind_of Array, policies - policies.each do |policy| - assert OpenTox::Authorization.delete_policy(policy, @@subjectid) - end - logout(tok_anonymous) - end - - def test_03_check_different_uris - res = OpenTox::Authorization.send_policy(TEST_URI, @@subjectid) - assert OpenTox::Authorization.uri_has_policy(TEST_URI, @@subjectid) - assert OpenTox::Authorization.authorize(TEST_URI, "GET", @@subjectid), "GET request" - policies = OpenTox::Authorization.list_uri_policies(TEST_URI, @@subjectid) - policies.each do |policy| - assert OpenTox::Authorization.delete_policy(policy, @@subjectid) - end - - end -end - - -def logout (token) - OpenTox::Authorization.logout(token) -end - -def login - OpenTox::Authorization.authenticate(AA_USER,AA_PASS) -end diff --git a/test/compound.rb b/test/compound.rb deleted file mode 100644 index da77480..0000000 --- a/test/compound.rb +++ /dev/null @@ -1,52 +0,0 @@ -require 'test/unit' -$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') -require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' - -class CompoundTest < Test::Unit::TestCase - - def setup - @service_uri = "http://ot-dev.in-silico.ch/compound" - end - - def test_compound_from_smiles_0 - c = OpenTox::Compound.from_smiles @service_uri, "F[B-](F)(F)F.[Na+]" - assert_equal "InChI=1S/BF4.Na/c2-1(3,4)5;/q-1;+1", c.to_inchi - assert_equal "[Na+].F[B-](F)(F)F", c.to_smiles # still does not work on 64bit machines - end - - def test_compound_from_smiles_1 - c = OpenTox::Compound.from_smiles @service_uri, "CC(=O)CC(C)C#N" - assert_equal "InChI=1S/C6H9NO/c1-5(4-7)3-6(2)8/h5H,3H2,1-2H3", c.to_inchi - assert_equal "CC(CC(=O)C)C#N", c.to_smiles - end - - def test_compound_from_name - c = OpenTox::Compound.from_name @service_uri, "Benzene" - assert_equal "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H", c.to_inchi - assert_equal "c1ccccc1", c.to_smiles - end - - def test_compound_from_smiles_2 - c = OpenTox::Compound.from_smiles @service_uri, "N#[N+]C1=CC=CC=C1.F[B-](F)(F)F" - assert_equal "InChI=1S/C6H5N2.BF4/c7-8-6-4-2-1-3-5-6;2-1(3,4)5/h1-5H;/q+1;-1", c.to_inchi - assert_equal "N#[N+]c1ccccc1.F[B-](F)(F)F", c.to_smiles - end - - def test_compound_from_inchi - c = OpenTox::Compound.from_inchi @service_uri, "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H" - assert_equal "c1ccccc1", c.to_smiles - end - - def test_compound_ambit - c = OpenTox::Compound.new "http://apps.ideaconsult.net:8080/ambit2/compound/144036" - assert_equal "InChI=1S/C6H11NO2/c1-3-5-6(4-2)7(8)9/h5H,3-4H2,1-2H3", c.to_inchi - assert_equal "CCC=C(CC)[N+](=O)[O-]", c.to_smiles - end - -=begin - def test_match_hits - c = OpenTox::Compound.from_smiles @service_uri, "N=C=C1CCC(=F=FO)C1" - assert_equal ({"FF"=>2, "CC"=>10, "C"=>6, "C1CCCC1"=>10, "C=C"=>2}), c.match_hits(['CC','F=F','C','C=C','FF','C1CCCC1','OO']) - end -=end -end diff --git a/test/data/CPDBAS_v5c_1547_29Apr2008part.sdf b/test/data/CPDBAS_v5c_1547_29Apr2008part.sdf deleted file mode 100644 index d7eb740..0000000 --- a/test/data/CPDBAS_v5c_1547_29Apr2008part.sdf +++ /dev/null @@ -1,13553 +0,0 @@ - - - - 14 16 0 0 0 0 0 0 0 0 1 V2000 - 7.3615 -3.7543 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2131 -3.0918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2131 -1.7594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.0573 -1.0969 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9089 -1.7594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9089 -3.0918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.0573 -3.7543 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6428 -3.5041 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.8624 -2.4219 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.5374 -2.2894 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.0748 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.7803 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1054 -0.1325 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6428 -1.3471 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 7 2 0 0 0 0 - 3 4 2 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 14 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 14 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 -M END -> -20001 - -> -1 - -> -20001 - -> -1_CPDBAS_v5c - -> -C11H9N3 - -> -183.2122 - -> -defined organic - -> -parent - -> -tested chemical - -> -A-alpha-C - -> -26148-68-5 - -> -single chemical compound - -> -blank - -> -9H-pyrido[2,3-b]indol-2-amine - -> -NC1C=CC2=C(N=1)NC3=CC=CC=C23 - -> -NC1C=CC2=C(N=1)NC3=CC=CC=C23 - -> -InChI=1/C11H9N3/c12-10-6-5-8-7-3-1-2-4-9(7)13-11(8)14-10/h1-6H,(H3,12,13,14)/f/h13H,12H2 - -> -FJTNLJLPLJDTRM-DXMPFREMCP - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -active - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -49.8 - -> -0.271815959854202 - -> -35 - -> -TD50 is harmonic mean of more than one positive test - -> -liver; vascular system - -> -liver; vascular system - -> -blank - -> -active - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -blank - -> -active - -> -active - -> -multisite active; multisex active - -> -blank - -> -blank - -> -http://potency.berkeley.edu/chempages/A-alpha-C.html - -$$$$ - - - - 11 10 0 0 0 0 0 0 0 0 2 V2000 - 3.4800 -1.1526 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4800 -2.4613 0.0000 N 0 5 0 0 0 0 0 0 0 0 0 0 - 2.3349 -3.1008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3349 -0.4610 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1749 -2.4613 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1749 -1.1526 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.1344 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.8110 -1.1526 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3349 -4.4392 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4359 -2.2159 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 4 1 0 0 0 0 - 1 7 2 0 0 0 0 - 1 8 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 9 2 0 0 0 0 - 3 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 10 1 0 0 0 0 -M CHG 2 2 -1 11 1 -M END -> -40770 - -> -10606 - -> -30606 - -> -2_CPDBAS_v5c - -> -C4H4KNO4S - -> -201.2422 - -> -defined organic - -> -salt K - -> -tested chemical - -> -Acesulfame-K - -> -55589-62-3 - -> -single chemical compound - -> -parent [33665-90-6] - -> -potassium 6-methyl-4-oxo-4H-1,2,3-oxathiazin-3-ide 2,2-dioxide - -> -O=S([N-]C1=O)(OC(C)=C1)=O.[K+] - -> -O=S(NC1=O)(OC(C)=C1)=O - -> -InChI=1/C4H5NO4S.K/c1-3-2-4(6)5-10(7,8)9-3;/h2H,1H3,(H,5,6);/q;+1/p-1/fC4H4NO4S.K/q-1;m - -> -WBZFUFAFFUEMEI-COHKJUPYCC - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -Mouse added v5a; chemical added v5a - -> -http://potency.berkeley.edu/chempages/ACESULFAME-K.html - -$$$$ - - - - 3 2 0 0 0 0 0 0 0 0 1 V2000 - 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 -M END -> -20002 - -> -2 - -> -39224 - -> -3_CPDBAS_v5c - -> -C2H4O - -> -44.0526 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acetaldehyde - -> -75-07-0 - -> -single chemical compound - -> -acetaldehyde - -> -CC=O - -> -CC=O - -> -InChI=1/C2H4O/c1-2-3/h2H,1H3 - -> -IKHGUXGNUITLKF-UHFFFAOYAB - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; hamster - -> -inactive - -> -153 - -> -3.4731207692622 - -> -20 - -> -TD50 is harmonic mean of more than one positive test - -> -nasal cavity - -> -nasal cavity - -> -active - -> -565 - -> -12.8255766969486 - -> -1 - -> -TD50 is harmonic mean of more than one positive test - -> -nasal cavity; oral cavity - -> -oral cavity - -> -active - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -http://potency.berkeley.edu/chempages/ACETALDEHYDE.html - -$$$$ - - - - 7 6 0 0 0 0 0 0 0 0 1 V2000 - 5.7637 -1.9942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6110 -1.3314 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4582 -1.9942 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3055 -1.3314 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3055 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1527 -1.9942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3314 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 6 7 2 0 0 0 0 -M END -> -20003 - -> -3 - -> -39225 - -> -4_CPDBAS_v5c - -> -C4H8N2O - -> -100.12 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acetaldehyde methylformylhydrazone - -> -16568-02-8 - -> -single chemical compound - -> -N'-[(1E)-ethylidene]-N-methylformic hydrazide - -> -CC=NN(C)C=O - -> -CC=NN(C)C=O - -> -InChI=1/C4H8N2O/c1-3-5-6(2)4-7/h3-4H,1-2H3/b5-3+ - -> -IMAGWKUTFZRWSB-HWKANZROBR - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -inactive - -> -2.51 - -> -2.50699161006792E-02 - -> -46 - -> -TD50 is harmonic mean of more than one positive test - -> -lung; preputial gland - -> -clitoral gland; lung; stomach - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -http://potency.berkeley.edu/chempages/ACETALDEHYDE%20METHYLFORMYLHYDRAZONE.html - -$$$$ - - - - 4 3 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3061 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4575 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 3 4 1 0 0 0 0 -M END -> -20004 - -> -4 - -> -20004 - -> -5_CPDBAS_v5c - -> -C2H5NO - -> -59.0672 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acetaldoxime - -> -107-29-9 - -> -single chemical compound - -> -(1E)-acetaldehyde oxime - -> -CC=NO - -> -CC=NO - -> -InChI=1/C2H5NO/c1-2-3-4/h2,4H,1H3/b3-2+ - -> -FZENGILVLUJGJX-NSCUHMNNBP - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/ACETALDOXIME.html - -$$$$ - - - - 4 3 0 0 0 0 0 0 0 0 1 V2000 - 1.9950 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3292 -1.1518 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9950 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1518 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 -M END -> -20005 - -> -5 - -> -20005 - -> -6_CPDBAS_v5c - -> -C2H5NO - -> -59.0672 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acetamide - -> -60-35-5 - -> -single chemical compound - -> -acetamide - -> -CC(=O)N - -> -CC(=O)N - -> -InChI=1/C2H5NO/c1-2(3)4/h1H3,(H2,3,4)/f/h3H2 - -> -DLFVBJFMPXGRIB-ZZOWFUDICC - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -180 - -> -3.04737654739009 - -> -21 - -> -TD50 is harmonic mean of more than one positive test - -> -liver - -> -liver - -> -active - -> -3010 - -> -50.9589078202454 - -> -9 - -> -hematopoietic system - -> -no positive results - -> -active - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -http://potency.berkeley.edu/chempages/ACETAMIDE.html - -$$$$ - - - - 11 11 0 0 0 0 0 0 0 0 1 V2000 - 3.8512 -1.8702 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.9346 -2.8163 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5407 -0.5987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1522 -2.2102 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.6410 -2.4689 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2397 -0.2587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.0983 -1.2862 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2936 -1.2049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7583 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3919 -1.6114 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.8575 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 1 3 1 0 0 0 0 - 1 4 1 0 0 0 0 - 2 5 1 0 0 0 0 - 3 6 2 0 0 0 0 - 4 7 1 0 0 0 0 - 5 8 2 0 0 0 0 - 6 8 1 0 0 0 0 - 7 9 1 0 0 0 0 - 7 10 2 0 0 0 0 - 8 11 1 0 0 0 0 -M END -> -20006 - -> -6 - -> -20006 - -> -7_CPDBAS_v5c - -> -C8H9NO2 - -> -151.1626 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acetaminophen - -> -103-90-2 - -> -single chemical compound - -> -N-(4-hydroxyphenyl)acetamide - -> -C1(=CC=C(C=C1)O)NC(C)=O - -> -C1(=CC=C(C=C1)O)NC(C)=O - -> -InChI=1/C8H9NO2/c1-6(10)9-7-2-4-8(11)5-3-7/h2-5,11H,1H3,(H,9,10)/f/h9H - -> -RZVAJINKPMORJF-BGGKNDAXCW - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -495 - -> -3.27461951567385 - -> -20 - -> -TD50 is harmonic mean of more than one positive test - -> -liver; urinary bladder - -> -liver; urinary bladder - -> -active - -> -1620 - -> -10.7169365967508 - -> -17 - -> -TD50 is harmonic mean of more than one positive test - -> -liver - -> -liver - -> -active - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -TR 394; final call in CPDB differs due to additional data - -> -http://potency.berkeley.edu/chempages/ACETAMINOPHEN.html - -$$$$ - - - - 22 23 0 0 0 0 0 0 0 0 1 V2000 - 5.1434 -4.1211 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9933 -3.4609 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 2.8432 -2.7900 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3224 -4.6110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9913 -4.6110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3311 -5.7610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9913 -6.9111 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3224 -6.9111 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9933 -5.7610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3311 -8.0718 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9913 -9.2219 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -8.0718 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6642 -2.3002 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9953 -2.3002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6555 -3.4609 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6555 -1.1501 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9866 -1.1501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6575 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9780 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.6489 -1.1501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9780 -2.3002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6575 -2.3002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 2 13 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 7 10 1 0 0 0 0 - 8 9 2 0 0 0 0 - 10 11 2 0 0 0 0 - 10 12 1 0 0 0 0 - 13 14 1 0 0 0 0 - 14 15 2 0 0 0 0 - 14 16 1 0 0 0 0 - 16 17 1 0 0 0 0 - 17 18 1 0 0 0 0 - 17 22 1 0 0 0 0 - 18 19 1 0 0 0 0 - 19 20 1 0 0 0 0 - 20 21 1 0 0 0 0 - 21 22 1 0 0 0 0 -M END -> -20007 - -> -7 - -> -20007 - -> -8_CPDBAS_v5c - -> -C15H20N2O4S - -> -324.3953 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acetohexamide - -> -968-81-0 - -> -single chemical compound - -> -4-acetyl-N-[(cyclohexylamino)carbonyl]benzenesulfonamide - -> -O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2 - -> -O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2 - -> -InChI=1/C15H20N2O4S/c1-11(18)12-7-9-14(10-8-12)22(20,21)17-15(19)16-13-5-3-2-4-6-13/h7-10,13H,2-6H2,1H3,(H2,16,17,19)/f/h16-17H - -> -VGZSUPCWNCWDAN-XQMQJMAZCC - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -TR 050 - -> -http://potency.berkeley.edu/chempages/ACETOHEXAMIDE.html - -$$$$ - - - - 18 19 0 0 0 0 0 0 0 0 2 V2000 - 11.1272 -2.0879 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.1272 -0.7492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.2816 -2.7511 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9727 -2.7511 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 8.8182 -2.0879 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.6760 -2.7511 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.5286 -4.0652 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2268 -4.3477 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.5636 -3.1932 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4601 -2.2107 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 4.2372 -3.0581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3529 -4.0407 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1370 -3.5003 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2721 -2.1861 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5740 -1.9037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2896 -1.2896 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.6335 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.6335 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 1 0 0 0 0 - 1 4 2 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 6 10 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 9 10 1 0 0 0 0 - 9 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 15 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 14 15 1 0 0 0 0 - 14 16 1 0 0 0 0 - 16 17 2 0 0 0 0 - 16 18 1 0 0 0 0 -M CHG 2 16 1 18 -1 -M END -> -20008 - -> -8 - -> -20008 - -> -9_CPDBAS_v5c - -> -C10H10N4O3S - -> -266.274 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acetone[4-(5-nitro-2-furyl)-2-thiazolyl] hydrazone - -> -18523-69-8 - -> -single chemical compound - -> -propan-2-one [5-(5-nitrofuran-2-yl)-1,3-thiazol-2-yl]hydrazone - -> -C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-] - -> -C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-] - -> -InChI=1/C10H10N4O3S/c1-6(2)12-13-10-11-5-8(18-10)7-3-4-9(17-7)14(15)16/h3-5H,1-2H3,(H,11,13)/f/h13H - -> -CUWVNOSSZYUJAE-NDKGDYFDCK - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -6.05 - -> -2.27209566086062E-02 - -> -43 - -> -stomach - -> -active - -> -active - -> -http://potency.berkeley.edu/chempages/ACETONE[4-(5-NITRO-2-FURYL)-2-THIAZOLYL]HYDRAZONE.html - -$$$$ - - - - 3 2 0 0 0 0 0 0 0 0 1 V2000 - 2.6600 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3300 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 - 1 2 1 0 0 0 0 - 2 3 3 0 0 0 0 -M END -> -20009 - -> -9 - -> -20009 - -> -10_CPDBAS_v5c - -> -C2H3N - -> -41.0519 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acetonitrile - -> -75-05-8 - -> -single chemical compound - -> -acetonitrile - -> -CC#N - -> -CC#N - -> -InChI=1/C2H3N/c1-2-3/h1H3 - -> -WEVYAHXRMPXWCK-UHFFFAOYAJ - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -TR 447 - -> -http://potency.berkeley.edu/chempages/ACETONITRILE.html - -$$$$ - - - - 5 4 0 0 0 0 0 0 0 0 1 V2000 - 3.4567 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1511 -1.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3308 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3056 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 5 1 0 0 0 0 - 3 4 1 0 0 0 0 -M END -> -20010 - -> -10 - -> -20010 - -> -11_CPDBAS_v5c - -> -C3H7NO - -> -73.0938 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acetoxime - -> -127-06-0 - -> -single chemical compound - -> -propan-2-one oxime - -> -CC(=NO)C - -> -CC(=NO)C - -> -InChI=1/C3H7NO/c1-3(2)4-5/h5H,1-2H3 - -> -PXAJQJMDEXJWFB-UHFFFAOYAK - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -12.1 - -> -0.165540716175654 - -> -34 - -> -liver - -> -no positive results - -> -active - -> -active - -> -http://potency.berkeley.edu/chempages/ACETOXIME.html - -$$$$ - - - - 16 17 0 0 0 0 0 0 0 0 1 V2000 - 1.1551 -0.6716 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9126 -2.6594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9126 -3.9935 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.1751 -2.2475 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.1751 -4.4054 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.9541 -3.3309 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7575 -1.9968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7575 -4.6561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4563 -0.6716 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3012 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6024 -2.6594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6024 -3.9935 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4563 -1.9968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3012 -2.6594 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1551 -1.9968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.6594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 15 2 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 2 7 1 0 0 0 0 - 3 5 1 0 0 0 0 - 3 8 1 0 0 0 0 - 4 6 1 0 0 0 0 - 5 6 1 0 0 0 0 - 7 11 2 0 0 0 0 - 8 12 2 0 0 0 0 - 9 13 1 0 0 0 0 - 9 10 2 0 0 0 0 - 11 12 1 0 0 0 0 - 11 13 1 0 0 0 0 - 13 14 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 1 0 0 0 0 -M END -> -20011 - -> -11 - -> -39226 - -> -12_CPDBAS_v5c - -> -C12H12O4 - -> -220.2213 - -> -defined organic - -> -parent - -> -tested chemical - -> -1'-Acetoxysafrole - -> -34627-78-6 - -> -single chemical compound - -> -1-(1,3-benzodioxol-5-yl)prop-2-en-1-yl acetate - -> -O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C - -> -O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C - -> -InChI=1/C12H12O4/c1-3-10(16-8(2)13)9-4-5-11-12(6-9)15-7-14-11/h3-6,10H,1,7H2,2H3 - -> -TXUCQVJZBXYDKH-UHFFFAOYAY - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -25 - -> -0.113522170652884 - -> -35 - -> -TD50 is harmonic mean of more than one positive test - -> -stomach - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -active - -> -http://potency.berkeley.edu/chempages/1'-ACETOXYSAFROLE.html - -$$$$ - - - - 13 13 0 0 0 0 0 0 0 0 1 V2000 - 2.6636 -2.3090 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9977 -1.1588 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6659 -1.1588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9953 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6526 -1.1588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9844 -1.1588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6503 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9844 -3.4592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6526 -3.4592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9820 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6479 -3.4592 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 5 2 0 0 0 0 - 6 7 2 0 0 0 0 - 6 11 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 9 10 1 0 0 0 0 - 9 12 1 0 0 0 0 - 10 11 2 0 0 0 0 - 12 13 1 0 0 0 0 -M END -> -20012 - -> -12 - -> -20012 - -> -13_CPDBAS_v5c - -> -C9H12N2O2 - -> -180.206 - -> -defined organic - -> -parent - -> -tested chemical - -> -N'-Acetyl-4-(hydroxymethyl) phenylhydrazine - -> -65734-38-5 - -> -single chemical compound - -> -N'-[4-(hydroxymethyl)phenyl]acetohydrazide - -> -N(NC(C)=O)C1=CC=C(C=C1)CO - -> -N(NC(C)=O)C1=CC=C(C=C1)CO - -> -InChI=1/C9H12N2O2/c1-7(13)10-11-9-4-2-8(6-12)3-5-9/h2-5,11-12H,6H2,1H3,(H,10,13)/f/h10H - -> -UFFJUAYKLIGSJF-KZFATGLACR - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -241 - -> -1.33735835654751 - -> -27 - -> -TD50 is harmonic mean of more than one positive test - -> -lung; vascular system - -> -lung; vascular system - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -http://potency.berkeley.edu/chempages/N'-ACETYL-4-(HYDROXYMETHYL)PHENYLHYDRAZINE.html - -$$$$ - - - - 13 13 0 0 0 0 0 0 0 0 1 V2000 - 3.4560 -1.9979 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3040 -1.3292 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1520 -1.9979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3292 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1520 -3.3271 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6000 -1.3292 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7520 -1.9979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9040 -1.3292 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0560 -1.9979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0560 -3.3271 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9040 -3.9877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7520 -3.3271 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 5 2 0 0 0 0 - 6 7 1 0 0 0 0 - 6 13 2 0 0 0 0 - 7 8 2 0 0 0 0 - 7 12 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 -M END -> -20013 - -> -13 - -> -20013 - -> -14_CPDBAS_v5c - -> -C8H9N3O2 - -> -179.178 - -> -defined organic - -> -parent - -> -tested chemical - -> -1-Acetyl-2-isonicotinoylhydrazine - -> -1078-38-2 - -> -single chemical compound - -> -N'-acetylpyridine-4-carbohydrazide - -> -N(NC(C)=O)C(C1=CC=NC=C1)=O - -> -N(NC(C)=O)C(C1=CC=NC=C1)=O - -> -InChI=1/C8H9N3O2/c1-6(12)10-11-8(13)7-2-4-9-5-3-7/h2-5H,1H3,(H,10,12)(H,11,13)/f/h10-11H - -> -CVBGNAKQQUWBQV-PZWAIHAUCF - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -330 - -> -1.84174396410274 - -> -25 - -> -TD50 is harmonic mean of more than one positive test - -> -lung - -> -lung - -> -active - -> -active - -> -active - -> -multisex active - -> -http://potency.berkeley.edu/chempages/1-ACETYL-2-ISONICOTINOYLHYDRAZINE.html - -$$$$ - - - - 12 12 0 0 0 0 0 0 0 0 1 V2000 - 1.9922 -4.6067 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6563 -3.4580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9922 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6563 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9922 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9905 -1.1547 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6546 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9905 -3.4580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9827 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6641 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.4580 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 8 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 10 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 7 9 1 0 0 0 0 - 10 11 2 0 0 0 0 - 10 12 1 0 0 0 0 -M END -> -20014 - -> -14 - -> -20014 - -> -15_CPDBAS_v5c - -> -C8H8O4 - -> -168.1488 - -> -defined organic - -> -parent - -> -tested chemical - -> -3-Acetyl-6-methyl-2,4-pyrandione - -> -520-45-6 - -> -single chemical compound - -> -tautomers - -> -3-acetyl-6-methyl-2H-pyran-2,4(3H)-dione - -> -O=C1C(C(=O)OC(=C1)C)C(=O)C - -> -O=C1C(C(=O)OC(=C1)C)C(=O)C - -> -InChI=1/C8H8O4/c1-4-3-6(10)7(5(2)9)8(11)12-4/h3,7H,1-2H3 - -> -PGRHXDWITVMQBC-UHFFFAOYAH - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -http://potency.berkeley.edu/chempages/3-ACETYL-6-METHYL-2,4-PYRANDIONE.html - -$$$$ - - - - 11 11 0 0 0 0 0 0 0 0 1 V2000 - 3.9907 -2.3079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6605 -2.3079 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9953 -1.1573 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6651 -1.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6558 -1.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9860 -1.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6511 -2.3079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9860 -3.4586 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6558 -3.4586 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 7 2 0 0 0 0 - 1 11 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 2 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 -M END -> -20015 - -> -15 - -> -20015 - -> -16_CPDBAS_v5c - -> -C8H10N2O - -> -150.1778 - -> -defined organic - -> -parent - -> -tested chemical - -> -1-Acetyl-2-phenylhydrazine - -> -114-83-0 - -> -single chemical compound - -> -N'-phenylacetohydrazide - -> -C1(NNC(C)=O)=CC=CC=C1 - -> -C1(NNC(C)=O)=CC=CC=C1 - -> -InChI=1/C8H10N2O/c1-7(11)9-10-8-5-3-2-4-6-8/h2-6,10H,1H3,(H,9,11)/f/h9H - -> -UICBCXONCUFSOI-BGGKNDAXCP - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -active - -> -51.2 - -> -0.34092921856626 - -> -34 - -> -TD50 is harmonic mean of more than one positive test - -> -vascular system - -> -vascular system - -> -active - -> -active - -> -active - -> -multisex active - -> -http://potency.berkeley.edu/chempages/1-ACETYL-2-PHENYLHYDRAZINE.html - -$$$$ - - - - 16 17 0 0 0 0 0 0 0 0 1 V2000 - 1.9954 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3269 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1473 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9954 -2.3046 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3223 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9907 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3176 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9861 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3176 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9907 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3130 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9814 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.3083 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9768 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.3083 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9814 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 10 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 8 9 1 0 0 0 0 - 8 11 1 0 0 0 0 - 9 10 2 0 0 0 0 - 11 12 2 0 0 0 0 - 11 16 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 2 0 0 0 0 -M END -> -20016 - -> -16 - -> -39243 - -> -17_CPDBAS_v5c - -> -C14H13NO - -> -211.2628 - -> -defined organic - -> -parent - -> -tested chemical - -> -4-Acetylaminobiphenyl - -> -4075-79-0 - -> -single chemical compound - -> -N-biphenyl-4-ylacetamide - -> -CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2 - -> -CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2 - -> -InChI=1/C14H13NO/c1-11(16)15-14-9-7-13(8-10-14)12-5-3-2-4-6-12/h2-10H,1H3,(H,15,16)/f/h15H - -> -SVLDILRDQOVJED-YAQRNVERCM - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -1.18 - -> -5.58546038393887E-03 - -> -49 - -> -mammary gland - -> -active - -> -active - -> -http://potency.berkeley.edu/chempages/4-ACETYLAMINOBIPHENYL.html - -$$$$ - - - - 17 19 0 0 0 0 0 0 0 0 1 V2000 - 8.3884 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.7257 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.3884 -4.6052 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.3920 -3.4560 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7293 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3955 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5064 -3.2883 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2900 -2.7514 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0737 -3.2883 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.5081 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.1426 -1.1828 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3505 -0.6459 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.4326 -1.4260 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.7328 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3955 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7293 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.3920 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 17 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 14 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 8 13 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 2 0 0 0 0 - 13 14 1 0 0 0 0 - 14 15 2 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 2 0 0 0 0 -M END -> -20017 - -> -17 - -> -20017 - -> -18_CPDBAS_v5c - -> -C15H13NO - -> -223.2738 - -> -defined organic - -> -parent - -> -tested chemical - -> -1-Acetylaminofluorene - -> -28314-03-6 - -> -single chemical compound - -> -N-9H-fluoren-1-ylacetamide - -> -CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1 - -> -CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1 - -> -InChI=1/C15H13NO/c1-10(17)16-15-8-4-7-13-12-6-3-2-5-11(12)9-14(13)15/h2-8H,9H2,1H3,(H,16,17)/f/h16H - -> -POECHIXSIXBYKI-WYUMXYHSCQ - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/1-ACETYLAMINOFLUORENE.html - -$$$$ - - - - 17 19 0 0 0 0 0 0 0 0 1 V2000 - 5.7640 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.0213 -1.3540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8046 -2.4275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.1296 -2.2921 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.6712 -1.0735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.8878 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.5629 -0.1451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.0213 -3.5106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7640 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6035 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4526 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4526 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6035 -1.1025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3017 -3.7621 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1509 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1509 -1.7698 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 9 1 0 0 0 0 - 1 13 2 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 14 1 0 0 0 0 - 12 13 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 1 0 0 0 0 - 15 17 2 0 0 0 0 -M END -> -20018 - -> -18 - -> -39227 - -> -19_CPDBAS_v5c - -> -C15H13NO - -> -223.2698 - -> -defined organic - -> -parent - -> -tested chemical - -> -2-Acetylaminofluorene - -> -53-96-3 - -> -single chemical compound - -> -N-9H-fluoren-2-ylacetamide - -> -C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O - -> -C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O - -> -InChI=1/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17)/f/h16H - -> -CZIHNRWJTSTCEX-WYUMXYHSCF - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse; hamster; rhesus - -> -active - -> -1.22 - -> -5.46424102140101E-03 - -> -49 - -> -TD50 is harmonic mean of more than one positive test - -> -liver; mammary gland; skin - -> -liver; mammary gland; skin - -> -active - -> -7.59 - -> -3.39947453708473E-02 - -> -45 - -> -TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results - -> -liver; urinary bladder - -> -liver; urinary bladder - -> -active - -> -17.4 - -> -7.79326178462112E-02 - -> -53 - -> -liver - -> -no positive results - -> -active - -> -no positive results - -> -no positive results for Rhesus - -> -inactive - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -http://potency.berkeley.edu/chempages/2-ACETYLAMINOFLUORENE.html - -$$$$ - - - - 17 19 0 0 0 0 0 0 0 0 1 V2000 - 2.3012 -3.9858 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2905 -4.8819 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.7528 -6.0934 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5342 -7.1688 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.8533 -7.0326 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3981 -5.8139 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6167 -4.7385 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.4266 -5.9572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1542 -4.6525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.9858 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.6596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1542 -1.9929 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3012 -2.6596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4553 -1.9929 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4553 -0.6667 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3012 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6023 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 9 1 0 0 0 0 - 1 13 2 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 1 0 0 0 0 - 15 17 2 0 0 0 0 -M END -> -20019 - -> -19 - -> -20019 - -> -20_CPDBAS_v5c - -> -C15H13NO - -> -223.2698 - -> -defined organic - -> -parent - -> -tested chemical - -> -4-Acetylaminofluorene - -> -28322-02-3 - -> -single chemical compound - -> -N-9H-fluoren-4-ylacetamide - -> -C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O - -> -C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O - -> -InChI=1/C15H13NO/c1-10(17)16-14-8-4-6-12-9-11-5-2-3-7-13(11)15(12)14/h2-8H,9H2,1H3,(H,16,17)/f/h16H - -> -PHPWISAFHNEMSR-WYUMXYHSCU - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/4-ACETYLAMINOFLUORENE.html - -$$$$ - - - - 14 14 0 0 0 0 0 0 0 0 1 V2000 - 5.7595 -0.6749 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7595 -1.9876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6224 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6224 -2.6625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4853 -0.6749 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4853 -1.9876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9335 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0891 -0.6564 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2447 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0891 -1.9876 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3112 -2.6625 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1556 -1.9876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.6625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1556 -0.6564 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 2 0 0 0 0 - 1 7 1 0 0 0 0 - 2 4 2 0 0 0 0 - 3 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 11 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 8 10 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 12 14 2 0 0 0 0 -M END -> -20020 - -> -20 - -> -20020 - -> -21_CPDBAS_v5c - -> -C10H11NO3 - -> -193.1992 - -> -defined organic - -> -parent - -> -tested chemical - -> -4-Acetylaminophenylacetic acid - -> -18699-02-0 - -> -single chemical compound - -> -[4-(acetylamino)phenyl]acetic acid - -> -O=C(O)Cc1ccc(cc1)NC(C)=O - -> -O=C(O)Cc1ccc(cc1)NC(C)=O - -> -InChI=1/C10H11NO3/c1-7(12)11-9-4-2-8(3-5-9)6-10(13)14/h2-5H,6H2,1H3,(H,11,12)(H,13,14)/f/h11,13H - -> -MROJXXOCABQVEF-KZZMUEETCP - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -Rat added v2a; Mouse added v2a - -> -http://potency.berkeley.edu/chempages/4-ACETYLAMINOPHENYLACETIC%20ACID.html - -$$$$ - - - - 10 9 0 0 1 0 0 0 0 0 1 V2000 - 2.3100 -1.9854 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4651 -1.3307 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3100 -3.3213 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4651 -3.9920 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4651 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4651 -5.3227 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6148 -1.9854 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9854 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1710 -1.3307 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6148 -3.3213 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 1 1 0 0 0 - 1 9 1 0 0 0 0 - 2 5 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 6 2 0 0 0 0 - 4 10 1 0 0 0 0 - 8 9 1 0 0 0 0 -M END -> -20021 - -> -21 - -> -20021 - -> -22_CPDBAS_v5c - -> -C5H9NO3S - -> -163.1949 - -> -defined organic - -> -parent - -> -tested chemical - -> -N-acetylcysteine - -> -616-91-1 - -> -single chemical compound - -> -stereochem - -> -N-acetyl-L-cysteine - -> -CC(=O)N[C@@H](CS)C(=O)O - -> -CC(=O)N[C@@H](CS)C(=O)O - -> -InChI=1/C5H9NO3S/c1-3(7)6-4(2-10)5(8)9/h4,10H,2H2,1H3,(H,6,7)(H,8,9)/t4-/m0/s1/f/h6,8H - -> -PWKSKIMOESPYIA-JVBVHTJODB - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -Rat added v2a - -> -http://potency.berkeley.edu/chempages/N-ACETYLCYSTEINE.html - -$$$$ - - - - 24 25 0 0 0 0 0 0 0 0 2 V2000 - 11.5157 -1.9922 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3641 -1.3358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3641 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2126 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2126 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0610 -3.9959 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9094 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9094 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0610 -1.3358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7578 -1.3358 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6063 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6063 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4547 -3.9959 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3031 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3031 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4547 -1.3358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4547 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1516 -3.9959 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.4837 -2.8444 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 1.8195 -5.1475 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -4.6523 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3641 -3.9959 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 10.3641 -5.3203 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5157 -3.3280 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 5 22 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 8 10 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 16 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 14 15 1 0 0 0 0 - 14 18 1 0 0 0 0 - 15 16 2 0 0 0 0 - 16 17 1 0 0 0 0 - 18 19 1 0 0 0 0 - 18 20 1 0 0 0 0 - 18 21 1 0 0 0 0 - 22 23 2 0 0 0 0 - 22 24 1 0 0 0 0 -M CHG 2 22 1 24 -1 -M END -> -20022 - -> -22 - -> -20022 - -> -23_CPDBAS_v5c - -> -C14H7ClF3NO5 - -> -361.6573 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acifluorfen - -> -50594-66-6 - -> -single chemical compound - -> -5-{[2-chloro-4-(trifluoromethyl)phenyl]oxy}-2-nitrobenzoic acid - -> -OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-] - -> -OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-] - -> -InChI=1/C14H7ClF3NO5/c15-10-5-7(14(16,17)18)1-4-12(10)24-8-2-3-11(19(22)23)9(6-8)13(20)21/h1-6H,(H,20,21)/f/h20H - -> -NUFNQYOELLVIPL-UYBDAZJACV - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -141 - -> -0.389871848293951 - -> -33 - -> -TD50 is harmonic mean of more than one positive test - -> -liver; stomach - -> -liver; stomach - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -http://potency.berkeley.edu/chempages/ACIFLUORFEN.html - -$$$$ - - - - 4 3 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3061 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4575 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 2 0 0 0 0 -M END -> -20023 - -> -23 - -> -20023 - -> -24_CPDBAS_v5c - -> -C3H4O - -> -56.0633 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acrolein - -> -107-02-8 - -> -single chemical compound - -> -acrylaldehyde - -> -C=CC=O - -> -C=CC=O - -> -InChI=1/C3H4O/c1-2-3-4/h2-3H,1H2 - -> -HGINCPLSRVDWNT-UHFFFAOYAQ - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -http://potency.berkeley.edu/chempages/ACROLEIN.html - -$$$$ - - - - 9 8 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1520 -2.6588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3040 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3040 -0.6635 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1520 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4560 -2.6588 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6080 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6080 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 7 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 -M END -> -20024 - -> -24 - -> -20024 - -> -25_CPDBAS_v5c - -> -C7H14O2 - -> -130.1864 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acrolein diethylacetal - -> -3054-95-3 - -> -single chemical compound - -> -3,3-bis(ethyloxy)prop-1-ene - -> -C=CC(OCC)OCC - -> -C=CC(OCC)OCC - -> -InChI=1/C7H14O2/c1-4-7(8-5-2)9-6-3/h4,7H,1,5-6H2,2-3H3 - -> -MCIPQLOKVXSHTD-UHFFFAOYAI - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -http://potency.berkeley.edu/chempages/ACROLEIN%20DIETHYLACETAL.html - -$$$$ - - - - 5 4 0 0 0 0 0 0 0 0 1 V2000 - 4.6099 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4575 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3050 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1525 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 2 0 0 0 0 - 4 5 1 0 0 0 0 -M END -> -20025 - -> -25 - -> -20025 - -> -26_CPDBAS_v5c - -> -C3H5NO - -> -71.0786 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acrolein oxime - -> -5314-33-0 - -> -single chemical compound - -> -(1E)-prop-2-enal oxime - -> -C=C/C=N/O - -> -C=C/C=N/O - -> -InChI=1/C3H5NO/c1-2-3-4-5/h2-3,5H,1H2/b4-3+ - -> -KMNIXISXZFPRDC-ONEGZZNKBI - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -http://potency.berkeley.edu/chempages/ACROLEIN%20OXIME.html - -$$$$ - - - - 24 27 0 0 0 0 0 0 0 0 1 V2000 - 6.9100 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7600 -5.6730 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6099 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4598 -5.6730 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3001 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1501 -5.6730 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3001 -3.6821 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4598 -3.0153 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6099 -3.6821 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7600 -3.0153 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7600 -1.6816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6099 -1.0148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4598 -1.6816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.7498 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.4604 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4598 -7.0067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6099 -7.6735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7600 -7.0067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9100 -7.6735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9100 -8.9975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7600 -9.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6099 -8.9975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3001 -7.6735 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 19 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 10 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 17 1 0 0 0 0 - 5 6 1 0 0 0 0 - 5 8 2 0 0 0 0 - 6 7 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 14 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 1 0 0 0 0 - 13 15 1 0 0 0 0 - 13 16 1 0 0 0 0 - 17 18 1 0 0 0 0 - 17 24 2 0 0 0 0 - 18 19 2 0 0 0 0 - 18 23 1 0 0 0 0 - 19 20 1 0 0 0 0 - 20 21 2 0 0 0 0 - 21 22 1 0 0 0 0 - 22 23 2 0 0 0 0 -M END -> -20026 - -> -26 - -> -20026 - -> -27_CPDBAS_v5c - -> -C20H19NO3 - -> -321.3698 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acronycine - -> -7008-42-6 - -> -single chemical compound - -> -3,3,12-trimethyl-6-(methyloxy)-3,12-dihydro-7H-pyrano[2,3-c]acridin-7-one - -> -CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O - -> -CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O - -> -InChI=1/C20H19NO3/c1-20(2)10-9-13-15(24-20)11-16(23-4)17-18(13)21(3)14-8-6-5-7-12(14)19(17)22/h5-11H,1-4H3 - -> -SMPZPKRDRQOOHT-UHFFFAOYAD - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -0.505 - -> -1.57139843258452E-03 - -> -55 - -> -positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test - -> -bone; peritoneal cavity - -> -mammary gland; peritoneal cavity - -> -active - -> -0 - -> -NTP bioassay inadequate - -> -NTP bioassay inadequate - -> -NTP bioassay inadequate - -> -inconclusive - -> -active - -> -active - -> -multisite active; multisex active - -> -TR 49 - -> -http://potency.berkeley.edu/chempages/ACRONYCINE.html - -$$$$ - - - - 5 4 0 0 0 0 0 0 0 0 1 V2000 - 3.4567 -1.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3056 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 2 0 0 0 0 -M END -> -20027 - -> -27 - -> -20027 - -> -28_CPDBAS_v5c - -> -C3H5NO - -> -71.0779 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acrylamide - -> -79-06-1 - -> -single chemical compound - -> -acrylamide - -> -NC(=O)C=C - -> -NC(=O)C=C - -> -InChI=1/C3H5NO/c1-2-3(4)5/h2H,1H2,(H2,4,5)/f/h4H2 - -> -HRPVXLWXLXDGHG-LGEMBHMGCJ - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -inactive - -> -3.75 - -> -0.052759015108775 - -> -39 - -> -TD50 is harmonic mean of more than one positive test - -> -nervous system; peritoneal cavity; thyroid gland - -> -clitoral gland; mammary gland; nervous system; oral cavity; thyroid gland; uterus - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -TD50_Rat modified v3a - -> -http://potency.berkeley.edu/chempages/ACRYLAMIDE.html - -$$$$ - - - - 5 4 0 0 0 0 0 0 0 0 1 V2000 - 3.4567 -1.9945 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3056 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 2 0 0 0 0 -M END -> -20028 - -> -28 - -> -39229 - -> -29_CPDBAS_v5c - -> -C3H4O2 - -> -72.0627 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acrylic acid - -> -79-10-7 - -> -single chemical compound - -> -acrylic acid - -> -OC(=O)C=C - -> -OC(=O)C=C - -> -InChI=1/C3H4O2/c1-2-3(4)5/h2H,1H2,(H,4,5)/f/h4H - -> -NIXOWILDQLNWCW-JLSKMEETCA - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -http://potency.berkeley.edu/chempages/ACRYLIC%20ACID.html - -$$$$ - - - - 4 3 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6652 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9956 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3260 -1.1508 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 3 0 0 0 0 -M END -> -20029 - -> -29 - -> -20029 - -> -30_CPDBAS_v5c - -> -C3H3N - -> -53.0626 - -> -defined organic - -> -parent - -> -tested chemical - -> -Acrylonitrile - -> -107-13-1 - -> -single chemical compound - -> -acrylonitrile - -> -C=CC#N - -> -C=CC#N - -> -InChI=1/C3H3N/c1-2-3-4/h2H,1H2 - -> -NLHHRLWOUZZQLW-UHFFFAOYAG - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -16.9 - -> -0.318491743714028 - -> -31 - -> -TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results - -> -ear Zymbals gland; nervous system; oral cavity; small intestine; stomach - -> -ear Zymbals gland; mammary gland; nasal cavity; nervous system; oral cavity; small intestine; stomach - -> -active - -> -6.32 - -> -0.119104604749861 - -> -39 - -> -TD50 is harmonic mean of more than one positive test - -> -harderian gland; stomach - -> -harderian gland; stomach - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -Mouse added v5a - -> -http://potency.berkeley.edu/chempages/ACRYLONITRILE.html - -$$$$ - - - - 93 99 0 0 1 0 0 0 0 0 1 V2000 - 11.4975 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.4975 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.5218 -12.3337 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.4523 -12.3337 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 10.4523 -14.7168 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 12.5218 -14.7168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.5218 -11.1421 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.5670 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.4279 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.4279 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.5670 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.5218 -15.9083 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.5670 -10.5359 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 11.4975 -10.5359 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 14.5914 -12.3337 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 8.3827 -12.3337 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.3827 -14.7168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.5914 -14.7168 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.3827 -11.1421 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3584 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3584 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.3827 -15.9083 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3584 -10.5359 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 9.4279 -10.5359 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 13.5670 -9.2816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.4800 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.6332 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.4800 -3.8046 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 11.4139 -9.2816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 14.6332 -7.4211 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 15.7411 -9.2607 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 16.7654 -8.6754 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.7654 -7.4838 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 17.8734 -2.9893 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 18.2496 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.8350 -3.7001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 19.4412 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 19.8175 -2.9893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 19.8593 -4.2854 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 18.8350 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.8316 -5.6860 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 19.8802 -5.6860 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 19.8802 -6.8776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 20.9045 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.8350 -7.4838 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.8316 -6.8776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 18.8350 -8.6754 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 19.8802 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.8316 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.8316 -10.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.8350 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.7654 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3584 -9.2816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4454 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2923 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4454 -3.8046 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 9.5116 -9.2816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2923 -7.4211 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1634 -9.2607 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.1391 -8.6754 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.1391 -7.4838 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.0312 -2.9893 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6549 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0695 -3.7001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.4633 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1079 -2.9893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0661 -4.2854 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0695 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.0939 -5.6860 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0243 -5.6860 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0243 -6.8776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0695 -7.4838 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.0939 -6.8776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0695 -8.6754 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0243 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.0939 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.0939 -10.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0695 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.1391 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.6750 -3.8046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.5879 -3.1566 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.6750 -5.0589 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 13.5879 -1.9023 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.4800 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.6750 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.4800 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2505 -3.8046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3375 -3.1566 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2505 -5.0589 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3375 -1.9023 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2505 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4454 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 1 0 0 0 0 - 1 4 2 0 0 0 0 - 2 5 1 0 0 0 0 - 2 6 2 0 0 0 0 - 3 7 1 0 0 0 0 - 3 8 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 10 1 0 0 0 0 - 6 11 1 0 0 0 0 - 6 12 1 0 0 0 0 - 7 13 1 0 0 0 0 - 7 14 2 0 0 0 0 - 8 15 1 0 0 0 0 - 8 11 1 0 0 0 0 - 9 16 2 0 0 0 0 - 9 10 1 0 0 0 0 - 10 17 2 0 0 0 0 - 11 18 2 0 0 0 0 - 25 13 1 6 0 0 0 - 16 19 1 0 0 0 0 - 16 20 1 0 0 0 0 - 17 21 1 0 0 0 0 - 17 22 1 0 0 0 0 - 19 23 1 0 0 0 0 - 19 24 2 0 0 0 0 - 20 21 2 0 0 0 0 - 53 23 1 1 0 0 0 - 25 26 1 0 0 0 0 - 25 27 1 0 0 0 0 - 26 28 1 0 0 0 0 - 26 29 2 0 0 0 0 - 27 30 1 1 0 0 0 - 27 31 1 0 0 0 0 - 82 28 1 6 0 0 0 - 31 32 1 0 0 0 0 - 32 33 2 0 0 0 0 - 32 49 1 0 0 0 0 - 34 35 1 0 0 0 0 - 34 36 1 0 0 0 0 - 34 81 1 0 0 0 0 - 35 37 1 0 0 0 0 - 36 38 1 0 0 0 0 - 36 39 1 6 0 0 0 - 36 40 1 0 0 0 0 - 37 38 1 0 0 0 0 - 40 41 2 0 0 0 0 - 40 42 1 0 0 0 0 - 42 43 1 0 0 0 0 - 42 44 1 0 0 0 0 - 43 45 1 0 0 0 0 - 45 46 2 0 0 0 0 - 45 47 1 0 0 0 0 - 47 48 1 0 0 0 0 - 47 49 1 0 0 0 0 - 49 50 1 1 0 0 0 - 50 51 1 0 0 0 0 - 50 52 1 0 0 0 0 - 53 54 1 0 0 0 0 - 53 55 1 0 0 0 0 - 54 56 1 0 0 0 0 - 54 57 2 0 0 0 0 - 55 58 1 6 0 0 0 - 55 59 1 0 0 0 0 - 89 56 1 1 0 0 0 - 59 60 1 0 0 0 0 - 60 61 2 0 0 0 0 - 60 77 1 0 0 0 0 - 62 63 1 0 0 0 0 - 62 64 1 0 0 0 0 - 62 88 1 0 0 0 0 - 63 65 1 0 0 0 0 - 64 66 1 0 0 0 0 - 64 67 1 1 0 0 0 - 64 68 1 0 0 0 0 - 65 66 1 0 0 0 0 - 68 69 2 0 0 0 0 - 68 70 1 0 0 0 0 - 70 71 1 0 0 0 0 - 70 72 1 0 0 0 0 - 71 73 1 0 0 0 0 - 73 74 2 0 0 0 0 - 73 75 1 0 0 0 0 - 75 76 1 0 0 0 0 - 75 77 1 0 0 0 0 - 77 78 1 6 0 0 0 - 78 79 1 0 0 0 0 - 78 80 1 0 0 0 0 - 81 82 1 0 0 0 0 - 81 83 2 0 0 0 0 - 82 84 1 0 0 0 0 - 84 85 1 0 0 0 0 - 84 86 1 6 0 0 0 - 85 87 1 0 0 0 0 - 88 89 1 0 0 0 0 - 88 90 2 0 0 0 0 - 89 91 1 0 0 0 0 - 91 92 1 0 0 0 0 - 91 93 1 0 0 0 0 -M END -> -20030 - -> -30 - -> -20030 - -> -31_CPDBAS_v5c - -> -C63H88N12O16 - -> -1269.4436 - -> -defined organic - -> -parent - -> -representative component in mixture - -> -Actinomycin C - -> -8052-16-2 - -> -mixture or formulation - -> -mixture of actinomycin C1 [50-76-0] (10%), actinomycin C2 [2612-14-8] (45%), and actinomycin C3 [6156-47-4] (45%), structure shown C2, stereochem - -> -2-amino-4,6-dimethyl-3-oxo-N~9~-[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-N~1~-{(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6-(1-methylethyl) - -> -O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N - -> -O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N - -> -InChI=1/C63H88N12O16/c1-17-31(8)44-61(86)75-25-19-21-38(75)59(84)71(14)27-40(77)73(16)50(30(6)7)63(88)90-35(12)46(57(82)67-44)69-55(80)41-42(64)51(78)33(10)53-48(41)65-47-36(23-22-32(9)52(47)91-53)54(79)68-45-34(11)89-62(87)49(29(4)5)72(15)39(76)26-70(13)58(83)37-20-18-24-74(37)60(85)43(28(2)3)66-56(45)81/h22-23,28-31,34-35,37-38,43-46,49-50H,17-21,24-27,64H2,1-16H3,(H,66,81)(H,67,82)(H,68,79)(H,69,80)/t31-,34+,35+,37-,38-,43+,44+,45-,46-,49-,50-/m0/s1/f/h66-69H - -> -QCXJFISCRQIYID-IFORFJDKDU - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/ACTINOMYCIN%20C.html - -$$$$ - - - - 92 98 0 0 1 0 0 0 0 0 1 V2000 - 11.5534 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5534 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.5827 -10.8602 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.5031 -10.8602 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 10.5031 -13.2549 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 12.5827 -13.2549 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.5827 -9.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.6330 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.4738 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.4738 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.6330 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.5827 -14.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.6330 -9.0537 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5534 -9.0537 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 14.6623 -10.8602 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4235 -10.8602 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4235 -13.2549 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.6623 -13.2549 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4235 -9.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3942 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3942 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4235 -14.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3942 -9.0537 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 9.4738 -9.0537 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 13.6330 -7.7933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.5407 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.7043 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.5407 -2.2897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 11.4694 -7.7933 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 14.7043 -5.9238 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 15.8177 -7.7723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 16.8470 -7.1841 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.8470 -5.9868 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 13.5280 -1.8065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.5280 -0.6092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 15.6706 -2.3947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.9603 -1.4704 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 15.6706 -3.5921 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 18.3384 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.9266 -2.1846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 19.5358 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 19.9139 -1.4704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.4777 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.5573 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 19.9559 -2.7728 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 18.9266 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.9183 -4.1802 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 19.9769 -4.1802 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 19.9769 -5.3776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 21.0062 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.9266 -5.9868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.9183 -5.3776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 18.9266 -7.1841 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 19.9769 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.9183 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 17.9183 -8.9697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 18.9266 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 16.8470 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3942 -7.7933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4865 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.3229 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4865 -2.2897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 9.5578 -7.7933 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.3229 -5.9238 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1885 -7.7723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.1592 -7.1841 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.1592 -5.9868 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4992 -1.8065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4992 -0.6092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3566 -2.3947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.0459 -1.4704 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3566 -3.5921 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6678 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0796 -2.1846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.4704 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1133 -1.4704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.5285 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4489 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0713 -2.7728 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0796 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1089 -4.1802 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0293 -4.1802 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0293 -5.3776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0796 -5.9868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1089 -5.3776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0796 -7.1841 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0293 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1089 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1089 -8.9697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0796 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.1592 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 1 0 0 0 0 - 1 4 2 0 0 0 0 - 2 5 1 0 0 0 0 - 2 6 2 0 0 0 0 - 3 7 1 0 0 0 0 - 3 8 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 10 1 0 0 0 0 - 6 11 1 0 0 0 0 - 6 12 1 0 0 0 0 - 7 13 1 0 0 0 0 - 7 14 2 0 0 0 0 - 8 15 1 0 0 0 0 - 8 11 1 0 0 0 0 - 9 16 2 0 0 0 0 - 9 10 1 0 0 0 0 - 10 17 2 0 0 0 0 - 11 18 2 0 0 0 0 - 25 13 1 6 0 0 0 - 16 19 1 0 0 0 0 - 16 20 1 0 0 0 0 - 17 21 1 0 0 0 0 - 17 22 1 0 0 0 0 - 19 23 1 0 0 0 0 - 19 24 2 0 0 0 0 - 20 21 2 0 0 0 0 - 59 23 1 1 0 0 0 - 25 26 1 0 0 0 0 - 25 27 1 0 0 0 0 - 26 28 1 0 0 0 0 - 26 29 2 0 0 0 0 - 27 30 1 1 0 0 0 - 27 31 1 0 0 0 0 - 28 34 1 0 0 0 0 - 31 32 1 0 0 0 0 - 32 33 2 0 0 0 0 - 32 55 1 0 0 0 0 - 34 35 1 6 0 0 0 - 34 36 1 0 0 0 0 - 35 43 1 0 0 0 0 - 35 44 1 0 0 0 0 - 36 37 1 0 0 0 0 - 36 38 2 0 0 0 0 - 37 39 1 0 0 0 0 - 37 40 1 0 0 0 0 - 39 41 1 0 0 0 0 - 40 42 1 0 0 0 0 - 40 45 1 6 0 0 0 - 40 46 1 0 0 0 0 - 41 42 1 0 0 0 0 - 46 47 2 0 0 0 0 - 46 48 1 0 0 0 0 - 48 49 1 0 0 0 0 - 48 50 1 0 0 0 0 - 49 51 1 0 0 0 0 - 51 52 2 0 0 0 0 - 51 53 1 0 0 0 0 - 53 54 1 0 0 0 0 - 53 55 1 0 0 0 0 - 55 56 1 1 0 0 0 - 56 57 1 0 0 0 0 - 56 58 1 0 0 0 0 - 59 60 1 0 0 0 0 - 59 61 1 0 0 0 0 - 60 62 1 0 0 0 0 - 60 63 2 0 0 0 0 - 61 64 1 6 0 0 0 - 61 65 1 0 0 0 0 - 62 68 1 0 0 0 0 - 65 66 1 0 0 0 0 - 66 67 2 0 0 0 0 - 66 89 1 0 0 0 0 - 68 69 1 1 0 0 0 - 68 70 1 0 0 0 0 - 69 77 1 0 0 0 0 - 69 78 1 0 0 0 0 - 70 71 1 0 0 0 0 - 70 72 2 0 0 0 0 - 71 73 1 0 0 0 0 - 71 74 1 0 0 0 0 - 73 75 1 0 0 0 0 - 74 76 1 0 0 0 0 - 74 79 1 1 0 0 0 - 74 80 1 0 0 0 0 - 75 76 1 0 0 0 0 - 80 81 2 0 0 0 0 - 80 82 1 0 0 0 0 - 82 83 1 0 0 0 0 - 82 84 1 0 0 0 0 - 83 85 1 0 0 0 0 - 85 86 2 0 0 0 0 - 85 87 1 0 0 0 0 - 87 88 1 0 0 0 0 - 87 89 1 0 0 0 0 - 89 90 1 6 0 0 0 - 90 91 1 0 0 0 0 - 90 92 1 0 0 0 0 -M END -> -20031 - -> -31 - -> -20031 - -> -32_CPDBAS_v5c - -> -C62H86N12O16 - -> -1255.417 - -> -defined organic - -> -parent - -> -tested chemical - -> -Actinomycin D - -> -50-76-0 - -> -single chemical compound - -> -stereochem - -> -2-amino-4,6-dimethyl-3-oxo-N,N'-bis[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-3H-phenoxazine-1,9-dicarboxamide - -> -C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C - -> -C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C - -> -InChI=1/C62H86N12O16/c1-27(2)42-59(84)73-23-17-19-36(73)57(82)69(13)25-38(75)71(15)48(29(5)6)61(86)88-33(11)44(55(80)65-42)67-53(78)35-22-21-31(9)51-46(35)64-47-40(41(63)50(77)32(10)52(47)90-51)54(79)68-45-34(12)89-62(87)49(30(7)8)72(16)39(76)26-70(14)58(83)37-20-18-24-74(37)60(85)43(28(3)4)66-56(45)81/h21-22,27-30,33-34,36-37,42-45,48-49H,17-20,23-26,63H2,1-16H3,(H,65,80)(H,66,81)(H,67,78)(H,68,79)/t33-,34-,36+,37+,42-,43-,44+,45+,48+,49+/m1/s1/f/h65-68H - -> -RJURFGZVJUQBHK-HQANWYOLDQ - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -inactive - -> -0.00111 - -> -8.84168367960606E-07 - -> -88 - -> -positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test - -> -peritoneal cavity - -> -peritoneal cavity - -> -active - -> -active - -> -active - -> -multisex active - -> -TD50_Rat_Note modified v5a - -> -http://potency.berkeley.edu/chempages/ACTINOMYCIN%20D.html - -$$$$ - - - - 10 9 0 0 0 0 0 0 0 0 1 V2000 - 8.0713 -1.9936 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9171 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9171 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7629 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6087 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4626 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3084 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1542 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1542 -3.3254 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3318 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 8 10 1 0 0 0 0 -M END -> -20032 - -> -32 - -> -20032 - -> -33_CPDBAS_v5c - -> -C6H12N2O2 - -> -144.1717 - -> -defined organic - -> -parent - -> -tested chemical - -> -Adipamide - -> -628-94-4 - -> -single chemical compound - -> -hexanediamide - -> -NC(=O)CCCCC(=O)N - -> -NC(=O)CCCCC(=O)N - -> -InChI=1/C6H12N2O2/c7-5(9)3-1-2-4-6(8)10/h1-4H2,(H2,7,9)(H2,8,10)/f/h7-8H2 - -> -GVNWZKBFMFUVNX-UNXFWZPKCL - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -http://potency.berkeley.edu/chempages/ADIPAMIDE.html - -$$$$ - - - - 18 19 0 0 0 0 0 0 0 0 2 V2000 - 3.2537 -3.5906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2537 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4062 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4062 -4.2555 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1011 -4.2555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9682 -0.2748 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6649 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1011 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8866 -2.1366 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7006 -3.5817 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.0038 -3.8654 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.5587 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.6687 -2.7129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.7733 -1.7199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.5446 -5.0800 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 6.7644 -6.1527 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 8.8656 -5.2130 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 5 1 0 0 0 0 - 1 4 2 0 0 0 0 - 2 3 2 0 0 0 0 - 2 8 1 0 0 0 0 - 3 13 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 1 0 0 0 0 - 7 9 2 0 0 0 0 - 8 10 2 0 0 0 0 - 9 10 1 0 0 0 0 - 11 12 1 0 0 0 0 - 11 13 1 0 0 0 0 - 12 14 2 0 0 0 0 - 12 16 1 0 0 0 0 - 13 15 2 0 0 0 0 - 14 15 1 0 0 0 0 - 16 17 1 0 0 0 0 - 16 18 2 0 0 0 0 -M CHG 2 16 1 17 -1 -M END -> -20033 - -> -33 - -> -20033 - -> -34_CPDBAS_v5c - -> -C11H8N2O5 - -> -248.1916 - -> -defined organic - -> -parent - -> -tested chemical - -> -AF-2 - -> -3688-53-7 - -> -single chemical compound - -> -stereochem - -> -(2Z)-2-(furan-2-yl)-3-(5-nitrofuran-2-yl)prop-2-enamide - -> -O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1 - -> -O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1 - -> -InChI=1/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14)/b8-6-/f/h12H2 - -> -LYAHJFZLDZDIOH-SDXKRDFODJ - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse; hamster - -> -active - -> -29.4 - -> -0.118456869612026 - -> -35 - -> -TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results - -> -mammary gland - -> -mammary gland - -> -active - -> -131 - -> -0.527818024461747 - -> -31 - -> -TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results - -> -stomach - -> -stomach - -> -active - -> -164 - -> -0.660779816883408 - -> -30 - -> -TD50 is harmonic mean of more than one positive test - -> -esophagus; stomach - -> -stomach - -> -active - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -structure modified v5b - -> -http://potency.berkeley.edu/chempages/AF-2.html - -$$$$ - - - - 25 29 0 0 1 0 0 0 0 0 1 V2000 - 5.7454 -4.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.5929 -3.9863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.5929 -2.6604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4403 -1.9931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2878 -2.6604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2878 -3.9863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4403 -4.6535 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1352 -4.6535 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2999 -1.7678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.0451 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.8458 -0.5546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1630 -0.6933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7454 -1.9931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.8980 -2.6604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.8980 -3.9863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8859 -4.8788 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3399 -6.0921 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.0227 -5.9534 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.4768 -7.1666 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4647 -8.0592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.6172 -7.3919 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6969 -5.8148 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6658 -6.2307 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7454 -0.6673 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.8980 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 15 2 0 0 0 0 - 1 18 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 13 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 12 1 0 0 0 0 - 5 6 1 0 0 0 0 - 5 9 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 2 0 0 0 0 - 9 10 1 6 0 0 0 - 9 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 13 14 2 0 0 0 0 - 13 24 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 1 0 0 0 0 - 17 18 1 0 0 0 0 - 17 21 1 0 0 0 0 - 17 23 1 1 0 0 0 - 18 19 1 0 0 0 0 - 18 22 1 6 0 0 0 - 19 20 2 0 0 0 0 - 20 21 1 0 0 0 0 - 24 25 1 0 0 0 0 -M END -> -20034 - -> -34 - -> -20034 - -> -35_CPDBAS_v5c - -> -C17H14O6 - -> -314.294 - -> -defined organic - -> -parent - -> -tested chemical - -> -Aflatoxicol - -> -29611-03-8 - -> -single chemical compound - -> -stereochem - -> -(1R,6aS,9aS)-1-hydroxy-4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromen-11(1H)-one - -> -O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC - -> -O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC - -> -InChI=1/C17H14O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8-9,17-18H,2-3H2,1H3/t8-,9+,17-/m0/s1 - -> -WYIWLDSPNDMZIT-BTKFHORUBM - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -active - -> -0.00247 - -> -7.85888372033828E-06 - -> -78 - -> -liver - -> -active - -> -active - -> -http://potency.berkeley.edu/chempages/AFLATOXICOL.html - -$$$$ - - - - 23 27 0 0 0 0 0 0 0 0 1 V2000 - 5.4986 -3.3221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3531 -3.9918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1987 -3.3221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0444 -3.9918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0444 -5.3224 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1987 -5.9833 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3531 -5.3224 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1987 -7.3139 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.7843 -5.7277 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.3701 -6.9966 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -4.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.7843 -3.5776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1987 -1.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3531 -1.3306 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.4986 -1.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.7675 -1.5861 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.5430 -2.6612 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.7675 -3.7362 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.5430 -4.8113 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.8119 -4.3971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.8119 -3.0665 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0444 -1.3306 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0444 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 1 15 1 0 0 0 0 - 1 18 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 13 2 0 0 0 0 - 4 5 2 0 0 0 0 - 4 12 1 0 0 0 0 - 5 6 1 0 0 0 0 - 5 9 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 2 0 0 0 0 - 9 10 2 0 0 0 0 - 9 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 13 14 1 0 0 0 0 - 13 22 1 0 0 0 0 - 14 15 2 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 1 0 0 0 0 - 17 18 1 0 0 0 0 - 17 21 1 0 0 0 0 - 18 19 1 0 0 0 0 - 19 20 2 0 0 0 0 - 20 21 1 0 0 0 0 - 22 23 1 0 0 0 0 -M END -> -20035 - -> -35 - -> -20035 - -> -36_CPDBAS_v5c - -> -C17H12O6 - -> -312.2736 - -> -defined organic - -> -parent - -> -tested chemical - -> -Aflatoxin B1 - -> -1162-65-8 - -> -single chemical compound - -> -4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromene-1,11-dione - -> -C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC - -> -C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC - -> -InChI=1/C17H12O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8,17H,2-3H2,1H3 - -> -OQIQSTLJSLGHID-UHFFFAOYAB - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse; rhesus; cynomolgus; tree shrew - -> -active - -> -0.0032 - -> -1.02474240537785E-05 - -> -77 - -> -TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable; greater than ten-fold variation among TD50 values for positive results - -> -kidney; large intestine; liver - -> -large intestine; liver - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0.0082 - -> -gall bladder; liver; vascular system - -> -0.0201 - -> -gall bladder; liver; vascular system - -> -Tree Shrew (TD50=0.0269; Target Sites=liver) - -> -active - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -TD50_Rat_Note modified v5a - -> -http://potency.berkeley.edu/chempages/AFLATOXIN%20B1.html - -$$$$ - - - - 24 28 0 0 0 0 0 0 0 0 1 V2000 - 6.7674 -1.9958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.7674 -3.3293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6244 -1.3335 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4723 -3.3202 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6244 -3.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4723 -2.0048 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3202 -3.9824 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3202 -5.3251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0593 -5.7333 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2791 -4.6537 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6244 -5.3251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9195 -1.3335 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0593 -3.5742 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4814 -5.9873 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0181 -4.2546 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6244 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 9.0716 -2.0048 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.9392 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2610 -2.5038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9195 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9195 -3.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.7947 -6.0054 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 9.0716 -3.3202 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9558 -5.3432 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 1 3 1 0 0 0 0 - 1 12 1 0 0 0 0 - 2 5 1 0 0 0 0 - 2 21 1 0 0 0 0 - 3 6 1 0 0 0 0 - 3 16 2 0 0 0 0 - 4 6 1 0 0 0 0 - 4 7 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 11 1 0 0 0 0 - 7 8 2 0 0 0 0 - 7 13 1 0 0 0 0 - 8 9 1 0 0 0 0 - 8 14 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 13 1 0 0 0 0 - 10 15 1 0 0 0 0 - 11 14 2 0 0 0 0 - 11 22 1 0 0 0 0 - 12 17 1 0 0 0 0 - 12 20 2 0 0 0 0 - 13 19 1 0 0 0 0 - 15 18 1 0 0 0 0 - 17 23 1 0 0 0 0 - 18 19 2 0 0 0 0 - 21 23 1 0 0 0 0 - 22 24 1 0 0 0 0 -M END -> -20036 - -> -36 - -> -20036 - -> -37_CPDBAS_v5c - -> -C17H12O7 - -> -328.273 - -> -defined organic - -> -parent - -> -representative component in mixture - -> -Aflatoxin, crude - -> -1402-68-2 - -> -mixture or formulation - -> -mixture of aflatoxins, structure shown G1 [1165-39-5] - -> -5-(methyloxy)-3,4,7a,10a-tetrahydro-1H,12H-furo[3',2':4,5]furo[2,3-h]pyrano[3,4-c]chromene-1,12-dione - -> -O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1 - -> -O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1 - -> -InChI=1/C17H12O7/c1-20-9-6-10-12(8-3-5-22-17(8)23-10)14-11(9)7-2-4-21-15(18)13(7)16(19)24-14/h3,5-6,8,17H,2,4H2,1H3 - -> -XWIYFDMXXLINPU-UHFFFAOYAD - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -0.00299 - -> -50 - -> -TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active - -> -liver - -> -active - -> -0.343 - -> -50 - -> -hematopoietic system - -> -active - -> -active - -> -active - -> -multisite active; multispecies active - -> -TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture - -> -http://potency.berkeley.edu/chempages/AFLATOXIN,%20CRUDE.html - -$$$$ - - - - 0 0 0 0 0 0 0 0 0 0 1 V2000 -M END -> -20037 - -> -20037 - -> -38_CPDBAS_v5c - -> -no structure - -> -no structure - -> -Agar - -> -9002-18-0 - -> -mixture or formulation - -> -InChI=1// - -> -MOSFIJXAXDLOML-UHFFFAOYAM - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -TR 230 - -> -http://potency.berkeley.edu/chempages/AGAR.html - -$$$$ - - - - 15 15 0 0 0 0 0 0 0 0 1 V2000 - 5.7597 -2.0304 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1706 -2.0304 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7597 -0.7148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6306 -2.7038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4807 -2.0304 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.7038 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3101 -2.7038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6306 -0.0414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2094 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3592 -0.6526 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9096 -2.7245 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4807 -0.7148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1706 -0.7148 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9096 -0.0104 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0802 -0.6837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 3 1 0 0 0 0 - 1 4 2 0 0 0 0 - 1 11 1 0 0 0 0 - 2 7 1 0 0 0 0 - 2 6 2 0 0 0 0 - 2 13 1 0 0 0 0 - 3 8 2 0 0 0 0 - 3 14 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 7 1 0 0 0 0 - 5 12 2 0 0 0 0 - 8 12 1 0 0 0 0 - 9 15 1 0 0 0 0 - 9 10 2 0 0 0 0 - 14 15 1 0 0 0 0 -M END -> -20038 - -> -38 - -> -20038 - -> -39_CPDBAS_v5c - -> -C11H11ClO3 - -> -226.6562 - -> -defined organic - -> -parent - -> -tested chemical - -> -Alclofenac - -> -22131-79-9 - -> -single chemical compound - -> -[3-chloro-4-(prop-2-en-1-yloxy)phenyl]acetic acid - -> -C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl - -> -C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl - -> -InChI=1/C11H11ClO3/c1-2-5-15-10-4-3-8(6-9(10)12)7-11(13)14/h2-4,6H,1,5,7H2,(H,13,14)/f/h13H - -> -ARHWPKZXBHOEEE-NDKGDYFDCL - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -Rat added v2a - -> -http://potency.berkeley.edu/chempages/ALCLOFENAC.html - -$$$$ - - - - 12 11 0 0 0 0 0 0 0 0 1 V2000 - 0.8456 -0.6672 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9938 -1.3343 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1497 -1.9938 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.2978 -1.3343 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.4537 -1.9938 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6019 -1.3343 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6019 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.7578 -1.9938 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.7578 -3.3281 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3343 -2.4825 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.4825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6609 -0.1784 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 10 1 0 0 0 0 - 2 12 1 0 0 0 0 - 3 4 2 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 6 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 10 11 1 0 0 0 0 -M END -> -20039 - -> -39 - -> -39223 - -> -40_CPDBAS_v5c - -> -C7H14N2O2S - -> -190.2633 - -> -defined organic - -> -parent - -> -tested chemical - -> -Aldicarb - -> -116-06-3 - -> -single chemical compound - -> -(1E)-2-methyl-2-(methylthio)propanal O-[(methylamino)carbonyl]oxime - -> -CC(C=NOC(=O)NC)(SC)C - -> -CC(C=NOC(=O)NC)(SC)C - -> -InChI=1/C7H14N2O2S/c1-7(2,12-4)5-9-11-6(10)8-3/h5H,1-4H3,(H,8,10)/b9-5+/f/h8H - -> -QGLZXHRNAYXIBU-RVKZGWQMDN - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -TR 136 - -> -http://potency.berkeley.edu/chempages/ALDICARB.html - -$$$$ - - - - 18 21 0 0 0 0 0 0 0 0 1 V2000 - 4.3850 -2.1587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2104 -2.1095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.1821 -0.9164 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1845 -3.0750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3567 -1.7958 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5400 -3.2473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9188 -2.6568 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.8869 -3.2473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3887 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 5.0615 -0.3260 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6126 -4.2128 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1501 -2.7798 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3653 -3.6962 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.6052 -4.8340 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.7073 -2.0726 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2657 -4.4404 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 4.5449 -5.2337 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.0750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 1 0 0 0 0 - 1 4 1 0 0 0 0 - 1 5 1 0 0 0 0 - 2 6 1 0 0 0 0 - 2 7 1 0 0 0 0 - 3 8 1 0 0 0 0 - 3 9 1 0 0 0 0 - 3 10 1 0 0 0 0 - 4 11 2 0 0 0 0 - 4 12 1 0 0 0 0 - 6 13 1 0 0 0 0 - 6 8 1 0 0 0 0 - 7 14 1 0 0 0 0 - 7 15 1 0 0 0 0 - 8 16 1 0 0 0 0 - 8 11 1 0 0 0 0 - 11 17 1 0 0 0 0 - 13 18 1 0 0 0 0 - 13 14 1 0 0 0 0 - 15 18 2 0 0 0 0 -M END -> -20040 - -> -40 - -> -20040 - -> -41_CPDBAS_v5c - -> -C12H8Cl6 - -> -364.9099 - -> -defined organic - -> -parent - -> -tested chemical - -> -Aldrin - -> -309-00-2 - -> -single chemical compound - -> -stereochem - -> -1,2,3,4,10,10-hexachloro-1,4,4a,5,8,8a-hexahydro-1,4:5,8-dimethanonaphthalene - -> -ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2 - -> -ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2 - -> -InChI=1/C12H8Cl6/c13-8-9(14)11(16)7-5-2-1-4(3-5)6(7)10(8,15)12(11,17)18/h1-2,4-7H,3H2 - -> -QBYJBZPUGVGKQQ-UHFFFAOYAT - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -1.27 - -> -3.48031116722237E-03 - -> -56 - -> -TD50 is harmonic mean of more than one positive test - -> -liver - -> -liver - -> -active - -> -active - -> -TR 21; final call in CPDB differs due to additional data - -> -http://potency.berkeley.edu/chempages/ALDRIN.html - -$$$$ - - - - 23 22 0 0 0 0 0 0 0 0 2 V2000 - 13.2448 -7.3111 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 - 12.6753 -2.6490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.6753 -3.9867 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5230 -1.9867 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5230 -4.6489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3707 -2.6490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3707 -3.9867 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5230 -5.9867 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 12.8475 -5.9867 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 10.1853 -5.9867 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5230 -7.3111 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 6.9138 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7615 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1523 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3046 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6092 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0661 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2184 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3707 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5230 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.6753 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 2 0 0 0 0 - 3 5 2 0 0 0 0 - 4 6 1 0 0 0 0 - 4 22 1 0 0 0 0 - 5 7 1 0 0 0 0 - 5 8 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 2 0 0 0 0 - 8 10 2 0 0 0 0 - 8 11 1 0 0 0 0 - 12 13 1 0 0 0 0 - 12 19 1 0 0 0 0 - 13 18 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 1 0 0 0 0 - 17 18 1 0 0 0 0 - 19 20 1 0 0 0 0 - 20 21 1 0 0 0 0 - 21 22 1 0 0 0 0 - 22 23 1 0 0 0 0 -M CHG 2 1 1 11 -1 -M END -> -20041 - -> -41 - -> -20041 - -> -42_CPDBAS_v5c - -> -C18H29NaO3S - -> -348.4758 - -> -defined organic - -> -salt Na - -> -representative isomer in mixture - -> -Alkylbenzenesulfonate, linear - -> -42615-29-2 - -> -mixture or formulation - -> -mixture of C10-13 alkylbenzenesulfonates average 11.6; with phenyl attachment varying in apprpx equal amounts between C-2,3,4,5 or 6; structure shown C12 attached at C2 - -> -sodium 4-(dodecan-2-yl)benzenesulfonate - -> -O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)([O-])=O.[Na+] - -> -O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)(O)=O - -> -InChI=1/C18H30O3S.Na/c1-3-4-5-6-7-8-9-10-11-16(2)17-12-14-18(15-13-17)22(19,20)21;/h12-16H,3-11H2,1-2H3,(H,19,20,21);/q;+1/p-1/fC18H29O3S.Na/q-1;m - -> -GHRHULTYHYEOQB-MFZBKVKLCJ - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -structure modified v5b - -> -http://potency.berkeley.edu/chempages/ALKYLBENZENESULFONATE,%20LINEAR.html - -$$$$ - - - - 14 13 0 0 0 0 0 0 0 0 2 V2000 - 0.0000 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1547 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3093 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4640 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6186 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7733 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9152 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0699 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2245 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3792 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5338 -1.1547 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 12.2063 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.8740 -2.3093 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.6885 -1.8271 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 11 13 1 0 0 0 0 - 11 14 1 0 0 0 0 -M CHG 2 11 1 14 -1 -M END -> -20042 - -> -42 - -> -20042 - -> -43_CPDBAS_v5c - -> -C12H27NO - -> -201.3489 - -> -defined organic - -> -parent - -> -representative isomer in mixture - -> -Alkyldimethylamine oxides, commercial grade - -> -NOCAS - -> -mixture or formulation - -> -mixture, C10-16 [70592-80-2], C12-18 [68955-55-5], C12-16 [68439-70-3], C14-18 [68390-99-8], structure shown C-12 - -> -decyl(dimethyl)amine oxide - -> -[O-][N+](C)(C)CCCCCCCCCC - -> -[O-][N+](C)(C)CCCCCCCCCC - -> -InChI=1/C12H27NO/c1-4-5-6-7-8-9-10-11-12-13(2,3)14/h4-12H2,1-3H3 - -> -ZRKZFNZPJKEWPC-UHFFFAOYAU - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -http://potency.berkeley.edu/chempages/ALKYLDIMETHYLAMINE%20OXIDES,%20COMMERCIAL%20GRADE.html - -$$$$ - - - - 11 11 0 0 0 0 0 0 0 0 1 V2000 - 4.2744 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2901 -0.8879 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4278 -2.2095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2095 -2.7532 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3216 -1.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9066 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9892 -0.6126 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.5773 -2.8771 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7336 -2.2095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7336 -0.8810 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.8831 -2.8771 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 7 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 11 1 0 0 0 0 -M END -> -20043 - -> -43 - -> -20043 - -> -44_CPDBAS_v5c - -> -C4H6N4O3 - -> -158.1164 - -> -defined organic - -> -parent - -> -tested chemical - -> -Allantoin - -> -97-59-6 - -> -single chemical compound - -> -1-(2,5-dioxoimidazolidin-4-yl)urea - -> -O=C1C(NC(=O)N1)NC(=O)N - -> -O=C1C(NC(=O)N1)NC(=O)N - -> -InChI=1/C4H6N4O3/c5-3(10)6-1-2(9)8-4(11)7-1/h1H,(H3,5,6,10)(H2,7,8,9,11)/f/h6-8H,5H2 - -> -POJWUDADGALRAB-BANUENCFCI - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -http://potency.berkeley.edu/chempages/ALLANTOIN.html - -$$$$ - - - - 4 3 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3061 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4575 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 -M END -> -20044 - -> -44 - -> -20044 - -> -45_CPDBAS_v5c - -> -C3H6O - -> -58.0791 - -> -defined organic - -> -parent - -> -tested chemical - -> -Allyl alcohol - -> -107-18-6 - -> -single chemical compound - -> -prop-2-en-1-ol - -> -C=CCO - -> -C=CCO - -> -InChI=1/C3H6O/c1-2-3-4/h2,4H,1,3H2 - -> -XXROGKLTLUQVRX-UHFFFAOYAC - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -Mutagenicity_SAL_CPDB added v3a - -> -http://potency.berkeley.edu/chempages/ALLYL%20ALCOHOL.html - -$$$$ - - - - 4 3 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3061 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4575 -0.6638 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 -M END -> -20045 - -> -45 - -> -39231 - -> -46_CPDBAS_v5c - -> -C3H5Cl - -> -76.5248 - -> -defined organic - -> -parent - -> -tested chemical - -> -Allyl chloride - -> -107-05-1 - -> -single chemical compound - -> -3-chloroprop-1-ene - -> -C=CCCl - -> -C=CCCl - -> -InChI=1/C3H5Cl/c1-2-3-4/h2H,1,3H2 - -> -OSDWBNJEKMUWAV-UHFFFAOYAQ - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -0 - -> -NTP bioassay inadequate - -> -NTP bioassay inadequate - -> -NTP bioassay inadequate - -> -inconclusive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -TR 73 - -> -http://potency.berkeley.edu/chempages/ALLYL%20CHLORIDE.html - -$$$$ - - - - 8 8 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -1.8149 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1485 -1.1485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3041 -1.8149 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4526 -1.1485 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6082 -1.8149 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7567 -1.1485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4231 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.0895 -1.1485 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 1 0 0 0 0 - 7 8 1 0 0 0 0 -M END -> -20046 - -> -46 - -> -39232 - -> -47_CPDBAS_v5c - -> -C6H10O2 - -> -114.1424 - -> -defined organic - -> -parent - -> -tested chemical - -> -Allyl glycidyl ether - -> -106-92-3 - -> -single chemical compound - -> -2-[(allyloxy)methyl]oxirane - -> -C=CCOCC1CO1 - -> -C=CCOCC1CO1 - -> -InChI=1/C6H10O2/c1-2-3-7-4-6-5-8-6/h2,6H,1,3-5H2 - -> -LSWYGACWGAICNM-UHFFFAOYAR - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -182 - -> -1.59449950237598 - -> -26 - -> -nasal cavity - -> -no positive results - -> -active - -> -active - -> -TR 376 - -> -http://potency.berkeley.edu/chempages/ALLYL%20GLYCIDYL%20ETHER.html - -$$$$ - - - - 6 5 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -0.6684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1525 -1.3311 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3050 -0.6684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4575 -1.3311 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6099 -0.6684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7624 0.0000 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 2 0 0 0 0 -M END -> -20047 - -> -47 - -> -20047 - -> -48_CPDBAS_v5c - -> -C4H5NS - -> -99.1542 - -> -defined organic - -> -parent - -> -tested chemical - -> -Allyl isothiocyanate - -> -57-06-7 - -> -single chemical compound - -> -3-isothiocyanatoprop-1-ene - -> -C=CCN=C=S - -> -C=CCN=C=S - -> -InChI=1/C4H5NS/c1-2-3-5-4-6/h2H,1,3H2 - -> -ZOJBYZNEUISWFT-UHFFFAOYAS - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -96 - -> -0.968188942072045 - -> -26 - -> -urinary bladder - -> -no positive results - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -active - -> -TR 234 - -> -http://potency.berkeley.edu/chempages/ALLYL%20ISOTHIOCYANATE.html - -$$$$ - - - - 10 9 0 0 0 0 0 0 0 0 1 V2000 - 4.6087 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6087 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7629 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9171 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9171 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0713 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4626 -1.9936 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3084 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1542 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 -M END -> -20048 - -> -48 - -> -39233 - -> -49_CPDBAS_v5c - -> -C8H14O2 - -> -142.1956 - -> -defined organic - -> -parent - -> -tested chemical - -> -Allyl isovalerate - -> -2835-39-4 - -> -single chemical compound - -> -allyl 3-methylbutanoate - -> -O=C(CC(C)C)OCC=C - -> -O=C(CC(C)C)OCC=C - -> -InChI=1/C8H14O2/c1-4-5-10-8(9)6-7(2)3/h4,7H,1,5-6H2,2-3H3 - -> -HOMAGVUCNZNWBC-UHFFFAOYAF - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -123 - -> -0.865005668248525 - -> -26 - -> -hematopoietic system - -> -no positive results - -> -active - -> -62.8 - -> -0.441645170455345 - -> -32 - -> -no positive results - -> -hematopoietic system - -> -active - -> -active - -> -active - -> -multisex active; multispecies active - -> -TR 253 - -> -http://potency.berkeley.edu/chempages/ALLYL%20ISOVALERATE.html - -$$$$ - - - - 9 8 0 0 0 0 0 0 0 0 1 V2000 - 4.6080 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4560 -2.6588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3040 -1.9953 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3040 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4560 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1520 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1520 -2.6588 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9953 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6080 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 9 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 7 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 2 0 0 0 0 - 7 8 2 0 0 0 0 -M END -> -20049 - -> -49 - -> -20049 - -> -50_CPDBAS_v5c - -> -C4H7N3O2 - -> -129.1182 - -> -defined organic - -> -parent - -> -tested chemical - -> -1-Allyl-1-nitrosourea - -> -760-56-5 - -> -single chemical compound - -> -1-nitroso-1-prop-2-en-1-ylurea - -> -NC(=O)N(CC=C)N=O - -> -NC(=O)N(CC=C)N=O - -> -InChI=1/C4H7N3O2/c1-2-3-7(6-9)4(5)8/h2H,1,3H2,(H2,5,8)/f/h5H2 - -> -WBBDVRPSJSJSPC-GLFQYTTQCA - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0.341 - -> -2.64099096796579E-03 - -> -52 - -> -TD50 is harmonic mean of more than one positive test - -> -large intestine; lung; stomach - -> -mammary gland; stomach; uterus - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -http://potency.berkeley.edu/chempages/1-ALLYL-1-NITROSOUREA.html - -$$$$ - - - - 7 5 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -0.6636 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1521 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3042 -0.6636 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4563 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6084 -0.6636 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.5945 -1.9954 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2.9263 -1.9954 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 6 7 1 0 0 0 0 -M END -> -20050 - -> -50 - -> -20050 - -> -51_CPDBAS_v5c - -> -C3H9ClN2 - -> -108.5705 - -> -defined organic - -> -complex HCl - -> -tested chemical - -> -Allylhydrazine.HCl - -> -52207-83-7 - -> -single chemical compound - -> -parent [7422-78-8] - -> -prop-2-en-1-ylhydrazine hydrochloride - -> -C=CCNN.HCl - -> -C=CCNN - -> -InChI=1/C3H8N2.ClH/c1-2-3-5-4;/h2,5H,1,3-4H2;1H - -> -PWGPATVPEGLIAN-UHFFFAOYAO - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -34.2 - -> -0.315002694101989 - -> -34 - -> -TD50 is harmonic mean of more than one positive test - -> -lung - -> -lung; vascular system - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -http://potency.berkeley.edu/chempages/ALLYLHYDRAZINE.HCl.html - -$$$$ - - - - 12 8 0 0 0 0 0 0 0 0 2 V2000 - 5.3200 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3200 -1.3300 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3200 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9900 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 6.6500 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1.3300 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3300 -1.3300 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3300 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 2.6600 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 3.3250 -3.9900 0.0000 Al 0 1 0 0 0 0 0 0 0 0 0 0 - 1.9950 -3.9900 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 2 5 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 2 0 0 0 0 - 7 9 1 0 0 0 0 - 7 10 1 0 0 0 0 -M CHG 6 4 -1 5 -1 9 -1 10 -1 11 3 12 1 -M END -> -20051 - -> -51 - -> -39234 - -> -52_CPDBAS_v5c - -> -AlKO8S2 - -> -258.18674 - -> -inorganic - -> -tested chemical - -> -Aluminum potassium sulfate - -> -10043-67-1 - -> -single chemical compound - -> -aluminum potassium sulfate - -> -O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+] - -> -InChI=1/Al.K.2H2O4S/c;;2*1-5(2,3)4/h;;2*(H2,1,2,3,4)/q+3;+1;;/p-4/fAl.K.2O4S/q2m;2*-2 - -> -GRLPQNLYRHEGIJ-MHPHYJPNCZ - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -http://potency.berkeley.edu/chempages/ALUMINUM%20POTASSIUM%20SULFATE.html - -$$$$ - - - - 19 21 0 0 0 0 0 0 0 0 1 V2000 - 3.4588 -5.3212 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4588 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6036 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7566 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9095 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9095 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7566 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6036 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4588 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4588 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3059 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3059 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1529 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1529 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7566 0.0000 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0624 -3.9909 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7566 -5.3212 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 12 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 19 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 18 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 7 17 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 16 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 2 0 0 0 0 -M END -> -20052 - -> -52 - -> -39235 - -> -53_CPDBAS_v5c - -> -C14H7Br2NO2 - -> -381.0189 - -> -defined organic - -> -parent - -> -tested chemical - -> -1-Amino-2,4-dibromoanthraquinone - -> -81-49-2 - -> -single chemical compound - -> -1-amino-2,4-dibromo-9,10-anthraquinone - -> -O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N - -> -O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N - -> -InChI=1/C14H7Br2NO2/c15-8-5-9(16)12(17)11-10(8)13(18)6-3-1-2-4-7(6)14(11)19/h1-5H,17H2 - -> -ZINRVIQBCHAZMM-UHFFFAOYAC - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -46 - -> -0.120728919221592 - -> -35 - -> -TD50 is harmonic mean of more than one positive test - -> -kidney; large intestine; liver; urinary bladder - -> -kidney; large intestine; liver; urinary bladder - -> -active - -> -477 - -> -1.25190640149347 - -> -27 - -> -TD50 is harmonic mean of more than one positive test - -> -liver; lung; stomach - -> -liver; lung; stomach - -> -active - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -TR 383 - -> -http://potency.berkeley.edu/chempages/1-AMINO-2,4-DIBROMOANTHRAQUINONE.html - -$$$$ - - - - 14 14 0 0 0 0 0 0 0 0 1 V2000 - 5.9919 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3210 -1.1555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9919 -2.3110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3210 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9977 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3268 -2.3110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9977 -1.1555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9942 -2.3110 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3326 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9942 -4.6127 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3245 -2.3110 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9861 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.3187 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 12 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 6 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 11 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 1 0 0 0 0 -M END -> -20053 - -> -53 - -> -20053 - -> -54_CPDBAS_v5c - -> -C10H14N2O2 - -> -194.2304 - -> -defined organic - -> -parent - -> -tested chemical - -> -3-Amino-4-ethoxyacetanilide - -> -17026-81-2 - -> -single chemical compound - -> -N-[3-amino-4-(ethyloxy)phenyl]acetamide - -> -NC1=C(C=CC(=C1)NC(=O)C)OCC - -> -NC1=C(C=CC(=C1)NC(=O)C)OCC - -> -InChI=1/C10H14N2O2/c1-3-14-10-5-4-8(6-9(10)11)12-7(2)13/h4-6H,3,11H2,1-2H3,(H,12,13)/f/h12H - -> -XTXFAVHDQCHWCS-XWKXFZRBCV - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -2070 - -> -10.6574460022736 - -> -17 - -> -thyroid gland - -> -no positive results - -> -active - -> -active - -> -TR 112 - -> -http://potency.berkeley.edu/chempages/3-AMINO-4-ETHOXYACETANILIDE.html - -$$$$ - - - - 18 19 0 0 0 0 0 0 0 0 1 V2000 - 3.6099 -7.5422 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1990 -6.2771 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.0854 -5.2860 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.4149 -5.4310 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9548 -4.2143 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.2763 -4.0773 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0579 -5.1490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.5180 -6.3658 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1965 -6.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.9637 -3.3199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.8114 -3.9887 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6591 -3.3199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6591 -1.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.8114 -1.3296 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.9637 -1.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.8114 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.8195 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3296 -3.8195 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 11 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 9 2 0 0 0 0 - 5 6 2 0 0 0 0 - 5 10 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 8 9 1 0 0 0 0 - 10 11 2 0 0 0 0 - 10 15 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 2 0 0 0 0 - 13 14 1 0 0 0 0 - 14 15 2 0 0 0 0 - 14 16 1 0 0 0 0 - 17 18 1 0 0 0 0 -M END -> -20054 - -> -54 - -> -20054 - -> -55_CPDBAS_v5c - -> -C14H15ClN2 - -> -246.7353 - -> -defined organic - -> -complex HCl - -> -tested chemical - -> -3-Amino-9-ethylcarbazole.HCl - -> -6109-97-3 - -> -single chemical compound - -> -parent [132-32-1] - -> -9-ethyl-9H-carbazol-3-amine hydrochloride - -> -CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl - -> -CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N) - -> -InChI=1/C14H14N2.ClH/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16;/h3-9H,2,15H2,1H3;1H - -> -UUYSTZWIFZYHRM-UHFFFAOYAB - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -57.2 - -> -0.231827387487725 - -> -32 - -> -TD50 is harmonic mean of more than one positive test - -> -ear Zymbals gland; liver; skin - -> -ear Zymbals gland; liver; uterus - -> -active - -> -38.6 - -> -0.156442957290667 - -> -37 - -> -TD50 is harmonic mean of more than one positive test - -> -liver - -> -liver - -> -active - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -TR 93 - -> -http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE.HCl.html - -$$$$ - - - - 16 18 0 0 0 0 0 0 0 0 1 V2000 - 2.8854 -1.7137 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0066 -2.7097 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.1011 -2.2629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6584 -3.8595 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9547 -3.5738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0066 -5.0166 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.0312 -4.3575 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3168 -1.7137 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6738 -2.7097 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6738 -5.0166 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2469 -3.8155 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.8595 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.3934 -2.4973 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3235 -4.5991 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6145 -0.4174 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3475 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 1 0 0 0 0 - 1 15 1 0 0 0 0 - 2 4 2 0 0 0 0 - 2 9 1 0 0 0 0 - 3 5 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 5 7 1 0 0 0 0 - 6 10 2 0 0 0 0 - 7 11 2 0 0 0 0 - 8 13 2 0 0 0 0 - 9 12 2 0 0 0 0 - 10 12 1 0 0 0 0 - 11 13 1 0 0 0 0 - 11 14 1 0 0 0 0 - 15 16 1 0 0 0 0 -M END -> -20055 - -> -55 - -> -20055 - -> -56_CPDBAS_v5c - -> -C14H15N2 - -> -210.2744 - -> -defined organic - -> -parent - -> -representative component in mixture - -> -3-Amino-9-ethylcarbazole mixture - -> -NOCAS - -> -mixture or formulation - -> -mixture, structure shown 3-Amino-9-ethylcarbazole [132-32-1] - -> -9-ethyl-9H-carbazol-3-amine - -> -CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N) - -> -CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N) - -> -InChI=1/C14H14N2/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16/h3-9H,2,15H2,1H3 - -> -OXEUETBFKVCRNP-UHFFFAOYAV - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -26.4 - -> -50 - -> -TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active - -> -ear Zymbals gland; liver; skin - -> -ear Zymbals gland - -> -active - -> -38 - -> -50 - -> -TD50 is harmonic mean of more than one positive test - -> -liver - -> -liver - -> -active - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture - -> -TR 93 - -> -http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE%20MIXTURE.html - -$$$$ - - - - 20 21 0 0 0 0 0 0 0 0 1 V2000 - 14.3944 -3.3539 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 13.1277 -2.9365 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.8542 -1.6410 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 12.1345 -3.8289 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 10.8822 -3.4259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.8026 -4.2032 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 8.7230 -3.4259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4563 -3.8289 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4775 -2.9365 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 5.2108 -3.3539 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.2176 -2.4615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.9509 -2.8789 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9720 -1.9864 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6621 -2.2599 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1084 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8925 -0.1152 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1016 -0.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2531 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 9.1405 -2.1592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.4648 -2.1592 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 20 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 19 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 13 17 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 2 0 0 0 0 - 17 18 1 0 0 0 0 - 19 20 1 0 0 0 0 -M END -> -20056 - -> -56 - -> -39236 - -> -57_CPDBAS_v5c - -> -C9H14N8S3 - -> -330.4561 - -> -defined organic - -> -parent - -> -tested chemical - -> -3-Amino-4-[2-[(2-guanidinothiazol-4-yl)methylthio], ethylamino]-1,2,5-thiadiazole - -> -78441-84-6 - -> -single chemical compound - -> -BL-6341 - -> -1-{4-[({2-[(4-amino-1,2,5-thiadiazol-3-yl)amino]ethyl}sulfanyl)methyl]-1,3-thiazol-2-yl}guanidine - -> -N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1 - -> -N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1 - -> -InChI=1/C9H14N8S3/c10-6-7(17-20-16-6)13-1-2-18-3-5-4-19-9(14-5)15-8(11)12/h4H,1-3H2,(H2,10,16)(H,13,17)(H4,11,12,14,15)/f/h11,13,15H,10,12H2 - -> -MOMKQYRYLQUFMV-GVMYFUFNCD - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -4990 - -> -15.1003416187506 - -> -14 - -> -TD50 is harmonic mean of more than one positive test - -> -stomach - -> -stomach - -> -active - -> -active - -> -active - -> -multisex active - -> -Rat added v2a; CPDB lists HCl complex in some instances in tables but referenced study for this chemical does not specify HCl complex - parent is assumed correct - -> -http://potency.berkeley.edu/chempages/3-AMINO-4-[2-[(2-GUANIDINOTHIAZOL-4-YL)METHYLTHIO].html - -$$$$ - - - - 18 20 0 0 0 0 0 0 0 0 1 V2000 - 4.6526 -4.6047 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9902 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6526 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9853 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6477 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9853 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6526 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9902 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6575 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9951 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9951 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6575 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9951 -4.6047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6624 -4.6047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6624 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9804 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6477 -3.4555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 12 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 18 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 17 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 16 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 2 0 0 0 0 -M END -> -20057 - -> -57 - -> -20057 - -> -58_CPDBAS_v5c - -> -C15H11NO2 - -> -237.2533 - -> -defined organic - -> -parent - -> -tested chemical - -> -1-Amino-2-methylanthraquinone - -> -82-28-0 - -> -single chemical compound - -> -C.I. 60700 - -> -1-amino-2-methylanthracene-9,10-dione - -> -O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N - -> -O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N - -> -InChI=1/C15H11NO2/c1-8-6-7-11-12(13(8)16)15(18)10-5-3-2-4-9(10)14(11)17/h2-7H,16H2,1H3 - -> -ZLCUIOWQYBYEBG-UHFFFAOYAP - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -59.2 - -> -0.249522345948402 - -> -32 - -> -TD50 is harmonic mean of more than one positive test - -> -kidney; liver - -> -liver - -> -active - -> -174 - -> -0.733393381672668 - -> -30 - -> -no positive results - -> -liver - -> -active - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -TR 111 - -> -http://potency.berkeley.edu/chempages/1-AMINO-2-METHYLANTHRAQUINONE.html - -$$$$ - - - - 14 15 0 0 0 0 0 0 0 0 2 V2000 - 2.3652 -3.2915 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1511 -2.7519 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2950 -1.4299 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5900 -1.1511 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2555 -2.3022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.5865 -2.4461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.4768 -1.4569 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6908 -1.9965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.5469 -3.3184 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.2430 -3.5972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8419 -1.3310 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 7.8419 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.9931 -1.9965 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.4174 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 5 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 14 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 10 2 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 8 11 1 0 0 0 0 - 9 10 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 13 1 0 0 0 0 -M CHG 2 11 1 13 -1 -M END -> -20058 - -> -58 - -> -20058 - -> -59_CPDBAS_v5c - -> -C6H4N4O4 - -> -196.122 - -> -defined organic - -> -parent - -> -tested chemical - -> -2-Amino-5-(5-nitro-2-furyl)-1,3,4-oxadiazole - -> -3775-55-1 - -> -single chemical compound - -> -5-(5-nitrofuran-2-yl)-1,3,4-oxadiazol-2-amine - -> -O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N - -> -O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N - -> -InChI=1/C6H4N4O4/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2 - -> -VTWQUFUBSCXPOW-IAUQMDSZCD - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -3.67 - -> -1.87128420065062E-02 - -> -44 - -> -kidney; lung; mammary gland; stomach - -> -active - -> -active - -> -active - -> -multisite active - -> -http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-OXADIAZOLE.html - -$$$$ - - - - 14 15 0 0 0 0 0 0 0 0 2 V2000 - 8.4233 -3.5294 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.5389 -2.5523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2248 -2.6870 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6857 -1.4825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3970 -1.2045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4957 -2.1985 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2743 -1.4320 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0698 -1.9626 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1877 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 0.9266 -3.2767 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5523 -0.1348 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.8579 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6713 -0.5981 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8168 -1.2551 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 14 2 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 13 2 0 0 0 0 - 5 6 1 0 0 0 0 - 5 12 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 11 2 0 0 0 0 - 8 9 1 0 0 0 0 - 8 10 2 0 0 0 0 - 11 12 1 0 0 0 0 - 13 14 1 0 0 0 0 -M CHG 2 8 1 9 -1 -M END -> -20059 - -> -59 - -> -20059 - -> -60_CPDBAS_v5c - -> -C6H4N4O3S - -> -212.1826 - -> -defined organic - -> -parent - -> -tested chemical - -> -2-Amino-5-(5-nitro-2-furyl)-1,3,4-thiadiazole - -> -712-68-5 - -> -single chemical compound - -> -5-(5-nitrofuran-2-yl)-1,3,4-thiadiazol-2-amine - -> -NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1 - -> -NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1 - -> -InChI=1/C6H4N4O3S/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2 - -> -SXZZHGJWUBJKHH-IAUQMDSZCG - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0.662 - -> -3.11995422810353E-03 - -> -52 - -> -kidney; lung; mammary gland; stomach - -> -active - -> -active - -> -active - -> -multisite active - -> -http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-THIADIAZOLE.html - -$$$$ - - - - 14 15 0 0 0 0 0 0 0 0 2 V2000 - 5.7002 -2.7618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4855 -1.6853 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.7473 -2.1001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.7473 -3.4236 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4855 -3.8383 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.8238 -1.3147 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3678 -2.7618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5825 -3.8383 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3207 -3.4236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3207 -2.1001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5825 -1.6853 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2442 -1.3147 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.7912 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1.4471 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 5 2 0 0 0 0 - 1 7 1 0 0 0 0 - 2 3 2 0 0 0 0 - 3 4 1 0 0 0 0 - 3 6 1 0 0 0 0 - 4 5 1 0 0 0 0 - 7 8 2 0 0 0 0 - 7 11 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 10 11 1 0 0 0 0 - 10 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 12 14 2 0 0 0 0 -M CHG 2 12 1 13 -1 -M END -> -20060 - -> -60 - -> -39237 - -> -61_CPDBAS_v5c - -> -C7H5N3O3S - -> -211.1948 - -> -defined organic - -> -parent - -> -tested chemical - -> -2-Amino-4-(5-nitro-2-furyl)thiazole - -> -38514-71-5 - -> -single chemical compound - -> -4-(5-nitrofuran-2-yl)-1,3-thiazol-2-amine - -> -NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1 - -> -NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1 - -> -InChI=1/C7H5N3O3S/c8-7-9-4(3-14-7)5-1-2-6(13-5)10(11)12/h1-3H,(H2,8,9)/f/h8H2 - -> -ZAVLMIGIVYJYMU-FSHFIPFOCT - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -5.85 - -> -2.76995456327523E-02 - -> -42 - -> -stomach; urinary bladder - -> -active - -> -7.87 - -> -3.72641750649164E-02 - -> -44 - -> -stomach - -> -active - -> -active - -> -active - -> -multisite active; multispecies active - -> -http://potency.berkeley.edu/chempages/2-AMINO-4-(5-NITRO-2-FURYL)THIAZOLE.html - -$$$$ - - - - 16 17 0 0 0 0 0 0 0 0 2 V2000 - 0.0000 -7.5449 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.4042 -6.3035 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7130 -6.3035 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1172 -7.5449 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0586 -8.3148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0586 -9.6236 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.4829 -5.2449 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.8109 -5.2545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.8310 -3.9649 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.7637 -2.6561 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9859 -2.1846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.8135 -3.2047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1014 -4.3017 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.3227 -0.9239 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 7.5930 -0.5870 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3988 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 5 1 0 0 0 0 - 2 3 2 0 0 0 0 - 3 4 1 0 0 0 0 - 3 7 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 7 8 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 1 0 0 0 0 - 9 13 2 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 14 1 0 0 0 0 - 12 13 1 0 0 0 0 - 14 15 2 0 0 0 0 - 14 16 1 0 0 0 0 -M CHG 2 14 1 16 -1 -M END -> -20061 - -> -61 - -> -20061 - -> -62_CPDBAS_v5c - -> -C8H6N4O4 - -> -222.1598 - -> -defined organic - -> -parent - -> -tested chemical - -> -trans-5-Amino-3[2-(5-nitro-2-furyl)vinyl]-1,2,4-oxadiazole - -> -28754-68-9 - -> -single chemical compound - -> -stereochem - -> -3-[(E)-2-(5-nitrofuran-2-yl)ethenyl]-1,2,4-oxadiazol-5-amine - -> -NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1 - -> -NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1 - -> -InChI=1/C8H6N4O4/c9-8-10-6(11-16-8)3-1-5-2-4-7(15-5)12(13)14/h1-4H,(H2,9,10,11)/b3-1+/f/h9H2 - -> -RMZNNIOKNRDECR-OYGOROAMDP - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -112 - -> -0.504141613379198 - -> -32 - -> -TD50 is harmonic mean of more than one positive test - -> -hematopoietic system; stomach - -> -hematopoietic system; stomach - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -http://potency.berkeley.edu/chempages/trans-5-AMINO-3[2-(5-NITRO-2-FURYL)VINYL]-1,2,4-OX.html - -$$$$ - - - - 11 11 0 0 0 0 0 0 0 0 2 V2000 - 0.0000 -3.4525 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6642 -2.3037 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 1.9925 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6567 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9910 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6552 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9910 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6567 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9835 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6552 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1488 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 11 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 10 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 9 1 0 0 0 0 - 7 8 2 0 0 0 0 -M CHG 2 2 1 11 -1 -M END -> -20062 - -> -62 - -> -20062 - -> -63_CPDBAS_v5c - -> -C6H6N2O3 - -> -154.1234 - -> -defined organic - -> -parent - -> -tested chemical - -> -2-Amino-4-nitrophenol - -> -99-57-0 - -> -single chemical compound - -> -2-amino-4-nitrophenol - -> -O=[N+](C1=CC(=C(C=C1)O)N)[O-] - -> -O=[N+](C1=CC(=C(C=C1)O)N)[O-] - -> -InChI=1/C6H6N2O3/c7-5-3-4(8(10)11)1-2-6(5)9/h1-3,9H,7H2 - -> -VLZVIIYRNMWPSN-UHFFFAOYAN - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -839 - -> -5.44368992638366 - -> -18 - -> -kidney - -> -no positive results - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -active - -> -TR 339 - -> -http://potency.berkeley.edu/chempages/2-AMINO-4-NITROPHENOL.html - -$$$$ - - - - 11 11 0 0 0 0 0 0 0 0 2 V2000 - 0.0000 -3.4525 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6642 -2.3037 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 1.9925 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6567 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9910 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6552 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9910 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6567 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9835 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6552 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1488 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 11 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 10 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 9 1 0 0 0 0 - 7 8 2 0 0 0 0 -M CHG 2 2 1 11 -1 -M END -> -20063 - -> -63 - -> -20063 - -> -64_CPDBAS_v5c - -> -C6H6N2O3 - -> -154.1234 - -> -defined organic - -> -parent - -> -tested chemical - -> -2-Amino-5-nitrophenol - -> -121-88-0 - -> -single chemical compound - -> -2-amino-5-nitrophenol - -> -O=[N+](C1=CC(=C(C=C1)N)O)[O-] - -> -O=[N+](C1=CC(=C(C=C1)N)O)[O-] - -> -InChI=1/C6H6N2O3/c7-5-2-1-4(8(10)11)3-6(5)9/h1-3,9H,7H2 - -> -DOPJTDJKZNWLRB-UHFFFAOYAU - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -111 - -> -0.720202123752785 - -> -27 - -> -pancreas - -> -no positive results - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -active - -> -TR 334 - -> -http://potency.berkeley.edu/chempages/2-AMINO-5-NITROPHENOL.html - -$$$$ - - - - 11 11 0 0 0 0 0 0 0 0 2 V2000 - 1.9968 -4.6079 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6577 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9968 -2.3039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6577 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9889 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6544 -2.3039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9889 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6544 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6656 -2.3039 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.4583 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1543 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 9 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 5 8 1 0 0 0 0 - 6 7 2 0 0 0 0 - 9 10 2 0 0 0 0 - 9 11 1 0 0 0 0 -M CHG 2 9 1 11 -1 -M END -> -20064 - -> -64 - -> -20064 - -> -65_CPDBAS_v5c - -> -C6H6N2O3 - -> -154.1234 - -> -defined organic - -> -parent - -> -tested chemical - -> -4-Amino-2-nitrophenol - -> -119-34-6 - -> -single chemical compound - -> -4-amino-2-nitrophenol - -> -OC1=C(C=C(C=C1)N)[N+](=O)[O-] - -> -OC1=C(C=C(C=C1)N)[N+](=O)[O-] - -> -InChI=1/C6H6N2O3/c7-4-1-2-6(9)5(3-4)8(10)11/h1-3,9H,7H2 - -> -WHODQVWERNSQEO-UHFFFAOYAM - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -309 - -> -2.00488699314965 - -> -23 - -> -urinary bladder - -> -no positive results - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -active - -> -TR 94 - -> -http://potency.berkeley.edu/chempages/4-AMINO-2-NITROPHENOL.html - -$$$$ - - - - 15 16 0 0 0 0 0 0 0 0 2 V2000 - 3.1238 -1.1475 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3406 -2.2222 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0747 -1.8124 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0747 -0.4827 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3406 -0.0729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.5956 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4535 -1.1475 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1184 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4480 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.1129 -1.1475 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4480 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1184 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4426 -1.1475 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 9.1074 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 9.1074 -2.3042 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 5 2 0 0 0 0 - 1 7 1 0 0 0 0 - 2 3 2 0 0 0 0 - 3 4 1 0 0 0 0 - 3 6 1 0 0 0 0 - 4 5 1 0 0 0 0 - 7 8 2 0 0 0 0 - 7 12 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 10 11 1 0 0 0 0 - 10 13 1 0 0 0 0 - 11 12 2 0 0 0 0 - 13 14 1 0 0 0 0 - 13 15 2 0 0 0 0 -M CHG 2 13 1 14 -1 -M END -> -20065 - -> -65 - -> -39238 - -> -66_CPDBAS_v5c - -> -C9H7N3O2S - -> -221.2332 - -> -defined organic - -> -parent - -> -tested chemical - -> -2-Amino-4-(p-nitrophenyl)thiazole - -> -2104-09-8 - -> -single chemical compound - -> -4-(4-nitrophenyl)-1,3-thiazol-2-amine - -> -NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1 - -> -NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1 - -> -InChI=1/C9H7N3O2S/c10-9-11-8(5-15-9)6-1-3-7(4-2-6)12(13)14/h1-5H,(H2,10,11)/f/h10H2 - -> -RIKJWJIWXCUKQV-GIMVELNWCN - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -9.95 - -> -4.49751664759177E-02 - -> -43 - -> -hematopoietic system - -> -active - -> -active - -> -http://potency.berkeley.edu/chempages/2-AMINO-4-(p-NITROPHENYL)THIAZOLE.html - -$$$$ - - - - 9 9 0 0 0 0 0 0 0 0 2 V2000 - 5.1188 -0.2969 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4533 -1.4486 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 3.1225 -1.4486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3393 -2.5236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0749 -2.1141 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0749 -0.7832 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3393 -0.3737 0.0000 S 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 - 5.1188 -2.6003 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 9 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 7 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 1 0 0 0 0 -M CHG 2 2 1 9 -1 -M END -> -20066 - -> -66 - -> -20066 - -> -67_CPDBAS_v5c - -> -C3H3N3O2S - -> -145.1398 - -> -defined organic - -> -parent - -> -tested chemical - -> -2-Amino-5-nitrothiazole - -> -121-66-4 - -> -single chemical compound - -> -5-nitro-1,3-thiazol-2-amine - -> -O=[N+](C1=CN=C(S1)N)[O-] - -> -O=[N+](C1=CN=C(S1)N)[O-] - -> -InChI=1/C3H3N3O2S/c4-3-5-1-2(9-3)6(7)8/h1H,(H2,4,5)/f/h4H2 - -> -MIHADVKEHAFNPG-LGEMBHMGCP - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -44.6 - -> -0.307289937012453 - -> -31 - -> -no positive results; NTP assigned level of evidence positive - -> -kidney; lung; mammary gland - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -active - -> -active - -> -multisite active - -> -TargetSites_Rat_Male modified v3a - -> -TR 53; final call in CPDB differs due to additional data; NTP-assigned level of evidence of carcinogenicity is "positive" in male rat; noting that "these experiments were particularly difficult to evaluate". - -> -http://potency.berkeley.edu/chempages/2-AMINO-5-NITROTHIAZOLE.html - -$$$$ - - - - 16 16 0 0 0 0 0 0 0 0 1 V2000 - 3.1225 -2.3401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3401 -3.4212 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0740 -3.0087 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.7911 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0740 -1.6786 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3401 -1.2661 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.7526 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4526 -2.3401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1212 -1.1878 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4513 -1.1878 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.1128 -2.3401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4513 -3.4924 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1212 -3.4924 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5493 -5.2563 0.0000 Mg 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6944 -5.9178 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3970 -5.9178 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 1 0 0 0 0 - 1 8 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 1 0 0 0 0 - 8 13 2 0 0 0 0 - 9 10 2 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 12 13 1 0 0 0 0 - 14 15 1 0 0 0 0 - 14 16 1 0 0 0 0 -M END -> -20067 - -> -67 - -> -20067 - -> -68_CPDBAS_v5c - -> -C9H10MgN2O4 - -> -234.494 - -> -defined organic - -> -complex Mg(OH)2 - -> -tested chemical - -> -2-Amino-5-phenyl-2-oxazolin-4-one + Mg(OH)2 - -> -18968-99-5 - -> -single chemical compound - -> -parent [2152-34-3] - -> -2-amino-5-phenyl-1,3-oxazol-4(5H)-one - dihydroxymagnesium (1:1) - -> -NC1=NC(C(C2=CC=CC=C2)O1)=O.O[Mg]O - -> -NC1=NC(C(C2=CC=CC=C2)O1)=O - -> -InChI=1/C9H8N2O2.Mg.2H2O/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;;;/h1-5,7H,(H2,10,11,12);;2*1H2/q;+2;;/p-2/fC9H8N2O2.Mg.2HO/h10H2;;2*1h/q;m;2*-1/rC9H8N2O2.H2MgO2/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;2-1-3/h1-5,7H,(H2,10,11,12);2-3H/f/h10H2; - -> -JOPOQPCBCUIPFX-VWMXNRJTCY - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/2-AMINO-5-PHENYL-2-OXAZOLIN-4-ONE%20+%20Mg(OH)2.html - -$$$$ - - - - 17 19 0 0 0 0 0 0 0 0 1 V2000 - 3.3283 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9907 -1.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3283 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9954 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3329 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9954 -4.6053 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3283 -4.6053 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9907 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3236 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9861 -4.6053 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9861 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3236 -1.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9861 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3190 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9814 -1.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3190 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.4560 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 12 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 17 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 16 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 2 0 0 0 0 -M END -> -20068 - -> -68 - -> -20068 - -> -69_CPDBAS_v5c - -> -C14H9NO2 - -> -223.2268 - -> -defined organic - -> -parent - -> -tested chemical - -> -2-Aminoanthraquinone - -> -117-79-3 - -> -single chemical compound - -> -2-amino-9,10-anthraquinone - -> -O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N - -> -O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N - -> -InChI=1/C14H9NO2/c15-8-5-6-11-12(7-8)14(17)10-4-2-1-3-9(10)13(11)16/h1-7H,15H2 - -> -XOGPDSATLSAZEK-UHFFFAOYAH - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -101 - -> -0.452454633583423 - -> -29 - -> -liver - -> -no positive results - -> -active - -> -1190 - -> -5.33090112835914 - -> -20 - -> -TD50 is harmonic mean of more than one positive test - -> -liver - -> -hematopoietic system; liver - -> -active - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -TR 144 - -> -http://potency.berkeley.edu/chempages/2-AMINOANTHRAQUINONE.html - -$$$$ - - - - 17 18 0 0 0 0 0 0 0 0 1 V2000 - 2.6631 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9948 -1.1570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6631 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9948 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6683 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6683 -1.1570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9896 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6579 -3.4610 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9844 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6527 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9793 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6475 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9793 -4.6080 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6527 -4.6080 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9741 -3.4610 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6475 -1.1570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 2 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 10 15 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 2 0 0 0 0 - 12 17 1 0 0 0 0 - 13 14 1 0 0 0 0 - 13 16 1 0 0 0 0 - 14 15 2 0 0 0 0 -M END -> -20069 - -> -69 - -> -20069 - -> -70_CPDBAS_v5c - -> -C14H15N3 - -> -225.289 - -> -defined organic - -> -parent - -> -tested chemical - -> -o-Aminoazotoluene - -> -97-56-3 - -> -single chemical compound - -> -2-methyl-4-[(E)-(2-methylphenyl)diazenyl]aniline - -> -CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C - -> -CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C - -> -InChI=1/C14H15N3/c1-10-5-3-4-6-14(10)17-16-12-7-8-13(15)11(2)9-12/h3-9H,15H2,1-2H3/b17-16+ - -> -PFRYFZZSECNQOL-WUKNDPDIBU - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -4.04 - -> -1.79325222270062E-02 - -> -44 - -> -TD50 is harmonic mean of more than one positive test - -> -liver - -> -liver - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -active - -> -active - -> -multisex active - -> -http://potency.berkeley.edu/chempages/o-AMINOAZOTOLUENE.html - -$$$$ - - - - 9 8 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1544 -0.6620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1544 -1.9939 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3088 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4632 -0.6620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6095 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7639 -0.6620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9183 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0727 -0.6620 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 -M END -> -20070 - -> -70 - -> -20070 - -> -71_CPDBAS_v5c - -> -C6H13NO2 - -> -131.1742 - -> -defined organic - -> -parent - -> -tested chemical - -> -6-Aminocaproic acid - -> -60-32-2 - -> -single chemical compound - -> -6-aminohexanoic acid - -> -OC(=O)CCCCCN - -> -OC(=O)CCCCCN - -> -InChI=1/C6H13NO2/c7-5-3-1-2-4-6(8)9/h1-5,7H2,(H,8,9)/f/h8H - -> -SLXKOJJOQWFEFD-FZOZFQFYCD - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/6-AMINOCAPROIC%20ACID.html - -$$$$ - - - - 13 14 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -1.1562 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3316 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9935 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3251 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9869 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3251 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9935 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3186 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9804 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3120 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9739 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3120 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9804 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 5 8 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 2 0 0 0 0 - 8 13 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 2 0 0 0 0 -M END -> -20071 - -> -71 - -> -20071 - -> -72_CPDBAS_v5c - -> -C12H11N - -> -169.2224 - -> -defined organic - -> -parent - -> -tested chemical - -> -4-Aminodiphenyl - -> -92-67-1 - -> -single chemical compound - -> -biphenyl-4-amine - -> -NC1=CC=C(C=C1)C2=CC=CC=C2 - -> -NC1=CC=C(C=C1)C2=CC=CC=C2 - -> -InChI=1/C12H11N/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10/h1-9H,13H2 - -> -DMVOXQPQNTYEKQ-UHFFFAOYAX - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -active - -> -2.1 - -> -1.24097046253924E-02 - -> -50 - -> -TD50 is harmonic mean of more than one positive test - -> -liver; urinary bladder - -> -liver; urinary bladder - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.html - -$$$$ - - - - 15 15 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -1.1502 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3339 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9969 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3308 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9937 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3308 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9969 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3276 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9906 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3245 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9875 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3245 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9906 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3308 -3.6343 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6567 -3.6343 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 5 8 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 2 0 0 0 0 - 8 13 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 2 0 0 0 0 - 14 15 1 0 0 0 0 -M END -> -20072 - -> -72 - -> -20072 - -> -73_CPDBAS_v5c - -> -C12H12ClN - -> -205.6865 - -> -defined organic - -> -complex HCl - -> -tested chemical - -> -4-Aminodiphenyl.HCl - -> -2113-61-3 - -> -single chemical compound - -> -parent [92-67-1] - -> -biphenyl-4-amine hydrochloride - -> -NC1(=CC=C(C=C1)C2=CC=CC=C2).[H]Cl - -> -NC1(=CC=C(C=C1)C2=CC=CC=C2) - -> -InChI=1/C12H11N.ClH/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10;/h1-9H,13H2;1H - -> -GUHXYHYUBFCYGJ-UHFFFAOYAT - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -active - -> -0.98 - -> -4.76453243163747E-03 - -> -50 - -> -mammary gland - -> -active - -> -active - -> -http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.HCl.html - -$$$$ - - - - 14 16 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -2.8880 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0775 -2.1037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2943 -2.6461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3645 -1.8618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6692 -2.1404 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3363 -0.9896 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6630 -0.9896 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3301 -2.1404 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6630 -3.2912 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3363 -3.2912 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4420 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2326 -0.5424 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0158 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.9382 -0.7770 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 14 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 12 2 0 0 0 0 - 5 6 2 0 0 0 0 - 5 10 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 11 1 0 0 0 0 - 7 8 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 -M END -> -20073 - -> -73 - -> -39239 - -> -74_CPDBAS_v5c - -> -C12H9NO - -> -183.2092 - -> -defined organic - -> -parent - -> -tested chemical - -> -2-Aminodiphenylene oxide - -> -3693-22-9 - -> -single chemical compound - -> -dibenzo[b,d]furan-2-amine - -> -NC3=CC1=C(C=C3)OC2=C1C=CC=C2 - -> -NC3=CC1=C(C=C3)OC2=C1C=CC=C2 - -> -InChI=1/C12H9NO/c13-8-5-6-12-10(7-8)9-3-1-2-4-11(9)14-12/h1-7H,13H2 - -> -FFYZMBQLAYDJIG-UHFFFAOYAK - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -4.24 - -> -0.023142942603319 - -> -47 - -> -TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable - -> -liver; urinary bladder - -> -liver - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -http://potency.berkeley.edu/chempages/2-AMINODIPHENYLENE%20OXIDE.html - -$$$$ - - - - 12 12 0 0 0 0 0 0 0 0 1 V2000 - 4.0663 -4.2139 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.6134 -2.9635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3039 -2.7322 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.7568 -1.4818 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.0663 -1.2504 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.9228 -2.2694 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.5241 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3039 -4.0613 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1519 -4.7259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -4.0613 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.7322 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1519 -2.0676 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 8 1 0 0 0 0 - 3 12 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 7 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 -M END -> -20074 - -> -74 - -> -20074 - -> -75_CPDBAS_v5c - -> -C9H17NO2 - -> -171.2388 - -> -defined organic - -> -parent - -> -tested chemical - -> -1-(Aminomethyl)cyclohexaneacetic acid - -> -60142-96-3 - -> -single chemical compound - -> -[1-(aminomethyl)cyclohexyl]acetic acid - -> -NCC1(CC(=O)O)CCCCC1 - -> -NCC1(CC(=O)O)CCCCC1 - -> -InChI=1/C9H17NO2/c10-7-9(6-8(11)12)4-2-1-3-5-9/h1-7,10H2,(H,11,12)/f/h11H - -> -UGJMXCAKCUNAIE-WXRBYKJCCG - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -5850 - -> -34.1628182397914 - -> -10 - -> -pancreas - -> -no positive results - -> -active - -> -active - -> -Rat added v3a - -> -http://potency.berkeley.edu/chempages/1-(AMINOMETHYL)CYCLOHEXANEACETIC%20ACID.html - -$$$$ - - - - 19 18 0 0 0 0 0 0 0 0 1 V2000 - 1.3251 -5.7158 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3129 -4.5673 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9543 -2.2881 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.2829 -3.4365 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.2829 -1.1396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9666 -3.4365 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9666 -1.1396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3129 -2.2881 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9543 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3129 -6.8554 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9666 -5.7158 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9877 -4.5673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9666 -8.0039 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -5.7158 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4827 -6.6964 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1133 -5.3448 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4827 -5.3448 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 8.8343 -5.3448 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4827 -3.9754 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 12 1 0 0 0 0 - 1 14 1 0 0 0 0 - 2 6 1 0 0 0 0 - 2 11 1 0 0 0 0 - 2 12 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 5 2 0 0 0 0 - 4 6 2 0 0 0 0 - 5 7 1 0 0 0 0 - 5 9 1 0 0 0 0 - 6 8 1 0 0 0 0 - 7 8 2 0 0 0 0 - 10 11 1 0 0 0 0 - 10 13 1 0 0 0 0 - 15 17 1 0 0 0 0 - 16 17 1 0 0 0 0 - 17 18 2 0 0 0 0 - 17 19 2 0 0 0 0 -M END -> -20075 - -> -75 - -> -20075 - -> -76_CPDBAS_v5c - -> -C10H18N2O6S - -> -294.3247 - -> -defined organic - -> -complex H2SO4 - -> -tested chemical - -> -2,2'-[(4-Aminophenyl)imino]bisethanol sulfate - -> -54381-16-7 - -> -single chemical compound - -> -parent [7575-35-1] - -> -2,2'-[(4-aminophenyl)imino]diethanol sulfate (salt) - -> -OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1 - -> -OCCN(CCO)c1ccc(N)cc1 - -> -InChI=1/C10H16N2O2.H2O4S/c11-9-1-3-10(4-2-9)12(5-7-13)6-8-14;1-5(2,3)4/h1-4,13-14H,5-8,11H2;(H2,1,2,3,4)/f/h;1-2H - -> -KMCFMEHSEWDYKG-ATDHBCBACR - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -Rat added v2a - -> -http://potency.berkeley.edu/chempages/2,2'-[(4-AMINOPHENYL)IMINO]BISETHANOL%20SULFATE.html - -$$$$ - - - - 6 6 0 0 0 0 0 0 0 0 1 V2000 - 1.3304 -1.0738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1104 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3767 -0.4086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3767 -1.7390 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1104 -2.1509 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.0738 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 5 2 0 0 0 0 - 1 6 1 0 0 0 0 - 2 3 2 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 -M END -> -20076 - -> -76 - -> -20076 - -> -77_CPDBAS_v5c - -> -C2H4N4 - -> -84.08 - -> -defined organic - -> -parent - -> -tested chemical - -> -3-Aminotriazole - -> -61-82-5 - -> -single chemical compound - -> -tautomers - -> -1H-1,2,4-triazol-3-amine - -> -C1(N=CNN=1)N - -> -C1(N=CNN=1)N - -> -InChI=1/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6)/f/h5H,3H2 - -> -KLSJWNVTNUYHDU-YPUDGCQOCD - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse; hamster - -> -inactive - -> -9.94 - -> -0.118220742150333 - -> -35 - -> -TD50 is harmonic mean of more than one positive test - -> -thyroid gland - -> -pituitary gland; thyroid gland - -> -active - -> -25.3 - -> -0.300903901046622 - -> -34 - -> -TD50 is harmonic mean of more than one positive test - -> -liver - -> -liver - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -http://potency.berkeley.edu/chempages/3-AMINOTRIAZOLE.html - -$$$$ - - - - 14 13 0 0 0 0 0 0 0 0 1 V2000 - 1.1352 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2703 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4055 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.5680 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7032 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.8383 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9735 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.1086 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.2712 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.4063 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.5415 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1352 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.0241 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 13.6766 -2.0241 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 13 1 0 0 0 0 - 1 12 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 14 1 0 0 0 0 -M END -> -20077 - -> -77 - -> -20077 - -> -78_CPDBAS_v5c - -> -C11H23NO2 - -> -201.3058 - -> -defined organic - -> -parent - -> -tested chemical - -> -11-Aminoundecanoic acid - -> -2432-99-7 - -> -single chemical compound - -> -11-aminoundecanoic acid - -> -OC(=O)CCCCCCCCCCN - -> -OC(=O)CCCCCCCCCCN - -> -InChI=1/C11H23NO2/c12-10-8-6-4-2-1-3-5-7-9-11(13)14/h1-10,12H2,(H,13,14)/f/h13H - -> -GUOSQNAUYHMCRU-NDKGDYFDCZ - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -1100 - -> -5.46432343231044 - -> -18 - -> -liver; urinary bladder - -> -no positive results - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -active - -> -active - -> -multisite active - -> -TR 216 - -> -http://potency.berkeley.edu/chempages/11-AMINOUNDECANOIC%20ACID.html - -$$$$ - - - - 6 4 0 0 0 0 0 0 0 0 2 V2000 - 2.6600 -2.6600 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6600 -1.3320 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 1.3280 -1.3320 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6600 0.0000 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9880 -1.3320 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3320 0.0000 Cl 0 5 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 2 5 1 0 0 0 0 -M CHG 2 2 1 6 -1 -M END -> -20078 - -> -78 - -> -20078 - -> -79_CPDBAS_v5c - -> -H4ClN - -> -53.4915 - -> -inorganic - -> -tested chemical - -> -Ammonium chloride - -> -12125-02-9 - -> -single chemical compound - -> -ammonium chloride - -> -[H][N+]([H])([H])[H].[Cl-] - -> -InChI=1/ClH.H3N/h1H;1H3/fCl.H4N/h1h;1H/q-1;+1 - -> -NLXLAEXVIDQMFP-DWOZJLMICO - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/AMMONIUM%20CHLORIDE.html - -$$$$ - - - - 15 12 0 0 0 0 0 0 0 0 2 V2000 - 2.3011 -1.9952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3011 -3.3253 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1505 -3.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.3253 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1.1505 -5.3204 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.6312 -1.9952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.2963 -3.1457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.6312 -4.2963 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6264 -3.1457 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3011 -0.6651 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4583 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1.1505 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.9710 -1.9952 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.7932 -6.6506 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 1.4631 -6.6506 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 1 0 0 0 0 - 1 10 1 0 0 0 0 - 1 13 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 5 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 9 2 0 0 0 0 - 10 11 1 0 0 0 0 - 10 12 2 0 0 0 0 -M CHG 4 4 -1 11 -1 14 1 15 1 -M END -> -20079 - -> -79 - -> -20079 - -> -80_CPDBAS_v5c - -> -C6H14N2O7 - -> -226.1858 - -> -defined organic - -> -complex 2NH4 - -> -tested chemical - -> -Ammonium citrate - -> -3012-65-5 - -> -single chemical compound - -> -parent [77-92-9] - -> -diammonium 2-(carboxymethyl)-2-hydroxybutanedioate - -> -C(CC([O-])=O)(CC(O)=O)(C([O-])=O)O.[N+].[N+] - -> -C(CC(O)=O)(CC(O)=O)(C(O)=O)O - -> -InChI=1/C6H8O7.2H3N/c7-3(8)1-6(13,5(11)12)2-4(9)10;;/h13H,1-2H2,(H,7,8)(H,9,10)(H,11,12);2*1H3/fC6H6O7.2H4N/h7H;2*1H/q-2;2*+1 - -> -YXVFQADLFFNVDS-JYGIMERMCP - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/AMMONIUM%20CITRATE.html - -$$$$ - - - - 2 0 0 0 0 0 0 0 0 0 2 V2000 - 10.0000 0.0000 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.3600 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 -M CHG 2 1 1 2 -1 -M END -> -20080 - -> -80 - -> -20080 - -> -81_CPDBAS_v5c - -> -H5NO - -> -35.0458 - -> -inorganic - -> -tested chemical - -> -Ammonium hydroxide - -> -1336-21-6 - -> -single chemical compound - -> -ammonium hydroxide - -> -[N+].[O-] - -> -InChI=1/H3N.H2O/h1H3;1H2/fH4N.HO/h1H;1h/q+1;-1 - -> -VHUUQVKOLVNVRT-QBBVKLOVCT - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -http://potency.berkeley.edu/chempages/AMMONIUM%20HYDROXIDE.html - -$$$$ - - - - 16 16 0 0 0 0 0 0 0 0 1 V2000 - 3.1752 -3.9923 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3269 -3.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3269 -2.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.4787 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.4787 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6305 -2.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6305 -3.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.7823 -3.9923 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.4787 -3.9923 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.0195 -2.2257 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1635 -1.2140 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8560 -1.4397 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.3969 -2.6927 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.4202 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.8756 -0.7471 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5604 -0.5214 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 9 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 10 1 0 0 0 0 - 3 15 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 7 9 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 12 14 1 0 0 0 0 - 15 16 1 0 0 0 0 -M END -> -20081 - -> -81 - -> -20081 - -> -82_CPDBAS_v5c - -> -C11H18N2O3 - -> -226.2748 - -> -defined organic - -> -parent - -> -tested chemical - -> -Amobarbital - -> -57-43-2 - -> -single chemical compound - -> -5-ethyl-5-(3-methylbutyl)pyrimidine-2,4,6(1H,3H,5H)-trione - -> -N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O - -> -N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O - -> -InChI=1/C11H18N2O3/c1-4-11(6-5-7(2)3)8(14)12-10(16)13-9(11)15/h7H,4-6H2,1-3H3,(H2,12,13,14,15,16)/f/h12-13H - -> -VIROVYVQCGLCII-BAINRFMOCW - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/AMOBARBITAL.html - -$$$$ - - - - 25 24 0 0 0 0 0 0 0 0 1 V2000 - 1.3247 -4.6461 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3247 -3.3214 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.3214 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6591 -3.3214 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3247 -1.9967 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1331 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9837 -1.9967 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9837 -0.6623 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1331 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2922 -0.6623 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2922 -1.9967 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4415 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.5908 -1.9967 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.5908 -0.6623 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 9.7402 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1331 -6.6428 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9837 -5.9805 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9837 -4.6461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1331 -3.9837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2922 -4.6461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2922 -5.9805 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4415 -6.6428 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.5908 -5.9805 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.5908 -4.6461 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 9.7402 -6.6428 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 2 5 2 0 0 0 0 - 6 7 2 0 0 0 0 - 6 11 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 1 0 0 0 0 - 13 15 1 0 0 0 0 - 16 17 2 0 0 0 0 - 16 21 1 0 0 0 0 - 17 18 1 0 0 0 0 - 18 19 2 0 0 0 0 - 19 20 1 0 0 0 0 - 20 21 2 0 0 0 0 - 21 22 1 0 0 0 0 - 22 23 1 0 0 0 0 - 23 24 1 0 0 0 0 - 23 25 1 0 0 0 0 -M END -> -20082 - -> -82 - -> -20082 - -> -83_CPDBAS_v5c - -> -C18H28N2O4S - -> -368.4909 - -> -defined organic - -> -complex bis H2SO4 - -> -tested chemical - -> -dl-Amphetamine sulfate - -> -60-13-9 - -> -single chemical compound - -> -racemic mixture of L- [51-62-7] and D- [51-63-8], parent [300-62-9], structure shown without stereochem - -> -1-phenylpropan-2-amine sulfate (2:1) - -> -O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C - -> -C1=CC=CC=C1CC(N)C - -> -InChI=1/2C9H13N.H2O4S/c2*1-8(10)7-9-5-3-2-4-6-9;1-5(2,3)4/h2*2-6,8H,7,10H2,1H3;(H2,1,2,3,4)/f/h;;1-2H - -> -PYHRZPFZZDCOPH-IPLSSONACD - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -TR 387 - -> -http://potency.berkeley.edu/chempages/dl-AMPHETAMINE%20SULFATE.html - -$$$$ - - - - 29 28 0 0 1 0 0 0 0 0 1 V2000 - 7.0899 -2.6689 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4012 -3.9801 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4012 -2.6689 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.0899 -3.9801 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.6776 -4.3979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.4667 -3.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.6776 -2.2627 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4244 -1.3228 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 7.0783 -1.3228 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7439 -2.6573 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 11.6038 -2.6573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.6038 -4.0033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.0837 -5.6743 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.3834 -5.9528 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 9.1902 -6.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1384 -4.9432 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2976 -0.6498 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2976 -1.9843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1372 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1372 -2.6573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6498 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4463 -2.6573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4463 -3.9801 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6067 -1.9843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6067 -0.6498 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0232 -7.1248 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9727 -7.0783 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.7132 -7.1712 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 3 1 0 0 0 0 - 1 4 1 0 0 0 0 - 1 9 1 6 0 0 0 - 1 10 1 1 0 0 0 - 2 4 1 0 0 0 0 - 2 5 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 7 1 0 0 0 0 - 3 8 1 6 0 0 0 - 4 16 2 0 0 0 0 - 5 6 1 0 0 0 0 - 5 13 1 6 0 0 0 - 6 7 1 0 0 0 0 - 6 11 1 0 0 0 0 - 6 12 1 0 0 0 0 - 10 25 1 0 0 0 0 - 13 14 2 0 0 0 0 - 13 15 1 0 0 0 0 - 17 18 1 0 0 0 0 - 17 19 2 0 0 0 0 - 18 20 2 0 0 0 0 - 18 23 1 0 0 0 0 - 19 21 1 0 0 0 0 - 20 22 1 0 0 0 0 - 21 22 2 0 0 0 0 - 23 24 1 6 0 0 0 - 23 25 1 0 0 0 0 - 25 26 2 0 0 0 0 -M END -> -20083 - -> -83 - -> -20083 - -> -84_CPDBAS_v5c - -> -C16H25N3O7S - -> -403.4506 - -> -defined organic - -> -complex 3H2O - -> -tested chemical - -> -Ampicillin trihydrate - -> -7177-48-2 - -> -single chemical compound - -> -stereochem; parent [69-53-4] - -> -(2S,5R,6R)-6-{[(2R)-2-amino-2-phenylacetyl]amino}-3,3-dimethyl-7-oxo-4-thia-1-azabicyclo[3.2.0]heptane-2-carboxylic acid trihydrate - -> -[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O - -> -[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O - -> -InChI=1/C16H19N3O4S.3H2O/c1-16(2)11(15(22)23)19-13(21)10(14(19)24-16)18-12(20)9(17)8-6-4-3-5-7-8;;;/h3-7,9-11,14H,17H2,1-2H3,(H,18,20)(H,22,23);3*1H2/t9-,10-,11+,14-;;;/m1.../s1/f/h18,22H;;; - -> -RXDALBZNGVATNY-FQLIROBNDT - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -structure modified v5b - -> -TR 318 - -> -http://potency.berkeley.edu/chempages/AMPICILLIN%20TRIHYDRATE.html - -$$$$ - - - - 11 10 0 0 0 0 0 0 0 0 1 V2000 - 1.1536 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3071 -0.6696 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3071 -2.0006 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4607 -2.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6062 -2.0006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7598 -2.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9133 -2.0006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0669 -2.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1536 -2.6621 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.0006 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4607 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 11 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 9 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 9 10 2 0 0 0 0 -M END -> -20084 - -> -84 - -> -20084 - -> -85_CPDBAS_v5c - -> -C6H13N3O2 - -> -159.1876 - -> -defined organic - -> -parent - -> -tested chemical - -> -1-Amyl-1-nitrosourea - -> -10589-74-9 - -> -single chemical compound - -> -1-nitroso-1-pentylurea - -> -O=C(N(CCCCC)N=O)N - -> -O=C(N(CCCCC)N=O)N - -> -InChI=1/C6H13N3O2/c1-2-3-4-5-9(8-11)6(7)10/h2-5H2,1H3,(H2,7,10)/f/h7H2 - -> -YYTNAQDGJQPZFU-IAUQMDSZCI - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0.555 - -> -3.48645246237772E-03 - -> -51 - -> -TD50 is harmonic mean of more than one positive test - -> -hematopoietic system; lung; stomach - -> -hematopoietic system; lung; mammary gland; stomach; uterus - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -TD50_Rat modified v5a - -> -http://potency.berkeley.edu/chempages/1-AMYL-1-NITROSOUREA.html - -$$$$ - - - - 0 0 0 0 0 0 0 0 0 0 1 V2000 -M END -> -20085 - -> -20085 - -> -86_CPDBAS_v5c - -> -no structure - -> -no structure - -> -Amylopectin sulfate - -> -9047-13-6 - -> -macromolecule - -> -non-linear polymer of glucose (Merck - amylopectic) - -> -InChI=1// - -> -MOSFIJXAXDLOML-UHFFFAOYAM - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -283 - -> -50 - -> -TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active - -> -large intestine - -> -active - -> -active - -> -TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture - -> -http://potency.berkeley.edu/chempages/AMYLOPECTIN%20SULFATE.html - -$$$$ - - - - 11 11 0 0 0 0 0 0 0 0 1 V2000 - 0.6773 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1753 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6640 -2.3241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9921 -2.3241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6561 -1.1753 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9842 -1.1753 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6482 -2.3241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9842 -3.4729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6561 -3.4729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9763 -2.3241 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6403 -3.4729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 7 10 1 0 0 0 0 - 8 9 2 0 0 0 0 - 10 11 1 0 0 0 0 -M END -> -20086 - -> -86 - -> -20086 - -> -87_CPDBAS_v5c - -> -C10H12O - -> -148.2017 - -> -defined organic - -> -parent - -> -representative isomer in mixture - -> -Anethole - -> -104-46-1 - -> -mixture or formulation - -> -mixture of Z [25679-28-1], E [4180-23-8] isomers, structure shown Z, stereochem - -> -1-(methyloxy)-4-[(1Z)-prop-1-en-1-yl]benzene - -> -CC=CC1=CC=C(C=C1)OC - -> -CC=CC1=CC=C(C=C1)OC - -> -InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3- - -> -RUVINXPYWBROJD-ARJAWSKDBC - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/ANETHOLE.html - -$$$$ - - - - 11 11 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3316 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9934 -1.1561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3249 -1.1561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9867 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3183 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9801 -1.1561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3183 -2.3043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9867 -2.3043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3116 -1.1561 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9734 -2.3043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 7 10 1 0 0 0 0 - 8 9 2 0 0 0 0 - 10 11 1 0 0 0 0 -M END -> -20087 - -> -87 - -> -20087 - -> -88_CPDBAS_v5c - -> -C10H12O - -> -148.2017 - -> -defined organic - -> -parent - -> -tested chemical - -> -trans-Anethole - -> -4180-23-8 - -> -single chemical compound - -> -stereochem - -> -1-(methyloxy)-4-[(1E)-prop-1-en-1-yl]benzene - -> -C/C=C/C1=CC=C(C=C1)OC - -> -C/C=C/C1=CC=C(C=C1)OC - -> -InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3+ - -> -RUVINXPYWBROJD-ONEGZZNKBR - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -http://potency.berkeley.edu/chempages/trans-ANETHOLE.html - -$$$$ - - - - 17 18 0 0 1 0 0 0 0 0 1 V2000 - 3.5180 -1.6894 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.5813 -0.9143 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9254 -2.9615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6745 -1.6894 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.2571 -2.9615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9962 -1.6894 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.3403 -3.7465 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1403 -4.0347 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2559 -1.2820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2522 -2.1863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9776 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.7689 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3937 -2.9615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6658 -3.3788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9378 -3.7962 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 9.0732 -2.1068 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 8.2484 -4.6310 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 1 0 0 0 - 1 3 1 0 0 0 0 - 1 9 1 0 0 0 0 - 2 4 1 0 0 0 0 - 3 5 1 0 0 0 0 - 3 8 1 1 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 6 0 0 0 - 5 7 1 6 0 0 0 - 6 13 1 0 0 0 0 - 7 13 1 0 0 0 0 - 9 10 1 0 0 0 0 - 9 11 1 1 0 0 0 - 10 12 1 0 0 0 0 - 13 14 1 6 0 0 0 - 14 15 1 0 0 0 0 - 14 16 1 0 0 0 0 - 14 17 1 0 0 0 0 -M END -> -20088 - -> -88 - -> -20088 - -> -89_CPDBAS_v5c - -> -C8H11Cl3O6 - -> -309.52834 - -> -defined organic - -> -parent - -> -tested chemical - -> -Anhydroglucochloral - -> -15879-93-3 - -> -single chemical compound - -> -Chlorlose-alpha, stereochem - -> -1,2-O-[(1R)-2,2,2-trichloroethylidene]-alpha-D-glucofuranose - -> -O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2 - -> -O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2 - -> -InChI=1/C8H11Cl3O6/c9-8(10,11)7-16-5-3(14)4(2(13)1-12)15-6(5)17-7/h2-7,12-14H,1H2/t2-,3+,4-,5-,6-,7-/m1/s1 - -> -OJYGBLRPYBAHRT-IPQSZEQABF - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -structure modified v5b - -> -http://potency.berkeley.edu/chempages/ANHYDROGLUCOCHLORAL.html - -$$$$ - - - - 16 17 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -3.9909 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1529 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1529 -1.9995 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3058 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4587 -1.9995 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4587 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3058 -3.9909 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6036 -3.9909 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7565 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7565 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9094 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0623 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0623 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9094 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9094 -5.3211 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3058 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 16 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 6 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 14 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 14 15 1 0 0 0 0 -M END -> -20089 - -> -89 - -> -20089 - -> -90_CPDBAS_v5c - -> -C9H5Cl3N4 - -> -275.5218 - -> -defined organic - -> -parent - -> -tested chemical - -> -Anilazine - -> -101-05-3 - -> -single chemical compound - -> -4,6-dichloro-N-(2-chlorophenyl)-1,3,5-triazin-2-amine - -> -ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl - -> -ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl - -> -InChI=1/C9H5Cl3N4/c10-5-3-1-2-4-6(5)13-9-15-7(11)14-8(12)16-9/h1-4H,(H,13,14,15,16)/f/h13H - -> -IMHBYKMAHXWHRP-NDKGDYFDCD - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -TR 104 - -> -http://potency.berkeley.edu/chempages/ANILAZINE.html - -$$$$ - - - - 7 7 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -1.1496 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3292 -1.1496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9958 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3250 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9916 -1.1496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3250 -2.3032 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9958 -2.3032 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 -M END -> -20090 - -> -90 - -> -20090 - -> -91_CPDBAS_v5c - -> -C6H7N - -> -93.1265 - -> -defined organic - -> -parent - -> -tested chemical - -> -Aniline - -> -62-53-3 - -> -single chemical compound - -> -aniline - -> -NC1=CC=CC=C1 - -> -NC1=CC=CC=C1 - -> -InChI=1/C6H7N/c7-6-4-2-1-3-5-6/h1-5H,7H2 - -> -PAYRUJLWNCNPSJ-UHFFFAOYAP - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/ANILINE.html - -$$$$ - - - - 9 8 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -1.1525 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3279 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9939 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3219 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9878 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3219 -2.3050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9939 -2.3050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3279 -3.6329 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6599 -3.6329 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 1 0 0 0 0 -M END -> -20091 - -> -91 - -> -20091 - -> -92_CPDBAS_v5c - -> -C6H8ClN - -> -129.5874 - -> -defined organic - -> -complex HCl - -> -tested chemical - -> -Aniline.HCl - -> -142-04-1 - -> -single chemical compound - -> -parent [62-53-3] - -> -aniline hydrochloride - -> -NC1=CC=CC=C1[H]Cl - -> -NC1=CC=CC=C1 - -> -InChI=1/C6H7N.ClH/c7-6-4-2-1-3-5-6;/h1-5H,7H2;1H - -> -MMCPOSDMTGQNKG-UHFFFAOYAJ - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -269 - -> -2.07581909969642 - -> -22 - -> -TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results - -> -peritoneal cavity; spleen; vascular system - -> -peritoneal cavity - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -active - -> -active - -> -multisite active; multisex active - -> -TR 130 - -> -http://potency.berkeley.edu/chempages/ANILINE.HCl.html - -$$$$ - - - - 11 10 0 0 0 0 0 0 0 0 1 V2000 - 1.9960 -2.3024 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6614 -1.1536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9921 -1.1536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6574 -2.3024 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9921 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6614 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9960 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6653 -2.3024 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.5988 -4.7867 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2.9247 -4.7867 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 1 6 1 0 0 0 0 - 1 8 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 2 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 8 9 1 0 0 0 0 - 10 11 1 0 0 0 0 -M END -> -20092 - -> -92 - -> -20092 - -> -93_CPDBAS_v5c - -> -C7H10ClNO - -> -159.6134 - -> -defined organic - -> -complex HCl - -> -tested chemical - -> -o-Anisidine.HCl - -> -134-29-2 - -> -single chemical compound - -> -parent [90-04-0] - -> -2-methoxyaniline hydrochloride - -> -C1(=C(C=CC=C1)N)OC.[H]Cl - -> -C1(=C(C=CC=C1)N)OC - -> -InChI=1/C7H9NO.ClH/c1-9-7-5-3-2-4-6(7)8;/h2-5H,8H2,1H3;1H - -> -XCZCWGVXRBJCCD-UHFFFAOYAX - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -29.7 - -> -0.186074602758916 - -> -33 - -> -TD50 is harmonic mean of more than one positive test - -> -kidney; thyroid gland; urinary bladder - -> -urinary bladder - -> -active - -> -966 - -> -6.0521234432698 - -> -19 - -> -TD50 is harmonic mean of more than one positive test - -> -urinary bladder - -> -urinary bladder - -> -active - -> -active - -> -active - -> -multisite active; multisex active; multispecies active - -> -TR 89 - -> -http://potency.berkeley.edu/chempages/o-ANISIDINE.HCl.html - -$$$$ - - - - 11 10 0 0 0 0 0 0 0 0 1 V2000 - 1.9927 -1.1489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9913 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6555 -1.1489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9839 -1.1489 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9913 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6569 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6642 -1.1489 0.0000 O 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 - 2.3936 -3.6322 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 3.7220 -3.6322 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 1 7 1 0 0 0 0 - 1 8 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 2 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 1 0 0 0 0 - 10 11 1 0 0 0 0 -M END -> -20093 - -> -93 - -> -20093 - -> -94_CPDBAS_v5c - -> -C7H10ClNO - -> -159.6134 - -> -defined organic - -> -complex HCl - -> -tested chemical - -> -p-Anisidine.HCl - -> -20265-97-8 - -> -single chemical compound - -> -parent [104-94-9] - -> -4-(methyloxy)aniline hydrochloride - -> -C1(=CC=C(N)C=C1)OC.[H]Cl - -> -C1(=CC=C(N)C=C1)OC - -> -InChI=1/C7H9NO.ClH/c1-9-7-4-2-6(8)3-5-7;/h2-5H,8H2,1H3;1H - -> -VQYJLACQFYZHCO-UHFFFAOYAH - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -TR 116 - -> -http://potency.berkeley.edu/chempages/p-ANISIDINE.HCl.html - -$$$$ - - - - 10 10 0 0 0 0 0 0 0 0 1 V2000 - 2.6582 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9971 -1.1499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6582 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9971 -3.4542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6657 -3.4542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6657 -1.1499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9896 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6553 -1.1499 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6553 -3.4542 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 2 0 0 0 0 - 8 10 1 0 0 0 0 -M END -> -20094 - -> -94 - -> -20094 - -> -95_CPDBAS_v5c - -> -C7H7NO2 - -> -137.136 - -> -defined organic - -> -parent - -> -tested chemical - -> -Anthranilic acid - -> -118-92-3 - -> -single chemical compound - -> -2-aminobenzoic acid - -> -NC1=C(C=CC=C1)C(=O)O - -> -NC1=C(C=CC=C1)C(=O)O - -> -InChI=1/C7H7NO2/c8-6-4-2-1-3-5(6)7(9)10/h1-4H,8H2,(H,9,10)/f/h9H - -> -RWZYAGGXGHYGMB-BGGKNDAXCO - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive; multispecies inactive - -> -TR 36 - -> -http://potency.berkeley.edu/chempages/ANTHRANILIC%20ACID.html - -$$$$ - - - - 16 18 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -4.6544 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1503 -3.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3006 -4.6544 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4576 -3.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6079 -4.6544 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6079 -5.9842 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4576 -6.6491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3006 -5.9842 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4576 -2.6597 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6079 -1.9947 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3006 -1.9947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1503 -2.6597 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6649 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1503 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3006 -0.6649 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 12 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 9 10 2 0 0 0 0 - 9 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 16 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 2 0 0 0 0 -M END -> -20095 - -> -95 - -> -20095 - -> -96_CPDBAS_v5c - -> -C14H8O2 - -> -208.2121 - -> -defined organic - -> -parent - -> -tested chemical - -> -9,10-Anthraquinone - -> -84-65-1 - -> -single chemical compound - -> -9,10-anthraquinone - -> -O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3 - -> -O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3 - -> -InChI=1/C14H8O2/c15-13-9-5-1-2-6-10(9)14(16)12-8-4-3-7-11(12)13/h1-8H - -> -RZVHIXYEVGDQDX-UHFFFAOYAA - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -active - -> -0 - -> -no positive results - -> -no positive results - -> -no positive results - -> -inactive - -> -inactive - -> -inactive - -> -multisex inactive - -> -http://potency.berkeley.edu/chempages/9,10-ANTHRAQUINONE.html - -$$$$ - - - - 33 30 0 0 0 0 0 0 0 0 2 V2000 - 12.0104 -4.5373 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 - 2.4492 -4.9297 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 - 15.6998 -6.7352 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 14.6637 -7.5987 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 13.3920 -6.7352 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4779 -0.6908 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3004 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1543 -0.6908 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3079 -7.7086 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1461 -7.0178 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -7.7086 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 9.8281 -7.8813 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.7994 -7.7086 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.0287 -3.2342 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4055 -4.4902 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.7414 -3.2185 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3379 -5.2123 0.0000 Sb 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3175 -4.4431 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3018 -5.9816 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 4.7100 -7.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.3898 -5.9816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9973 -7.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9598 -3.2813 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2472 -3.2342 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.5987 -4.5373 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 9.6868 -4.4588 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 8.5250 -5.1966 0.0000 Sb 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4574 -5.9659 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8656 -7.1905 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.5612 -5.9659 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 9.1530 -7.1905 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.1107 -2.4649 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.6738 -2.1352 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 1 0 0 0 0 - 12 31 2 0 0 0 0 - 13 20 2 0 0 0 0 - 14 15 1 0 0 0 0 - 14 16 1 0 0 0 0 - 14 23 1 0 0 0 0 - 15 17 1 0 0 0 0 - 16 18 1 0 0 0 0 - 16 33 2 0 0 0 0 - 17 18 1 0 0 0 0 - 17 21 1 0 0 0 0 - 19 20 1 0 0 0 0 - 20 22 1 0 0 0 0 - 21 22 1 0 0 0 0 - 22 29 1 0 0 0 0 - 23 24 1 0 0 0 0 - 23 25 1 0 0 0 0 - 24 26 1 0 0 0 0 - 24 32 2 0 0 0 0 - 25 27 1 0 0 0 0 - 27 28 1 0 0 0 0 - 27 30 1 0 0 0 0 - 28 29 1 0 0 0 0 - 29 31 1 0 0 0 0 - 30 31 1 0 0 0 0 -M CHG 4 1 1 2 1 19 -1 26 -1 -M END -> -20096 - -> -96 - -> -39240 - -> -97_CPDBAS_v5c - -> -C8H10K2O15Sb2 - -> -667.8726 - -> -organometallic - -> -tested chemical - -> -Antimony potassium tartrate - -> -28300-74-5 - -> -single chemical compound - -> -dipotassium 5,11-dioxo-2,6,8,12,13,14-hexaoxa-1,7-distibatricyclo[8.2.1.1~4,7~]tetradecane-3,9-dicarboxylate trihydrate - -> -[K+].[K+].[O-]C(=O)C2O[Sb]3OC(C(O[Sb]1OC(=O)C2O1)C([O-])=O)C(=O)O3.O.O.O - -> -InChI=1/2C4H4O6.2K.3H2O.2Sb/c2*5-1(3(7)8)2(6)4(9)10;;;;;;;/h2*1-2H,(H,7,8)(H,9,10);;;3*1H2;;/q2*-2;2*+1;;;;2*+3/p-4/f2C4H2O6.2K.3H2O.2Sb/q2*-4;2m;;;;2m/rC8H6O12Sb2.2K.3H2O/c9-5(10)1-3-7(13)19-22(17-3)16-2(6(11)12)4-8(14)20-21(15-1)18-4;;;;;/h1-4H,(H,9,10)(H,11,12);;;3*1H2/q;2*+1;;;/p-2/fC8H4O12Sb2.2K.3H2O/q-2;2m;;; - -> -WBTCZEPSIIFINA-DYFLWLNICK - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -inactive - -> -0 - -> -no positive results - -> -inactive - -> -inactive - -> -http://potency.berkeley.edu/chempages/ANTIMONY%20POTASSIUM%20TARTRATE.html - -$$$$ - - - - 21 21 0 0 0 0 0 0 0 0 1 V2000 - 8.0682 -5.1439 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0682 -3.8092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9285 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7737 -3.8092 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6190 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4642 -3.8092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3095 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3095 -1.8146 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4642 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6190 -1.8146 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1547 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.4799 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.8146 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.4949 -2.2945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2230 -3.1493 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3777 -3.8092 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3777 -5.1439 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5325 -3.1493 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 12.6872 -3.8092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.8420 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 14.9967 -3.8092 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 15 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 10 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 8 9 1 0 0 0 0 - 8 11 1 0 0 0 0 - 9 10 2 0 0 0 0 - 11 12 1 0 0 0 0 - 11 13 1 0 0 0 0 - 11 14 1 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 2 0 0 0 0 - 16 18 1 0 0 0 0 - 18 19 1 0 0 0 0 - 19 20 1 0 0 0 0 - 20 21 1 0 0 0 0 -M END -> -20097 - -> -97 - -> -20097 - -> -98_CPDBAS_v5c - -> -C15H23ClO4S - -> -334.8587 - -> -defined organic - -> -parent - -> -tested chemical - -> -Aramite - -> -140-57-8 - -> -single chemical compound - -> -2-chloroethyl 2-{[4-(1,1-dimethylethyl)phenyl]oxy}-1-methylethyl sulfite - -> -CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl - -> -CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl - -> -InChI=1/C15H23ClO4S/c1-12(20-21(17)19-10-9-16)11-18-14-7-5-13(6-8-14)15(2,3)4/h5-8,12H,9-11H2,1-4H3 - -> -YKFRAOGHWKADFJ-UHFFFAOYAL - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat; mouse - -> -96.7 - -> -0.288778520611828 - -> -31 - -> -TD50 is harmonic mean of more than one positive test - -> -liver - -> -active - -> -158 - -> -0.471840809272687 - -> -32 - -> -liver - -> -no positive results - -> -active - -> -active - -> -active - -> -multispecies active - -> -http://potency.berkeley.edu/chempages/ARAMITE.html - -$$$$ - - - - 13 12 0 0 0 0 0 0 0 0 1 V2000 - 4.6515 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3171 -1.1556 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6482 -1.1556 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3137 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6482 -3.4594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3171 -3.4594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3137 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3278 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6622 -3.4594 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3278 -4.6077 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6622 -1.1556 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3477 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3311 -2.3477 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 2 0 0 0 0 - 1 8 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 7 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 8 9 1 0 0 0 0 - 8 11 2 0 0 0 0 - 9 10 1 0 0 0 0 - 12 13 1 0 0 0 0 -M END -> -20098 - -> -98 - -> -20098 - -> -99_CPDBAS_v5c - -> -C8H14ClNO2 - -> -191.6571 - -> -defined organic - -> -complex HCl - -> -tested chemical - -> -Arecoline.HCl - -> -61-94-9 - -> -single chemical compound - -> -parent [63-75-2] - -> -methyl 1-methyl-1,2,5,6-tetrahydropyridine-3-carboxylate hydrochloride - -> -O=C(OC)C1=CCCN(C)C1.[H]Cl - -> -O=C(OC)C1=CCCN(C)C1 - -> -InChI=1/C8H13NO2.ClH/c1-9-5-3-4-7(6-9)8(10)11-2;/h4H,3,5-6H2,1-2H3;1H - -> -LQSWCSYIDIBGRR-UHFFFAOYAO - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -mouse - -> -39.5 - -> -0.206097243462413 - -> -36 - -> -TD50 is harmonic mean of more than one positive test - -> -lung; stomach; vascular system - -> -lung; vascular system - -> -active - -> -active - -> -active - -> -multisite active; multisex active - -> -http://potency.berkeley.edu/chempages/ARECOLINE.HCl.html - -$$$$ - - - - 26 28 0 0 0 0 0 0 0 0 2 V2000 - 4.6012 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9551 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4264 -7.5675 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 4.6012 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6530 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9032 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.5493 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9551 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9032 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0069 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6530 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0069 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3564 -0.7636 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1244 -7.5675 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 2.2516 -0.7636 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.0725 -8.6933 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3089 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8416 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.7147 -5.3648 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.5258 -6.2361 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 6.5493 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4975 -5.3648 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8416 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.4975 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.7897 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.4949 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 1 0 0 0 0 - 1 9 2 0 0 0 0 - 2 4 2 0 0 0 0 - 2 5 1 0 0 0 0 - 3 14 1 0 0 0 0 - 3 16 2 0 0 0 0 - 4 8 1 0 0 0 0 - 4 6 1 0 0 0 0 - 5 10 2 0 0 0 0 - 5 12 1 0 0 0 0 - 6 7 2 0 0 0 0 - 6 21 1 0 0 0 0 - 7 9 1 0 0 0 0 - 7 18 1 0 0 0 0 - 8 13 1 0 0 0 0 - 8 11 2 0 0 0 0 - 10 11 1 0 0 0 0 - 11 15 1 0 0 0 0 - 12 19 2 0 0 0 0 - 12 20 1 0 0 0 0 - 13 17 1 0 0 0 0 - 15 17 1 0 0 0 0 - 18 22 1 0 0 0 0 - 18 24 2 0 0 0 0 - 21 23 2 0 0 0 0 - 22 25 1 0 0 0 0 - 23 24 1 0 0 0 0 -M CHG 4 3 1 14 -1 20 -1 26 1 -M END -> -20099 - -> -99 - -> -20099 - -> -100_CPDBAS_v5c - -> -C17H10NNaO7 - -> -363.2536 - -> -defined organic - -> -salt Na - -> -representative component in mixture - -> -Aristolochic acid, sodium salt (77% AA I, 21% AA II) - -> -10190-99-5 - -> -mixture or formulation - -> -structure shown AA I, parent [313-67-7]; AA II 6-Nitrophenanthro(3,4-d)-1,3-dioxole-5-carboxylic acid, sodium salt, AA II parent [475-80-9] - -> -sodium 8-(methyloxy)-6-nitrophenanthro[3,4-d][1,3]dioxole-5-carboxylate - -> -[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+] - -> -[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C(O)=O)=CC3=C2OCO3)=O - -> -InChI=1/C17H11NO7.Na/c1-23-12-4-2-3-8-9(12)5-11(18(21)22)14-10(17(19)20)6-13-16(15(8)14)25-7-24-13;/h2-6H,7H2,1H3,(H,19,20);/q;+1/p-1/fC17H10NO7.Na/q-1;m - -> -BQVOPWJSBBMGBR-KEMNOBITCY - -> -Carcinogenicity - -> -TD50; Tumor Target Sites - -> -rat - -> -active - -> -0.0141 - -> -50 - -> -TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active - -> -stomach - -> -stomach - -> -active - -> -active - -> -active - -> -multisex active - -> -kidney and urinary bladder were additional target sites but experiments too short to meet the inclusion rules of the CPDB; Rat added v2a; Mutagenicity_SAL_CPDB added v3a; TD50_Rat_mmol conversion from mg value not provided due to substance being a mixture - -> -http://potency.berkeley.edu/chempages/ARISTOLOCHIC%20ACID,%20SODIUM%20SALT%20(77%25%20AA%20I,%2021%25%20AA%20I.html - -$$$$ diff --git a/test/data/EPAFHM.csv b/test/data/EPAFHM.csv deleted file mode 100644 index 9092abc..0000000 --- a/test/data/EPAFHM.csv +++ /dev/null @@ -1,618 +0,0 @@ -"STRUCTURE_SMILES","LC50_mmol" -"C1=CC(C=O)=CC(OC)=C1OCCCCCC",1.13E-02 -"C1(OC)=C([N+]([O-])=O)C(C=O)=CC(Br)=C1O",2.66E-01 -"CCCCCCCCOC(=O)C1=CC=CC(C(=O)OCCCCCCCC)=C1", -"C1=CC(Cl)=CC=C1OC2=C([N+](=O)[O-])C=CC=C2",7.69E-03 -"CC1=C(NC=O)C=CC=C1Cl",2.75E-01 -"CCCCOC(=O)C1=CC=CC(C(=O)OCCCC)=C1",3.23E-03 -"C(C1=CC=CC=C1)(C2=CC=CC=C2)(O)C#C",5.33E-02 -"CCCSCCSCCC",4.22E-02 -"CCCCCCCCOC(=O)C1=CC=C(C(=O)OCCCCCCCC)C=C1", -"OCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCOC(=O)C2=CC=CC=C2C(=O)OCCCCO", -"CCCSCCCCSCCC",1.45E-02 -"C1([N+](=O)[O-])=CC=C(C)C=C1OP(=O)(OC2=C([N+](=O)[O-])C=CC(C)=C2)OC3=C([N+]([O-])=O)C=CC(C)=C3", -"C1=C([N+]([O-])=O)C=CC=C1P(=O)(C2=CC([N+](=O)[O-])=CC=C2)C3=CC([N+](=O)[O-])=CC=C3", -"ClCCOC(=O)NC1CCCCC1",1.70E-01 -"O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC",2.08E+00 -"OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-]",5.92E-02 -"NC(=O)OCC",5.88E+01 -"[O-]C(C1=CC=CC=C1O)=O.[Na+]",1.25E+01 -"C1=CC=CC=C1C(=O)N",5.46E+00 -"CC[N+](CC)(CC)CC1(=CC=CC=C1).[Cl-]",7.07E-01 -"CN(C)N",1.31E-01 -"CC(C(C(NC([O-])=N1)=O)(C1=O)CC)CCC.[Na+]",1.99E-01 -"N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O",3.77E-01 -"O=C1C2=C(N=CN2C)N(C(=O)N1C)C",7.78E-01 -"C1=CC=C2C(=C1)C(=O)C(C)=CC2=O",6.39E-04 -"OC1=C(Cl)C(Cl)=C(Cl)C=C1Cl",4.44E-03 -"OC1=CC(C)=C(Cl)C=C1",3.84E-02 -"[H]Cl.C1=CC=CC=C1CC2=NCCN2",1.80E+00 -"O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C",7.82E-02 -"O(CC)CC",3.45E+01 -"O=C2N5[C@@]3([H])[C@@]1([H])[C@](C[C@]4([H])N(C7)CC[C@]34C6=C5C=CC=C6)([H])C7=CCO[C@]([H])1C2.O=C9N%12[C@@]%10([H])[C@@]8([H])[C@](C[C@]%11([H])N(C%14)CC[C@]%10%11C%13=C%12C=CC=C%13)([H])C%14=CCO[C@]([H])8C9.O=S(O)(O)=O",1.11E-03 -"NC1=CC=CC=C1",1.13E+00 -"O=C(OC1=C2C(=CC=C1)C=CC=C2)NC",4.35E-02 -"CCO",3.19E+02 -"C1(=NC=CC=C1C2CCCN2C).OS(O)(=O)=O",5.30E-02 -"C1(O)=CC=CC=C1C(=O)N",7.36E-01 -"O=C1NC(=O)NC=C1", -"CCCCCC=O",1.75E-01 -"O=C1OC2=CC=CC=C2C(O)=C1CC3=C(O)C4=CC=CC=C4OC3=O",1.52E-02 -"C1(C=O)=CC=C(OC2=CC=CC=C2)C=C1",2.32E-02 -"CO",9.17E+02 -"OC(C)C",1.44E+02 -"CC(=O)C",1.23E+02 -"ClC(Cl)Cl",5.92E-01 -"CS(=O)C",4.35E+02 -"ClC(C(Cl)(Cl)Cl)(Cl)Cl",6.00E-03 -"OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl",5.16E-05 -"C1=CC(=CC=C1N)C(=O)CC",9.79E-01 -"OCCC",7.57E+01 -"CCCCO",2.33E+01 -"CCCCCO",5.36E+00 -"C1=CC=CC=C1",2.25E-01 -"CC(Cl)(Cl)Cl",3.55E-01 -"[S-]C1=NC(C(C(C)CCC)(CC)C(N1)=O)=O.[Na+]",9.91E-02 -"CC#N",4.01E+01 -"CC=O",7.67E-01 -"ClCCl",3.89E+00 -"IC(I)I",7.42E-03 -"[N+](C)(C)(C)C.[Cl-]",4.22E+00 -"CC(C)(C)O",8.65E+01 -"C(F)(F)(F)CO",1.19E+00 -"CC(=O)C(C)(C)C",8.69E-01 -"ClC(C(Cl)Cl)(Cl)Cl",3.72E-02 -"CC1(C)NC(=O)NC1=O",1.29E+02 -"CCC(O)(C)CC",6.58E+00 -"C#CC(O)(C)CC",1.24E+01 -"C1CCCC(C#C)(O)C1",2.06E+00 -"CCCCOCCOP(=O)(OCCOCCCC)OCCOCCCC",2.81E-02 -"OCC(C)C",1.93E+01 -"CC(Cl)CCl",1.12E+00 -"NCC(N)C",1.36E+01 -"CC(O)CC",4.95E+01 -"CCC(=O)C",4.47E+01 -"OC(C)CN",3.36E+01 -"ClC(CCl)Cl",6.12E-01 -"ClC(=CCl)Cl",3.36E-01 -"CC(=O)OC",4.82E+00 -"ClC(C(Cl)Cl)Cl",1.21E-01 -"C1(C)(C)CCCC(C)=C1C=CC(C)=O",2.65E-02 -"ClC1=C(O)C(Cl)=CC(=C1)C(C2=CC(Cl)=C(O)C(=C2)Cl)(C)C",3.63E-03 -"C(C1C=CC(=CC=1)O)(CC)(C)C",1.58E-02 -"C1CC(CCC1(N)C)C(C)(N)C",3.83E-01 -"ClC(Cl)C1=C(Cl)C=CC=C1Cl",4.22E-03 -"C1=CC=C2C=CC=C3C2=C1CC3",1.12E-02 -"CC1=CNC2=C1C=CC=C2",6.74E-02 -"O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1",1.32E-05 -"O=C2C1=NC3=C(C=C(C)C(C)=C3)N(C[C@H](O)[C@H](O)[C@H](O)CO)C1=NC(N2)=O", -"C1=CC=CC=C1OC(=O)C2=CC=CC=C2C(=O)OC3=CC=CC=C3",2.51E-04 -"O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3", -"CCOC(=O)C1=CC=CC=C1C(=O)OCC",1.43E-01 -"C1=CC=C(C(=O)OCCCC)C(=C1)C(=O)OCCCC",3.5900E-03 -"CCC1=C(Br)C(Br)=C(Br)C(Br)=C1Br", -"O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC",2.02E-04 -"C1=CC=CC=C1NC(=O)C2=C(O)C=CC=C2",1.85E-02 -"Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl",3.45E-04 -"OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl",9.12E-04 -"OC1=C(C=C(C=C1Cl)Cl)Cl",2.48E-02 -"OC1=CC(C(F)(F)F)=C([N+]([O-])=O)C=C1",4.41E-02 -"C1(N)=CC=CC=C1C(=O)N",2.90E+00 -"OC1=C([N+]([O-])=O)C=CC=C1",1.15E+00 -"OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-]",2.23E-03 -"O=CC1=CC=CC=C1O",1.88E-02 -"OC1=CC=CC2=CC=CC=C12",3.21E-02 -"OC1=C(C=CC=C1)C2=CC=CC=C2",3.61E-02 -"C12C(=O)C3=C(OC=1C=CC=C2)C=CC=C3", -"BrC1=C(O)C(C=O)=CC(Br)=C1",3.04E-03 -"C1=C2C(=CC=C1)C=CC=C2",4.79E-02 -"N1=CC=CC2=C1C=CC=C2",6.02E-01 -"CCN(CC)C1CCCCC1",1.38E-01 -"CCN(CC)C1=CC=CC=C1",1.10E-01 -"OCCN(CC)C1=CC(C)=CC=C1",2.95E-01 -"C1CCCCC1C2CCCCC2", -"C1=CC=CC=C1C(=O)CC(=O)C",6.78E-03 -"C1=CC(N)=CC=C1C(=O)OCC",2.16E-01 -"O1COC2=CC=C(/C=C/C=C/C(=O)N3CCCCC3)C=C12",2.75E-02 -"C1(C=O)=C(O)C=C(O)C=C1",9.50E-02 -"CC1=C(C)C=CC=C1",1.54E-01 -"OC1=C(C)C=CC=C1",1.29E-01 -"ClC1=C(C=CC=C1)Cl",6.40E-02 -"NC1=C(Cl)C=CC=C1",4.50E-02 -"CC1=C(F)C=CC=C1",1.76E-01 -"OC1=CC=CC=C1Cl",8.87E-02 -"CC1=C(C=CC(=C1)C)C",6.42E-02 -"CC1=CC(Cl)=C(Cl)C=C1",1.81E-02 -"NC1=CC(Cl)=C(Cl)C=C1",4.67E-02 -"C=C(C)C(=O)OCC=C",7.85E-03 -"BrCC(Br)CO",3.26E-01 -"CC(C=O)CC",1.16E-01 -"ClCC(Cl)CCl",3.91E-01 -"CCC(=O)CC",1.79E+01 -"CCC(C)=NO",9.68E+00 -"OCCN(C(C)C)C(C)C",1.38E+00 -"NC1=C([N+]([O-])=O)C=C([N+]([O-])=O)C=C1",8.08E-02 -"OC1=CC=C(Cl)C=C1CC2=CC(Cl)=CC=C2O",1.15E-03 -"C[N+](C1=CC=CC=C1)(C)C.[I-]",9.24E-01 -"C(C1=CC=C(O)C=C1)(C)(C)C",3.43E-02 -"C1=CC=CC=C1C(C)C",5.26E-02 -"C1=CC=CC=C1C(=O)C",1.35E+00 -"O=[N+](C1=CC=CC=C1)[O-]",9.67E-01 -"C1=C(C(=O)C)C=C(N)C=C1",2.83E+00 -"CC1=CC([N+](=O)[O-])=CC=C1",1.87E-01 -"CN(C)C1=CC=C(C)C=C1",3.62E-01 -"O=[N+](C1=CC=C(C=C1)N)[O-]",9.05E-01 -"OC1=CC=C([N+](=O)[O-])C=C1",3.22E-01 -"CN(C)C1=CC=C(C=O)C=C1",3.06E-01 -"[O-][N+](=O)C1=CC=C([N+]([O-])=O)C=C1",4.22E-03 -"CCN(CCO)CC",1.52E+01 -"CCC1=CC=CC=C1",9.89E-02 -"NCC1=CC=CC=C1",9.52E-01 -"O=CC1=CC=CC=C1",9.30E-02 -"C1=CC=C(NC)C=C1",9.33E-01 -"ON=C1CCCCC1",1.84E+00 -"N1=C(C#N)C=CC=C1",6.97E+00 -"N1=C(CC)C=CC=C1",3.86E+00 -"CC1(C)OCC(CO)O1",1.26E+02 -"C1N2CN3CN(C2)CN1C3",3.55E+02 -"C1=CC=CC=C1OC2=CC=CC=C2",2.35E-02 -"CCNC1=CC(C)=CC=C1",3.66E-01 -"CCCN(CCC)CCC",3.55E-01 -"OCCN(CCO)CCO",7.91E+01 -"C1=CC=CC=C1CCC(C)(C)O",4.04E-01 -"C1=CC(C)=CC=C1SSC2=CC=C(C)C=C2", -"OCCN1CCNCC1",4.92E+01 -"CN(C)CC1=CC=CC=C1",2.80E-01 -"C1(=CC=C(C=C1)O)NC(C)=O",5.39E+00 -"NC1=CC=C(CCCC)C=C1",6.80E-02 -"CCCCCCCCCC1=CC=C(O)C=C1",6.35E-04 -"NC1=CC=C(CCCCCCCCCCCC)C=C1", -"CCC(CCCC)CO",2.17E-01 -"ClC1=CC=C(C=O)C=C1",1.56E-02 -"N1=C(C)C=CC(CC)=C1",6.69E-01 -"CC(=O)CCCN(CC)CC",2.14E+00 -"CCOC(=O)CC(=O)OCC",9.18E-02 -"OC1=C(C)C=C(C)C=C1",1.36E-01 -"CCCCOC(=O)C=CC(=O)OCCCC",2.76E-03 -"CCCCOC(=O)CCCCC(=O)OCCCC",1.41E-02 -"NC1=CC=C(Br)C=C1",2.76E-01 -"CC1=CC=C(C)C=C1",8.35E-02 -"OC1=CC=C(C)C=C1",1.53E-01 -"NC1=CC=C(C=C1)Cl",2.46E-01 -"OC1=CC=C(Cl)C=C1",4.75E-02 -"NC1=CC=C(C)C=C1",1.49E+00 -"C=CC(=O)OCC(C)C",1.64E-02 -"BrCCC",5.47E-01 -"C=CC=O",3.03E-04 -"ClCCCl",1.37E+00 -"ClCCO",6.67E-01 -"CCCN",5.21E+00 -"CCC#N",2.76E+01 -"ClCC#N",1.78E-02 -"NCCN",3.66E+00 -"C=CCO",5.51E-03 -"C(O)C#C",2.64E-02 -"CC=NO",1.29E+00 -"C[C@](CC(O)C)(C)O",9.05E+01 -"CC(C)(C)CC(C)(C)N",1.90E-01 -"CC(C)(C)SC(C)(C)C",1.99E-01 -"CCCC(=O)C",1.44E+01 -"CC(=O)CC(C)C",5.21E+00 -"CC(C)OC(C)C",7.69E+00 -"CC1=CC=CC=C1",3.68E-01 -"N1=CC=C(C)C=C1",4.33E+00 -"ClC1=CC=CC=C1",1.50E-01 -"C1CCCCC1O",7.03E+00 -"O=C1CCCCC1",6.33E+00 -"OC1=CC=CC=C1",3.47E-01 -"N1=CC(C)=CC=C1",1.55E+00 -"CN1CCNCC1",2.30E+01 -"N1=C(C)C=CC=C1",9.63E+00 -"N1CC(C)NCC1",2.24E+01 -"CC(=O)OCCC",5.87E-01 -"BrCCCBr",1.04E-02 -"BrCCCC",2.68E-01 -"CCCCN",3.66E+00 -"C=CCC#N",2.71E+00 -"NCCCN",1.61E+01 -"N#CCC#N",8.48E-03 -"COCCN",6.98E+00 -"CCNCC",1.17E+01 -"N1C=CC=C1",3.13E+00 -"C1CCCO1",3.00E+01 -"C1=COC=C1",8.96E-01 -"CC(C)(C)SSC(C)(C)C",7.68E-03 -"CC(=O)CCC(C)C",1.39E+00 -"CCOC(=O)CCCCCCCCC(=O)OCC",1.05E-02 -"CCCCCC(=O)C",1.15E+00 -"CCCCCC",2.90E-02 -"ClCCCCCl",4.06E-01 -"CCCCCN",2.03E+00 -"CCCCC=O",1.50E-01 -"C(O)C#CC(O)",6.23E-01 -"CCNCCO",1.66E+01 -"C1CCCCC1",5.38E-02 -"N1=CC=CC=C1",1.26E+00 -"C1OCOCO1",6.61E+01 -"O=C(CC/C=C(C)/C)C",6.79E-01 -"CC(=O)CCCCCC",2.81E-01 -"CC(=O)OCCOCC",3.19E-01 -"BrCCCCCC",2.09E-02 -"CCCCCCN",5.59E-01 -"CCCCCCO",9.56E-01 -"OCCNCCO",4.48E+01 -"OCCOCCO",7.09E+02 -"CCCSCCC",1.84E-01 -"CCCCCCCN",1.89E-01 -"N#CCCCCC#N",1.79E+01 -"CCCCCCCO",2.97E-01 -"BrCCCCCCCC",4.34E-03 -"CCCCCCCCN",4.02E-02 -"CCCCCCCCO",1.04E-01 -"CCOCCOCCO",1.98E+02 -"CCCCCCCCC(=O)O",6.57E-01 -"CCCCCCCCCC(=O)C",8.81E-03 -"CCCCCCCCCN",1.50E-02 -"OCCOCCOCCO",4.59E+02 -"CCCCCCCCCCO",1.52E-02 -"CCCCCCCCCCCCCO", -"CC(C)OC1=CC=CC=C1OC(=O)NC",4.21E-02 -"CC(O)(C)C#C",3.91E+01 -"C(Cl)(Cl)(Cl)CO",2.00E+00 -"OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl",1.67E-03 -"C1=CC=CC=C1OP(=O)(OC2=CC=CC=C2)OC3=CC=CC=C3",2.66E-03 -"S(=O)(C)C1=CC=C(OP(=S)(OCC)OCC)C=C1",1.40E-01 -"CC(C=NOC(=O)NC)(SC)C",4.52E-03 -"O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC", -"CCCCCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCCCCC", -"C1=CC=CC(O)=C1C(=O)OC2=CC=CC=C2",5.51E-03 -"C1=CC=CC(O)=C1C(=O)OCC",1.22E-01 -"OC1=C(Br)C=C(Br)C=C1Br",1.98E-02 -"OC1=C(C=C(C=C1)N)[N+](=O)[O-]",2.35E-01 -"C1=CC=CC=C1C(=O)C2=CC=CC=C2",8.07E-02 -"C1=CC=CC=C1N(CCO)CCO",4.06E+00 -"C1=CC(=CC=C1C=O)N(CC)CC",1.35E-01 -"OC1=C(C=CC=C1)O",8.37E-02 -"ClC1=C(Cl)C=C(Cl)C=C1",1.65E-02 -"ClC1=C(C=CC(=C1)Cl)O",4.75E-02 -"CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-]",1.33E-01 -"O=CC1=CC(OCC)=C(O)C=C1",5.27E-01 -"C1(C=O)=CC(OC)=C(O)C=C1",5.51E-01 -"CN(C1=CC=CC=C1)C",5.29E-01 -"ClC1=CC([N+](=O)[O-])=CC=C1",1.19E-01 -"O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC",4.27E-02 -"NC1=C(Cl)C=C([N+]([O-])=O)C=C1",1.16E-01 -"C1(C=O)=CC=C(C(C)C)C=C1",4.47E-02 -"C1=CC=CC=C1NC2=CC=CC=C2",2.24E-02 -"C1=CC=CC=C1OCCO",2.49E+00 -"OC1=CC=C(CC)C=C1",8.51E-02 -"CC(C=O)CCC",1.88E-01 -"CC(=O)CC(=O)C",1.35E+00 -"CCCCCC(=O)OCC",6.17E-02 -"CCCC=O",2.04E-01 -"CC(=O)OCCCC",1.55E-01 -"C1COCCO1",1.17E+02 -"CCCCCCCCCCCCN",5.56E-04 -"CCCCCCCCCCCCCC=O", -"CCCCOP(=O)(OCCCC)OCCCC",3.56E-02 -"O=C(CC(=O)C1)CC1(C)C",8.20E+01 -"OC(C)CCl",2.59E+00 -"ClC(=C(Cl)Cl)Cl",9.95E-02 -"CC(C1=CC=CC=C1)(O)C#C",7.73E-01 -"OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C",1.65E-03 -"O=S(C1=CC=CC=C1C([N-]2)=O)2=O.[Na+].[O]",8.20E+01 -"C1=CC=CC2C3=CC=CC=C3OC1=2",8.92E-03 -"C1=CC=CC=C1OC(=O)C2=C(O)C=C(N)C=C2",2.08E-02 -"CCN(CC)C(=O)C1=CC=CC(C)=C1",5.75E-01 -"CCC([O-])=O.[Na+]",4.99E+01 -"NCCN1CCNCC1",1.70E+01 -"CCCCOC(=O)CCC(=O)OCCCC",1.94E-02 -"CCOC(=O)CCCCC(=O)OCC",8.99E-02 -"OCCN",3.39E+01 -"CC(=O)OCC",2.61E+00 -"N1CC(C)OC(C)C1",3.36E+00 -"CCC1=CC(CC)=CC=C1",3.09E-02 -"ClCCCCl",9.82E-01 -"CCCCCC(O)=O",2.76E+00 -"CC(=O)OCCCCCC",3.05E-02 -"CCCCOCCCC",2.48E-01 -"CCCCCCCCCO",3.95E-02 -"CCCCCCNCCCCCC",4.21E-03 -"OCCCCCCCC\C=C/CCCCCCCC", -"C1(C=O)=C(O)C(OC)=CC=C1",1.58E-02 -"OC1=CC(OC)=CC=C1",5.96E-01 -"COC1=CC=C(C=C1)O",8.86E-01 -"COC1=CC=C(OC)C=C1",8.47E-01 -"C1=COC2=C1C=CC=C2",1.19E-01 -"C(CN(C1)C2)N(C1)C2",1.54E+01 -"C(CC(CC1CC23)C2)(C1)C3",2.06E-03 -"CCOP(OCC)(=S)SCCSCC",9.95E-03 -"[O-]C(N1)=NC(C(C(CCC)C)(CC=C)C1=O)=O.[Na+]",9.07E-02 -"BrC1=C(C)NC(=O)N(C(C)CC)C1=O",7.12E-01 -"OC1=C([N+](=O)[O-])C=CC([N+]([O-])=O)=C1",1.82E-02 -"ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl",6.09E-02 -"C1=CC(F)=CC=C1OC2=CC=C(F)C=C2",5.48E-03 -"S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC",3.07E-02 -"FC1=CC=C([N+](=O)[O-])C=C1",2.01E-01 -"C(F)(F)(F)C1=CC(C#N)=CC=C1",2.79E-01 -"NC1=CC=C(F)C=C1",1.52E-01 -"C1(C=O)=C(Cl)C=CC=C1F",5.93E-02 -"NC1=C(C(F)(F)F)C=C(F)C=C1",1.65E-01 -"C1(C=O)=C(F)C=CC=C1",1.09E-02 -"C1=CC=CC(=C1C(F)(F)F)C#N",2.47E-01 -"C1(C=O)=CC(C(F)(F)F)=CC=C1",5.31E-03 -"CNC1=CC=C(F)C=C1",3.07E-01 -"CCCCCCC(=O)CCCCCC", -"O[C@H]1[C@@]([C@@](C)2C)(C)CC[C@H]2C1",4.10E-01 -"O=C(CC1C2)C(C2)(C1(C)C)C",1.12E-01 -"CC2(C)OC1(C)CCC2CC1",6.61E-01 -"O=[C@](O)[C@@]1(C)[C@]([C@]([C@]([H])2CC3)(C)CCC1)([H])CCC2=C\C3=C(C)/C",4.93E-03 -"N1=C(C2=CC=CC=C2)NC(C3=CC=CC=C3)=C1C4=CC=CC=C4", -"C1COC2=CC=CC=C12",6.80E-01 -"O[C@H]1[C@H](CC2)C[C@H]2C1",2.03E+00 -"C1C2C=CC1CC2",1.06E-01 -"N1=C(C(=O)O)C=CC=C1C(=O)O",1.93E+00 -"N1=CC(C=O)=CC=C1",1.53E-01 -"CCCCC(=O)CCCC",2.18E-01 -"C=C(C)C(C)=C",8.41E-02 -"O=[C@](O)[C@@]3(C)[C@@]1([H])[C@@](CCC3)(C)[C@]2([H])C(C=[C@@]([C@@H](C)C)CC2)=CC1",7.87E-03 -"C1=CC=CC=C1C2=CC(=O)C3=CC=CC=C3O2",1.57E-02 -"OC1=C(C)C=C(C)C=C1C",9.54E-02 -"C1(C#N)=CC=CC=C1C",3.82E-01 -"C1(C=O)=C(C)C=CC=C1",4.40E-01 -"C1(=CC=CC=C1)C(=O)[O-].[Na+]",3.36E+00 -"OC1=C(C)C=C([N+]([O-])=O)C=C1[N+]([O-])=O",8.73E-03 -"C1=CC=CC=C1CCCCC",1.15E-02 -"O=C(OC(C)(C)C)C",2.82E+00 -"ClC1=CC(Cl)=CC=C1",5.46E-02 -"Cl\C=C\CCl",2.15E-03 -"CCCCSCCCC",2.45E-02 -"C1(O)=CC(OC)=CC=C1C(=O)C",4.18E-01 -"C1(C=O)=C([N+]([O-])=O)C=CC=C1",9.53E-02 -"O=CC1=CC=C([N+](=O)[O-])C=C1",6.68E-02 -"CC(=O)C(C)C",1.00E+01 -"OC1=C([N+]([O-])=O)C=CC=C1[N+]([O-])=O",2.16E-01 -"BrC1=C(Br)C=CC=C1",1.72E-02 -"C=CCNC1=CC=CC=C1",2.70E-01 -"NC1=CC=C(CC)C=C1",6.02E-01 -"CC(C)CC=O",3.77E-02 -"CCCCC(=O)C",4.27E+00 -"CC=CC=CC",2.43E-01 -"CCCCCCCCCCCC(=O)C",1.81E-03 -"C1=CC=CC=C1[Sn](C2=CC=CC=C2)(C3=CC=CC=C3)C4=CC=CC=C4", -"[H][C@]1(CC2)C(C)(C)CCC[C@@](C)1[C@@H](CC[C@@](O)(C)C=C)C2=C",4.13E-04 -"CC[Sn](CC)(CC)CC",4.68E-05 -"CC(C)C(C)N",3.26E+00 -"CC(C)C(O)C(C)C",1.40E+00 -"C1=CC=CC=C1N(C2=CC=CC=C2)C3=CC=CC=C3", -"C1=CC=CC=C1N(C2=CC=CC=C2)C=O",1.54E-01 -"CCOC(=O)C(CC1=CC=CC=C1)C(=O)OCC",2.17E-02 -"OC1=C(Br)C(Br)=C(Br)C(Br)=C1Br",1.90E-04 -"OC1=C(I)C=C(I)C=C1I",2.56E-03 -"C1(C=O)=C(OC)C=C(OC)C=C1",1.21E-01 -"OC1=C(NC(=O)C)C=CC=C1",1.79E-01 -"NC1=C(Cl)C=C(C)C=C1",2.54E-01 -"NC1=C([N+]([O-])=O)C=C(OCC)C=C1",1.43E-01 -"C1=CC([N+](=O)[O-])=CC=C1C(=O)OC",1.31E-01 -"C1=CC([N+]([O-])=O)=CC=C1C(=O)N",8.01E-01 -"C1=CC=CC=C1OC2=CC=C([N+](=O)[O-])C=C2",1.23E-02 -"C1=CC=C(CS(=O)CC2=CC=CC=C2)C=C1",3.48E-01 -"OC1=CC(NC(=O)C)=CC=C1",7.48E+00 -"OCCN1CCOCC1",2.07E+01 -"ClCC1=CC=C(CCl)C=C1",2.23E-04 -"IC1=CC=C(I)C=C1", -"O1C(C)=CC=C1C",7.40E-01 -"ClCCCCCCl",1.79E-01 -"BrCCCCCCC",8.21E-03 -"CCCSSCCC",1.70E-02 -"N#CCCCCCCC#N",3.88E+00 -"NC1=C(Cl)C(Cl)=C(Cl)C=C1",1.85E-02 -"C1(C=O)=C(O)C=CC(Cl)=C1",4.92E-03 -"OC1=CC=C(CCC)C=C1",8.08E-02 -"C1(C=O)=C(F)C(F)=C(F)C(F)=C1F",5.61E-03 -"C(Cl)(Cl)C(=O)N",1.88E+00 -"CCCCCCC(C)N",4.02E-02 -"CC(=O)CCCCCCCC",3.09E-02 -"CCCCCOCCCCC",1.98E-02 -"CC1=COC=N1",1.67E+01 -"CC1=NC=CN1",3.48E+00 -"O=C1C3CC2CC1CC(C3)C2",4.05E-01 -"CCCCCCC1OC(=O)CC1",1.06E-01 -"C1(C=O)=C(O)C=C(OC)C=C1OC",1.47E-02 -"C1=C(Cl)C(Cl)=CC=C1NC(=O)CC",3.94E-02 -"OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C",2.32E-04 -"C=CC(Cl)C(Cl)",6.54E-02 -"C(=O)N(CCCC)CCCC",5.68E-01 -"C(O)C#CC",1.44E-01 -"CC(C)=CC=C(C)C",3.43E-02 -"NC13CC(CC(C3)C2)CC2C1",1.65E-01 -"N1=C(O)C(C#N)=C(C)C=C1C",1.06E+00 -"NC1=C(F)C(F)=C(F)C(F)=C1F",2.03E-01 -"ClC1=CC=C(SCSP(=S)(OCC)OCC)C=C1",7.00E-04 -"C1=CC=CC=C1P(=O)(C2=CC=CC=C2)C3=CC=CC=C3",1.93E-01 -"C1=CC(N(C)C)=CC=C1P(=O)(C2=CC=C(N(C)C)C=C2)C3=CC=C(N(C)C)C=C3", -"C=CC(=O)OCCO",4.14E-02 -"C#CC(O)CCCCC",3.27E-03 -"CCCCCCCC(=O)C",1.07E-01 -"Cl[C@@H]1CCCC[C@H]1Cl",1.20E-01 -"C1=CC=CC=C1OC2=CC=C(O)C=C2",2.66E-02 -"C=C(C)C(=O)OCCO",1.74E+00 -"C1(Br)=CSC=C1",3.80E-02 -"O=CC1=C(Cl)C=C(Cl)C=C1",1.03E-02 -"C1=CC=CC=C1SSC2=CC=CC=C2",5.04E-04 -"C1(=CC=CC=C1)/C=C/C=C/C2=CC=CC=C2", -"O=C(OCC)C1=CC(N)=CC=C1.OS(C)(=O)=O",3.02E-01 -"C(F)(F)(F)C(O)C(F)(F)(F)",1.45E+00 -"C=CC(O)CC=C",3.88E-01 -"C(O)CC#C",5.15E-01 -"CC\C=C/CCO",3.80E+00 -"CC/C=C/CCO",2.71E+00 -"CN1C(C(=O)C)=CC=C1",1.28E+00 -"N1=CC=C(C2=CC=CC=C2)C=C1",1.04E-01 -"C1=CC=CC=C1S(=O)C2=CC=CC=C2",4.32E-01 -"C1=CC=CC=C1C2=CC=C(C3=CC=CC=C3)O2", -"C=CC(=O)OCC(O)C",2.60E-02 -"N1=C(N)C=CC(Br)=C1",1.02E+00 -"CCOP(=O)(CC1=CC=CC=C1)OCC",1.47E+00 -"CCCCCCCCCCCC(=O)N", -"N1=CC=C(C(=O)C)C=C1",1.39E+00 -"C1=CC(Cl)=CC=C1C(=O)OC",6.40E-02 -"CCCCOC1=CC=CC=C1",3.80E-02 -"C1=CC(C#N)=CC=C1C(=O)OC",2.90E-01 -"OC1=C(O)C(Cl)=C(Cl)C(Cl)=C1Cl",5.12E-03 -"C1=C(C(=O)CBr)C(OC)=CC=C1OC",2.55E-03 -"CCCC[Sn](CCCC)(CCCC)CCCC",1.30E-04 -"C#CC(C)(O)C(C)C",1.83E+00 -"C1=CC=C2C3=CC=CC=C3N(C2=C1)C=C",1.66E-05 -"C1=C(N)C=CC=C1OCC2=CC=CC=C2",4.59E-02 -"O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C",3.81E-03 -"CC(OC)(C)C",7.62E+00 -"C=CCCCCCCC=C",2.10E-03 -"C1=CC(O)=CC=C1/N=N/C2=CC=CC=C2",6.00E-03 -"C1=C(I)C(O)=C(I)C=C1C#N",1.83E-02 -"C1=C(Br)C(O)=C(Br)C=C1C#N",4.55E-02 -"O=[C@](O)[C@@]3(C)[C@@]2([H])[C@@](CCC3)(C)C1=C(CC2)C=[C@@]([C@@H](C)C)C=C1",6.99E-03 -"C=CCC1=CC=CC=C1O",1.12E-01 -"C1(C=O)=C(O)C=CC(Br)=C1",6.46E-03 -"C=C(CCl)C(Cl)",1.52E-03 -"C1=C(Cl)C(O)=C(Cl)C=C1C#N",1.29E-01 -"CCCCOC(=O)C1=CC=C(C(=O)OCCCC)C=C1",2.12E-03 -"C1=CC(O)=CC=C1OC2=CC=C(O)C=C2",2.86E-02 -"C1(Cl)=CC=CC(Cl)=C1C(=O)N",2.47E+00 -"CCCCCCCCCCN",6.55E-03 -"CNC(=O)OC1=CC(C)=C(N(C)C)C=C1",9.36E-03 -"N1=C(Br)NC(Br)=C1Br",2.01E-02 -"CCOP(=S)(OC1=CC=C(C=C1)[N+](=O)[O-])C2=CC=CC=C2",2.43E-04 -"OC(C)CC#C",4.17E-01 -"OC1=C(O)C=C(Cl)C=C1",1.09E-02 -"C1(O)=CC(O)=CC=C1C(=O)OC",2.72E-01 -"C=CC(=O)OCCCCCCCCCCCC", -"N1=C(Cl)C(Cl)=C(Cl)C(Cl)=C1Cl",1.87E-03 -"C1[C@H](C[C@H]([C@@H](C1)C(C)C)O)C",1.21E-01 -"C1=CN=CN1S(=O)(=O)C2=CC=C(C)C=C2",1.88E-01 -"C1=C(C(=O)C)C(Cl)=CC(Cl)=C1",6.89E-02 -"CCCCCCCCC#N",3.77E-02 -"NC1=CC(C(F)(F)F)=C(F)C=C1",1.68E-01 -"[C@H]1(CCCC[C@H]1O)C2=CC=CC=C2",2.52E-01 -"C=C(C)C(=O)OCCOCC",1.75E-01 -"OC1=C(C)C(C)=CC=C1C",6.02E-02 -"CCCCCCCCCCCC#N",2.37E-03 -"C1(OC)=CC=CC=C1C(=O)N",7.94E-01 -"C1(Cl)=CC(Cl)=CC=C1C(=O)N",5.03E-01 -"C=C(C)C(=O)OCC1OCCC1",2.04E-01 -"OC1=C(OC)C=C(Cl)C(Cl)=C1",2.32E-02 -"C=C(C)C(=O)OCC1=CC=CC=C1",2.65E-02 -"C=CC(=O)OCCCCCC",7.10E-03 -"CC(C)(C)C1=CC=C(OC(=O)NC)C=C1",4.82E-02 -"N1=C(CCN)C=CC=C1", -"C1=CC=CC=C1CN2CCNCC2",2.69E-01 -"N1=CC=CC(=C1)CCCO",1.09E+00 -"CCCCCCCCCCCCCN",3.28E-04 -"C1=CC=CC(N)=C1C(=O)C2=CC=C(Cl)C=C2",9.15E-03 -"C1(Cl)=CC=C(Cl)C=C1C(=O)OC",6.83E-02 -"S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC",9.07E-04 -"C1(OC)=CC(C=O)=CC(Br)=C1O",2.58E-01 -"C=CC(=O)OC1CCCCC1",9.60E-03 -"S(C1=CC=C(Cl)C=C1)(=O)C2=CC=C(Cl)C=C2", -"CCOC(=O)N(C(=O)OCC)C(=O)OCC",5.70E-02 -"OC1=C(O)C=C(Cl)C(Cl)=C1",4.97E-03 -"NC1=C(Cl)C(Cl)=CC(Cl)=C1Cl",1.17E-03 -"N1=C(C2=CC=CC=C2)C=CC=C1C3=CC=CC=C3",9.08E-04 -"ClC1=CC(Cl)=C([N+]([O-])=O)C=C1[N+]([O-])=O",1.92E-04 -"C1(Cl)=CC(Cl)=C(Cl)C=C1SSC2=C(Cl)C=C(Cl)C(Cl)=C2", -"C1=C(C)C(C)=CC=C1OP(=O)(OC2=CC(C)=C(C)C=C2)OC3=CC(C)=C(C)C=C3", -"CCC(C)C(C)C=O",1.40E-01 -"C(O)C#CCCCCCCC",6.94E-03 -"N1=C(O)C=CC(Cl)=C1",8.80E+00 -"CC(C)SSC(C)C",5.53E-02 -"C1(C=O)=C(OC)C=C(OC)C(OC)=C1",2.52E-01 -"C=C(C)C(=O)OC(C)C",2.96E-01 -"C=CC(O)CCC",3.04E-01 -"OC1=C(Cl)C(Cl)=C(Cl)C(Cl)=C1",1.77E-03 -"C1=CN=CC=C1CCC2=CC=NC=C2",8.20E-01 -"C1C(=O)N(CC)C(=S)N(CC)C1=O",2.25E+01 -"COC(=O)C1=CC=C(C(=O)OC)C=C1[N+]([O-])=O",2.73E-02 -"C1=CC(Cl)=CC2N=C(S)SC1=2",1.59E-02 -"COC(=O)C1=CC=C(C(=O)OC)C=C1N",4.27E-02 -"CCSCCSCC",4.01E-01 -"CN(CCCCl)C.[H]Cl",8.41E-01 -"C1=C(C(=O)C)C=C([N+]([O-])=O)C(Cl)=C1",2.76E-02 -"CC1=CC(Cl)=NC(N)=N1",9.82E-01 -"CC1=C(OC)C=CC=C1OC",1.33E-01 -"N1=C(N(C)C)C=CC=C1",1.04E+00 -"CC(C)(C)CN",5.45E+00 -"O=[C@](O)[C@@]3(C)[C@@]1([H])[C@@](CCC3)(C)[C@]2([H])C(C[C@](C=C)(C)CC2)=CC1",2.88E-03 -"C1(N)=CC=C(Cl)C=C1C#N",1.87E-01 -"ClC(Cl)(C(C)(O)C)Cl.ClC(Cl)(C(C)(O)C)Cl.[H]O[H]",3.62E-01 -"CCCCCCCCCCC(=O)C",6.40E-03 -"C1=C(/C=C/C=O)C=CC(N(C)C)=C1",3.67E-02 -"C(C(=O)O)[N+]1(=CC=CC=C1).[Cl-]",9.33E-01 -"ClC1=C([N+]([O-])=O)C(Cl)=C([N+]([O-])=O)C(Cl)=C1",8.18E-04 -"ClC1=CC=C([N+](=O)[O-])C=C1C=O",2.09E-02 -"N#CC1=C(Cl)C=CC=C1C",9.96E-02 -"N1=C(Br)C(O)=CC=C1",2.70E+00 -"N1=C(Cl)C(O)=CC=C1",4.80E+00 -"C#CCN(CC#C)CC#C",2.26E+00 -"CCOC(OCC)CN(C)CC(OCC)OCC",2.41E+00 -"NCCCN1CCN(CCCN)CC1",1.55E+01 -"OC(CC/C=C(C)/CC/C=C(C)\C)(C)C=C",6.43E-03 -"ClCCN1CCCC1.[H]Cl",9.00E-01 -"CCCCCCCCCCCN",1.23E-03 -"C#CC(O)CCCC",1.57E-02 -"C1(C=O)=CC=C(OCC)C=C1",1.87E-01 -"O=C(C(C(C1C2)(C)C)(C2)C)C1Br",2.96E-01 -"CC(C)=CC1C(C)(C)C1C(=O)OCC2=COC(CC3=CC=CC=C3)=C2",1.82E-05 -"CCOP(=S)(OCC)SCSC(C)(C)C",4.61E-05 -"BrC(Br)C1=C(C(Br)Br)C=CC=C1",1.04E-03 -"C1=C(C(=O)C)C(Cl)=C(Cl)C(Cl)=C1",8.95E-03 -"C1(OC)=C(OC)C(OC)=CC=C1C(=O)C",9.47E-01 -"CCOC(=O)C(Cl)C(=O)OCC",4.88E-03 -"CCNCC1=CC=CC=C1",4.22E-01 -"ClC1=CC=CC=[N+]1C.[I-]",7.79E-01 -"C1=CC(Br)=CC=C1C(=O)C2=CC=CN=C2",7.78E-02 -"C1=CC=CC=C1C(=O)C2=CC=NC=C2",5.62E-01 -"CC1(C)CCC(C)(C)O1",1.31E+00 -"N1=C([N+]([O-])=O)C(O)=CC=C1",1.19E+00 -"C1(CC)=CC=CC(CC)=C1N(COC)C(=O)CCl",1.85E-02 -"NC1=CC=C(CCCCCCCC)C=C1",5.84E-04 -"CSC(C)=NOC(=O)NC",1.30E-02 -"N1=C(O)C=CC=C1Cl",1.65E+00 -"NC1=NN=C(C)C(C)=N1",7.67E+00 -"C1=CC([N+]([O-])=O)=CC([N+](=O)[O-])=C1OC2=CC=C(Br)C=C2", -"O=CC1=CC=C(N(CC)CC)C=C1O",2.77E-02 -"N1=C(C)C=CC=C1Cl",1.82E+00 -"C#CC(CCC(C)C)(C)O",3.49E-01 -"CC1=C(C)OC(C)=N1",4.04E+00 -"CC(=O)C(C)CN(C)C",6.58E-02 -"C1=CC([N+](=O)[O-])=CC=C1OC2=CC(C)=C(Cl)C=C2", -"C1=CC=C(Br)C=C1C(=O)N",4.63E-01 -"O=C(C(=NOC(=O)NC)SC)N(C)C",3.09E-02 -"NC1=C(C(C)C)C=CC=C1C(C)C",8.63E-02 -"[Na+].[N-]=[N+]=[N-]",8.40E-02 -"C[N+](C1=CC=CC=C1)(C)C.[O-]S(=O)(=O)OC",1.00E+00 -"ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl", -"CC(C)(O)C(F)(C(F)F)F",3.64E+00 -"CCC(N)C",3.76E+00 -"COCCCNCC1=CC(OC)=C(OC)C(OC)=C1",5.05E-01 -"BrCC1OCCCC1",1.15E+00 -"NC1=CC=C(CCCCCCCCCC)C=C1",2.66E-04 -"NC1=CC=C(OCCCCCC)C=C1",1.56E-02 -"C1([N+](=O)[O-])=CC(Cl)=CC=C1C(=O)OC",1.28E-01 -"C1(C=O)=C([N+](=O)[O-])C=CC(O)=C1",2.51E-01 -"O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N",1.21E-05 -"C1=CC=C(OC2=CC=CC=C2)C=C1COC(=O)C3C(C)(C)C3C=C(Cl)Cl",4.09E-05 -"CCSCCCCSCC",3.40E-02 -"CCCCCCCCOC1=CC=CC=C1NC(=O)C",1.71E-03 -"C1=CC(C(C)(C)C)=CC=C1C(=O)N",1.80E-01 -"CSCCCCCCSC",5.66E-02 -"CC(O)C#C",1.67E-01 -"C1(C)=C(C)C=CC=C1OP(=O)(OC2=C(C)C(C)=CC=C2)OC3=C(C)C(C)=CC=C3", -"C1C(=CC=C[N+]=1CC2C=CC=CC=2)S(=O)(=O)[O-]",9.67E+00 -"C1=CC(C(C)(C)C)=CC=C1OC2=CC=CC(C=O)=C2",1.45E-03 -"O=C(OC(C2=CC=CC(OC3=CC=CC=C3)=C2)C#N)[C@H](C1=CC=C(OC(F)F)C=C1)[C@H](C)C",4.21E-07 -"ClC1=CC=CC(Cl)=C1OP(=O)(OC2=C(Cl)C=CC=C2Cl)OC3=C(Cl)C=CC=C3Cl", -"C1=C(C=O)C=CC=C1OC2=CC(Cl)=C(Cl)C=C2",1.12E-03 -"[Na+].O.O.[O-]C1=C([N+]([O-])=O)C=C([N+]([O-])=O)C2=CC=CC=C12",1.45E-02 -"CC(C)(C)C1=CC=C(C=C)C=C1",3.06E-03 -"O=P(OCC)(SCCSCC)OCC",6.19E-02 -"ClCC1=CC(C=C)=CC=C1",2.03E-03 diff --git a/test/data/EPAFHM.mini.csv b/test/data/EPAFHM.mini.csv deleted file mode 100644 index c86cd33..0000000 --- a/test/data/EPAFHM.mini.csv +++ /dev/null @@ -1,21 +0,0 @@ -"STRUCTURE_SMILES","LC50_mmol" -"C1=CC(C=O)=CC(OC)=C1OCCCCCC",1.13E-02 -"C1(OC)=C([N+]([O-])=O)C(C=O)=CC(Br)=C1O",2.66E-01 -"CCCCCCCCOC(=O)C1=CC=CC(C(=O)OCCCCCCCC)=C1", -"C1=CC(Cl)=CC=C1OC2=C([N+](=O)[O-])C=CC=C2",7.69E-03 -"CC1=C(NC=O)C=CC=C1Cl",2.75E-01 -"CCCCOC(=O)C1=CC=CC(C(=O)OCCCC)=C1",3.23E-03 -"C(C1=CC=CC=C1)(C2=CC=CC=C2)(O)C#C",5.33E-02 -"CCCSCCSCCC",4.22E-02 -"CCCCCCCCOC(=O)C1=CC=C(C(=O)OCCCCCCCC)C=C1", -"OCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCOC(=O)C2=CC=CC=C2C(=O)OCCCCO", -"CCCSCCCCSCCC",1.45E-02 -"C1([N+](=O)[O-])=CC=C(C)C=C1OP(=O)(OC2=C([N+](=O)[O-])C=CC(C)=C2)OC3=C([N+]([O-])=O)C=CC(C)=C3", -"C1=C([N+]([O-])=O)C=CC=C1P(=O)(C2=CC([N+](=O)[O-])=CC=C2)C3=CC([N+](=O)[O-])=CC=C3", -"ClCCOC(=O)NC1CCCCC1",1.70E-01 -"O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC",2.08E+00 -"OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-]",5.92E-02 -"NC(=O)OCC",5.88E+01 -"[O-]C(C1=CC=CC=C1O)=O.[Na+]",1.25E+01 -"C1=CC=CC=C1C(=O)N",5.46E+00 -"CC[N+](CC)(CC)CC1(=CC=CC=C1).[Cl-]",7.07E-01 diff --git a/test/data/ISSCAN-multi.csv b/test/data/ISSCAN-multi.csv deleted file mode 100644 index b404683..0000000 --- a/test/data/ISSCAN-multi.csv +++ /dev/null @@ -1,59 +0,0 @@ -SMILES,ISSCAN -CC(CCl)Cl,1 -C(Br)(Br)Br,1 -C=C(C)CCl,1 -O=Cc1ccco1,1 -COC34(C(COC(N)=O)C=1C(=O)C(N)=C(C)C(=O)C=1N4(CC2NC23)),1 -CC(N)Cc1ccccc1.CC(N)Cc1ccccc1,1 -Cc1cc(ccc1(N))C(=C2C=CC(=N)C=C2)c3ccc(N)cc3,1 -Oc1ccc(cc1)c2ccccc2,1 -CC(C)C=O,1 -N#CC(C#N)=Cc1ccccc1Cl,1 -Nc1ccc(cc1(N))[N+](=O)[O-],2 -NC(CCC(=O)NNc1ccc(CO)cc1)C(O)=O,2 -c1ccc2c(c1)nc(s2)SSc4nc3ccccc3s4,2 -C=CC=O,2 -CC(=O)Nc3cccc2Cc1ccccc1c23,2 -Cc1cccc2cccnc12,2 -Cc1ccc2ncccc2(c1),2 -CBr,2 -Nc1cc(ccc1(C(=O)O))[N+](=O)[O-],2 -C1N2CN3CN1CN(C2)C3,2 -O=[N+]([O-])c2cccc1ccccc12,2 -Oc1cccc2cccnc12,2 -O=CC(=C(C(=O)O)Cl)Cl,2 -CC1CN(N=O)C(=O)NC1(=O),2 -O1C2C1C3C4C2C5C3C6(C4(C(C5(C6(Cl)Cl)Cl)Cl)Cl)Cl,2 -OCCNc1ccc(cc1[N+](=O)[O-])N(CCO)CCO,2 -Cc1cc(N)ccc1(N).OS(=O)(=O)O,2 -CC(O)CCl,2 -O=[N+]([O-])C(Cl)(Cl)Cl,2 -Cc1ccc(cc1)S(=O)(=O)NC(=O)NN2CCCCCC2,2 -c1cc2ccc3cccc4ccc(c1)c2c34,2 -CC(=O)Nc1ccc(cc1)C(=O)CCl,2 -FC(F)Cl,2 -CN(N=O)c1ccc(cc1)[N+](=O)[O-],2 -C=CC,2 -Oc4c(cc1cc(ccc1c4(N=Nc2ccc(c3ccccc23)S(=O)(=O)[O-]))S(=O)(=O)[O-])S(=O)(=O)[O-],0 -CC=NN(C)C=O,0 -Nc2ccc(N=Nc1ccccc1)c(N)n2,0 -Cc3cc(C)c(N=Nc1cc(c2ccccc2(c1(O)))S(=O)(=O)[O-])c(c3)S(=O)(=O)[O-],0 -[O-]c1ccccc1c2ccccc2,0 -NNC(N)=O,0 -CNNCc1ccc(cc1)C(=O)NC(C)C,0 -c1cc(c(cc1c2ccc(c(c2Cl)Cl)Cl)Cl)Cl,0 -CCN(Cc1cccc(c1)S(=O)(=O)[O-])c2ccc(cc2)C(=C3C=CC(C=C3)=[N+](CC)Cc4cccc(c4)S(=O)(=O)[O-])c5ccc(cc5)S(=O)(=O)[O-],0 -COC(=O)C(c1ccccc1)C2CCCCN2,0 -CCCCC(CC)COS(=O)(=O)[O-],0 -Nc1ccccc1,0 -Cc1cccc(N)c1,0 -CN(C)CCN(Cc1cccs1)c2ccccn2,0 -CN(C)CCOC(C)(c1ccccc1)c2ccccn2,0 -Cc1cc(C)c(cc1(C))N=Nc3c(O)c(cc2cc(ccc23)S(=O)(=O)[O-])S(=O)(=O)[O-],0 -Cc1ccccc1(N),0 -CCC1(C(=O)N=C([O-])NC1(=O))c2ccccc2,0 -Nc5cc(cc6cc(c(N=Nc1ccc(cc1(O))c4ccc(N=Nc2c(O)c3c(N)cc(cc3(cc2S(=O)(=O)[O-]))S(=O)(=O)[O-])c(O)[c-]4)c(O)c56)S(=O)(=O)[O-])S(=O)(=O)[O-],0 -O=C1[N-]S(=O)(=O)c2ccccc12,0 -CN(C)c1ccc(cc1)C(c2ccc(cc2)N(C)C)=C3C=CC(C=C3)=[N+](C)C,0 -C13(C4(C2(C5(C(C1(C2(Cl)Cl)Cl)(C3(C(C45Cl)(Cl)Cl)Cl)Cl)Cl)Cl)Cl)Cl,0 -CCOCCc1c(nc(N)[n+]2[nH]cnc12)c3ccccc3,0 diff --git a/test/data/cpdb_100.csv b/test/data/cpdb_100.csv deleted file mode 100644 index e691ccc..0000000 --- a/test/data/cpdb_100.csv +++ /dev/null @@ -1,101 +0,0 @@ -"STRUCTURE_Parent_SMILES ","STRUCTURE_InChI ","ActivityOutcome_CPDBAS_MultiCellCall ","STRUCTURE_Shown ","TestSubstance_ChemicalName ","ActivityScore_CPDBAS_Rat ","TD50_Hamster_mg mg","TD50_Rat_mmol mmol","ActivityOutcome_CPDBAS_SingleCellCall ","TD50_Rat_Note ","STRUCTURE_MolecularWeight ","TD50_Dog_mg mg","TargetSites_Mouse_BothSexes ","DSSTox_CID ","STRUCTURE_ChemicalName_IUPAC ","NTP_TechnicalReport ","TD50_Cynomolgus_mg mg","ActivityOutcome_CPDBAS_Rat ","ActivityOutcome_CPDBAS_Mutagenicity ","ActivityScore_CPDBAS_Mouse ","STRUCTURE_InChIKey ","ChemicalNote ","ActivityOutcome_CPDBAS_MultiCellCall_Details ","TestSubstance_CASRN ","DSSTox_RID ","TargetSites_Mouse_Male ","TD50_Dog_Primates_Note ","STRUCTURE_Formula ","TD50_Rat_mg mg","TestSubstance_Description ","ActivityScore_CPDBAS_Hamster ","Endpoint ","TargetSites_Cynomolgus ","STRUCTURE_TestedForm_DefinedOrganic ","StudyType ","Note_CPDBAS ","TargetSites_Rhesus ","DSSTox_FileID ","TD50_Mouse_mmol mmol","ActivityOutcome_CPDBAS_Dog_Primates ","ChemicalPage_URL ","TD50_Mouse_Note ","ActivityOutcome_CPDBAS_Hamster ","TD50_Mouse_mg mg","STRUCTURE_ChemicalType ","TargetSites_Rat_Male ","TargetSites_Hamster_Female ","TargetSites_Dog ","TargetSites_Mouse_Female ","TargetSites_Hamster_BothSexes ","STRUCTURE_SMILES ","ActivityOutcome_CPDBAS_Mouse ","TargetSites_Rat_BothSexes ","TargetSites_Hamster_Male ","TD50_Hamster_mmol mmol","TD50_Hamster_Note ","Species ","TargetSites_Rat_Female ","DSSTox_Generic_SID ","TD50_Rhesus_mg mg" -"NC1C=CC2=C(N=1)NC3=CC=CC=C23","InChI=1/C11H9N3/c12-10-6-5-8-7-3-1-2-4-9(7)13-11(8)14-10/h1-6H,(H3,12,13,14)/f/h13H,12H2","active","tested chemical","A-alpha-C",blank,blank,blank,"active","blank",183.2122039794922,blank,"blank",1.0,"9H-pyrido[2,3-b]indol-2-amine","blank",blank,"blank","active",35.0,"FJTNLJLPLJDTRM-DXMPFREMCP","blank","multisite active; multisex active","26148-68-5",20001.0,"liver; vascular system","blank","C11H9N3",blank,"single chemical compound",blank,"TD50; Tumor Target Sites","blank","parent","Carcinogenicity","blank","blank","1_CPDBAS_v5d",0.2720000147819519,"blank","http://potency.berkeley.edu/chempages/A-alpha-C.html","TD50 is harmonic mean of more than one positive test","blank",49.79999923706055,"defined organic","blank","blank","blank","liver; vascular system","blank","NC1C=CC2=C(N=1)NC3=CC=CC=C23","active","blank","blank",blank,"blank","mouse","blank",20001.0,blank -"O=S(NC1=O)(OC(C)=C1)=O","InChI=1/C4H5NO4S.K/c1-3-2-4(6)5-10(7,8)9-3;/h2H,1H3,(H,5,6);/q;+1/p-1/fC4H4NO4S.K/q-1;m","inactive","tested chemical","Acesulfame-K",,,,"inactive","",201.24220275878906,,"",10606.0,"potassium 6-methyl-4-oxo-4H-1,2,3-oxathiazin-3-ide 2,2-dioxide","",,"","",0.0,"WBZFUFAFFUEMEI-COHKJUPYCC","parent [33665-90-6]","multisex inactive","55589-62-3",40770.0,"no positive results","","C4H4KNO4S",,"single chemical compound",,"TD50; Tumor Target Sites","","salt K","Carcinogenicity","Mouse added v5a; chemical added v5a","","2_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACESULFAME-K.html","no positive results","",,"defined organic","","","","no positive results","","O=S([N-]C1=O)(OC(C)=C1)=O.[K+]","inactive","","",,"","mouse","",30606.0, -"CC=O","InChI=1/C2H4O/c1-2-3/h2H,1H3","active","tested chemical","Acetaldehyde",20.0,565.0,3.4700000286102295,"active","TD50 is harmonic mean of more than one positive test",44.0526008605957,,"",2.0,"acetaldehyde","",,"active","inactive",,"IKHGUXGNUITLKF-UHFFFAOYAB","","multisite active; multisex active; multispecies active","75-07-0",20002.0,"","","C2H4O",153.0,"single chemical compound",1.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","3_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETALDEHYDE.html","","active",,"defined organic","nasal cavity","oral cavity","","","","CC=O","","","nasal cavity; oral cavity",12.800000190734863,"TD50 is harmonic mean of more than one positive test","rat; hamster","nasal cavity",39224.0, -"CC=NN(C)C=O","InChI=1/C4H8N2O/c1-3-5-6(2)4-7/h3-4H,1-2H3/b5-3+","active","tested chemical","Acetaldehyde methylformylhydrazone",,,,"active","",100.12000274658203,,"",3.0,"N'-[(1E)-ethylidene]-N-methylformic hydrazide","",,"","inactive",46.0,"IMAGWKUTFZRWSB-HWKANZROBR","","multisite active; multisex active","16568-02-8",20003.0,"lung; preputial gland","","C4H8N2O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","4_CPDBAS_v5d",0.025100000202655792,"","http://potency.berkeley.edu/chempages/ACETALDEHYDE%20METHYLFORMYLHYDRAZONE.html","TD50 is harmonic mean of more than one positive test","",2.509999990463257,"defined organic","","","","clitoral gland; lung; stomach","","CC=NN(C)C=O","active","","",,"","mouse","",39225.0, -"CC=NO","InChI=1/C2H5NO/c1-2-3-4/h2,4H,1H3/b3-2+","","tested chemical","Acetaldoxime",0.0,,,"inactive","no positive results",59.06719970703125,,"",4.0,"(1E)-acetaldehyde oxime","",,"inactive","inactive",,"FZENGILVLUJGJX-NSCUHMNNBP","","","107-29-9",20004.0,"","","C2H5NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","5_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETALDOXIME.html","","",,"defined organic","no positive results","","","","","CC=NO","","","",,"","rat","",20004.0, -"CC(=O)N","InChI=1/C2H5NO/c1-2(3)4/h1H3,(H2,3,4)/f/h3H2","active","tested chemical","Acetamide",21.0,,3.049999952316284,"active","TD50 is harmonic mean of more than one positive test",59.06719970703125,,"",5.0,"acetamide","",,"active","inactive",9.0,"DLFVBJFMPXGRIB-ZZOWFUDICC","","multisite active; multisex active; multispecies active","60-35-5",20005.0,"hematopoietic system","","C2H5NO",180.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","6_CPDBAS_v5d",51.0,"","http://potency.berkeley.edu/chempages/ACETAMIDE.html","","",3010.0,"defined organic","liver","","","no positive results","","CC(=O)N","active","","",,"","rat; mouse","liver",20005.0, -"C1(=CC=C(C=C1)O)NC(C)=O","InChI=1/C8H9NO2/c1-6(10)9-7-2-4-8(11)5-3-7/h2-5,11H,1H3,(H,9,10)/f/h9H","active","tested chemical","Acetaminophen",20.0,,3.2699999809265137,"active","TD50 is harmonic mean of more than one positive test",151.16259765625,,"",6.0,"N-(4-hydroxyphenyl)acetamide","TR 394; final call in CPDB differs due to additional data",,"active","inactive",17.0,"RZVAJINKPMORJF-BGGKNDAXCW","","multisite active; multisex active; multispecies active","103-90-2",20006.0,"liver","","C8H9NO2",495.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","7_CPDBAS_v5d",10.699999809265137,"","http://potency.berkeley.edu/chempages/ACETAMINOPHEN.html","TD50 is harmonic mean of more than one positive test","",1620.0,"defined organic","liver; urinary bladder","","","liver","","C1(=CC=C(C=C1)O)NC(C)=O","active","","",,"","rat; mouse","liver; urinary bladder",20006.0, -"O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2","InChI=1/C15H20N2O4S/c1-11(18)12-7-9-14(10-8-12)22(20,21)17-15(19)16-13-5-3-2-4-6-13/h7-10,13H,2-6H2,1H3,(H2,16,17,19)/f/h16-17H","inactive","tested chemical","Acetohexamide",0.0,,,"inactive","no positive results",324.3952941894531,,"",7.0,"4-acetyl-N-[(cyclohexylamino)carbonyl]benzenesulfonamide","TR 050",,"inactive","inactive",0.0,"VGZSUPCWNCWDAN-XQMQJMAZCC","","multisex inactive; multispecies inactive","968-81-0",20007.0,"no positive results","","C15H20N2O4S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","8_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETOHEXAMIDE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2","inactive","","",,"","rat; mouse","no positive results",20007.0, -"C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-]","InChI=1/C10H10N4O3S/c1-6(2)12-13-10-11-5-8(18-10)7-3-4-9(17-7)14(15)16/h3-5H,1-2H3,(H,11,13)/f/h13H","","tested chemical","Acetone[4-(5-nitro-2-furyl)-2-thiazolyl] hydrazone",43.0,,0.022700000554323196,"active","",266.27398681640625,,"",8.0,"propan-2-one [5-(5-nitrofuran-2-yl)-1,3-thiazol-2-yl]hydrazone","",,"active","",,"CUWVNOSSZYUJAE-NDKGDYFDCK","","","18523-69-8",20008.0,"","","C10H10N4O3S",6.050000190734863,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","9_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETONE[4-(5-NITRO-2-FURYL)-2-THIAZOLYL]HYDRAZONE.html","","",,"defined organic","","","","","","C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-]","","","",,"","rat","stomach",20008.0, -"CC#N","InChI=1/C2H3N/c1-2-3/h1H3","inactive","tested chemical","Acetonitrile ",0.0,,,"inactive","no positive results",41.05189895629883,,"",9.0,"acetonitrile","TR 447",,"inactive","inactive",0.0,"WEVYAHXRMPXWCK-UHFFFAOYAJ","","multisex inactive; multispecies inactive","75-05-8",20009.0,"no positive results","","C2H3N",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","10_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETONITRILE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","CC#N","inactive","","",,"","rat; mouse","no positive results",20009.0, -"CC(=NO)C","InChI=1/C3H7NO/c1-3(2)4-5/h5H,1-2H3","","tested chemical","Acetoxime",34.0,,0.16599999368190765,"active","",73.09380340576172,,"",10.0,"propan-2-one oxime","",,"active","",,"PXAJQJMDEXJWFB-UHFFFAOYAK","","","127-06-0",20010.0,"","","C3H7NO",12.100000381469727,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","11_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETOXIME.html","","",,"defined organic","liver","","","","","CC(=NO)C","","","",,"","rat","no positive results",20010.0, -"O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C","InChI=1/C12H12O4/c1-3-10(16-8(2)13)9-4-5-11-12(6-9)15-7-14-11/h3-6,10H,1,7H2,2H3","","tested chemical","1'-Acetoxysafrole",35.0,,0.11400000005960464,"active","TD50 is harmonic mean of more than one positive test",220.22129821777344,,"",11.0,"1-(1,3-benzodioxol-5-yl)prop-2-en-1-yl acetate","",,"active","active",0.0,"TXUCQVJZBXYDKH-UHFFFAOYAY","","","34627-78-6",20011.0,"no positive results","","C12H12O4",25.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","12_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1'-ACETOXYSAFROLE.html","no positive results","",,"defined organic","stomach","","","","","O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C","inactive","","",,"","rat; mouse","",39226.0, -"N(NC(C)=O)C1=CC=C(C=C1)CO","InChI=1/C9H12N2O2/c1-7(13)10-11-9-4-2-8(6-12)3-5-9/h2-5,11-12H,6H2,1H3,(H,10,13)/f/h10H","active","tested chemical","N'-Acetyl-4-(hydroxymethyl) phenylhydrazine",,,,"active","",180.20599365234375,,"",12.0,"N'-[4-(hydroxymethyl)phenyl]acetohydrazide","",,"","",27.0,"UFFJUAYKLIGSJF-KZFATGLACR","","multisite active; multisex active","65734-38-5",20012.0,"lung; vascular system","","C9H12N2O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","13_CPDBAS_v5d",1.340000033378601,"","http://potency.berkeley.edu/chempages/N'-ACETYL-4-(HYDROXYMETHYL)PHENYLHYDRAZINE.html","TD50 is harmonic mean of more than one positive test","",241.0,"defined organic","","","","lung; vascular system","","N(NC(C)=O)C1=CC=C(C=C1)CO","active","","",,"","mouse","",20012.0, -"N(NC(C)=O)C(C1=CC=NC=C1)=O","InChI=1/C8H9N3O2/c1-6(12)10-11-8(13)7-2-4-9-5-3-7/h2-5H,1H3,(H,10,12)(H,11,13)/f/h10-11H","active","tested chemical","1-Acetyl-2-isonicotinoylhydrazine",,,,"active","",179.17799377441406,,"",13.0,"N'-acetylpyridine-4-carbohydrazide","",,"","",25.0,"CVBGNAKQQUWBQV-PZWAIHAUCF","","multisex active","1078-38-2",20013.0,"lung","","C8H9N3O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","14_CPDBAS_v5d",1.840000033378601,"","http://potency.berkeley.edu/chempages/1-ACETYL-2-ISONICOTINOYLHYDRAZINE.html","TD50 is harmonic mean of more than one positive test","",330.0,"defined organic","","","","lung","","N(NC(C)=O)C(C1=CC=NC=C1)=O","active","","",,"","mouse","",20013.0, -"O=C1C(C(=O)OC(=C1)C)C(=O)C","InChI=1/C8H8O4/c1-4-3-6(10)7(5(2)9)8(11)12-4/h3,7H,1-2H3","inactive","tested chemical","3-Acetyl-6-methyl-2,4-pyrandione",,,,"inactive","",168.1488037109375,,"",14.0,"3-acetyl-6-methyl-2H-pyran-2,4(3H)-dione","",,"","",0.0,"PGRHXDWITVMQBC-UHFFFAOYAH","tautomers","multisex inactive","520-45-6",20014.0,"no positive results","","C8H8O4",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","15_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/3-ACETYL-6-METHYL-2,4-PYRANDIONE.html","no positive results","",,"defined organic","","","","no positive results","","O=C1C(C(=O)OC(=C1)C)C(=O)C","inactive","","",,"","mouse","",20014.0, -"C1(NNC(C)=O)=CC=CC=C1","InChI=1/C8H10N2O/c1-7(11)9-10-8-5-3-2-4-6-8/h2-6,10H,1H3,(H,9,11)/f/h9H","active","tested chemical","1-Acetyl-2-phenylhydrazine",,,,"active","",150.17779541015625,,"",15.0,"N'-phenylacetohydrazide","",,"","active",34.0,"UICBCXONCUFSOI-BGGKNDAXCP","","multisex active","114-83-0",20015.0,"vascular system","","C8H10N2O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","16_CPDBAS_v5d",0.3409999907016754,"","http://potency.berkeley.edu/chempages/1-ACETYL-2-PHENYLHYDRAZINE.html","TD50 is harmonic mean of more than one positive test","",51.20000076293945,"defined organic","","","","vascular system","","C1(NNC(C)=O)=CC=CC=C1","active","","",,"","mouse","",20015.0, -"CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2","InChI=1/C14H13NO/c1-11(16)15-14-9-7-13(8-10-14)12-5-3-2-4-6-12/h2-10H,1H3,(H,15,16)/f/h15H","","tested chemical","4-Acetylaminobiphenyl",49.0,,0.00559999980032444,"active","",211.26280212402344,,"",16.0,"N-biphenyl-4-ylacetamide","",,"active","",,"SVLDILRDQOVJED-YAQRNVERCM","","","4075-79-0",20016.0,"","","C14H13NO",1.1799999475479126,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","17_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-ACETYLAMINOBIPHENYL.html","","",,"defined organic","","","","","","CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2","","","",,"","rat","mammary gland",39243.0, -"CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1","InChI=1/C15H13NO/c1-10(17)16-15-8-4-7-13-12-6-3-2-5-11(12)9-14(13)15/h2-8H,9H2,1H3,(H,16,17)/f/h16H","","tested chemical","1-Acetylaminofluorene",0.0,,,"inactive","no positive results",223.2738037109375,,"",17.0,"N-9H-fluoren-1-ylacetamide","",,"inactive","",,"POECHIXSIXBYKI-WYUMXYHSCQ","","","28314-03-6",20017.0,"","","C15H13NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","18_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-ACETYLAMINOFLUORENE.html","","",,"defined organic","","","","","","CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1","","","",,"","rat","no positive results",20017.0, -"C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O","InChI=1/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17)/f/h16H","active","tested chemical","2-Acetylaminofluorene",49.0,17.399999618530273,0.005499999970197678,"active","TD50 is harmonic mean of more than one positive test",223.26980590820312,,"",18.0,"N-9H-fluoren-2-ylacetamide","",,"active","active",45.0,"CZIHNRWJTSTCEX-WYUMXYHSCF","","multisite active; multisex active; multispecies active","53-96-3",20018.0,"liver; urinary bladder","no positive results for Rhesus","C15H13NO",1.2200000286102295,"single chemical compound",53.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","no positive results","19_CPDBAS_v5d",0.03400000184774399,"inactive","http://potency.berkeley.edu/chempages/2-ACETYLAMINOFLUORENE.html","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results","active",7.590000152587891,"defined organic","liver; mammary gland; skin","no positive results","","liver; urinary bladder","","C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O","active","","liver",0.0778999999165535,"","rat; mouse; hamster; rhesus","liver; mammary gland; skin",39227.0, -"C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O","InChI=1/C15H13NO/c1-10(17)16-14-8-4-6-12-9-11-5-2-3-7-13(11)15(12)14/h2-8H,9H2,1H3,(H,16,17)/f/h16H","","tested chemical","4-Acetylaminofluorene",0.0,,,"inactive","no positive results",223.26980590820312,,"",19.0,"N-9H-fluoren-4-ylacetamide","",,"inactive","active",,"PHPWISAFHNEMSR-WYUMXYHSCU","","","28322-02-3",20019.0,"","","C15H13NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","20_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-ACETYLAMINOFLUORENE.html","","",,"defined organic","","","","","","C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O","","","",,"","rat","no positive results",20019.0, -"O=C(O)Cc1ccc(cc1)NC(C)=O","InChI=1/C10H11NO3/c1-7(12)11-9-4-2-8(3-5-9)6-10(13)14/h2-5H,6H2,1H3,(H,11,12)(H,13,14)/f/h11,13H","inactive","tested chemical","4-Acetylaminophenylacetic acid",0.0,,,"inactive","no positive results",193.19920349121094,,"",20.0,"[4-(acetylamino)phenyl]acetic acid","",,"inactive","",0.0,"MROJXXOCABQVEF-KZZMUEETCP","","multisex inactive; multispecies inactive","18699-02-0",20020.0,"no positive results","","C10H11NO3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a; Mouse added v2a","","21_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-ACETYLAMINOPHENYLACETIC%20ACID.html","no positive results","",,"defined organic","no positive results","","","no positive results","","O=C(O)Cc1ccc(cc1)NC(C)=O","inactive","","",,"","rat; mouse","no positive results",20020.0, -"CC(=O)N[C@@H](CS)C(=O)O","InChI=1/C5H9NO3S/c1-3(7)6-4(2-10)5(8)9/h4,10H,2H2,1H3,(H,6,7)(H,8,9)/t4-/m0/s1/f/h6,8H","","tested chemical","N-acetylcysteine",0.0,,,"inactive","no positive results",163.1949005126953,,"",21.0,"N-acetyl-L-cysteine","",,"inactive","",,"PWKSKIMOESPYIA-JVBVHTJODB","stereochem","","616-91-1",20021.0,"","","C5H9NO3S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a","","22_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/N-ACETYLCYSTEINE.html","","",,"defined organic","no positive results","","","","","CC(=O)N[C@@H](CS)C(=O)O","","","",,"","rat","",20021.0, -"OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-]","InChI=1/C14H7ClF3NO5/c15-10-5-7(14(16,17)18)1-4-12(10)24-8-2-3-11(19(22)23)9(6-8)13(20)21/h1-6H,(H,20,21)/f/h20H","active","tested chemical","Acifluorfen",,,,"active","",361.65728759765625,,"",22.0,"5-{[2-chloro-4-(trifluoromethyl)phenyl]oxy}-2-nitrobenzoic acid","",,"","",33.0,"NUFNQYOELLVIPL-UYBDAZJACV","","multisite active; multisex active","50594-66-6",20022.0,"liver; stomach","","C14H7ClF3NO5",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","23_CPDBAS_v5d",0.38999998569488525,"","http://potency.berkeley.edu/chempages/ACIFLUORFEN.html","TD50 is harmonic mean of more than one positive test","",141.0,"defined organic","","","","liver; stomach","","OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-]","active","","",,"","mouse","",20022.0, -"C=CC=O","InChI=1/C3H4O/c1-2-3-4/h2-3H,1H2","inactive","tested chemical","Acrolein ",0.0,,,"inactive","no positive results",56.06330108642578,,"",23.0,"acrylaldehyde","",,"inactive","active",0.0,"HGINCPLSRVDWNT-UHFFFAOYAQ","","multisex inactive; multispecies inactive","107-02-8",20023.0,"no positive results","","C3H4O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","24_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACROLEIN.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C=CC=O","inactive","","",,"","rat; mouse","no positive results",20023.0, -"C=CC(OCC)OCC","InChI=1/C7H14O2/c1-4-7(8-5-2)9-6-3/h4,7H,1,5-6H2,2-3H3","inactive","tested chemical","Acrolein diethylacetal",0.0,,,"inactive","no positive results",130.1864013671875,,"",24.0,"3,3-bis(ethyloxy)prop-1-ene","",,"inactive","",,"MCIPQLOKVXSHTD-UHFFFAOYAI","","multisex inactive","3054-95-3",20024.0,"","","C7H14O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","25_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACROLEIN%20DIETHYLACETAL.html","","",,"defined organic","no positive results","","","","","C=CC(OCC)OCC","","","",,"","rat","no positive results",20024.0, -"C=C/C=N/O","InChI=1/C3H5NO/c1-2-3-4-5/h2-3,5H,1H2/b4-3+","inactive","tested chemical","Acrolein oxime",0.0,,,"inactive","no positive results",71.07859802246094,,"",25.0,"(1E)-prop-2-enal oxime","",,"inactive","",,"KMNIXISXZFPRDC-ONEGZZNKBI","","multisex inactive","5314-33-0",20025.0,"","","C3H5NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","26_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACROLEIN%20OXIME.html","","",,"defined organic","no positive results","","","","","C=C/C=N/O","","","",,"","rat","no positive results",20025.0, -"CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O","InChI=1/C20H19NO3/c1-20(2)10-9-13-15(24-20)11-16(23-4)17-18(13)21(3)14-8-6-5-7-12(14)19(17)22/h5-11H,1-4H3","active","tested chemical","Acronycine",55.0,,0.0015999999595806003,"active","positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test",321.36981201171875,,"",26.0,"3,3,12-trimethyl-6-(methyloxy)-3,12-dihydro-7H-pyrano[2,3-c]acridin-7-one","TR 49",,"active","",0.0,"SMPZPKRDRQOOHT-UHFFFAOYAD","","multisite active; multisex active","7008-42-6",20026.0,"NTP bioassay inadequate","","C20H19NO3",0.5049999952316284,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","ActivityOutcome_CPDBAS_Mouse modified v5d","","27_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACRONYCINE.html","only experiment is NCI NTP bioassay inadequate","",,"defined organic","bone; peritoneal cavity","","","NTP bioassay inadequate","","CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O","unspecified","","",,"","rat; mouse","mammary gland; peritoneal cavity",20026.0, -"NC(=O)C=C","InChI=1/C3H5NO/c1-2-3(4)5/h2H,1H2,(H2,4,5)/f/h4H2","active","tested chemical","Acrylamide ",39.0,,0.052799999713897705,"active","TD50 is harmonic mean of more than one positive test",71.0779037475586,,"",27.0,"acrylamide","",,"active","inactive",,"HRPVXLWXLXDGHG-LGEMBHMGCJ","","multisite active; multisex active","79-06-1",20027.0,"","","C3H5NO",3.75,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat modified v3a","","28_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACRYLAMIDE.html","","",,"defined organic","nervous system; peritoneal cavity; thyroid gland","","","","","NC(=O)C=C","","","",,"","rat","clitoral gland; mammary gland; nervous system; oral cavity; thyroid gland; uterus",20027.0, -"OC(=O)C=C","InChI=1/C3H4O2/c1-2-3(4)5/h2H,1H2,(H,4,5)/f/h4H","inactive","tested chemical","Acrylic acid",0.0,,,"inactive","no positive results",72.06269836425781,,"",28.0,"acrylic acid","",,"inactive","inactive",,"NIXOWILDQLNWCW-JLSKMEETCA","","multisex inactive","79-10-7",20028.0,"","","C3H4O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","29_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACRYLIC%20ACID.html","","",,"defined organic","no positive results","","","","","OC(=O)C=C","","","",,"","rat","no positive results",39229.0, -"C=CC#N","InChI=1/C3H3N/c1-2-3-4/h2H,1H2","active","tested chemical","Acrylonitrile ",31.0,,0.3179999887943268,"active","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results",53.062599182128906,,"",29.0,"acrylonitrile","",,"active","active",39.0,"NLHHRLWOUZZQLW-UHFFFAOYAG","","multisite active; multisex active","107-13-1",20029.0,"harderian gland; stomach","","C3H3N",16.899999618530273,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Mouse added v5a","","30_CPDBAS_v5d",0.11900000274181366,"","http://potency.berkeley.edu/chempages/ACRYLONITRILE.html","TD50 is harmonic mean of more than one positive test","",6.320000171661377,"defined organic","ear Zymbals gland; nervous system; oral cavity; small intestine; stomach","","","harderian gland; stomach","","C=CC#N","active","","",,"","rat; mouse","ear Zymbals gland; mammary gland; nasal cavity; nervous system; oral cavity; small intestine; stomach",20029.0, -"O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N","InChI=1/C63H88N12O16/c1-17-31(8)44-61(86)75-25-19-21-38(75)59(84)71(14)27-40(77)73(16)50(30(6)7)63(88)90-35(12)46(57(82)67-44)69-55(80)41-42(64)51(78)33(10)53-48(41)65-47-36(23-22-32(9)52(47)91-53)54(79)68-45-34(11)89-62(87)49(29(4)5)72(15)39(76)26-70(13)58(83)37-20-18-24-74(37)60(85)43(28(2)3)66-56(45)81/h22-23,28-31,34-35,37-38,43-46,49-50H,17-21,24-27,64H2,1-16H3,(H,66,81)(H,67,82)(H,68,79)(H,69,80)/t31-,34+,35+,37-,38-,43+,44+,45-,46-,49-,50-/m0/s1/f/h66-69H","","representative component in mixture","Actinomycin C",0.0,,,"inactive","no positive results",1269.443603515625,,"",30.0,"2-amino-4,6-dimethyl-3-oxo-N~9~-[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-N~1~-{(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6-(1-methylethyl)","",,"inactive","",,"QCXJFISCRQIYID-IFORFJDKDU","mixture of actinomycin C1 [50-76-0] (10%), actinomycin C2 [2612-14-8] (45%), and actinomycin C3 [6156-47-4] (45%), structure shown C2, stereochem","","8052-16-2",20030.0,"","","C63H88N12O16",,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","31_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACTINOMYCIN%20C.html","","",,"defined organic","no positive results","","","","","O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N","","","",,"","rat","",20030.0, -"C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C","InChI=1/C62H86N12O16/c1-27(2)42-59(84)73-23-17-19-36(73)57(82)69(13)25-38(75)71(15)48(29(5)6)61(86)88-33(11)44(55(80)65-42)67-53(78)35-22-21-31(9)51-46(35)64-47-40(41(63)50(77)32(10)52(47)90-51)54(79)68-45-34(12)89-62(87)49(30(7)8)72(16)39(76)26-70(14)58(83)37-20-18-24-74(37)60(85)43(28(3)4)66-56(45)81/h21-22,27-30,33-34,36-37,42-45,48-49H,17-20,23-26,63H2,1-16H3,(H,65,80)(H,66,81)(H,67,78)(H,68,79)/t33-,34-,36+,37+,42-,43-,44+,45+,48+,49+/m1/s1/f/h65-68H","active","tested chemical","Actinomycin D",88.0,,0.0,"active","positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test",1255.4169921875,,"",31.0,"2-amino-4,6-dimethyl-3-oxo-N,N'-bis[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-3H-phenoxazine-1,9-dicarboxamide","",,"active","inactive",,"RJURFGZVJUQBHK-HQANWYOLDQ","stereochem","multisex active","50-76-0",20031.0,"","","C62H86N12O16",0.0010999999940395355,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat_Note modified v5a","","32_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACTINOMYCIN%20D.html","","",,"defined organic","peritoneal cavity","","","","","C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C","","","",,"","rat","peritoneal cavity",20031.0, -"NC(=O)CCCCC(=O)N","InChI=1/C6H12N2O2/c7-5(9)3-1-2-4-6(8)10/h1-4H2,(H2,7,9)(H2,8,10)/f/h7-8H2","inactive","tested chemical","Adipamide",0.0,,,"inactive","no positive results",144.1717071533203,,"",32.0,"hexanediamide","",,"inactive","inactive",0.0,"GVNWZKBFMFUVNX-UNXFWZPKCL","","multisex inactive; multispecies inactive","628-94-4",20032.0,"no positive results","","C6H12N2O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","33_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ADIPAMIDE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","NC(=O)CCCCC(=O)N","inactive","","",,"","rat; mouse","no positive results",20032.0, -"O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1","InChI=1/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14)/b8-6-/f/h12H2","active","tested chemical","AF-2",35.0,164.0,0.11800000071525574,"active","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results",248.1916046142578,,"",33.0,"(2Z)-2-(furan-2-yl)-3-(5-nitrofuran-2-yl)prop-2-enamide","",,"active","active",31.0,"LYAHJFZLDZDIOH-SDXKRDFODJ","stereochem","multisite active; multisex active; multispecies active","3688-53-7",20033.0,"stomach","","C11H8N2O5",29.399999618530273,"single chemical compound",30.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","structure modified v5b","","34_CPDBAS_v5d",0.527999997138977,"","http://potency.berkeley.edu/chempages/AF-2.html","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results","active",131.0,"defined organic","mammary gland","stomach","","stomach","","O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1","active","","esophagus; stomach",0.6610000133514404,"TD50 is harmonic mean of more than one positive test","rat; mouse; hamster","mammary gland",20033.0, -"O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC","InChI=1/C17H14O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8-9,17-18H,2-3H2,1H3/t8-,9+,17-/m0/s1","","tested chemical","Aflatoxicol",78.0,,0.0,"active","",314.29400634765625,,"",34.0,"(1R,6aS,9aS)-1-hydroxy-4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromen-11(1H)-one","",,"active","active",,"WYIWLDSPNDMZIT-BTKFHORUBM","stereochem","","29611-03-8",20034.0,"","","C17H14O6",0.0024999999441206455,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","35_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AFLATOXICOL.html","","",,"defined organic","liver","","","","","O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC","","","",,"","rat","",20034.0, -"C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC","InChI=1/C17H12O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8,17H,2-3H2,1H3","active","tested chemical","Aflatoxin B1",77.0,,0.0,"active","TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable; greater than ten-fold variation among TD50 values for positive results",312.2735900878906,,"",35.0,"4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromene-1,11-dione","",0.020099999383091927,"active","active",0.0,"OQIQSTLJSLGHID-UHFFFAOYAB","","multisite active; multisex active; multispecies active","1162-65-8",20035.0,"no positive results","Tree Shrew (TD50=0.0269; Target Sites=liver)","C17H12O6",0.0031999999191612005,"single chemical compound",,"TD50; Tumor Target Sites","gall bladder; liver; vascular system","parent","Carcinogenicity","TD50_Rat_Note modified v5a","gall bladder; liver; vascular system","36_CPDBAS_v5d",,"active","http://potency.berkeley.edu/chempages/AFLATOXIN%20B1.html","no positive results","",,"defined organic","kidney; large intestine; liver","","","no positive results","","C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC","inactive","","",,"","rat; mouse; rhesus; cynomolgus; tree shrew","large intestine; liver",20035.0,0.008200000040233135 -"O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1","InChI=1/C17H12O7/c1-20-9-6-10-12(8-3-5-22-17(8)23-10)14-11(9)7-2-4-21-15(18)13(7)16(19)24-14/h3,5-6,8,17H,2,4H2,1H3","active","representative component in mixture","Aflatoxin, crude",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",328.27301025390625,,"",36.0,"5-(methyloxy)-3,4,7a,10a-tetrahydro-1H,12H-furo[3',2':4,5]furo[2,3-h]pyrano[3,4-c]chromene-1,12-dione","",,"active","",50.0,"XWIYFDMXXLINPU-UHFFFAOYAD","mixture of aflatoxins, structure shown G1 [1165-39-5]","multisite active; multispecies active","1402-68-2",20036.0,"hematopoietic system","","C17H12O7",0.003000000026077032,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture","","37_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AFLATOXIN,%20CRUDE.html","","",0.34299999475479126,"defined organic","liver","","","","","O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1","active","","",,"","rat; mouse","",20036.0, -"","InChI=1//","inactive","no structure","Agar",0.0,,,"inactive","no positive results",,,"",,"","TR 230",,"inactive","",0.0,"MOSFIJXAXDLOML-UHFFFAOYAM","","multisex inactive; multispecies inactive","9002-18-0",20037.0,"no positive results","","",,"mixture or formulation",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","38_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AGAR.html","no positive results","",,"no structure","no positive results","","","no positive results","","","inactive","","",,"","rat; mouse","no positive results",20037.0, -"C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl","InChI=1/C11H11ClO3/c1-2-5-15-10-4-3-8(6-9(10)12)7-11(13)14/h2-4,6H,1,5,7H2,(H,13,14)/f/h13H","inactive","tested chemical","Alclofenac",0.0,,,"inactive","no positive results",226.6562042236328,,"",38.0,"[3-chloro-4-(prop-2-en-1-yloxy)phenyl]acetic acid","",,"inactive","",,"ARHWPKZXBHOEEE-NDKGDYFDCL","","multisex inactive","22131-79-9",20038.0,"","","C11H11ClO3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a","","39_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALCLOFENAC.html","","",,"defined organic","no positive results","","","","","C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl","","","",,"","rat","no positive results",20038.0, -"CC(C=NOC(=O)NC)(SC)C","InChI=1/C7H14N2O2S/c1-7(2,12-4)5-9-11-6(10)8-3/h5H,1-4H3,(H,8,10)/b9-5+/f/h8H","inactive","tested chemical","Aldicarb",0.0,,,"inactive","no positive results",190.2633056640625,,"",39.0,"(1E)-2-methyl-2-(methylthio)propanal O-[(methylamino)carbonyl]oxime","TR 136",,"inactive","inactive",0.0,"QGLZXHRNAYXIBU-RVKZGWQMDN","","multisex inactive; multispecies inactive","116-06-3",20039.0,"no positive results","","C7H14N2O2S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","40_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALDICARB.html","no positive results","",,"defined organic","no positive results","","","no positive results","","CC(C=NOC(=O)NC)(SC)C","inactive","","",,"","rat; mouse","no positive results",39223.0, -"ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2","InChI=1/C12H8Cl6/c13-8-9(14)11(16)7-5-2-1-4(3-5)6(7)10(8,15)12(11,17)18/h1-2,4-7H,3H2","","tested chemical","Aldrin",0.0,,,"active","no positive results",364.909912109375,,"liver",40.0,"1,2,3,4,10,10-hexachloro-1,4,4a,5,8,8a-hexahydro-1,4:5,8-dimethanonaphthalene","TR 21; final call in CPDB differs due to additional data",,"inactive","inactive",56.0,"QBYJBZPUGVGKQQ-UHFFFAOYAT","stereochem","","309-00-2",20040.0,"liver","","C12H8Cl6",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","41_CPDBAS_v5d",0.0035000001080334187,"","http://potency.berkeley.edu/chempages/ALDRIN.html","TD50 is harmonic mean of more than one positive test","",1.2699999809265137,"defined organic","no positive results","","","","","ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2","active","","",,"","rat; mouse","no positive results",20040.0, -"O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)(O)=O","InChI=1/C18H30O3S.Na/c1-3-4-5-6-7-8-9-10-11-16(2)17-12-14-18(15-13-17)22(19,20)21;/h12-16H,3-11H2,1-2H3,(H,19,20,21);/q;+1/p-1/fC18H29O3S.Na/q-1;m","inactive","representative isomer in mixture","Alkylbenzenesulfonate, linear",0.0,,,"inactive","no positive results",348.4757995605469,,"",41.0,"sodium 4-(dodecan-2-yl)benzenesulfonate","",,"inactive","",,"GHRHULTYHYEOQB-MFZBKVKLCJ","mixture of C10-13 alkylbenzenesulfonates average 11.6; with phenyl attachment varying in apprpx equal amounts between C-2,3,4,5 or 6; structure shown C12 attached at C2","multisex inactive","42615-29-2",20041.0,"","","C18H29NaO3S",,"mixture or formulation",,"TD50; Tumor Target Sites","","salt Na","Carcinogenicity","structure modified v5b","","42_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALKYLBENZENESULFONATE,%20LINEAR.html","","",,"defined organic","no positive results","","","","","O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)([O-])=O.[Na+]","","","",,"","rat","no positive results",20041.0, -"[O-][N+](C)(C)CCCCCCCCCC","InChI=1/C12H27NO/c1-4-5-6-7-8-9-10-11-12-13(2,3)14/h4-12H2,1-3H3","inactive","representative isomer in mixture","Alkyldimethylamine oxides, commercial grade",0.0,,,"inactive","no positive results",201.34890747070312,,"",42.0,"decyl(dimethyl)amine oxide","",,"inactive","",,"ZRKZFNZPJKEWPC-UHFFFAOYAU","mixture, C10-16 [70592-80-2], C12-18 [68955-55-5], C12-16 [68439-70-3], C14-18 [68390-99-8], structure shown C-12","multisex inactive","NOCAS",20042.0,"","","C12H27NO",,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","43_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALKYLDIMETHYLAMINE%20OXIDES,%20COMMERCIAL%20GRADE.html","","",,"defined organic","no positive results","","","","","[O-][N+](C)(C)CCCCCCCCCC","","","",,"","rat","no positive results",20042.0, -"O=C1C(NC(=O)N1)NC(=O)N","InChI=1/C4H6N4O3/c5-3(10)6-1-2(9)8-4(11)7-1/h1H,(H3,5,6,10)(H2,7,8,9,11)/f/h6-8H,5H2","inactive","tested chemical","Allantoin",0.0,,,"inactive","no positive results",158.11639404296875,,"",43.0,"1-(2,5-dioxoimidazolidin-4-yl)urea","",,"inactive","",,"POJWUDADGALRAB-BANUENCFCI","","multisex inactive","97-59-6",20043.0,"","","C4H6N4O3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","44_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLANTOIN.html","","",,"defined organic","no positive results","","","","","O=C1C(NC(=O)N1)NC(=O)N","","","",,"","rat","no positive results",20043.0, -"C=CCO","InChI=1/C3H6O/c1-2-3-4/h2,4H,1,3H2","inactive","tested chemical","Allyl alcohol",0.0,,,"inactive","no positive results",58.0791015625,,"",44.0,"prop-2-en-1-ol","",,"inactive","inactive",,"XXROGKLTLUQVRX-UHFFFAOYAC","","multisex inactive","107-18-6",20044.0,"","","C3H6O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Mutagenicity_SAL_CPDB added v3a","","45_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLYL%20ALCOHOL.html","","",,"defined organic","no positive results","","","","","C=CCO","","","",,"","rat","no positive results",20044.0, -"C=CCCl","InChI=1/C3H5Cl/c1-2-3-4/h2H,1,3H2","inactive","tested chemical","Allyl chloride",0.0,,,"inactive","only experiment is NCI NTP bioassay inadequate",76.5248031616211,,"",45.0,"3-chloroprop-1-ene","TR 73",,"unspecified","active",0.0,"OSDWBNJEKMUWAV-UHFFFAOYAQ","","multisex inactive","107-05-1",20045.0,"no positive results","","C3H5Cl",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","ActivityOutcome_CPDBAS_Mouse modified v5d","","46_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLYL%20CHLORIDE.html","no positive results","",,"defined organic","NTP bioassay inadequate","","","no positive results","","C=CCCl","inactive","","",,"","rat; mouse","NTP bioassay inadequate",39231.0, -"C=CCOCC1CO1","InChI=1/C6H10O2/c1-2-3-7-4-6-5-8-6/h2,6H,1,3-5H2","","tested chemical","Allyl glycidyl ether",0.0,,,"active","no positive results",114.14240264892578,,"",46.0,"2-[(allyloxy)methyl]oxirane","TR 376",,"inactive","active",26.0,"LSWYGACWGAICNM-UHFFFAOYAR","","","106-92-3",20046.0,"nasal cavity","","C6H10O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","47_CPDBAS_v5d",1.590000033378601,"","http://potency.berkeley.edu/chempages/ALLYL%20GLYCIDYL%20ETHER.html","","",182.0,"defined organic","no positive results","","","no positive results","","C=CCOCC1CO1","active","","",,"","rat; mouse","no positive results",39232.0, -"C=CCN=C=S","InChI=1/C4H5NS/c1-2-3-5-4-6/h2H,1,3H2","","tested chemical","Allyl isothiocyanate",26.0,,0.9679999947547913,"active","",99.1541976928711,,"",47.0,"3-isothiocyanatoprop-1-ene","TR 234",,"active","active",0.0,"ZOJBYZNEUISWFT-UHFFFAOYAS","","","57-06-7",20047.0,"no positive results","","C4H5NS",96.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","48_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLYL%20ISOTHIOCYANATE.html","no positive results","",,"defined organic","urinary bladder","","","no positive results","","C=CCN=C=S","inactive","","",,"","rat; mouse","no positive results",20047.0, -"O=C(CC(C)C)OCC=C","InChI=1/C8H14O2/c1-4-5-10-8(9)6-7(2)3/h4,7H,1,5-6H2,2-3H3","active","tested chemical","Allyl isovalerate",26.0,,0.8650000095367432,"active","",142.1956024169922,,"",48.0,"allyl 3-methylbutanoate","TR 253",,"active","inactive",32.0,"HOMAGVUCNZNWBC-UHFFFAOYAF","","multisex active; multispecies active","2835-39-4",20048.0,"no positive results","","C8H14O2",123.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","49_CPDBAS_v5d",0.44200000166893005,"","http://potency.berkeley.edu/chempages/ALLYL%20ISOVALERATE.html","","",62.79999923706055,"defined organic","hematopoietic system","","","hematopoietic system","","O=C(CC(C)C)OCC=C","active","","",,"","rat; mouse","no positive results",39233.0, -"NC(=O)N(CC=C)N=O","InChI=1/C4H7N3O2/c1-2-3-7(6-9)4(5)8/h2H,1,3H2,(H2,5,8)/f/h5H2","active","tested chemical","1-Allyl-1-nitrosourea",52.0,,0.0026000000070780516,"active","TD50 is harmonic mean of more than one positive test",129.11819458007812,,"",49.0,"1-nitroso-1-prop-2-en-1-ylurea","",,"active","",,"WBBDVRPSJSJSPC-GLFQYTTQCA","","multisite active; multisex active","760-56-5",20049.0,"","","C4H7N3O2",0.3409999907016754,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","50_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-ALLYL-1-NITROSOUREA.html","","",,"defined organic","large intestine; lung; stomach","","","","","NC(=O)N(CC=C)N=O","","","",,"","rat","mammary gland; stomach; uterus",20049.0, -"C=CCNN","InChI=1/C3H8N2.ClH/c1-2-3-5-4;/h2,5H,1,3-4H2;1H","active","tested chemical","Allylhydrazine.HCl",,,,"active","",108.57050323486328,,"",50.0,"prop-2-en-1-ylhydrazine hydrochloride","",,"","",34.0,"PWGPATVPEGLIAN-UHFFFAOYAO","parent [7422-78-8]","multisite active; multisex active","52207-83-7",20050.0,"lung","","C3H9ClN2",,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","51_CPDBAS_v5d",0.3149999976158142,"","http://potency.berkeley.edu/chempages/ALLYLHYDRAZINE.HCl.html","TD50 is harmonic mean of more than one positive test","",34.20000076293945,"defined organic","","","","lung; vascular system","","C=CCNN.HCl","active","","",,"","mouse","",20050.0, -"","InChI=1/Al.K.2H2O4S/c;;2*1-5(2,3)4/h;;2*(H2,1,2,3,4)/q+3;+1;;/p-4/fAl.K.2O4S/q2m;2*-2","inactive","tested chemical","Aluminum potassium sulfate",0.0,,,"inactive","no positive results",258.18670654296875,,"",51.0,"aluminum potassium sulfate","",,"inactive","",0.0,"GRLPQNLYRHEGIJ-MHPHYJPNCZ","","multisex inactive; multispecies inactive","10043-67-1",20051.0,"no positive results","","AlKO8S2",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","52_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALUMINUM%20POTASSIUM%20SULFATE.html","no positive results","",,"inorganic","no positive results","","","no positive results","","O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+]","inactive","","",,"","rat; mouse","no positive results",39234.0, -"O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N","InChI=1/C14H7Br2NO2/c15-8-5-9(16)12(17)11-10(8)13(18)6-3-1-2-4-7(6)14(11)19/h1-5H,17H2","active","tested chemical","1-Amino-2,4-dibromoanthraquinone",35.0,,0.12099999934434891,"active","TD50 is harmonic mean of more than one positive test",381.0188903808594,,"",52.0,"1-amino-2,4-dibromo-9,10-anthraquinone","TR 383",,"active","active",27.0,"ZINRVIQBCHAZMM-UHFFFAOYAC","","multisite active; multisex active; multispecies active","81-49-2",20052.0,"liver; lung; stomach","","C14H7Br2NO2",46.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","53_CPDBAS_v5d",1.25,"","http://potency.berkeley.edu/chempages/1-AMINO-2,4-DIBROMOANTHRAQUINONE.html","TD50 is harmonic mean of more than one positive test","",477.0,"defined organic","kidney; large intestine; liver; urinary bladder","","","liver; lung; stomach","","O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N","active","","",,"","rat; mouse","kidney; large intestine; liver; urinary bladder",39235.0, -"NC1=C(C=CC(=C1)NC(=O)C)OCC","InChI=1/C10H14N2O2/c1-3-14-10-5-4-8(6-9(10)11)12-7(2)13/h4-6H,3,11H2,1-2H3,(H,12,13)/f/h12H","","tested chemical","3-Amino-4-ethoxyacetanilide",0.0,,,"active","no positive results",194.2303924560547,,"",53.0,"N-[3-amino-4-(ethyloxy)phenyl]acetamide","TR 112",,"inactive","active",17.0,"XTXFAVHDQCHWCS-XWKXFZRBCV","","","17026-81-2",20053.0,"thyroid gland","","C10H14N2O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","54_CPDBAS_v5d",10.699999809265137,"","http://potency.berkeley.edu/chempages/3-AMINO-4-ETHOXYACETANILIDE.html","","",2070.0,"defined organic","no positive results","","","no positive results","","NC1=C(C=CC(=C1)NC(=O)C)OCC","active","","",,"","rat; mouse","no positive results",20053.0, -"CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N)","InChI=1/C14H14N2.ClH/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16;/h3-9H,2,15H2,1H3;1H","active","tested chemical","3-Amino-9-ethylcarbazole.HCl",32.0,,0.23199999332427979,"active","TD50 is harmonic mean of more than one positive test",246.7353057861328,,"",54.0,"9-ethyl-9H-carbazol-3-amine hydrochloride","TR 93",,"active","active",37.0,"UUYSTZWIFZYHRM-UHFFFAOYAB","parent [132-32-1]","multisite active; multisex active; multispecies active","6109-97-3",20054.0,"liver","","C14H15ClN2",57.20000076293945,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","55_CPDBAS_v5d",0.15600000321865082,"","http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE.HCl.html","TD50 is harmonic mean of more than one positive test","",38.599998474121094,"defined organic","ear Zymbals gland; liver; skin","","","liver","","CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl","active","","",,"","rat; mouse","ear Zymbals gland; liver; uterus",20054.0, -"CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N)","InChI=1/C14H14N2/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16/h3-9H,2,15H2,1H3","active","representative component in mixture","3-Amino-9-ethylcarbazole mixture",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",210.27439880371094,,"",55.0,"9-ethyl-9H-carbazol-3-amine","TR 93",,"active","active",50.0,"OXEUETBFKVCRNP-UHFFFAOYAV","mixture, structure shown 3-Amino-9-ethylcarbazole [132-32-1]","multisite active; multisex active; multispecies active","NOCAS",20055.0,"liver","","C14H15N2",26.399999618530273,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture","","56_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE%20MIXTURE.html","TD50 is harmonic mean of more than one positive test","",38.0,"defined organic","ear Zymbals gland; liver; skin","","","liver","","CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N)","active","","",,"","rat; mouse","ear Zymbals gland",20055.0, -"N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1","InChI=1/C9H14N8S3/c10-6-7(17-20-16-6)13-1-2-18-3-5-4-19-9(14-5)15-8(11)12/h4H,1-3H2,(H2,10,16)(H,13,17)(H4,11,12,14,15)/f/h11,13,15H,10,12H2","active","tested chemical","3-Amino-4-[2-[(2-guanidinothiazol-4-yl)methylthio], ethylamino]-1,2,5-thiadiazole",14.0,,15.100000381469727,"active","TD50 is harmonic mean of more than one positive test",330.4560852050781,,"",56.0,"1-{4-[({2-[(4-amino-1,2,5-thiadiazol-3-yl)amino]ethyl}sulfanyl)methyl]-1,3-thiazol-2-yl}guanidine","",,"active","",,"MOMKQYRYLQUFMV-GVMYFUFNCD","BL-6341","multisex active","78441-84-6",20056.0,"","","C9H14N8S3",4990.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a; CPDB lists HCl complex in some instances in tables but referenced study for this chemical does not specify HCl complex - parent is assumed correct","","57_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/3-AMINO-4-[2-[(2-GUANIDINOTHIAZOL-4-YL)METHYLTHIO].html","","",,"defined organic","stomach","","","","","N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1","","","",,"","rat","stomach",39236.0, -"O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N","InChI=1/C15H11NO2/c1-8-6-7-11-12(13(8)16)15(18)10-5-3-2-4-9(10)14(11)17/h2-7H,16H2,1H3","active","tested chemical","1-Amino-2-methylanthraquinone",32.0,,0.25,"active","TD50 is harmonic mean of more than one positive test",237.2532958984375,,"",57.0,"1-amino-2-methylanthracene-9,10-dione","TR 111",,"active","active",30.0,"ZLCUIOWQYBYEBG-UHFFFAOYAP","C.I. 60700","multisite active; multisex active; multispecies active","82-28-0",20057.0,"no positive results","","C15H11NO2",59.20000076293945,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","58_CPDBAS_v5d",0.7329999804496765,"","http://potency.berkeley.edu/chempages/1-AMINO-2-METHYLANTHRAQUINONE.html","","",174.0,"defined organic","kidney; liver","","","liver","","O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N","active","","",,"","rat; mouse","liver",20057.0, -"O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N","InChI=1/C6H4N4O4/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2","active","tested chemical","2-Amino-5-(5-nitro-2-furyl)-1,3,4-oxadiazole",44.0,,0.018699999898672104,"active","",196.1219940185547,,"",58.0,"5-(5-nitrofuran-2-yl)-1,3,4-oxadiazol-2-amine","",,"active","",,"VTWQUFUBSCXPOW-IAUQMDSZCD","","multisite active","3775-55-1",20058.0,"","","C6H4N4O4",3.6700000762939453,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","59_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-OXADIAZOLE.html","","",,"defined organic","","","","","","O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N","","","",,"","rat","kidney; lung; mammary gland; stomach",20058.0, -"NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1","InChI=1/C6H4N4O3S/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2","active","tested chemical","2-Amino-5-(5-nitro-2-furyl)-1,3,4-thiadiazole",52.0,,0.003100000089034438,"active","",212.18260192871094,,"",59.0,"5-(5-nitrofuran-2-yl)-1,3,4-thiadiazol-2-amine","",,"active","",,"SXZZHGJWUBJKHH-IAUQMDSZCG","","multisite active","712-68-5",20059.0,"","","C6H4N4O3S",0.6620000004768372,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","60_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-THIADIAZOLE.html","","",,"defined organic","","","","","","NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1","","","",,"","rat","kidney; lung; mammary gland; stomach",20059.0, -"NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1","InChI=1/C7H5N3O3S/c8-7-9-4(3-14-7)5-1-2-6(13-5)10(11)12/h1-3H,(H2,8,9)/f/h8H2","active","tested chemical","2-Amino-4-(5-nitro-2-furyl)thiazole",42.0,,0.027699999511241913,"active","",211.19479370117188,,"",60.0,"4-(5-nitrofuran-2-yl)-1,3-thiazol-2-amine","",,"active","active",44.0,"ZAVLMIGIVYJYMU-FSHFIPFOCT","","multisite active; multispecies active","38514-71-5",20060.0,"","","C7H5N3O3S",5.849999904632568,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","61_CPDBAS_v5d",0.037300001829862595,"","http://potency.berkeley.edu/chempages/2-AMINO-4-(5-NITRO-2-FURYL)THIAZOLE.html","","",7.869999885559082,"defined organic","","","","stomach","","NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1","active","","",,"","rat; mouse","stomach; urinary bladder",39237.0, -"NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1","InChI=1/C8H6N4O4/c9-8-10-6(11-16-8)3-1-5-2-4-7(15-5)12(13)14/h1-4H,(H2,9,10,11)/b3-1+/f/h9H2","active","tested chemical","trans-5-Amino-3[2-(5-nitro-2-furyl)vinyl]-1,2,4-oxadiazole",,,,"active","",222.15980529785156,,"",61.0,"3-[(E)-2-(5-nitrofuran-2-yl)ethenyl]-1,2,4-oxadiazol-5-amine","",,"","",32.0,"RMZNNIOKNRDECR-OYGOROAMDP","stereochem","multisite active; multisex active","28754-68-9",20061.0,"hematopoietic system; stomach","","C8H6N4O4",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","62_CPDBAS_v5d",0.5040000081062317,"","http://potency.berkeley.edu/chempages/trans-5-AMINO-3[2-(5-NITRO-2-FURYL)VINYL]-1,2,4-OX.html","TD50 is harmonic mean of more than one positive test","",112.0,"defined organic","","","","hematopoietic system; stomach","","NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1","active","","",,"","mouse","",20061.0, -"O=[N+](C1=CC(=C(C=C1)O)N)[O-]","InChI=1/C6H6N2O3/c7-5-3-4(8(10)11)1-2-6(5)9/h1-3,9H,7H2","","tested chemical","2-Amino-4-nitrophenol",18.0,,5.440000057220459,"active","",154.12339782714844,,"",62.0,"2-amino-4-nitrophenol","TR 339",,"active","active",0.0,"VLZVIIYRNMWPSN-UHFFFAOYAN","","","99-57-0",20062.0,"no positive results","","C6H6N2O3",839.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","63_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-4-NITROPHENOL.html","no positive results","",,"defined organic","kidney","","","no positive results","","O=[N+](C1=CC(=C(C=C1)O)N)[O-]","inactive","","",,"","rat; mouse","no positive results",20062.0, -"O=[N+](C1=CC(=C(C=C1)N)O)[O-]","InChI=1/C6H6N2O3/c7-5-2-1-4(8(10)11)3-6(5)9/h1-3,9H,7H2","","tested chemical","2-Amino-5-nitrophenol",27.0,,0.7200000286102295,"active","",154.12339782714844,,"",63.0,"2-amino-5-nitrophenol","TR 334",,"active","active",0.0,"DOPJTDJKZNWLRB-UHFFFAOYAU","","","121-88-0",20063.0,"no positive results","","C6H6N2O3",111.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","64_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-NITROPHENOL.html","no positive results","",,"defined organic","pancreas","","","no positive results","","O=[N+](C1=CC(=C(C=C1)N)O)[O-]","inactive","","",,"","rat; mouse","no positive results",20063.0, -"OC1=C(C=C(C=C1)N)[N+](=O)[O-]","InChI=1/C6H6N2O3/c7-4-1-2-6(9)5(3-4)8(10)11/h1-3,9H,7H2","","tested chemical","4-Amino-2-nitrophenol",23.0,,2.0,"active","",154.12339782714844,,"",64.0,"4-amino-2-nitrophenol","TR 94",,"active","active",0.0,"WHODQVWERNSQEO-UHFFFAOYAM","","","119-34-6",20064.0,"no positive results","","C6H6N2O3",309.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","65_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-AMINO-2-NITROPHENOL.html","no positive results","",,"defined organic","urinary bladder","","","no positive results","","OC1=C(C=C(C=C1)N)[N+](=O)[O-]","inactive","","",,"","rat; mouse","no positive results",20064.0, -"NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1","InChI=1/C9H7N3O2S/c10-9-11-8(5-15-9)6-1-3-7(4-2-6)12(13)14/h1-5H,(H2,10,11)/f/h10H2","","tested chemical","2-Amino-4-(p-nitrophenyl)thiazole",,,,"active","",221.2332000732422,,"",65.0,"4-(4-nitrophenyl)-1,3-thiazol-2-amine","",,"","",43.0,"RIKJWJIWXCUKQV-GIMVELNWCN","","","2104-09-8",20065.0,"","","C9H7N3O2S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","66_CPDBAS_v5d",0.04500000178813934,"","http://potency.berkeley.edu/chempages/2-AMINO-4-(p-NITROPHENYL)THIAZOLE.html","","",9.949999809265137,"defined organic","","","","hematopoietic system","","NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1","active","","",,"","mouse","",39238.0, -"O=[N+](C1=CN=C(S1)N)[O-]","InChI=1/C3H3N3O2S/c4-3-5-1-2(9-3)6(7)8/h1H,(H2,4,5)/f/h4H2","active","tested chemical","2-Amino-5-nitrothiazole",31.0,,0.3070000112056732,"active","",145.13980102539062,,"",66.0,"5-nitro-1,3-thiazol-2-amine","TR 53; final call in CPDB differs due to additional data; NTP-assigned level of evidence of carcinogenicity is "positive" in male rat; noting that "these experiments were particularly difficult to evaluate".",,"active","active",0.0,"MIHADVKEHAFNPG-LGEMBHMGCP","","multisite active","121-66-4",20066.0,"no positive results","","C3H3N3O2S",44.599998474121094,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TargetSites_Rat_Male modified v5d","","67_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-NITROTHIAZOLE.html","no positive results","",,"defined organic","no positive results - CPDB evaluation based on NCI Technical Report","","","no positive results","","O=[N+](C1=CN=C(S1)N)[O-]","inactive","","",,"","rat; mouse","kidney; lung; mammary gland",20066.0, -"NC1=NC(C(C2=CC=CC=C2)O1)=O","InChI=1/C9H8N2O2.Mg.2H2O/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;;;/h1-5,7H,(H2,10,11,12);;2*1H2/q;+2;;/p-2/fC9H8N2O2.Mg.2HO/h10H2;;2*1h/q;m;2*-1/rC9H8N2O2.H2MgO2/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;2-1-3/h1-5,7H,(H2,10,11,12);2-3H/f/h10H2;","","tested chemical","2-Amino-5-phenyl-2-oxazolin-4-one + Mg(OH)2",0.0,,,"inactive","no positive results",234.49400329589844,,"",67.0,"2-amino-5-phenyl-1,3-oxazol-4(5H)-one - dihydroxymagnesium (1:1)","",,"inactive","",,"JOPOQPCBCUIPFX-VWMXNRJTCY","parent [2152-34-3]","","18968-99-5",20067.0,"","","C9H10MgN2O4",,"single chemical compound",,"TD50; Tumor Target Sites","","complex Mg(OH)2","Carcinogenicity","","","68_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-PHENYL-2-OXAZOLIN-4-ONE%20+%20Mg(OH)2.html","","",,"defined organic","","","","","","NC1=NC(C(C2=CC=CC=C2)O1)=O.O[Mg]O","","","",,"","rat","no positive results",20067.0, -"O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N","InChI=1/C14H9NO2/c15-8-5-6-11-12(7-8)14(17)10-4-2-1-3-9(10)13(11)16/h1-7H,15H2","active","tested chemical","2-Aminoanthraquinone ",29.0,,0.4519999921321869,"active","",223.226806640625,,"",68.0,"2-amino-9,10-anthraquinone","TR 144",,"active","active",20.0,"XOGPDSATLSAZEK-UHFFFAOYAH","","multisite active; multisex active; multispecies active","117-79-3",20068.0,"liver","","C14H9NO2",101.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","69_CPDBAS_v5d",5.329999923706055,"","http://potency.berkeley.edu/chempages/2-AMINOANTHRAQUINONE.html","TD50 is harmonic mean of more than one positive test","",1190.0,"defined organic","liver","","","hematopoietic system; liver","","O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N","active","","",,"","rat; mouse","no positive results",20068.0, -"CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C","InChI=1/C14H15N3/c1-10-5-3-4-6-14(10)17-16-12-7-8-13(15)11(2)9-12/h3-9H,15H2,1-2H3/b17-16+","active","tested chemical","o-Aminoazotoluene",44.0,,0.017899999395012856,"active","TD50 is harmonic mean of more than one positive test",225.28900146484375,,"",69.0,"2-methyl-4-[(E)-(2-methylphenyl)diazenyl]aniline","",,"active","active",0.0,"PFRYFZZSECNQOL-WUKNDPDIBU","","multisex active","97-56-3",20069.0,"no positive results","","C14H15N3",4.039999961853027,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","70_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/o-AMINOAZOTOLUENE.html","no positive results","",,"defined organic","liver","","","","","CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C","inactive","","",,"","rat; mouse","liver",20069.0, -"OC(=O)CCCCCN","InChI=1/C6H13NO2/c7-5-3-1-2-4-6(8)9/h1-5,7H2,(H,8,9)/f/h8H","","tested chemical","6-Aminocaproic acid",0.0,,,"inactive","no positive results",131.1741943359375,,"",70.0,"6-aminohexanoic acid","",,"inactive","",,"SLXKOJJOQWFEFD-FZOZFQFYCD","","","60-32-2",20070.0,"","","C6H13NO2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","71_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/6-AMINOCAPROIC%20ACID.html","","",,"defined organic","no positive results","","","","","OC(=O)CCCCCN","","","",,"","rat","",20070.0, -"NC1=CC=C(C=C1)C2=CC=CC=C2","InChI=1/C12H11N/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10/h1-9H,13H2","active","tested chemical","4-Aminodiphenyl",,,,"active","",169.22239685058594,,"",71.0,"biphenyl-4-amine","",,"","active",50.0,"DMVOXQPQNTYEKQ-UHFFFAOYAX","","multisite active; multisex active","92-67-1",20071.0,"liver; urinary bladder","","C12H11N",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","72_CPDBAS_v5d",0.012400000356137753,"","http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.html","TD50 is harmonic mean of more than one positive test","",2.0999999046325684,"defined organic","","","","liver; urinary bladder","","NC1=CC=C(C=C1)C2=CC=CC=C2","active","","",,"","mouse","",20071.0, -"NC1(=CC=C(C=C1)C2=CC=CC=C2)","InChI=1/C12H11N.ClH/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10;/h1-9H,13H2;1H","","tested chemical","4-Aminodiphenyl.HCl",50.0,,0.004800000227987766,"active","",205.68649291992188,,"",72.0,"biphenyl-4-amine hydrochloride","",,"active","active",,"GUHXYHYUBFCYGJ-UHFFFAOYAT","parent [92-67-1]","","2113-61-3",20072.0,"","","C12H12ClN",0.9800000190734863,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","73_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.HCl.html","","",,"defined organic","","","","","","NC1(=CC=C(C=C1)C2=CC=CC=C2).[H]Cl","","","",,"","rat","mammary gland",20072.0, -"NC3=CC1=C(C=C3)OC2=C1C=CC=C2","InChI=1/C12H9NO/c13-8-5-6-12-10(7-8)9-3-1-2-4-11(9)14-12/h1-7H,13H2","active","tested chemical","2-Aminodiphenylene oxide",,,,"active","",183.20919799804688,,"",73.0,"dibenzo[b,d]furan-2-amine","",,"","",47.0,"FFYZMBQLAYDJIG-UHFFFAOYAK","","multisite active; multisex active","3693-22-9",20073.0,"liver; urinary bladder","","C12H9NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","74_CPDBAS_v5d",0.023099999874830246,"","http://potency.berkeley.edu/chempages/2-AMINODIPHENYLENE%20OXIDE.html","TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable","",4.239999771118164,"defined organic","","","","liver","","NC3=CC1=C(C=C3)OC2=C1C=CC=C2","active","","",,"","mouse","",39239.0, -"NCC1(CC(=O)O)CCCCC1","InChI=1/C9H17NO2/c10-7-9(6-8(11)12)4-2-1-3-5-9/h1-7,10H2,(H,11,12)/f/h11H","","tested chemical","1-(Aminomethyl)cyclohexaneacetic acid",10.0,,34.20000076293945,"active","",171.23880004882812,,"",74.0,"[1-(aminomethyl)cyclohexyl]acetic acid","",,"active","",,"UGJMXCAKCUNAIE-WXRBYKJCCG","","","60142-96-3",20074.0,"","","C9H17NO2",5850.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v3a","","75_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-(AMINOMETHYL)CYCLOHEXANEACETIC%20ACID.html","","",,"defined organic","pancreas","","","","","NCC1(CC(=O)O)CCCCC1","","","",,"","rat","no positive results",20074.0, -"OCCN(CCO)c1ccc(N)cc1","InChI=1/C10H16N2O2.H2O4S/c11-9-1-3-10(4-2-9)12(5-7-13)6-8-14;1-5(2,3)4/h1-4,13-14H,5-8,11H2;(H2,1,2,3,4)/f/h;1-2H","inactive","tested chemical","2,2'-[(4-Aminophenyl)imino]bisethanol sulfate",0.0,,,"inactive","no positive results",294.32470703125,,"",75.0,"2,2'-[(4-aminophenyl)imino]diethanol sulfate (salt)","",,"inactive","",,"KMCFMEHSEWDYKG-ATDHBCBACR","parent [7575-35-1]","multisex inactive","54381-16-7",20075.0,"","","C10H18N2O6S",,"single chemical compound",,"TD50; Tumor Target Sites","","complex H2SO4","Carcinogenicity","Rat added v2a","","76_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2,2'-[(4-AMINOPHENYL)IMINO]BISETHANOL%20SULFATE.html","","",,"defined organic","no positive results","","","","","OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1","","","",,"","rat","no positive results",20075.0, -"C1(N=CNN=1)N","InChI=1/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6)/f/h5H,3H2","active","tested chemical","3-Aminotriazole",35.0,,0.11800000071525574,"active","TD50 is harmonic mean of more than one positive test",84.08000183105469,,"",76.0,"1H-1,2,4-triazol-3-amine","",,"active","inactive",34.0,"KLSJWNVTNUYHDU-YPUDGCQOCD","tautomers","multisite active; multisex active; multispecies active","61-82-5",20076.0,"liver","","C2H4N4",9.9399995803833,"single chemical compound",0.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","77_CPDBAS_v5d",0.3009999990463257,"","http://potency.berkeley.edu/chempages/3-AMINOTRIAZOLE.html","TD50 is harmonic mean of more than one positive test","inactive",25.299999237060547,"defined organic","thyroid gland","no positive results","","liver","","C1(N=CNN=1)N","active","","no positive results",,"no positive results","rat; mouse; hamster","pituitary gland; thyroid gland",20076.0, -"OC(=O)CCCCCCCCCCN","InChI=1/C11H23NO2/c12-10-8-6-4-2-1-3-5-7-9-11(13)14/h1-10,12H2,(H,13,14)/f/h13H","active","tested chemical","11-Aminoundecanoic acid",18.0,,5.460000038146973,"active","",201.30580139160156,,"",77.0,"11-aminoundecanoic acid","TR 216",,"active","inactive",0.0,"GUOSQNAUYHMCRU-NDKGDYFDCZ","","multisite active","2432-99-7",20077.0,"no positive results","","C11H23NO2",1100.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","78_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/11-AMINOUNDECANOIC%20ACID.html","no positive results","",,"defined organic","liver; urinary bladder","","","no positive results","","OC(=O)CCCCCCCCCCN","inactive","","",,"","rat; mouse","no positive results",20077.0, -"","InChI=1/ClH.H3N/h1H;1H3/fCl.H4N/h1h;1H/q-1;+1","","tested chemical","Ammonium chloride",,,,"inactive","",53.49150085449219,,"",78.0,"ammonium chloride","",,"","",0.0,"NLXLAEXVIDQMFP-DWOZJLMICO","","","12125-02-9",20078.0,"","","H4ClN",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","79_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMMONIUM%20CHLORIDE.html","no positive results","",,"inorganic","","","","no positive results","","[H][N+]([H])([H])[H].[Cl-]","inactive","","",,"","mouse","",20078.0, -"C(CC(O)=O)(CC(O)=O)(C(O)=O)O","InChI=1/C6H8O7.2H3N/c7-3(8)1-6(13,5(11)12)2-4(9)10;;/h13H,1-2H2,(H,7,8)(H,9,10)(H,11,12);2*1H3/fC6H6O7.2H4N/h7H;2*1H/q-2;2*+1","","tested chemical","Ammonium citrate",0.0,,,"inactive","no positive results",226.18580627441406,,"",79.0,"diammonium 2-(carboxymethyl)-2-hydroxybutanedioate","",,"inactive","",,"YXVFQADLFFNVDS-JYGIMERMCP","parent [77-92-9]","","3012-65-5",20079.0,"","","C6H14N2O7",,"single chemical compound",,"TD50; Tumor Target Sites","","complex 2NH4","Carcinogenicity","","","80_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMMONIUM%20CITRATE.html","","",,"defined organic","no positive results","","","","","C(CC([O-])=O)(CC(O)=O)(C([O-])=O)O.[N+].[N+]","","","",,"","rat","",20079.0, -"","InChI=1/H3N.H2O/h1H3;1H2/fH4N.HO/h1H;1h/q+1;-1","inactive","tested chemical","Ammonium hydroxide",,,,"inactive","",35.045799255371094,,"",80.0,"ammonium hydroxide","",,"","",0.0,"VHUUQVKOLVNVRT-QBBVKLOVCT","","multisex inactive","1336-21-6",20080.0,"no positive results","","H5NO",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","81_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMMONIUM%20HYDROXIDE.html","no positive results","",,"inorganic","","","","no positive results","","[N+].[O-]","inactive","","",,"","mouse","",20080.0, -"N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O","InChI=1/C11H18N2O3/c1-4-11(6-5-7(2)3)8(14)12-10(16)13-9(11)15/h7H,4-6H2,1-3H3,(H2,12,13,14,15,16)/f/h12-13H","","tested chemical","Amobarbital",0.0,,,"inactive","no positive results",226.27479553222656,,"",81.0,"5-ethyl-5-(3-methylbutyl)pyrimidine-2,4,6(1H,3H,5H)-trione","",,"inactive","",,"VIROVYVQCGLCII-BAINRFMOCW","","","57-43-2",20081.0,"","","C11H18N2O3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","82_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMOBARBITAL.html","","",,"defined organic","no positive results","","","","","N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O","","","",,"","rat","",20081.0, -"C1=CC=CC=C1CC(N)C","InChI=1/2C9H13N.H2O4S/c2*1-8(10)7-9-5-3-2-4-6-9;1-5(2,3)4/h2*2-6,8H,7,10H2,1H3;(H2,1,2,3,4)/f/h;;1-2H","inactive","tested chemical","dl-Amphetamine sulfate",0.0,,,"inactive","no positive results",368.49090576171875,,"",82.0,"1-phenylpropan-2-amine sulfate (2:1)","TR 387",,"inactive","inactive",0.0,"PYHRZPFZZDCOPH-IPLSSONACD","racemic mixture of L- [51-62-7] and D- [51-63-8], parent [300-62-9], structure shown without stereochem","multisex inactive; multispecies inactive","60-13-9",20082.0,"no positive results","","C18H28N2O4S",,"single chemical compound",,"TD50; Tumor Target Sites","","complex bis H2SO4","Carcinogenicity","","","83_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/dl-AMPHETAMINE%20SULFATE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C","inactive","","",,"","rat; mouse","no positive results",20082.0, -"[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O","InChI=1/C16H19N3O4S.3H2O/c1-16(2)11(15(22)23)19-13(21)10(14(19)24-16)18-12(20)9(17)8-6-4-3-5-7-8;;;/h3-7,9-11,14H,17H2,1-2H3,(H,18,20)(H,22,23);3*1H2/t9-,10-,11+,14-;;;/m1.../s1/f/h18,22H;;;","inactive","tested chemical","Ampicillin trihydrate",0.0,,,"inactive","no positive results",403.4505920410156,,"",83.0,"(2S,5R,6R)-6-{[(2R)-2-amino-2-phenylacetyl]amino}-3,3-dimethyl-7-oxo-4-thia-1-azabicyclo[3.2.0]heptane-2-carboxylic acid trihydrate","TR 318",,"inactive","inactive",0.0,"RXDALBZNGVATNY-FQLIROBNDT","stereochem; parent [69-53-4]","multisex inactive; multispecies inactive","7177-48-2",20083.0,"no positive results","","C16H25N3O7S",,"single chemical compound",,"TD50; Tumor Target Sites","","complex 3H2O","Carcinogenicity","structure modified v5b","","84_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMPICILLIN%20TRIHYDRATE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O","inactive","","",,"","rat; mouse","no positive results",20083.0, -"O=C(N(CCCCC)N=O)N","InChI=1/C6H13N3O2/c1-2-3-4-5-9(8-11)6(7)10/h2-5H2,1H3,(H2,7,10)/f/h7H2","active","tested chemical","1-Amyl-1-nitrosourea",51.0,,0.0035000001080334187,"active","TD50 is harmonic mean of more than one positive test",159.18760681152344,,"",84.0,"1-nitroso-1-pentylurea","",,"active","",,"YYTNAQDGJQPZFU-IAUQMDSZCI","","multisite active; multisex active","10589-74-9",20084.0,"","","C6H13N3O2",0.5550000071525574,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat modified v5a","","85_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-AMYL-1-NITROSOUREA.html","","",,"defined organic","hematopoietic system; lung; stomach","","","","","O=C(N(CCCCC)N=O)N","","","",,"","rat","hematopoietic system; lung; mammary gland; stomach; uterus",20084.0, -"","InChI=1//","","no structure","Amylopectin sulfate",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",,,"",,"","",,"active","",,"MOSFIJXAXDLOML-UHFFFAOYAM","non-linear polymer of glucose (Merck - amylopectic)","","9047-13-6",20085.0,"","","",283.0,"macromolecule",,"TD50; Tumor Target Sites","","","Carcinogenicity","TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture","","86_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMYLOPECTIN%20SULFATE.html","","",,"no structure","large intestine","","","","","","","","",,"","rat","",20085.0, -"C/C=C/C1=CC=C(C=C1)OC","InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3+","inactive","tested chemical","trans-Anethole",0.0,,,"inactive","no positive results",148.2017059326172,,"",87.0,"1-(methyloxy)-4-[(1E)-prop-1-en-1-yl]benzene","",,"inactive","inactive",0.0,"RUVINXPYWBROJD-ONEGZZNKBR","stereochem","multisex inactive","4180-23-8",20087.0,"","","C10H12O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","88_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/trans-ANETHOLE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C/C=C/C1=CC=C(C=C1)OC","inactive","","",,"","rat","no positive results",20087.0, -"C/C=C/C1=CC=C(C=C1)OC","InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3+","inactive","tested chemical","trans-Anethole",0.0,,,"inactive","no positive results",148.2017059326172,,"",87.0,"1-(methyloxy)-4-[(1E)-prop-1-en-1-yl]benzene","",,"inactive","inactive",0.0,"RUVINXPYWBROJD-ONEGZZNKBR","stereochem","multisex inactive","4180-23-8",20087.0,"","","C10H12O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","88_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/trans-ANETHOLE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C/C=C/C1=CC=C(C=C1)OC","inactive","","",,"","rat","no positive results",20087.0, -"O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2","InChI=1/C8H11Cl3O6/c9-8(10,11)7-16-5-3(14)4(2(13)1-12)15-6(5)17-7/h2-7,12-14H,1H2/t2-,3+,4-,5-,6-,7-/m1/s1","inactive","tested chemical","Anhydroglucochloral",,,,"inactive","",309.5282897949219,,"",88.0,"1,2-O-[(1R)-2,2,2-trichloroethylidene]-alpha-D-glucofuranose","",,"","",0.0,"OJYGBLRPYBAHRT-IPQSZEQABF","Chlorlose-alpha, stereochem","multisex inactive","15879-93-3",20088.0,"no positive results","","C8H11Cl3O6",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","structure modified v5b","","89_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANHYDROGLUCOCHLORAL.html","no positive results","",,"defined organic","","","","no positive results","","O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2","inactive","","",,"","mouse","",20088.0, -"ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl","InChI=1/C9H5Cl3N4/c10-5-3-1-2-4-6(5)13-9-15-7(11)14-8(12)16-9/h1-4H,(H,13,14,15,16)/f/h13H","inactive","tested chemical","Anilazine",0.0,,,"inactive","no positive results",275.52178955078125,,"",89.0,"4,6-dichloro-N-(2-chlorophenyl)-1,3,5-triazin-2-amine","TR 104",,"inactive","inactive",0.0,"IMHBYKMAHXWHRP-NDKGDYFDCD","","multisex inactive; multispecies inactive","101-05-3",20089.0,"no positive results","","C9H5Cl3N4",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","90_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANILAZINE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl","inactive","","",,"","rat; mouse","no positive results",20089.0, -"NC1=CC=CC=C1","InChI=1/C6H7N/c7-6-4-2-1-3-5-6/h1-5H,7H2","","tested chemical","Aniline",0.0,,,"inactive","no positive results",93.12650299072266,,"",90.0,"aniline","",,"inactive","inactive",,"PAYRUJLWNCNPSJ-UHFFFAOYAP","","","62-53-3",20090.0,"","","C6H7N",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","91_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANILINE.html","","",,"defined organic","no positive results","","","","","NC1=CC=CC=C1","","","",,"","rat","",20090.0, -"NC1=CC=CC=C1","InChI=1/C6H7N.ClH/c7-6-4-2-1-3-5-6;/h1-5H,7H2;1H","active","tested chemical","Aniline.HCl",22.0,,2.0799999237060547,"active","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results",129.58740234375,,"",91.0,"aniline hydrochloride","TR 130",,"active","inactive",0.0,"MMCPOSDMTGQNKG-UHFFFAOYAJ","parent [62-53-3]","multisite active; multisex active","142-04-1",20091.0,"no positive results","","C6H8ClN",269.0,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","92_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANILINE.HCl.html","no positive results","",,"defined organic","peritoneal cavity; spleen; vascular system","","","no positive results","","NC1=CC=CC=C1[H]Cl","inactive","","",,"","rat; mouse","peritoneal cavity",20091.0, -"C1(=C(C=CC=C1)N)OC","InChI=1/C7H9NO.ClH/c1-9-7-5-3-2-4-6(7)8;/h2-5H,8H2,1H3;1H","active","tested chemical","o-Anisidine.HCl",33.0,,0.1860000044107437,"active","TD50 is harmonic mean of more than one positive test",159.6134033203125,,"",92.0,"2-methoxyaniline hydrochloride","TR 89",,"active","active",19.0,"XCZCWGVXRBJCCD-UHFFFAOYAX","parent [90-04-0]","multisite active; multisex active; multispecies active","134-29-2",20092.0,"urinary bladder","","C7H10ClNO",29.700000762939453,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","93_CPDBAS_v5d",6.050000190734863,"","http://potency.berkeley.edu/chempages/o-ANISIDINE.HCl.html","TD50 is harmonic mean of more than one positive test","",966.0,"defined organic","kidney; thyroid gland; urinary bladder","","","urinary bladder","","C1(=C(C=CC=C1)N)OC.[H]Cl","active","","",,"","rat; mouse","urinary bladder",20092.0, -"C1(=CC=C(N)C=C1)OC","InChI=1/C7H9NO.ClH/c1-9-7-4-2-6(8)3-5-7;/h2-5H,8H2,1H3;1H","inactive","tested chemical","p-Anisidine.HCl",0.0,,,"inactive","no positive results",159.6134033203125,,"",93.0,"4-(methyloxy)aniline hydrochloride","TR 116",,"inactive","active",0.0,"VQYJLACQFYZHCO-UHFFFAOYAH","parent [104-94-9]","multisex inactive; multispecies inactive","20265-97-8",20093.0,"no positive results","","C7H10ClNO",,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","94_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/p-ANISIDINE.HCl.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C1(=CC=C(N)C=C1)OC.[H]Cl","inactive","","",,"","rat; mouse","no positive results",20093.0, -"NC1=C(C=CC=C1)C(=O)O","InChI=1/C7H7NO2/c8-6-4-2-1-3-5(6)7(9)10/h1-4H,8H2,(H,9,10)/f/h9H","inactive","tested chemical","Anthranilic acid",0.0,,,"inactive","no positive results",137.13600158691406,,"",94.0,"2-aminobenzoic acid","TR 36",,"inactive","inactive",0.0,"RWZYAGGXGHYGMB-BGGKNDAXCO","","multisex inactive; multispecies inactive","118-92-3",20094.0,"no positive results","","C7H7NO2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","95_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANTHRANILIC%20ACID.html","no positive results","",,"defined organic","no positive results","","","no positive results","","NC1=C(C=CC=C1)C(=O)O","inactive","","",,"","rat; mouse","no positive results",20094.0, -"O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3","InChI=1/C14H8O2/c15-13-9-5-1-2-6-10(9)14(16)12-8-4-3-7-11(12)13/h1-8H","inactive","tested chemical","9,10-Anthraquinone",,,,"inactive","",208.21209716796875,,"",95.0,"9,10-anthraquinone","",,"","active",0.0,"RZVHIXYEVGDQDX-UHFFFAOYAA","","multisex inactive","84-65-1",20095.0,"no positive results","","C14H8O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","96_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/9,10-ANTHRAQUINONE.html","no positive results","",,"defined organic","","","","no positive results","","O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3","inactive","","",,"","mouse","",20095.0, -"","InChI=1/2C4H4O6.2K.3H2O.2Sb/c2*5-1(3(7)8)2(6)4(9)10;;;;;;;/h2*1-2H,(H,7,8)(H,9,10);;;3*1H2;;/q2*-2;2*+1;;;;2*+3/p-4/f2C4H2O6.2K.3H2O.2Sb/q2*-4;2m;;;;2m/rC8H6O12Sb2.2K.3H2O/c9-5(10)1-3-7(13)19-22(17-3)16-2(6(11)12)4-8(14)20-21(15-1)18-4;;;;;/h1-4H,(H,9,10)(H,11,12);;;3*1H2/q;2*+1;;;/p-2/fC8H4O12Sb2.2K.3H2O/q-2;2m;;;","","tested chemical","Antimony potassium tartrate",,,,"inactive","",667.8726196289062,,"no positive results",96.0,"dipotassium 5,11-dioxo-2,6,8,12,13,14-hexaoxa-1,7-distibatricyclo[8.2.1.1~4,7~]tetradecane-3,9-dicarboxylate trihydrate","",,"","inactive",0.0,"WBTCZEPSIIFINA-DYFLWLNICK","","","28300-74-5",20096.0,"","","C8H10K2O15Sb2",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","97_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANTIMONY%20POTASSIUM%20TARTRATE.html","","",,"organometallic","","","","","","[K+].[K+].[O-]C(=O)C2O[Sb]3OC(C(O[Sb]1OC(=O)C2O1)C([O-])=O)C(=O)O3.O.O.O","inactive","","",,"","mouse","",39240.0, -"CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl","InChI=1/C15H23ClO4S/c1-12(20-21(17)19-10-9-16)11-18-14-7-5-13(6-8-14)15(2,3)4/h5-8,12H,9-11H2,1-4H3","active","tested chemical","Aramite",31.0,,0.289000004529953,"active","TD50 is harmonic mean of more than one positive test",334.85870361328125,,"",97.0,"2-chloroethyl 2-{[4-(1,1-dimethylethyl)phenyl]oxy}-1-methylethyl sulfite","",,"active","",32.0,"YKFRAOGHWKADFJ-UHFFFAOYAL","","multispecies active","140-57-8",20097.0,"liver","","C15H23ClO4S",96.69999694824219,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","98_CPDBAS_v5d",0.47200000286102295,"","http://potency.berkeley.edu/chempages/ARAMITE.html","","",158.0,"defined organic","","","","no positive results","","CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl","active","liver","",,"","rat; mouse","",20097.0, -"O=C(OC)C1=CCCN(C)C1","InChI=1/C8H13NO2.ClH/c1-9-5-3-4-7(6-9)8(10)11-2;/h4H,3,5-6H2,1-2H3;1H","active","tested chemical","Arecoline.HCl",,,,"active","",191.6571044921875,,"",98.0,"methyl 1-methyl-1,2,5,6-tetrahydropyridine-3-carboxylate hydrochloride","",,"","",36.0,"LQSWCSYIDIBGRR-UHFFFAOYAO","parent [63-75-2]","multisite active; multisex active","61-94-9",20098.0,"lung; stomach; vascular system","","C8H14ClNO2",,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","99_CPDBAS_v5d",0.20600000023841858,"","http://potency.berkeley.edu/chempages/ARECOLINE.HCl.html","TD50 is harmonic mean of more than one positive test","",39.5,"defined organic","","","","lung; vascular system","","O=C(OC)C1=CCCN(C)C1.[H]Cl","active","","",,"","mouse","",20098.0, -"[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C(O)=O)=CC3=C2OCO3)=O","InChI=1/C17H11NO7.Na/c1-23-12-4-2-3-8-9(12)5-11(18(21)22)14-10(17(19)20)6-13-16(15(8)14)25-7-24-13;/h2-6H,7H2,1H3,(H,19,20);/q;+1/p-1/fC17H10NO7.Na/q-1;m","active","representative component in mixture","Aristolochic acid, sodium salt (77% AA I, 21% AA II)",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",363.25360107421875,,"",99.0,"sodium 8-(methyloxy)-6-nitrophenanthro[3,4-d][1,3]dioxole-5-carboxylate","",,"active","active",,"BQVOPWJSBBMGBR-KEMNOBITCY","structure shown AA I, parent [313-67-7]; AA II 6-Nitrophenanthro(3,4-d)-1,3-dioxole-5-carboxylic acid, sodium salt, AA II parent [475-80-9]","multisex active","10190-99-5",20099.0,"","","C17H10NNaO7",0.014100000262260437,"mixture or formulation",,"TD50; Tumor Target Sites","","salt Na","Carcinogenicity","kidney and urinary bladder were additional target sites but experiments too short to meet the inclusion rules of the CPDB; Rat added v2a; Mutagenicity_SAL_CPDB added v3a; TD50_Rat_mmol conversion from mg value not provided due to substance being a mixture","","100_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ARISTOLOCHIC%20ACID,%20SODIUM%20SALT%20(77%25%20AA%20I,%2021%25%20AA%20I.html","","",,"defined organic","stomach","","","","","[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+]","","","",,"","rat","stomach",20099.0, diff --git a/test/data/hamster_carcinogenicity.csv b/test/data/hamster_carcinogenicity.csv deleted file mode 100644 index 52d89a3..0000000 --- a/test/data/hamster_carcinogenicity.csv +++ /dev/null @@ -1,86 +0,0 @@ -SMILES, Hamster Carcinogenicity -CC=O,true -C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,true -O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,true -C1(N=CNN=1)N,false -Br(=O)(=O)[O-].[K+],true -[Cl-].[Cd+2].[Cl-],false -O=S(=O)([O-])[O-].[Cd+2],false -ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,false -ClCOC,true -C=C(Cl)C=C,false -Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,false -O=C1OC2=C(C=CC=C2)C=C1,false -ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,true -ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,false -C=CCN(CC=C)N=O,true -Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,false -O=C(N(C)C)Cl,true -CN(C)N,true -N(NC)C.[H]Cl.[H]Cl,true -CCO,false -O=C(N(CC)N=O)NCCO,true -O=C(N(CC)N=O)NCC(=O)C,true -C=O,false -[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,true -O=CC1=CC=CO1,false -OCC1CO1,true -O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,false -ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,true -NN,true -OS(=O)(=O)O.NN,true -CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,true -OCCNN,false -O=C(C1=CC=NC=C1)NN,false -OC(=O)C1=CC=NC=C1,false -O=C(NC1=CC=CC(=C1)Cl)OC(C)C,false -O=C(NC1=CC=CC=C1)OC(C)C,false -[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],false -CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,false -NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,false -CN(N)C=O,true -O=C(C(=C)C)OC,false -CNN,true -O=C(C1=CC=CN=C1)CCCN(N=O)C,false -CC1=CC(=O)NC(=S)N1,true -CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,false -O=N[O-].[Na+],false -[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,true -[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,true -O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],false -N(CC(CO)O)(CC(O)C)N=O,true -N(CC(CO)O)(CC(C)=O)N=O,true -N(CC(CO)O)(CCO)N=O,false -O=C(C)CN(N=O)CCO,true -C1C(N(C(CN1N=O)C)C)C,true -N(CC(C)=O)(CC=C)N=O,true -N(CC(CO)O)(C)N=O,true -O=NN1CCOCC1,true -N1C=CC=C(C=1)C2N(N=O)CCC2,true -C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,false -O=NN1CCCCC1,true -O=NN1CCCC1,true -O=C(N(CC(C)=O)N=O)NCCCl,true -N(C(=O)N)(N=O)CC(C)=O,true -C1(CCN=C=S)=CC=CC=C1,false -O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,false -C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,false -O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,false -C1(=CC(=C(O)C=C1)O)C(O)=O,false -O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,false -C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,false -C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,false -OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,false -ClC(=CCl)Cl,false -NC(=O)OCC,true -C=CCl,true -N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,false -C1(CN(CC(N1N=O)C)N=O)C,true -N(CCN(C)C)(C)N=O,true -C1(CN(N=O)CC(O1)C)C,true -O1C(N(CC1C)N=O)=O,true -CCOC(=O)N(C)N=O,true -C1N(COC1)N=O,true -O=C(N(CCC1=CC=CC=C1)N=O)N,true -O=NN1CCC1,true -F[B-](F)(F)F.[Na+],false diff --git a/test/data/hamster_carcinogenicity.mini.csv b/test/data/hamster_carcinogenicity.mini.csv deleted file mode 100644 index 4267235..0000000 --- a/test/data/hamster_carcinogenicity.mini.csv +++ /dev/null @@ -1,11 +0,0 @@ -SMILES, Hamster Carcinogenicity -CC=O,1 -C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,1 -O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,1 -C1(N=CNN=1)N,0 -Br(=O)(=O)[O-].[K+],1 -[Cl-].[Cd+2].[Cl-],0 -O=S(=O)([O-])[O-].[Cd+2],0 -ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,0 -ClCOC,1 -C=C(Cl)C=C,0 diff --git a/test/data/hamster_carcinogenicity.sdf b/test/data/hamster_carcinogenicity.sdf deleted file mode 100644 index df230d5..0000000 --- a/test/data/hamster_carcinogenicity.sdf +++ /dev/null @@ -1,2805 +0,0 @@ - - - - 3 2 0 0 0 0 0 0 0 0 1 V2000 - 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 17 19 0 0 0 0 0 0 0 0 1 V2000 - 5.7640 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.0213 -1.3540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8046 -2.4275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.1296 -2.2921 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.6712 -1.0735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.8878 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.5629 -0.1451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.0213 -3.5106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7640 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6035 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4526 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4526 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6035 -1.1025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3017 -3.7621 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1509 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1509 -1.7698 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 9 1 0 0 0 0 - 1 13 2 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 14 1 0 0 0 0 - 12 13 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 1 0 0 0 0 - 15 17 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 18 19 0 0 0 0 0 0 0 0 2 V2000 - 3.2537 -3.5906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2537 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4062 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4062 -4.2555 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1011 -4.2555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9682 -0.2748 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6649 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1011 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8866 -2.1366 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7006 -3.5817 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.0038 -3.8654 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.5587 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.6687 -2.7129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.7733 -1.7199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.5446 -5.0800 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 6.7644 -6.1527 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 8.8656 -5.2130 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 5 1 0 0 0 0 - 1 4 2 0 0 0 0 - 2 3 2 0 0 0 0 - 2 8 1 0 0 0 0 - 3 13 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 1 0 0 0 0 - 7 9 2 0 0 0 0 - 8 10 2 0 0 0 0 - 9 10 1 0 0 0 0 - 11 12 1 0 0 0 0 - 11 13 1 0 0 0 0 - 12 14 2 0 0 0 0 - 12 16 1 0 0 0 0 - 13 15 2 0 0 0 0 - 14 15 1 0 0 0 0 - 16 17 1 0 0 0 0 - 16 18 2 0 0 0 0 -M CHG 2 16 1 17 -1 -M END -> -active - -$$$$ - - - - 6 6 0 0 0 0 0 0 0 0 1 V2000 - 1.3304 -1.0738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1104 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3767 -0.4086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3767 -1.7390 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1104 -2.1509 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.0738 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 5 2 0 0 0 0 - 1 6 1 0 0 0 0 - 2 3 2 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 13 13 0 0 0 0 0 0 0 0 1 V2000 - 1.1541 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3012 -0.6703 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4553 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6094 -0.6703 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6094 -1.9972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4553 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3012 -1.9972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1541 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.4837 -1.5134 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.8175 -3.8147 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.3309 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7566 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9107 -1.9972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 5 12 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 8 10 1 0 0 0 0 - 8 11 1 0 0 0 0 - 12 13 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 3 0 0 0 0 0 0 0 0 0 2 V2000 - 10.0000 -0.0700 0.0000 Cl 0 5 0 0 0 0 0 0 0 0 0 0 - 4.5200 0.0000 0.0000 Cd 0 2 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.3400 0.0000 Cl 0 5 0 0 0 0 0 0 0 0 0 0 -M CHG 3 1 -1 2 2 3 -1 -M END -> -inactive - -$$$$ - - - - 6 4 0 0 0 0 0 0 0 0 2 V2000 - 2.6600 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6600 -1.3320 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6600 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3280 -1.3320 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 3.9880 -1.3320 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3320 0.0000 Cd 0 2 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 2 5 1 0 0 0 0 -M CHG 3 4 -1 5 -1 6 2 -M END -> -inactive - -$$$$ - - - - 0 0 0 0 0 0 0 0 0 0 1 V2000 -M END -> -inactive - -$$$$ - - - - 21 22 0 0 0 0 0 0 0 0 1 V2000 - 5.7698 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7698 -1.3315 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9111 -2.0036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9111 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7698 -3.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6158 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6158 -2.0036 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4619 -3.9945 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3079 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1540 -3.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1540 -5.3260 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.3351 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0650 -3.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2190 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2190 -2.0036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3730 -1.3315 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5269 -2.0036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5269 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3730 -3.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3730 -5.3260 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.6809 -3.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 13 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 6 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 10 12 1 0 0 0 0 - 13 14 1 0 0 0 0 - 14 15 2 0 0 0 0 - 14 19 1 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 2 0 0 0 0 - 17 18 1 0 0 0 0 - 18 19 2 0 0 0 0 - 18 21 1 0 0 0 0 - 19 20 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 4 3 0 0 0 0 0 0 0 0 1 V2000 - 3.4575 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3061 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1513 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 5 4 0 0 0 0 0 0 0 0 1 V2000 - 2.2415 -0.6520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1191 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3606 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2415 -2.0836 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 2 0 0 0 0 - 1 5 1 0 0 0 0 - 2 4 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 21 22 0 0 0 0 0 0 0 0 1 V2000 - 12.5806 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.2668 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9397 -1.3138 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3083 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9945 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.2574 -0.1592 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3177 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9718 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3177 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9585 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.2707 -2.4683 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2762 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3403 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9359 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9906 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9906 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.2989 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.2989 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.4683 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 11.2668 -2.6674 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.2668 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 2 0 0 0 0 - 1 11 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 20 1 0 0 0 0 - 2 21 1 0 0 0 0 - 3 12 1 0 0 0 0 - 4 8 2 0 0 0 0 - 4 5 1 0 0 0 0 - 4 10 1 0 0 0 0 - 5 7 1 0 0 0 0 - 5 9 2 0 0 0 0 - 7 15 2 0 0 0 0 - 8 18 1 0 0 0 0 - 9 16 1 0 0 0 0 - 10 17 2 0 0 0 0 - 12 14 1 0 0 0 0 - 13 16 2 0 0 0 0 - 13 19 1 0 0 0 0 - 13 15 1 0 0 0 0 - 14 17 1 0 0 0 0 - 14 18 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 11 12 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1518 -1.9983 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3036 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4554 -1.9983 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4554 -0.6680 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6071 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7589 -0.6680 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7589 -1.9983 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6071 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3036 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1518 -0.6680 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 11 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 5 10 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 10 11 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 18 19 0 0 0 0 0 0 0 0 1 V2000 - 3.4540 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6054 -0.6632 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6054 -1.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7567 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9080 -1.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0594 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0594 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9080 -4.6514 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7567 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2107 -4.6514 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4540 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4540 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3027 -4.6514 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1513 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1513 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3027 -1.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -4.6514 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7567 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 18 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 11 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 7 10 1 0 0 0 0 - 8 9 2 0 0 0 0 - 11 12 2 0 0 0 0 - 11 16 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 14 15 1 0 0 0 0 - 14 17 1 0 0 0 0 - 15 16 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 19 20 0 0 0 0 0 0 0 0 1 V2000 - 3.2800 -1.3268 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6068 -1.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6068 -2.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7585 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9102 -2.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0619 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0619 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9102 -5.3162 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7585 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2136 -5.3162 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4551 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4551 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3034 -5.3162 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1517 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1517 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3034 -2.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -5.3162 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6068 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9336 -1.3268 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 18 1 0 0 0 0 - 2 19 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 11 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 7 10 1 0 0 0 0 - 8 9 2 0 0 0 0 - 11 12 2 0 0 0 0 - 11 16 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 14 15 1 0 0 0 0 - 14 17 1 0 0 0 0 - 15 16 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 9 8 0 0 0 0 0 0 0 0 1 V2000 - 2.6588 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9976 -1.1548 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6588 -2.3049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9976 -3.4597 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6588 -4.6098 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9905 -4.6098 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6563 -3.4597 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6659 -3.4597 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3049 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 8 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 19 23 0 0 0 0 0 0 0 0 1 V2000 - 1.2310 -2.6401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.6401 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6007 -3.6931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2470 -2.9219 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4113 -2.7068 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.7946 -3.9008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1061 -5.0280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3001 -3.6931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.8500 -2.0023 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3902 -3.1295 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6954 -3.7599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.3258 -2.7068 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4159 -2.4250 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1478 -4.8203 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9749 -4.3235 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3902 -0.7787 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1318 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5522 -0.0742 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6583 -1.1643 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 1 0 0 0 0 - 1 4 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 6 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 7 1 0 0 0 0 - 5 9 1 0 0 0 0 - 5 8 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 1 0 0 0 0 - 8 10 1 0 0 0 0 - 9 12 1 0 0 0 0 - 9 16 1 0 0 0 0 - 9 19 1 0 0 0 0 - 10 11 1 0 0 0 0 - 10 16 1 0 0 0 0 - 10 15 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 14 1 0 0 0 0 - 12 13 1 0 0 0 0 - 16 17 1 0 0 0 0 - 16 18 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 6 5 0 0 0 0 0 0 0 0 1 V2000 - 1.3307 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9943 -1.1509 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3307 -2.3053 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9943 -3.4563 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3053 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3250 -1.1509 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 6 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 5 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 4 3 0 0 0 0 0 0 0 0 1 V2000 - 1.9950 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3292 -1.1518 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9950 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1518 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 8 5 0 0 0 0 0 0 0 0 1 V2000 - 2.7482 -0.6668 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9000 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.0518 -0.6668 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.5964 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6623 -1.9955 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9909 -1.9955 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9955 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3286 -1.9955 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 4 1 0 0 0 0 - 2 3 1 0 0 0 0 - 5 6 1 0 0 0 0 - 7 8 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 3 2 0 0 0 0 0 0 0 0 1 V2000 - 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 11 10 0 0 0 0 0 0 0 0 1 V2000 - 2.2999 -3.9852 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2999 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1534 -1.9891 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1534 -0.6630 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 -2.6591 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.9852 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4534 -1.9891 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6068 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7533 -1.9891 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9067 -2.6591 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 8 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 6 1 0 0 0 0 - 4 5 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 12 11 0 0 0 0 0 0 0 0 1 V2000 - 2.3006 -3.9862 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3006 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1537 -1.9897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1537 -0.6632 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 -2.6598 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.9862 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4543 -1.9897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6080 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7548 -1.9897 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7548 -0.6632 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9086 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 8 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 6 1 0 0 0 0 - 4 5 1 0 0 0 0 - 6 7 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 10 12 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 2 1 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3300 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 17 18 0 0 0 0 0 0 0 0 2 V2000 - 11.3714 -1.9900 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 10.2229 -1.3304 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 10.2229 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 9.0743 -1.9900 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.9265 -3.3204 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.6302 -3.5933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9706 -2.4448 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8576 -1.4555 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6402 -2.3084 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.7532 -3.2863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5365 -2.7519 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 3.6729 -1.4328 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.9807 -1.1485 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6950 -0.5345 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.4442 -1.0121 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.2395 -2.3311 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.8087 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 8 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 7 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 13 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 2 0 0 0 0 - 12 14 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 2 0 0 0 0 -M CHG 2 1 -1 2 1 -M END -> -active - -$$$$ - - - - 7 7 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -1.5998 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1503 -2.2653 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3050 -1.5998 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.4416 -0.2777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.7417 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4072 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5169 -2.1419 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 7 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 7 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 5 5 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -1.1519 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1519 -1.8168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3037 -1.1519 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.9687 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.6336 -1.1519 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 5 1 0 0 0 0 - 4 5 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 24 26 0 0 1 0 0 0 0 0 1 V2000 - 6.2320 -1.0924 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.8471 -2.3097 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6298 -2.7050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6298 -3.9743 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.8471 -4.3593 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.5857 -3.3293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.2308 -2.2369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.5001 -2.2369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.1347 -3.3293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.4040 -3.3293 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.5001 -4.4321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.2308 -4.4321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.5857 -5.5453 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.0019 -0.9780 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9799 -0.1665 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5374 -4.6090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5374 -5.8783 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 2.4241 -3.9743 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3213 -4.6090 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.1316 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.4241 -2.7050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5374 -2.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5374 -0.7907 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.6334 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 6 2 1 1 0 0 0 - 3 4 2 0 0 0 0 - 3 22 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 16 1 0 0 0 0 - 6 5 1 6 0 0 0 - 6 7 1 0 0 0 0 - 6 12 1 0 0 0 0 - 7 8 2 0 0 0 0 - 7 14 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 1 0 0 0 - 14 15 1 0 0 0 0 - 16 17 1 0 0 0 0 - 16 18 2 0 0 0 0 - 18 19 1 0 0 0 0 - 18 21 1 0 0 0 0 - 19 20 1 0 0 0 0 - 21 22 2 0 0 0 0 - 22 23 1 0 0 0 0 - 23 24 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 12 12 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -2.3036 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3300 -2.3036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9950 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3250 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9901 -2.3036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3250 -3.4581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9950 -3.4581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3300 -4.6072 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9901 -4.6072 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3201 -2.3036 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9901 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3300 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 12 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 11 1 0 0 0 0 - 5 6 1 0 0 0 0 - 5 10 1 0 0 0 0 - 6 7 2 0 0 0 0 - 6 9 1 0 0 0 0 - 7 8 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 2 1 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3300 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 7 5 0 0 0 0 0 0 0 0 1 V2000 - 3.9900 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9900 -1.3300 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6600 -1.3300 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3200 -1.3300 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9900 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3300 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3300 -1.3300 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 2 0 0 0 0 - 2 5 1 0 0 0 0 - 6 7 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 18 20 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3313 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9920 -3.4593 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9920 -1.1564 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3313 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3233 -1.1564 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9938 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3251 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9858 -1.1564 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3251 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9938 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.2880 -1.4284 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.3666 -0.6511 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.5812 -1.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.7173 -2.5168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6387 -3.2942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4240 -2.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2093 -3.2942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 6 11 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 8 18 1 0 0 0 0 - 9 10 1 0 0 0 0 - 9 12 1 0 0 0 0 - 10 11 2 0 0 0 0 - 12 13 2 0 0 0 0 - 12 17 1 0 0 0 0 - 13 14 1 0 0 0 0 - 14 15 2 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 2 0 0 0 0 - 17 18 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 5 4 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1525 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3050 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4575 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6099 -0.6638 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 10 10 0 0 0 0 0 0 0 0 1 V2000 - 4.6545 -3.4536 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9889 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6577 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9968 -3.4536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6656 -3.4536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6656 -1.1497 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9968 -1.1497 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6545 -1.1497 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9889 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 9 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 9 10 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 9 9 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6655 -1.1542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9965 -1.1542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6574 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9884 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6539 -1.1542 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9884 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6574 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 14 14 0 0 0 0 0 0 0 0 1 V2000 - 3.4524 -0.6629 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4524 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6031 -2.6606 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7539 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7539 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9047 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0555 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0555 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9047 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2063 -2.6606 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3016 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1508 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1508 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 11 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 8 10 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 12 14 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 13 13 0 0 0 0 0 0 0 0 1 V2000 - 3.4601 -0.6694 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4601 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6054 -2.6616 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7587 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7587 -0.6694 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9121 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0654 -0.6694 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0654 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9121 -2.6616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3067 -2.6616 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1534 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.6616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1534 -0.6694 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 10 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 11 13 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 15 6 0 0 0 0 0 0 0 0 3 V2000 - 5.7806 -4.7517 0.0000 Pb 0 2 0 0 0 2 0 0 0 0 0 0 - 5.1849 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 4.5351 -1.1507 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1849 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1949 -1.1507 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0036 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1.3267 -1.1507 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.0036 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1507 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 7.6759 -4.9413 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 5.8754 -5.6452 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 11.4935 -1.8817 0.0000 Pb 0 2 0 0 0 2 0 0 0 0 0 0 - 13.5377 -1.9900 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 11.7778 -2.7075 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 3.6281 -3.4792 0.0000 Pb 0 2 0 0 0 2 0 0 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 5 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 9 2 0 0 0 0 -M CHG 8 1 2 2 -1 6 -1 10 -1 11 -1 12 2 13 -1 14 -1 -M CHG 1 15 2 -M END -> -inactive - -$$$$ - - - - 20 20 0 0 0 0 0 0 0 0 1 V2000 - 4.4090 -3.9937 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.5672 -4.6567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.7174 -3.9937 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8676 -4.6567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.8676 -5.9906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.7174 -6.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.5672 -5.9906 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2589 -4.6567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1087 -3.9937 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8946 -4.5368 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.5464 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6630 -2.3962 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9649 -2.6678 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4090 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2589 -1.9969 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2589 -0.6630 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1087 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4090 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3307 -7.9874 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6567 -7.9874 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 8 1 0 0 0 0 - 1 14 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 7 2 0 0 0 0 - 3 4 2 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 7 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 13 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 12 13 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 1 0 0 0 0 - 16 18 1 0 0 0 0 - 19 20 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 33 35 0 0 1 0 0 0 0 0 1 V2000 - 14.9725 -5.3302 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 13.8197 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.6668 -5.3302 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5139 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5139 -7.3216 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 12.6668 -7.9804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 13.8197 -7.3216 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 12.6668 -9.3129 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3610 -5.3302 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3610 -3.9977 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5139 -3.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 12.6668 -3.9977 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 11.5139 -1.9913 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3610 -1.3326 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2081 -1.9913 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2081 -3.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0552 -3.9977 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9173 -3.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9173 -1.9913 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0552 -1.3326 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7644 -3.9977 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6115 -3.3239 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7644 -5.3302 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6115 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4587 -5.3302 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3058 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1529 -5.3302 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1529 -3.9977 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -5.9890 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6115 -7.3216 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4587 -7.9804 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7644 -7.9804 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3610 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 12 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 6 8 1 0 0 0 0 - 9 10 2 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 11 13 1 0 0 0 0 - 13 14 1 0 0 0 0 - 14 15 1 0 0 0 0 - 14 33 1 0 0 0 0 - 15 16 2 0 0 0 0 - 15 20 1 0 0 0 0 - 16 17 1 0 0 0 0 - 17 18 2 0 0 0 0 - 18 19 1 0 0 0 0 - 18 21 1 0 0 0 0 - 19 20 2 0 0 0 0 - 21 22 2 0 0 0 0 - 21 23 1 0 0 0 0 - 24 23 1 6 0 0 0 - 24 25 1 0 0 0 0 - 24 30 1 0 0 0 0 - 25 26 1 0 0 0 0 - 26 27 1 0 0 0 0 - 27 28 2 0 0 0 0 - 27 29 1 0 0 0 0 - 30 31 2 0 0 0 0 - 30 32 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 5 4 0 0 0 0 0 0 0 0 1 V2000 - 2.3056 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3056 -1.3308 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4567 -1.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3308 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 7 6 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -2.3052 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3306 -2.3052 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9941 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3247 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3306 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9941 -3.4560 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3247 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 6 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 5 1 0 0 0 0 - 6 7 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 3 2 0 0 0 0 0 0 0 0 1 V2000 - 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1515 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6656 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 15 15 0 0 0 0 0 0 0 0 1 V2000 - 3.4524 -3.9915 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4524 -2.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3016 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1508 -2.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1508 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3016 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6032 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7643 -2.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9151 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0659 -2.6644 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2167 -2.0009 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3675 -2.6644 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0659 -3.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 9 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 12 15 1 0 0 0 0 - 13 14 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 9 9 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3315 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9950 -1.1518 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3265 -1.1518 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9899 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9899 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3265 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9899 -4.6073 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9950 -3.4555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 9 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 7 9 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 23 25 0 0 0 0 0 0 0 0 1 V2000 - 1.6416 -5.7565 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2982 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1491 -3.9398 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -4.6074 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1491 -2.6156 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.9658 -3.4583 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3010 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.9576 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2928 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9604 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2928 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.9576 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.2846 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.9522 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.2764 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.9440 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.2764 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.9522 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.2846 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.9522 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.2764 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.9440 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4583 -5.2750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 6 1 0 0 0 0 - 2 23 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 5 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 7 12 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 10 11 1 0 0 0 0 - 10 13 1 0 0 0 0 - 11 12 2 0 0 0 0 - 13 14 1 0 0 0 0 - 13 18 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 1 0 0 0 0 - 17 18 2 0 0 0 0 - 17 22 1 0 0 0 0 - 18 19 1 0 0 0 0 - 19 20 2 0 0 0 0 - 20 21 1 0 0 0 0 - 21 22 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 4 2 0 0 0 0 0 0 0 0 2 V2000 - 2.3030 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1515 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6656 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1.1975 -1.9944 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 -M CHG 2 3 -1 4 1 -M END -> -inactive - -$$$$ - - - - 17 18 0 0 0 0 0 0 0 0 2 V2000 - 1.2652 -1.2985 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.7091 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1.5426 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2529 -2.1863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5514 -1.9089 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.2173 -3.0631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3294 -4.0508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1086 -3.5070 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.5380 -3.1963 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.4258 -2.2085 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 7.6466 -2.7523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.5023 -4.0730 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 6.2039 -4.3505 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.8008 -2.0865 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9439 -2.7523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9439 -4.0841 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 11.0981 -2.0865 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 3 2 0 0 0 0 - 1 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 8 2 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 6 9 1 0 0 0 0 - 7 8 1 0 0 0 0 - 9 10 1 0 0 0 0 - 9 13 2 0 0 0 0 - 10 11 2 0 0 0 0 - 11 12 1 0 0 0 0 - 11 14 1 0 0 0 0 - 12 13 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 2 0 0 0 0 - 15 17 1 0 0 0 0 -M CHG 2 1 1 2 -1 -M END -> -active - -$$$$ - - - - 16 17 0 0 0 0 0 0 0 0 2 V2000 - 10.9589 -1.9945 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 9.8082 -1.3260 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 9.8082 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6575 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.5151 -3.3205 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.2110 -3.5945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.5534 -2.4438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.4411 -1.4575 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.2274 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.3397 -3.2877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1233 -2.7507 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 3.2658 -1.4247 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.5589 -1.1507 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2795 -0.5370 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.0301 -1.0192 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.1753 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 8 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 7 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 9 13 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 2 0 0 0 0 - 12 14 1 0 0 0 0 - 14 15 1 0 0 0 0 - 15 16 2 0 0 0 0 -M CHG 2 1 -1 2 1 -M END -> -active - -$$$$ - - - - 15 17 0 0 0 0 0 0 0 0 2 V2000 - 4.2842 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.2842 -1.3283 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 3.1294 -1.9925 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9805 -1.3283 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8257 -1.9925 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.8257 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9805 -3.9910 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1294 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.2842 -3.9910 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.2842 -5.3193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.1294 -5.9835 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9805 -5.3193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6642 -5.5168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -4.3620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.4330 -1.9925 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 15 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 7 1 0 0 0 0 - 6 14 1 0 0 0 0 - 7 8 2 0 0 0 0 - 7 12 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 1 0 0 0 0 -M CHG 2 2 1 15 -1 -M END -> -inactive - -$$$$ - - - - 12 11 0 0 0 0 0 0 0 0 1 V2000 - 3.3277 -1.1482 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9859 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3169 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9825 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3135 -1.1482 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9825 -3.4520 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9966 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3311 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9966 -3.4520 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9859 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3169 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 7 1 0 0 0 0 - 1 11 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 6 1 0 0 0 0 - 4 5 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 8 10 1 0 0 0 0 - 11 12 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 12 11 0 0 0 0 0 0 0 0 1 V2000 - 3.3277 -1.1482 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9859 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3169 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9825 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3135 -1.1482 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9825 -3.4520 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9966 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3311 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9966 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3038 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9859 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3169 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 7 1 0 0 0 0 - 1 11 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 6 1 0 0 0 0 - 4 5 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 8 10 2 0 0 0 0 - 11 12 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 11 10 0 0 0 0 0 0 0 0 1 V2000 - 3.9901 -2.3031 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3261 -1.1486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9921 -1.1486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3280 -2.3031 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3031 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3280 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3182 -2.3031 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9822 -1.1486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3182 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3261 -3.4517 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9921 -3.4517 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 7 1 0 0 0 0 - 1 10 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 6 1 0 0 0 0 - 4 5 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 10 11 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 10 9 0 0 0 0 0 0 0 0 1 V2000 - 1.9973 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6584 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9973 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6658 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6584 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6584 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9899 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6557 -3.4592 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6658 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3046 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 1 0 0 0 0 - 1 9 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 5 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 9 10 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 11 11 0 0 0 0 0 0 0 0 1 V2000 - 3.3269 -3.4585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9925 -3.4585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3283 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9925 -1.1548 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3269 -1.1548 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9910 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3194 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9835 -1.1548 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3283 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3283 -4.6073 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 11 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 10 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 10 9 0 0 0 0 0 0 0 0 1 V2000 - 1.9973 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6584 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9973 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6658 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6584 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6584 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9899 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6557 -3.4592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6658 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3046 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 1 0 0 0 0 - 1 9 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 5 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 9 10 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 9 8 0 0 0 0 0 0 0 0 1 V2000 - 2.3046 -1.9992 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4569 -2.6618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6092 -1.9992 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6092 -0.6683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4569 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7615 -2.6618 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3046 -0.6683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1523 -2.6618 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9992 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 7 1 0 0 0 0 - 1 8 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 6 1 0 0 0 0 - 4 5 1 0 0 0 0 - 8 9 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 8 8 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6654 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9962 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9877 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6531 -1.1540 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9877 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6569 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 13 14 0 0 0 0 0 0 0 0 1 V2000 - 2.2670 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5961 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.2606 -1.1490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5961 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2670 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.5962 -1.1490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.5962 -3.4532 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1427 -4.6705 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4408 -4.9438 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.8507 -6.2108 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1490 -5.5587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -4.8941 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.2795 -3.5961 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 2 0 0 0 0 - 2 3 2 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 5 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 13 1 0 0 0 0 - 8 9 1 0 0 0 0 - 8 11 1 0 0 0 0 - 9 10 2 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 14 15 0 0 0 0 0 0 0 0 2 V2000 - 5.5085 -1.1540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.1727 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.5085 -3.4554 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.1800 -3.4554 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5091 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.1800 -1.1540 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 3.5091 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 - 3.5091 -4.6027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.0525 -5.8171 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.0662 -6.7095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9122 -6.0453 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1873 -4.7436 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3016 -3.7573 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -4.0324 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 1 6 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 2 0 0 0 0 - 4 5 1 0 0 0 0 - 4 8 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 7 1 0 0 0 0 - 8 9 1 0 0 0 0 - 8 12 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 -M CHG 2 6 1 7 -1 -M END -> -inactive - -$$$$ - - - - 8 8 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6654 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9962 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9877 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6531 -1.1540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9877 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6569 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 7 7 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -1.5998 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1503 -2.2653 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3050 -1.5998 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.4416 -0.2777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.7417 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4072 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.5169 -2.1419 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 7 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 13 12 0 0 0 0 0 0 0 0 1 V2000 - 3.3259 -3.4535 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9879 -2.2970 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3259 -1.1485 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9939 -1.1485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3320 -2.2970 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9939 -3.4535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.2970 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9879 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3199 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3199 -2.2970 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9818 -3.4535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3138 -3.4535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9758 -4.6020 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 10 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 5 7 2 0 0 0 0 - 8 9 2 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 10 9 0 0 0 0 0 0 0 0 1 V2000 - 2.3042 -1.9989 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3042 -0.6682 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4563 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1521 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1521 -2.6614 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9989 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4563 -2.6614 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6084 -1.9989 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7605 -2.6614 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6084 -0.6682 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 5 1 0 0 0 0 - 1 7 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 5 6 2 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 1 0 0 0 0 - 8 10 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 11 11 0 0 0 0 0 0 0 0 1 V2000 - 5.7578 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6046 -2.6612 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4595 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3063 -2.6612 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1532 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3306 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7578 -0.6693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9109 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0641 -0.6693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0641 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9109 -2.6612 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 7 2 0 0 0 0 - 1 11 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 2 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 17 18 0 0 0 0 0 0 0 0 1 V2000 - 2.3044 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3044 -1.3295 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4567 -1.9942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.7640 -2.2232 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6208 -1.2039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9281 -1.4329 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3860 -2.6885 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.5292 -3.7078 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.2219 -3.4714 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4567 -3.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6089 -3.9884 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3044 -3.9884 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1522 -3.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.9884 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1522 -1.9942 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9146 -0.7460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.2219 -0.5096 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 15 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 10 1 0 0 0 0 - 3 16 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 9 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 10 11 2 0 0 0 0 - 10 12 1 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 13 15 1 0 0 0 0 - 16 17 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 17 19 0 0 0 0 0 0 0 0 1 V2000 - 5.7546 -2.6609 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9055 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9055 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7546 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6037 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6037 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4528 -2.6609 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3018 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1509 -2.6609 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1509 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3018 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0564 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2074 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2074 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0564 -2.6609 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 1 6 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 17 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 14 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 8 13 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 2 0 0 0 0 - 14 15 2 0 0 0 0 - 15 16 1 0 0 0 0 - 16 17 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 23 26 0 0 0 0 0 0 0 0 1 V2000 - 4.6025 -7.9798 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6025 -6.6499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4579 -5.9889 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4579 -4.6589 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3053 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1526 -4.6589 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.6599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1526 -1.9990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3053 -2.6599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1526 -5.9889 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3053 -6.6499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6025 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7552 -4.6589 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7552 -5.9889 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9078 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0604 -4.6589 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9078 -2.6599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7552 -1.9990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7552 -0.6690 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9078 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0604 -0.6690 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0604 -1.9990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 15 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 12 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 13 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 10 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 11 1 0 0 0 0 - 7 8 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 2 0 0 0 0 - 11 12 1 0 0 0 0 - 13 14 1 0 0 0 0 - 14 15 1 0 0 0 0 - 14 16 1 0 0 0 0 - 16 17 2 0 0 0 0 - 16 18 1 0 0 0 0 - 18 19 1 0 0 0 0 - 18 23 1 0 0 0 0 - 19 20 1 0 0 0 0 - 20 21 1 0 0 0 0 - 21 22 1 0 0 0 0 - 22 23 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 11 11 0 0 0 0 0 0 0 0 1 V2000 - 1.9925 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6567 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9910 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6552 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9835 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9910 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6567 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6552 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6642 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.4525 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.1488 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 1 7 1 0 0 0 0 - 1 9 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 9 10 1 0 0 0 0 - 9 11 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 24 24 0 0 0 0 0 0 0 0 1 V2000 - 4.6016 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6016 -1.3369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4512 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4512 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3008 -3.9901 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1504 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1504 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3008 -1.3369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3008 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -3.9901 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6016 -3.9901 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7623 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7623 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9127 -1.3369 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9127 -3.9901 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0631 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2135 -3.9901 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2135 -5.3270 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0631 -5.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9127 -5.3270 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3639 -5.9903 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3639 -3.3268 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.1819 -7.3169 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.8554 -7.3169 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 13 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 11 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 7 1 0 0 0 0 - 6 10 1 0 0 0 0 - 7 8 2 0 0 0 0 - 8 9 1 0 0 0 0 - 11 12 1 0 0 0 0 - 12 13 2 0 0 0 0 - 12 15 1 0 0 0 0 - 13 14 1 0 0 0 0 - 15 16 2 0 0 0 0 - 15 20 1 0 0 0 0 - 16 17 1 0 0 0 0 - 17 18 2 0 0 0 0 - 17 22 1 0 0 0 0 - 18 19 1 0 0 0 0 - 18 21 1 0 0 0 0 - 19 20 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 25 26 0 0 0 0 0 0 0 0 1 V2000 - 10.6420 -6.9191 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9717 -8.0683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6429 -8.0683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9845 -6.9191 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6429 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9717 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9845 -4.6088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6429 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9845 -2.3104 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6429 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9717 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.6420 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 10.6420 -2.3104 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9717 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 11.9708 -2.3104 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6558 -4.6088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9854 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6566 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9863 -4.6088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6575 -4.6088 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6566 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9854 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.6420 -9.2175 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -4.5609 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3288 -4.5609 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 1 6 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 23 1 0 0 0 0 - 3 4 2 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 5 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 16 2 0 0 0 0 - 8 9 2 0 0 0 0 - 8 14 1 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 11 12 1 0 0 0 0 - 11 13 1 0 0 0 0 - 13 14 2 0 0 0 0 - 13 15 1 0 0 0 0 - 16 17 1 0 0 0 0 - 16 22 1 0 0 0 0 - 17 18 2 0 0 0 0 - 18 19 1 0 0 0 0 - 19 20 2 0 0 0 0 - 19 21 1 0 0 0 0 - 21 22 2 0 0 0 0 - 24 25 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 24 25 0 0 0 0 0 0 0 0 1 V2000 - 7.9826 -4.6086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6532 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9826 -2.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6532 -1.1495 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9730 -1.1495 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.6435 -2.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9730 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.6435 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6532 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9730 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.6435 -6.9076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.9730 -8.0678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.6532 -8.0678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9826 -6.9076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.6435 -9.2173 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.6522 -4.6086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9923 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6619 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9913 -4.6086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6619 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9923 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6609 -4.6086 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -4.5554 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3304 -4.5554 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 9 1 0 0 0 0 - 1 16 2 0 0 0 0 - 2 3 2 0 0 0 0 - 2 7 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 5 6 1 0 0 0 0 - 5 8 1 0 0 0 0 - 6 7 2 0 0 0 0 - 9 10 2 0 0 0 0 - 9 14 1 0 0 0 0 - 10 11 1 0 0 0 0 - 11 12 2 0 0 0 0 - 12 13 1 0 0 0 0 - 12 15 1 0 0 0 0 - 13 14 2 0 0 0 0 - 16 17 1 0 0 0 0 - 16 21 1 0 0 0 0 - 17 18 2 0 0 0 0 - 18 19 1 0 0 0 0 - 19 20 1 0 0 0 0 - 19 22 2 0 0 0 0 - 20 21 2 0 0 0 0 - 23 24 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 43 47 0 0 1 0 0 0 0 0 1 V2000 - 4.6024 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6024 -9.9693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7644 -9.3118 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9112 -9.9693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0580 -9.3118 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2048 -9.9693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2048 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0580 -11.9723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9112 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7644 -11.9723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3668 -11.9723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0580 -7.9815 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7644 -7.9815 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4556 -9.3118 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4556 -7.9815 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6024 -7.3088 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6024 -5.9785 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7644 -5.3210 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7644 -3.9908 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9112 -3.3180 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9112 -1.9877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0580 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2048 -1.9877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3668 -1.3303 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 9.2048 -3.3180 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0580 -3.9908 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 10.3668 -3.9908 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 8.0580 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7644 -1.3303 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4556 -5.3210 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4556 -3.9908 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3088 -5.9785 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3088 -7.3088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1468 -7.9815 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1468 -5.3210 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4556 -11.9723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4556 -13.3026 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3088 -13.9600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1468 -13.3026 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -13.9600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1468 -11.9723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3088 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3088 -15.2903 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 1 10 1 0 0 0 0 - 1 36 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 14 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 13 2 0 0 0 0 - 4 5 1 0 0 0 0 - 4 9 2 0 0 0 0 - 5 6 2 0 0 0 0 - 5 12 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 7 11 1 0 0 0 0 - 8 9 1 0 0 0 0 - 9 10 1 0 0 0 0 - 15 14 1 1 0 0 0 - 15 16 1 0 0 0 0 - 15 33 1 0 0 0 0 - 16 17 1 0 0 0 0 - 17 18 1 1 0 0 0 - 17 30 1 0 0 0 0 - 18 19 1 0 0 0 0 - 20 19 1 1 0 0 0 - 20 21 1 0 0 0 0 - 20 26 1 0 0 0 0 - 21 22 1 0 0 0 0 - 21 29 1 6 0 0 0 - 22 23 1 0 0 0 0 - 22 28 1 6 0 0 0 - 23 24 1 1 0 0 0 - 23 25 1 0 0 0 0 - 25 26 1 0 0 0 0 - 25 27 1 6 0 0 0 - 30 31 1 6 0 0 0 - 30 32 1 0 0 0 0 - 32 33 1 0 0 0 0 - 32 35 1 1 0 0 0 - 33 34 1 6 0 0 0 - 36 37 2 0 0 0 0 - 36 42 1 0 0 0 0 - 37 38 1 0 0 0 0 - 38 39 2 0 0 0 0 - 38 43 1 0 0 0 0 - 39 40 1 0 0 0 0 - 39 41 1 0 0 0 0 - 41 42 2 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 5 4 0 0 0 0 0 0 0 0 1 V2000 - 3.4567 -1.9945 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3308 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3056 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 5 1 0 0 0 0 - 3 4 1 0 0 0 0 -M END -> -inactive - -$$$$ - - - - 6 5 0 0 0 0 0 0 0 0 1 V2000 - 4.6084 -1.9954 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4563 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4563 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3042 -1.9954 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1521 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 2 0 0 0 0 - 2 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 3 2 0 0 0 0 0 0 0 0 1 V2000 - 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -0.6656 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 13 12 0 0 0 0 0 0 0 0 2 V2000 - 0.0000 -1.1513 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3274 -1.1513 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 - 2.6611 -1.1513 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3217 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6554 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3159 -1.1513 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6554 -2.3025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3217 -2.3025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6611 -6.2911 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6611 -4.9636 0.0000 B 0 5 0 0 0 0 0 0 0 0 0 0 - 1.3274 -4.9636 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6611 -3.6299 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9885 -4.9636 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 3 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 2 0 0 0 0 - 3 8 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 1 0 0 0 0 - 10 12 1 0 0 0 0 - 10 13 1 0 0 0 0 -M CHG 2 2 1 10 -1 -M END -> -inactive - -$$$$ - - - - 12 12 0 0 0 0 0 0 0 0 1 V2000 - 3.4560 -1.3271 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6103 -1.9906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6103 -3.3247 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4560 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3017 -3.3247 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3017 -1.9906 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1543 -1.3271 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9906 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1543 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7577 -3.9882 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9120 -3.3247 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4560 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 1 0 0 0 0 - 1 12 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 10 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 5 9 1 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 2 0 0 0 0 - 10 11 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 9 8 0 0 0 0 0 0 0 0 1 V2000 - 4.6053 -1.9954 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.4522 -1.3257 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2992 -1.9954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1530 -1.3257 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.9954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1530 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6053 -3.3210 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.7514 -1.3257 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 6.9045 -1.9954 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 7 1 0 0 0 0 - 1 8 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 6 1 0 0 0 0 - 8 9 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 10 10 0 0 0 0 0 0 0 0 1 V2000 - 0.6656 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9968 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6577 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9889 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6545 -1.1543 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9968 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6656 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3040 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -4.6079 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 1 0 0 0 0 - 1 8 1 0 0 0 0 - 1 10 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 6 1 0 0 0 0 - 4 5 2 0 0 0 0 - 6 7 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 9 1 0 0 0 0 -M END -> -active - -$$$$ - - - - 9 9 0 0 0 0 0 0 0 0 1 V2000 - 2.1136 -0.3740 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3772 -0.7820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3772 -2.1136 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.1136 -2.5272 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3316 -1.4506 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.4506 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4538 -2.8956 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.6665 -2.3572 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4538 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 5 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 9 2 0 0 0 0 - 3 4 1 0 0 0 0 - 3 7 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 7 8 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 9 8 0 0 0 0 0 0 0 0 1 V2000 - 0.0000 -1.1552 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.6644 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9932 -2.3044 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6576 -1.1552 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9932 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9924 -1.1552 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6568 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 4.6568 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9855 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 2 0 0 0 0 - 4 6 1 0 0 0 0 - 6 7 1 0 0 0 0 - 6 8 1 0 0 0 0 - 8 9 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 7 7 0 0 0 0 0 0 0 0 1 V2000 - 3.5169 -2.1419 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.3050 -1.5998 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 2.4416 -0.2777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.7417 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 4.4072 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.1503 -2.2653 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.5998 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 5 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 6 1 0 0 0 0 - 3 4 1 0 0 0 0 - 4 5 1 0 0 0 0 - 6 7 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 14 14 0 0 0 0 0 0 0 0 1 V2000 - 1.9935 -3.4527 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3316 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.9935 -1.1482 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 3.3251 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9869 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.3186 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9804 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3120 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.9739 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 7.3120 -3.4527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 5.9804 -3.4527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1.3316 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.3044 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 2 0 0 0 0 - 2 3 1 0 0 0 0 - 2 14 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 12 1 0 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 6 7 2 0 0 0 0 - 6 11 1 0 0 0 0 - 7 8 1 0 0 0 0 - 8 9 2 0 0 0 0 - 9 10 1 0 0 0 0 - 10 11 2 0 0 0 0 - 12 13 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 6 6 0 0 0 0 0 0 0 0 1 V2000 - 2.2694 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 2.2694 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 0.9376 -1.3318 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -2.2694 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 - 0.3409 -3.5516 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 - 0.9376 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 1 6 1 0 0 0 0 - 2 3 1 0 0 0 0 - 3 4 1 0 0 0 0 - 3 6 1 0 0 0 0 - 4 5 2 0 0 0 0 -M END -> -active - -$$$$ - - - - 6 4 0 0 0 0 0 0 0 0 2 V2000 - 2.6600 -2.6600 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6600 -1.3320 0.0000 B 0 5 0 0 0 0 0 0 0 0 0 0 - 1.3280 -1.3320 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 2.6600 0.0000 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 3.9880 -1.3320 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 - 0.0000 -1.3320 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 - 1 2 1 0 0 0 0 - 2 3 1 0 0 0 0 - 2 4 1 0 0 0 0 - 2 5 1 0 0 0 0 -M CHG 2 2 -1 6 1 -M END -> -inactive - diff --git a/test/data/hamster_carcinogenicity.xls b/test/data/hamster_carcinogenicity.xls deleted file mode 100644 index 680c30e..0000000 Binary files a/test/data/hamster_carcinogenicity.xls and /dev/null differ diff --git a/test/data/hamster_carcinogenicity.yaml b/test/data/hamster_carcinogenicity.yaml deleted file mode 100644 index 108edd9..0000000 --- a/test/data/hamster_carcinogenicity.yaml +++ /dev/null @@ -1,352 +0,0 @@ ---- !ruby/object:OpenTox::Dataset -compounds: -- http://localhost/compound/InChI=1S/C2H4O/c1-2-3/h2H,1H3 -- http://localhost/compound/InChI=1S/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17) -- http://localhost/compound/InChI=1S/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14) -- http://localhost/compound/InChI=1S/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6) -- http://localhost/compound/InChI=1S/BrHO3.K/c2-1(3)4;/h(H,2,3,4);/q;+1/p-1 -- http://localhost/compound/InChI=1S/Cd.2ClH/h;2*1H/q+2;;/p-2 -- http://localhost/compound/InChI=1S/Cd.H2O4S/c;1-5(2,3)4/h;(H2,1,2,3,4)/q+2;/p-2 -- http://localhost/compound/InChI=1S/C14H14ClN3O2S/c1-8-4-3-5-10(9(8)2)16-12-6-11(15)17-14(18-12)21-7-13(19)20/h3-6H,7H2,1-2H3,(H,19,20)(H,16,17,18) -- http://localhost/compound/InChI=1S/C2H5ClO/c1-4-2-3/h2H2,1H3 -- http://localhost/compound/InChI=1S/C4H5Cl/c1-3-4(2)5/h3H,1-2H2 -- http://localhost/compound/InChI=1S/C17H17ClO3/c1-17(2,16(19)20)21-11-12-3-5-13(6-4-12)14-7-9-15(18)10-8-14/h3-10H,11H2,1-2H3,(H,19,20) -- http://localhost/compound/InChI=1S/C9H6O2/c10-9-6-5-7-3-1-2-4-8(7)11-9/h1-6H -- http://localhost/compound/InChI=1S/C14H8Cl4/c15-11-5-1-9(2-6-11)13(14(17)18)10-3-7-12(16)8-4-10/h1-8H -- http://localhost/compound/InChI=1S/C14H9Cl5/c15-11-5-1-9(2-6-11)13(14(17,18)19)10-3-7-12(16)8-4-10/h1-8,13H -- http://localhost/compound/InChI=1S/C6H10N2O/c1-3-5-8(7-9)6-4-2/h3-4H,1-2,5-6H2 -- http://localhost/compound/InChI=1S/C12H8Cl6O/c13-8-9(14)11(16)5-3-1-2(6-7(3)19-6)4(5)10(8,15)12(11,17)18/h2-7H,1H2 -- http://localhost/compound/InChI=1S/C3H6ClNO/c1-5(2)3(4)6/h1-2H3 -- http://localhost/compound/InChI=1S/C2H8N2/c1-4(2)3/h3H2,1-2H3 -- http://localhost/compound/InChI=1S/C2H8N2.2ClH/c1-3-4-2;;/h3-4H,1-2H3;2*1H -- http://localhost/compound/InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3 -- http://localhost/compound/InChI=1S/C5H11N3O3/c1-2-8(7-11)5(10)6-3-4-9/h9H,2-4H2,1H3,(H,6,10) -- http://localhost/compound/InChI=1S/C6H11N3O3/c1-3-9(8-12)6(11)7-4-5(2)10/h3-4H2,1-2H3,(H,7,11) -- http://localhost/compound/InChI=1S/CH2O/c1-2/h1H2 -- http://localhost/compound/InChI=1S/C8H6N4O4S/c13-4-9-11-8-10-5(3-17-8)6-1-2-7(16-6)12(14)15/h1-4H,(H,9,13)(H,10,11) -- http://localhost/compound/InChI=1S/C5H4O2/c6-4-5-2-1-3-7-5/h1-4H -- http://localhost/compound/InChI=1S/C3H6O2/c4-1-3-2-5-3/h3-4H,1-2H2 -- http://localhost/compound/InChI=1S/C17H17ClO6/c1-8-5-9(19)6-12(23-4)17(8)16(20)13-10(21-2)7-11(22-3)14(18)15(13)24-17/h6-8H,5H2,1-4H3/t8-,17?/m1/s1 -- http://localhost/compound/InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9 -- http://localhost/compound/InChI=1S/H4N2/c1-2/h1-2H2 -- http://localhost/compound/InChI=1S/H4N2.H2O4S/c1-2;1-5(2,3)4/h1-2H2;(H2,1,2,3,4) -- http://localhost/compound/InChI=1S/C15H13NO2/c1-10(17)16(18)13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9,18H,8H2,1H3 -- http://localhost/compound/InChI=1S/C2H8N2O/c3-4-1-2-5/h4-5H,1-3H2 -- http://localhost/compound/InChI=1S/C6H7N3O/c7-9-6(10)5-1-3-8-4-2-5/h1-4H,7H2,(H,9,10) -- http://localhost/compound/InChI=1S/C6H5NO2/c8-6(9)5-1-3-7-4-2-5/h1-4H,(H,8,9) -- http://localhost/compound/InChI=1S/C10H12ClNO2/c1-7(2)14-10(13)12-9-5-3-4-8(11)6-9/h3-7H,1-2H3,(H,12,13) -- http://localhost/compound/InChI=1S/C10H13NO2/c1-8(2)13-10(12)11-9-6-4-3-5-7-9/h3-8H,1-2H3,(H,11,12) -- http://localhost/compound/InChI=1S/2C2H4O2.4H2O.3Pb/c2*1-2(3)4;;;;;;;/h2*1H3,(H,3,4);4*1H2;;;/q;;;;;;3*+2/p-6 -- http://localhost/compound/InChI=1S/C14H19N3S.ClH/c1-16(2)9-10-17(12-13-6-5-11-18-13)14-7-3-4-8-15-14;/h3-8,11H,9-10,12H2,1-2H3;1H -- http://localhost/compound/InChI=1S/C20H22N8O5/c1-28(9-11-8-23-17-15(24-11)16(21)26-20(22)27-17)12-4-2-10(3-5-12)18(31)25-13(19(32)33)6-7-14(29)30/h2-5,8,13H,6-7,9H2,1H3,(H,25,31)(H,29,30)(H,32,33)(H4,21,22,23,26,27)/t13-/m0/s1 -- http://localhost/compound/InChI=1S/C2H6N2O/c1-4(3)2-5/h2H,3H2,1H3 -- http://localhost/compound/InChI=1S/C5H8O2/c1-4(2)5(6)7-3/h1H2,2-3H3 -- http://localhost/compound/InChI=1S/CH6N2/c1-3-2/h3H,2H2,1H3 -- http://localhost/compound/InChI=1S/C10H13N3O2/c1-13(12-15)7-3-5-10(14)9-4-2-6-11-8-9/h2,4,6,8H,3,5,7H2,1H3 -- http://localhost/compound/InChI=1S/C5H6N2OS/c1-3-2-4(8)7-5(9)6-3/h2H,1H3,(H2,6,7,8,9) -- http://localhost/compound/InChI=1S/C20H22O3/c1-20(2,19(21)22)23-16-12-10-15(11-13-16)18-9-5-7-14-6-3-4-8-17(14)18/h3-4,6,8,10-13,18H,5,7,9H2,1-2H3,(H,21,22) -- http://localhost/compound/InChI=1S/HNO2.Na/c2-1-3;/h(H,2,3);/q;+1/p-1 -- http://localhost/compound/InChI=1S/C9H7N3O4S/c1-5(13)10-9-11-6(4-17-9)7-2-3-8(16-7)12(14)15/h2-4H,1H3,(H,10,11,13) -- http://localhost/compound/InChI=1S/C8H5N3O4S/c12-4-9-8-10-5(3-16-8)6-1-2-7(15-6)11(13)14/h1-4H,(H,9,10,12) -- http://localhost/compound/InChI=1S/C12H9NO2/c14-13(15)11-7-6-9-5-4-8-2-1-3-10(11)12(8)9/h1-3,6-7H,4-5H2 -- http://localhost/compound/InChI=1S/C6H14N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h5-6,9-11H,2-4H2,1H3 -- http://localhost/compound/InChI=1S/C6H12N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h6,9,11H,2-4H2,1H3 -- http://localhost/compound/InChI=1S/C5H12N2O4/c8-2-1-7(6-11)3-5(10)4-9/h5,8-10H,1-4H2 -- http://localhost/compound/InChI=1S/C5H10N2O3/c1-5(9)4-7(6-10)2-3-8/h8H,2-4H2,1H3 -- http://localhost/compound/InChI=1S/C7H15N3O/c1-6-4-10(8-11)5-7(2)9(6)3/h6-7H,4-5H2,1-3H3 -- http://localhost/compound/InChI=1S/C6H10N2O2/c1-3-4-8(7-10)5-6(2)9/h3H,1,4-5H2,2H3 -- http://localhost/compound/InChI=1S/C4H10N2O3/c1-6(5-9)2-4(8)3-7/h4,7-8H,2-3H2,1H3 -- http://localhost/compound/InChI=1S/C4H8N2O2/c7-5-6-1-3-8-4-2-6/h1-4H2 -- http://localhost/compound/InChI=1S/C9H11N3O/c13-11-12-6-2-4-9(12)8-3-1-5-10-7-8/h1,3,5,7,9H,2,4,6H2 -- http://localhost/compound/InChI=1S/C9H11N3O2/c13-10-12-6-2-4-9(12)8-3-1-5-11(14)7-8/h1,3,5,7,9H,2,4,6H2 -- http://localhost/compound/InChI=1S/C5H10N2O/c8-6-7-4-2-1-3-5-7/h1-5H2 -- http://localhost/compound/InChI=1S/C4H8N2O/c7-5-6-3-1-2-4-6/h1-4H2 -- http://localhost/compound/InChI=1S/C6H10ClN3O3/c1-5(11)4-10(9-13)6(12)8-3-2-7/h2-4H2,1H3,(H,8,12) -- http://localhost/compound/InChI=1S/C4H7N3O3/c1-3(8)2-7(6-10)4(5)9/h2H2,1H3,(H2,5,9) -- http://localhost/compound/InChI=1S/C9H9NS/c11-8-10-7-6-9-4-2-1-3-5-9/h1-5H,6-7H2 -- http://localhost/compound/InChI=1S/C12H12N2O3/c1-2-12(8-6-4-3-5-7-8)9(15)13-11(17)14-10(12)16/h3-7H,2H2,1H3,(H2,13,14,15,16,17) -- http://localhost/compound/InChI=1S/C16H13N/c1-2-8-15(9-3-1)17-16-11-10-13-6-4-5-7-14(13)12-16/h1-12,17H -- http://localhost/compound/InChI=1S/C19H24N2O2/c22-18-13-20(19(23)15-7-2-1-3-8-15)12-17-16-9-5-4-6-14(16)10-11-21(17)18/h4-6,9,15,17H,1-3,7-8,10-13H2 -- http://localhost/compound/InChI=1S/C7H6O4/c8-5-2-1-4(7(10)11)3-6(5)9/h1-3,8-9H,(H,10,11) -- http://localhost/compound/InChI=1S/C15H10O7.2H2O/c16-7-4-10(19)12-11(5-7)22-15(14(21)13(12)20)6-1-2-8(17)9(18)3-6;;/h1-5,16-19,21H;2*1H2 -- http://localhost/compound/InChI=1S/C20H19N3.ClH/c1-13-12-16(6-11-19(13)23)20(14-2-7-17(21)8-3-14)15-4-9-18(22)10-5-15;/h2-12,21H,22-23H2,1H3;1H -- http://localhost/compound/InChI=1S/C19H17N3.ClH/c20-16-7-1-13(2-8-16)19(14-3-9-17(21)10-4-14)15-5-11-18(22)12-6-15;/h1-12,20H,21-22H2;1H -- http://localhost/compound/InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27?/m0/s1 -- http://localhost/compound/InChI=1S/C2HCl3/c3-1-2(4)5/h1H -- http://localhost/compound/InChI=1S/C3H7NO2/c1-2-6-3(4)5/h2H2,1H3,(H2,4,5) -- http://localhost/compound/InChI=1S/C2H3Cl/c1-2-3/h2H,1H2 -- http://localhost/compound/InChI=1S/C6H5N2.BF4/c7-8-6-4-2-1-3-5-6;2-1(3,4)5/h1-5H;/q+1;-1 -- http://localhost/compound/InChI=1S/C6H12N4O2/c1-5-3-9(7-11)4-6(2)10(5)8-12/h5-6H,3-4H2,1-2H3 -- http://localhost/compound/InChI=1S/C5H13N3O/c1-7(2)4-5-8(3)6-9/h4-5H2,1-3H3 -- http://localhost/compound/InChI=1S/C6H12N2O2/c1-5-3-8(7-9)4-6(2)10-5/h5-6H,3-4H2,1-2H3 -- http://localhost/compound/InChI=1S/C4H6N2O3/c1-3-2-6(5-8)4(7)9-3/h3H,2H2,1H3 -- http://localhost/compound/InChI=1S/C4H8N2O3/c1-3-9-4(7)6(2)5-8/h3H2,1-2H3 -- http://localhost/compound/InChI=1S/C3H6N2O2/c6-4-5-1-2-7-3-5/h1-3H2 -- http://localhost/compound/InChI=1S/C9H11N3O2/c10-9(13)12(11-14)7-6-8-4-2-1-3-5-8/h1-5H,6-7H2,(H2,10,13) -- http://localhost/compound/InChI=1S/C3H6N2O/c6-4-5-2-1-3-5/h1-3H2 -- http://localhost/compound/InChI=1S/BF4.Na/c2-1(3,4)5;/q-1;+1 -data_entries: - http://localhost/compound/InChI=1S/C14H8Cl4/c15-11-5-1-9(2-6-11)13(14(17)18)10-3-7-12(16)8-4-10/h1-8H: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C3H6ClNO/c1-5(2)3(4)6/h1-2H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C2H8N2O/c3-4-1-2-5/h4-5H,1-3H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C4H10N2O3/c1-6(5-9)2-4(8)3-7/h4,7-8H,2-3H2,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/CH2O/c1-2/h1H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C5H12N2O4/c8-2-1-7(6-11)3-5(10)4-9/h5,8-10H,1-4H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C7H15N3O/c1-6-4-10(8-11)5-7(2)9(6)3/h6-7H,4-5H2,1-3H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C4H8N2O2/c7-5-6-1-3-8-4-2-6/h1-4H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C16H13N/c1-2-8-15(9-3-1)17-16-11-10-13-6-4-5-7-14(13)12-16/h1-12,17H: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C3H6O2/c4-1-3-2-5-3/h3-4H,1-2H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C4H6N2O3/c1-3-2-6(5-8)4(7)9-3/h3H,2H2,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C6H5NO2/c8-6(9)5-1-3-7-4-2-5/h1-4H,(H,8,9): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/2C2H4O2.4H2O.3Pb/c2*1-2(3)4;;;;;;;/h2*1H3,(H,3,4);4*1H2;;;/q;;;;;;3*+2/p-6: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C17H17ClO6/c1-8-5-9(19)6-12(23-4)17(8)16(20)13-10(21-2)7-11(22-3)14(18)15(13)24-17/h6-8H,5H2,1-4H3/t8-,17?/m1/s1: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C3H6N2O2/c6-4-5-1-2-7-3-5/h1-3H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C3H7NO2/c1-2-6-3(4)5/h2H2,1H3,(H2,4,5): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C5H8O2/c1-4(2)5(6)7-3/h1H2,2-3H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C2H6N2O/c1-4(3)2-5/h2H,3H2,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C6H12N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h6,9,11H,2-4H2,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C5H4O2/c6-4-5-2-1-3-7-5/h1-4H: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C4H8N2O/c7-5-6-3-1-2-4-6/h1-4H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C9H11N3O2/c10-9(13)12(11-14)7-6-8-4-2-1-3-5-8/h1-5H,6-7H2,(H2,10,13): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C14H14ClN3O2S/c1-8-4-3-5-10(9(8)2)16-12-6-11(15)17-14(18-12)21-7-13(19)20/h3-6H,7H2,1-2H3,(H,19,20)(H,16,17,18): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/H4N2.H2O4S/c1-2;1-5(2,3)4/h1-2H2;(H2,1,2,3,4): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C5H10N2O/c8-6-7-4-2-1-3-5-7/h1-5H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C10H13N3O2/c1-13(12-15)7-3-5-10(14)9-4-2-6-11-8-9/h2,4,6,8H,3,5,7H2,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C3H6N2O/c6-4-5-2-1-3-5/h1-3H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C4H8N2O3/c1-3-9-4(7)6(2)5-8/h3H2,1-2H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C6H10N2O2/c1-3-4-8(7-10)5-6(2)9/h3H,1,4-5H2,2H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C14H9Cl5/c15-11-5-1-9(2-6-11)13(14(17,18)19)10-3-7-12(16)8-4-10/h1-8,13H: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/BrHO3.K/c2-1(3)4;/h(H,2,3,4);/q;+1/p-1: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C2H5ClO/c1-4-2-3/h2H2,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C10H12ClNO2/c1-7(2)14-10(13)12-9-5-3-4-8(11)6-9/h3-7H,1-2H3,(H,12,13): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C8H5N3O4S/c12-4-9-8-10-5(3-16-8)6-1-2-7(15-6)11(13)14/h1-4H,(H,9,10,12): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/Cd.2ClH/h;2*1H/q+2;;/p-2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C20H19N3.ClH/c1-13-12-16(6-11-19(13)23)20(14-2-7-17(21)8-3-14)15-4-9-18(22)10-5-15;/h2-12,21H,22-23H2,1H3;1H: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/BF4.Na/c2-1(3,4)5;/q-1;+1: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C6H5N2.BF4/c7-8-6-4-2-1-3-5-6;2-1(3,4)5/h1-5H;/q+1;-1: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C9H6O2/c10-9-6-5-7-3-1-2-4-8(7)11-9/h1-6H: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C2HCl3/c3-1-2(4)5/h1H: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C2H8N2/c1-4(2)3/h3H2,1-2H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C6H7N3O/c7-9-6(10)5-1-3-8-4-2-5/h1-4H,7H2,(H,9,10): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C12H8Cl6O/c13-8-9(14)11(16)5-3-1-2(6-7(3)19-6)4(5)10(8,15)12(11,17)18/h2-7H,1H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/Cd.H2O4S/c;1-5(2,3)4/h;(H2,1,2,3,4)/q+2;/p-2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C5H10N2O3/c1-5(9)4-7(6-10)2-3-8/h8H,2-4H2,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27?/m0/s1: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C12H12N2O3/c1-2-12(8-6-4-3-5-7-8)9(15)13-11(17)14-10(12)16/h3-7H,2H2,1H3,(H2,13,14,15,16,17): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C8H6N4O4S/c13-4-9-11-8-10-5(3-17-8)6-1-2-7(16-6)12(14)15/h1-4H,(H,9,13)(H,10,11): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C9H7N3O4S/c1-5(13)10-9-11-6(4-17-9)7-2-3-8(16-7)12(14)15/h2-4H,1H3,(H,10,11,13): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/CH6N2/c1-3-2/h3H,2H2,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C12H9NO2/c14-13(15)11-7-6-9-5-4-8-2-1-3-10(11)12(8)9/h1-3,6-7H,4-5H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C15H10O7.2H2O/c16-7-4-10(19)12-11(5-7)22-15(14(21)13(12)20)6-1-2-8(17)9(18)3-6;;/h1-5,16-19,21H;2*1H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C7H6O4/c8-5-2-1-4(7(10)11)3-6(5)9/h1-3,8-9H,(H,10,11): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C9H9NS/c11-8-10-7-6-9-4-2-1-3-5-9/h1-5H,6-7H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C20H22O3/c1-20(2,19(21)22)23-16-12-10-15(11-13-16)18-9-5-7-14-6-3-4-8-17(14)18/h3-4,6,8,10-13,18H,5,7,9H2,1-2H3,(H,21,22): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C6H12N2O2/c1-5-3-8(7-9)4-6(2)10-5/h5-6H,3-4H2,1-2H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C10H13NO2/c1-8(2)13-10(12)11-9-6-4-3-5-7-9/h3-8H,1-2H3,(H,11,12): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C6H14N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h5-6,9-11H,2-4H2,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C19H24N2O2/c22-18-13-20(19(23)15-7-2-1-3-8-15)12-17-16-9-5-4-6-14(16)10-11-21(17)18/h4-6,9,15,17H,1-3,7-8,10-13H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C5H11N3O3/c1-2-8(7-11)5(10)6-3-4-9/h9H,2-4H2,1H3,(H,6,10): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C14H19N3S.ClH/c1-16(2)9-10-17(12-13-6-5-11-18-13)14-7-3-4-8-15-14;/h3-8,11H,9-10,12H2,1-2H3;1H: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/H4N2/c1-2/h1-2H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C4H5Cl/c1-3-4(2)5/h3H,1-2H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C17H17ClO3/c1-17(2,16(19)20)21-11-12-3-5-13(6-4-12)14-7-9-15(18)10-8-14/h3-10H,11H2,1-2H3,(H,19,20): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C2H8N2.2ClH/c1-3-4-2;;/h3-4H,1-2H3;2*1H: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C6H10ClN3O3/c1-5(11)4-10(9-13)6(12)8-3-2-7/h2-4H2,1H3,(H,8,12): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C6H11N3O3/c1-3-9(8-12)6(11)7-4-5(2)10/h3-4H2,1-2H3,(H,7,11): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C5H13N3O/c1-7(2)4-5-8(3)6-9/h4-5H2,1-3H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C5H6N2OS/c1-3-2-4(8)7-5(9)6-3/h2H,1H3,(H2,6,7,8,9): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C9H11N3O/c13-11-12-6-2-4-9(12)8-3-1-5-10-7-8/h1,3,5,7,9H,2,4,6H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C6H12N4O2/c1-5-3-9(7-11)4-6(2)10(5)8-12/h5-6H,3-4H2,1-2H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C19H17N3.ClH/c20-16-7-1-13(2-8-16)19(14-3-9-17(21)10-4-14)15-5-11-18(22)12-6-15;/h1-12,20H,21-22H2;1H: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/HNO2.Na/c2-1-3;/h(H,2,3);/q;+1/p-1: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C2H3Cl/c1-2-3/h2H,1H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C6H10N2O/c1-3-5-8(7-9)6-4-2/h3-4H,1-2,5-6H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C9H11N3O2/c13-10-12-6-2-4-9(12)8-3-1-5-11(14)7-8/h1,3,5,7,9H,2,4,6H2: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C15H13NO2/c1-10(17)16(18)13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9,18H,8H2,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C20H22N8O5/c1-28(9-11-8-23-17-15(24-11)16(21)26-20(22)27-17)12-4-2-10(3-5-12)18(31)25-13(19(32)33)6-7-14(29)30/h2-5,8,13H,6-7,9H2,1H3,(H,25,31)(H,29,30)(H,32,33)(H4,21,22,23,26,27)/t13-/m0/s1: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - false - http://localhost/compound/InChI=1S/C4H7N3O3/c1-3(8)2-7(6-10)4(5)9/h2H2,1H3,(H2,5,9): - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true - http://localhost/compound/InChI=1S/C2H4O/c1-2-3/h2H,1H3: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - - true -features: - http://localhost/dataset/1/feature/hamster_carcinogenicity: - http://www.opentox.org/api/1.1#hasSource: hamster_carcinogenicity.csv - http://purl.org/dc/elements/1.1/title: hamster_carcinogenicity -metadata: - http://www.opentox.org/api/1.1#hasSource: hamster_carcinogenicity.csv - http://purl.org/dc/elements/1.1/title: hamster_carcinogenicity - http://www.w3.org/2001/XMLSchema#anyUri: http://localhost/dataset/1 -uri: http://localhost/dataset/1 diff --git a/test/data/hamster_carcinogenicity_with_errors.csv b/test/data/hamster_carcinogenicity_with_errors.csv deleted file mode 100644 index e4f97e5..0000000 --- a/test/data/hamster_carcinogenicity_with_errors.csv +++ /dev/null @@ -1,88 +0,0 @@ -SMILES,Hamster Carcinogenicity -CC=O,1 -CC=O,1 -C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,1 -O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,1 -C1(N#C#N#N=1)N,0 -Br(=O)(=O)[O-].[K+],1 -[Cl-].[Cd+2].[Cl-],0 -O=S(=O)([O-])[O-].[Cd+2],0 -ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,0 -ClCOC,1 -C=C(Cl)C=C,0 -Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,0 -O=C1OC2=C(C=CC=C2)C=C1,0 -ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,1 -ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,0 -C=CCN(CC=C)N=O,1 -Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45, -O=C(N(C)C)Cl,1 -CN(C)N,1 -N(NC)C.[H]Cl.[H]Cl,1 -CCO,0 -O=C(N(CC)N=O)NCCO,1 -O=C(N(CC)N=O)NCC(=O)C,1 -C#O,0 -[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O, -O=CC1=CC=CO1,0 -OCC1CO1,1 -O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,0 -O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,1 -ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,1 -NN,1 -OS(=O)(=O)O.NN,1 -CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,1 -OccNN,0 -O=C(C1=CC=NC=C1)NN,0 -OC(=O)C1=CC=NC=C1,0 -O=C(NC1=CC=CC(=C1)Cl)OC(C)C,0 -O=C(NC1=CC=CC=C1)OC(C)C,0 -[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],0 -CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,0 -NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,0 -CN(N)C=O,TRUE -O=C(C(=C)C)OC,0 -CNN,1 -O=C(C1=CC=CN=C1)CCCN(N=O)C,NA -CC1=CC(=O)NC(=S)N1,1 -CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,0 -O=N[O-].[Na+],0 -[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,1 -[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,1 -O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],0 -stupid error,1 -N(CC(CO)O)(CC(C)=O)N=O,1 -N(CC(CO)O)(CCO)N=O,0 -O=C(C)CN(N=O)CCO,1 -C1C(N(C(CN1N=O)C)C)C,1 -N(CC(C)=O)(CC=C)N=O,1 -N(CC(CO)O)(C)N=O,1 -O=NN1CCOCC1,1 -N1C=CC=C(C=1)C2N(N=O)CCC2,1 -C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,0 -O=NN1CCCCC1,1 -O=NN1CCCC1,1 -O=C(N(CC(C)=O)N=O)NCCCl,1 -N(C(=O)N)(N=O)CC(C)=O,1 -C1(CCN=C=S)=CC=CC=C1,0 -O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,0 -C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,0 -O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,0 -C1(=CC(=C(O)C=C1)O)C(O)=O,0 -O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,0 -C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,0 -C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,0 -OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,0 -ClC(=CCl)Cl,0 -NC(=O)OCC,1 -C=CCl,1 -N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,0 -C1(CN(CC(N1N=O)C)N=O)C,1 -N(CCN(C)C)(C)N=O,1 -C1(CN(N=O)CC(O1)C)C,1 -O1C(N(CC1C)N=O)=O,1 -CCOC(=O)N(C)N=O,1 -C1N(COC1)N=O,1 -O=C(N(CCC1=CC=CC=C1)N=O)N,1 -O=NN1CCC1,1 -F[B-](F)(F)F.[Na+],0 diff --git a/test/data/kazius.csv b/test/data/kazius.csv deleted file mode 100644 index 9dc3a74..0000000 --- a/test/data/kazius.csv +++ /dev/null @@ -1,4069 +0,0 @@ -COC1=CC=C(C=C1)C2=NC(=C([NH]2)C3=CC=CC=C3)C4=CC=CC=C4,1 -CC1=C(C=CC=C1N=C=O)N=C=O,1 -OCCC1=C[N](N=O)C2=CC=CC=C12,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)Br,1 -CN(N=O)C1=CC=CC=C1,1 -CN2C1=C(C=CC=C1)C(=O)C3=C2C4=C(C=C3O)OC(C4)C5(C)CO5,1 -CS(=O)(=O)NC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 -[O-][N+](=O)C1=CC=C(C=C1)OC2=C(C=C(C=C2)Cl)Cl,1 -OC1=C(C=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 -C[N]2C(=NC3=C1N=CC=NC1=C(C)C(=C23)C)N,1 -CSC1=C(C(=C(C(=C1)SC)N)C)N,1 -OC1=CC4=C(C=C1)C3=CC2=CC=CC=C2C=C3C5=CC=CC=C45,1 -CC(=O)C(Br)=C,1 -NCCNCCNCCN,1 -CN(C)C1=CC=C(C=C1)CCO,1 -COC4=CC(=O)C3=C2[NH]C1=CC=NC=C1C2=CN=C3C4=O,1 -N1C3C1C2=CSC=C2C4=CSC=C34,1 -CC1=C(C=C(C(=C1)N=NC2=CC=CC=C2)N)N,1 -NC3=CC2=NC1=CC(=CC=C1C=C2C=C3)N,1 -[O-][N+](=O)C3=C1CCC2=CC=CC(=C12)C=C3,1 -NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 -COC(=O)C1(OC1(C)C(O)C(C)C)C(N)=O,1 -CC(I)C1OCC(CO)O1,1 -CN(C)CCNC(=O)C3=C2N=C1C=CC=CC1=NC2=CC=C3,1 -CC1=C(C=C(C=C1)N)C,1 -CC1=C3C(=CC=N1)C2=CC=CC=C2[NH]3,1 -OC1CN(CCO1)N=O,1 -[O-][N+](=O)C1=C(C=CC=C1)C(Cl)=O,1 -ClCCOP(OCCCl)OCCCl,1 -COC(=O)NC2=NC1=CC=CC=C1[NH]2,1 -CCOC(=O)N(CCCC(=O)C1=CN=CC=C1)N=O,1 -C1CSCCS1,1 -NC1=CC=C(C=C1)C2=CC=C(C=C2)Cl,1 -NNC2=C1C=CC=CC1=C(N=N2)NN,1 -C[N]3C(=NC4=CC=C2C=CC1=CC=C(O)C=C1C2=C34)C,1 -CC(=O)OC1=CC=C(C=C1)CCl,1 -NC1=CC=C(C=C1)OC2=CC=C(C=C2)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 -COC1=C(C=CC=C1)[N+]([O-])=O,1 -C1=CC2=C(C=C1)C4=C(C=C2)C3=NC=CC=C3C=C4,1 -OC2=C3C=CC4=CC=C(C5=C1C=CC=CC1=C(C=C2)C3=C45)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC(=C(C(=C1)[N+]([O-])=O)Cl)[N+]([O-])=O,1 -[O-][N+](=O)C1=C3C(=CC=C1)C2=CC=CC=C2C(O3)=O,1 -CC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)CO,1 -CC3=C2C=CC1=CC=CC=C1C2=CC4=CC=CC=C34,1 -CC1=CC=C(C=C1)S(=O)(=O)OCC2=CC=C(C=C2)[N+]([O-])=O,1 -CN1CCN(CC1)C5=CC(=O)C2=C(C4=C(C(=N2)C)C3=CC=CC=C3[NH]4)C5=O,1 -CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)O,1 -CC2C1=C(C=CC(=C1)F)C3=C2C=C(C=C3)F,1 -O=NC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 -OC3C1OC1C2=C4C(=C(C=C2)O)C7=C5C(=C34)C(=CC=C5C6OC6C7=O)O,1 -OC(=O)C1=CC(=C(C=C1)Cl)[N+]([O-])=O,1 -N(C1=CC=CC=C1)C2=CC=C(C=C2)NC3=CC=CC=C3,1 -C[N+]3=C2C=CC1OC1C2=CC=C3,1 -COC1=C(C=C(C=C1)N)N,1 -CC(=O)NC1=CC=C(C=C1)C(=O)C2OC2C3=CC=CC=C3,1 -C[N]1C(=NC2=C1C=C(C)C3=NC(=CN=C23)C4=CC=CC=C4)N,1 -[O-][N+]([O-])=C1CCCC1,1 -COC2=C1OC(=CC1=C(C=C2)N(CCCl)CCCl)[N+]([O-])=O,1 -COC3=C(C=C2N=C1C=C(C(=CC1=NC2=C3)N)OC)N,1 -C[N]2C(=NC3=NC1=CC=CC=C1C=C23)N,1 -OC5C(O)C4=C(C3=NC2=C1C=CC=CC1=CC=C2C=C3C=C4)C6OC56,1 -NC3=C2C=C1C=CC=CC1=NC2=CC=C3,1 -[O-][N+](=O)C1=CC4=C2C(=C1)CCC3=C2C(=CC(=C3)[N+]([O-])=O)CC4,1 -[O-][N+](=O)C3=CC2=NC1=CC=CC=C1N=C2C=C3,1 -CCOP(=O)(OC1=CC=C(C=C1)[N+]([O-])=O)C2=CC=CC=C2,1 -[O-][N+](=O)C3=C2C=CC1=CC=CC4=C1C2=C(C=C3)C(=O)C4=O,1 -CC(C)S(Cl)(=O)=O,1 -CC3=C2C1=CC=CC=C1[NH]C2=CC(=N3)N,1 -ClCC(Cl)CBr,1 -CC2=C(N=C1C(=C(C=CC1=N2)N)C)C,1 -CC1=CC4=C(C=C1)C5=C2C=CC=CC2=CC6=C3C=CC=CC3=CC4=C56,1 -NC1=CC(=CC=C1)[N+]([O-])=O,1 -[O-][N+](=O)C2=C1SN=C(C1=CC=C2)Cl,1 -[O-][N+](=O)C4=C2C=CC=C3C1=CC=CC=C1C(=C23)C(=C4)[N+]([O-])=O,1 -[O-][N+](=O)C1=C(C=CC=C1)SSC(Cl)=C(Cl)Cl,1 -CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)Cl)[N+]([O-])=O,1 -COC4=CC(=O)C3=C2[NH]C1=C(CCCC1)C2=C(C)N=C3C4=O,1 -CC=CC=O,1 -C[N+]2=C1C=CC(=CC1=CC3=CC=CC=C23)N,1 -CC(=O)ON(C(C)=O)C1=CC=C(C=C1)SC2=CC=CC=C2,1 -CC1C=C(C=O)C(=CC2(O)CC(C)(C)CC12)C=O,1 -C1=CC2=C(C=C1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 -ClC2=C1C=CC=CC1=CC=C2,1 -C2C1=C(C=CC=C1)C3=C2C4=C(C=C3)C=CC5=C4C=CC=C5,1 -CC1=C(C=CC(=C1)N)N,1 -COC1=CC(=C(C=C1)OC)N=NC3=C2C=CC=CC2=CC=C3O,1 -CN(C)C1=CC=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3,1 -COP(=O)(OC)OC,1 -ClC(Cl)C#N,1 -[O-][N+](=O)C1=CC2=C(C=C1)NCC2,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)F,1 -C[N]1C(=NC=C1[N+]([O-])=O)C2NC(CO)(CO)CO2,1 -COC1=C(C=CC(=C1)O)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 -COC(=O)C1=C(C=CC=C1)O,1 -O1C4C1C2=C(C=CC3=CC=CC=C23)C5=C4C=CC=C5,1 -CC1=CC(=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 -O=C5C=C3C2=C(C=C1C=CC=CC1=C2)C4=C3C(=CC=C4)C5=O,1 -[O-][N+](=O)C1=CC=C(O1)C=CC=NN2CC(=O)NC2=O,1 -C[N]1C(=NC2=NC=C(C=C12)C3=CC=CC=C3)N,1 -BrC(=C)C=O,1 -CC(=O)NC(CSC(Cl)=C(Cl)C(Cl)=C(Cl)Cl)C(O)=O,1 -[O-][N+](=O)C2=C1C(=CC=CC1=CC=C2)[N+]([O-])=O,1 -COC4=C1C5=C(C(OC1=C3C2C=COC2OC3=C4)=O)C(CC5)O,1 -CC(=C)C2=CC=C(C)C1=CC=C(C=O)C1=C2,1 -CC1=CC=C[N]2C1=NC3=CC=C(N)N=C23,1 -C1=CC2=C(C=C1)C3=CN=C4C=CC=C5C=CC(=C2)C3=C45,1 -COC(=O)C(=CC1=CC=C(O1)[N+]([O-])=O)[N+]([O-])=O,1 -ClCC4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 -[O-][N+](=O)C1=CC(=C(C=C1)Cl)[N+]([O-])=O,1 -COC(=O)C(=CC1=CC=C(O1)[N+]([O-])=O)C#N,1 -C(N1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4)C5=CC=CC=C5,1 -OC1C(O)C5=C4C2=C1C=CC=C2C3=CC=CC=C3C4=C(C=C5)[N+]([O-])=O,1 -CN(C)C1=CC=C(C=C1)C=CC2=CC(C=C(C)O2)=C(C#N)C#N,1 -CCCCOCC1CO1,1 -OC(=O)C=CC1=CC(=CC=C1)[N+]([O-])=O,1 -NC(O)=NO,1 -FCC1CO1,1 -ClC(C(=O)NCC1=CC=CC=C1)C2=CC=CC=C2,1 -CC1(C)CC(O)CC(C)(C)N1O,1 -CC(=O)NC1=CC=C(C=C1)SC2=CC=CC=C2,1 -OC1=C(C=CC=C1)NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 -CCC(=O)N(O)C1=CC=C(C=C1)C2=CC=CC=C2,1 -O=CC1CC(=O)C(=O)CO1,1 -C(COCC1CO1)OCC2CO2,1 -C1CN1,1 -OCC(CBr)(CBr)CBr,1 -CCCCCCCCCCCCCCCCCC(=O)OCC1=CC=C2C(=CCC(C=C12)C(C)=C)C,1 -OC(=O)C1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 -ONC1=CC=C(C=C1)SC2=CC=CC=C2,1 -CC1=CC=C[N]2C1=NC3=CC=C(NO)N=C23,1 -ClC1=NC=CC=C1,1 -FC2=CC1=NC=CC=C1C=C2,1 -CN(C)CCNC(=O)C2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3)=O,1 -NC1=CC=C(C=C1)N,1 -[O-][N+](=O)C3=CC2=C(C=C1C=CC=CC1=C2C=C3)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC4=C3C(=C1[N+]([O-])=O)C2=CC=CC=C2C3=CC=C4,1 -[O-][N+](=O)C1=CC=C(C=C1)C=C,1 -CN(CS(O)(=O)=O)C1=C(C)N(C)N(C1=O)C2=CC=CC=C2,1 -N1C5C1C3=C(C2=CC=CC=C2C4=CC=CC=C34)C6=C5C=CC=C6,1 -NC(=O)C(=CC1=CC=C(O1)[N+]([O-])=O)C2=CC=CO2,1 -NC2=CC=C1SN=C(Cl)C1=C2,1 -ClC1OC1CBr,1 -OC2=C1C=CC=NC1=CC=C2,1 -NC3=CC2=NC1=CC=CC(=C1N=C2C=C3)N,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)Br,1 -C1=CN=C(C=C1)C2=CC=NC=C2,1 -CC(C)C1CCC(C)CC1=O,1 -CCOS(C)(=O)=O,1 -O=NN1CCOCC1,1 -[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)C#N,1 -CCCC=CCC=O,1 -NNC(=O)CNC(=O)C=[N+]=[N-],1 -C=CCCCCC1CO1,1 -CC(=O)NC1=CC(=CC=C1)N,1 -CC1=C(C=CC=C1N)N,1 -OC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 -CC1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 -[O-][N+](=O)C1=C(C=CC(=C1)N=[N+]=[N-])F,1 -COC4=CC(=O)C3=C2[NH]C1=CC=NC=C1C2=C(C)N=C3C4=O,1 -CCC=CC=CC=CC=CC=COCC(O)CO,1 -CNC(=O)ON(C(C)=O)C(=O)NC,1 -[O-][N+](=O)C1=CC(=C(C=C1)I)[N+]([O-])=O,1 -CC4=C2C=C1C=CC=CC1=CC2=C3C=CC=CC3=C4,1 -C1OC1C2=CC=CC=C2,1 -[O-][N+](=O)C1=CC(=CC(=C1)CCl)[N+]([O-])=O,1 -CC(=O)OCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 -ClCC=CCl,1 -COC1=CC=C(C=C1)N=O,1 -NC1=C(C=CC=C1)C2=CC=CC=C2,1 -CNC3CC2=C1C(=CC=CC1=CC=C2)C3,1 -CC(=O)OCC1=COC=C2C(=CC=[C]12)C=O,1 -OCC[N]1C(=NC=C1[N+]([O-])=O)CO,1 -CCN1C=C(C(O)=O)C(=O)C3=C1C=C2OCOC2=C3,1 -CC3=C2[NH]C1=CC=CC=C1C2=C(C)C4=CN=CC=C34,1 -O=C2NC1(CCCCC1)C(=O)N2CCN3CC3,1 -NC1=CC3=C(C=C1)C2=CC=C(C=C2C3)N,1 -CCN(N)C1=CC=CC=C1,1 -CC(=O)NC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,1 -CCC[N]3C=C2CC1C(C=C(C)CN1C)C4=C2C3=CC=C4,1 -C[N]1C=CN=C1N=O,1 -[O-][N+](=O)C2=C1[NH]N=CC1=CC=C2,1 -ClCC2=C4C1=CC=CC=C1C=C5C=CC3=CC=CC(=C2)C3=C45,1 -NC1=C(C=CC=C1)SCCSC2=C(C=CC=C2)N,1 -C1=CC4=C(C=C1)C3=CC2=CC=CC5=C2C(=C3C=C4)C=C5,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC4=C(C=C2CC3)CCCC4,1 -[O-][N+](=O)C2=C1N=CC=CC1=CC=C2,1 -S=C1NCCN1,1 -C2=CC1=CC3=C(C=C1C=C2)C5=C4C(=C3)C=CC=C4C=C5,1 -NC1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 -O=NC1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)CCCC5,1 -CC(C)N(C(C)C)C(=O)SCC(Cl)=CCl,1 -COC1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,1 -CC1CNCC(C)O1,1 -CC(C)=C(Cl)C=O,1 -[O-][N+](=O)C3=CC2=C1C=CC(=CC1=CC=C2O3)N(CCCl)CCCl,1 -ClC(=O)CC1=CC=CC=C1,1 -NC3=CC2=NC1=CC=CC=C1C(=C2C=C3)N,1 -C1=CC5=C(C=C1)C4=CC3=C2C=CC=CC2=CC=C3N=C4C=C5,1 -OC1=C4C(=CC=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 -C1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 -[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)Cl,1 -NC1=CC=C(C=C1)NC2=CC=C(C=C2)[N+]([O-])=O,1 -OC1=CC=C(C=C1)C(=O)NN=CC2=CC=C(O2)[N+]([O-])=O,1 -NC3=C2C(C1=CC=CC(=C1C(C2=C(C=C3)N)=O)[N+]([O-])=O)=O,1 -[O-][N+](=O)C1=CC(=C(C=C1)C2=C(C=CC=C2)[N+]([O-])=O)[N+]([O-])=O,1 -OC2=C3C1=CC=CC=C1C4=C(C=CC5=CC=C(C=C2)C3=C45)[N+]([O-])=O,1 -CC1=CC(=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3O)C,1 -OC1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 -C1=CC2=C(C=C1)C3=CC=CC4=CC=CC2=C34,1 -CC2C1=C(C=CC=C1)C3=C2C=C(C=C3)F,1 -OC4C=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C4O,1 -CCN(CC)N=O,1 -OC2=C1C=CC=CC1=CC3=CC=CC=C23,1 -[O-][N+](=O)C1=CC=C2C=CC3=C(C=CC4=CC=C1C2=C34)[N+]([O-])=O,1 -OC2C=CC1=C3C=CC4=CC=C(C5=CC=C(C=C1C2O)C3=C45)[N+]([O-])=O,1 -OCC4OC(OC2=C1C(C3=C(OC1=CC(=C2)O)C(=CC=C3O)O)=O)C(O)C(O)C4O,1 -ClCCN(CCCl)P1(=O)OCCCN1CCCl,1 -NC1=C(C=C(C=C1Cl)[N+]([O-])=O)[N+]([O-])=O,1 -OC2C=CC1=C4C(=CC=C1C2O)C3=CC(=CC=C3C=C4)O,1 -OCCN(CCO)C1=CC=C(C=C1)N=NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 -NC2=NC(=C1[NH]C=NC1=N2)NO,1 -CN(C)N,1 -CN2N(C1=CC=CC=C1)C(=O)C(=C2C)N=O,1 -ClCCNC(=O)N(CCCl)N=O,1 -C1=CC2=C(C=C1)C4=C3C(=C2)C=CC=C3C=C4,1 -OCC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -CC3=CC2=C(C1=CC=CC=C1C(=C2C=C3)C)C,1 -COC3=C(C=C2N=C1C=CC(=CC1=NC2=C3)N)N,1 -BrCC1CO1,1 -CN(C)N=O,1 -[O-][N+](=O)C1=C(C=CC=C1)[N+]([O-])=O,1 -CC(=O)C1=C(C(=C(O1)[N+]([O-])=O)C2=CC=CC=C2)C3=CC=CC=C3,1 -OS(=O)(=O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -C1OC1C2CO2,1 -[O-][N+](=O)C1=CC(=C(C=C1)Br)[N+]([O-])=O,1 -NC1=C(C=C(C(=C1)[N+]([O-])=O)N)Cl,1 -[O-][N+](=O)C1=CC2=CC=C3C=CC=C4CCC(=C1)C2=C34,1 -[O-][N+](=O)C1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)N=O,1 -CCN(CC)C3=CC=C2N=C1C=CC(=CC1=[O+]C2=C3)N(CC)CC,1 -CCN1CCOCC1,1 -OCCCBr,1 -C1=CC3=C(C=C1)C2=NC=CC=C2C=C3,1 -NC3=C(C=C2N=C1C=CC=CC1=NC2=C3)O,1 -CN(C)C2=C(C1=NC(=C(N=C1C=C2)C)C)C,1 -CC1=CC(=C(C=C1)N)N,1 -NC1=C(C(=CC=C1)N)C(O)=O,1 -OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -[O-][N+](=O)C1=C(C=CC=C1)SSC(F)=C(Cl)Cl,1 -ONC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 -COC(=O)NC2=NC1=CC(=CC=C1[NH]2)C(=NO)C3=CC=C(C=C3)F,1 -C1=CC2=CC=C3N=CC=C4C=CC(=C1)C2=C34,1 -NC1=C(C=CC(=C1)[N+]([O-])=O)C(O)=O,1 -CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)F)[N+]([O-])=O,1 -CC4=C1C=CC=CC1=C3N=C2C=CC=CC2=C(C3=C4C)N,1 -NC4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 -CCC1=C3C(=CC2=CC=CC=C12)C4=C(C=C3)C(O)C(O)C5OC45,1 -ON(C=O)C1=CC=C(C=C1)[N+]([O-])=O,1 -CN(N=O)C(C)=O,1 -BrC(C=O)=CC1=CC=CC=C1,1 -C1OC1COC2=CC(=CC=C2)OCC3CO3,1 -CC1=C(C=C(C=C1)N=C=O)N=C=O,1 -N1C4C1C2=C(C=CC3=CC=CC=C23)C5=C4C=CC=C5,1 -OC(=O)CCCC1=CC=C(C=C1)N(CCCl)CCCl,1 -NCCNCCNCCNCCNCCN,1 -CC(C)NCC2CCC1=C(C=C(C(=C1)CO)[N+]([O-])=O)N2,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)Cl,1 -CC1=CC=C(C=C1)N=NNCC2=CC=CC=C2,1 -CNC(=O)OC2=C1C=CC=CC1=CC=C2,1 -CCOC(=O)N(C)C,1 -ClC(=O)C1=C(C=C(C=C1)Cl)Cl,1 -[O-][N+](=O)C2=CC(=C1C(=CC(=CC1=C2)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 -COS(=O)(=O)C(F)(F)F,1 -CC1=CC(=C(C=C1)NO)C,1 -ClC(=O)C1=C(C=CC=C1)C(Cl)=O,1 -CC(=O)C=O,1 -O=C1OC5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 -ClCC1=CC=CC=C1,1 -C[N]1C(=NC2=C1C=CC3=NC(=C(C)N=C23)C)N,1 -ClC(CBr)CBr,1 -CC(=O)OC1=C2C=CC3=CC=CC4=CC=C(C(=C1)[N+]([O-])=O)C2=C34,1 -CC1=CC=C[N]2C1=NC3=C(C)C(=CN=C23)N,1 -OC1=C([NH]C2=CC=CC=C12)C4=NC3=C(C=CC=C3)C4=O,1 -OCC1=C4C(=C(C2=CC=CC=C12)CO)C3=CC=CC=C3C=C4,1 -NC1=CC3=C(C=C1)C2=CC=CC=C2O3,1 -CC4=C3C=C2C1=CC=CC=C1C=CC2=CC3=CC=C4,1 -C1CCC(CC1)N2C4C2C3=C(C=CC=C3)C5=C4C=CC=C5,1 -COC1=C(C=CC=C1)N,1 -ONC1=CC=C(C=C1)C2=CC=CC=C2,1 -CN1CC(CBr)CC2C1CC3=C[NH]C4=CC=CC2=C34,1 -CCN(CC)CCNC2=C1C(C3=C(SC1=C(C=C2)C)C=CC=C3)=O,1 -OCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 -C1=CC5=C4C(=C1)C2=CC=CC3=CC=CC(=C23)C4=CC=C5,1 -C[N]2C(=NC3=C1N=C(C)C=NC1=CC(=C23)C)N,1 -CNN=O,1 -COC(=O)C(=C)C#N,1 -CN(C)C1=CC=C(C=C1)N=NC3=CC=C2N=CSC2=C3,1 -COP(=S)(OC)SCN2N=NC1=C(C=CC=C1)C2=O,1 -OCC1SCCN1N=O,1 -[O-][N+](=O)C1=C(C(=CC=C1)[N+]([O-])=O)C=O,1 -CC1=CC2=C(C=C1)C(=CC=C2)[N+]([O-])=O,1 -OC1=C(C(=CC=C1)[N+]([O-])=O)[N+]([O-])=O,1 -OC3=C(C2=CC1=CC=CC=C1C(=C2C=C3)O)O,1 -OC1=C4C(=CC=C1)C3=CC2=CC=CC5=C2C(=C3C=C4)C=C5,1 -CN2C(=O)CN=C(C1=C(C=CC=C1)F)C3=C2C=CC(=C3)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC2=C(C=C1)C(=O)OC2=O,1 -COC(=O)C1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 -ClCC2=C1C3=CC=C4C=CC=C5C=CC(=CC1=CC=C2)C3=C45,1 -NC1=NC(=CC=C1)N,1 -[O-][N+](=O)C1=CC=C(O1)C=CC(=O)NN=CC2=CC=C(O2)[N+]([O-])=O,1 -OOC1CCCC2=C1C=CC=C2,1 -[O-][N+](=O)C2=CC=C1SN=C(Cl)C1=C2,1 -[O-][N+](=O)C1=CC(=CC=C1)CCl,1 -CC(O)=NO,1 -CN(C)CCNC(=O)C2=C1SC3=C(C(C1=CC=C2)=O)C=CC=C3,1 -COC1=CC=C(C=C1)CNC(=O)C(C)Br,1 -NC3=CC2=NC1=CC=C(C=C1N=C2C=C3)N,1 -OCCC1=C[NH]C2=CC(=CC=C12)[N+]([O-])=O,1 -CC1=C(C=CC=C1)N=NC2=CC(=C(C=C2)N)C,1 -CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)N,1 -[O-][N+](=O)C3=CC2=C1C(=CC=CC1=CC=C2C=C3)[N+]([O-])=O,1 -C2=CC1=NC=CN=C1C=C2,1 -[O-][N+](=O)C1=CC=C(C=C1)CCl,1 -OC(=O)C1=CC=C(C=C1)NC3=C2C=CC(=CC2=NC4=CC=CC=C34)N=[N+]=[N-],1 -COC1=C4C(=CC=C1)C3=C2OCOC2=CC(=C3C=C4)C(O)=O,1 -CC2=[N+](C1=CC=CC=C1[N+](=C2C(=O)NCCO)[O-])[O-],1 -CC(C)(C)C1=CC(=O)C=CC1=O,1 -CN(C)CCCNC2=C1C=C(C=CC1=NC3=CC=CC=C23)[N+]([O-])=O,1 -O=NC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 -CC1(CO1)C2=CC=CC=C2,1 -NC2=C1SN=C(C1=CC=C2)Cl,1 -CC2C1=C(C=CC=C1)C3=C2C=C(C(=C3)C)C,1 -CC(O)C1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)[N+]([O-])=O,1 -C1=CC2=C(C=C1)C4=CC=C5C=CC6=CC3=CC=CC2=C3C4=C56,1 -[O-][N+](=O)C2=CC3=CC=C4C1=CC=CC=C1C=C5C=CC(=C2)C3=C45,1 -CC1=C(C=CC(=C1)[N+]([O-])=O)N,1 -OC1=CC=C(C=C1)N=O,1 -NC2=CC=C1SN=CC1=C2,1 -[N-]=[N+]=C1C=CC(=O)C=C1,1 -O=C2CC(=NC1=CC=CC=C1)C(=O)C3=C2C=CC=C3,1 -[O-][N+](=O)C2=CC1=CC(=CC=C1O2)N(CCCl)CCCl,1 -OC(=O)C(Br)=C(Br)C=O,1 -COC1=C4C(=CC=C1)C3=C2OCOC2=CC5=C3C(=C4)NC5=O,1 -CN(C)N=NC1=CC=C(C=C1)[N+]([O-])=O,1 -C1=CC2=C(C=C1)C5=C(C=C2)C4=C3C=CC=CC3=CC=C4C=C5,1 -COC1=C(C3=C(C(=C1)N)C(=O)C2=C(C=CC=C2)C3=O)N,1 -NC1=CC=C(C=C1)OC2=CC(=C(C=C2)N)N,1 -CC(=O)N1CCCC1C(=O)N(CC(O)=O)N=O,1 -COC1=C(C=CC(=C1)CC2CO2)O,1 -CN(C)CCCNC2=C1C=CC=CC1=NC3=CC=CC=C23,1 -CCC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)[N+]([O-])=O,1 -OC5C(O)C2=C1C6(C4=C(C1=CC=C2)C3=C(C=CC=C3)C=C4)OC56,1 -NC(CSC(Cl)=C(Cl)C(Cl)(Cl)Cl)C(O)=O,1 -C[N]2C1=CC=CC=C1C3=CC(=CC=C23)N,1 -NC1=CC=C(C=C1)OC2=C(C=C(C=C2)Cl)Cl,1 -C1=CC3=C(C=C1)C2=CC5=C(C=C2C=C3)C4=CC=CC=C4C=C5,1 -OC1C=CC=CC1O,1 -CCNN=O,1 -S3C1=CC=CC=C1C4=CC=C2C=CC=CC2=C34,1 -CC(=O)OCC1=CC=C(C=C1)N=NC2=CC=C(C=C2)COC(C)=O,1 -CCC4(O)CC(O)C2=C(C=C1C(C3=C(C(C1=C2O)=O)C(=CC=C3)O)=O)C4C(=O)OC,1 -OC5C=CC1=C(C2=CC=C3C=CC(=C4C=CC(=C1)C2=C34)[N+]([O-])=O)C5O,1 -O[N+]([O-])=C=CC1=CC=C(O1)[N+]([O-])=O,1 -NC(CS)C(O)=O,1 -CCC3=C1C4=C(C=CC1=C2C=CC=CC2=C3)C(O)C(O)C5OC45,1 -O=C3[N]2C1=CC=CC=C1N=C2C8=C6C3=CC=C7C5=NC4=CC=CC=C4[N]5C(C(=C67)C=C8)=O,1 -OCCCCl,1 -CCOC1=CC=C(C=C1)NC(=O)CC(C)O,1 -CC1=C(C(=C(C=C1[N+]([O-])=O)[N+]([O-])=O)N)[N+]([O-])=O,1 -ClCC1CO1,1 -CC(C)=CC2C(C(=O)OC1=C(C)C(CC=C)C(=O)C1)C2(C)C,1 -O=NC1=CC=C(C=C1)OC2=CC=CC=C2,1 -[O-][N+](=O)C2=C4C=CC=C5C1=CC=CC=C1C3=CC=CC(=C2)C3=C45,1 -CC(C)N(C(C)C)C(=O)SCC(Cl)=C(Cl)Cl,1 -COC(=O)NC1=CC(=CC=C1)OC(=O)NC2=CC(=CC=C2)C,1 -FC5=C3C=CC=C4C2=C1C=CC=CC1=CC=C2C(=C34)C=C5,1 -ClC(=O)OCC2C1=C(C=CC=C1)C3=C2C=CC=C3,1 -COC4=CC(=O)C1=C(C3=C(C(=N1)C)C2=CC=CC=C2[NH]3)C4=O,1 -CC1=CC(=C(C=C1)N)O,1 -CCOP(=S)(OCC)OC1=N[N](C(C)C)C(=N1)Cl,1 -[O-][N+](=O)C1=CC5=C2C(=C1)CCC4=C2C(=C3CCCCC3=C4)CC5,1 -S=P(N1CC1)(N2CC2)N3CC3,1 -C1=CC4=C(C=C1)C3=CC=C2C=NC=CC2=C3C=C4,1 -CN(C)CCNC(=O)C2=C1NC3=C(OC1=CC=C2)C=CC=C3,1 -CC1=CC=C(C=C1)CCC2CO2,1 -OC4=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C=C4,1 -NC2=C1N=C[N](C1=NC=N2)CC3=CC=CC=C3,1 -OCC(O)CI,1 -NC3=C2N=C1CCCCC1=CC2=CC=C3,1 -CN1CCN(CC1)C4=C2OCN(N3C=C(C(C(=C23)C=C4F)=O)C(O)=O)C,1 -C1=CC4=C(C=C1)C3=CC2=CC=NC=C2C=C3C=C4,1 -CCN(CC)N(O)N=O,1 -COC1=CC4=C(C=C1)C2=NC=CC3=CC(=C(C(=C23)C4=O)OC)OC,1 -ClC(=O)C1=CC=C(C=C1)C(Cl)=O,1 -NC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 -[O-][N+](=O)C2=CC1=C[NH]N=C1C=C2,1 -OCC1OC(C(O)C1O)N(N=O)C2=CC=C(C=C2)[N+]([O-])=O,1 -CCCCCCCCCCSC[N]1C=C[N+](=C1)C,1 -OC4C=CC3=C(C2=CC=C1C=CC=CC1=C2C=C3)C4O,1 -CC2=C1N=CC=CC1=CC=C2,1 -OC1=C(C3=C(C(=C1)O)C(=O)C2=C(C=CC=C2)C3=O)O,1 -NC2=C1C=CC=CC1=NC3=CC=CC=C23,1 -[O-][N+](=O)C1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 -BrCC1=CC=CC=C1,1 -ClCN2C(=O)C1=C(C=CC=C1)C2=O,1 -CN(C)C1=CC=C(C=C1)C=CC2=CC=CC=C2,1 -C5=CC4=CC3=C1C=CC=CC1=C2C=CC=CC2=C3N=C4C=C5,1 -ClCC4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,1 -[O-][N+](=O)C4=CC=C3C2=C1C(=C(C=CC1=CC=C2)[N+]([O-])=O)C5=C3C4=CC=C5,1 -COC1=CC4=C(C=C1)C2=C(C(=CC3=CC=NC(=C23)C4=O)OC)OC,1 -CC1=CC(=C(C(=C1)C)N)C,1 -CC2=C1C=CC=CC1=CC3=CC=CC=C23,1 -COP(=S)(OC)OC1=CC=C(C=C1)[N+]([O-])=O,1 -COC1=C(C4=C(C=C1)C3=C2OCOC2=CC5=C3C(=C4)N(C)C(=O)C5=O)OC,1 -ON=C1C=CC(C=C1)=NO,1 -CN(C1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 -ONC2=CC1=CC=CC=C1C=C2,1 -[O-][N+](=O)C1=CC2=CC=C3C=C(C=C4C=CC(=C1)C2=C34)[N+]([O-])=O,1 -COC5=C2[C]1=CC=C(C1=C(OC2=C4C3CCOC3OC4=C5)O)O,1 -OCC(Cl)CCl,1 -O=NN1CCCCC1,1 -C1=CN=C(C=C1)C2=NC=CC=C2,1 -CC3=C(C1=CC=CC=C1C4=CC=C2C=CC=CC2=C34)[N+]([O-])=O,1 -C[N]1C(=NC2=CC=CC=C12)N,1 -CC(=O)OC1CC5=C4C1=C3C=CC2=CC=CC=C2C3=CC4=CC=C5C,1 -[O-][N+](=O)C1=C(N=C2SC=C[N]12)C3=CC=C(C=C3)Cl,1 -CN2C1=C(C=CC=C1)C(=O)C3=C2C4=C(C=C3O)OC(C4)C(C)=C,1 -[O-][N+](=O)C1=C(C=CC=C1)SSC(Cl)=C(Cl)C(F)(F)F,1 -CC(=O)N(O)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 -COC1=C(C=C(C=C1)C(=O)NC2=CC=CC=C2)[N+]([O-])=O,1 -CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)N(C)C)[N+]([O-])=O,1 -NC1=CC=C(C=C1)Cl,1 -ClC3=CC2=CC1=CC=CC=C1C=C2C=C3,1 -OC(=O)C(Cl)=C(C(Cl)Cl)C(O)=O,1 -ClC(Br)C#N,1 -[O-][N+](=O)C3=C1C=CC=CC1=C2C=CC=CC2=C3,1 -NC1=CC=C(C=C1)OC2=C(C=C(C=C2Cl)Cl)Cl,1 -[O-][N+](=O)C2=CC1=C3C(=CC=C1C=C2)C(=CC=C3)[N+]([O-])=O,1 -FC2=C1N=CC=CC1=CC=C2,1 -CCC(Cl)=[N+](O)[O-],1 -CC(C)(C)CCCCCC(=O)OCC1CO1,1 -CC(=O)NNC1=CC=CC=C1,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)Cl,1 -OC2=C(C1=CC=CC=C1C=C2)[N+]([O-])=O,1 -CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC,1 -CCC2=C1[NH]C3=C(C1=CC(=C2)O)CCOC3(CC)CC(O)=O,1 -OC3C=CC2=C(C=C1C=CC(=CC1=C2)[N+]([O-])=O)C3O,1 -NC1=CC=C(C=C1)C=CC2=CC=CC=C2,1 -COCC1CO1,1 -O=NN1CCCC1C2=CN=CC=C2,1 -CCN(CC)C(=S)SCC(Cl)=C,1 -NC(=O)NCC=C,1 -O1C5C1C3=C(C2=CC=CC=C2C4=CC=CC=C34)C6=C5C=CC=C6,1 -OC5C(O)C2=C(C1=NC4=C(C=C1C=C2)C3=CC=CC=C3C=C4)C6OC56,1 -CC4=C3C1=CC=CC2=CC=CC(=C12)C3=C(C5=CC=CC=C45)C,1 -O=CCC=O,1 -NC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 -CC1=NSC(=C1)N,1 -N(C1=CC=C(C=C1)NC3=CC2=CC=CC=C2C=C3)C5=CC4=CC=CC=C4C=C5,1 -CCCCN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 -FC5=CC=C4C=C3C2=C1C(=CC=CC1=CC=C2)C3=CC4=C5,1 -CC(=O)OCC1=CC=C(C=C1)[N+]([O-])=O,1 -CN(C)C1=CC=C(C=C1)CC2=CC=C(C=C2)N(C)C,1 -NCCNCCNCCNCCN,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=CC=C2)C3=O,1 -CC(=O)N(O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -[O-][N+](=O)C1=CC=C(C=C1)OCC2CO2,1 -C1OC1COC3=CC2=CC=CC=C2C=C3,1 -O=C2C1=C(C=CC=C1)C4=C2C=C3C=CC=CC3=C4,1 -CNC1=CC=C(C=C1)N=NC2=CC=CC=C2,1 -CC2=C1C3=CC=C4C=CC=C5C=CC(=CC1=CC=C2)C3=C45,1 -ClC1=C(N=CC=C1)Cl,1 -[O-][N+](=O)C1=CC(=CC=C1)C#N,1 -CN(C)CCNC(=O)C2=C1OC3=C(C(C1=CC=C2)=O)C=CC=C3,1 -ClCC(CCl)OP(=O)(OC(CCl)CCl)OC(CCl)CCl,1 -COC1=C(C=CC(=C1)CNC(=O)C(C)Br)O,1 -CCN1C=C(C(O)=O)C(=O)C2=C1N=C(N=C2)N3CCNCC3,1 -COP(=O)(OC)OC1=CC(=C(C=C1)[N+]([O-])=O)C,1 -[O-][N+](=O)C1=CC2=C(C=C1)C(=CC3=CC=CC=C23)[N+]([O-])=O,1 -O[N+]([O-])=C=CC1=CC=CC=C1,1 -COC(=O)C4=C2C=CC1=C(C=CC=C1C2=C3OCOC3=C4)OC,1 -COC1=NSC2=CC(=CC=C12)[N+]([O-])=O,1 -ClCCOCC(Cl)=CCl,1 -NC2=C1C(C3=C(C(C1=C(C=C2Br)Br)=O)C=CC=C3)=O,1 -C[N]1C=NC2=C(N)N=CN=C12,1 -C[N]1C=NC2=C1C=CC3=NC=CC=C23,1 -CC2C1=C(C=CC=C1)C3=C2C=CC(=C3)C,1 -[O-][N+](=O)C2=CC=C1C(=NSC1=C2)Cl,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)[N+]([O-])=O,1 -ClC2=C1C=CC=CC1=CC3=CC=CC=C23,1 -COC1=C(C=C(C(=C1)Cl)OC)Cl,1 -[O-][N+](=O)C1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 -OC(=O)C4=C2C(=CC1=C(C=CC=C1C2=C3OCOC3=C4)O)[N+]([O-])=O,1 -NC(CCC(=O)NNC1=CC=CC=C1)C(O)=O,1 -[O-][N+](=O)C1=CC=C(C=C1)OC=C,1 -CC2(OO)C1=C(C=CC=C1)C3=C2C=CC=C3,1 -[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC(=CC=C2)C#N,1 -[O-][N+](=O)C1=CC4=C2C(=C1)CCC3=C2C(=CC=C3)CC4,1 -CC2=C1C=C4C(=CC1=CC=C2)C3=CC=CC=C3C=C4,1 -CC2=CC=C1N=C(SC1=C2)C3=CC=C(C=C3)N,1 -N1C2C1C4=C3C2=CC=CC3=CC=C4,1 -CC(C)(C)OC(=O)C(N)CN=[N+]=[N-],1 -[O-][N+](=O)C2=CC1=CC=C(C=C1O2)N(CCCl)CCCl,1 -ON(C=O)C1=CC=C(C=C1)C=CC2=CC=CC=C2,1 -CN(CCCl)CCCl,1 -CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2,1 -COS(C)(=O)=O,1 -CC2=C4C=CC=C5C=CC3=CC1=CC=CC=C1C(=C2)C3=C45,1 -ClNC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 -CC(=O)NC2=CC1=CC=CN=C1C=C2,1 -[O-][N+](=O)C5=C3C=CC=C4C2=CC1=CC=CC=C1C=C2C(=C34)C=C5,1 -C1OC1CC2=CC=C(C=C2)C3=CC=CC=C3,1 -C[N]2C1=CC=CC=C1C3=CC(=CC=C23)[N+]([O-])=O,1 -CCCCCCOCC1CO1,1 -OCC1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 -CCOS(=O)(=O)OCC,1 -BrCC(Br)C1=CC=CC=C1,1 -CCCNN=O,1 -OC2=CC1=CC=CC(=C1C=C2)O,1 -CC1=C(N=C3C(=C1)C2=CC=CC=C2[NH]3)N,1 -OC4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 -ClC(Cl)(Cl)C1=CC=CC=C1,1 -C=CC=O,1 -CCC(=O)C2=C1C=CC=C(C1=C(C3=C(C=CC=C23)O)O)O,1 -NC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 -CN(CC(O)CO)N=O,1 -C1OC1COC3=C2C=CC=CC2=CC=C3,1 -C1OC1COC2=CC=CC=C2,1 -OCC1OC(CC1O)N2C=C(COO)C(=O)NC2=O,1 -CC(Cl)C(Br)CBr,1 -NC2=C1SN=CC1=CC=C2,1 -OC(=O)C=CCl,1 -[O-][N+](=O)C3=CC2=C1C=C(C=CC1=CC=C2C=C3)[N+]([O-])=O,1 -CC1OC1C,1 -CC1=C(C=C(C=C1)C(O)(P(O)(O)=O)P(O)(O)=O)N(CCCl)CCCl,1 -OC(=O)C(Cl)=C(Cl)C=O,1 -COC4=CC(=O)C3=C2[NH]C1=C(CCCC1)C2=CN=C3C4=O,1 -CCN(CC)CCNC2=C1C(C3=C(SC1=C(C=C2)CO)C=CC=C3)=O,1 -CC(=O)OC2=C(OC(C)=O)C4=C(C=CC5=C1C=CC=CC1=C3C=CC=C2C3=C45)[N+]([O-])=O,1 -O[N+]([O-])=CCl,1 -COC1=C(C=CC(=C1)N)NC(C)=O,1 -COC(=O)C(CSCC(C)Br)NC(C)=O,1 -ClCC(=O)NCC1=CC=CC=C1,1 -FC1=CC=C2C(=C1)C=CC3=C2C4=CC=CC5=CC=CC3=C45,1 -CC4=C2C1=CC=CC=C1[NH]C2=C3C(C(=CC(C3=N4)=O)N5CC5)=O,1 -CC(Br)C(=O)NCC1=CC=C(C=C1)Cl,1 -CC1CCCCN1CCCNCC(=O)NC2=C(C(=N[N]2C)C)C(=O)C3=C(C=CC=C3)F,1 -[O-][N+](=O)C1=CC4=C(C=C1)C3=CC=C2CCCCC2=C3CC4,1 -NC1=CC=C(C=C1)C=CC2=CC(=CC=C2)C#N,1 -CCC(=O)OCC1=CC=C(C=C1)[N+]([O-])=O,1 -CC(Br)CBr,1 -CC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 -CCCCOC1=CC=C(C=C1)C=NC2=CC=C(C=C2)CC,1 -OCC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 -OC1COC(C(O)C1O)N(N=O)C2=CC=C(C=C2)[N+]([O-])=O,1 -CN(CC1=CC=CC=C1)N=O,1 -NC(=O)C1=CSC(=C1)[N+]([O-])=O,1 -OC2=C1C(C3=C(C(C1=C(C=C2)[N+]([O-])=O)=O)C(=CC=C3O)[N+]([O-])=O)=O,1 -OC2C1=C(C=CC=C1)OC3=C2C=CC=C3,1 -OC1=C(C=C(C=C1)Cl)C(=O)NC2=C(C=C(C=C2)[N+]([O-])=O)Cl,1 -ClC2=C1N=CC=CC1=CC=C2,1 -COC1=CC3=C(C(=C1)O)C(=O)C2=C(C=C(C=C2O)C)C3=O,1 -CC(C)(C)OC(=O)NN=CC2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 -CC(=O)N(O)C2=CC1=CC=CC=C1C=C2,1 -CCOC1=CC(=O)C(CC1=O)=NC(C)=O,1 -O1C5C1C2=C(C=C4C(=C2)C3=CC=CC=C3C=C4)C6=C5C=CC=C6,1 -C1=CC4=C(C=C1)C3=CC2=CC=NC=C2C=C3C5=CC=CC=C45,1 -CC1=CC=C(C=C1)CC2CO2,1 -OC(=O)CC1=C(C=CC=C1)[N+]([O-])=O,1 -COC1=C(C=CC(=C1)N)N,1 -NC2=C1C=CC=CC1=CC3=CC=CC=C23,1 -COC1=C(C4=C(C=C1)C3=C2OCOC2=CC5=C3C(=C4)N(C)CC5)OC,1 -CC2=CC1=CC=CN=C1C=C2,1 -C[N]2C(=NC3=C1N=C(C)C(=NC1=CC(=C23)C)C)N,1 -OC(=O)CC=[N+](O)[O-],1 -OC1=CC(=C(C=C1)O)O,1 -OC3C=CC2=C1N=CC=CC1=CC=C2C3O,1 -COC1=CC5=C(C=C1)C3=C2OCOC2=CC4=CC=NC(=C34)C5=O,1 -OC(=O)C(Cl)=C(C(Cl)Cl)C(Cl)Cl,1 -CC2=C[N]1C(=C(N=C1S2)C3=CC=C(C=C3)[N+]([O-])=O)[N+]([O-])=O,1 -COC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)OC)OC)C3=O,1 -[O-][N+](=O)C1=CC=C(C=C1)C=CC=O,1 -OCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 -NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)Cl,1 -NC1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 -CC(=O)N(O)C1=CC=C(C=C1)OC2=CC=C(C=C2)Cl,1 -CCCN(N=O)C(N)=O,1 -NC1=CC=C(C=C1)C2=CC=C(C=C2)C3=CC=C(C=C3)N,1 -CC(=O)NC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 -O=NC1=CC(=CC=C1)C2=CC=CC=C2,1 -C5CC4=C(C3=CC2=C1C=CC=CC1=CC=C2N=C3C=C4)C=C5,1 -O=C2C1=C(C=CC=C1)C4=C3C2=CC=CC3=CC=C4,1 -COC1=CC=C(C=C1)N,1 -NC(CCC(=O)NNC1=CC=C(C=C1)CO)C(O)=O,1 -ClC1=CC(=C(C=C1)C(Cl)(Cl)Cl)Cl,1 -[O-][N+](=O)C2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 -OC1=C(C=C(C=C1)C2=CC(=CC=C2)[N+]([O-])=O)[N+]([O-])=O,1 -CC(C)CNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -FC2=C1C=CC=NC1=CC=C2,1 -CC(C)CC(=O)OC2OC=C(COC(C)=O)C3=CC(OC(=O)CC(C)C)C1(CO1)C23,1 -[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=CC=C2,1 -[O-][N+](=O)C2=C1SN=CC1=CC=C2,1 -[O-][N+](=O)C1=CC=C(C=C1)[N+]#N,1 -CC3=C2C1OC1C5=C(C2=CC4=CC=CC=C34)C=CC=C5,1 -CC1=C(C(=C(C=C1)[N+]([O-])=O)C)[N+]([O-])=O,1 -NC2=C1N=C[NH]C1=NC=N2,1 -OC2=C1N=CC=CC1=CC=C2,1 -[O-][N+](=O)C1=CC=C(C=C1)C=O,1 -NC(NC1=CC=CC=C1)=NC2=CC=CC=C2,1 -CCC2=C1[NH]C3=C(C1=CC=C2O)CCOC3(CC)CC(O)=O,1 -OC2=C(C1=C(C3=C(C(=C1C=C2)O)C(=O)C=CC3=O)O)O,1 -CC(=O)OCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 -NC1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O,1 -CC(O)CN(CC(C)=O)N=O,1 -OC6C1OC1C5=C4C=C2C=CC=C3C=CC(=C23)C4=CC=C5C6O,1 -CC1=CC5=C4C(=C1)C3=CC2=CC=CC=C2C=C3C4=CC=C5,1 -ClCC2=C4C=C1C=CC=CC1=C5C=CC3=CC=CC(=C2)C3=C45,1 -[O-][N+](=O)C3=CC=C2OC1=CC=CC=C1C2=C3,1 -C2=CC1=CC4=C(C=C1C=C2)C3=NC=CC=C3C=C4,1 -NC2=C(C=C1C=CC=CC1=C2)N,1 -ClC2=C1C=CC=NC1=CC=C2,1 -COC(=O)NC2=NC1=CC=C(C=C1[NH]2)C(=O)C3=CC=CC=C3,1 -OC(CCl)CCl,1 -NC1=CC=C(C=C1)C2=CC=CC=C2,1 -OC(=O)C(Cl)=C(C=O)C(Cl)Cl,1 -[O-][N+](=O)C4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 -COP(=S)(OC)SCN2C(=O)C1=C(C=CC=C1)C2=O,1 -CNC(=O)N(O)C(C)=O,1 -CC(=O)NNC1=CC=C(C=C1)CO,1 -[NH]2C1=CC=CC=C1N=C2C3=CSC=N3,1 -CCOCC1CO1,1 -CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C(C)=O,1 -CC(C)(OO)C1=CC=CC=C1,1 -C(SSCC1=CC=CC=C1)C2=CC=CC=C2,1 -CCC(=O)C(=O)CC,1 -ClCCSCC1=CC=CC=C1,1 -ClCCNCCCNC1=C4C(=NC2=CC=CC=C12)C3=NC=CC=C3C=C4,1 -CC(C)(O)CCC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=C4C(=C3)OC5OC=CC45O)O,1 -NC(=N)NC#N,1 -BrCBr,1 -CN(C)N=NC1=CC=C(C=C1)C,1 -CN(C)CCNC(=O)C2=CC=CN3C(=O)C1=C(C=CC=C1)N=C23,1 -COC1=CC=C(C=C1)CC2CO2,1 -COC1=C(C=C(C=C1)CNC(=O)C(C)Br)OC,1 -ClC1=C(C=C(C=C1)C(Cl)(Cl)Cl)Cl,1 -[O-][N+](=O)C1=CC(=C(C=C1)SC#N)[N+]([O-])=O,1 -C1=NC=CC(=C1)C2=CC=NC=C2,1 -NNC1=CC=C(C=C1)[N+]([O-])=O,1 -OC1OC(=O)C=C1CCl,1 -NC3=C2C(=C1C(C=CC(C1=C(C2=C(C=C3)N)O)=N)=N)O,1 -CN(C)CCCNC2=C1C=CC(=CC1=NC3=CC=CC=C23)[N+]([O-])=O,1 -COC5=C2[C]1=CC=C(C1=C(OC2=C4C3C=COC3OC4=C5)O)O,1 -COC1=NSC2=CC(=CC=C12)N,1 -ClCCl,1 -OC1=CC(=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 -C1CS1,1 -C1OCC2=C1C=CC=C2,1 -OCCNCCNC3=C2C(=C1C(C=CC(C1=C(C2=C(C=C3)NCCNCCO)O)=O)=O)O,1 -CC2C1=C(C=CC=C1)C3=C2C=CC=C3C,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC(=C(C=C1)Cl)Cl,1 -O=C2N(N=CC1=CC=CC=C1)N=NC3=C2[NH]C4=CC=CC=C34,1 -CC4=CC3=C(C2=CC=C1C=CC=CC1=C2N=C3C=C4)C,1 -C5=CC4=CC3=C1C=CC=CC1=C2C=CC=CC2=C3C=C4C=C5,1 -COC(=O)C2=C1C(C5=C(OC1=CC=C2)C3=C(OC4OC=CC34)C=C5OC)=O,1 -CC3=CC2=C(C1=CC=CC=C1C=C2C=C3)C,1 -C[N]2C1=CC(=CN=C1N=C2[N+]([O-])=O)C3=CC=CC=C3,1 -NC3=C(C=C2N=C1C=CC=CC1=NC2=C3)N,1 -COC2=C1C=C(OC1=C(C=C2)N(CCCl)CCCl)[N+]([O-])=O,1 -C2CCC1OC1C2,1 -OC6C1OC1C5=C4C2=CC=CC3=CC=CC(=C23)C4=CC=C5C6O,1 -OCCNC1=CC=C(C=C1)N=NC2=CC=C(C=C2)NCCO,1 -O=C(NC1=CC3=C(C=C1)C2=CC=CC=C2C3)C4=CC=CC=C4,1 -CC2=CC(=O)C1=C(C=CC=C1)C2=O,1 -CC(C)=CC3C(C(=O)OCC1=CC(=CC=C1)OC2=CC=CC=C2)C3(C)C,1 -CC(=C)C2=CC=C(C)C1=CC=C(CO)C1=C2,1 -O=C2C1=C(C=CC=C1)C3=C2C=CC4=C3C=CC=C4,1 -CCC(C)OS(C)(=O)=O,1 -CCCC(=O)C2=C1C=CC=C(C1=C(C3=C(C=CC=C23)O)O)O,1 -OC3C=CC2=C1C=C5C(=CC1=CC=C2C3O)C4=CC=CC=C4C=C5,1 -O=C2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3[N+]#N,1 -C1OC1COC2=C(C=CC=C2)CC3=CC=CC=C3,1 -NC4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,1 -CC(O)C(=O)NCCO,1 -CC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)CCl,1 -COC3=C2N=C1OC=CC1=C(C2=CC4=C3OCO4)OC,1 -ClC(Cl)C(=O)C(Cl)(Cl)Cl,1 -C[N]2C(=NC3=C1N=C(C)C=NC1=CC(=C23)CO)N,1 -COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O,1 -CC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 -CCCCN(CCO[N+]([O-])=O)[N+]([O-])=O,1 -ClC(=C)C=O,1 -COC4=C(C=C3C2=C1OCOC1=CC5=C2C(CC3=C4)N(C)CC5)OC,1 -CC(=O)N(O)C1=CC=C(C=C1)OC2=CC=CC=C2,1 -OC(=O)C1=C(C=CC=C1)[N+]([O-])=O,1 -[O-][N+](=O)C1=C3C=CC=C4C5=C(C2=CC=CC(=C1)C2=C34)CCCC5,1 -CC(C)OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -OC1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 -CC1=CC(=C(C=C1)N)C,1 -OC1=CC=C(C=C1)NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 -CC2=C(C1=CC=CC=C1C=C2)[N+]([O-])=O,1 -OC5C=CC4=C(C=C3C1=CC=CC2=CC=CC(=C12)C3=C4)C5O,1 -[O-][N+](=O)C1=C(C=CC=C1)C=CC=O,1 -NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)C#N,1 -OC(=O)C1=CC=C(C=C1)[N+]([O-])=O,1 -CN(CC1=CC(=CC=C1)C#N)N=O,1 -CC1=C(C(=CC(=C1)N)[N+]([O-])=O)N,1 -OS(=O)(=O)C1=CC(=O)C(=O)C2=C1C=CC=C2,1 -COC1=CC(=CC=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 -CC(=O)NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,1 -CC1=CC3=C(C(=C1)O)C(=O)C2=C(C=C(C=C2O)O)C3=O,1 -ONC2=C1N=C[NH]C1=NC=N2,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=CC=C2C=C3[N+]([O-])=O)[N+]([O-])=O,1 -CCN1N=C(C(O)=O)C(=O)C3=C1C=C2OCOC2=C3,1 -CN(C)C1=CC=C(C=C1)N(C)C,1 -[O-][N+](=O)C1=CC(=CC=C1)C2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 -CCNC1=CC(=CC=C1)O,1 -NC1=CC(=C(C=C1)CC2=C(C=C(C=C2)N)[N+]([O-])=O)[N+]([O-])=O,1 -NC2=C1C=CC=NC1=CC=C2,1 -FC2=C1C=CC=NC1=C(C=C2)F,1 -NC1=CC3=C(C=C1)C2=CC=C(C=C2C3)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC4=C2C1=CC=CC2=CC5=C3C=CC=CC3=CC=C45,1 -COC1=CC=C(C=C1)CCC2CO2,1 -NC3=CC=C2[NH]C1=CC=CC=C1C2=C3[N+]([O-])=O,1 -COC3=CC=C2[NH]C1=C(C)C=C(N)C(=C1C2=C3)C,1 -O=NC1=C(C=CC=C1)C2=CC=CC=C2,1 -CC2=NC1=CC=CC=C1C=C2,1 -OC3C(O)C2=C(C1=NC=CC=C1C=C2)C4OC34,1 -ClCC(Cl)CCl,1 -COC1OC(=O)C(=C1C(Cl)Cl)Cl,1 -CC1=CC(=CC=C1)C(Cl)=O,1 -CC2=C[N]1C(=C(N=C1S2)C3=CC=C(C=C3)[N+]([O-])=O)N=O,1 -COC1=C(C=C(C=C1)C)N,1 -COC1=CC=C(C=C1)C=CC2=CC=C(C=C2)N,1 -OC(=O)CCOP(O)(=N)N(CCCl)CCCl,1 -S=C=NC2=C1C=CC=CC1=CC=C2,1 -COC1=CC=C(C=C1)C(Br)=CC(O)=O,1 -CCOC1=C(C=C(C=C1)N)N,1 -CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)NC(C)=O,1 -CC(=O)N(O)C1=CC=C(C=C1)OC2=C(C=C(C=C2)Cl)Cl,1 -C[N]2C(=NC3=C1N=CC=NC1=CC(=C23)C)N,1 -[O-][N+](=O)C(Br)(Br)Br,1 -OCCN(CCO)C2=C1C=CC=CC1=NC(=N2)C3=CC=C(S3)[N+]([O-])=O,1 -CC1(C)CC2C(O)(C1)C=C(C=O)C34CC23C(=O)OC4O,1 -NC3=C2N=C1C=CC=C(C1=NC2=CC=C3)N,1 -OC4C=CC3=C2C=C1C=CC=CC1=C(C2=CC=C3C4O)Cl,1 -[O-][N+](=O)C2=CC=C1SN=CC1=C2,1 -OC2C=CC1=C3C=CC4=CC=CC5=CC=C(C=C1C2O)C3=C45,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC(=CC=C2C=C3)[N+]([O-])=O,1 -[O-][N+](=O)C2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2[NH]3,1 -NC1=C(C=C(C=C1Cl)[N+]([O-])=O)Cl,1 -S=C=NCCC1=CC=CC=C1,1 -CCC=CC=CC=CC=COCC(O)CO,1 -[O-][N+](=O)C1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)CCC=C5,1 -[O-][N+](=O)C2=C3C=CC4=CC=CC5=C1CCCCC1=C(C(=C2)[N+]([O-])=O)C3=C45,1 -C1CO1,1 -CN2C1=C(C=C(C(=C1)C)C)N=C3C(=O)NC(=O)N=C23,1 -OC(=O)CC1=CC=C(C=C1)[N+]([O-])=O,1 -CC1=C(C=CC2=CC=CC=C12)[N+]([O-])=O,1 -CC(=O)ON(C(C)=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 -O5C6C=CC4=C3C=C1C=CC=C2C=CC(=C12)C3=CC=C4C56,1 -NC(=O)C1=C(C=C(C(=C1)N2CC2)[N+]([O-])=O)[N+]([O-])=O,1 -OCC(Br)=C(Br)CO,1 -OC1=CC3=C(C(=C1)O)C(=O)C2=C(C(=CC=C2O)O)O3,1 -[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=CC(=C2)[N+]([O-])=O)O3,1 -OC2C=CC1OC1C2O,1 -[O-][N+](=O)C1=CC(=CC=C1)S(=O)(=O)OCC2CO2,1 -[O-][N+](=O)C1=CC=C(O1)C=NN2CC(=O)NC2=O,1 -CC1(CO1)C2=CC=C(C=C2)C#N,1 -FC5=C4C=C3C1=CC=CC2=CC=CC(=C12)C3=CC4=CC=C5,1 -OCC(O)CCl,1 -CC1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 -CCC1(C(=O)NC(=O)NC1=O)C2=CC=CC=C2,1 -[O-][N+](=O)OCC(CO[N+]([O-])=O)O[N+]([O-])=O,1 -CC(=C)C(=O)OCC(Br)CBr,1 -CN(C)CCNC(=O)C3=C2C=C1C=CC=CC1=NC2=CC=C3,1 -NC1=CC=C(C=C1)C=CC2=CC(=CC=C2)N,1 -CC1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 -CCCCOC3=NC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCN(CC)CCCl,1 -OCC=CCl,1 -OCC(O)C(O)C(O)C(O)C1SCCN1N=O,1 -C1OC1COC2=NSC3=CC=CC=C23,1 -C1OC1COC2=CC=C(C=C2)CC3=CC=CC=C3,1 -CN(CCC#N)C1=CC=C(C=C1)N=NC2=CC=CC=C2,1 -[O-][N+](=O)C1=CC(=C(C(=C1)[N+]([O-])=O)NC2=C(C=C(C=C2[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 -C5CC1=C(C2=CC=C3C=CC=C4C=CC(=C1)C2=C34)C=C5,1 -CCCCOC1=CC=C(C=C1)N=O,1 -CC(C)(C)OCC1CO1,1 -OC6C=CC5=C3C1=CC=CC=C1C4=CC2=CC=CC=C2C(=C34)C=C5C6O,1 -CC1=CC4=C(C=C1)C3=CC2=CC=CC=C2C=C3C=C4,1 -[O-][N+](=O)C3=CC=C2[NH]C1=CC=C(C=C1C2=C3)[N+]([O-])=O,1 -NC1=C3C=CC=C4C=CC2=CC=CC(=C1)C2=C34,1 -CCBr,1 -C1COC1,1 -[O-][N+](=O)C1=C3C=CC=C4C=CC2=CC=CC(=C1)C2=C34,1 -C(CC1=CC=C(C=C1)C2=CC=CC=C2)C3CO3,1 -ClC(=O)C1=CC(=CC=C1)Cl,1 -CC(C)=CCC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=C4C(=C3)OC5OC=CC45O)O,1 -COC1=CC=C(C=C1)[N+]([O-])=O,1 -CC1(C)CC3=C(C1)C(C=O)C2(CC2(C)C3O)C=O,1 -[O-][N+](=O)C2=CC1=NC3=C(N=C1C=C2)C(=CC=C3)[N+]([O-])=O,1 -CC1=C(C=C(C=C1)N)N,1 -OC(=O)C1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 -CNC2=C1C(C3=C(C(C1=C(C=C2)NCCO)=O)C=CC=C3)=O,1 -[O-][N+](=O)C4=C3C1=CC=CC=C1C2=CC=CC5=C2C3=C(C=C4)C6OC56,1 -COC2=NSC3=CC=C(OCC1CO1)C=C23,1 -CCCC(=C)C=O,1 -C1=CC3=C(C=C1)C2=CC5=C(N=C2C=C3)C4=CC=CC=C4C=C5,1 -NC1=C(C=C(C=C1Br)[N+]([O-])=O)[N+]([O-])=O,1 -OCC1CO1,1 -ClC1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 -O[N+]([O-])=C(Cl)Cl,1 -NC(=O)CNC(=O)C=[N+]=[N-],1 -OC2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3)=O,1 -CC1=C(C=C(C=C1)[N+]([O-])=O)N,1 -CC1=NC(=CN=C1)C,1 -NC3=C2C=C1C=CC=CC1=CC2=CC=C3,1 -NC1=CC=C(C=C1)C2=CC(=C(C(=C2)Cl)N)Cl,1 -BrCC(Br)COC(=O)C=C,1 -O=NC1=CC=C(C=C1)SC2=CC=CC=C2,1 -ClC(=O)C1=C(C=CC=C1)Cl,1 -NC1=CC=C(C=C1)OC2=CC=CC=C2,1 -O=CCCCC=O,1 -COC2=CC=C1OC(=CC1=C2N(CCCl)CCCl)[N+]([O-])=O,1 -C=CC(=O)OCC1CO1,1 -[NH]1N=NC2=CC=CC=C12,1 -OC3C=CC2=C(C1=CC=CC=C1C=C2C3O)[N+]([O-])=O,1 -COC1=C(C=C(C=C1)CC2=C(N=C(N=C2)N)N)OC,1 -CC(=O)NC3=C2C1=CC=CC=C1CC2=CC=C3,1 -CC1(CO1)C2CO2,1 -NC(=O)C1CO1,1 -NC(=S)NN=C1C=CC(C=C1)=NN=C(N)N,1 -ClC(C(Cl)=O)C1=CC=CC=C1,1 -NC1=CC=C(C=C1)N=NC2=CC=C(C=C2)N,1 -[O-][N+](=O)C1=CC=C(O1)C=NN2CCOC2=O,1 -[O-][N+](=O)C3=C2C=CC1=CC=CC4=C1C2=C(C=C3)C5OC45,1 -[O-][N+](=O)C3=CC2=NC1=CC=C(C=C1N=C2C=C3)[N+]([O-])=O,1 -NC2=C1N=C[N](C1=NC=N2)C3=CC=C(C=C3)[N+]([O-])=O,1 -C1=CN=C(C=C1)C2=NC(=CC=C2)C3=NC=CC=C3,1 -NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)Cl)Cl,1 -C[N]3C2=CC=C1N=CC=CC1=C2N=C3[N+]([O-])=O,1 -[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC(=CC=C2)[N+]([O-])=O,1 -CC2=C1C=CC=CC1=C(C3=CC=CC=C23)CBr,1 -NC1=CC=C(C=C1)C=C,1 -CC1=C(C=CC(=C1)Cl)N,1 -NC(CSC(Cl)=C(Cl)Cl)C(O)=O,1 -OCC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,1 -NC2=NC1=CC=CC=C1C=C2,1 -CCCCON=O,1 -[O-][N+](=O)C1=CC=C(C=C1)Br,1 -C[N]2C1=CC=CC=C1C(=C2C3=CC=CC=C3)N=NC4=[N+](C=CS4)C,1 -CC1=C(C(=C(C(=C1)N)C)[N+]([O-])=O)N,1 -OC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC=C2)C3=O,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC(=CC=C2C(=C3)[N+]([O-])=O)[N+]([O-])=O,1 -OCC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)COS(O)(=O)=O,1 -ClP(=O)(N1CCOC1=O)N2CCOC2=O,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=C(C=C2C3)[N+]([O-])=O,1 -OCCCCCl,1 -CC1=C(C=C(C=C1[N+]([O-])=O)N)[N+]([O-])=O,1 -CC(C)CON=O,1 -ClC2=C1C=CC=CC1=NC=C2,1 -[O-][N+](=O)C3=CC2=NC1=CC(=CC=C1N=C2C=C3)[N+]([O-])=O,1 -C1=C2C=CC3=CC=C4C=CC5=CC=C6C=CC(=C1)C7=C2C3=C4C5=C67,1 -NC(CS)C(=O)NCC(O)=O,1 -[O-][N+](=O)C1=CC(=CC=C1)C=O,1 -C[N]1C(=NC2=NC=C(C=C12)C3=CC=CC=C3)NO,1 -[O-][N+](=O)C5=CC=C4C3=C2C(=CC1=CC=CC=C1C2=CC=C3)C4=C5,1 -OS(=O)(=O)C1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2C3=O)[N+]([O-])=O,1 -ClCCNCCCl,1 -BrCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 -CC(C)(C1=CC=C(C=C1)OCC2CO2)C3=CC=C(C=C3)OCC4CO4,1 -CC(=O)NC1=CC=C(C=C1)C(=O)CCl,1 -CC3=C2[NH]C1=CC=C(N)C=C1C2=C(C)C4=CN=CC=C34,1 -NC1=CC=C(C=C1)SC2=CC=C(C=C2)N,1 -COC4=CC3=C1N=CC=C2C=C(C(C(=C12)C(=C3C=C4)O)=O)OC,1 -CC1(C)CC(N)CC(C)(C)N1O,1 -ClCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 -[O-][N+](=O)C4=C2C=CC=C3C1=C(C=CC=C1C(=C23)C=C4)[N+]([O-])=O,1 -COC5=C2[C]1=C(C=C(C1=C(OC2=C4C3C=COC3OC4=C5)O)O)O,1 -CCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -COCC(O)C[N]1C=C(N=C1Cl)[N+]([O-])=O,1 -ClC1=CC=C(C=C1)CCC2CO2,1 -O=C2OC1=C(C=CC=C1)C=C2,1 -CC(O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -C1=CC2=CC=C3C=NC=C4C=CC(=C1)C2=C34,1 -CC2=C1C=CC=CC1=C(C3=CC=CC=C23)CCl,1 -OC5=CC4=C2C=C1C=CC=CC1=CC2=C3C=CC=CC3=C4C=C5,1 -[O-][N+](=O)C1=CC=C(C=C1)COC(=O)C2=CC=CC=C2,1 -CC(Br)C(N)=O,1 -[O-][N+](=O)C3=C2C(C(C1=CC=CC4=C1C2=C(C=C3)C=C4)=O)=O,1 -C[N]1C(=NC2=C1C=CC3=NC(=CN=C23)C)N,1 -NC4=C2C1=CC=CC=C1C3=CC=CC(=C23)C=C4,1 -C[N]2C=C1C=CC(=CC1=N2)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O,1 -O=C3C2=C(C1=CC=CC=C1C=C2)C4=C3C=CC5=C4C=CC=C5,1 -OC2=C1N=CC=CC1=C(C=C2)S(O)(=O)=O,1 -OC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)O)O)C3=O,1 -CN(CCCC(=O)C1=CN=CC=C1)N=O,1 -CN(C)C3CC2=C1C(=CC=CC1=CC=C2)C3,1 -CC4=C3C2=CC=C1C=CC=CC1=C2C=CC3=CC=C4,1 -CCN(N=O)C(N)=O,1 -CN(C)C1=CC=C(C=C1)N=NC3=CC=C2[NH]N=CC2=C3,1 -CC1=C(C=CC=C1)C2=CC(=C(C=C2)N)C,1 -C1OC1COC3=C2SN=CC2=CC=C3,1 -ONC1=CC=C(C=C1)[N+]([O-])=O,1 -COC1=C(C=C(C(=C1)N)[N+]([O-])=O)N,1 -CN(C)C(=O)N(C)C=O,1 -ClC(Cl)C(C=O)=C(Cl)Cl,1 -NC1=CC(=CC=C1)N,1 -CC4=CC3=C(C2=CC=C1C=CC=CC1=C2N=C3C(=C4)C)C,1 -CC(=O)NC1=C(C=C(C=C1)CC2=CC(=C(C=C2)N)Cl)Cl,1 -CC(=O)NC1=CC=C(C=C1)NC2=CC=C(C=C2)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC=C(C=C1)OC2=CC=C(C=C2)N=C=S,1 -CC1=CC=C(C=C1)N(CCO)CCO,1 -CC1=CC=C(C=C1)C=CC2=CC=C(C=C2)N,1 -[O-][N+](=O)C2=C3C=CC4=CC=C(C5=C1CCCCC1=C(C=C2)C3=C45)[N+]([O-])=O,1 -CC(=O)OCC1=CC=CO1,1 -NC1=C(C(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O)O,1 -NC3=C2C(=C1C=CC=CC1=C(C2=C(C=C3)N)O)O,1 -CC(=O)C1=CC=CO1,1 -CN(N=O)C(N)=O,1 -C1C5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 -[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=C(C=C2)[N+]([O-])=O)O3,1 -OC(=O)C1=C(C(=C(O1)[N+]([O-])=O)C2=CC=CC=C2)C3=CC=CC=C3,1 -CC4=C(C=C3C(=C2C=CC1=CC=CC=C1C2=NC3=C4)C)C,1 -NC2=C1[NH]C=NC1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O,1 -BrCC(Br)C=O,1 -[O-][N+](=O)C2=C1C=CC=CC1=CC3=CC=CC=C23,1 -OC1=CC=C(C=C1)C2=CC=CC=C2,1 -CC(=O)C=CC1=CC=CC=C1,1 -CC2=C4C1=CC=CC=C1C=C5C=CC3=CC=CC(=C2)C3=C45,1 -CC1=CC=C(C=C1)N(N)C2=CC=C(C=C2)C,1 -COC1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 -CC1=C4C(=CC=C1)C3=CC2=CC=CC=C2C=C3C=C4,1 -CCC1(C(=O)NCNC1=O)C2=CC=CC=C2,1 -C2=CC1=CC4=C(C=C1C=C2)C3=CN=CC=C3C=C4,1 -O=S1(=O)CCCO1,1 -CNC(=O)NOC(=O)NC,1 -OC1=CC4=C(C=C1)C5=C2C=CC=CC2=CC6=C3C=CC=CC3=CC4=C56,1 -COC2=C1C(C5=C(OC1=CC4=C2C3C=COC3O4)C(=CC=C5O)CCC(C)(C)O)=O,1 -[O-][N+](=O)C4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4,1 -CC3=C1C4=C(C=CC1=C2C=CC=CC2=C3)C(O)C(O)C5OC45,1 -NC2=CC1=CC=CC=C1N=C2,1 -CC4=CC3=C2C=C1C=CC=CC1=CC2=CC=C3C=C4,1 -ClCBr,1 -ClC(Cl)(Cl)C1CO1,1 -[O-][N+](=O)C1=CC(=C(C=C1)C=O)[N+]([O-])=O,1 -CC(C)=CCOC2=C1OC=CC1=CC3=C2OC(C=C3)=O,1 -CC1CC(=O)O1,1 -OCC1=C(C3=C(C=C1O)C(=O)C2=C(C=CC=C2)C3=O)O,1 -[O-][N+](=O)C1=C3C(=CC=C1)C2=C(C=CC=C2C(=C3)[N+]([O-])=O)[N+]([O-])=O,1 -CCC(C)COC(=O)C=CC1=CC=C(C=C1)N=CC2=CC=C(C=C2)OC,1 -C3=CC2=CC1=CC=CC=C1C=C2C=C3,1 -CCCC(=O)C1=C(C=C(C(=C1)O)O)O,1 -CCN(CCCl)C1=CC=C(C=C1)OCCCCCNC3=C2C=CC=CC2=NC4=CC=CC=C34,1 -CC(=O)N(O)C1=CC=C(C=C1)C2=CC=CC=C2,1 -O1C=CC2=CC3=CC=C4C=CC=C5C=CC(=C12)C3=C45,1 -OC1OC(=O)C(=C1CCl)Cl,1 -NC1=CC=C(C=C1)C=CC2=CC(=CC=C2)Cl,1 -CCOC(=O)C(C)Br,1 -COC1=NSC2=CC(=CC=C12)OCC3CO3,1 -COC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,1 -COC1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 -CC1CN(CC(C)O1)N=O,1 -O=CC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -CN(C(=O)C1=CSC(=C1)[N+]([O-])=O)C2=CC=CC=C2,1 -NC2=C1C(C3=C(C(C1=CC=C2)=O)C(=CC=C3)N)=O,1 -NC1=C(C=C(C=C1)[N+]([O-])=O)N,1 -O1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 -NC1=C(C=C(C=C1)C2=CC(=C(C(=C2)Cl)N)Cl)Cl,1 -C1OC1COC2=CC=C(C=C2)C3=CC=CC=C3,1 -CCCSC(Cl)=O,1 -CC3(C)CC2C=C(C=O)C14CC1(C2C3)C(=O)OC4O,1 -NC2=C1C=C(C=CC1=NC3=CC=CC=C23)O,1 -CC(=O)NC1=CC(=C(C=C1)C)N,1 -CN(CC1=CC=C(C=C1)F)N=O,1 -CC(=C)C(=O)OCC1CO1,1 -CC1=C(C(=CC=C1N)N=NC2=CC=CC=C2)N,1 -CC1=C(C=C(C=C1)[N+]([O-])=O)N=O,1 -ClCC2=C1C=CC=CC1=C(C3=CC=CC=C23)CCl,1 -CCC(COC(=O)C=C)(COC(=O)C=C)COC(=O)C=C,1 -NC2=CC1=CC=CC=C1C=C2,1 -CCCON=O,1 -COC1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 -NC3=CC=C2[NH]C1=CC=CC=C1C2=C3,1 -CNC(=O)OC1=C(C=CC=C1)OC(C)C,1 -CC1=C3C(=C(C(=C1)[N+]([O-])=O)C)C2=CC=CC=C2[NH]3,1 -COC1=CC(=C(C=C1)N)C,1 -C1=CC=C4C(=C1)C=C3C2=C(C=CC=C2)C5=C3C4=CC=C5,1 -ClCC=C,1 -CC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)CBr,1 -O=C1C=CC4=C2C1=CC=C3C=CC(C(=C23)C=C4)=O,1 -CC(=O)C(Cl)(Cl)Cl,1 -OC(=O)C1=CC(=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 -COC3=C1C=COC1=NC4=CC2=C(OCO2)C=C34,1 -[O-][N+](=O)C4=C3C1OC1C2=CC=CC5=C2C3=C(C=C4)C=C5,1 -NC(CCC(=O)NC(CSN=O)C(=O)NCC(O)=O)C(O)=O,1 -OC1CCOP(=O)(N1)N(CCCl)CCCl,1 -C[N]3C2=CC=C1C=CC=CC1=C2C4=C3C=CC5=CC=CC=C45,1 -NC2=C1C=C(C=CC1=NC3=CC=CC=C23)Cl,1 -NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)N)N,1 -CC1=C(C(=CC=C1)N)C,1 -OC5=C4C=C3C1=CC=CC=C1C2=CC=CC=C2C3=CC4=CC=C5,1 -OCC(C(Cl)Cl)=C(Cl)C(O)=O,1 -N(N=NC1=CC=CC=C1)C2=CC=CC=C2,1 -C[N]1C=NC(=C1C(=O)N(C)N=O)N(C)N=O,1 -CCCCN(CC(O)C1=CC(=[N+]=[N-])C(=O)C=C1)N=O,1 -CN1CC(O)C4=C2C1CC5=C(C2=C3OCOC3=C4)C=CC=C5,1 -[O-][N+](=O)C1=CC(=C(C=C1)C2=CC=CC=C2)[N+]([O-])=O,1 -OC2=C1C(C=CC(C1=C(C=C2)O)=O)=O,1 -OC2C=CC1=CC5=C4C(=C1C2O)C3=CC=CC=C3C4=CC6=CC=CC=C56,1 -COC2=C1C=COC1=NC3=CC=CC=C23,1 -CCCCCCN(N=O)C(N)=N[N+]([O-])=O,1 -[O-][N+](=O)C1=CC=C(C=C1)C2=CC=C(C=C2)[N+]([O-])=O,1 -NC1=CC3=C(C=C1)C(=O)C2=C(C=CC(=C2)N)C3=O,1 -CC(=O)NC3=C(C=C2C1=CC=CC=C1CC2=C3)Cl,1 -C1=CC5=C(C=C1)C4=C2C=CC3=CC=CC(=C23)C=C4C=C5,1 -[O-][N+](=O)C1=CC3=C2C1=CC=CC2=CC=C3,1 -COC2=CC=C1[N](C)C(=NC1=C2)N,1 -COC1=CC(=C(C=C1)N)OC,1 -CCNC1=C(C=CC(=C1)O)C,1 -OC5C1OC1C4=C(C3=CC=C2C=CC=CC2=C3C=C4)C5O,1 -[O-][N+](=O)C1=CC3=C2C1=CC=CC2=CC5=C3C4=CC=CC=C4C=C5,1 -OC1OC(=O)C(=C1Cl)Cl,1 -CC(=O)NC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -CN(C)CCNC(=O)C3=C2N=C1C=CC=CC1=CC2=CC=C3,1 -NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -CC(CC1=CC(=C(C=C1)O)O)(NN)C(O)=O,1 -ClCC(Br)CCl,1 -CC4=CC3=NC2=C1C=CC=CC1=CC=C2C(=C3C=C4)C,1 -CC(=O)OCC2=C1C=CC=CC1=C(C3=CC=CC=C23)C,1 -CCCCC(CC)COCC1CO1,1 -COC4=CC=C3C(=O)C2=C1C(=NC=CC1=CC(=C2OC)OC)C3=C4,1 -CC(O)CBr,1 -COC(=O)C12CC1(C=O)C(C=O)C=C3CC(C)(C)CC23,1 -[O-][N+](=O)C3=CC=C2OC1=CC=C(C=C1C2=C3)[N+]([O-])=O,1 -NC2=C1N=C[N](C1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4CC(O)C(CO)O4,1 -C3CC2=C(C1=NC=CC=C1C=C2)C4OC34,1 -CCOP(=O)(OCC)N1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 -NC1=CC=C(C=C1)SC2=CC=C(C=C2)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC=C(C=C1)C3=C([N]2CCSC2=N3)[N+]([O-])=O,1 -OC5=C4C1=CC=CC=C1C3=CC2=CC=CC=C2C=C3C4=CC=C5,1 -CC1=C(C=CC=C1)N,1 -O1C4C1C3=C(C=C2C=CC=CC2=C3)C5=C4C=CC=C5,1 -N1C4C1C3=C(C=C2C=CC=CC2=C3)C5=C4C=CC=C5,1 -OC1CC(=O)C5=C4C1(C2CCC(C3=C(C=CC(=C23)C4=CC=C5O)O)=O)O,1 -OC(=O)C1=CC=C(O1)[N+]([O-])=O,1 -O=C(OCC1CO1)C2=CC(=CC=C2)C(=O)OCC3CO3,1 -ClC(Cl)=C1OC(=O)C=C1,1 -[O-][N+](=O)C3=C1C=CC2=CC=CC(=C12)C=C3,1 -C[N]1C(=NC2=C1C=CC3=NC=CC=C23)NO,1 -OC1=CC=C(C=C1)C3OC2=C(C(=CC(=C2)O)O)C(=O)C3=O,1 -OCC(CO)(CBr)CBr,1 -FC5=C3C=CC=C4C2=CC1=CC=CC=C1C=C2C(=C34)C=C5,1 -BrCCOC(=O)C=C,1 -[O-][N+](=O)C3=C2C=CC1=CC=CC4=C1C2=C(C=C3)OC4=O,1 -[O-][N+](=O)C1=CC2=C(C=C1)CCN2,1 -COC3=C2N=C1C=CC=CC1=C(C2=CC=C3)NCCCNCCCl,1 -[O-][N+](=O)C2=NC1=CC=CC=C1[NH]2,1 -COC(=O)C4=C2C(=CC1=C(C=CC=C1C2=C3OCOC3=C4)OC)[N+]([O-])=O,1 -CCOCC1=C(C3=C(C=C1O)C(=O)C2=C(C=CC=C2)C3=O)O,1 -NC1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,1 -COC3=CC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCNCCCl,1 -C1CN1C2=NC(=NC(=N2)N3CC3)N4CC4,1 -CC3=C(C=C2C(=C1C=CC=CC1=C(C2=C3)C)C)C,1 -CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)C)[N+]([O-])=O,1 -CC(=O)OCC1=C4C(=C(C2=CC=CC=C12)C)C3=CC=CC=C3C=C4,1 -CC4=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C=C4,1 -OC4C=CC3=C(C2=CC=C1C=CC=CC1=C2C=C3[N+]([O-])=O)C4O,1 -OC(=O)C4=CN(C1CC1)C2=C(C=C(C(=C2)N3CCNCC3)F)C4=O,1 -CC1=C(C=CC=C1)OCC2CO2,1 -[O-][N+](=O)C1=C(C=C(C=C1)Cl)Cl,1 -COC1=CC2=C(C(=C1)O)C(C(C(O2)C3=CC(=C(C=C3)O)O)=O)=O,1 -CCCCC1C(=O)N(N(C1=O)C2=CC=C(C=C2)O)C3=CC=CC=C3,1 -CCN(CC)C1=CC=C(C=C1)C2=CC=C(C=C2)C3=CC=C(C=C3)N(CC)CC,1 -NC3=CC2=CC1=CC=CC=C1N=C2C=C3,1 -[O-][N+](=O)C1=C(C=CC(=C1)Cl)Cl,1 -ONC1=C(C=CC=C1)C2=CC=CC=C2,1 -NC2=NC1=CC(=CC=C1[NH]2)C#N,1 -CC1=CC=C2C(=C1)C=CC3=C2C4=C([NH]3)C=CC5=C4C=CC=C5,1 -CC1=C(C=C(C=C1N)[N+]([O-])=O)N,1 -CC(=O)NC1=C(C=C(C=C1)CC2=CC(=C(C=C2)NC(C)=O)Cl)Cl,1 -C=CC1CO1,1 -C1=CC5=C(C=C1)C4=NC3=C2C=CC=CC2=CC=C3C=C4C=C5,1 -CC(=O)NC1=CC3=C(C=C1)C2=CC=C(C=C2C3)NC(C)=O,1 -[O-][N+](=O)C2=C3C=CC4=C1C=CCCC1=CC5=CC=C(C=C2)C3=C45,1 -CCN1CCN(CC1)C3=C(C=C2C(C(=CN(C2=C3)C4CC4)C(O)=O)=O)F,1 -OC3C=CC2=C1C=CC=CC1=CC=C2C3O,1 -CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)C(O)=O,1 -[O-][N+](=O)C1=C2C5=C(C3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O)CCCC5,1 -OC2=C1C(C3=C(C(C1=C(C=C2)O)=O)C=CC=C3)=O,1 -CC(C)CCON=O,1 -OC3=C2C(=C1C=CC=CC1=C(C2=C(C=C3)O)O)O,1 -CCN(CC)CCCC(C)NC2=C1N=CC=CC1=CC(=C2)OC,1 -COC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,1 -CN(C)C1=CC=C(C=C1)N=NS(O)(=O)=O,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC(=CC=C2O3)[N+]([O-])=O,1 -CCN(CCO[N+]([O-])=O)[N+]([O-])=O,1 -OC(=O)C4=C2C(=CC1=CC=CC=C1C2=C3OCOC3=C4)[N+]([O-])=O,1 -CCC(=O)C=C,1 -ClCCOC(=O)C=C,1 -CCC(O)C=CC=CC=CC=CC=O,1 -NC2=C1C(C3=C(C(C1=C(C=C2)N)=O)C=CC=C3)=O,1 -[O-][N+](=O)C1=CC=C(O1)C=N[N]2C=CC=N2,1 -[O-][N+](=O)C3=CC=C2C(=O)C1=CC=CC=C1C2=C3,1 -CC(C)OCC1CO1,1 -CC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 -N1C2C1C6=C4C3=C2C=CC=C3C=CC4=C5C=CC=CC5=C6,1 -ClC1CN(CC1Cl)N=O,1 -NNC(=O)C1=CC=NC=C1,1 -CCCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -O=NC1=CC=C(C=C1)C2=CC=CC=C2,1 -CC2=CC1=C3C=CC4=CC=CC5=CC=C(C=C1C=C2)C3=C45,1 -[O-][N+](=O)C4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 -C[N]1C(=NC2=CC(=CC=C12)C#N)N,1 -[N-]=[N+]=NCCC1=CC=CC=C1,1 -CC4=C3C2=CC1=CC=CC=C1C=C2C=CC3=CC=C4,1 -CC1=C(C=C(C(=C1)S(O)(=O)=O)N)Cl,1 -OCC1OC(CC1O)N2C=C(CO)C(=O)NC2=O,1 -C1=CC2=C(C=C1)C5=C(C=C2)C4=CC=C3C=CC=CC3=C4C=C5,1 -C1=CC2=C(C=C1)C3=CC5=CC=CC6=CC=C4C=CC2=C3C4=C56,1 -COC1=CC4=C3C(=C1OC)C2=CC5=C(C=C2CC3N(CC4)C)OCO5,1 -NC1=C(C(=CC(=C1)[N+]([O-])=O)Cl)O,1 -[O-][N+](=O)C1=CC=C(O1)C=C(C#N)C#N,1 -CCCCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -CC(=O)C1=CC=C(C=C1)[N+]([O-])=O,1 -CCCC=CC=O,1 -CC1=CC(=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 -CN(N=O)N(C1=CC=CC=C1)C(=O)C(=NO)C(C)=O,1 -O=NN1CCCCCC1,1 -CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)COC(C)=O,1 -CC(C)(COCC1CO1)COCC2CO2,1 -ClC1=C(Cl)C(=O)OC1,1 -COC2=NSC3=C(OCC1CO1)C=CC=C23,1 -O=C1NC4=C2C1=CC5=C(C2=C3C=CC=CC3=C4)OCO5,1 -NC1=C(C=CC(=C1)[N+]([O-])=O)O,1 -CC3=CC2=C(C1=CC=CC=C1N=C2C=C3)N,1 -CC=CCC=O,1 -OS(=O)(=O)C3=C2C(C1=CC=CC(=C1C(C2=CC=C3)=O)[N+]([O-])=O)=O,1 -OCCNC(=O)N(CCCl)N=O,1 -CN(CC1=CC=C(C=C1)Cl)N=O,1 -[N-]=[N+]=NC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 -CC(=O)CN(COC(C)=O)N=O,1 -C=CCOCC1CO1,1 -NC1=CC=C(C=C1)CC2=CC(=C(C=C2)N)CC3=CC=C(C=C3)N,1 -O=NC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 -CCOC(N)=O,1 -OC(=O)C2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 -NC1=CC=C(C=C1)F,1 -CC4=C1C=CC=CC1=C3C=C2C=CC=CC2=CC3=C4,1 -C=CCN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 -CCCN(CCC)N=O,1 -CC(C)CN(N)CC(C)C,1 -NC1=C(C=CC=C1)S(O)(=O)=O,1 -ClC1=CC=C(C=C1)CC2CO2,1 -O=C2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3,1 -CN(C=O)N=O,1 -CC(O)CCl,1 -CC(=O)NC3=C2C=CC1=CC=CC4=C1C2=C(C=C3)C(=O)C4=O,1 -[O-][N+](=O)C2=CC1=CC=CC=C1C=C2,1 -[O-][N+](=O)C3=C2C=CC1=CC=CC=C1C2=CC=C3,1 -OCC1=CC=C(O1)C=O,1 -NC1=C3C(=CC=C1)C2=CC=CC=C2C3,1 -ClC3=C2C=CC1=CC=CC=C1C2=CC4=CC=CC=C34,1 -O1C2C1C5=C3C2=CC=CC3=CC6=C4C=CC=CC4=CC=C56,1 -CN(C)C1=CC=C(C=C1)N=NC2=CC=CC=C2,1 -CC1=CC3=C(C(=C1)C)C2=CC=CC=C2C=C3,1 -CC1=C(C(=CC=C1)NO)C,1 -BrCCC(=O)N1CCN(CC1)C(=O)CCBr,1 -CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)[N+]([O-])=O,1 -CC2C1=C(C=CC=C1)C3=C2C(=CC=C3)C,1 -CC1=C(C(=CC=C1)[N+]([O-])=O)[N+]([O-])=O,1 -CC1=CC(=O)OC2=C1C=C3CCCN4CCCC2=C34,1 -NC1=CC=C(C=C1)C2=CC=C(C=C2)[N+]([O-])=O,1 -COC2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3)=O,1 -[O-][N+](=O)C1=CC=C(C=C1)[N+]([O-])=O,1 -NC1=CC=C(C=C1)CCC2=CC=CC=C2,1 -C1=CC3=C(C=C1)C4=CC=C5C=CC=C6C2=CC=CC=C2C(=C3)C4=C56,1 -COC(=O)NC(=S)NC1=C(C=CC=C1)NC(=S)NC(=O)OC,1 -O=N[N]1C=C(CC#N)C2=CC=CC=C12,1 -COC(=O)C1=NC(=C3C(=C1)C2=CC=CC=C2[NH]3)C4=NC5=C(C=C4)C(=O)C=CC5=O,1 -[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 -COCC=O,1 -CC1=C(C=CC=C1)C(Cl)=O,1 -NC1=CC=C(C=C1)OC2=CC=C(C=C2)OC3=CC=C(C=C3)N,1 -OC1=NSC2=CC(=CC=C12)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC5=C2C1=CC=CC2=C4C=C3C=CC=CC3=CC4=C5,1 -NC3=C2C1=CC=CC=C1CC2=CC=C3,1 -C3C=CC4=C2C1=CC=CC=C1C=CC2=CC=C34,1 -CC(=O)C1=CC=C[N]1[N+]([O-])=O,1 -NC1=CC(=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)N)[N+]([O-])=O,1 -O=C2C1=C(C=CC=C1)C4=C3C2=NC=CC3=CC5=C4OCO5,1 -COC6=C2[C]1=CC=C(C1=C(OC2=C5C4C3OC3OC4OC5=C6)O)O,1 -CC1=C(C=CC=C1)N=NC3=C2C=CC=CC2=CC=C3O,1 -OC(=O)C=CC1=CC=C(C=C1)[N+]([O-])=O,1 -[O-][N+](=O)C1=C([NH]C=N1)C2=CC=CC=C2,1 -ClCCNP1(=O)OCCCN1CCCl,1 -NC(CSCCCl)C(O)=O,1 -[O-][N+](=O)C1=C(N=C2SCC[N]12)C3=CC=C(C=C3)Cl,1 -CC1=CC=C[N]2C1=NC3=C(C)C(=CN=C23)NO,1 -CC3=C2C1NC1C5=C(C2=CC4=CC=CC=C34)C=CC=C5,1 -[O-][N+](=O)C3=C1C=CC=C2C=CC(=C12)C=C3,1 -CC1=CC=C(C=C1)[N+]#N,1 -COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)OC)N,1 -CC1=C(C=CC=C1)OP(=O)(OC2=C(C=CC=C2)C)OC3=C(C=CC=C3)C,1 -[O-][N+](=O)C3=C2OC(C1=CC=CC4=C1C2=C(C=C3)C=C4)=O,1 -NC4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4,1 -CC[N+](CC)=C4C=CC3=NC2=C1C=CC=CC1=C(C=C2OC3=C4)N,1 -C[N]2C1=CC=CC=C1N=C2[N+]([O-])=O,1 -ClCCN(N=O)C(=O)NC1CCCCC1,1 -CC1=C3C(=C(C(=C1)[N+]([O-])=O)C)C2=CC(=CC=C2[NH]3)O,1 -NC1=CC=C(C=C1)C2=CC(=C(C=C2)N)[N+]([O-])=O,1 -OC1=C(C(=CC=C1)O)O,1 -C=CC(=O)N(CC1CO1)CC2CO2,1 -NC3=C1C=CC=CC1=C2C=CC4=C(C2=C3)C=CC(O)C4O,1 -CC1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 -OC1C(O)C4=C3C2=C1C=CC=C2C=CC3=C(C=C4)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC(=CC=C1)C(Cl)=O,1 -CC=CC=CC=O,1 -OC2=CC1=CC=CC=C1C(=C2)O,1 -CCCOC=CC=CC=CC=CC=CCC,1 -[O-][N+](=O)C1=CC(=CC(=C1)C(Cl)=O)[N+]([O-])=O,1 -OCC4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 -CC(C)=CC(C)=NNC2=C1C=CC=CC1=CN=N2,1 -C1CSCSC1,1 -CC2=C1C=CC=CC1=C(C3=CC=CC=C23)C,1 -NC1=C(C=C(C=C1)OC2=CC(=C(C=C2)N)Cl)Cl,1 -NC3=CC2=NC1=CC=CC=C1C=C2C=C3,1 -CC(=O)C1=C(C(=C(C=C1)Cl)Cl)Cl,1 -[O-][N+](=O)C2=C3C1=CC=CC=C1C4=CC=CC5=CC=C(C=C2)C3=C45,1 -COC4=C1C5=C(C(OC1=C3C2C=COC2OC3=C4)=O)C(OCC5)=O,1 -O4C5=C1C=CC=CC1=C3C=C2C=CC=CC2=CC3=C45,1 -NC(CN=[N+]=[N-])C(O)=O,1 -[O-][N+](=O)C1=CC=C(C=C1)C(Cl)=O,1 -O=C4OC1=C(C=C2CCCN3CCCC1=C23)C=C4,1 -CC(=C)C=O,1 -[O-][N+](=O)C1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)C=CCC5,1 -OC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)O,1 -[O-][N+](=O)C1=C(C(=C(O1)C(=O)CBr)Cl)Cl,1 -CC1=C(C=C(C(=C1)N)C)N,1 -[O-][N+](=O)C1=C(C=CC=C1)CCl,1 -OC1=C(C=C(C=C1Cl)Cl)S(=O)C2=C(C(=CC(=C2)Cl)Cl)O,1 -OC(=O)CNC(=O)C1=CC=C(C=C1)[N+]([O-])=O,1 -O1C4C1C3=C(C2=CC=CC=C2C=C3)C5=C4C=CC=C5,1 -BrCCOC(=O)C(=O)OCCBr,1 -C2CC1OC1CC2C3CO3,1 -OC6=CC=C5C1=C2C(=CC3=CC=CC4=CC=C(C=C1)C2=C34)C5=C6,1 -NC1=C(C=C3C(=C1)C2=CC=CC=C2[NH]3)[N+]([O-])=O,1 -[O-][N+](=O)C3=CC(=C2C1=C(C=C(C=C1C(C2=C3)=O)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 -[O-][N+](=O)C1=C(C(=C(O1)C(=O)CBr)C2=CC=CC=C2)C3=CC=CC=C3,1 -[O-][N+](=O)C2=C3C=CC4=C1CCCCC1=CC5=CC=C(C=C2)C3=C45,1 -CC1=C3C(=CC=C1)C2=CC=CC=C2C=C3,1 -CC1=C2C(=C(C=C1)C)C3=C(C=C2)C(O)C(O)C4OC34,1 -COC1=CC3=C(C(=C1)O)C(=O)C2=C(C(=CC=C2O)O)O3,1 -CC[N]1C(=NC2=C1C=CC3=NC(=CN=C23)C)N,1 -CC(C)COC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -CC5=C3CCC4=C2C1OC1C6=C(C2=CC(=C34)C=C5)C=CC=C6,1 -OCN1C(O)C(O)N(CO)C1=O,1 -CCC(C)NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -CC1(CO1)C(=O)NCC2=CC=CC=C2,1 -NC1=CC=C(C=C1)CC(O)=O,1 -[O-][N+](=O)C2=CC(=C1C=CC=CC1=C2)[N+]([O-])=O,1 -CC2=CC3=CC=C4C1=CC=CC=C1C=C5C=CC(=C2)C3=C45,1 -NC(CCC(=O)NC(CSC(=O)NCCCl)C(=O)NCC(O)=O)C(O)=O,1 -NC1=CC=C(C=C1)CCC2=CC=C(C=C2)N,1 -CC(C)(O)CCC2=C1OC5=C(C(C1=C(C=C2)O)=O)C(=C4C3C=COC3OC4=C5)O,1 -CCOP(=O)(OCC)OC1=NC(=NC(=C1)C)C(C)C,1 -CCCCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -ClCCN(CCCl)C2=CC1=CC=CC=C1C=C2,1 -CC(=O)OCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 -C[N]1C(=NC2=CC=C(C=C12)C#N)N,1 -COC(=O)C12OC1(C)C(O)(NC2=O)C(C)C,1 -NC2=CC1=NC=CC=C1C=C2,1 -CC1=CC=C(C=C1)OCC2CO2,1 -CC1CNC(=O)N1C2=NC=C(S2)[N+]([O-])=O,1 -ClC(Cl)(Cl)CC1CO1,1 -NC1=CC=C(C=C1)[N+]([O-])=O,1 -ClCCNC(=O)SC2=C1[NH]C=NC1=NC=N2,1 -CC(=O)C1=C(C(=C(O1)[N+]([O-])=O)Cl)Cl,1 -CC(=O)N(O)C1=CC=C(C=C1)SC2=CC=CC=C2,1 -OC1CC=CC2=C3C=CC4=CC=CC5=CC=C(C=C12)C3=C45,1 -COC(=O)C(Cl)Cl,1 -COC5=C2[C]1=CC=C(C1=C(OC2=C4C3(C=COC3OC4=C5)O)O)O,1 -[O-][N+](=O)C1=CC2=C(C=C1)C(=CC3=C(C=CC=C23)[N+]([O-])=O)[N+]([O-])=O,1 -OC2=C1C=CC(C(C1=C(C3=CC=CC=C23)O)=N)=N,1 -NC1=C(C=C(C=C1)Cl)N,1 -CC(=O)NC1=C2C=CC3=CC=C(C4=CC=C(C=C1)C2=C34)O,1 -CC1=C(C=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC2=C(O1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2S3,1 -CC(=O)C1=CC=C(C=C1)NO,1 -CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)COC(C)=O,1 -CN(COC(C)=O)N=O,1 -CC(Br)C(=O)NCC1=CC=CC=C1,1 -OC5C=CC4=C(C3=CC2=C1C=CC=CC1=CC=C2N=C3C=C4)C5O,1 -CC(=O)NC1=CC=C(C=C1)C=N[N]3N=N[C]2=CC=NC2=C3O,1 -[O-][N+](=O)C1=CC=C(C=C1)SC2=CC=CC=C2,1 -ClC(Cl)(Cl)SN2C(=O)C1CC=CCC1C2=O,1 -O=CNC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 -BrCCBr,1 -CCOC(=O)CNC(=O)C=[N+]=[N-],1 -O1C2C1C7=C5C3=C2C=CC=C3C=C6C4=CC=CC=C4C(=C56)C=C7,1 -CC(=O)NC2=CC1=NC=CC=C1C=C2,1 -NC3=CC2=NC1=CC(=CC=C1N=C2C=C3)N,1 -C[N]2C(=NC3=NC1=CN=CC=C1C=C23)N,1 -C1=CC=C2C(=C1)C=CC3=C2C4=CC=CC5=CC=CC3=C45,1 -ClC3=C1C=CC=CC1=C2C=CC=CC2=C3,1 -CC1CCC(CC1)NC(=O)N(CCCl)N=O,1 -COC(=O)C12OC1(C)C(C)(O)NC2=O,1 -CC1=C3C(=C(C(=C1)[N+]([O-])=O)C)C2=CC(=CC=C2[NH]3)[N+]([O-])=O,1 -[O-][N+](=O)C2=C3C=CC4=CC=CC5=C1C=CC=CC1=C(C=C2)C3=C45,1 -OCCCl,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 -NC1=C(C(=CC=C1)[N+]([O-])=O)N,1 -CCN(CCCl)CCCNC3=C2C=CC1=CC=CC=C1C2=NC4=CC=CC=C34,1 -CC2=C1C=CC=CC1=C(C=C2)[N+]([O-])=O,1 -O1C2C1C5=C4C2=CC3=CC=CC=C3C4=CC6=CC=CC=C56,1 -CN(C)CCCNC1=C3C(=NC2=CC=CC=C12)C(=CC=C3)[N+]([O-])=O,1 -CC1=C(C=C(C(=C1)C)N)C,1 -OC4C=CC3=C2C=C(C1=CC=CC=C1C2=CC=C3C4O)[N+]([O-])=O,1 -CC1=C(C(=CC=C1)C)NO,1 -[O-][N+](=O)C3=C1C=CC=C2CCC(=C12)C=C3,1 -COC(=O)C1=C(C=CC(=C1)C2=CC(=C(C=C2)N)C(=O)OC)N,1 -CC(=O)N(OC1OC(CO)C(O)C(O)C1O)C2=CC=C(C=C2)OC3=CC=C(C=C3)Cl,1 -CCCC(=O)OCC1=CC=C(C=C1)[N+]([O-])=O,1 -CC(C)NC(OCC1=CC=C(C=C1)[N+]([O-])=O)=NC(C)C,1 -C1=CC4=C(C=C1)C3=CC=C2N=CC=CC2=C3C=C4,1 -C[N+](C)(C)CCNCCC1=CC=C(C=C1)N=NC2=C(C=C(C=C2)[N+]([O-])=O)Cl,1 -[O-][N+](=O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -O=C(OCC1CO1)C2CCCCC2C(=O)OCC3CO3,1 -[O-][N+](=O)C3=CC2=C1C=C(C=CC1=C(C=C2C=C3)[N+]([O-])=O)[N+]([O-])=O,1 -CCN(CC)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)[N+]([O-])=O,1 -[O-][N+](=O)C2=CC=C3C1=C(C=CC=C1)C4=C(C=CC5=CC=C2C3=C45)[N+]([O-])=O,1 -NC(CSC(Cl)=CCl)C(O)=O,1 -CCOP(=O)(OCC)C(C)NC(=O)N(CCCl)N=O,1 -OCC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC=C2O)C3=O,1 -CC1=C(Cl)C(=O)OC1O,1 -C1=CC3=C(C=C1)C2=CC5=C4C(=C2C=C3)C=CC=C4C=C5,1 -NC2=C1N=C[N](C1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4=CC=C(C=C4)[N+]([O-])=O,1 -O=C3C(C2=NC1=CC=CC=C1C=C2)C(=O)C4=C3C=CC=C4,1 -O=C2C=CC1=C(C=CC=C1)C2=O,1 -CC(C)(C)ON=O,1 -COC1=C(C=CC(=C1)[N+]([O-])=O)NC(C)=O,1 -OC1=C3C(=CC=C4C=CC2=CC=CC(=C1)C2=C34)[N+]([O-])=O,1 -CC1CC(OC(C)O1)OC(C)=O,1 -CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)NC4=CC=CC=C4,1 -CC(=O)C1=C(C=C([N]1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 -ClC1=C(Cl)C(=O)C(=C(Cl)C1=O)Cl,1 -NC1=C(C=CC(=C1)[N+]([O-])=O)C2=CC=C(C=C2)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC=C2C=CC3=[N+](C5=C(C4=CC=C1C2=C34)C=CC=C5)[O-],1 -OC1=CC3=C(C=C1)C2=CC=C(C=C2C3)[N+]([O-])=O,1 -C[N]1C=NC(=C1[N+]([O-])=O)C2=CC=CC=C2,1 -CN(CC(C)=O)N=O,1 -ClN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 -SC2=C1[NH]C=NC1=NC=N2,1 -CC1CN1,1 -ONC3=CN=C2[N]1C=CC=CC1=NC2=C3,1 -COC1=C(C=C(C=C1)CC2CO2)OC,1 -C1=CC2=CC=C3C6=C5C(=C4C=CC(=C1)C2=C34)C=CC=C5C=C6,1 -CCCCOC3=NC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCNCCCl,1 -C[N]2C(=NC3=C1C=CC=NC1=CC(=C23)C)N,1 -OC(=O)CN(CC(O)=O)N=O,1 -CCOC1=CC=C(C=C1)N=O,1 -OS(=O)(=O)OCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 -COC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 -C[N+]2=C1C=CC=C(C1=CC3=CC=CC=C23)N,1 -C[N]1C(=NC2=C1C=CC3=NC=CC=C23)NC(C)=O,1 -OC2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3O)=O,1 -COC1=CC4=C(C(=C1)OC2OC(CO)C(O)C(O)C2O)C(=O)C3=C(C(=CC=C3O)O)O4,1 -CCC[N]3C=C2CC1C(CC(C)CN1C#N)C4=C2C3=CC=C4,1 -[O-][N+](=O)C4=C2C1=CC=CC=C1C3=CC=CC(=C23)C=C4,1 -C[N]2C(=NC3=CC=C1N=CC=CC1=C23)N,1 -O=C1CCO1,1 -NC4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 -[O-][N+](=O)C1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,1 -O=NC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)F)F,1 -C(OCC2=C1C=CC=CC1=CC=C2)C3CO3,1 -[O-][N+](=O)C1=CC(=C(C=C1)F)[N+]([O-])=O,1 -CC2=CC(=O)C1=C(C=CC=C1O)C2=O,1 -NC(=O)NC2=NC1=CC=CC=C1[NH]2,1 -COC1=NSC2=C1C=CC=C2[N+]([O-])=O,1 -CC(C)(C)OO,1 -O=C4C=CC3=C(C2=CC=C1C=CC=CC1=C2C=C3)C4=O,1 -CCCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -OC(=O)C1=CC(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 -CN(C)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 -[O-][N+](=O)C2=CC=C1[NH]C=CC1=C2,1 -CC1=CC(=C(C=C1)C)N,1 -CNC(=O)ONC(C)=O,1 -COC1=CC=C(C=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 -CC1=CC=C(C=C1)S(=O)(=O)N2C4C2C3=C(C=CC=C3)C5=C4C=CC=C5,1 -CC1=CC(=CC=C1)NO,1 -OC(=O)C1=C(C=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 -CCN(CCCl)CCCNC2=C1C=C(C=CC1=NC3=CC(=CC=C23)Cl)OC,1 -[O-][N+](=O)C1=C3C(=CC=C1)C2=CC=CC=C2O3,1 -C[N]1C=NC(=C1C(=O)N(C)N=O)N(C)C(=O)OC(C)(C)C,1 -NC1=CC(=CC=C1)O,1 -[O-][N+](=O)C1=CC=C(C=C1)OC2CO2,1 -NC1=C(C=C(C=C1)Cl)[N+]([O-])=O,1 -CC1=CC=C(C=C1)NN=NCC2=CC=C(C=C2)[N+]([O-])=O,1 -CNN=NC,1 -CC(=O)C1=C(C=CC(=C1)NC(N)=O)OCC(O)CNC(C)(C)C,1 -CCN1C=C(C(O)=O)C(=O)C2=C1C=C(C(=C2)F)N3CCN(C)CC3,1 -CCC1=C(C(=CC=C1)CC)N,1 -NC1=CC3=C(C=C1)C2=CC=CC=C2[NH]3,1 -CS(=O)(=O)NC1=CC=C(C=C1)NC3=C2C=C(C=CC2=NC4=CC=CC=C34)N=[N+]=[N-],1 -NC2=C1C(C3=C(C(C1=C(C=C2)O)=O)C=CC=C3)=O,1 -CCC1CO1,1 -CC1=C(C=C(C=C1)N=[N+]([O-])C2=CC(=C(C=C2)C)N)N,1 -OC1=CC2=C(C=C1)C3=CC5=CC=CC6=CC=C4C=CC2=C3C4=C56,1 -NC3=C(C=C2N=C1C=C(C=CC1=NC2=C3)Cl)N,1 -ClCCSCCCl,1 -NC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=C(C=C3)[N+]([O-])=O,1 -C[N]2C(=NC3=C1N=C(C)C=NC1=C(C)C(=C23)C)N,1 -CC(=O)OC1CC4=C2C1=C(C=CC2=CC5=C3C=CC=CC3=CC=C45)C,1 -CN1CCN(CC1)C2=C(C3=C(C=C2F)C(=O)C(=CN3CCF)C(O)=O)F,1 -[O-][N+](=O)C1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)CCCC5,1 -COC(=O)C12OC1(C)C(C)(O)OC2=O,1 -CC[N]1C(=NC2=C1C=CC3=NC=C(C)N=C23)N,1 -NC3=C2N=C1C=CC=CC1=NC2=CC=C3,1 -CC2=CC1=NC=CC=C1C=C2,1 -CC(C)(C)CNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -O=C1CCCCC1=O,1 -[O-][N+](=O)C1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 -[O-][N+](=O)C1=CC=C(O1)C=NN2C(=O)C=C(C=C2C3=CC=CC=C3)C4=CC=CC=C4,1 -CCCCCCCC(Cl)=O,1 -CN(CC1=CC(=CC=C1)C)N=O,1 -[O-][N+](=O)C1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,1 -CC1=C(C=C(C=C1N)N)[N+]([O-])=O,1 -CC1(CO1)C(=O)NC2=CC=CC=C2,1 -OCCN(CC(O)=O)N=O,1 -[O-][N+](=O)C2=C1C=CC=CC1=CC=C2,1 -N=C1CC(=O)C(=O)C2=C1C=CC=C2,1 -O=C3CN(CCN2CC(=O)N(CN1CCOCC1)C(=O)C2)CC(=O)N3CN4CCOCC4,1 -CC2=C4C=CC=C5C=CC3=C1C=CC=CC1=CC(=C2)C3=C45,1 -COP(=S)(OC)OC1=CC(=C(C=C1)N=O)C,1 -ClC(Cl)C(Cl)=O,1 -CC3=CC2=C(C(=C1C(=CC(=CC1=C2O)O)O)O)C(=O)C3=O,1 -NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)N,1 -COC2=C1C(C5=C(OC1=CC=C2Cl)C=C4OC3OC=CC3C4=C5OC)=O,1 -C[N]1C=CC3=C1C=CC4=CC=C2C=CC(=CC2=C34)O,1 -O=C(NC1CCCCC1)OC(C#C)(C2=CC=CC=C2)C3=CC=CC=C3,1 -NC3=C2C(=C1C(C=CC(C1=C(C2=C(C=C3)O)O)=N)=O)O,1 -CC(C)NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -NC1=C(C=CC=C1)SCSC2=C(C=CC=C2)N,1 -ON=C(O)C1=CC(=C(C=C1)O)O,1 -NC1=CC(=C(C=C1)NCCO)[N+]([O-])=O,1 -O=C3N(CC1CO1)C(=O)N(CC2CO2)C(=O)N3CC4CO4,1 -BrCC(Br)=C,1 -OCCNC1=C(C=C(C=C1)N(CCO)CCO)[N+]([O-])=O,1 -NC(=O)CNC(=O)N(CCCl)N=O,1 -C1=CC2=C(C=C1)C5=C4C(=C2)C=C3C=CC=CC3=C4C=C5,1 -NC(CCC(=O)NC(CSCCCl)C(=O)NCC(O)=O)C(O)=O,1 -[O-][N+](=O)C3=CC=C2SC1=CC=CC=C1C2=C3,1 -COC1=C(C=C(C(=C1)OC)C=CC)OC,1 -OC5CC1=C(C2=CC=C3C=CC=C4C=CC(=C1)C2=C34)C=C5,1 -[O-][N+](=O)C3=CC2=C(C=C1C(=CC=CC1=C2C=C3)[N+]([O-])=O)[N+]([O-])=O,1 -CC1=CC(=C(C=C1)O)N,1 -CC4=NC3=C2C1=CC(=CC=C1C=CC2=C(C=C3[NH]4)C)O,1 -CCC1=CC(=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 -NC1=CC(=CC=C1)C2=CC=CC=C2,1 -[O-][N+](=O)C3=CC2=C1C(=CC=CC1=CC=C2)O3,1 -O=C2N(CC1CO1)SC3=C2C=CC(=C3)OCC4CO4,1 -COC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)O)O)C3=O,1 -NC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -CC1=C(C=CC=C1)C2=CC=C(C=C2)N,1 -CC(CN(CC(C)OC(C)=O)N=O)OC(C)=O,1 -CN1CCC4=C2C1C(C5=C(C2=C3OCOC3=C4)C=CC=C5)O,1 -COC4=C1C(C5=C(OC1=C3C2C=COC2OC3=C4)C=CC=C5O)=O,1 -ClC(Cl)(Cl)SN2C(=O)C1=C(C=CC=C1)C2=O,1 -CC(C)CCCC(C)C3CCC4C2C=CC1(CC(O)CCC1(C)C2CCC34C)OO,1 -CN(CC1=CC=C(C=C1)[N+]([O-])=O)N=O,1 -NC2=C1C(=CC=CC1=CC=C2)N,1 -C1=CC3=C(C=C1)C2=CC=CC4=C2C(=C3)C=C4,1 -CCCCC(CC)COC(=O)C1=CC(=C(C=C1)N(C)C)[N+]([O-])=O,1 -CC1COC3=C2N1C=CC(C2=C(C(=C3N4CCN(C)CC4)F)C(O)=O)=O,1 -NC2=C1C(C3=C(C(C1=C(C=C2C(O)=O)[N+]([O-])=O)=O)C=CC=C3)=O,1 -[O-][N+](=O)C1=CC=C(S1)C3NC(=O)C2=C(C=CC=C2)N3,1 -CC1=C(C=CC=C1)N=NC2=C(C(=C(C=C2)N)C)N,1 -C1=CC3=C(C=C1)C2=CC=CC=C2C4=CC=CC=C34,1 -CCN(CCCl)CCCNC2=C1C=CC=C(C1=NC3=CC=CC=C23)OC,1 -C1=CC2=C(C=C1)C4=CC=CC5=CC=C3C=CC=C2C3=C45,1 -NC1=C(C3=C(C=C1)C2=CC=CC=C2[NH]3)[N+]([O-])=O,1 -CC1=C(C=C(C=C1)C(OC(=O)NC2CCCCC2)(C#C)C3=CC=CC=C3)C,1 -ClCCCBr,1 -NC2=C1N=C[N](C1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4OC(CO)C(O)C4O,1 -NC3=C1C=CC=CC1=C2C=CC=CC2=C3,1 -CN(C)CCCNC2=C1C(=CC=CC1=NC3=CC=CC=C23)[N+]([O-])=O,1 -CCOC1=C(C=C(C=C1)NC(C)=O)N,1 -C1=CC=C(C=C1)N=NC2=CC=CC=C2,1 -ClC4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 -CCC12OC1(C(=O)NC2(C)O)C(=O)OC,1 -OC5C(O)C4=C(C3=CC2=C1C=CC=CC1=CC=C2N=C3C=C4)C6OC56,1 -O=S1(=O)C5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2CC3,1 -CCN(CCCl)C1=CC=C(C=C1)CCCNC3=C2C=CC=CC2=NC4=CC=CC=C34,1 -CN1CC(=CC2C1CC3=C[N](CC=C)C4=CC=CC2=C34)CO,1 -CCCCC=CC=CC=CC=CC=COCC(O)CO,1 -CC(C)(C)OOC(=O)C1=CC=CC=C1,1 -ClC2=C1C(C3=C(C(C1=CC=C2)=O)C(=CC=C3)NC(=O)C4=CC=CC=C4)=O,1 -[O-][N+](=O)C3=CC2=C1C=CC=CC1=CC=C2C=C3,1 -CN(C)C(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -CN(C)C1=CC=C(C=C1)N=NC3=CC2=CC=CC=C2C=C3,1 -O1C5C1C4=C3C2=CC=CC=C2C=CC3=CC6=C4C5=CC=C6,1 -N(NC1=CC=CC=C1)C2=CC=CC=C2,1 -CCOC(=O)CNC(=O)C(C)Br,1 -OC5=CC4=CC3=C1C=CC=CC1=C2C=CC=CC2=C3C=C4C=C5,1 -C1OC1CC2=CC=C(C=C2)CC3=CC=CC=C3,1 -[O-][N+](=O)C4=CC=C3C1=CC=CC2=C(C=CC(=C12)C3=C4)[N+]([O-])=O,1 -NC1=C(C=CC=C1)N,1 -CC1=CC(=C(C=C1)C)NO,1 -[O-][N+](=O)C1=CC=C(C=C1)C=CC(=O)C2=CC=C(C=C2)[N+]([O-])=O,1 -CCC=C1OC(=O)C2=C1C=CC=C2,1 -OC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=CC=C3,1 -C[N]1C(=NC2=CC(=CC=C12)Cl)N,1 -NC3=CC2=C1C=CC=CC1=CC=C2C=C3,1 -CC1=C(C=CC=C1)N=NC2=CC(=C(C=C2)N=NC4=C3C=CC=CC3=CC=C4O)C,1 -C[N+]2=C1C=C(C=CC1=CC3=CC=CC=C23)N,1 -ClC(=O)CCC1=CC=CC=C1,1 -C1CCC2=C(C1)C6=C4C2=C3C=CC=CC3=CC4=C5C=CC=CC5=C6,1 -COC1=C(C=CC=C1)N=NC3=C2C=CC=CC2=CC=C3O,1 -CC1=CC(=C(C=C1)C)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC2=C(C=C1)C(=CC3=C2C(=CC=C3)[N+]([O-])=O)[N+]([O-])=O,1 -CC2C(O)CCC3=CC(=O)C1(OC1C23C)C4OC4CO,1 -CN(C)[N+]([O-])=O,1 -OCCC1=CC=C(C=C1)[N+]([O-])=O,1 -CC(=O)OCC1=C(C=CC(=C1)C(C)=O)OC(C)=O,1 -O1C=CC2=C1C=C3C=CC4=CC=CC5=CC=C2C3=C45,1 -OCCN(CCO)N=O,1 -CC(C)=[N+]([O-])[O-],1 -CC(=O)N(NC1=CC3=C(C=C1)C2=CC=CC=C2C3)C4=CC6=C(C=C4)C5=CC=CC=C5C6,1 -ClC=C(Cl)C(Cl)Cl,1 -OC2=C1C(C5=C(OC1=CC=C2)C3=C(OC4OC=CC34)C=C5O)=O,1 -[O-][N+](=O)C4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,1 -[O-][N+](=O)C1=CC(=CC=C1)[N+]([O-])=O,1 -NC2=C1N=C([N](C1=NC=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4=CC=C(C=C4)[N+]([O-])=O,1 -OS(=O)(=O)OC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 -CC1CS(=O)(=O)CCN1N=CC2=CC=C(O2)[N+]([O-])=O,1 -COC2=CC1=C(C3=C(C(=C1C(=C2)O)O)C(=O)C=C(C)C3=O)O,1 -C1CC2(CCO1)CO2,1 -OC1CC2=C4C1=CC=C5C=CC3=CC=CC(=C2)C3=C45,1 -BrCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 -CC4=C1C=CC=CC1=C3N=C2C=CC=CC2=C(C3=C4C)Cl,1 -O=NN1CCCC1,1 -CC(=O)NC1=CC=C(C=C1)C2=CC=C(C=C2)NC(C)=O,1 -C[N]2C1=CC=CC=C1C3=C(C)C=CC(=C23)C,1 -CNC2=C(C1=NC=CN=C1C=C2)C,1 -[O-][N+](=O)C2=C3C=CC4=[N+](C1=CC=CC=C1C5=CC=C(C=C2)C3=C45)[O-],1 -NC1=C(C=C(C(=C1)Cl)[N+]([O-])=O)O,1 -CN(C)CCCl,1 -NNC1=CC=CC=C1,1 -COC1=CC(=C(C=C1)C(=O)C2=C(C=CC=C2)O)O,1 -CCN(CC)C1=CC(=CC=C1)O,1 -NC3=C2C(=C1C=CC=CC1=NC2=CC=C3)N,1 -CC1CO1,1 -CC1=CC=C[N]2C1=NC3=C(C)C(=CN=C23)[N+]([O-])=O,1 -CC1=CC2=C(C=C1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 -OC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 -CC3=CC2=C1C=CC=CC1=CC=C2C(=C3)C,1 -CC4CC1C(CC2=C[N](CC=C)C3=CC=CC1=C23)N(C4)C#N,1 -[O-][N+](=O)C1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,1 -CC1(CO1)C2=CC=C(C=C2)[N+]([O-])=O,1 -CNC3=NC1=C(C=CC2=NC=CC=C12)[N]3C,1 -NC1=CC(=C(C=C1)Cl)N,1 -CN(C)CCNC(=O)C2=C1N=C(C=CC1=CC=C2)C3=CC=CC=C3,1 -ONC2=C1C=CC=CC1=CC=C2,1 -OC1=NC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 -CC1=C2C(=CC=C1)C3=C(C(=C2)C)C4=C(C=C3)C(O)C(O)C5OC45,1 -CCCCC1=CC=C(C=C1)N=CC2=CC=C(C=C2)OC,1 -C[N+]1=CC=C(CC1)C2=CC=CC=C2,1 -OC1=NC(=C(C=N1)N(CCCl)CCCl)O,1 -[O-][N+](=O)C1=C(C=CC=C1)SSC(Cl)=C(Cl)C(Cl)=C(Cl)Cl,1 -OC(=O)C1=CC(=CC=C1)[N+]([O-])=O,1 -COC1=C(C=CC(=C1)C2=NC(=C([NH]2)C3=CC=CC=C3)C4=CC=CC=C4)O,1 -[O-][N+](=O)C1=CC2=C(C=C1)NC(=O)C2=O,1 -COC1=NSC2=CC=CC(=C12)[N+]([O-])=O,1 -CN(CC(=O)COC(C)=O)N=O,1 -CS(=O)(=O)OCCCCOS(C)(=O)=O,1 -CCC=CC=CC=CC=CC=COCC(C)O,1 -CN(C)CCNC(=O)N2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3,1 -[O-][N+](=O)C1=CC(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 -OCCBr,1 -COC1=CC(=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 -NNC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 -ClC(Cl)=CC=O,1 -CC3=CC2=CC1=CC=CC(=C1C(=C2C(=C3)O)O)O,1 -C[N]2C1=CC=CC=C1C3=CC=CC=C23,1 -CCC(COC(=O)C(C)=C)(COC(=O)C(C)=C)COC(=O)C(C)=C,1 -CC(=O)CN(CC(C)=O)N=O,1 -C1=CC3=C(C=C1)C2=CC=CC=C2N=C3,1 -COC1OC1(C)C,1 -CC(Cl)CCl,1 -[O-][N+](=O)C(Cl)(Cl)Cl,1 -CC4=C2C1=CC=CC=C1[NH]C2=C3C(C=CC(C3=N4)=O)=O,1 -OCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 -CC(C)=CC3C(C(=O)OCN2C(=O)C1=C(CCCC1)C2=O)C3(C)C,1 -CC(C)Br,1 -CCC1=CC=C(C=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 -CCCCC[N]3C=C2CC1C(C=C(C)CN1C)C4=C2C3=CC=C4,1 -C(CC1=CC=CC=C1)C2CO2,1 -C[N]2C(=NC3=C1N=CC(=NC1=C(C)C(=C23)C)C)N,1 -NC1=CC=C(C=C1)C2=C(C=C(C=C2)N)[N+]([O-])=O,1 -CCC12OC1(C(=O)OC)C(=O)OC2C,1 -NC1=CC(=C(C=C1)N)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC=C(O1)C=CC=O,1 -NC3=CC2=NC1=CC=CC=C1N=C2C=C3,1 -CC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,1 -COC(=O)C(=CC)C=C(C)C=C(C)C=CC=C(C)C(=O)C12OC1C(O)(CCO)NC2=O,1 -OC2=C(C(=C1C(C3=C(C(C1=C2)=O)C=CC=C3)=O)O)O,1 -CCCCCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -CCC(C)=NO,1 -O1C2C1C6=C4C3=C2C=CC=C3C=CC4=C5C=CC=CC5=C6,1 -[O-][N+](=O)C2=CC1=CC(=C(C=C1C=C2)[N+]([O-])=O)[N+]([O-])=O,1 -COC3=CC2=CC1=CC(=CC(=C1C(=C2C(=C3)O)O)O)C,1 -[O-][N+](=O)C1=CC2=C(C=C1)C=CC2,1 -CC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,1 -ClC(Cl)(Cl)Br,1 -[O-][N+](=O)C1=C2C=CC3=CC=C(C4=CC=C(C=C1)C2=C34)N=O,1 -O=C(NCC1=CC=CC=C1)C2CO2,1 -CN(C)C1=CC=C(C=C1)C(=O)C2=CC=C(C=C2)N(C)C,1 -CC(C)C(NC(C)=O)C(=O)N(CC(O)=O)N=O,1 -C1=CC2=CN=C3C=CC=C4C=CC(=C1)C2=C34,1 -C(CC1CO1)C2CO2,1 -ClCC=O,1 -CN(C)C1=CC(=C(C=C1)N=NC2=CC=CC=C2)C,1 -CC1=CC=C(C=C1)S(=O)(=O)NN,1 -CN3CCC4=C2C1=CC(=CC=C1C=CC2=CC=C34)O,1 -C[N]2C(=NC3=C1N=CC(=NC1=CC(=C23)C)C)N,1 -COC3=C(C=C2C(=C1C=COC1=NC2=C3)OC)OC,1 -N1C2C1C6=C5C3=C2C=CC=C3C4NC4C5=CC=C6,1 -CNC(=O)ON,1 -NC(=O)N=NC(N)=O,1 -C5=CC=C4C=C3C2=C1C(=CC=CC1=CC=C2)C3=CC4=C5,1 -COC3=NC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCNCCCl,1 -COC(=O)C1=C(C(=C(O1)[N+]([O-])=O)Cl)Cl,1 -CC2C1=C(C=CC=C1)C3=C2C=C(C=C3)C,1 -CC4=C3N=C2C1=CC=CC=C1C=CC2=C(C3=CC=C4)C,1 -NC1=C(C=CC(=C1)Cl)O,1 -CCC1=NC4=C([NH]1)C3=C2C=C(C=CC2=CC=C3C=C4)O,1 -CC2C1=C(C=CC=C1)C3=C2C=CC=C3,1 -CCC1=C(C=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 -CC1=C(C=C(C(=C1)C)[N+]([O-])=O)[N+]([O-])=O,1 -CC1=C(C=C(C=C1)N)[N+]([O-])=O,1 -CCCCCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -CC(C)N(N)C(C)C,1 -COC3=C1C=CC=C2OC(=CC(=C12)C=C3)[N+]([O-])=O,1 -NC(CCC(=O)NC(CSC(Cl)=C(Cl)Cl)C(=O)NCC(O)=O)C(O)=O,1 -C4=CC3=CC2=CC1=CC=CC=C1C=C2C=C3C=C4,1 -CNC(=O)C=C(C)OP(=O)(OC)OC,1 -COC1=CC(=CC=C1)C=CC2=CC=C(C=C2)N,1 -NC1=CC(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 -CC(Br)C(=O)NC1=CC=CC=C1,1 -OC(=O)C(Br)Br,1 -COC3=C2N=C1C=CC=CC1=C(C2=C(C=C3)[N+]([O-])=O)NCCCN(C)C,1 -CCN(N=O)C(=O)N(C)C,1 -CC(C)(N=O)[N+]([O-])=O,1 -CC1OCC(=O)C(=O)C1O,1 -O=P2(OCC1=C(C=CC=C1)O2)OC3=CC=CC=C3,1 -CCC1=C(C(=O)OC)C(=O)OC1C,1 -COC(=O)C1=CCCN(C)C1,1 -CN(CCO[N+]([O-])=O)[N+]([O-])=O,1 -ClCC2=C4C=CC=C5C=CC3=CC1=CC=CC=C1C(=C2)C3=C45,1 -NC1=CC(=C(C=C1)C2=C(C=C(C=C2)N)Cl)Cl,1 -O=NN1CCSC1,1 -C[N]1C(=NC2=C1C=CC3=CC=CN=C23)N,1 -OC(=O)C(Cl)Br,1 -CC1=C(C=CC=C1)N=NC2=C(C=C(C(=C2)C)N)N,1 -NC3=CC=C2CC1=CC=CC=C1C2=C3,1 -CC4=CC3=NC2=C1C=CC=CC1=CC=C2C=C3C=C4,1 -COC(=O)C1=CCCN(C1)N=O,1 -OC1=CC(=CC=C1)[N+]([O-])=O,1 -CCS(=O)CCSP(=O)(OC)OC,1 -O1C2C1C6=C3C2=CC=CC3=C5C=C4C=CC=CC4=CC5=C6,1 -FC1=C(C=CC=C1)C(Cl)=O,1 -CC1=C3C(=C(C(=C1)N)C)C2=CC(=CC=C2[NH]3)O,1 -CCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 -OC2=C1C(C=CC(C1=C(C(=C2Cl)Cl)O)=O)=O,1 -CNC1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C(C)=O,1 -CC2=C1C=CC=CC1=NC=C2,1 -NC1=C(C=C(C=C1)[N+]([O-])=O)Cl,1 -[O-][N+](=O)C1=CC2=C(C=C1)C(=O)NC2=O,1 -ClC(Cl)(Cl)C=O,1 -COC(=COC(N)=O)C1=C(C(=C(C(=C1O)N2CC2)C)O)N3CC3,1 -CC1=C(C=C(C(=C1)N)[N+]([O-])=O)N,1 -[O-][N+](=O)C2=CC=C1C=N[NH]C1=C2,1 -COC2=CC1=CC=CN=C1C(=C2)NC(C)CCCN,1 -CCOC1=CC=C(C=C1)N,1 -OC1=CC=C2C(=C1)C=CC3=C2C4=C([NH]3)C=CC5=C4C=CC=C5,1 -[N-]=[N+]=C1C=NC(=O)NC1=O,1 -C(CCOCC1CO1)COCC2CO2,1 -CNC2=C(C1=NC(=CN=C1C=C2)C)C,1 -CC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC=C2O)C3=O,1 -COC1=C(C=CC(=C1)N)C,1 -CC1=C(C(=C(C(=C1)C)N)C)N,1 -ONC2=C1C=CC=CC1=[N+](C=C2)[O-],1 -COP(=O)(OC)C(O)C(Cl)(Cl)Cl,1 -NCCNCCO,1 -C1=CC5=C(C=C1)C4=CC3=C2C=NC=CC2=CC=C3C=C4C=C5,1 -CC(=O)N(Cl)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 -[O-][N+](=O)C1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 -CNC2=C(C1=NC=C(N=C1C=C2)C)C,1 -CC(=O)NC1=CC3=C(C=C1)C2=C(C=CC=C2C3)O,1 -[O-][N+](=O)C2=C3C=CC4=C1C=CC=CC1=NC5=CC=C(C=C2)C3=C45,1 -ON=C1CCCCC1,1 -[O-][N+](=O)C1=CC=C(O1)C=NN2CCCNC2=O,1 -CCC=CC=CC=CC=CC=CC=COCC(O)CO,1 -ClCC(Br)=C,1 -CC1=NC(=C(C=N1)CNC(=O)N(CCCl)N=O)N,1 -FC1=NC=CC=C1,1 -ON(C(=O)C1=CC=CC=C1)C2=CC4=C(C=C2)C3=CC=CC=C3C4,1 -O=CC1=CC=CO1,1 -[O-][N+](=O)C3=CN=C2[N]1C=CC=CC1=NC2=C3,1 -CC1=C2C(=CC=C1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 -CN(C)S(=O)(=O)CCNC(=O)N(CCCl)N=O,1 -CCS(=O)(=O)CC[N]1C(=NC=C1[N+]([O-])=O)C,1 -NC(=O)C1(OC1C(=O)C2=CC=CC=C2)C(N)=O,1 -COC3=CC=C2N=C1OC=CC1=C(OC)C2=C3,1 -CC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)C)N,1 -CCNN=NCC,1 -OC2=C1C(C3=C(C(C1=CC=C2)=O)C(=CC=C3)O)=O,1 -CCOC1=CC=C(C=C1)N(O)C(C)=O,1 -COC1=C(C=C(C=C1)[N+]([O-])=O)N=NC3=C2C=CC=CC2=CC(=C3O)C(=O)NC4=CC(=CC=C4)[N+]([O-])=O,1 -OCC=[N+](O)[O-],1 -BrN1C(=O)CCC1=O,1 -ON=C(O)CC1=C[N](C=N1)N=O,1 -OCC(O)CN=[N+]=[N-],1 -CC1=CC=C(C=C1)C(Cl)=O,1 -NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,1 -CCC1=C(C(=CC=C1)CC)NC(=O)CCl,1 -S1C=CN=C1,1 -CC(C)(Cl)[N+]([O-])=O,1 -CN(C)C1=CC=C(C=C1)N=NC2=CC(=CC=C2)C,1 -NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)Br)Br,1 -COC1=NSC2=C(N)C=CC=C12,1 -C[N]1N=C(C)C(=C1N)C(=O)C2=C(C=CC=C2)F,1 -CC1=CC(=CC(=C1)C)NO,1 -COC1=CC=C(C=C1)N=[N+]([O-])C2=CC=C(C=C2)OC,1 -[O-][N+](=O)C1=C2C(=CC=C1)C(=CC=C2)[N+]([O-])=O,1 -C(OCC1=CC=CC=C1)C2CO2,1 -CC(C)(C)C1=CC(=O)C=C(C1=O)C2=CC(=O)C=C(C2=O)C(C)(C)C,1 -CCC=CC=CC=CC=CC=COCC(O)C1=CC=CC=C1,1 -CC(=O)N(O)C1=C(C=CC=C1)C,1 -COC1=C(C=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 -CC1=CC=C(C=C1)S(=O)(=O)OCC2CO2,1 -COC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 -CC(C)=CC2C(C(=O)OCC1=CC=C(O1)CC#C)C2(C)C,1 -OC1OC(=O)C(=C1C(Cl)Cl)Cl,1 -ClCCNCCCNC2=C1C=CC=CC1=NC3=CC=CC=C23,1 -C1C4=C3C2=C1C=CC=C2C=CC3=CC=C4,1 -O=CC1CO1,1 -NC1=C(C=C(C=C1)CC2=CC(=C(C=C2)N)Cl)Cl,1 -NC(=S)C1=C(C=CC=C1Cl)Cl,1 -CC(C)(C)C1=CC=C(C=C1)OCC2CO2,1 -COC1=CC=C2C(=C1)C=CC3=C2C=C(O3)[N+]([O-])=O,1 -ClCC(Cl)=C,1 -CC1OC(CC(N)C1O)OC2=CC(O)(CC5=C2C(=C4C(=C3C=CC=CC3=C(C4=C5O)O)O)O)C(C)=O,1 -C=CCCC1CO1,1 -BrCC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,1 -[O-][N+](=O)C2=C3C=CC4=C1CCC=CC1=CC5=CC=C(C=C2)C3=C45,1 -ClC1=CC3=C(C=C1)C2=CC=CC=C2O3,1 -C([N]1C=CN=C1)C2=CC=CC=C2,1 -OS(=O)(=O)OCC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,1 -CC1=CC(=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3O)[N+]([O-])=O,1 -NC3=C(C=C2C1=CC=CC=C1[NH]C2=C3)[N+]([O-])=O,1 -OC(=O)COC1=CC=C(C=C1)N(CCCl)CCCl,1 -NC2=C1N=C[N](C1=NC=N2)CC(O)CN=[N+]=[N-],1 -C[N]2C(=NC3=C1N=C(C)C(=NC1=C(C)C(=C23)C)C)N,1 -CC3=C2C=CC1=CC=CC=C1C2=NC4=CC=CC=C34,1 -FC1=CC=C(C=C1)C(=O)C2OC2C3=CC=CC=C3,1 -[O-][N+](=O)C1=C(C=CC=C1)CC#N,1 -COC(=O)C12OC1(C)C(OC2=O)C(C)C,1 -[O-][N+](=O)C3=CC2=CC1=CC=CC=C1C=C2C=C3,1 -ClCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 -BrCC(Br)CBr,1 -NCCC1=C(C=C(C(=C1)O)O)O,1 -ONC1=CC=C(C=C1)N=NC2=CC=CC=C2,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=C(C=C2C3=O)[N+]([O-])=O)[N+]([O-])=O,1 -CC(=O)OC(OC(C)=O)C1=CC=C(O1)[N+]([O-])=O,1 -COC1=CC=CC=CC1,1 -NC1=NC3=C(C=C1)C2=CC=CC=C2[NH]3,1 -BrCC(=O)NCC1=CC=CC=C1,1 -COC(=O)C1=CC=C(O1)[N+]([O-])=O,1 -CC1=CC=C2C=C4C(=C3CCC1=C23)C=CC5=CC=CC=C45,1 -COC(=O)C(C)=CC1=CC=C(O1)[N+]([O-])=O,1 -NC1=CC=C(C=C1)N=NC2=CC=CC=C2,1 -CNC2=C(C1=NC(=C(N=C1C=C2)C)C)C,1 -ClC(=O)C1=C(C=CC=C1Cl)Cl,1 -O=C(NC1=CC=CC=C1)C2CO2,1 -[O-][N+](=O)C1=NC=C[N]1CC(=O)NCC2=CC=CC=C2,1 -N1C4C1C3=C(C2=CC=CC=C2C=C3)C5=C4C=CC=C5,1 -O1C3C1C2=CSC=C2C4=CSC=C34,1 -CBr,1 -OC3C=CC2=C1C(=CC4=C(C1=CC=C2C3O)CCC4=O)C(F)(F)F,1 -CNC3=CC2=C1C=C(C=CC1=CC=C2C=C3)O,1 -CC3(C)CC2C=C(CO)C1(CC1(C)C2C3)C=O,1 -ClCC1=CC(=O)OC1,1 -CCOP(=S)(OCC)OP(=S)(OCC)OCC,1 -N1C6C1C2=C(C=C4C(=C2)C3=CC=CC=C3C5NC45)C7=C6C=CC=C7,1 -CC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,1 -OC(CC1=C[N](N=O)C2=CC=CC=C12)C(O)=O,1 -CC1=NC=C([N]1CCO)[N+]([O-])=O,1 -ClC3C6(Cl)C4C2C1OC1C5C2C3(Cl)C(Cl)(C45)C6(Cl)Cl,1 -[O-][N+](=O)C1=CC(=CC=C1)Br,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)C3=O,1 -COC1=CC4=C3C(=C1OC)C2=CC=CC=C2C(C3=NC=C4)=O,1 -CCCCN(CCCCO)N=O,1 -COS(=O)(=O)OC,1 -OCC(O)C1CO1,1 -ClC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -C(CC2=C1C=CC=CC1=CC=C2)C3CO3,1 -[O-][N+](=O)C2=C(C=C1OC3=C(OC1=C2)C=C(Cl)C(=C3)Cl)Cl,1 -CC1(C)C(C=C(Cl)Cl)C1C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=CC=C2,1 -OC4=C3C2=CC=C1C=CC=CC1=C2C=CC3=CC=C4,1 -CCN(CC)C1=CC=C(C=C1)N,1 -C[N]2C(=NC3=CC1=NC=C(C)N=C1C(=C23)C)N,1 -OCCC1=C(C=CC=C1)[N+]([O-])=O,1 -CC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,1 -OC1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 -CC3=CC2=CC1=CC=CC=C1C=C2C=C3,1 -CCC1=C(C(=CC=C1)CC)N(COC)C(=O)CCl,1 -[NH]3C2=CC=C1C=CC=CC1=C2C4=C3C=CC5=CC=CC=C45,1 -CC(=O)C=C,1 -[O-][N+](=O)C1=CC(=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 -CN1CCC4=C2C1CC5=C(C2=C3OCOC3=C4)C=CC=C5,1 -CC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 -CC(=O)OCC(O)CO,1 -CC(C)CCCC(C)C3CCC4C2C(OO)C=C1CC(O)CCC1(C)C2CCC34C,1 -CC(=O)C(Cl)Cl,1 -[O-][N+](=O)C2=C1C=CC=C3C1=C(C=C2)C4=C(C=CC5=CC=CC3=C45)[N+]([O-])=O,1 -C1=CC2=C5C=CC=C6C=CC4=CC=C3C=CC(=C1)C2=C3C4=C56,1 -[O-][N+](=O)C3=CC=C2OC(=O)C1=CC=CC=C1C2=C3,1 -CC(=O)NC1=CC=C(C=C1)OC2=CC=CC=C2,1 -CC4CC3(OC1OC(CO)C(O)C(O)C1O)C=C(C)C2(CC2)C(C)(O)C3C4=O,1 -C1OC1COC2=C(C=CC=C2)C3=CC=CC=C3,1 -COC(=O)C(CSCCBr)NC(C)=O,1 -CC5=C3CCC4=C2C1NC1C6=C(C2=CC(=C34)C=C5)C=CC=C6,1 -CC(C)OS(C)(=O)=O,1 -CN(C)C1=CC=C(C=C1)C,1 -CNC(=O)OC1=CC=C(C=C1)C2=CC=CC=C2,1 -C6CCC5=C3C1=CC=CC=C1C4=CC2=CC=CC=C2C(=C34)C=C5C6,1 -NC1=C3C(=CC=C1)C2=CC=CC=C2C=C3,1 -OP(=O)(OCC(Br)CBr)OCC(Br)CBr,1 -[O-][N+](=O)C1=CC=C(C=C1)OC2=CC=CC=C2,1 -CC1=C3C(=C(C=C1)C)C2=CC(=CC=C2[NH]3)[N+]([O-])=O,1 -CC1=CC=C(C=C1)NCCCl,1 -O=NC2=CC1=CC=CC=C1C=C2,1 -C[N]1C(=NC2=C1C=CC3=CC=NC=C23)N,1 -C2=CC1=CC4=C(C=C1C=C2)C3=CC=CC=C3C=C4,1 -OP1(=NCCCO1)N(CCCl)CCCl,1 -OC2C1=C(C=CC=C1)C3=C2C=C(C=C3)[N+]([O-])=O,1 -C1OC1COC3=CC=C2SN=CC2=C3,1 -[O-][N+](=O)C1=CC=C(C=C1)C3=C([N]2C=CSC2=N3)N=O,1 -C1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 -CC(=O)ON(C(C)=O)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 -NC1=C(C=C(C=C1)[N+]([O-])=O)O,1 -COC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)OC)O)C3=O,1 -OC2=C1C(C=CC(C1=CC=C2)=O)=O,1 -CC3=CC(=O)C2=C(C(=C1C=CC=CC1=C2O)O)C3=O,1 -CN(C)C(Cl)=O,1 -COC1=C(C=CC(=C1)N=NC2=CC=CC=C2)N,1 -CC(C)CC(=O)OCC1=COC=C2C(=CC=[C]12)C=O,1 -CC(=O)OCC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,1 -COC1=C(C=CC(=C1)[N+]([O-])=O)N,1 -N1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 -CNC(=O)CSP(=S)(OC)OC,1 -CC1=C(C=CC=C1)NO,1 -OC5=CC4=C3C2=C1C=CC=CC1=CC=C2[NH]C3=CC=C4C=C5,1 -C=CC(=O)NCNC(=O)C=C,1 -CCOC1=CC=C(C=C1)[N+]([O-])=O,1 -CC(C)(C)N(CC(=O)C1=CC(=C(C=C1)O)CO)CC2=CC=CC=C2,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2C(O3)=O,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)Cl,1 -NC1=C(C=C(C(=C1)[N+]([O-])=O)N)F,1 -OC1=CC2=C(C(=C1)O)C(C(C(O2)C3=CC(=C(C=C3)O)O)=O)=O,1 -CN(C)C1=CC=C(C=C1)N=NC2=CC(=CC=C2)CCl,1 -CC(Br)C(Br)CCl,1 -C[N]1C(=NC2=C1C=C(C)C3=NC=CN=C23)N,1 -C4CC3=C(C2=C1C=CC=CC1=CC=C2C=C3)C4,1 -COCC4CN(C)C3CC1=C[N](C)C2=CC=CC(=C12)C3=C4,1 -[O-][N+](=O)C1=CC(=C(C(=C1)[N+]([O-])=O)C2=CC=CC=C2)[N+]([O-])=O,1 -C3=CC2=CC1=CC=CC=C1N=C2C=C3,1 -CCN1C=C(C(O)=O)C(=O)C2=C1N=C(C(=C2)F)N3CCNCC3,1 -CC(=O)NC(CSCCCl)C(O)=O,1 -ClC(Cl)C1=CC=CC=C1,1 -[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC(=CC=C2)Cl,1 -[O-][N+](=O)C1=CC(=C(C=C1)C2=CC(=C(C=C2)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 -CCCCN(CCCC)N=O,1 -CNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -COC1=C(C=CC(=C1)NS(C)(=O)=O)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 -C[N]1C=NC(=C1N=O)C2=CC=CC=C2,1 -[O-][N+](=O)C2=C3C=CC4=NC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 -N#CC1=CC3=C2C1=CC=CC2=CC=C3,1 -NC3=CC2=C(C1=CC=CC=C1N=C2C=C3)N,1 -ONC1=CC=CC=C1,1 -ClC2=CC1=CC=CN=C1C=C2,1 -C1=CC3=C(C=C1)C4=C2C=CC=CC2=C5C=CC=C6C=CC(=C3)C4=C56,1 -CCC(C)OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -OC1=C2C=CC3=CC=C(C4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 -ClC=C(Cl)SCC1=CC=CC=C1,1 -S(SC2=NC1=CC=CC=C1S2)C4=NC3=CC=CC=C3S4,1 -N1C5C1C2=C(C=C4C(=C2)C3=CC=CC=C3C=C4)C6=C5C=CC=C6,1 -CC(=O)NC2=C1N=CC=CC1=CC=C2,1 -CN1CN=C2C(=[N+](O)[C-]N=C12)N,1 -CC=C(Cl)C=O,1 -NC(=N)NC(=O)C1=C(N=C(C(=N1)Cl)N)N,1 -C[N]1C(=NC2=C1C=CC3=NC=C(C)N=C23)N,1 -COC3=CC(=C2N=C1OC=CC1=C(OC)C2=C3)OC,1 -CN(COC(C)=O)[N+]([O-])=O,1 -CC(Cl)(Cl)[N+]([O-])=O,1 -CN(C)C(=S)SSC(=S)N(C)C,1 -NC1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 -NC1=CC=C(C=C1)SC2=CC=CC=C2,1 -CC1=C3C(=CC2=CC=CC=C12)C4=C(C=C3)C(O)C(O)C5OC45,1 -[O-][N+](=O)C1=CN=C(S1)N2CCN(C(=O)C(Cl)Cl)C2=O,1 -COC1=NSC2=CC=C(N)C=C12,1 -[O-][N+](=O)C1=CC=C2C=CC3=C(C5=C(C4=CC=C1C2=C34)C=CC=C5)[N+]([O-])=O,1 -CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)N(CCO)CCO)[N+]([O-])=O,1 -CC1=CC=C(C=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 -ClC(Cl)=C(Cl)C=O,1 -COC3=C2N=C1OC=CC1=C(C2=CC=C3)OC,1 -COC1=C(C5=C(C(=C1)O)C(=O)C2=C(C3=C(C=C2OC)OC4OC=CC34)O5)OC,1 -[O-][N+](=O)C1=CC=C(C=C1)NC2=CC=C(C=C2)Cl,1 -NC1=CC=C(C=C1)CC2=CC=C(C=C2)N,1 -NC(CCC(=O)NC(CSC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O)C(=O)NCC(O)=O)C(O)=O,1 -NC(CSC(Cl)=C(Cl)C(Cl)=C(Cl)Cl)C(O)=O,1 -CNC1=C([N](C=N1)C)C(=O)N(C)N=O,1 -CC3=CC2=C1C=C(C=CC1=CC=C2C=C3)C,1 -COC1=C(C=CC(=C1)NS(C)(=O)=O)NC3=C2C=CC=C(C2=NC4=CC(=CC=C34)N=[N+]=[N-])C,1 -CCN(CCCl)CCCNC2=C1C=CC=CC1=NC3=CC=CC=C23,1 -CC(O)CN(C)C1=NN=C(C=C1)NN,1 -CC4=CC3=CC2=C1C=CC=CC1=CC=C2C=C3C=C4,1 -CC1(C)COC1=O,1 -CC(O)CN(CC(C)O)N=O,1 -CC(Cl)CO,1 -CC1=C(C=C(C=C1)N=NC2=CC(=C(C=C2)C)N)N,1 -ClC(Cl)C(=O)C(Cl)Cl,1 -COC2=C1OC=CC1=CC3=C2OC(C=C3)=O,1 -CC4=C2C=C1C=CC=CC1=CC2=C3C=CC(C(C3=C4)O)O,1 -NC2=C1C=CC=CC1=C(C=C2)N,1 -O=NC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 -C[N]2C(=NC3=C1C=CC=NC1=CC(=C23)C)NC(C)=O,1 -C1=CN=C(C=C1)C2=CN=CC=C2,1 -CC(=O)NC1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,1 -CC1=C4C(=C(C2=CC=CC=C12)CBr)C3=CC=CC=C3C=C4,1 -O=C1NCNC(=O)N1,1 -CC(=O)NC1=C(C(=CC=C1)N)C(O)=O,1 -C1OC1CC2=CC=CC=C2,1 -OC1=C(C=C(C=C1[N+]([O-])=O)C2=CC=CC=C2)[N+]([O-])=O,1 -C[N+]2=C1C=CC=CC1=C(C3=CC=CC=C23)N,1 -CCOC1=C(C=CC=C1)[N+]([O-])=O,1 -CCCCCN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 -CC2=CC1=CC4=C(N=C1C=C2)C3=CC=CC=C3C=C4,1 -CC1=C3C(=C(C=C1)C)C2=CC=CC=C2C=C3,1 -C1=CC3=C(C=C1)C4=CC=C5C2=CC=CC=C2C=C6C=CC(=C3)C4=C56,1 -O1C2C=CC=CC12,1 -COC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -NC4=C1C=CC=CC1=C3N=C2C=CC(C=C2OC3=C4)=N,1 -NC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,1 -COC1=CC3=C(C(=C1)OC)C(=O)C2=C(C(=CC=C2O)OC)O3,1 -O=C1C=CC3=C2C1=CC=CC2=CC=C3,1 -CCC2=C(N=C1C(=C(C=CC1=N2)NC)C)CC,1 -[O-][N+](=O)C2=CC=C1[NH]C=NC1=C2,1 -CN(C)C1=CC(=CC=C1)O,1 -[N-]=[N+]=NCC1=CC=CC=C1,1 -[O-][N+](=O)C1=CC=[N+](C=C1)[O-],1 -CC4=C1C=CC=CC1=C3N=C2C=CC=CC2=C(C3=C4)C,1 -COC1=C(C=CC(=C1)NS(C)(=O)=O)NC3=C2C=CC(=CC2=NC4=CC=CC=C34)N=[N+]=[N-],1 -O=CC=O,1 -CC2=NC1=CC(=C(C=C1C(=C2)C)C)N,1 -COC1=C(C5=C(C=C1)C2=C(C4=C(C=C2)C=C3OCOC3=C4)N(C)C5=O)OC,1 -CC1(C)CC2C(O)(C1)C=C(C=O)C3(CC23C)C=O,1 -CC=C1CC(=C)C(O)(CO)C(=O)OCC2=CCN3CCC(OC1=O)C23,1 -CC(=O)NC1=CC=C(C=C1)N,1 -ClC1=NC(=CC=C1)C(Cl)(Cl)Cl,1 -CCOS(=O)(=O)C1=CC=C(C=C1)C,1 -[O-][N+](=O)C4=CC=C3C2=C1C(=CC=CC1=CC=C2)C5=C3C4=CC=C5,1 -CC(=O)NN=CC2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 -CCN(CC)CCCC(C)NC2=C1C=CC(=CC1=NC=C2)Cl,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 -S2C4=CC=CC5=CC=C3C1=CC=CC=C1C=C2C3=C45,1 -NC2=C1C(C4=C(C(C1=C(C=C2OC3=CC=CC=C3)O)=O)C=CC=C4)=O,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC5=C(C=C2CC3)C4=CC=CC=C4CC5,1 -O=C1C=CC(=O)C2=C1C=CC=C2,1 -NC3=CN=C2[N]1C=CC=CC1=NC2=C3,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)F,1 -NC1=CC(=C(C=C1)O)[N+]([O-])=O,1 -CC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -CC1=CC=C(C=C1)NO,1 -NC3=CC2=CC1=CC=CC=C1C=C2C=C3,1 -OC5C=C3C2=C(C1=CC=CC=C1C=C2)C4=C3C(=CC=C4)C5O,1 -ClC1=C(Cl)C(=O)NC1=O,1 -OCCN1CN(CCO)CN(CCO)C1,1 -CSC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 -NC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 -[O-][N+](=O)C4=C1C=CC=CC1=C3C=CC2=CC=CC5=C2C3=C4CC5,1 -OCCNC2=C1C=CC=CC1=NC(=N2)C3=CC=C(S3)[N+]([O-])=O,1 -ClCC=CCCl,1 -ClCC1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,1 -C[N]1C=NC2=C(NO)N=CN=C12,1 -O=CC(=O)C1=CC=CC=C1,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=C(C=C2C=C3)[N+]([O-])=O,1 -OCCN(CCO)C2=CC1=CC=CC=C1C=C2,1 -C=O,1 -CN(C)C1=CC=C(C=C1)N,1 -C[N]1C(=NC2=C1C=CC3=CN=CC=C23)N,1 -ClCC2=C4C=CC=C5C=CC3=C1C=CC=CC1=CC(=C2)C3=C45,1 -CC1=CC=C(C=C1)NC2=CC=C(C=C2)[N+]([O-])=O,1 -CCCCCC=CC(=O)CCC1=CC(=C(C=C1)O)OC,1 -CC1(CO1)C2=CC=C(C=C2)C3=CC=CC=C3,1 -COP(=S)(OC)OC1=CC(=C(C=C1)N)C,1 -CCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -OC5C=CC4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4C5O,1 -COC1=C(C=CC(=C1)CNC(=O)CCCCCCC(C)C)O,1 -O=C(OCC=CC1=CC=CC=C1)C=CC2=CC=CC=C2,1 -C[N]1C(=NC2=C1C=CC3=NC=CC=C23)N,1 -ClC1=CC=C(C=C1)C3=C([N]2C=CSC2=N3)N=O,1 -COC1=C(C=CC=C1)CC2CO2,1 -[O-][N+](=O)C1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 -CC(=O)N(OC(=O)C1=CC=CC=C1)C2=CC4=C(C=C2)C3=CC=CC=C3C4,1 -CC(=O)C1=CC(=CC=C1)[N+]([O-])=O,1 -FC2=CC1=CC=CN=C1C=C2,1 -OC1=C2C=CC3=CC=CC4=CC=C(C(=C1)[N+]([O-])=O)C2=C34,1 -C5CC4=C3C=C2C1=CC=CC=C1C=CC2=NC3=CC=C4C=C5,1 -ON(C=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 -COC4=CC(=O)C3=C2[NH]C1=CC=CC=C1C2=C(C)N=C3C4=O,1 -OC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=C(C=C3)N=NC4=CC=CC=C4,1 -C[N]1C(=NC2=C1C=CC3=NC(=CC=C23)O)N,1 -ClCC(=O)CCl,1 -OP(O)(=N)N(CCCl)CCCl,1 -C[N]2C=C1C=CC=C(C1=N2)[N+]([O-])=O,1 -FC2=C1C=CC=CC1=NC=C2,1 -O=C1C4=C3C2=C1C=CC=C2C=CC3=CC=C4,1 -ClCC1=C(Cl)C(=O)OC1,1 -C1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 -CC1=C(C=CC=C1)N=O,1 -OC1=C2C(=CC=C1)C3=C(C=C2)[NH]C4=C3C5=C(C=C4)C=CC=C5,1 -CC(=O)C(C)=O,1 -CC1=C(C=C(C=C1)NO)C,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)Br,1 -[O-][N+](=O)C2=CC1=C3C=CC4=CC=CC5=CC=C(C=C1O2)C3=C45,1 -CN(C)C(=O)NC1=CC(=C(C=C1)Cl)Cl,1 -CC1=C3C(=C(C=C1)C)C2=CC=CC=C2[NH]3,1 -[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=CC=C2)O3,1 -NC(=O)NN=CC1=CC=C(O1)[N+]([O-])=O,1 -C[N]1C(=NC2=C1C=C(C)C3=NC(=C(C)N=C23)C)N,1 -C=CCN=C=S,1 -[O-][N+](=O)C([N+]([O-])=O)([N+]([O-])=O)[N+]([O-])=O,1 -C1COCC2(C1)CO2,1 -ClC3=CC=C2OC1=CC=CC=C1C2=C3,1 -OC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 -CC1=C(C=C(C=C1N)[N+]([O-])=O)[N+]([O-])=O,1 -[O-][N+](=NC1=CC=CC=C1)C2=CC=CC=C2,1 -ClC(=O)C1=CC=CC=C1,1 -COC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC(=C2)O)O3,1 -ClC2=C(Cl)C(=O)C1=C(C=CC=C1)C2=O,1 -OC1=C3C=CC(=C4C=CC2=CC=CC(=C1)C2=C34)[N+]([O-])=O,1 -COC3=CC=C2C(=C1C=COC1=NC2=C3)OC,1 -C1CSCN1,1 -C1=CC3=C(C=C1)C2=CC5=C(C=C2C=C3)C4=CN=CC=C4C=C5,1 -CC2=CC1=CC=CC=C1N=C2,1 -[O-][N+](=O)C1=C(C=CC=C1)Br,1 -CC(C)(C)OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -C[N]1C=NC(=C1SC3=C2[NH]C=NC2=NC=N3)[N+]([O-])=O,1 -NC1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 -NC2=C1C=CC=CC1=CC=C2,1 -BrCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 -NC(=O)OC1CO1,1 -CCN(C=O)N=O,1 -C[N]1C(=NC2=C1C=CC3=NC=C(C)N=C23)NO,1 -OC1=C(C=C(C=C1)Cl)CC2=C(C=CC(=C2)Cl)O,1 -CCCCN(N=O)C(N)=O,1 -CC(C)(C)NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=CC=C2C3)[N+]([O-])=O,1 -COC(=O)NN=CC2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 -NC1=CC=C(C=C1)C2=CC=C(C=C2)N,1 -CCN(C)N=O,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=C(C=C2CC3)[N+]([O-])=O,1 -CCOC1=CC=C(C=C1)NO,1 -OC(CN=[N+]=[N-])CN=[N+]=[N-],1 -NC1=C(C=C(C=C1)F)F,1 -CC5=C1C=CC=CC1=C4C3=C2C=CC=CC2=C(C=C3[NH]C4=C5)C,1 -[O-][N+](=O)C3=CC=C2[NH]C1=CC=CC=C1C2=C3,1 -CC(O)CN(CC(O)CO)N=O,1 -CC1=C(C=C(C=C1)N)O,1 -[O-][N+](=O)C2=C3C=CC4=C(C1=CC=CC=C1C5=CC=C(C=C2)C3=C45)[N+]([O-])=O,1 -CN(C)N=NC1=CC=C(C=C1)Cl,1 -NC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 -CN(C)CCNC(=O)C2=C1OC3=C(OC1=CC=C2)C=CC=C3,1 -CC#CC(OC(=O)NC1CCCCC1)(C2=CC=CC=C2)C3=CC=CC=C3,1 -C[N]3C=CC4=CC=C2C=CC1=CC=C(O)C=C1C2=C34,1 -ClCC2=C1C=CC=CC1=C(C3=CC=CC=C23)Cl,1 -ON=C(O)C1=CC=CC=C1,1 -C[N]1C=CN=C1[N+]([O-])=O,1 -CC2=CC1=CC4=C(C=C1C=C2)C3=CC=CC=C3C=C4,1 -CC(=O)NC1=C2C=CC3=CC=CC4=CC=C(C(=C1)O)C2=C34,1 -C2=CC1=CC=CN=C1C=C2,1 -[O-][N+](=O)C1=CC=C(C=C1)S,1 -CC3=C2C=CC1=CC=CC=C1C2=C(C4=CC=CC=C34)C,1 -CCN1C=C(C(O)=O)C(=O)C2=C1C=C(C(=C2)F)N3CCNCC3,1 -ClCC4=C2C1=CC=CC=C1C3=CC=CC(=C23)C=C4,1 -[O-][N+](=O)C1=CN=C(S1)N2CCNC2=O,1 -CC3=C(C2=NC1=CC(=C(C=C1N=C2C=C3)C)N)N,1 -C[N]1C(=NC2=C1C=C(C)C3=NC=C(C)N=C23)N,1 -NC2=C1C=CC=C(C1=CC=C2)N,1 -C[N]1C(=NC2=C1C=C(C)C3=NC=C(N=C23)C4=CC=CC=C4)N,1 -C[N+]2=C1C=CC=CC1=CC3=CC=CC=C23,1 -OC(=O)CC1=CC(=C(C=C1)O)O,1 -C[N]1C(=NC2=CC(=CC=C12)C)N,1 -COP(=O)(OC)OC=C(Cl)Cl,1 -COC4=C2C1=CC=CC=C1CC3N(CCC(=C23)C=C4O)C,1 -OCC(Br)CBr,1 -[O-][N+](=O)C1=CC2=CC=C3C=C(C=C4CCC(=C1)C2=C34)[N+]([O-])=O,1 -O=C1C(=O)C3=C2C1=CC=CC2=CC=C3,1 -ClCC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 -[O-][N+](=O)C1=CC=C(O1)C=O,1 -CC3=C2C1=CC=CC=C1[NH]C2=C(C(=N3)N)C,1 -O=C1C=CC4=C2C1=CC=C3C(C=CC(=C23)C=C4)=O,1 -CNC2=C(C1=NC(=CN=C1C=C2)C3=CC=CC=C3)C,1 -CC(=O)NC1=CC=C(C=C1)C2=CC=C(C=C2)N,1 -O2C3C=CC1=C(N=CC=C1)C23,1 -CCC(=C)C=O,1 -CC2=C(N=C1C=C(C=CC1=N2)N)C,1 -OS(=O)(=O)C1=C(C=CC(=C1)NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O)NC3=CC=CC=C3,1 -CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)C=O,1 -CNC1=C(C=C(C=C1)N(CCO)CCO)[N+]([O-])=O,1 -O=C1C5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 -COC(=O)C3=C2N=C1C=CC=CC1=C(C2=C(C=C3)[N+]([O-])=O)NCCCN(C)C,1 -ClC(Cl)C1=C(Cl)C(=O)OC1,1 -CC1=C(C=C(C(=C1C)N)[N+]([O-])=O)N,1 -CC5CC2C(CC3=C[N](C1CCCC1)C4=CC=CC2=C34)N(C)C5,1 -CC1=C(C=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 -C[N]1C(=NC3=C1C=CC4=CC=C2C=CC(=CC2=C34)O)C,1 -[O-][N+](=O)C1=CC=C(C=C1)C(=O)OCC2CO2,1 -[O-][N+](=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 -CC1=C(C(=CC=C1)N)N,1 -[O-][N+](=O)C1=C2C=CC3=CC=CC4=CC=C(C(=C1)[N+]([O-])=O)C2=C34,1 -CNC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 -CC(=O)C1=CC=C[NH]1,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC5=C(C=C2C=C3)C4=CC=CC=C4C=C5,1 -[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)F,1 -[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2O3,1 -BrCC(=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 -O=C1NC(=O)C=C1,1 -CC(=O)NC1=CC=C(C=C1)N=NC2=C(C=CC(=C2)C)O,1 -CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)CO,1 -NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)[N+]([O-])=O)[N+]([O-])=O,1 -NC1=CC(=C(C=C1)CO)[N+]([O-])=O,1 -[O-][N+](=O)C4=C2C(=CC=C3C1=CC=CC=C1C(=C23)C=C4)[N+]([O-])=O,1 -[NH]1C(=NC(=C1C2=CC=CC=C2)C3=CC=CC=C3)C4=CC=CC=C4,1 -CC(=O)NN,1 -CC(O)CN,1 -CC4=C2C=C1C(C(C=CC1=CC2=C3C=CC=CC3=C4)O)O,1 -NC3=CC=C2N=C1C=CC=C[N]1C2=N3,1 -NC1=C(C=CC(=C1)[N+]([O-])=O)CO,1 -O=C1C(=O)C5=C3C2=C1C=CC=C2C=CC3=C4C=CC=CC4=C5,1 -NC1=CC=C(C=C1)OC2=CC(=CC=C2)OC3=CC=C(C=C3)N,1 -C1=CC2=CC4=CC=C5C=CC=C6C=C3C=CC(=C1)C2=C3C4=C56,1 -ClCC4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4,1 -C[N]1C(=NC=C1[N+]([O-])=O)C,1 -CN(C)CCNC(=O)C3=C2N=C1C=CC=CC1=C(C2=CC=C3)N,1 -CC(=O)N(O)C1=CC=C(C=C1)[N+]([O-])=O,1 -C5CCC4=C3C=C2C1=CC=CC=C1C=CC2=NC3=CC=C4C5,1 -[O-][N+](=O)C2=CC1=CC=CN=C1C=C2,1 -C(CCC1CO1)CC2CO2,1 -O=C2CC(=O)C1=C(C=CC=C1)C2=O,1 -C[N]1C(=NC2=C1C=C(C)C3=NC(=CN=C23)C)N,1 -[O-][N+](=O)C2=C1C=CC=CC1=[N+](C=C2)[O-],1 -OC5C=CC4=C3C=C1C=CC=C2C=CC(=C12)C3=CC=C4C5O,1 -NC1=CC(=C(C=C1)[N+]([O-])=O)N,1 -OC1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 -CC(O)CN(C)N=O,1 -CC1=C(C(=CC=C1)C)C,1 -C1N2CN3CN1CN(C2)C3,1 -CC4=C2C1=CC=CC=C1[NH]C2=C3C(C=C(C(C3=N4)=O)N5CC5)=O,1 -CN(C)CCNC(=O)C3=C2C=C1C=CC=CC1=CC2=CC=C3,1 -CC2=C4C=C1C=CC=CC1=C5C=CC3=CC=CC(=C2)C3=C45,1 -[O-][N+](=O)C1=CC=C(C=C1)C(=O)C2OC2C3=CC=CC=C3,1 -[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,1 -OC3=C1C=CC=CC1=C2C=CC=CC2=C3,1 -BrC=CBr,1 -CCCC=CC(=O)OC1C(C)(C)CC2C1(O)C=C(C=O)C34CC23C(=O)OC4O,1 -[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=C(C(=C2)Cl)Cl)O3,1 -NCCCNCCCCN(CCCN)N(O)N=O,1 -CC3=C2C1OC1C5=C(C2=C(C4=CC=CC=C34)C)C=CC=C5,1 -[O-][N+](=O)C1=CC=C(C=C1)C3=C([N]2C=CSC2=N3)[N+]([O-])=O,1 -CN(C)N=NC1=CC=C(C=C1)Br,1 -[O-][N+](=O)C3=CC=C2CC1=CC=CC=C1C2=C3,1 -NC(=NO)C1=CC=C(O1)[N+]([O-])=O,1 -C1=CC3=C(C=C1)C2=CC=CN=C2C=C3,1 -[O-][N+](=O)C1=C3C(=CC=C1)C2=CC=CC=C2[NH]3,1 -NC2=C1N=CC=CC1=CC=C2,1 -CC[N+]2=C(C1=CC(=CC=C1C3=CC=C(C=C23)N)N)C4=CC=CC=C4,1 -ON(N=O)C1=CC=CC=C1,1 -CC3=C(C=C2N=C1C=C(C(=CC1=CC2=C3)C)N)N,1 -NC1=CC(=C(C=C1)O)N,1 -NC2=C1C=CC=CC1=NC3=C2CCCC3,1 -CCN(CC)C1=CC=C(C=C1)C(C2=CC=C(C=C2)N(CC)CC)=C3C=CC(C=C3)=[N+](CC)CC,1 -CN(C)C1=CC=C(C=C1)C(=N)C2=CC=C(C=C2)N(C)C,1 -CC1=CC(=C(C=C1)N=NC3=C2C=CC(=CC2=CC(=C3O)S(O)(=O)=O)S(O)(=O)=O)C,1 -ClC=CC[N+]23CN1CN(CN(C1)C2)C3,1 -COC3=CC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NC(C)CCCN(CCCl)CCCl,1 -CC3=C(C=C2[N+](=C1C=C(C(=CC1=NC2=C3)C)N)C4=CC=CC=C4)N,1 -CN(C)CCCCl,1 -NC1=CC=C(C=C1)C(C2=CC=C(C=C2)N)=C3C=CC(=N)C=C3,1 -CN(C)C3=CC2=[S+]C1=CC(=CC=C1N=C2C=C3)N(C)C,1 -CC(COC1=CC=CC=C1)N(CCCl)CC2=CC=CC=C2,1 -CC1=C(C=CC(=C1)C(C2=CC=C(C=C2)N)=C3C=CC(=N)C=C3)N,1 -CN(C)C3=CC2=NC1=CC(=CC=C1C=C2C=C3)N(C)C,1 -CCN(CC)CCCC(C)NC2=C1C=C(C=CC1=NC3=CC(=CC=C23)Cl)OC,1 -ClCC1=NC=CC=C1,1 -ClCC1=CN=CC=C1,1 -CCN(CC)C1=CC3=C(C=C1)C(=C2C=CC(=CC2=[O+]3)N(CC)CC)C4=C(C=CC=C4)C(O)=O,1 -C[N+]2=C1C=C(C=CC1=CC3=CC=C(C=C23)N)N,1 -CN(C)C3=CC2=[S+]C1=CC(=C(C=C1N=C2C=C3)C)N,1 -NC(COC(=O)C=[N+]=[N-])C(O)=O,1 -NC1=NC=C(S1)[N+]([O-])=O,1 -CC(C)CCCC(C)C4CCC5C3CC1OC12CC(O)CCC2(C)C3CCC45C,1 -CCCCN(N=O)C(=N)N[N+]([O-])=O,1 -NC(CC1=CC=C(C=C1)N(CCCl)CCCl)C(O)=O,1 -COC2=CC=C1N=C(N)SC1=C2,1 -CN(N=O)C(=O)NC(C=O)C(O)C(O)C(O)CO,1 -CC2=CN(C1CC(N=[N+]=[N-])C(CO)O1)C(=O)NC2=O,1 -NC1=NC(=O)N(C=N1)C2OC(CO)C(O)C2O,1 -BrC2=C1C=C4C(=CC1=CC=C2)C3=CC=CC=C3C=C4,1 -OC2=C1C=CC(=CC1=C(N=N2)O)[N+]([O-])=O,1 -CCN(N=O)C(=N)N[N+]([O-])=O,1 -CN(C)N=NC1=C([NH]C=N1)C(N)=O,1 -OC1=NC(=NN=C1)O,1 -OC(CBr)C(O)C(O)C(O)CBr,1 -COC24C1NC1CN2C3=C(C(=C(C(=C3O)C)N)O)C4=COC(N)=O,1 -SC2=C1N=C[NH]C1=NC=N2,1 -OCC1OC(C(O)C1O)[N]2C=NC3=C(S)N=CN=C23,1 -NC(CC1=CC(=C(C=C1)O)O)C(O)=O,1 -NC(=NO)C1=CC=CC=C1,1 -CC(=O)NC(CS)C(O)=O,1 -CC1=C(C=CC(=C1)N)C2=CC=C(C=C2)O,1 -NC2=NC1=CC=C(C=C1S2)[N+]([O-])=O,1 -OCC1OC(CC1O)N2C=C(C(=O)NC2=O)C(F)(F)F,1 -CN(N=O)C(=N)N[N+]([O-])=O,1 -NC2=C1N=C[NH]C1=NC=[N+]2[O-],1 -NC2=C1N=C[N](C1=NC=N2)C3OC(CO)CC3O,1 -NC1=NC=CS1,1 -[O-][N+](=O)C1=CC=C(C=C1)CBr,1 -C=CC#N,1 -CCOP(=O)(OCC)OC1=CC=C(C=C1)[N+]([O-])=O,1 -ClCC(Br)CBr,1 -ClCCCl,1 -CC2=C1C(O)C(C)(C)C=C1C(=O)C(C)(O)C23CC3,1 -CC2=C1C(O)C(C)(CO)C=C1C(=O)C(C)(O)C23CC3,1 -CCCN(C(N)=NN=O)[N+]([O-])=O,1 -CCCCCN(N=O)C(=N)N[N+]([O-])=O,1 -CC(C)(O)C3CC2=C(C=C1OC(C=CC1=C2)=O)O3,1 -CN1C(SC2=C1C=CC=C2)=NN,1 -NC(CO)C(=O)NNCC1=C(C(=C(C=C1)O)O)O,1 -N1C(C1C2=CC=CC=C2)C3=CC=CC=C3,1 -CC(C)CC(=O)OCC1=COC(OC(=O)CC(C)C)C2C1CC(OC(C)=O)C23CO3,1 -C[N]1C(=CN=C1C2=NN=C(S2)N)[N+]([O-])=O,1 -C1=CC=C3C(=C1)C=C4C=CC=C5C2=C(C=CC=C2)C3=C45,1 -NC2=C1N=C([NH]C1=NC=N2)C3=CC=C(C=C3)[N+]([O-])=O,1 -COC4=C3C(=C2C(=C1C(CC(CC1=C(C2=C(C3=CC=C4)O)O)(O)C(C)=O)=O)O)O,1 -COC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=CC5=C3C4C=COC4O5)OC,1 -NC(CSC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O)C(O)=O,1 -ClCCN(CCCl)P1(=O)OCC(=O)CO1,1 -C[N+]2=C1C=CC=CC1=NC3=CC=CC=C23,1 -CS(=O)(=O)OCC(O)C(O)COS(C)(=O)=O,1 -CC(C)(N=NC(C)(C)C(N)=N)C(N)=N,1 -C[N+]([O-])(CCCl)CCCl,1 -N=NC1=NNC=C2C=CC=CC12,1 -[O-][N+](=O)C1=CC=C(S1)NC(=O)NCCCl,1 -OCC1OC(C(O)C1O)[N]2C=NC3=C(NO)N=CN=C23,1 -CCOC(=O)NNC2=C1C=CC=CC1=CN=N2,1 -CCN(CCCl)CCCNC2=C1N=C(C=CC1=NC3=CC(=CC=C23)Cl)OC,1 -CCN(CCCl)CCCNC1=C4C(=NC2=CC=CC=C12)C3=NC=CC=C3C=C4,1 -CC=C1CC(=C)C(C)(O)C(=O)OCC2=CCN3CCC(OC1=O)C23,1 -NCC(=O)NC1=CC=CC=C1,1 -CC(C)CN(N=O)C(N)=N[N+]([O-])=O,1 -CN1CC(=CC2C1CC3=C[NH]C4=CC=CC2=C34)C,1 -CC4CC1C(CC2=C[NH]C3=CC=CC1=C23)N(C)C4,1 -NC3=CC2=[S+]C1=CC(=CC=C1N=C2C=C3)N,1 -CC[N]2C1=CC=CC=C1C3=CC(=CC=C23)N,1 -CC2=CC=C1N=C(N)[NH]C1=C2,1 -CCN(CC)C1=CC=C(C=C1)C(C2=CC=CC=C2)=C3C=CC(C=C3)=[N+](CC)CC,1 -NC1=CC3=C(C=C1)C2=NC4=C(C(N2C3)=O)C=CC=C4,1 -C1OC1CC3=C2C=CC=CC2=CC=C3,1 -NC(CCC(=O)NC(CS)C(=O)NCC(O)=O)C(O)=O,1 -O=C(C1OC1C2=CC=CC=C2)C3=CC=CC=C3,1 -COC2=C(C1=NC3=C(C(=C1C=C2)OC)CCO3)OC,1 -NN=C1N=NC=C2C=CC=CC12,1 -NC(=O)CC1CO1,1 -CCC(C)ON=O,1 -CC3(C[N]1C=CN=N1)C(N2C(CC2=O)S3(=O)=O)C(O)=O,0 -CN(C)CCOC(=O)C=C,0 -ClC1=C(C=C(C(=C1)Cl)Cl)Cl,0 -CCOC(=O)COC1=CC2=C(C=C1)C(=O)C=C(O2)C3=CC=CC=C3,0 -CCCCCCCCCCCCC1=CC=CC=C1,0 -CCOC(=O)CC(C)C,0 -CCCCCOC(=O)C(C)=C,0 -CC1CCCC2(C)CCCCC12O,0 -CC(=C)C(=O)OCCOC(=O)C(C)=C,0 -ClC1=C(C=CC=C1)C=O,0 -OC1=C(C(=C(C=C1Cl)Cl)Cl)[N+]([O-])=O,0 -CCOC1=CC2=C(C=C1)NC(C)(C)C=C2C,0 -CCCCC(CC)COC(=O)C1=C(C=CC=C1)C(=O)OCC(CC)CCCC,0 -CCCCC(CC)COC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 -CCN(CC)CC#CC(C)(C)OC(=O)C(O)(C1CCCCC1)C2=CC=CC=C2,0 -CC(C)(C)COC(=O)C=C,0 -FC(Cl)C(F)(F)C(F)(F)Cl,0 -NC2=NC1=NC(=C(N=C1C(=N2)N)C3=CC=CC=C3)N,0 -COC(=O)C1=CC=C(C=C1)C(=O)OC,0 -ClC2=CC1=CC=CC=C1N=C2,0 -CC(=C)C(=O)OCCCCCOC(=O)C(C)=C,0 -CC(CC1=CC(=C(C=C1)O)O)C(C)CC2=CC(=C(C=C2)O)O,0 -OC1=C(C=C(C=C1)Cl)SC2=C(C=CC(=C2)Cl)O,0 -CC(=O)CC(=O)NC1=C(C=CC=C1)C,0 -C1CCOC1,0 -CCOCCC1=C(N=C([N]2N=CN=C12)N)C3=CC=CC=C3,0 -NCCS,0 -CC(C)(C)NC(=O)C3CCC4C2CC=C1C=C(CCC1(C)C2CCC34C)C(O)=O,0 -OC1=CC=C(C=C1)C2=CC=C(C=C2)O,0 -CC1=CC=C(C=C1)Br,0 -ClC3=C2C=C1C=CC=CC1=CC2=CC=C3,0 -COC2=C1OC=CC1=C(OC)C3=C2OC(C=C3)=O,0 -C2C1=C(C=CC=C1)C3=C2C=CC=C3,0 -CC2CCCC(=O)CCCC=CC1=C(C(=CC(=C1)O)O)C(=O)O2,0 -NC(CCC(O)=O)C(O)=O,0 -CC(O)C[N+](C)(C)NC(=O)C(C)=C,0 -CCOC(=O)OCC,0 -ClCC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,0 -C3CCC2OCCOCCOC1CCCCC1OCCOCCOC2C3,0 -ON1C(=O)CCC1=O,0 -CCN(CC)CCCN,0 -CC(C)CCOC(C)=O,0 -CC1=C(C(=CC(=C1)C2=CC(=C(C(=C2)C)N)C)C)N,0 -CCCCCCC(O)=O,0 -CC(C)C1C(C)C(C)(C)C2=C1C=C(C(=C2)C)C(C)=O,0 -OC(=O)CC(O)(CC(O)=O)C(O)=O,0 -ICI,0 -COC1=CC(=CC=C1)C(=O)CBr,0 -CCN(CC)CCO,0 -CC3CC1=C(C(=C(C=C1)C(=O)NC(CC2=CC=CC=C2)C(O)=O)O)C(=O)O3,0 -CCCCC1CO1,0 -CCOCOCC,0 -CC(=C)C(=O)OCCO,0 -COC1=CC=C(C=C1)C3=COC2=C(C(=CC(=C2)O)O)C3=O,0 -OCC(O)C1=C(C(=C(O1)O)O)O,0 -COC(=O)C1=CC=C(C=C1)C,0 -ClC1=CC(=CC(=C1)Cl)Cl,0 -NC(N)=O,0 -CCCCCl,0 -[O-][N+](=O)C1=CC=CC=C1,0 -C[N]1C=NC2=C1C(NC(N2C)=O)=O,0 -CC1=CC=NC=C1,0 -OC(=O)CCC1=C[NH]C2=CC=CC=C12,0 -CC(C)(C)NCC(O)COC2=C1CC(C(CC1=CC=C2)O)O,0 -NC(CC(=O)C1=C(C(=CC=C1)O)N)C(O)=O,0 -CC(N)CCN,0 -CC(S)C(=O)NCC(O)=O,0 -N#CCCCCC#N,0 -CCCCC(CC)COC(=O)C=CC1=CC=C(C=C1)OC,0 -CC1(C)CC(CC(C)(CN=C=O)C1)N=C=O,0 -CC1NC(CC2=C1[NH]C3=CC=CC=C23)C(O)=O,0 -CCOP(=S)(OCC)OC2=NC1=CC=CC=C1N=C2,0 -CCCCC(CC)COP(=O)(OCC(CC)CCCC)OCC(CC)CCCC,0 -CNS(=O)(=O)C1=CC=C(C=C1)NC(C)=O,0 -OC1=CC(=C(C(=C1)Cl)Cl)Cl,0 -CCOC1=CC=C(C=C1)N=[N+]([O-])C2=CC=C(C=C2)OCC,0 -C1=CC=C(C=C1)C2=CC=C(C=C2)C3=CC=CC=C3,0 -CCCCCCCCN1SC=CC1=O,0 -OC(=O)C1=C(C=CC(=C1)Cl)O,0 -NC1=NC(=NC(=N1)N)Cl,0 -CC1=C(C=C(C(=C1)O)C(C)(C)C)SC2=C(C=C(C(=C2)C(C)(C)C)O)C,0 -NC2C1=C(C=CC=C1)C3=C2C=CC=C3,0 -COC(N)=O,0 -FC2=CN(C1CCCO1)C(=O)NC2=O,0 -CC3(C)SC2C(NC(=O)COC1=CC=CC=C1)C(=O)N2C3C(O)=O,0 -COC1=CC=C(C=C1)C=C,0 -CC(=O)C2=CC1=CC=CC=C1C=C2,0 -NC1=NCNC2=C1N=C[N]2C3OC(CO)C(O)C3=O,0 -OC1=CC2=C(C=C1)C4=C(C(O2)=O)C3=CC=C(C=C3O4)O,0 -CCCCCCCC(=O)CCC1=CC(=C(C=C1)O)OC,0 -CC1CC(CC(C)(C)C1)OC(=O)C2=C(C=CC=C2)O,0 -OC(=O)CCCCCCCCC(O)=O,0 -COP(=O)(SC)SC,0 -OC(CC(O)=O)C(O)=O,0 -CC(=C)C(=O)OCC(C)(C)C,0 -CC(C)NCC(O)COC1=C(C=CC=C1)CC=C,0 -C1COCCOCCOCCOCCOCCOCCO1,0 -C=CC1=CC=NC=C1,0 -CC(NC(=O)CC1=C(N=C(N=C1)C)N)=C(CCOC(=O)C2=CC=CC=C2)SC(=O)C3=CC=CC=C3,0 -COC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 -CC(Cl)=O,0 -CCOC1=CC(=CC=C1)[N+]([O-])=O,0 -CC1=NC=C[NH]1,0 -CC(=O)NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)N,0 -CCOC(=O)CNC(=O)CBr,0 -OC(=O)C=CC(O)=O,0 -CN2C(CSCC(F)(F)F)NC1=C(C=C(C(=C1)Cl)S(N)(=O)=O)S2(=O)=O,0 -NC1CCC(CC1)CC2CCC(N)CC2,0 -CCCCC#N,0 -CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C,0 -CC2(N(O)C1=C(C=CC=C1)C2=O)C3=CC=CC=C3,0 -CC1=NC=C(N=C1)C,0 -CC(C)CCCCCOC(=O)C=C,0 -NC1=C(C=CC=C1)C(O)=O,0 -OC1=CC=CC=C1,0 -NC(=O)N(C1=CC=CC=C1)C2=CC=CC=C2,0 -CCCCCCCCCCCCS,0 -CC(C)N=C=NC(C)C,0 -COC1=CC=C(C=C1)CN(CCN(C)C)C2=NC=CC=C2,0 -CN(C(=O)CN(CCO)CC(=O)N(C)C(C)(C)CC1=CC=CC=C1)C(C)(C)CC2=CC=CC=C2,0 -CCOP(=S)(OCC)OC1=C(C=C(C(=N1)Cl)Cl)Cl,0 -CC(C)CC(C)=O,0 -OCC=CC1=CC=CC=C1,0 -NC1=CC(=CC(=C1)Cl)Cl,0 -CN1CCC(CC1)=C3C2=C(C=CC=C2)C=CC4=C3C=CC=C4,0 -COC1=CC=C(C=C1)O,0 -CCC(=C)C(=O)C1=C(C(=C(C=C1)OCC(O)=O)Cl)Cl,0 -CS(C)(=O)=O,0 -CC(C)(N=NC(C)(C)C#N)C#N,0 -CCC(O)=O,0 -CC(C)CN(CC(C)C)CC(C)C,0 -OC1=CC2=C(C(=C1)O)C(C(C(O2)C3=CC=CC=C3)=O)=O,0 -OCC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,0 -CCCCCC=CCC=CCCCCCCCC(O)=O,0 -CC1=C(C2=C(C=C1[N+]([O-])=O)C(CC2(C)C)(C)C)[N+]([O-])=O,0 -CCCCCCCCCCC1CO1,0 -O=P(OC1=CC=CC=C1)(OC2=CC=CC=C2)OC3=CC=CC=C3,0 -OC1=C(C(=C(C=C1Cl)Cl)Cl)Cl,0 -OCC(=O)N(O)C1=CC=C(C=C1)Cl,0 -CNP1(=NP(=NP(=N1)(NC)NC)(NC)NC)NC,0 -CC(C)(C#N)C(C)(C)C#N,0 -CS(=N)(=O)CCC(N)C(O)=O,0 -CCN(CC)C1=CC2=C(C=C1)C=C(C(=O)O2)C4=NC3=CC=CC=C3[N]4C,0 -NC(CC1=C[NH]C2=CC=C(O)C=C12)C(O)=O,0 -NC1=C(C=CC=C1)C(=O)OCCC2=CC=CC=C2,0 -OC(=O)C=CC1=C(C=CC=C1)[N+]([O-])=O,0 -CC1=CC3=C(C=C1)C2=CC=C(C=C2C3)C,0 -NC(=O)CCCCC(N)=O,0 -NC(=O)C1=C(C=CC=C1)O,0 -NC(CSC=CCl)C(O)=O,0 -O3C4C1OC1C2=C(C=CC=N2)C34,0 -C[N]2C(=NC3=NC1=NC=CC=C1C=C23)N,0 -CC1=C(C=CC=C1)C=O,0 -CCCCCN(CCCCC)CCCCC,0 -CC(=O)OC2=C1N=CC=CC1=CC=C2,0 -OC(=O)C2=C(C=C1C=CC=CC1=C2)O,0 -CCCCC(CC)CNCC(CC)CCCC,0 -CC(C)NC1=NC(=NC(=N1)N)Cl,0 -[NH]1C=CN=C1,0 -OC(=O)CC(NC(=O)COC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 -OCCS,0 -O=S1(=O)CCCC1,0 -CC(C)C(C(=O)OC(C#N)C1=CC(=CC=C1)OC2=CC=CC=C2)C3=CC=C(C=C3)Cl,0 -CCC(C)N,0 -CCCCNC(=O)[N]1C(=NC2=CC=CC=C12)NC(=O)OC,0 -O(C1=CC=CC=C1)C2=CC=CC=C2,0 -CC(C)(C)NCC(O)C1=CC(=C(C=C1)O)NC(N)=O,0 -CN2C(=O)CC(=O)N(C1=CC=CC=C1)C3=C2C=CC(=C3)Cl,0 -CN(CCO)CCO,0 -CC1=C(C(=CC=C1)O)N,0 -CCC(CO)=[N+](O)[O-],0 -OC(=O)C(F)(F)C(F)(Cl)C(F)(F)C(F)(Cl)C(F)(F)Cl,0 -CC(C)OC(=O)CC(O)(CC(O)=O)C(O)=O,0 -CC(C)(C)OC(=O)OC(=O)OC(C)(C)C,0 -ClN1C(=O)N(Cl)C(=O)N(Cl)C1=O,0 -OC1=CC(=CC=C1)NC2=CC=CC=C2,0 -CC1=C(C=CC=C1N=[N+]([O-])C2=C(C(=CC=C2)[N+]([O-])=O)C)[N+]([O-])=O,0 -NC=O,0 -OC1=C(C=C(C=C1)Cl)CC2=CC=CC=C2,0 -CN(N)C=O,0 -CC2=CC=C1N=N[NH]C1=C2,0 -CCCCCCCC(O)=O,0 -CC1=CC=C(C=C1)N(O)C(C)=O,0 -COC1=C(C=C(C(=C1)N)C)N,0 -COC(=O)C1=CC=C(C=C1)O,0 -OC(=O)CC(=CC(O)=O)C(O)=O,0 -NC(=O)C1=NC=CN=C1,0 -CCN(CC1=CC=CC=C1)C2=CC=CC=C2,0 -CNC(=O)ON=CC(C)(C)SC,0 -O=CC2=C1C=CC=CC1=CC3=CC=CC=C23,0 -C1COCO1,0 -OC(=O)C(Br)=C,0 -C=CC1=C(C=CC=C1)C=C,0 -OS(=O)(=O)C1=CC=CC=C1,0 -CCCCCN(CCCOC)C(=O)C(CCC(O)=O)NC(=O)C1=CC(=C(C=C1)Cl)Cl,0 -C=CC(=O)OCCCCOC(=O)C=C,0 -C(OCC1=CC=CC=C1)C2=CC=CC=C2,0 -BrC1=C(C2=C(C(=C1Br)Br)C(=O)OC2=O)Br,0 -CC(C)N2C(=O)C1=C(C=CC=C1)NS2(=O)=O,0 -CCOP(=S)(OCC)SCN1C(=O)OC2=C1C=CC(=C2)Cl,0 -C=CCN(CC=C)CC=C,0 -CCNC1=CC=CC=C1,0 -NC1=C(C=CC=C1O)[N+]([O-])=O,0 -CC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O,0 -CC(C)(OC1=CC=C(C=C1)C(=O)C2=CC=C(C=C2)Cl)C(O)=O,0 -CCOC(=O)C4=CC1=C(C3=C2C(=C1)CCCN2CCC3)OC4=O,0 -COC(=O)C(=CC1=C(C=CC=C1)Br)C#N,0 -CCCCC1C(=O)N(N(C1=O)C2=CC=CC=C2)C3=CC=CC=C3,0 -CC(C)(C)OOC(C)(C)C,0 -CC1=C(C=CC=C1)C(N)=O,0 -CC(C)(OOC(C)(C)C1=CC=CC=C1)C2=CC=CC=C2,0 -CCCCOC(=O)CCC,0 -CCCCOCCCC,0 -CCC(C)=[N+](O)[O-],0 -NC(=O)C1CCCN1C(=O)C(CC2=C[NH]C=N2)NC(=O)C3CCC(=O)N3,0 -CCCC=C(CC)C=O,0 -CC1=CC=C(C=C1)C#N,0 -C2=CC1=CN=NC=C1C=C2,0 -ClC1=C(C(=CC=C1)Cl)C=O,0 -COC1=C(C=CC(=C1)C(C)=O)O,0 -CC(C)COC(=O)C(C)=C,0 -CC(C)(C)C1=C(C=CC(=C1)O)O,0 -NC1CCCC(N)C1,0 -CCCCOC(=O)C1=CC=C(C=C1)N,0 -CC1CCC(CC1)C(C)C,0 -NCCCN,0 -CC1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O,0 -OC1=CC=C(C=C1)NC3=CC2=CC=CC=C2C=C3,0 -CCCCC(CC)C(O)=O,0 -ClCC(Cl)C=C,0 -CC(C)CCOC(=O)CC(C)C,0 -NCC(O)=O,0 -OCC1=CC=C(C=C1)F,0 -CCCCOCCOCCSC#N,0 -O=C2N(SC1CCCCC1)C(=O)C3=C2C=CC=C3,0 -CC3=NN=C4CN=C(C1=C(C=CC=C1)Cl)C2=CC(=CC=C2[N]34)Cl,0 -OC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 -ON(C=O)C1=CC=CC=C1,0 -[O-][N+](=O)C1=CC(=CC=C1)Cl,0 -[O-][N+](=O)C1=CC2=C(C=C1)NC(=O)CN=C2C3=CC=CC=C3,0 -OC(C(O)C(O)=O)C(O)=O,0 -CS(=O)(=O)C=C,0 -CC(C)CC(C)O,0 -O=CC=CC1=CC=CC=C1,0 -CC(C)CNCC(C)C,0 -BrC1=C(C=CC=C1)C2=CC=CC=C2,0 -NC1=CC=C(C=C1)S(=O)(=O)NC3=NC2=CC=CC(=C2N=C3)Cl,0 -CN2C(=O)N(C)C1=C(N=C[NH]1)C2=O,0 -COC=O,0 -OC(=O)C(O)=O,0 -ClC(Cl)(Cl)C(Cl)(Cl)Cl,0 -CSCCC(NC(=O)COC1=C(C=C(C(=C1)Cl)Cl)Cl)C(O)=O,0 -CCCCCCCCCCCCCCCCCCO,0 -OC(=O)CN(CC(O)=O)CC(O)=O,0 -CCCN(CCC)C(=O)SCC,0 -CC1=C(C=C(C=C1)NCCO)O,0 -CC=O,0 -CC1(C)C=C(C(O)=O)C(C)(C)N1O,0 -OC(O)=O,0 -CCCCCCC1CO1,0 -CCCCCC(=O)CC2=C1C(OC3=C(OC1=CC(=C2)O)C(=C(C(O)=O)C(=C3)O)CCCCC)=O,0 -COC1=C(C=C(C=C1)CC=C)OC,0 -CC1=CC(=CC=C1)OP(=O)(OC2=CC=CC=C2)OC3=CC=CC=C3,0 -[O-][N+](=O)C1=CC=C(C=C1)OC2=C(C=C(C=C2Cl)Cl)Cl,0 -O=C3OC2=C1C=COC1=CC=C2C=C3,0 -COC1=C(C(=CC(=C1)C(C)=O)OC)O,0 -COC1(CCCC1)OC5CCC6C4CCC3CC2SC2CC3(C)C4CCC56C,0 -OCC(O)COP(O)(O)=O,0 -CCCCCCNCCCCCC,0 -CSCCC=O,0 -OCCOCCO,0 -CN(C)C1=CC=C(C=C1)C(=C2C=CC(=N)C=C2)C3=CC=C(C=C3)N(C)C,0 -O=C1NC(=O)C2CC=CCC12,0 -CN1CCCC1=O,0 -C=CC1=NC=CC=C1,0 -CCCCC(CC)COP(=O)(OC1=CC=CC=C1)OC2=CC=CC=C2,0 -OC1=CC3=C(C=C1)C(=O)C2=C(C=CC(=C2)O)C3=O,0 -C3CCC2OCCOCCOCCOC1CCCCC1OCCOCCOCCOC2C3,0 -CCCCCCCCCCCCCC[N+](C)(C)CC1=CC=CC=C1,0 -NCC(=O)NCC(=O)NCC(=O)NCC(O)=O,0 -OC1=C(C=CC=C1)C3=NC2=CC=CC=C2O3,0 -CCOP(=O)(CC)OCC,0 -CC(C)=CCC2C(=O)C(=O)C1=C(C=CC=C1)C2=O,0 -BrCC1=CC=C(C=C1)Br,0 -CC1=CC(=O)C=C(C)C1=O,0 -CC5CC2C(CC3=C[N](CC1CC1)C4=CC(=CC2=C34)Br)N(C)C5,0 -CC(=C)C(=O)OCCOCCOCCOC(=O)C(C)=C,0 -OC[P+](CO)(CO)CO,0 -OC2=CC1=C(C=C(C=C1C=C2)S(O)(=O)=O)S(O)(=O)=O,0 -CC(=O)OC3(CCC4C2C=C(Cl)C1=CC(=O)OCC1(C)C2CCC34C)C(C)=O,0 -C1=CC=C4C(=C1)N=C3C2=C(C=CC=C2)C6=C3C4=C5C=CC=CC5=N6,0 -CC1=CC=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3O,0 -COC1=CC(=C(C(=C1)OC)Cl)N2C(=CC(=O)C(=C2C3=CC=C(C=C3)F)C)C4=CC=CC=C4,0 -COC1=CC=C(C=C1)C(Cl)=C(C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC,0 -ClCC1=C(C=CC=C1)CCl,0 -CCC(=C(CC)C1=CC=C(C=C1)OP(O)(O)=O)C2=CC=C(C=C2)OP(O)(O)=O,0 -CC1=NOC(=C1C)NS(=O)(=O)C2=CC=C(C=C2)N,0 -CCCCCCCCCCCCCCCCC1CO1,0 -COC(=O)C1=C(C)NC(=C(C1C2=C(C=CC=C2)[N+]([O-])=O)C(=O)OC)C,0 -OC1=CC=C(C=C1)CC=C,0 -ClC1=CC(=CC=C1)Cl,0 -CC1=C(C=C(C=C1)[N+]([O-])=O)NO,0 -CC3(O)CCC4C2CCC1CC(=O)C(CC1(C)C2CCC34C)C=O,0 -CC1=C(C(=CC=C1)C)NC2=NC(=NC(=C2)Cl)SCC(=O)NCCO,0 -CCOC(=O)C1=C(C=CC=C1)N,0 -CCCC(O)=O,0 -NC3=NC(=C2N=C(O)[N](C1CC(O)C(CO)O1)C2=N3)O,0 -ClC1=CC(=C(N=C1)OC2=CC=C(C=C2)OC3=C(C=C(C=N3)Cl)Cl)Cl,0 -COC1=C(C=CC(=C1)CCC(C)=O)O,0 -NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)N,0 -NC(=O)C1=CC=C(C=C1)N,0 -CC=[N+](O)[O-],0 -OC(=O)CCC(=O)NC1=CC(=C(C=C1)Cl)Cl,0 -CCCC(C)(COC(N)=O)COC(=O)NC(C)C,0 -COC2=CC1=CC=C(C=C1C=C2)CCC(C)=O,0 -OC(=O)COC1=C(C=C(C(=C1)Cl)Cl)Cl,0 -OCCN(CCO)CCO,0 -OC(C1CC1)(C2=CC=C(C=C2)Cl)C3=CC=C(C=C3)Cl,0 -CC(=O)N(O)C1=CC=C(C=C1)Cl,0 -ClC1=C(C(=CC=C1)Cl)Cl,0 -CC(C)[N+](C)(CCOC(=O)C2C1=C(C=CC=C1)OC3=C2C=CC=C3)C(C)C,0 -ClC1=CC=C(C=C1)Cl,0 -COC1=C(C=CC(=C1)C=CC(O)=O)O,0 -CCCCCCC1=CC=C(C=C1)C2=CC=C(C=C2)C#N,0 -CCN1C=C(C(O)=O)C(=O)C2=C1C(=C(C(=C2)F)C3=CC=NC=C3)F,0 -CC1=CC=CO1,0 -OCC1OC(CC1O)N2C=C(CCCl)C(=O)NC2=O,0 -NC1=NC(=CC(=N1)Cl)Cl,0 -OC1=C(C=CC=C1)C(=O)OCC2=CC=CC=C2,0 -C2=NC=C1C=NN=CC1=C2,0 -FC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 -NC(=O)C1=C(C=CC=C1)C(N)=O,0 -CC(=O)NC1=CC=C(C=C1)CC2=CC=C(C=C2)N,0 -COC3=C1C(N(C(C2=CC=CC(=C12)C=C3)=O)C)=O,0 -CCCCOC(=O)C=C,0 -O=C1OCC=C1,0 -[O-][N+](=NC1=CC3=C(C=C1)C2=CC=CC=C2C3)C4=CC6=C(C=C4)C5=CC=CC=C5C6,0 -CC(CS)C1CCC(C)C(S)C1,0 -CC(=O)C1C(=O)OC(=CC1=O)C,0 -NC(=O)NN=CC(O)=O,0 -CCCCCCNC(=O)N1C=C(F)C(=O)NC1=O,0 -N#CCC#N,0 -CC(CCC(O)=O)C3CCC4C2CCC1CC(O)CCC1(C)C2CCC34C,0 -[O-][N+](=O)C1=C(C=CC=C1)C(F)(F)F,0 -COC1=C(C(=C(C(=C1Cl)Cl)[N+]([O-])=O)Cl)Cl,0 -CCCCN(N)CCCC,0 -CCOC(=O)OC(C1CC2CCN1CC2C=C)C4=C3C=C(C=CC3=NC=C4)OC,0 -BrC1=CC=C(C=C1)C2=CC=CC=C2,0 -ClCC(CCl)(CCl)CCl,0 -ClC1=CC=C(C=C1)C3=NC2=CC=CC=C2O3,0 -FC(F)(F)C(F)(F)C(Cl)Cl,0 -CN(C)CCN(CC1=CSC=C1)C2=NC=CC=C2,0 -CC1=C(C=C(C=C1)[N+]([O-])=O)N=[N+]([O-])C2=C(C=CC(=C2)[N+]([O-])=O)C,0 -O=C(C=CC=CC1=CC2=C(C=C1)OCO2)N3CCCCC3,0 -CC(O)CNCC(C)O,0 -CCN(CC)C1=CC(=C(C=C1)N=O)O,0 -COC1=CC=C(C=C1)OC,0 -NC1=CC(=C(C(=C1)C(O)=O)O)S(O)(=O)=O,0 -NC1=C(C=CC(=C1)S(O)(=O)=O)O,0 -CCOP(O)(OC1=CC(=C(C=C1)SC)C)=NC(C)C,0 -FC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 -CC(Br)C1=CC=CC=C1,0 -OCCN1CCNCC1,0 -COC1=CC=C(C=C1)C2=NOC(=C2C3=CC=C(C=C3)OC)CC(O)=O,0 -OC1=C(C=C(C=C1Cl)Cl)NC(=O)C2=C(C(=CC(=C2O)Cl)Cl)Cl,0 -[O-][N+](=O)C1=C(C=CC=C1)C=CC(=O)C2=CC=CC=C2,0 -OC(=O)C1=CC=CC=C1,0 -S=C(NC1CCCCC1)NC2CCCCC2,0 -OC1=C(C=C(C=C1Br)C#N)Br,0 -CC1(C)CC(C(O)=O)C(C)(C)N1O,0 -OC1=C(C(=CC(=C1)Cl)Cl)Cl,0 -CC13CCC(=O)CC1=C2CC2C4C3CCC6(C)C4C5CC5C67CCC(=O)O7,0 -CN2C(=O)CN=C(C1=CC=CC=C1)C3=C2C=CC(=C3)Cl,0 -CC5=CC4=C3C=CC2=C1C=CC=C(C1=CC=C2C3=CC=C4C=C5)C,0 -CCCCCOC(=O)C=C,0 -CCCCOC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,0 -CNC(O)=NO,0 -CC1=CC(=CC(=C1)C)C,0 -CNCC(O)C1=CC(=C(C=C1)O)O,0 -O2C1=CC=CC=C1N=C2C3=CC=CC=C3,0 -CCCCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCCC,0 -O=C1CN(CC2N1CCC3=C2C=CC=C3)C(=O)C4CCCCC4,0 -OCC1=CC=CC=C1,0 -CCN(CC)CC,0 -BrC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 -NC1=CC3=C(C=C1)C(=C2C=CC(C=C2O3)=N)C4=C(C=CC=C4)C(O)=O,0 -BrCC1=CC(=CC=C1)CBr,0 -OC1=C(C(=CC=C1)Cl)Cl,0 -CNCCO,0 -O=C(OC1CCCCC1)C2=C(C=CC=C2)C(=O)OC3CCCCC3,0 -CN(C)C(=O)C1=N[N](C(=N1)CNC(=O)CN)C2=C(C=C(C=C2)Cl)C(=O)C3=C(C=CC=C3)Cl,0 -CC(=C)C(=O)OCCCCCCOC(=O)C(C)=C,0 -CC(CCO)CCC=C(C)C,0 -CCSC(Cl)=O,0 -NC1=C(C(=CC(=C1)Cl)Cl)O,0 -ClN1C(=O)NC(=O)N(Cl)C1=O,0 -C[N+](C)(C)NCCC(O)=O,0 -ClC1=CC=C(C=C1)C(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl,0 -OC(=O)C2=NC1=CC=CC=C1C(=C2)O,0 -ClC2=C(Cl)C3(Cl)C1COS(=O)OCC1C2(Cl)C3(Cl)Cl,0 -OC2=CC1=NC=CC=C1C=C2,0 -CC(=O)C1=C(C=CC=C1)[N+]([O-])=O,0 -CCNS(=O)(=O)C1=CC=C(C=C1)C,0 -CC(Cl)(Cl)C(O)=O,0 -C1=CC=C(C=C1)C2=CC(=CC=C2)C3=CC=CC=C3,0 -COC1=C(C(=CC=C1Cl)Cl)C(O)=O,0 -CCOC(=O)C(C)=C,0 -NCCC1=C[NH]C=N1,0 -CC(COC(=O)C1=CC=CC=C1)(COC(=O)C2=CC=CC=C2)COC(=O)C3=CC=CC=C3,0 -OC(=O)C1=CC=C(C=C1)C(O)=O,0 -O=CC1=CC(=CC=C1)C2=CC=CC=C2,0 -NCCCCCCN,0 -CNCC(O)=O,0 -OC1=CC(=CC(=C1)O)O,0 -CC(=O)C1=CC3=C(C=C1)OC2(CC2)C3=O,0 -CC(=C)C(=O)OCC(C)(C)COC(=O)C(C)=C,0 -OC1=C(C(=C(C=C1[N+]([O-])=O)[N+]([O-])=O)O)[N+]([O-])=O,0 -CCC(C)C=O,0 -NC1=C(C=CC(=C1)C(F)(F)F)Cl,0 -CN(C)C,0 -CC(C)NC1=CC=CC=C1,0 -OC(=O)C1=CC=C(C=C1)N=NC2=CC(=C(C=C2)O)C(O)=O,0 -OC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)O,0 -CN(C)C1=CC=CC=C1,0 -ClC1=CC=NC=C1,0 -FC(Cl)(Cl)Cl,0 -CC1(C)SSCC(NC1=O)C(O)=O,0 -C2=CC1=CC5=C(C=C1C=C2)C4=CC=C3C=CC=CC3=C4C=C5,0 -CC1=CC=C(C=C1)C3=NC2=CC=CC=C2O3,0 -CCCCCCCOC1=C(C=CC=C1)NC(=O)OC(C)CN(CC)CC,0 -CC(CCC(O)=O)C3CCC4C2C(O)CC1CC(O)CCC1(C)C2CCC34C,0 -CCOP(=S)(OCC)OC1=CC2=C(C=C1)C(=C(Cl)C(=O)O2)C,0 -FC1=C(C(=C(C(=C1F)Cl)F)Cl)F,0 -COC1=CC=C(C=C1)CCl,0 -NC1=C(C(=CC=C1)[N+]([O-])=O)O,0 -O=C3CCC(N2C(=O)C1=C(C=CC=C1)C2=O)C(=O)N3,0 -NC(=N)C1=CC=CC=C1,0 -CC(=C)C1CC=C(C)C(=O)C1,0 -CN(C)C1=CC=C(C=C1)N=NC2=CN=CC=C2,0 -ClCC(=O)C1=CC=CC=C1,0 -NC(CCCCNCC(N)C(O)=O)C(O)=O,0 -OC(=O)CCC(O)=O,0 -CC34C=CC2=C1CCC(=O)CC1=CCC2C3CCC4O,0 -OC(=O)C1=CN=CC=C1,0 -CC1=CC=C(C=C1)C=O,0 -CC(=C)C1CC=C(C)C(O)C1,0 -C2CCCCCC1OC1CCCC2,0 -CC(C)CN,0 -CC(=O)C=CC1=CC=CO1,0 -CCC2=C1[NH]C=C(C1=CC=C2)CCO,0 -CC2CC(C)(C)C1=C(C=C(C(=C1)C(C)=O)C)C2(C)C,0 -CCCCCCCCCCCC(=O)N(CCO)CCO,0 -CNC(CC(O)=O)C(=O)N(C2C1SC(C)(C)C(N1C2=O)C(O)=O)C(C(N)=O)C3=CC=C(C=C3)O,0 -CC1(C)C(C=C(Cl)Cl)C1C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3,0 -NC2=NC(=C1[NH]C=NC1=N2)N,0 -OC1COC2C(COC12)O[N+]([O-])=O,0 -CC(C)CC(=O)OCC=C,0 -CCCC(=O)OC1CCCCC1,0 -COC3=CC(=C2C(=O)OC1=CC(=CC(=C1C2=C3)C)O)O,0 -ClC1=NC(=NC(=C1)Cl)Cl,0 -[O-][N+](=O)C1=C(C=CC=C1)NC2=CC=CC=C2,0 -OC(=O)C3CC1=C([NH]C2=CC=CC=C12)C(N3)C4=CC=CC=C4,0 -OCCC#N,0 -CC(C)CC(NC(=O)COC1=C(C=C(C(=C1)Cl)Cl)Cl)C(O)=O,0 -OC(=O)CCCC1=C[NH]C2=CC=CC=C12,0 -COP(=O)(OC)SC,0 -CCCCCCCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCCCCCC,0 -OCC1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O,0 -CN1CCCN(C)C1=O,0 -OC2(CCN(CCCC(=O)C1=CC=C(C=C1)F)CC2)C3=CC=C(C=C3)Cl,0 -ClC1=CC(=C(C=C1)C=O)Cl,0 -CC1=CC(=CC=C1)N,0 -CC1(C)C2CCC1(C)C(O)C2,0 -BrC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 -C=CCOC(=O)C=C,0 -CCCCCC=[N+](O)[O-],0 -CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC,0 -CS(O)(=O)=O,0 -O=C3C(=O)C1=C(C=CC2=CC=CC=C12)C4=C3C=CC=C4,0 -CC(C)=CC1C(C(O)=O)C1(C)C,0 -NC2=CC1=CC=CN=C1C=C2,0 -CCCCOCCOP(=O)(OCCOCCCC)OCCOCCCC,0 -OC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 -OCC1=CC(=CC=C1)[N+]([O-])=O,0 -NC1=CC=C(C=C1)S(=O)(=O)NC2=NC=CS2,0 -ON=CC(=O)NC1=CC=CC=C1,0 -CC(C=O)=CC=CC(C)=CC=CC=C(C)C=CC=C(C)C=CC1=C(C)CCCC1(C)C,0 -CC(C)C1=CC(=C(C=C1)C)O,0 -CC(=O)CCC(C)=O,0 -OC(=O)CC1=C[NH]C2=CC=C(O)C=C12,0 -CCCCC(CC)COC(=O)C(C#N)=C(C1=CC=CC=C1)C2=CC=CC=C2,0 -CC(=O)CC(=O)CCC(O)=O,0 -OC(=O)C=CC1=CC(=C(C=C1)O)O,0 -OC2=C1N=CC=CC1=C(C=C2I)Cl,0 -CC(C)(C)C(=O)C(OC1=CC=C(C=C1)Cl)[N]2C=CN=C2,0 -CC3=C2C=C1C=CC=CC1=CC2=CC=C3,0 -OC1OCC=C2OC(=O)C=C12,0 -CC3=C2C1=CC(=CC(=C1C(OC2=CC(=C3)O)=O)O)O,0 -CC(=C)C(=O)OCCOCCOC(=O)C(C)=C,0 -CCCCC(CC)C=O,0 -CCC2=CN(C1CC(O)C(CO)O1)C(=O)NC2=O,0 -NS(=O)(=O)C1=C(C=C2C(=C1)S(NCN2)(=O)=O)Cl,0 -CC(C)C1=C(C=C(C=C1)C)O,0 -ClC1=CC(=CN=C1)Cl,0 -CCC2NC(=O)C1=C(C=C(C(=C1)S(N)(=O)=O)Cl)N2,0 -CN(C)C1=CC=C(C=C1)C=CC=O,0 -CC(C)NCC(O)COC2=C1C=CC=CC1=CC=C2,0 -O=CC1=CC=CC=C1,0 -CC(C(O)=O)C1=CC=C(C=C1)OC2=NC=CS2,0 -ClC2=C(C1=CC=CC=C1C(=C2Cl)Cl)Cl,0 -CCNCC#CC(C)(C)OC(=O)C(O)(C1CCCCC1)C2=CC=CC=C2,0 -O=C(C=CC1=CC=C(C=C1)C2=CC=CC=C2)C3=CC=CC=C3,0 -COC2=CC1=C(C=CN=C1C=C2)C(O)C3CC4CCN3CC4C=C,0 -ClCC1=CC(=CC=C1)CCl,0 -CCN=C=S,0 -NC1CCC(N)CC1,0 -OC1=C(C=CC=C1)C2=C(C=CC=C2)O,0 -FCC(F)(F)F,0 -FC(F)(F)C1=CC=CC=C1,0 -OC2=C(C1=CC=C(C=C1C=C2)S(O)(=O)=O)N=NC3=CC=C(C=C3)S(O)(=O)=O,0 -CC(CCC=C(C)C)CC=O,0 -ClCCN(CCCl)CCCl,0 -ClCC1=CC=C(C=C1)Br,0 -CCCCCCCCC1CO1,0 -O=C1CCCO1,0 -ClC1=C(C3=C(C(=C1Cl)Cl)OC2=C(C(=C(C(=C2Cl)Cl)Cl)Cl)O3)Cl,0 -CCOC(=O)C(C)=O,0 -CCCCCCCCC,0 -O=C1C=CC(=O)N1C2=CC=C(C=C2)CC3=CC=C(C=C3)N4C(=O)C=CC4=O,0 -FC1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,0 -CCC1=CC=C(C=C1)C,0 -C2CC1OC1CCC3OC23,0 -CC1=CC(=CC=C1)Br,0 -CCSC(=O)N1CCCCCC1,0 -CN(C)CC1=CC=CC=C1,0 -CC1=CC(=CC=C1)C,0 -O(P(OC1=CC=CC=C1)OC2=CC=CC=C2)C3=CC=CC=C3,0 -ClC=CCl,0 -CSSC,0 -N#CC=CC#N,0 -CN3C(=O)C24CC1=CC=CC(O)C1N2C(=O)C3(CO)SS4,0 -OC(=O)C=CC=CC(O)=O,0 -C=CC(=O)N1CCN(CC1)C2=CC=CC=C2,0 -COC1=CC=C(C=C1)C=O,0 -ClC1=CC=C(C=C1)CSC2=CC=C(C=C2)Cl,0 -ClC1C(Cl)C(Cl)C(Cl)C(Cl)C1Cl,0 -CC1=C(SCCO1)C(=O)NC2=CC=CC=C2,0 -CCOC(=O)C(SP(=S)(OC)OC)C1=CC=CC=C1,0 -CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C,0 -CN3C(C(=O)NC1=NC=CC=C1)C(=O)C2=C(C=CS2)S3(=O)=O,0 -CCOP(=S)(OCC)SCSCC,0 -CCCCOCCOCCO,0 -COC1=CC=C(C=C1)CO,0 -OC3=C2C(=C1C(=CC=CC1=CC2=CC=C3)O)O,0 -CC1=C(C(=C(C(=C1C)[N+]([O-])=O)C(C)(C)C)[N+]([O-])=O)C,0 -CCCCCC(=O)OCC,0 -C[N]1C=CC=C1,0 -OC(C#N)C1=CC=CC=C1,0 -CC(O)C2C1SC(=C(N1C2=O)C(O)=O)C3CCCO3,0 -CCC(C)(C)C1=CC=C(C=C1)O,0 -OCC(O)C(O)C(O)C(O)CO,0 -ClC1=CC=C(C=C1)C=O,0 -FC1=C(C(=C(C(=C1F)F)Cl)F)F,0 -[O-][N+](=O)C1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,0 -O=C(NC1=CC=CC=C1)NC2=CC=CC=C2,0 -CC(C)(C)C2=CC(=CC=C1C=C(C(=O)C(=C1)C(C)(C)C)C(C)(C)C)C=C(C2=O)C(C)(C)C,0 -CCC1(CC(O)=O)OCCC2=C1[NH]C3=C(C=CC=C23)C(C)O,0 -O[N+]([O-])=C=CC1=CC=CO1,0 -CC(C)C1CC=C(C)C2CC=C(C)CC12,0 -[O-][N+](=O)C1=C(C=CC=C1)CBr,0 -CC1(C)C2CCC(=C)C1C2,0 -N#CC1=CC=CC=C1,0 -OS(=O)(=O)C1=C(C=CC=C1)[N+]([O-])=O,0 -CCCCC(CC)COC(=O)CCCCC(=O)OCC(CC)CCCC,0 -CC(=O)NC1=CC=C(C=C1)CC(O)=O,0 -CC4SC5=C(C(O)=O)C(=O)C1=C(C=C(C(=C1)F)N2CCN(CC2)CC3=C(C)OC(=O)O3)N45,0 -CCCCCCCCOC1=CC=C(C=C1)C(O)=O,0 -CN(C)C1=CC=C(C=C1)C(C2=CC=CC=C2)C3=CC=C(C=C3)N(C)C,0 -N#CC(C#N)=C(C#N)C#N,0 -CC1=CN=CC=C1,0 -[O-][N+](=O)C2=C1C=CC=CC1=C(C3=CC=CC=C23)[N+]([O-])=O,0 -CCOCCO,0 -CN(C(C)=O)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C(C)=O,0 -CC(C)CCCCCCCOC(=O)C(C)=C,0 -CCC(C(C)O)=[N+](O)[O-],0 -CCC34CCC1C(CCC2=CC(=O)CCC12)C3CCC4(O)C#C,0 -OCC2=C1C=CC=CC1=NC=C2,0 -OC2=CC1=CC=CN=C1C=C2,0 -NC1=C(C=CC=C1)C(=O)OCC=C,0 -NC1=NC=CC=C1,0 -CCCC=O,0 -CC(=O)CC(C)(C)NC(=O)C=C,0 -CCOP(=S)(OCC)SCCl,0 -ClC1=C(C(=CC=C1)C=O)Cl,0 -CCCCCCCCCCCCCCCCCCCC,0 -CC(=O)OCC=C(C)C=CC=C(C)C=CC1=C(C)CCCC1(C)C,0 -CC(C)COC(=O)CCCCC(=O)OCC(C)C,0 -OC(=O)C1=CC=C(C=C1)Cl,0 -CC(C)(N)C1CCC(C)(N)CC1,0 -CCCCCCCCCCCC(=O)OOC(=O)CCCCCCCCCCC,0 -CC1=C(C=C(C(=C1)C)S(O)(=O)=O)N=NC3=C(C2=CC=CC=C2C(=C3)S(O)(=O)=O)O,0 -COC2=CC=C1[NH]C=C(CCNC(C)=O)C1=C2,0 -CC(C)NC1=NC(=NC(=N1)Cl)NC(C)C,0 -CC(C)COC(=O)CC1=CC=CC=C1,0 -CC(=C)C(=O)OC(C)(C)C,0 -COC(C)(C)CC(C)=O,0 -CC1=C(C=C(C(=N1)O)C#N)C2=CC=NC=C2,0 -CCOP(=O)(OCC)OC(=CBr)C1=C(C=C(C=C1)Cl)Cl,0 -COC1=CC=C(C=C1)CN(C)N=O,0 -CCOP(=S)(OCC)SCSC(C)(C)C,0 -FC1=C(C=CC=C1)C2=CC=CC=C2,0 -ClC2=CC1=CC=CC=C1C=C2,0 -OC(=O)C1CSCN1,0 -OC1=NSC2=CC=CC=C12,0 -NC1=C(C(=CC=C1)[N+]([O-])=O)CO,0 -N#CC1=CC(=CC=C1)C#N,0 -CCOC(=O)CNC(=O)CCCCSC2=C1N=C[NH]C1=NC=N2,0 -CCOCCOC(=O)C=CC1=CC=C(C=C1)OC,0 -CCCCCCCCCC=C,0 -CC(=O)CC(C)(C)O,0 -CCNC1=NC(=NC(=N1)N)Cl,0 -CC(C)=CCCC(C)=CCO,0 -CCCCC(CC)COC(=O)CCCCCCCCC(=O)OCC(CC)CCCC,0 -CC1=CC=C(C=C1)CO,0 -CCC(C)(C)OC,0 -ClC1=C(C=CC=C1)Cl,0 -CCOC1=C(C=CC=C1)N,0 -OCC1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,0 -OCC1OC(CC1O)N2C=C(C=CBr)C(=O)NC2=O,0 -CC(=O)OC1=CC2=C(C=C1)C(=CC(=O)O2)CBr,0 -CCN(C(=O)N(CC)C1=CC=CC=C1)C2=CC=CC=C2,0 -CC(=O)NC1=CC=CC=C1,0 -CC1=CC(=CC=C1)OP(=O)(OC2=CC(=CC=C2)C)OC3=CC(=CC=C3)C,0 -CCNC(=O)NC1=CC(=C(C=C1)OCC(O)CNC(C)(C)C)C(C)=O,0 -OCC(COC(=O)C=C)(COC(=O)C=C)COC(=O)C=C,0 -ClC1=CC(=C(C(=C1)Cl)Cl)Cl,0 -CC(CCC(O)=O)C1CCC2C4C(CCC12C)C3(C)CCC(O)CC3CC4=O,0 -CCCCCCOC(=O)C(C)=C,0 -ClC1=CC=C(C=C1)N2C(=O)CCC2=O,0 -NC1=C(C=CC=C1O)C(O)=O,0 -CCCCOP(=O)(OCCCC)OCCCC,0 -C[N+]1=CC=C(C=C1)C2=CC=CC=C2,0 -CC(OC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 -[O-][N+](=O)C1=CC=C(C=C1)COC2=CC=CC=C2,0 -COC1=CC(=O)C=CC1=O,0 -CN(C)CCCN,0 -ON=CC1=CC=NC=C1,0 -OC(=O)CC1=CC(=CC=C1)[N+]([O-])=O,0 -CC1(C)C2CCC1(C)C(C)(O)C2,0 -C1=CC=C(C=C1)N(C2=CC=CC=C2)C3=CC=CC=C3,0 -CC(Br)(CCl)CBr,0 -COC1=CC(=C(C=C1)O)C(C)(C)C,0 -CCCCCNCCCCC,0 -OC1C(=O)C(=O)C1=O,0 -OCC1=CC=C(C=C1)C(F)(F)F,0 -OC2=C(C1=CC=CC=C1C=C2)N=NC4=C(C3=CC=CC=C3C=C4)S(O)(=O)=O,0 -CCOCC(O)=O,0 -CCC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,0 -CC(C)=C,0 -OC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,0 -COC1=C(C2=C(C(=C1)OC)C(=O)C3(O2)C(C)CC(=O)C=C3OC)Cl,0 -O[N+]([O-])=C,0 -CCCCN(CC)CC,0 -NC(CCC(=O)NC1=CC=C(C=C1)[N+]([O-])=O)C(O)=O,0 -COP(=O)(OC)N1CCOCC1,0 -CC1=C(C=C(C=C1O)[N+]([O-])=O)[N+]([O-])=O,0 -[NH]1C=CC2=CC=CC=C12,0 -CCCCOC(=O)C1=C(C=CC=C1)C(=O)OCC2=CC=CC=C2,0 -FC(F)(F)C1=CC(=CC=C1)Cl,0 -OC2=C1C(C5=C(OC1=CC=C2)C=C4OC3OC=CC3C4=C5O)=O,0 -CC(C)CC(C)N,0 -CC(O)CN1CC(C)OC1=O,0 -CC1=CC(=C(C=C1)N)S(O)(=O)=O,0 -CC1=CC=C(C=C1)NC(=O)CBr,0 -[NH]1C=NC2=CC=CC=C12,0 -CCCCCCC(=O)OCC,0 -C1=CC3=C(N=C1)C2=NC=CC=C2C=C3,0 -CC(=O)NC1=CC=C(C=C1)CC2=CC=C(C=C2)NC(C)=O,0 -CC1=CC(=CC=C1)C#N,0 -NN(C1=CC=CC=C1)C2=CC=CC=C2,0 -CN(C)C1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 -C=CN1CCCC1=O,0 -CC(C)CCCCCCCOP(=O)(OC1=CC=CC=C1)OC2=CC=CC=C2,0 -CC1=CC=C(C=C1)C(C)(C)C,0 -NC(=N)C1=CC=C(C=C1)C3=CC2=CC=C(C=C2[NH]3)C(N)=N,0 -CCCCC(CC)COC(=O)C1=C(C=CC=C1)C(O)=O,0 -CCN(CC)C(=O)NC1=CC(=C(C=C1)OCC(O)CNC(C)(C)C)C(C)=O,0 -CCCCCCCCCCCC=C,0 -S=C(NC1=CC=CC=C1)NC2=CC=CC=C2,0 -CCOC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,0 -CCCCCCCCCCCCCC=C,0 -OC(=O)C1=C(C=CC=C1)C(O)=O,0 -CC(=O)NC1=CC=C(C=C1)[N+]([O-])=O,0 -CN(C)[P+](O[N]1N=NC2=CC=CC=C12)(N(C)C)N(C)C,0 -CC(=C)C#N,0 -CCSCCC(N)C(O)=O,0 -CN(C)NC(=O)CCC(O)=O,0 -CSC(C)(C)C=NO,0 -CNC(=O)C1=CC(=CC=C1)NCC(=O)NCCC2=CC(=C(C=C2)OC)OC,0 -OC(=O)C1=CC=CO1,0 -ClC1=C(Cl)C(=O)C(=C(C#N)C1=O)C#N,0 -CC1=C(C=CC=C1)C#N,0 -CN(C)C(=S)N(C)C,0 -ClC1=CC(=O)C=CC1=O,0 -CCCCCCCCCC1=CC=C(C=C1)O,0 -CC([N]1C=CN=C1)=C(OCCOC2=CC=C(C=C2)Cl)C3=C(C=C(C=C3)Cl)Cl,0 -CC1=NC(=C(N=C1)C)C,0 -ONC1=CC=C(C=C1)Cl,0 -CC(CNC(=O)C1=CN=CC=C1)NC(=O)C2=CN=CC=C2,0 -CCOC(=O)CCl,0 -OC1=C(C=CC(=C1)Cl)Cl,0 -CC(C=CC(O)C1CC1)C2CCC3C(CCCC23C)=CC=C4CC(O)CC(O)C4=C,0 -CC1=C(N=CC=N1)C,0 -CCOC(=O)C1C(C=C(C)C)C1(C)C,0 -OC3N=C(C1=CC=CC=C1)C2=C(C=CC(=C2)Cl)NC3=O,0 -NCCS(O)(=O)=O,0 -CN1CCN(CC1)C3=CC=C2[NH]C(=NC2=C3)C5=CC=C4[NH]C(=NC4=C5)C6=CC=C(C=C6)O,0 -CC(CO)=[N+](O)[O-],0 -CC(C)NCC(O)COC3=C2C1=CC=CC=C1[NH]C2=CC=C3,0 -OCCOC(=O)C=C,0 -CC(C)(C)N(CCO)CCO,0 -C1CN=C(N1)C2=CC=C(C=C2)C4=CC3=CC=C(C=C3[NH]4)C5=NCCN5,0 -CCCCO,0 -CC1=C(C(=CC=C1)C)NC(=O)CN2CCCC2=O,0 -CCCCCOC1=CC(=CC=C1)NC(=O)OC2CCCCC2N3CCCC3,0 -CC(=O)NC1=CC(=CC=C1)C,0 -OC1=N[NH]C2=CC=CC=C12,0 -CCN(CC)C1=CC2=C(C=C1)C(=CC(O2)=O)C(F)(F)F,0 -CSCCC(NC=O)C(=O)NC(CC1=CC=CC=C1)C(O)=O,0 -CN(C)C1=CC=C(C=C1)C4CC2(C)C(CCC2(O)CCCO)C5CC=C3CC(=O)CCC3=C45,0 -[O-][N+](=O)C1=CC=C(C=C1)NC2=CC=C(C=C2)N=C=S,0 -CC1=CC(=C(C(=C1)CC2=C(C(=CC(=C2)C)C(C)(C)C)O)O)C(C)(C)C,0 -CC1SCC(NC1=O)C(=O)NC(CC2=C[NH]C=N2)C(=O)N3CCCC3C(N)=O,0 -CC(=O)NC1=CC=C(C=C1)OC2=CC=C(C=C2)NC(C)=O,0 -CON(C)C(=O)NC1=CC=C(C=C1)Br,0 -CC(=O)OC1=C(C=CC=C1)C(=O)OC2=C(C=CC=C2)C(O)=O,0 -CC1=CC(=C(C=C1)OP(=O)(OC2=C(C=C(C=C2)C)C)OC3=C(C=C(C=C3)C)C)C,0 -NC(=O)CN1CC(O)CC1=O,0 -CC(N)=S,0 -CCC1=NC=CN=C1,0 -CC(C)(S)C(=O)NC(CS)C(O)=O,0 -NN(CC1=CC=CC=C1)CC2=CC=CC=C2,0 -OC(=O)C(=O)NC1=CC(=CC=C1)C2=N[NH]N=N2,0 -OCCN1C(=O)N(CCO)C(=O)N(CCO)C1=O,0 -CC(=C)C1CCC(=CC1)C,0 -[O-][N+](=O)C1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0 -ClC1=CC(=CC=C1)C=O,0 -NC1=CC(=CC=C1)S(O)(=O)=O,0 -C1=CC=C(C=C1)C=CC2=CC=CC=C2,0 -O=C1OC(=O)C2=C1C=CC=C2,0 -COC(=O)C1=C(C=CC=C1)N,0 -OC(=O)C1CSCN1C(=O)C2CCC(=O)N2,0 -CNC(=O)N(C)C2=NC1=CC=CC=C1S2,0 -CCCCOC(=O)C1=C(C=CC=C1)C(=O)OC2CCCCC2,0 -COCCO,0 -CCCCCCCCCCCCC1CO1,0 -CNC(=O)NC,0 -COC1=CC=C(C=C1)NC2=CC=C(C=C2)OC,0 -[O-][N+](=O)C3=C2C=CC1=CC=CC=C1C2=CC4=CC=CC=C34,0 -CCCCOCC(O)=O,0 -NC1=C(C=CC=C1)Cl,0 -CN1CCNCC1,0 -COC(=O)CC(C)=O,0 -FC(F)(F)C(Cl)Br,0 -CCC(C)(C)C,0 -O=C(C=CC1=CC=CC=C1)C2=CC=C(C=C2)C3=CC=CC=C3,0 -CC(C)OC(C)=O,0 -CC3(C)C(C(=O)OC(C#N)C1=CC(=CC=C1)OC2=CC=CC=C2)C3(C)C,0 -CC(=O)C1=C2C(=CC(=C1)C(C)(C)C)C(CC2)(C)C,0 -NC2=C(C1=C(C=C(C=C1C=C2)S(O)(=O)=O)O)N=NC3=C(C=C(C=C3)[N+]([O-])=O)S(O)(=O)=O,0 -C1=NC=CN=C1,0 -[O-][N+](=O)C1=CC(=CC=C1)C(F)(F)F,0 -COC5=C1OC2C(C=CC3C4CC(=C1C23CCN4C)C=C5)O,0 -CC1=CC=CS1,0 -CC2CCC1C(OC(=O)C1=C)C3(C)C(=O)CC=C23,0 -OC1=C(C=CC=C1)[N+]([O-])=O,0 -NC1=CC(=C(C(=C1)Cl)Cl)Cl,0 -N(C1=CC=CC=C1)C3=C2C=CC=CC2=CC=C3,0 -OC1=C(C=C(C=C1)C2=CC=CC=C2)[N+]([O-])=O,0 -NC(=O)NNC(N)=O,0 -[O-][N+](=O)C1=C(C=CC(=C1)C(F)(F)F)Cl,0 -CCN(CC)C1=CC=C(C=C1)N=NC2=CC=CC=C2,0 -ON=C,0 -OC2=C1C=CC=CC1=NC=C2,0 -NCCN1CCNCC1,0 -O=C2C1=C(C=CC=C1)C3=C2C=CC=C3,0 -CC(C)(COC(=O)C=C)COC(=O)C=C,0 -CC(C)(Br)C(=O)NC1=CC=CC=C1,0 -CC(C)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C(O)=O,0 -CC(C)C1CCC(C)CC1OC(=O)C2=C(C=CC=C2)N,0 -OC1=C(C=C(C=C1Br)Br)C(=O)NC2=CC=C(C=C2)Br,0 -C1=CC=C(C=C1)P(C2=CC=CC=C2)C3=CC=CC=C3,0 -COC(=O)NC2=NC1=CC(=CC=C1[NH]2)SC3=CC=CC=C3,0 -O=NN(C1=CC=CC=C1)C2=CC=CC=C2,0 -O=C2NC1=C(CCC1)C(=O)N2C3CCCCC3,0 -NC1=C(C=CC=C1)C(=O)OCC=CC2=CC=CC=C2,0 -C1CSCCO1,0 -O=C(C=CC1=CC=CC=C1)C2=CC=CC=C2,0 -CC1=CC2=C(C(=C1)O)C(=O)C=C(C2=O)C3=C(C4=C(C=C3C)C(=O)C=CC4=O)O,0 -CC1=NN(C(=O)C1)C2=CC=CC=C2,0 -NC1=CC(=CC=C1)C(F)(F)F,0 -NC(=O)C1=CC=[N+](C=C1)COC[N+]2=C(C=CC=C2)C=NO,0 -NCC=C,0 -COP(=S)(OC)OC1=C(C=C(C(=N1)Cl)Cl)Cl,0 -CC1OCCC2=C1C=C3C(=C2)C(C(C3(C)C)C)(C)C,0 -NC1=CC(=C(C=C1)N)S(O)(=O)=O,0 -CCC1=C(C=CC=C1)O,0 -CCCCCC(=O)OCC=C,0 -CC1=C(C=C(C=C1)N=[N+]([O-])C2=CC(=C(C=C2)C)[N+]([O-])=O)[N+]([O-])=O,0 -NN2C(=O)C1=C(C=CC=C1)C2=O,0 -CC(=O)C1=NC=CC=C1,0 -COC4=C1C(C5=C(OC1=C3C2CCOC2OC3=C4)C=CC=C5O)=O,0 -CCOCN(C(=O)CCl)C1=C(C=CC=C1C)CC,0 -CC(N)=O,0 -OC(=O)COC1=CC=C(C=C1)Cl,0 -NC1=CC(=C(C=C1)Cl)Cl,0 -ClC1=CN=CC=C1,0 -O=C1CNC(=O)N1,0 -CCCC(O)C(CC)CO,0 -CC(=O)C1=C(C=CC(=C1)N)OCC(O)CNC(C)(C)C,0 -OC1(CCCCC1)C#N,0 -O=C(C1=CC=CC=C1)C(=O)C2=CC=CC=C2,0 -C=CC(=O)OCCOCCOCCOCCOC(=O)C=C,0 -CC(C)C=O,0 -[O-][N+](=O)C1=C(C=CC=C1)C2=CC=CC=C2,0 -CS(=O)C1=CC=C(C=C1)Cl,0 -OCC1OC(CC1O)N2CC(=O)C(=N)NC2=O,0 -OC(=O)C(Cl)(Cl)Cl,0 -CCC1=C(C=CC=C1)[N+]([O-])=O,0 -NC(=N)NC(N)=NCCC1=CC=CC=C1,0 -CC1=CC(C)(C)NC2=C1C=CC=C2,0 -COP(=S)(OC)SCC(=O)NCC=O,0 -CC(C)OC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 -CC(C)[N]2C1=CC=CC=C1C(=C2C=CC(O)CC(O)CC(O)=O)C3=CC=C(C=C3)F,0 -CCOC(C)(C)C,0 -CCCCCCCCCCCCC=C,0 -CCCCCCCCCC,0 -C1COCCOCCOCCOCCO1,0 -CC2=NC1=C(C=CC=C1)C2(C)C,0 -CCCCCCCCCC(O)=O,0 -CCC=O,0 -CCCCCCCCCC=CCC1CC(=O)OC1=O,0 -COC3=C(C=C2C1C(C5=C(OC1COC2=C3)C4=C(OC(C4)C(C)=C)C=C5)=O)OC,0 -COC1=CC(=O)C(=O)C(=C1)C(C)(C)C,0 -CC(=O)OCC(=O)NCCCOC1=CC(=CC=C1)CN2CCCCC2,0 -CC1=C(C=CC=C1)Br,0 -C[N+]1([O-])CCCC1C2=CN=CC=C2,0 -CC(C)NC(=O)NS(=O)(=O)C1=C(C=CN=C1)NC2=CC(=CC=C2)C,0 -CCNC3=C(C=C2C(=C1C=C(C(C=C1OC2=C3)=NCC)C)C4=C(C=CC=C4)C(=O)OCC)C,0 -O=C4C2=CC=C1N=C(SC1=C2C(=O)C5=CC=C3N=C(SC3=C45)C6=CC=CC=C6)C7=CC=CC=C7,0 -CC5=C2C1=CC=CC=C1C=CC2=C4C3OC3C(C(C4=C5)O)O,0 -CC(C)CC1NC(=O)CNC1=O,0 -OC2=CC1=CC=CC=C1N=C2,0 -CCOC(=O)C(CCC1=CC=CC=C1)NC(C)C(=O)N(CC(O)=O)C3CC2=C(C=CC=C2)C3,0 -CCCCN(CCO)CCCC,0 -ClNC1=NC(=NC(=N1)NCl)NCl,0 -CC1CN(CCN1)C3=C(C(=C2C(C(=CN(C2=C3)C4CC4)C(O)=O)=O)C)F,0 -OCC(O)CO,0 -CNC(=O)C1=CC=CC=C1,0 -CCC1=C(C=CC=C1)N,0 -OC(=O)C1=CC2=C(C=C1)C(=O)OC2=O,0 -CC(C)CC(C)NC1=CC=C(C=C1)NC2=CC=CC=C2,0 -O=C3OC2=C(C=C1C=COC1=C2)C=C3,0 -NC1=C(C=CC(=C1)Cl)Cl,0 -CCCCOC(=O)C=CC(=O)OCCCC,0 -CNNC,0 -O=C1C=CC(=O)C(=C1)C2=CC=CC=C2,0 -CC(N)CN,0 -CCOC2=C1N=CC=CC1=CC=C2,0 -CC1=C(C=CC=C1)C3=NC2=CC=CC=C2O3,0 -NC(N)=S,0 -BrCC1=CC=C(C=C1)CBr,0 -OC(=O)C(=O)C(O)=O,0 -OC(=O)C1=CC3=C(C(=C1)O)C(=O)C2=C(C=C(C=C2O)O)C3=O,0 -ClCC1=CC=NC=C1,0 -CC(N(C)C)C1=CC=CC=C1,0 -CC2COC1=C(C(=CC3=C1N2C=C(C(O)=O)C3=O)F)C4(N)CC4,0 -[O-][N+](=O)C1=CC=C(C=C1)NC2=CC=CC=C2,0 -O=C(OOC(=O)C1=CC=CC=C1)C2=CC=CC=C2,0 -CCC2=C1[NH]C3=C(C1=CC=C2)CCOC3(C)CC,0 -COC2=CC1=CC=C(C=C1C=C2)C(C)C(O)=O,0 -CN1C(CCC1=O)C2=CN=CC=C2,0 -CCCCCC=CC=CC=O,0 -COC1=C(C=CC(=C1)C3OC2=C(C(=CC(=C2)O)O)C(=O)C3=O)O,0 -COC(C)(C)C,0 -O=C2CCC1=C(C=CC=C1)O2,0 -CC=CC=CC(O)=O,0 -CCN(CC)S(=O)(=O)C1=CC=C(C=C1)N,0 -OCNC(=O)C=C,0 -CC(C)=CCCC(C)=CC=O,0 -CC2=NC1=CC=CC=C1N=C2,0 -CC(O)CCC(=O)C1=COC=C1,0 -CN(C)C(C)=O,0 -CN1CCOCC1,0 -CC(=C)OC(C)=O,0 -CCOC(=O)CC(C)=O,0 -OS(=O)(=O)C1=CC(=CC=C1)[N+]([O-])=O,0 -CSC(C)(C)C(=O)NC(CS)C(O)=O,0 -ClC1=NC(=NC(=N1)Cl)NC2=C(C=CC=C2)Cl,0 -CC1COC3=C2N1C=C(C(C2=CC(=C3N4CCN(C)CC4)F)=O)C(O)=O,0 -COC(=O)C(=CC1=CC=CO1)C#N,0 -CC(=C)C=C,0 -C1=CC=CC=C1,0 -CCCCC(CC)COCCCN,0 -[O-][N+](=O)C1=CC(=CC=C1)CBr,0 -CN(C)C=NC1=C(C=C(C=C1)Cl)C,0 -COC(=O)C1=C(C)NC(=C(C1C2=C(C=CC=C2)[N+]([O-])=O)C(=O)OCC(C)=O)C,0 -NCC1CCC(CC1)C(=O)C2=CC=C(C=C2)CCC(O)=O,0 -CCOC(=O)C1OC1C(=O)NC(CC(C)C)C(=O)NCCC(C)C,0 -CC1=CC(=O)OC2=C1C(=CC(=C2)O)O,0 -CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)C,0 -CC(=O)NC1=CC=C(C=C1)OC(=O)C2=C(C=CC=C2)OC(C)=O,0 -C1CCC2(CC1)CO2,0 -NC(=S)NCC=C,0 -CC(CCC(O)=O)C3CCC4C2CCC1CC(O)CCC1(C)C2CC(O)C34C,0 -CC(=O)NC1=CC=C(C=C1)S(=O)(=O)NC2=NC=CC=C2,0 -CCCCCC(C)(O)C=CC1C(O)CC(=O)C1CC=CCCCC(O)=O,0 -CC(=C)C1=CC=CC=C1,0 -O=CC=CC1=CC=CO1,0 -CCCCCCCCCCCCCCCCCC(O)=O,0 -CCCCCCCCCCCCCCCCN,0 -CCNC1=NC(=NC(=N1)Cl)NCC,0 -COP(=S)(OC)OC,0 -ClC1=C(C(=C(C(=C1)Cl)Cl)Cl)Cl,0 -CCCC=[N+](O)[O-],0 -CNC1=CC=CC=C1,0 -OC(=O)C=C,0 -CCCCCCCCCCCCCCCCCCN,0 -COC1=CC2=C(C=C1)C(=CC(=O)O2)CBr,0 -CCC#N,0 -CC=C1CC2CC1C=C2,0 -CC(C)C(C)C,0 -COCC(O)=O,0 -CNC(=O)NC1=CC=CC=C1,0 -O2C1=C(C=CC=C1)SC3=C2C=CC=C3,0 -C=CC(=O)OCCOC(=O)C=C,0 -CC1=CC=C(C=C1)S(=O)(=O)NC2CCCCC2,0 -CCC(C)NC1=CC=C(C=C1)NC(C)CC,0 -CC(C)OC(=O)C(C)(C)OC1=CC=C(C=C1)C(=O)C2=CC=C(C=C2)Cl,0 -OC1=CC(=C(C=C1)Cl)Cl,0 -CCNC2=C(C=C1C(=CC(OC1=C2)=O)C)C,0 -CCOP(=O)(OCC)OC(=CCl)C1=C(C=C(C=C1)Cl)Cl,0 -OC1=NC(=NC(=N1)Cl)Cl,0 -COC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 -COC1=C(C=C(C(=C1)S(O)(=O)=O)C)N=NC3=C2C=CC(=CC2=CC=C3O)S(O)(=O)=O,0 -CC(=O)CC(=O)NC1=CC=C(C=C1)C,0 -CCCCNCC,0 -NS(=O)(=O)C1=C(C=C(C(=C1)C(O)=O)NCC2=CC=CO2)Cl,0 -CC(C)NCC(O)COC1=CC=C(C=C1)NC(C)=O,0 -CC(F)(F)F,0 -CCCCCCCCC=O,0 -C1=CC=C(C=C1)C2=CC=CC=C2,0 -FC(F)(F)C1=C(C=CC=C1)Cl,0 -CC(C)CC(=O)CC(C)C,0 -CCCCCC(C=O)=CC1=CC=CC=C1,0 -CN(C)CC(O)=O,0 -CCOC(=O)CC(=O)CCl,0 -OC(=O)COC1=CC=CC=C1,0 -BrC1=CC(=CC=C1)C2=CC=CC=C2,0 -CC1=C(C=CC=C1)C,0 -CCC1=C4C(=C(C2=CC=CC=C12)C)C3=CC=CC=C3C=C4,0 -CC(C)CCCCCCOC(=O)CCCCC(=O)OCCCCCCC(C)C,0 -OC1=C(C=CC=C1)O,0 -NC1=C(C=CC=C1)C(=O)OC2CCCCC2,0 -C1CCNC1,0 -CCCCN(CCCC)CCCC,0 -CC(C)C2=C(C)N(C)N(C1=CC=CC=C1)C2=O,0 -C(SCC1=CC=CC=C1)C2=CC=CC=C2,0 -COC(=O)C1=CC=CO1,0 -OC1=C(C=C(C=C1I)C#N)[N+]([O-])=O,0 -COC1=C(C=C(C=C1)C=O)OC,0 -O=C2C(=O)C1=C(C=CC=C1)C3=C2C=CC=C3,0 -CCO,0 -CC(=O)N=C1C=CC(=O)C=C1,0 -CC(C)(C)OOC(C)(C)C1=CC(=CC=C1)C(C)(C)OOC(C)(C)C,0 -CSC1=CC=C(C=C1)Cl,0 -O=C2C1=C(C=CC=C1)C6=C4C2=CC=C5C3=CC=CC=C3C(C(=C45)C=C6)=O,0 -OC1=CC=C(C=C1)C2(OC(=O)C3=C2C=CC=C3)C4=CC=C(C=C4)O,0 -ClCC1=CC=C(C=C1)CCl,0 -S=C1SSC2=NCCN12,0 -CC(O)C(C)O,0 -NCCO,0 -CCNC1=NC(=NC(=N1)Cl)NC(C)C,0 -OC(=O)CCC(=O)NC1=CC=C(C=C1)Cl,0 -OCC1NC(CC2=C1[NH]C3=CC=CC=C23)C(O)=O,0 -COC(=O)C=C,0 -CC(C)NC1=CC=C(C=C1)NC2=CC=CC=C2,0 -CCCC(=O)OCCC(C)C,0 -COC(=O)C1=C(C)NC(=C(C1C2=CC(=CC=C2)[N+]([O-])=O)C(=O)OCC=CC3=CC=CC=C3)C,0 -CCN=[N+]([O-])CC,0 -CNC(=O)OC2=C1OC(CC1=CC=C2)(C)C,0 -CN(C)C1=CC=NC=C1,0 -CCCCCCCCCCCC(=O)NCCO,0 -CC(=C)C(O)=O,0 -CC1=CC(=CC(=C1)C)N=NC3=C2C=CC=CC2=CC=C3O,0 -CCCCCCCC1CCC(=O)O1,0 -NC1=CC(=C(C=C1)O)C(O)=O,0 -CCOP(=O)(C#N)N(C)C,0 -CC(C)(C)C1=C(C(=CC(=C1)C=CC2=CC(=C(C(=C2)C(C)(C)C)O)C(C)(C)C)C(C)(C)C)O,0 -NC1=C(C=C(C=C1Cl)Cl)Cl,0 -OC(=O)CS,0 -CC(C)COC(=O)C=C,0 -CC1(C)CC(N)CC(C)(CN)C1,0 -CC1=C(C=C(C=C1)NO)[N+]([O-])=O,0 -ClC(Cl)=C(Cl)C1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0 -CNC(=O)OC1=CC=CC=C1,0 -NC1=CC=C(C=C1)C=CC(O)=O,0 -OC2(O)C(=O)C1=C(C=CC=C1)C2=O,0 -CC1=N[N](C(=C1)C)C2=C4C(=C(N=N2)NN)C3=CC=CC=C3[NH]4,0 -NC1=NC(=NC(=N1)N)N,0 -CC1=C(C(=C(C=C1)C)C)C,0 -CC1=C(C(=C(C(=C1C)N)C)C)N,0 -CC(C)COC(=O)C1=C(C=CC=C1)N,0 -CCOC1=C(C=CC=C1)OCC2CNCCO2,0 -CC1=CC=C(C=C1)NC(N)=O,0 -OC(=O)CCl,0 -OC(=O)C1CSC(N1C(=O)CCS)C2=C(C=CC=C2)O,0 -CC2=NC1=CC=CC=C1S2,0 -[O-][N+](=O)C1=CC=C(C=C1)S(=O)(=O)NC2=NC=CC=C2,0 -CC1(C)CCCC(C)(C)N1O,0 -CCCCCCCCCCC=CC1CC(=O)OC1=O,0 -CCOP(=O)(OCC)OC1=C(C=C(C(=N1)Cl)Cl)Cl,0 -CC(O)C(O)=O,0 -NCCCCC(NC(CCC1=CC=CC=C1)C(O)=O)C(=O)N2CCCC2C(O)=O,0 -NC1=CC(=C(C=C1)C=CC2=C(C=C(C=C2)N)S(O)(=O)=O)S(O)(=O)=O,0 -C1CN(CCO1)SC3=NC2=CC=CC=C2S3,0 -CCCCOCCOC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 -CCOC(=O)C(CCC1=CC=CC=C1)NC(C)C(=O)N3C2CCCCC2CC3C(O)=O,0 -OC1=C(C=CC=C1)C=O,0 -ClC1=CN=C(C=C1)Cl,0 -CCC(=O)NC1=CC(=C(C=C1)Cl)Cl,0 -N#CCCNCCC#N,0 -COC(=O)C(C)(C)OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl,0 -CCCNCCC,0 -CCCCCCC(CC=CCCCCCCCC(=O)OC)OC(C)=O,0 -[O-][N+](=O)C1=C(C(=CC(=C1)C(F)(F)F)[N+]([O-])=O)Cl,0 -CCOC(=O)CC(SP(=O)(OC)SC)C(=O)OCC,0 -OCC3OC1C(OC2=NC(=N)C=CN12)C3O,0 -OC(C(COC(=O)CCC(O)=O)NC(=O)C(Cl)Cl)C1=CC=C(C=C1)[N+]([O-])=O,0 -CC(C)(C)C(=O)C2C(=O)C1=C(C=CC=C1)C2=O,0 -CC(=O)NS(=O)(=O)C1=CC=C(C=C1)N,0 -CC(=C)C(=O)OCCOC(=O)NNC(=O)OCCOC(=O)C(C)=C,0 -FC1=CC=C(C=C1)C(=O)CCCN2CCN(CC2)C3=NC=CC=C3,0 -CNCCS(O)(=O)=O,0 -[O-][N+](=O)C1=C(C=CC=C1)C#N,0 -CC=C(C)C#N,0 -OC(=O)C1=C(C=CC(=C1)N=NC2=CC=C(C=C2)S(=O)(=O)NC3=NC=CC=C3)O,0 -CCCCCCCCC1OC1CCCCCCCC(=O)OCC(CC)CCCC,0 -O=C(C1=CC=CC=C1)C2=CC=CC=C2,0 -BrCCCBr,0 -CC(=O)OC(C)(C)C3CC2=C(C=C1OC(C(=CC1=C2)C(C)(C)C=C)=O)O3,0 -OC1=C5C(=CC=C1)C4=CC3=C2C=CC=CC2=CC=C3N=C4C=C5,0 -CN3CCC14C5OC2=C1C(=CC=C2O)CC3C4C=CC5O,0 -NC1=C(C=CC=C1)C(F)(F)F,0 -CN(C)CCN(CC1=CC=C(S1)Cl)C2=NC=CC=C2,0 -C2COCCOC1=C(C=CC=C1)OCCOCCO2,0 -CC1CS1,0 -CC(CCC(O)=O)C3CCC4C2CCC1CC(O)CCC1(C)C2CC(=O)C34C,0 -OC1=C(C=C(C(=C1)Cl)O)Cl,0 -OCC(CO)NC1CC(O)(CO)C(O)C(O)C1O,0 -CC(=O)NC1=CC=C(C=C1)S(N)(=O)=O,0 -CCCCCCCCC1=CC=C(C=C1)NC2=CC=C(C=C2)CCCCCCCC,0 -CCOC(=O)C(=C)C#N,0 -CC1=CC(=O)C=CC1=O,0 -CC34CCC1C(CCC2=C1C=CC(=C2)O)C35CCC4(O)C(O)C5,0 -OC3C(O)C1=C(C=CC2=CC=CC=C12)C4=C3C=CC=C4,0 -CC(=C)C(=O)OCCCCOC(=O)C(C)=C,0 -OC(=O)C1=CC(=CC=C1)Cl,0 -OC(=O)C(Cl)CCl,0 -CNS(=O)(=O)C1=CC=C(C=C1)N,0 -CC(C)NC(C)C,0 -OC1=C(C(=C(C(=C1)Cl)Cl)Cl)Cl,0 -BrCC#N,0 -OCNC(=O)CCl,0 -CCCCCCCCC=CCCCCCCCC(O)=O,0 -CC1=C(C=C(C(=C1)N)S(O)(=O)=O)Cl,0 -OC1=CC=C(C=C1)[N+]([O-])=O,0 -NC(=O)NCC(O)=O,0 -CN1CCN(C)CC1,0 -CN(C)N=NC1=CC=C(C=C1)C(O)=O,0 -CC(OC1=C(C=C(C=C1)Cl)C)C(O)=O,0 -ClC2=C(N=C1C=CC=CC1=N2)Cl,0 -CN(C)CCN(C)C,0 -OC=O,0 -CCCCCCOC(=O)C=C,0 -COC1=C(OC)C(=O)C(=CC1=O)C,0 -COC(=O)C1=C(C2=C(C(=C1)OC)OCO2)C3=C(C=C(C4=C3OCO4)OC)C(=O)OC,0 -C1CC3=C2C1=CC=CC2=CC=C3,0 -OC(=O)C=CC1=CN=C[NH]1,0 -N(C1=CC=CC=C1)C3=CC2=CC=CC=C2C=C3,0 -CC(C)CC1=CC=C(C=C1)C(C)C(O)=O,0 -COC(=O)NC2=NC1=CC(=CC=C1[NH]2)C(=O)C3=CC=C(C=C3)F,0 -OC(=O)C1=C(C=CC=C1)NC2=CC(=CC=C2)C(F)(F)F,0 -ClC1=CC=C(C=C1)C(=C(Cl)Cl)C2=CC=C(C=C2)Cl,0 -CC(C)N,0 -OCC1CCCO1,0 -CC(O)C(C)=O,0 -CC2C(C)(C)C1=C(C(=O)CCC1)C2(C)C,0 -CC2C(C)(C)C1=C(C=C(C(=C1)C)C(C)=O)C2(C)C,0 -CCCCCC,0 -CCCSSCC=C,0 -C[N]2C(=NC3=NC1=CC=NC=C1C=C23)N,0 -NC1=CC=C(C=C1)S(N)(=O)=O,0 -NC1=C(C(=CC(=C1)Cl)S(O)(=O)=O)O,0 -ClC1=CC=CC=C1,0 -COC(=O)C1=CC=CC=C1,0 -CC4=C2C1=CC=CC=C1C=CC2=C3CCCC3=C4,0 -CCNCC,0 -CCC(C1=CC=C(C=C1)O)=C(CC)C2=CC=C(C=C2)O,0 -CC(=O)NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)NC(C)=O,0 -COC(=O)CCl,0 -CC(=C)C(C)=O,0 -CC(C)OC1=CC=C(C=C1)NC2=CC=CC=C2,0 -CC1=CC(=O)C(=CC1=O)C,0 -O=C3N2CC1=C(C=CC=C1)C(=O)N2CC4=C3C=CC=C4,0 -CCCCCCCCOC(=O)C(C)=C,0 -CC(C)OC(=O)CCl,0 -CC(C)(O)C#N,0 -CC1=C(C=CC(=C1)Cl)OCC(O)=O,0 -CC(C)NCC(O)COC2=C1OCC(CC1=CC=C2)O,0 -[O-][N+](=O)C1=CC=C(C=C1)CNC3=C2[NH]C=NC2=NC=N3,0 -CC(=O)OC(C)=O,0 -CC(C)(C)CBr,0 -OC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 -NC1=C(N=CC(=C1)C2=CC=NC=C2)O,0 -CC1=CC(=C(C(=C1)C(C)(C)C)O)C(C)(C)C,0 -BrCC1=C(C=CC=C1)CBr,0 -CC(C)OP(C)(F)=O,0 -O=C1C(=O)C4=C3C2=C1C=CC=C2C=CC3=CC=C4,0 -CC(C)(C)CC(C)(S)CC(C)(C)C,0 -C=CCOC(=O)C1=C(C=CC=C1)C(=O)OCC=C,0 -OC1=CC2=C(C(=C1)O)C(=O)C=C(O2)C3=CC(=C(C=C3)O)O,0 -OCC1OC(CC1O)[N]2C=NC3=C2N=C[N]4C=CN=C34,0 -CN(C)P(=O)(N(C)C)N(C)C,0 -CC(=O)NC2=CC1=CC=CC=C1N=C2,0 -CC(O)C1=CC=CC=C1,0 -[O-][N+](=O)C1=CC=C(C=C1)C#N,0 -NCCNCCN,0 -CC(CC(O)=O)C(O)=O,0 -CCCCCCCCCCCCOCC1CO1,0 -OCC1=CC=CO1,0 -CCC=CCCC=CC=O,0 -CN1CCC(=CC1)C2=CC=CC=C2,0 -ClCC#N,0 -OC(=O)C(F)(F)C(F)(Cl)C(F)(F)C(F)(Cl)C(F)(F)C(F)(Cl)C(F)(F)Cl,0 -COCCCN,0 -N2C1=C(C=CC=C1)SC3=C2C=CC=C3,0 -CC3(C)SC2C(NC(=O)C(N)C1=CC=CC=C1)C(=O)N2C3C(O)=O,0 -CC(C)(C)[N+]([O-])=O,0 -CC(C)C(O)CCC(C)C1CCC2C(CCCC12C)=CC=C3CC(O)CC(O)C3=C,0 -OC(=O)CC1=C(C=CC=C1)Cl,0 -OC2=CC1=CC=C(C=C1C=C2)SSC4=CC3=CC=C(C=C3C=C4)O,0 -CC(=O)OCC1=CC2=C(C=C1)OCO2,0 -CN(C)C#N,0 -CCCCC(CC)COC(=O)C1=CC=C(C=C1)C(=O)OCC(CC)CCCC,0 -O=C1CCC(=O)O1,0 -COC(=O)C1=CC=C(C=C1)C=O,0 -CC(=O)C=CC1=CC2=C(C=C1)OCO2,0 -COC1=CC(=CC=C1)[N+]([O-])=O,0 -OCC1OC(C(O)C1O)[N]4C=NC5=C(NCC(O)COC3=C2C=CC=CC2=CC=C3)N=CN=C45,0 -C1=CC=C(C=C1)C(C2=CC=CC=C2)C3=CC=CC=C3,0 -CC1=CCC(CC1)C(C)(C)O,0 -COC1=C(C=C(C=C1)C(=O)N2CCN(CC2)C3=CC4=C(C=C3)NC(=O)CC4)OC,0 -NC(=N)C1=CC=C(C=C1)OCCCCCOC2=CC=C(C=C2)C(N)=N,0 -OCC1=C(C=CC=C1)[N+]([O-])=O,0 -CC(=O)NC3=C(C=C2C1=CC=CC=C1CC2=C3)O,0 -CC(=O)C1=C(C=CC(=C1)NC(=O)NC(C)(C)C)OCC(O)CNC(C)(C)C,0 -BrCC(=O)NC1=CC=CC=C1,0 -C2CC=CCCC1OC1CCC=C2,0 -CC(=O)NC1=CC(=CC=C1)O,0 -C=CCNCC=C,0 -C[N]1C=NC2=C1C(N(C(N2C)=O)C)=O,0 -ClC1=C(C=C(C=C1)C=O)Cl,0 -CC(C)NCC(O)COC2=C1OCC(CC1=CC=C2)O[N+]([O-])=O,0 -CC=NN(C)C=O,0 -CC2=C(C=C1C=CC=CC1=C2)[N+]([O-])=O,0 -CC(C)(C)C1=C(C(=CC(=C1)CC2=CC(=C(C(=C2)C(C)(C)C)O)C(C)(C)C)C(C)(C)C)O,0 -C1CN(CCN1)C2=CC=CC=C2,0 -FC1=NC(=CC=C1)F,0 -CCCCCCCCCCCCCCC1CO1,0 -ClC1=CC(=C(C=C1)Cl)Cl,0 -C1CNCCN1,0 -CC=C1CC(C)C(O)(CO)C(=O)OCC2=CC[N+]3([O-])CCC(OC1=O)C23,0 -CC1=C(C=CC=C1)Cl,0 -CCC1=C4C(=C(C2=CC=CC=C12)CC)C3=CC=CC=C3C=C4,0 -CCSCCOP(=S)(OC)OC,0 -CCOC(=O)C(Cl)C(C)=O,0 -CC2=C1C=CC=CC1=C3C(=C2)C4=C(C=C3)C(O)C(O)C5OC45,0 -NC1=CC=C(C=C1)Br,0 -C1COCCOCCOCCO1,0 -O=C1CCCCCN1,0 -[O-][N+](=O)C1=C(C(=C(C(=C1)Cl)Cl)Cl)Cl,0 -OCC1OC(C(O)C1O)N2CC(=O)C(=N)NC2=O,0 -OCCCC1=CC=CC=C1,0 -CC1=NC(=NC(=C1)C)SC(=O)OC(C)(C)C,0 -OC(=O)C=CC1=CC=CC=C1,0 -CCOP(=O)(OCC)OC1=NOC(=C1)C2=CC=CC=C2,0 -CC(O)=O,0 -N#CCC1=CC=CC=C1,0 -CC1(C)N(Cl)C(=O)N(Cl)C1=O,0 -CCC(C)=O,0 -OC1=C(C(=C(C(=C1Br)Br)Br)Br)Br,0 -CCN(CC)C1=CC2=C(C=C1)C(=CC(=O)O2)C,0 -NCCCNCCCN,0 -CCOC1=C(C=CC(=C1)C=O)O,0 -CN1N(C(=O)C=C1C)C2=CC=CC=C2,0 -COC1=C(C=C(C(=C1)OC)C=O)OC,0 -CCCNC(=O)NS(=O)(=O)C1=CC=C(C=C1)Cl,0 -CC(NC(=O)COC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 -C[N]2C(=NC3=NC1=CC=CN=C1C=C23)N,0 -OS(=O)(=O)C2=C1N=CC=CC1=CC=C2,0 -CC1=NC2=C(C=N1)CCC2,0 -CN(C1CCN(CC1)C3=NC2=CC=CC=C2[N]3CC4=CC=C(C=C4)F)C5=NC(=CC=N5)O,0 -OC1=CC=C(C=C1)C3CC(=O)C2=C(C=C(C=C2O)O)O3,0 -CC(=O)C(=O)C1=CC=CC=C1,0 -O=C(CN1C(=O)SC2=C1C=CC=C2)OCC3=CC=CC=C3,0 -ClC1=C(Cl)C(Cl)(Cl)C(=C1Cl)Cl,0 -BrCC(=O)C1=CC=CC=C1,0 -CCCCCCC=O,0 -O2C1=CC=CC=C1C3=CC=CC=C23,0 -CC1=CC=C(O1)C=O,0 -C2CCCC1OC1CC2,0 -C1COCCN1,0 -OC2=NC1=CC=CC=C1O2,0 -NC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=CC=C3,0 -O=CNC1=CC=CC=C1,0 -CCSCCSP(=S)(OC)OC,0 -COP(O)(SC)=NC(C)=O,0 -CC(C)(C)OOC(C)(C)CCC(C)(C)OOC(C)(C)C,0 -CC1=C(C=C(C=C1)Cl)[N+]([O-])=O,0 -CCOC(=O)C1OC1(C)C2=CC=CC=C2,0 -COC(=O)CCC(=O)OC,0 -CCCCCCCOC1=C(C=CC=C1)NC(=O)OCCN2CCCCC2,0 -CC(=C)C1=C(C=C(C(=C1)O)C)O,0 -O1C=CC2=CC=CC=C12,0 -CC(=O)C1=CC=CC=C1,0 -CCCCSCCC(N)C(O)=O,0 -OCC1=CC=C(C=C1)[N+]([O-])=O,0 -CC(C)(C)OC(=O)ON=C(C#N)C1=CC=CC=C1,0 -CCCOC(=O)C(C)=C,0 -CC(=O)[N]1C=CN=C1,0 -OC(=O)C2=NC1=C(C=CC=C1C(=C2)O)O,0 -ON=CC=NO,0 -N#CCCC#N,0 -NC1=CC=C(C=C1)S(O)(=O)=O,0 -OC2=C1C=C(C(OC1=CC=C2)=O)C4CCC3=C(C=CC=C3)C4,0 -CC1=CC(=O)OC2=C1C=CC(=C2)N,0 -CC(=O)NC1=C(C3=C(C=C1)C2=CC=CC=C2C3)O,0 -CC(O)CN(CCN(CC(C)O)CC(C)O)CC(C)O,0 -CCCCOCCOCCOCC2=C(C=C1OCOC1=C2)CCC,0 -CC(=O)OC1=CC=C(C=C1)CO,0 -CO,0 -COCCOCCOC,0 -CCC(=O)C(C)=O,0 -CC1(C)CC(C(N)=O)C(C)(C)N1O,0 -CC1=C(C=CC(=C1)Cl)OCCCC(O)=O,0 -O=C1OC(=O)C=C1,0 -CCCCC(CC)CN,0 -CC(C)C1=CC3=C(C=C1)OC2=C(C=C(C(=N2)N)C(O)=O)C3=O,0 -FC(F)(F)C1=CC=C(C=C1)Cl,0 -CC1=NN=C(S1)NS(=O)(=O)C2=CC=C(C=C2)N,0 -CCN(CC)S(=O)(=O)C1=CC=C(C=C1)NC(C)=O,0 -OC1=CC2=C(C=C1)OCO2,0 -CCC(C)C(C)CO,0 -OC1(O)C(=O)NC(=O)NC1=O,0 -NC(CC(O)=O)C(O)=O,0 -CC(C)OC(=O)C(C)=C,0 -COC1=C(C=CC(=C1)C=C)O,0 -CCCCCCCCCCC,0 -CC(=O)OC1=C(C=CC=C1)C(O)=O,0 -CCCCOC(=O)C1=C(C=CC=C1)N,0 -CC3=C(C2=C1C=CC=CC1=CC=C2C=C3)C,0 -NC(=O)C1=CN=CC=C1,0 -CC2(C)C3CCC1(CO1)C2C3,0 -BrC1=CC=CC=C1,0 -CCCCCCCCCCCCCC(O)=O,0 -NC(C#N)C(=N)C#N,0 -ClC2=NC1=CC=CC=C1C=C2,0 -OC1=CC(=C(C=C1)N=NC2=CC=C(C=C2)[N+]([O-])=O)O,0 -O=C4C=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C4=O,0 -CC1=CC=C(C=C1)C(=O)C2=CC(=C(C(=C2)O)O)[N+]([O-])=O,0 -CN(C)C1=CC=C(C=C1)C4CC2(C)C(CCC2(O)C=CCO)C5CC=C3CC(=O)CCC3=C45,0 -CCCC(C1=C(C=C(C(=C1)C(C)(C)C)O)C)C2=C(C=C(C(=C2)C(C)(C)C)O)C,0 -CN(C)CCO,0 -OC1=C(C=C(C=C1)Cl)Cl,0 -OC(=O)C2=C1N=CC=CC1=CC=C2,0 -C1=CC=NC=C1,0 -ON=CC1=NC=CC=C1,0 -OCCOC1=C(C=C(C(=C1)Cl)Cl)Cl,0 -OCCO,0 -OS(=O)(=O)C1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,0 -OC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,0 -CCN(CC)C(=O)CC1=CC=CC=C1,0 -OC1COC(O)(CN(CC(O)=O)N=O)C(O)C1O,0 -C[N+]1=CC=C(C=C1)C2=CC=[N+](C=C2)C,0 -COC4=C1C5=C(C(OC1=C3C2CCOC2OC3=C4)=O)C(OCC5)=O,0 -CC(C)CCCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCCC(C)C,0 -CC(=O)OCC1=CC=CC=C1,0 -OC2=CC=C1[NH]C=CC1=C2,0 -CC(Br)Br,0 -COC(=O)C1=C(C)NC(=C(C1C2=C(C(=CC=C2)Cl)Cl)C(=O)OC(C)C)COC(N)=O,0 -OCC(CO)(CO)CO,0 -OC1=CC(=CC(=C1)Cl)Cl,0 -CC1=C(C=C(C=C1)N)Cl,0 -CCCCCCCCCCOC(=O)C(C)=C,0 -COC1=CC(=CC(=C1)OC2=C(C=C(C=C2)Cl)Cl)[N+]([O-])=O,0 -ClC1=CC=C(C=C1)NC(=O)NC2=CC(=C(C=C2)Cl)Cl,0 -C=CC1CCC=CC1,0 -NCCC1=C[NH]C2=CC=C(O)C=C12,0 -COC1=C(C=CC(=C1)C=O)O,0 -COP(=O)(OC)OC(=CCl)C1=C(C=C(C(=C1)Cl)Cl)Cl,0 -CC(C=O)=CC1=CC=CC=C1,0 -CC(C)C1=CC3=C(C=C1)C2=CC=CC(=C2C=C3)C,0 -OC1=CC=C(C=C1)C2(CCCCC2)C3=CC=C(C=C3)O,0 -COC(=CC(O)=O)C(=O)C(C)=C,0 -C=CC(=O)OCCOCCOC(=O)C=C,0 -C=CC(=O)OCCCCCCOC(=O)C=C,0 -OCC=O,0 -CN(C)C=O,0 -COC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=CC5=C3C4CCOC4O5)OC,0 -CC(C)CCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCC(C)C,0 -C1COCCOCCOCCOCCOCCO1,0 -CC1CCCC(C)N1CCCC(O)(C2=CC=CC=C2)C3=NC=CC=C3,0 -CC(C)COC(=O)C1=C(C=CC=C1)C(=O)OCC(C)C,0 -CCCCCCCCCCCCCl,0 -CNC(=O)N(C1=CC=CC=C1)C2=CC=CC=C2,0 -CCCCCC(O)=O,0 -CCCCC(CC)COP(OCC(CC)CCCC)OCC(CC)CCCC,0 -OC2=NC1=CC=CC=C1C=C2,0 -OC1=C(C(=C(C=C1)Cl)Cl)Cl,0 -OCC1=CC=C(C=C1)Br,0 -CC1=NC=CC=C1,0 -COC1=C(C2=C(C=C1O)OC(=CC2=O)C3=CC=C(C=C3)O)O,0 -CC(C)NCC(O)COC1=C(C=CC=C1)OCC=C,0 -CCCCCC1=CC(=CC(=C1)O)O,0 -C=CC(=O)OCCCCCOC(=O)C=C,0 -CC(=O)C(C)=NO,0 -CCC1(CC(O)=O)OCCC2=C1[N](C3=CC=CC=C23)C,0 -COC3=C1C=COC1=NC4=C(O)C2=C(OCO2)C(=C34)CC=C(C)C,0 -COC3=C(C=C2C16CCN7CC5=CCOC4C(C1N(C2=C3)C(C4)=O)C5CC67)OC,0 -OC(=O)COC2=CC1=CC=CC=C1C=C2,0 -CCC=CC#N,0 -CC1=C(C=CC(=C1C)N)N,0 -OC1=C2C=CC3=CC=CC4=CC=C(C=N1)C2=C34,0 -CNCC1=CC=C(O1)CSCCNC(NS(C)(=O)=O)=NCC(O)C2=CC=C(C=C2)O,0 -CNNCC1=CC=C(C=C1)C(=O)NC(C)C,0 -CC1=CC=C(C=C1)N(CCCl)CCCl,0 -CN(C)S(=O)(=O)N(SC(F)(Cl)Cl)C1=CC=CC=C1,0 -OCCNCCO,0 -CC(C)(C)C1CCC2(CC1)CO2,0 -COC(F)(F)C(Cl)Cl,0 -OC2=C1N=CC=CC1=C(C=C2Cl)Cl,0 -CCCCC=O,0 -CC(=O)C=CC1=C(C)CCCC1(C)C,0 -CC1=C(C=C(C=C1)S(O)(=O)=O)C,0 -CCC2=C1OC(=CC1=CC=C2)C(O)CNC(C)(C)C,0 -CC(C)=CCCC(C)(OC(=O)C1=C(C=CC=C1)N)C=C,0 -CC4=C3N=C2C1=CC=CC=C1C=CC2=CC3=CC=C4,0 -ClCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,0 -OC1=CC=C(C=C1)C3=COC2=C(C=CC(=C2)O)C3=O,0 -O=C1NC(=O)C(N1)(C2=CC=CC=C2)C3=CC=CC=C3,0 -CCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCC,0 -[NH]1C=CC=C1,0 -CCC1=C(C(=CC(=C1)N)C)CC2=C(C=C(C=C2C)N)CC,0 -OCC#N,0 -CC(=O)CC(C)=O,0 -OC(=O)CC1=C[NH]C2=CC=CC=C12,0 -O=C2CN(CCCN1CC(=O)NC(=O)C1)CC(=O)N2,0 -CC(C)C2=CC=C(C)C1=C(C=C(C)C1=C2)S(O)(=O)=O,0 -CC(=O)C1=C(C(=C(C(=C1C)[N+]([O-])=O)C(C)(C)C)[N+]([O-])=O)C,0 -ClCC1(CCl)C2CC(Cl)(Cl)C1(CCl)C(Cl)C2Cl,0 -ClC1=C(C(=C(C=C1)Cl)Cl)Cl,0 -COC1=C(C=CC=C1)O,0 -FC(F)(F)C1=CC=C(C=C1)CCl,0 -OC(=O)CCC1=CC=CC=C1,0 -COC4=CC2C3CC1=C(C(=C(C=C1)OC)O)C2(CCN3C)CC4=O,0 -OC2=C(C1=CC=CC=C1C=C2)N=O,0 -COC3=CC=C2C1=C(C(=NCC1)C)[NH]C2=C3,0 -CNC1=C(C=CC=C1)C(=O)OC,0 -OC(=O)CCCOC1=C(C=C(C=C1)Cl)Cl,0 -ClC(Cl)C(C1=CC=C(C=C1)Cl)C2=C(C=CC=C2)Cl,0 -CCCCC(CC)CO,0 -CC(C)=CCCC(C)(O)C=C,0 -CC(C)(C)C(Br)C(=O)NC1=CC=CC=C1,0 -OS(=O)(=O)C1=CC=C(C=C1)[N+]([O-])=O,0 -CS(=O)(=O)C1=CC=C(C=C1)Cl,0 -CCC2=C1[NH]C3=C(C1=CC=C2)CCOC3(CC)CC(O)=O,0 -CCCCOC(=O)CC(CC(=O)OCCCC)(OC(C)=O)C(=O)OCCCC,0 -CC(=O)C1(CCNCC1)C2=CC=CC=C2,0 -CCN(CC)C(=S)SSC(=S)N(CC)CC,0 -NC1=CC=C(C=C1)C(O)=O,0 -CC(C(O)=O)C1=CC(=CC=C1)C(=O)C2=CC=CC=C2,0 -ClC1=C(C=CC=C1)C=C,0 -CN(C)C(=N)N(C)C,0 -CC4=C(COC(=O)C1N3C(SC1(C)C)C(NC(=O)C(N)C2=CC=CC=C2)C3=O)OC(=O)O4,0 -N#CSCSC#N,0 -OC(=O)C1=C(C=CC(=C1)Cl)Cl,0 -CCCCC(CC)COC(=O)C=C,0 -OC(=O)CCCCC(O)=O,0 -BrCC(=O)C1=CC=C(C=C1)Br,0 -C2CCC1=C(C=CC=C1)C2,0 -CCC(C1=CC=CC=C1)=C(C2=CC=CC=C2)C3=CC=C(C=C3)OCCN(C)C,0 -CC(=C)C1CCC(=CC1)C=O,0 -OC(C(F)(F)F)C(F)(F)F,0 -CC(C)CC=O,0 -ClC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,0 -CC1(CO1)C=C,0 -CC(C)CCC(C)NC1=CC=C(C=C1)NC(C)CCC(C)C,0 -COC(C)=O,0 -CC(C)(C)N,0 -CNC,0 -CC1=CC(O)C2CC1C2(C)C,0 -CN(C)C(=O)NC1=CC=C(C=C1)Cl,0 -CCOP(=O)(OCC)OCC,0 -CC(OC1=C(C=C(C(=C1)Cl)Cl)Cl)C(O)=O,0 -NC1=NC(=O)N(C=C1)C2OC(COP(O)(O)=O)C(O)C2O,0 -CC(C)O,0 -CC1=CC(=O)CC(C)(C)C1,0 -CCCN(CCC)S(=O)(=O)C1=CC=C(C=C1)C(O)=O,0 -OC(=O)C1=C(C=CC=C1Cl)Cl,0 -CC1=CC=C(C=C1)C,0 -CCCO,0 -S1C=CC=C1,0 -O=S1(=O)CC=CC1,0 -NC1=C(C(=CC(=C1)[N+]([O-])=O)S(O)(=O)=O)O,0 -CC(=O)OC2C1OC(=O)C(OC(C)=O)C1OC2=O,0 -ClCC1=CC=C(C=C1)C#N,0 -OC(=O)CN(CCN(CC(O)=O)CC(O)=O)CC(O)=O,0 -CCCCCCCCC=C,0 -ClC2=C(C=C1OC3=C(OC1=C2)C=C(Cl)C(=C3)Cl)Cl,0 -OC1=CC=C(C=C1)C2(NC(=O)NC2=O)C3=CC=CC=C3,0 -C1=CC=C(C=C1)C2=C(C=CC=C2)C3=CC=CC=C3,0 -CC1=CC=C(C=C1)CCl,0 -O=C([N]1C=CN=C1)[N]2C=CN=C2,0 -CC(=O)CC(=O)NC1=CC=CC=C1,0 -[O-][N+](=O)C1=CC=C(C=C1)[N]2N=C(N=[N+]2C3=CC=C(C=C3)I)C4=CC=CC=C4,0 -CCC(C)C1=C(C=CC=C1)O,0 -C1CN2CCN1CC2,0 -COP(=O)(OC)OC(=CBr)C1=C(C=C(C=C1)Cl)Cl,0 -CC(O)COCC(C)O,0 -COP(=S)(OC)OC1=CC(=C(C=C1)[N+]([O-])=O)C,0 -CCCCCCCCCCCC(O)=O,0 -NC(=O)C1=CC=CC=C1,0 -CC(=O)CCl,0 -NC(CC1=CC=C(C=C1)F)C(O)=O,0 -COC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 -ClC2=C1C=CC=CC1=CN=N2,0 -CCC1=CC=CC=C1,0 -COC1=C(C=CC(=C1)C=CC(=O)CC(=O)C=CC2=CC(=C(C=C2)O)OC)O,0 -CC(=O)NNC(=O)C1=NC=CC=C1,0 -COC2=C(C=C1[NH]C=C(C1=C2)CCNC(C)=O)O,0 -BrCC(Br)C1CCC(Br)C(Br)C1,0 -NCCC#N,0 -OC1=CC=C(C=C1)CCC(=O)C2=C(C=C(C=C2O)O)O,0 -CC(Cl)Cl,0 -OC2=C1C=CC=CC1=NC3=CC=CC=C23,0 -OC4C(O)C3=C(C=C2C1=CC=CC=C1C=CC2=N3)C5=C4C=CC=C5,0 -CCC1=NC=CC(=C1)C(N)=S,0 -CCCC,0 -OC(=O)C=CC1=CC=C(C=C1)Cl,0 -CCCCN,0 -CCC(C)(C)C1=CC(=C(C(=C1)N3NC2=C(C=CC=C2)N3)O)C(C)(C)CC,0 -NC1=CC=C(C=C1)O,0 -OC1CCCCC1,0 -[O-][N+](=O)C1=CC(=CC=C1)C=CC(=O)C2=CC=CC=C2,0 -COP(C)(=O)OC,0 -CCCCCCCCCCCCO,0 -ClC1=C(C2=C(C(=C1Cl)Cl)C(=O)OC2=O)Cl,0 -S=C1SC=C(S1)C2=CC=CC=C2,0 -OC(=O)C1=C(N=CC=C1)NC2=CC(=CC=C2)C(F)(F)F,0 -CC1CCCC1,0 -OC2CC13OC1(C2)C=CC=C3,0 -CC(C)(C)OC(=O)C=C,0 -CC1=CSC=C1,0 -COP(=O)(OC)C(OC(=O)CCl)C(Cl)(Cl)Cl,0 -OCC1=CC=C(C=C1)Cl,0 -ClC1=C(Cl)C(=O)C(Cl)(Cl)C1=O,0 -CCCCCCCCOP(=O)(OCCCCCCCC)OCCCCCCCC,0 -CCC1=CC=CO1,0 -OC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,0 -CC1=C(C=CC(=C1)S(O)(=O)=O)N,0 -CCN(CC)C(=O)C1=CC(=CC=C1)C,0 -CC(C(O)=O)C1=CC3=C(C=C1)C2=CC(=CC=C2[NH]3)Cl,0 -OCC(O)C(O)C(OC1OC(CO)C(O)C(O)C1O)C(O)CO,0 -CCN,0 -NS(=O)(=O)C2=C1N=CC=CC1=CC=C2,0 -CC1=C(C(=CC=C1)NC2=NC(=NC(=C2)Cl)SCC(O)=O)C,0 -CC1=C(C=C(C(=C1)C)C)C,0 -CCCCOC(=O)CCCCCCCCC(=O)OCCCC,0 -CCCCCCC1=C(C=C(C=C1)O)O,0 -CC(O)CN(CC(C)O)CC(C)O,0 -OC(=O)C2=N[N](CC1=C(C=C(C=C1)Cl)Cl)C3=CC=CC=C23,0 -OC1=C(C=C(C=C1Br)Br)Br,0 -NC2=NC=C1N=C[NH]C1=N2,0 -N(C1=CC=CC=C1)C2=CC=CC=C2,0 -CCOC(=O)C(C)(C)OC1=CC=C(C=C1)Cl,0 -OCCCCO,0 -CCCCOP(=O)(OCCCC)OC1=CC=CC=C1,0 -NC2=C1C(C4=C(C(C1=C(C=C2S(O)(=O)=O)NC3CCCCC3)=O)C=CC=C4)=O,0 -NC(=O)CBr,0 -[O-][N+](=NC1=CC(=C(C=C1)Cl)Cl)C2=CC(=C(C=C2)Cl)Cl,0 -FC(F)C(F)(F)F,0 -CCC1=CC(=C(C(=C1)C(C)(C)C)O)C(C)(C)C,0 -O=C1OC4=C3C2=C1C=CC=C2C=CC3=CC=C4,0 -NC(=O)CI,0 -CC1=C(SSC1=S)C2=NC=CN=C2,0 -NC1=C(C(=C(C=C1)Cl)Cl)Cl,0 -CC1=C(C(=C(C(=C1[N+]([O-])=O)C)[N+]([O-])=O)C(C)(C)C)[N+]([O-])=O,0 -O=C2C1=C(C=CC=C1)CCC3=C2C=CC=C3,0 -CC1=CC(=C(C=C1)C)C,0 -ClC(=O)OCC1=CC=CC=C1,0 -OC2=C1C(C5=C(OC1=CC=C2)C3=C(OC4OCCC34)C=C5O)=O,0 -OC(=O)CC(Cl)C(O)=O,0 -CC1=CCC(=O)O1,0 -ClC2=C1C=CC=CC1=C(N=N2)Cl,0 -OCC4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,0 -CC1=C(C(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O)C,0 -C1COCCO1,0 -CC1=CC=C(O1)C,0 -OCC1=CC=C(C=C1)O,0 -O[N+]([O-])=C2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3,0 -CC(=O)OC3CC2C1(C)CCCC(C)(C)C1CCC2(C)C4(O)CC(=C(C=O)C34C)C=O,0 -COC2=C(C(=C1C(OCC1=C2C)=O)O)CC=C(C)CCC(O)=O,0 -CC(C)C(=O)NC1=CC=CC=C1,0 -OC(=O)CC1=CC=C(C=C1)Cl,0 -C2=CC1=CC=NC=C1C=C2,0 -OC1=C(C4=C2C(=C1)C(=O)OC3=C2C(=CC(=C3O)O)C(=O)O4)O,0 -OC1=C(C(=CC(=C1Cl)Cl)Cl)Cl,0 -CC1=CC=CC=C1,0 -ClC1=C(C(=CC=C1)Cl)C#N,0 -CC(C)OC1=CC2=C(C=C1)C(C(=CO2)C3=CC=CC=C3)=O,0 -[O-][N+]2=C1C=CC=CC1=CC=C2,0 -CCN(CC)CC1=C(C=CC(=C1)NC3=C2C=CC(=CC2=NC=C3)Cl)O,0 -C1CCC(CC1)NSC3=NC2=CC=CC=C2S3,0 -CCN(N=O)C1=CC=CC=C1,0 -O=C1CC(=O)C1=O,0 -CC(C)(C1=CC=C(C=C1)O)C2=CC=C(C=C2)O,0 -CC(=O)NC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 -CC(=O)OO,0 -CC(=O)C1=CC=C(C=C1)S(=O)(=O)NC(=O)NC2CCCCC2,0 -CC(C)(C)O,0 -CC(C)(OC1=CC=C(C=C1)C2CC2(Cl)Cl)C(O)=O,0 -CC1=CC(=CC=C1)[N+]([O-])=O,0 -CCC=[N+](O)[O-],0 -C1OCOCO1,0 -CCC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)C,0 -CCOC(C)=O,0 -CCOC1=CC=C(C=C1)NC(N)=O,0 -CC(C)=O,0 -CC1=CC=C(C=C1)Cl,0 -CCCCC(CC)COCCC#N,0 -ClCC1=CC=C(C=C1)Cl,0 -OC1=C(C=CC=C1)C(=O)OC2=CC=CC=C2,0 -ClC(=C)C#N,0 -CCOC(=O)OC(=O)OCC,0 -CC(CCN(C)C)N(C)C,0 -CC1=C(C)C(=O)C(=C(C)C1=O)C,0 -C=CCN1C(=O)N(CC=C)C(=O)N(CC=C)C1=O,0 -OC(=O)C1CC2=C(CN1)[NH]C3=CC=CC=C23,0 -CCCCCN,0 -[O-][N+](=O)OCC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O,0 -COC1=C(C5=C(C(=C1)O)C(=O)C2=C(C3=C(C=C2OC)OC4OCCC34)O5)OC,0 -OC(=O)C1=C(C=CC=C1)Cl,0 -O=C1CCCCC1,0 -CC1=CC=C(C=C1)OP(=O)(OC2=CC(=CC=C2)C)OC3=CC(=CC=C3)C,0 -OC(=O)C1=C(C=CC=C1)NC2=C(C=CC(=C2)Cl)C(O)=O,0 -CCCCCC(N)=O,0 -CCCCCCCCCCCC(=O)OCCS(O)(=O)=O,0 -OC1=C(C=C(C=C1Cl)Cl)SC2=C(C(=CC(=C2)Cl)Cl)O,0 -[O-][N+]4=C2C=CC1=CC=CC=C1C2=CC5=C3C=CC=CC3=CC=C45,0 -ClC1=CC=C(C=C1)S(=O)(=O)C2=C(C=C(C(=C2)Cl)Cl)Cl,0 -CC(OP(C)(Cl)=O)C(C)(C)C,0 -ClC1=CC(=CC(=C1)Cl)N2C(=O)CCC2=O,0 -NCC1=CC(=CC=C1)CN,0 -OC(=O)COC1=C(C(=C(C=C1)C(=O)C2=CC=CS2)Cl)Cl,0 -O=C1C5=C4C3=C2C1=CC=CC2=CC=C3C=CC4=CC=C5,0 -CC1=NC=CN=C1,0 -CCC(O)CN,0 -CC(=O)C3C(=O)C=C2OC1=C(C(=C(C(=C1C(C)=O)O)C)O)C2(C)C3=O,0 -O=C1CSC(=S)N1,0 -FC2=CC1=CC=CC=C1N=C2,0 -OC1=CC=C(C=C1)C3=CC(=O)C2=C(C=C(C=C2O)O)O3,0 -OC(=O)C1=CC(=C(C(=C1)O)O)O,0 -C=COC(=O)C=C,0 -CC(CCl)OP(=O)(OC(C)CCl)OC(C)CCl,0 -CC1(C)C2CCC1(C)C(=O)C2=O,0 -NC1=CC=C(C=C1)C(=O)OCCCOC(=O)C2=CC=C(C=C2)N,0 -COC1=C(C=CC(=C1)C=CC)O,0 -CC(C)CC(NC(=O)COC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 -OC(=O)C1=CC(=CC(=C1)Cl)Cl,0 -CCCCOC(C)=O,0 -C2CCC1CCCCC1C2,0 -CCC1=CC=C(C=C1)[N+]([O-])=O,0 -CC1=C(C(=C(C(=C1Br)Br)Br)Br)Br,0 -C[N+](C)(C)CC1=CC=CC=C1,0 -CC#N,0 -CC(C)(C)CC(C)(C)C1=CC=C(C=C1)OCCOCC[N+](C)(C)CC2=CC=CC=C2,0 -CCCCCCCCCCCCCCCCCC[N+](C)(C)CC1=CC=CC=C1,0 -CCCCC(CC)COS(O)(=O)=O,0 -OCCN4CCN(CCCN2C1=C(C=CC=C1)SC3=C2C=C(C=C3)C(F)(F)F)CC4,0 -OC(COC2=C1C(C=C(OC1=CC=C2)C(O)=O)=O)COC4=C3C(C=C(OC3=CC=C4)C(O)=O)=O,0 -OC2=C(C1=CC=C(C=C1C=C2)S(O)(=O)=O)N=NC3=CC=CC=C3,0 -OC2=C(C1=C(C=C(C=C1C=C2)S(O)(=O)=O)S(O)(=O)=O)N=NC3=CC=CC=C3,0 -CN(C)CCN(CC1=CC=CC=C1)C2=CC=CC=C2,0 -CC(C)C1CCC(C)CC1O,0 -COC(=O)C(C1CCCCN1)C2=CC=CC=C2,0 -CC(CCC1=CC=CC=C1)NCC(O)C2=CC(=C(C=C2)O)C(N)=O,0 -NC2=C1C(=C(C(=CC1=CC(=C2)S(O)(=O)=O)S(O)(=O)=O)N=NC3=CC=CC=C3)O,0 -CC3=C(OC1=C(C=CC=C1C(=O)OCCN2CCCCC2)C3=O)C4=CC=CC=C4,0 -CC(CN2C1=C(C=CC=C1)SC3=C2C=CC=C3)N(C)C,0 -CC(C)CCCC(C)CCCC(C)CCCC2(C)CCC1=C(C(=C(C(=C1C)O)C)C)O2,0 -C[N+](C)(C)CC(O)=O,0 -CON,0 -OC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=C(C=C3)S(O)(=O)=O,0 -CC1=NC(=C(C=N1)C[N+]2=CSC(=C2C)CCO)N,0 -OC1=NC(=NC(=N1)O)O,0 -OC2=C1[N+](=CC=CC1=CC=C2)[O-],0 -OC(=O)C1C(C(O)=O)C2(Cl)C(=C(Cl)C1(Cl)C2(Cl)Cl)Cl,0 -OC2=C1C=CC=CC1=CN=N2,0 -C(NC2=C1[NH]C=NC1=NC=N2)C3=CC=CC=C3,0 -CC=C1CC(C)C(C)(O)C(=O)OCC2=CCN3CCC(OC1=O)C23,0 -NC2=NC1=N[NH]N=C1C(=N2)O,0 -CCCCCCCCCCCCCCCC(=O)OCC(O)C1=C(C(=C(O1)O)O)O,0 -CCCCCC(CC)OC(=O)C1=CC(=CC=C1)C(=O)OC(CC)CCCCC,0 -OC2=C1C=CC=CC1=C(N=N2)O,0 -SC2=NC1=CC=CC=C1S2,0 -OCC(O)C(O)CO,0 -CC2(C)C3CC1OC1(C)C2C3,0 -CC(=O)C1=C(O)[N]5C(=C1O)C2C(CC4=C3C2=C[NH]C3=CC=C4)C5(C)C,0 -CC(C)CC(=O)OC4CC1(OC(C)=O)C(OC2C(O)C(OC(C)=O)C1(C)C23CO3)C=C4C,0 -CC(=O)OCC12CCC(=CC1OC3C(O)C(OC(C)=O)C2(C)C34CO4)C,0 -CC4CC3OC1C(O)C(OC(C)=O)C(C)(C12CO2)C3(CO)C(=O)C4=O,0 -CC4CC3OC1C(O)C(O)C(C)(C12CO2)C3(CO)C(=O)C4=O,0 -NC1=NN=C(S1)S,0 -ClCC1C(CCl)C2(Cl)C(=C(Cl)C1(Cl)C2(Cl)Cl)Cl,0 -ClC1=CC3=C(C=C1)N2C=NNC2=CN=C3C4=CC=CC=C4,0 -C=CC1CC2CC1C=C2,0 -ClC3=C(Cl)C4(Cl)C2C1CC(C=C1)C2C3(Cl)C4(Cl)Cl,0 -CC1C(=O)OC2CCN3CC=C(COC(=O)C(C)(O)C1(C)O)C23,0 -OC2CC(O)(CC(OC(=O)C=CC1=CC(=C(C=C1)O)O)C2O)C(O)=O,0 -CN(C=NC=NC1=C(C=C(C=C1)C)C)C2=C(C=C(C=C2)C)C,0 -NC3=NC(=C2N=C(O)[N](C1OC(CO)C(O)C1O)C2=N3)O,0 -CC1(CO)C(O)CCC2(C)C1CCC3CC4CC23CCC4(O)CO,0 -CNC(=N)N[N+]([O-])=O,0 -CC(=O)OC4(CCC5C3C=C(Cl)C2=CC(=O)C1CC1C2(C)C3CCC45C)C(C)=O,0 -CC12CCC(CC1)C(C)(C)O2,0 -CC12CCCC(C)(C1CCC34CC(=C)C(O)(CCC23)C4)C(O)=O,0 -CNC3=C1CC(=O)C(=CC=C1C2=C(C(=C(C=C2CC3)OC)OC)OC)OC,0 -CC34CC(O)C1C(CCC2=CC(=O)C=CC12C)C3CCC4(O)C(O)C=O,0 -CC34CCC1C(CCC2=C1C=CC(=C2)O)C3CC(O)C4O,0 -CC34CCC1C(CCC2=C1C=CC(=C2)O)C3CCC4O,0 -CC2=CN(C1CC(O)C(CO)O1)C(=O)NC2=O,0 -OC1=NC(=C(C=N1)F)O,0 -CC(=O)OC3(CCC4C2CCC1=C(CCC(=O)C1)C2CCC34C)C#C,0 -CC1CCC6(OC1)OC5CC4C3CC=C2CC(O)CCC2(C)C3CCC4(C)C5C6C,0 -CC4CC3OC1C(O)CC(C)(C12CO2)C3(CO)C(=O)C4=O,0 -OC3=C(C=C2C1C4=C(OCC1(CC2=C3)O)C(=C(O)C=C4)O)O,0 -COC1=C(C(=CC(=C1)C3C2C(COC2=O)C(O)C5=C3C=C4OCOC4=C5)OC)OC,0 -CC2OC=C1C(=O)C(C(O)=O)C(=O)C(=C1C2C)C,0 -NC2=C1C(=NN=C(C1=CC=C2)O)O,0 -CC34CCC1C(CC=C2CC(O)CCC12C)C3CCC4=O,0 -CN1CCCC1C2=CN=CC=C2,0 -OCC1OC(CC1O)N2C=C(I)C(=O)NC2=O,0 -CC(C)C12CC1C(C)C(=O)C2,0 -CC(N)(CC1=CC(=C(C=C1)O)O)C(O)=O,0 -CC1=NC(=NC(=C1)O)S,0 -CC34CCC1C(CCC2=C1C=CC(=C2)O)C3CCC4(O)C#C,0 -CC(=O)C3CCC4C2CC=C1CC(=O)CCC1(C)C2CCC34C,0 -NC2=C1N=C[N](C1=NC=N2)C3OC(CO)C(O)C3O,0 -OC(=O)CCCCC1SCC2NC(=O)NC12,0 -NS(=O)(=O)C1=C(C=C2C(=C1)S(NC=N2)(=O)=O)Cl,0 -SC2=NC1=CC=CC=C1[NH]2,0 -OCC1OC(CC1O)N2C=C(Br)C(=O)NC2=O,0 -NC2=NC1=NC=C(N=C1C(=N2)O)CNC3=CC=C(C=C3)C(=O)NC(CCC(O)=O)C(O)=O,0 -CC1=C(N=C(N=C1)S)O,0 -CC=CC(=O)OC2CC3OC1=CC(C)C(=O)CC1(C)C2(C)C34CO4,0 -CC(C)CCCC(C)C1CCC2C(CCCC12C)=CC=C3CC(O)CCC3=C,0 -NC(CC1=CC=CC=C1)C(O)=O,0 -CC34CCC1C(CC=C2CC(=O)CCC12)C3CCC4(O)C#C,0 -CC(=O)OC3(CCC4C2CC(=C1CC(=O)CCC1(C)C2CCC34C)C)C(C)=O,0 -CC14C(O)C=CC5(OC1=O)C2CCC3(O)CC2(CC3=C)C(C45)C(O)=O,0 -C2C=CC3C1CC(C=C1)C23,0 -CC1=CCC2CC1C2(C)C,0 -CC6CCC5C(C)C3C(CC4C2CC=C1CC(O)CCC1(C)C2CCC34C)N5C6,0 -CC(CCC(O)=O)C3CCC4C2C(O)CC1CC(O)CCC1(C)C2CC(O)C34C,0 -[O-][N+](=O)OC1COC2C(COC12)O[N+]([O-])=O,0 -CC2=CCCC(=C)C1CC(C)(C)C1CC2,0 -CC1=C(N=C(N=N1)O)O,0 -OCC1OC(CC1O)N2C=CC(=O)NC2=O,0 -NC2=C1N=C[N](C1=NC=N2)C3CC(O)C(CO)O3,0 -CCCC(=O)OCC,0 -CC(=O)C1=CC=NC=C1,0 -ClC1=NC(=CC=C1)Cl,0 -CC(O)CO,0 -CC(C)CO,0 -CC1CCC(=O)C1=O,0 -CC1=CC(=O)OC2=C1C=CC(=C2)O,0 -CCN(CC)C1=CC=CC=C1,0 -CCCCOC(=O)C(C)=C,0 -CN(C)C(=O)OC1=C[N+](=CC=C1)C,0 -CCC(CO)NCCNC(CC)CO,0 -CC12CCC(CC1O2)C=C,0 -NC2=C1C=CC=CC1=CC=C2O,0 -CN1CCC(C1)CN3C2=C(C=CC=C2)SC4=C3C=CC=C4,0 -CCCCCC(=O)OC3(CCC4C2CCC1=C(CCC(=O)C1)C2CCC34C)C(C)=O,0 -O=C1NS(=O)(=O)C2=C1C=CC=C2,0 -OC2=C(C=C1C=C(C=CC1=C2)S(O)(=O)=O)S(O)(=O)=O,0 -NC1=CC=CC=C1,0 -COC1=C(C4=C(C=C1Cl)C3(C(C25SSC(C(N2C3N4C)=O)(C)N(C5=O)C)O)O)OC,0 -CCCCCCCCCCCCOS(O)(=O)=O,0 -OC(=O)CC1=C(C=CC=C1)NC2=C(C=CC=C2Cl)Cl,0 -NC2=C1N=C[N](C1=NC(=N2)O)C3OC(CO)C(O)C3O,0 -COC1=C(C(=CC(=C1)CC2NCCC3=C2C=C(C(=C3)O)O)OC)OC,0 -OC(=O)C2=NN(C1=CC=C(C=C1)S(O)(=O)=O)C(=O)C2N=NC3=CC=C(C=C3)S(O)(=O)=O,0 -CN(C)C4C3C(O)C2C(C(=O)C1=C(C=CC=C1O)C2(C)O)C(=O)C3(O)C(=O)C(C(N)=O)C4=O,0 -CCNC1=NC(=NC(=N1)O)NC(C)C,0 -ON1CN(Cl)CN(Cl)C1,0 -C[N+]1(C)CCOCC1,0 -ClC1=CC=C(C=C1)COC(C[N]2C=CN=C2)C3=C(C=C(C=C3)Cl)Cl,0 -O[N]1N=NC2=CC=CC=C12,0 -CN2CCN=C(C1=CC=CC=C1)C3=C2C=CC(=C3)Cl,0 -CC(CCC(O)=O)C3CCC4C2CCC1CC(=O)CCC1(C)C2CC(=O)C34C,0 -NC(CSCC1=CC=CC=C1)C(O)=O,0 -CCNC(=O)CCC(N)C(O)=O,0 -CCC3CN2CCC1=C(C=C(C(=C1)OC)OC)C2CC3CC4NCCC5=C4C=C(C(=C5)OC)OC,0 -NC1=CC(=C(C=C1)Cl)C(F)(F)F,0 -CCN(CC)CCCN(C2CC1=C(C=CC=C1)C2)C3=CC=CC=C3,0 -OC1C(O)C(OC1COP(O)(O)=O)N2C=CC(=O)NC2=O,0 -NCCC1=C[NH]C2=CC=CC=C12,0 -CCCC(=O)NC1=CC(=C(C=C1)OCC(O)CNC(C)C)C(C)=O,0 -FC1=CC=C(C=C1)CCl,0 -CCCC(=O)NC2=C1N=C[N](C1=NC=N2)C4OC3COP(O)(=O)OC3C4OC(=O)CCC,0 -FC1=CN=CC=C1,0 -CCCCCCC(=O)OC3(CCC4C2CCC1=CC(=O)CCC1C2CCC34C)C#C,0 -OCC1OC(C(O)C1O)[N]3C=NC4=C(NCC2=CC=C(C=C2)[N+]([O-])=O)N=CN=C34,0 -OCC1OC(CC1O)N2C=C(C=O)C(=O)NC2=O,0 -OC1C(O)C(OC1COP(O)(O)=O)[N]2C=NC3=C(O)N=CN=C23,0 -OC2=C1C=CC=CC1=NC=N2,0 -CCC5=C(CC1NCCC2=C1C=C(C(=C2)OC)OC)CC3N(CCC4=C3C=C(C(=C4)OC)OC)C5,0 -CC(C)C3=CC2=CCC1C(C)(CCCC1(C)C(O)=O)C2CC3,0 -OC1=CC2=C(C=C1)C4(C3=C(O2)C=C(O)C=C3)OC(=O)C5=C4C=CC=C5,0 -OC2=CC(=C1C=C(O)C(=[O+]C1=C2)C3=CC(=C(C(=C3)O)O)O)O,0 -CCCCCCC(O)CC=CCCCCCCCC(O)=O,0 -C[N+]1=CC(=CC=C1)C(O)=O,0 -OC(=O)C1=C(C=CC=C1)O,0 -NC2=NC1=CC=C(C=C1[NH]2)Cl,0 -CCCOC(C(=O)OC1CCN(C)CC1)(C2=CC=CC=C2)C3=CC=CC=C3,0 -NC3=NC(=C2N=C[N](C1OC(COP(O)(O)=O)C(O)C1O)C2=N3)O,0 -CNC(=O)OC1=CC2=C(C=C1)N(C)C3N(C)CCC23C,0 -CC(C)CCCC(C)C3CCC4C2CC=C1CCCCC1(C)C2CCC34C,0 -CC4CC2(C)C(CCC3C1CCC(O)C1(C)CCC23)CC4=O,0 -CC1=C(C(=C(C=N1)CO)CO)O,0 -CC1=CC(=C(C=C1)N=NC3=C2C=CC=CC2=CC(=C3O)C(O)=O)S(O)(=O)=O,0 -CN,0 -CC1=C(C(=CC=C1)OCC(O)CNC(C)(C)C)C,0 -CN[N+]([O-])=O,0 -ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl,0 -CC(C)CC(NC(=O)C(CC1=CC=CC=C1)NC(=O)CNC(=O)CN)C(O)=O,0 -CC1=NCCC2=C1[NH]C3=CC(=CC=C23)O,0 -CC(C)CCCC(C)C3CCC4C2CC=C1CC(CCC1(C)C2CCC34C)OC(C)=O,0 -CNCC(O)C1=CC(=CC=C1)O,0 -NC1=NC=N[NH]1,0 -NC1=NC(=O)N(C=C1I)C2CC(O)C(CO)O2,0 -NC(CC1=CC(=C(C=C1)O)[N+]([O-])=O)C(O)=O,0 -COC1=CC=C(C=C1)CN(CCN(C)C)C2=NC=CC=N2,0 -CN(C)C4C3CC2C(C(=O)C1=C(C=CC=C1O)C2(C)O)C(=O)C3(O)C(=O)C(C(N)=O)C4=O,0 -COC1=CC=C2C(=CC1=O)C(CCC3=C2C(=C(C(=C3)OC)OC)OC)NC(C)=O,0 -CN1C2CC(CC1C3OC23)OC(=O)C(CO)C4=CC=CC=C4,0 -CNC(C=[N+](O)[O-])=NCCSCC1=CC=C(O1)CN(C)C,0 -OCC1OC(C(O)C1O)N2C=CC(=N)NC2=O,0 -OC1=NC(=NC=N1)O,0 -CC2(C)C1CCC(C1)C2=C,0 -CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCO,0 -OCC1=CC(C(O)C1O)N2C=CC(=N)NC2=O,0 -O=C1NC(=S)NC(=O)C1C(=O)NC2=CC=CC=C2,0 diff --git a/test/data/multi_cell_call.csv b/test/data/multi_cell_call.csv deleted file mode 100644 index a4f4762..0000000 --- a/test/data/multi_cell_call.csv +++ /dev/null @@ -1,1067 +0,0 @@ -SMILES, Rodent carcinogenicity -C12(C(=C(/N=N/C3=C(C4=C(C(=C3)S(=O)(=O)[O-])C=CC=C4)O)C=CC=1S(=O)(=O)[O-])C=CC=C2).[Na+].[Na+], 0 -O=C(C2=CC=CC=C2)S\C(CCOC(C3=CC=CC=C3)=O)=C(C)/N(C=O)CC1=CN=C(C)N=C1N.Cl, 0 -O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2, 0 -OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2, 1 -BrC(CCl)CBr, 1 -NC(=S)NNC(=S)N, 0 -O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC, 0 -[O-][N+](=O)C1=CC=CC(=C1)NC(=O)C2=CC3=CC=CC=C3C(=C2O)/N=N/C4=CC(=CC=C4OC)[N+]([O-])=O, 0 -O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr, 1 -C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+], 1 -BrCCBr, 1 -ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl, 1 -ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2], 1 -O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr, 1 -C(CCCCCCCC)CCCNC(N)=N.CC(=O)O, 0 -CC1=CC=CC=C1, 1 -C1(=CC(=C2C(=C1)N=CC=C2)Br)Br, 0 -C1CCCNCCC1, 0 -O=C(N(CCCC)N=O)NCCCC, 1 -[Na+].C1(=CC=C2C(=C1S([O-])(=O)=O)C=CC=C2)/N=N/C3=C(C=CC4=C3C=CC=C4)O, 0 -CC(=O)O[Sn](OC(=O)C)(CCCC)CCCC, 0 -CC1=CC(C)=C(/N=N/C2=C(C(S([O-])(=O)=O)=CC3=C2C=CC(S([O-])(=O)=O)=C3)O)C=C1C.[Na+].[Na+], 1 -ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 -NC1=CC=CC(C)=C1.[H]Cl, 1 -C1=C(Cl)C=C3C(=C1)N(CCO)C(=O)C(O)N=C3C2=CC=CC=C2F, 0 -Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl, 1 -S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OCC)OCC, 0 -C1(=CC=C(N)C=C1)C.[H]Cl, 1 -[O-]C1=C(I)C=C(C(C2=C(C([O-])=O)C=CC=C2)=C3C=C(C(C(I)=C3O4)=O)I)C4=C1I.[Na+].[Na+], 0 -C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2, 1 -Cl[C@@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl, 1 -CC(C)(O)CC[C@@H](O)[C@@H](C)[C@H]2CC[C@@]1(O)C/3=C/C(=O)[C@@H]4C[C@@H](O)[C@@H](O)C[C@]4(C)[C@H]\3CC[C@@]12C, 1 -Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl, 1 -N12([C@@H]([C@@H](C1=O)NC(COC3=CC=CC=C3)=O)SC([C@@H]2C(=O)[O-])(C)C).[K+], 0 -ClCC/C(C2=CC=CC=C2)=C(C3=CC=CC=C3)/C1=CC=C(C=C1)OCCN(C)C.OC(C(O)=O)(CC(O)=O)CC(O)=O, 0 -[Na+].[O-]S(=O)(=O)c4ccc(c1c3cc(C)c(cc3[o+]c2cc(c(C)cc12)N(CC)CC)N(CC)CC)c(c4)S([O-])(=O)=O, 0 -Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl, 1 -ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl, 1 -C1(=C(C=C(N)C=C1)[N+](=O)[O-])NCCO, 0 -ClC(C(Cl)Cl)(Cl)Cl, 1 -O=CC(\Cl)=C(\Cl)C(O)=O, 0 -O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC, 1 -C1(C(=CC=C(C=1)NC(C(C)=C)=O)Cl)Cl, 0 -C([O-])(=O)CN(CC(=O)O)CCN(CC([O-])=O)CC([O-])=O.[Na+].[Na+].[Na+].[H]O[H].[H]O[H].[H]O[H], 0 -ClC1(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 0 -OC1=CC(=CC=C1)O, 0 -OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 -O=C1C2=C(C=CC=C2)C(=O)C(=C1Cl)Cl, 0 -ClC(C(Cl)(Cl)Cl)(Cl)Cl, 1 -CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CC(=O)O)C)C)C, 0 -OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 -O=[N+](C1=CC(=C(C(=C1)Cl)N)Cl)[O-], 0 -OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 -NC1=C(C=C(C=C1Cl)N)Cl, 1 -OC(=O)C(Cl)Cl, 1 -OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl, 0 -CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)C)C)C)C, 1 -ClC#CCl, 1 -C12C(C3C(CC1C3)NC(N(C)C)=O)CCC2, 0 -NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N, 1 -CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)CCCCCCCCCCCCCCC)C)C)C, 0 -C1N2CN3CN(C2)CN1C3, 0 -BrC(Br)Br, 1 -CCCC/C=N/N(C=O)C, 1 -Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45, 0 -N1=C(N=C(N(CO)CO)N=C1N(CO)CO)N(CO)CO, 1 -O=C(OCC)C4=C(C=CC=C4)C(C(C=C(C)C(NCC)=C3)=C3O1)=C(C=C2C)C1=C/C2=N/CC.Cl, 0 -ClC1=C(C=CC=C1)Cl, 0 -FC(C(F)Cl)(OC(F)F)F, 0 -[O-][N+](=O)C1=C(Cl)C(=C(Cl)C(=C1)[N+]([O-])=O)Cl, 0 -CCCCCNN.[H]Cl, 1 -ClC1=CC=C(C=C1)Cl, 1 -CCCCC/C=N/N(C=O)C, 1 -C(C(F)(Cl)Cl)(F)(F)Cl, 0 -O=C(CN=C2C3=CC=CC=C3)NC1=C2N(N=C1C)CC, 1 -ClC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)Cl)N, 1 -ClC(C(=O)O)(Cl)Cl, 1 -C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl, 0 -OC(=O)\C=C/C(O)=O.C(C(C1CCCCC1)C2CCCCC2)C3CCCCN3, 0 -FC(F)Cl, 0 -O=S(O)(O)=O.O[C@@H]([C@H](C)NC)[C@@]1=CC=CC=C1.O[C@@H]([C@H](C)NC)[C@@]2=CC=CC=C2, 0 -NC1=C(C=C(C=C1Cl)Cl)Cl, 1 -C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl, 1 -CN1CC[C@H]2OC(=O)C3(C[C@@H](C)[C@@](C)(O)C(=O)OC\C(=C\C1)C2=O)O[C@@H]3C, 1 -ClCC1CO1, 1 -O=C(N(CCCCCC)N=O)N, 1 -O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1, 0 -CC(=O)NC1=CC=C(C=C1)OCC, 1 -C([N+](C)(C)C)CCl.[Cl-], 0 -ClC1=CC2=C(C=C1)OC3=C(C=CC(=C3)Cl)O2, 0 -OC1=C(C=CC(=C1)O)CCCCCC, 0 -OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O.O=S(O)(O)=O, 0 -CN1N(C2=CC=CC=C2)C(=O)C=C1C, 1 -FC(F)(Cl)Cl, 0 -ClC(CCl)Cl, 1 -NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl, 1 -FCCl, 1 -CC(Cl)Cl, 0 -CCC1CO1, 1 -CC(Cl)(Cl)Cl, 0 -O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1, 1 -ClC(Cl)Cl, 1 -ClCCCl, 1 -ClC(=CCl)Cl, 1 -OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O, 0 -ClCOC, 1 -ClC1=C(C=CC(=C1)Cl)O, 0 -ClC(=CCl)Cl, 1 -C12=C(C(=O)NS1(=O)=O)C=CC=C2, 0 -OC1(=C(O)C(=O)O[C@H]1[C@@H](C[O-])O).[Na+], 0 -C1(C=CC=CN=1)CCl.Cl, 0 -FC(Cl)(Cl)Cl, 0 -O=C(O[C@H](CC)[C@](O)(C)[C@H](O)[C@@H](C)C2=O)[C@H](C)[C@@H](O[C@H]3C[C@](OC)(C)[C@@H](O)[C@H](C)O3)[C@H](C)[C@H]([C@@](O)(C)C[C@H]2C)O[C@H]1[C@H](O)[C@@H]([N@H+](C)C)C[C@@H](C)O1.[O-]C(CCCCCCCCCCCCCCCCC)=O, 0 -C1(=CC=CN=C1)CCl.[H]Cl, 1 -O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl, 1 -C1(CCNC(NC(N)=N)=N)=CC=CC=C1.[H]Cl, 0 -ClC1=C(OC(C)C(O)=O)C=CC(Cl)=C1, 0 -C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2)=NN=C4, 0 -OC1=C(C=C(C=C1Cl)Cl)Cl, 1 -C=CCC1=CC=C2C(=C1)OCO2, 1 -O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC, 1 -ClC1=C(C=C(C=C1)Cl)OC(C(=O)O)C, 0 -ClC1=C(C=C(C(=C1)Cl)Cl)OC(C(=O)O)C, 0 -C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+], 1 -O=S(=O)(C1=CC=C(C=C1)Cl)OC2=CC=C(C=C2)Cl, 0 -ClC1=C(C=CC(=C1)Cl)OCC(=O)O, 0 -ClCCN(CCCl)C1=CC=C(CC(OC3=CC=C(C4=C3)[C@]2([H])[C@](CC4)([H])[C@@](CC[C@@H]5OC(CC6=CC=C(N(CCCl)CCCl)C=C6)=O)([H])[C@]5(C)CC2)=O)C=C1, 1 -ClC1=C(C=C(C(=C1)Cl)Cl)OCC(=O)O, 0 -C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3, 1 -OC1=CC=CC=C1, 0 -O=C(N(C)C)NC1=CC=C(C=C1)Cl, 1 -ClC1=C(C=CC(=C1)Cl)OCC(=O)OCCCC, 0 -O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O, 1 -ClC4=C(C=CC=C4)C2=NC(C)C1=NN=C(C)N1C3=C2C=C(CCC5=CC=C(CC(C)C)C=C5)S3, 0 -O=C([C@H](CO)[C@]2=CC=CC=C2)O[C@@H]1C[C@H](N4C)[C@@H](O3)[C@@H]3[C@@H]4C1.Br.O.O.O, 0 -N1C2=C(C=CC=C2)SC3=CC=CC=C13, 0 -C(N)(=O)OC(C#C)(C1C=CC=CC=1)C2C=CC(=CC=2)Cl, 1 -ClC1=CC(=CC=C1OCC(=O)OC(C)C)Cl, 0 -ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl, 1 -ClC1=CC(=C(C=C1SC2=CC=C(C=C2)Cl)Cl)Cl, 0 -ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl, 0 -ClCC(Cl)CCl, 1 -ClC([N+](=O)[O-])(Cl)Cl, 0 -ClC1=C(C=CC(=C1)Cl)OS(=O)(=O)C2=CC=CC=C2, 0 -NC(CCSCC)C(=O)O, 1 -S=C=NC1=CC=CC=C1, 0 -C=C(Cl)C=C, 1 -CC(Cl)CCl, 1 -OCCN(CCO)CCO, 1 -O=P(OC=C(Cl)Cl)(OC)OC, 1 -[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O, 1 -O=C1N(C2=CC=CC=C2)N=C(C1)C, 0 -ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N, 1 -O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-], 1 -S=C(S[Se](SC(=S)N(C)C)(SC(=S)N(C)C)SC(=S)N(C)C)N(C)C, 0 -C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2, 0 -CC1=CC(NC2=C1C=C(C=C2)OCC)(C)C, 0 -NC1(=CC=C(C=C1)NC2=CC=CC=C2).[H]Cl, 0 -O=NN(C)CCCCCCCCCCCC, 1 -S=C(NC1CCCCC1)NC1CCCCC1, 0 -O=C(OCC)C=C, 1 -O=C(C(C)=C2C)C(C(CCCCCC(O)=O)C1=CC=CC=C1)=C(C)C2=O, 0 -[Se]=S, 1 -OC(=O)CCCC\C=C(\c1cccnc1)c2ccccc2, 0 -O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O, 1 -C13CC(C4C3O4)C2C1C5C(O5)C2, 0 -CCO, 1 -CC1=CC(=C(C=C1C)N)C, 1 -NC(=S)NC1=CC=CC=C1, 0 -C[N+](CCC(C1=CC=C(C=C1)Cl)C2=NC=CC=C2)C.C(\C(=C(/C(=O)[O-])[H])[H])(=O)O, 0 -Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45, 1 -[O-]\[N+](CC)=N/CC, 1 -C1=C(C(=CC(=C1N)C)C)C.[H]Cl, 1 -OC1=CC2=C(C=C1)OCO2, 1 -OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2, 1 -C1=CC=CC(=C1)CCN(C)N=O, 1 -O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC, 0 -ClC6C4(Cl)C3C1C5C(C3C2OC12)C4(Cl)C(Cl)(Cl)C56Cl, 0 -[O-]\[N+](CC)=N/C, 1 -ClC1=NC(=NC(=N1)NCC)NCC, 0 -O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC, 1 -N(CCCCCCCCCCCCCC)(C)N=O, 1 -C(O)(=O)[O-].[Na+], 0 -NC1=CC(=CC=C1)N, 0 -N(CCCCCCCCCC)(C)N=O, 1 -OCC1=C(C(=C(C(=C1)/N=N/C2=C3C=CC=CC3=C(C=C2)S(=O)(=O)[O-])O)/N=N/C4=C5C=CC=CC5=C(C=C4)S(=O)(=O)[O-])O.[Na+].[Na+], 0 -NC1=CC=C(C=C1)N, 0 -CN(C(=O)N)N=O, 1 -C([N+](C)(C)C)CO.[Cl-], 0 -ClC(C(C1=CC=C(C=C1)CC)C2=CC=C(C=C2)CC)Cl, 0 -C1(=C(C=CC=C1N)N).[H]Cl.[H]Cl, 0 -C1N(C(OC1)=O)N=O, 1 -S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC, 0 -C1(SC2=C(C(=CC(=C2)Cl)Cl)[O-])(=C(C(=CC(=C1)Cl)Cl)[O-]).[Na+].[Na+], 0 -O=C(C)CN(N=O)CCO, 1 -CC(=O)[O-].[O-]C(=O)C.[O-]C(=O)C.[Cr+3], 0 -.[Na+].[Cl-], 0 -N(N)(CC)C=O, 1 -O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O, 1 -[Na+].[O-]Cl=O, 0 -C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl, 1 -CC1(C2=CC=CC=C2)C(O1)C(=O)OCC, 0 -C1(CSCCNC(NC)=NC#N)=C(C)NC=N1, 0 -O=C([O-])C(C(/C(CC([O-])=O)=C([C@@H](CCC([O-])=O)[C@@H]5C)\N=C5/C=C4\[N-]\C(C(C=C)=C4C)=C3)=N2)=C(C)/C2=C/C1=C(CC)C(C)=C/3[N-]1.[Na+].[Na+].[Na+].[Cu+2], 0 -C1(=CC(=CC=C1N)N).[H]Cl.[H]Cl, 0 -N=C(N(CC)N=O)N[N+]([O-])=O, 1 -C1([C@H](CNC)O)(=CC(=CC=C1)O).[H]Cl, 0 -O=C(C(O)(C2=CC=CC=C2)C1CCCCC1)OC(C)(C)C#CCN(CC)CC.O.Cl, 0 -NC(=O)N(CC)N=O, 1 -O=NN(CC=C1)CC1, 1 -O.[Na+].O.O.CCN(CC)C([S-])=S, 0 -S=C(S[Te](SC(=S)N(CC)CC)(SC(=S)N(CC)CC)SC(=S)N(CC)CC)N(CC)CC, 0 -N(CC(F)(F)F)(CC)N=O, 1 -Cl[O-].[Na+], 0 -C1(=CC=CC=C1)CCNN.S(O)(O)(=O)=O, 1 -ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl, 1 -OC(=O)C=CC=CC, 0 -O(C1=CC=CC=C1)CC2CO2, 1 -OCCBr, 1 -CCC1=CC=CC=C1, 1 -C1C(N(C(CN1N=O)C)C)C, 1 -OC(CNC(C)C)C1=CC=C(NS(=O)(C)=O)C=C1.[H]Cl, 0 -OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1, 1 -C(CO)O, 0 -N(CC(CO)O)(CC=C)N=O, 1 -[O-]C12[C@@H](CC[N+](C)1CC=C2COC([C@](OC(C)=O)(C)[C@@H](C)\C=C3C=C)=O)OC/3=O, 1 -S=C(NCC)NCC, 1 -N(CC(C)O)(CC=C)N=O, 1 -NNC1=CC=CC=C1.[H]Cl, 1 -C=CC=C, 1 -NC(CCCN)(C(=O)O)C(F)F, 0 -C1CN1, 1 -N(CC(C)=O)(CC=C)N=O, 1 -CC(CC1=CC=CC=C1)NN.[H]Cl, 0 -CC(C)(C)O, 1 -CC(OC1=CC=C(C=C1)Cl)(C(=O)OCC)C, 1 -O=CNNC=O, 1 -N(CC=C)(CCO)N=O, 1 -O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC, 1 -O=C1N2CC3=CC=CC=C3C(=O)N2CC4C=CC=CC1=4, 1 -O=C(N(CCCCC)N=O)OCC, 1 -O=[C@](O[C@H](O[C@H](CO)[C@H]1O)[C@H](O)[C@H]1O)[C@@]5(C)[C@](CC3)([H])[C@](CCC5)(C)[C@@](CC4)([H])[C@@](C2)3C[C@]4(O[C@H]6[C@H](O[C@H]7[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O7)[C@@H](O)[C@H](O)[C@@H](CO)O6)[C@@]2=C, 0 -CCCCCl, 0 -OCCN.O=C(C1=C(C=CC(=C1)Cl)O)NC2=CC=C(C=C2Cl)[N+](=O)[O-], 0 -N(N1CCCCC1C2=CC=CN=C2)=O, 1 -[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O, 1 -CC(=O)O[Hg]C1=CC=CC=C1, 0 -OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-], 0 -O=S([N-]C1=O)(OC(C)=C1)=O.[K+], 0 -Cl[C@@]1(C(C)2C)C(Cl)(Cl)C(Cl)([C@](Cl)(C2=C)C1Cl)Cl, 1 -C1=C(C=CC=C1OCC2CO2)OCC3CO3, 1 -N(N)(CCCC)C=O, 1 -C=CC1=CC=CC=C1, 1 -OC1=CC=C(C=C1)C2=CC=CC=C2, 0 -C(C1=CC=C(C=C1)O)(=O)OCCCC, 0 -[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2, 1 -O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O, 1 -O=NN(CC(C)O)CC(C)O, 1 -N#[N+]C1=CC=CC=C1.O=S([O-])(O)=O, 1 -C1C(C2=CC=CC=C2)O1, 1 -N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl, 1 -O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4, 0 -O=NN(CC(=O)C)CC(=O)C, 1 -O=C1OC(=O)CC1, 0 -O=C1OC2=C(C=CC=C2)CC1, 1 -N(N(CC(F)(F)F)CC(F)(F)F)=O, 0 -CCCCOCCO, 1 -N(CCCCO)(CCCC)N=O, 1 -O[C@H]1[C@H](O[C@H](CO)[C@@H](O)[C@@H]1O)O[C@]2(CO)O[C@H](CO)[C@@H](O)[C@@H]2O, 0 -OC1=CC(C2=NC(N(C(C)C)C3=C2C=CC(C)=C3)=O)=CC=C1, 0 -CCCC1=CC2=C(C=C1)OCO2, 1 -O=NN(C)C2=NC1=CC=C(Cl)C=C1C(C3=CC=CC=C3)=[N+]([O-])C2, 0 -OC1=C(C=C(C=C1C(C)(C)C)CO)C(C)(C)C, 0 -S=C(N(CC)CC)SCC(=C)Cl, 1 -P, 0 -O=NN(/C(=N\C#N)NCCSCC1=C(N=CN1)C)C, 0 -C[C@@H]3O[C@]1(CS3)C2CCN(CC2)C1.C[C@@H]6O[C@]4(CS6)C5CCN(CC5)C4.O.Cl.Cl, 0 -NC(=O)C1=C(C=CC=C1)C(=O)N, 0 -C1(=C(C=CC(=C1)[C@H](CN[C@@H](CCC2=CC=CC=C2)C)O)O)C(N)=O.[H]Cl, 0 -O=NN(CCCC)CCCC, 1 -CC(=C)CCl, 1 -S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Cu+2], 0 -O=C1C2=C(C=CC=C2)C(=O)O1, 0 -O=NN(CCO)CCO, 1 -C=C(Cl)C=C, 0 -O=C(N(CCCC)N=O)N, 1 -N1=CC=CC2=CC=CC(=C12)O[Cu]OC3=CC=CC4=CC=CN=C34, 0 -O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C, 1 -S=P(SCC(=O)NC)(OC)OC, 0 -CCN(CC)N=O, 1 -CC(=O)NN, 1 -CC1=C(Cl)C(=O)OC2=C1C=CC(=C2)OP(=S)(OCC)OCC, 0 -CN(N=O)C, 1 -OC(=O)CCl, 0 -OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C, 1 -O=C1OC2=C(C=CC=C2)C=C1, 1 -C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2, 0 -ClC1=C(Cl)N=C(C(O)=O)C(Cl)=C1N, 0 -NN(CCCC)CCCC, 1 -COC1=CC(=C(C=C1)N)C, 1 -[O-]S(S(=O)[O-])(=O)=O.[K+].[K+], 0 -OC(CN(C1=CC=C(N=N1)NN)C)C.Cl.Cl, 0 -O=C/C=C/C1=CC=CC=C1, 0 -O[As](O)(C)=O, 0 -CC1CC(OC(O1)C)OC(=O)C, 1 -Cl.CCCCNN, 1 -O=S1(=O)CC=CC1, 0 -c1(n(cnc1)C)C[C@@H]2[C@@H](C(=O)OC2)CC, 0 -[Na+].[O-]C(=O)[C@@H](N)CC(O)=O, 0 -CC1CC(OC(O1)C)OC(=O)C, 0 -N(NCCCC)CCCC.Cl.Cl, 1 -O=NN(C1=CC=CC=C1)C2=CC=CC=C2, 1 -C\1=C/C(O[C@@H](C/C=C/C=C/C=C/C=C/[C@@H](C[C@@H]3O[C@](C[C@H](C[C@H]2O[C@H]/12)O)(C[C@@H]([C@H]3C(O)=O)O)O)O[C@@H]4O[C@@H]([C@H]([C@@H]([C@@H]4O)N)O)C)C)=O, 0 -NC1=CC(=CC=C1OC)C, 1 -NC1=CC=C(/C=C/C2=CC(OC)=CC=C2OC)C=C1, 1 -N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2, 1 -OC(=O)CCC(=O)OCC2(CCCC)C(=O)N(c1ccccc1)N(C2=O)c3ccccc3, 0 -C1CNCCN1, 0 -O=C(NC2=C(Cl)C=NC=C2Cl)C1=CC(OC3CCCC3)=C(OC)C=C1, 1 -C1(=CC(=CC=C1N)OC)OC.[H]Cl, 0 -O=NN(CCC)CCC, 1 -CC(C)C(O)(C(C)O)C(=O)OC\C1=C\CN2CC[C@@H](OC(=O)C(\C)=C\C)[C@@H]12, 1 -C1CCNCC1, 0 -[Na+].O=C([O-])[C@@H](N)CCC(O)=O, 0 -CC(C)(C)c1cc(O)ccc1O, 0 -[N+].C1(N(N=O)[O-])=CC=CC=C1, 1 -COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O, 1 -O=C3[C@@]2(C)CC[C@]1([H])[C@](CC[C@H](OS(=O)(O)=O)C4)(C)C4=CC[C@]([H])1[C@@]([H])2CC3, 0 -CC(C)CC(=O)O[C@H]1C[C@]2(COC(C)=O)[C@@]4(C)[C@H](OC(C)=O)[C@@H](O)[C@@H](O[C@@H]2/C=C1/C)[C@]34CO3, 1 -CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2, 1 -C(CCC(=O)O)([O-])=O.[Na+], 0 -[Ca+2].[N-2]C#N, 0 -NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl, 1 -O=NN(CCCCCC1)CCCCCC1, 1 -ClC(=C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC, 0 -CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2, 0 -NC(=O)NCCCC, 0 -NC(=N)NC#N, 0 -C1=CC=CC=C1C(O)C(N(C)N=O)C, 1 -S(=O)(=O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2, 0 -O=[N+]([O-])C3=CC=C(O3)/C=N/N1C(O[C@@H](CN2CCOCC2)C1)=O.Cl, 1 -C1(NS(=O)(=O)[O-])CCCCC1.[Na+], 1 -CN(CC)N=O, 1 -CCN(CC)C(=O)C1=CC=CC(C)=C1, 0 -Cl.CC3CCCC(C)N3CCCC(O)(c1ccccc1)c2ccccn2, 0 -O=C1CCCO1, 0 -O=C(N(CC)N=O)OCC, 1 -[Cd+2].[O-]C(C)=O.[O-]C(C)=O, 0 -N=C\2/N=C3/O[C@H]1[C@H](O)[C@@H](CO)O[C@H]1N3/C=C/2, 0 -CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C, 1 -[Cl-].[Cd+2].[Cl-], 1 -O[C@@H]8[C@@H](O)[C@@H]1O[C@H](CO)[C@H]8O[C@H]7O[C@H](CO)[C@@H](O[C@H]6O[C@H](CO)[C@@H](O[C@H]5O[C@H](CO)[C@@H](O[C@H]4O[C@H](CO)[C@@H](O[C@H]3O[C@H](CO)[C@@H](O[C@H]2O[C@H](CO)[C@@H](O1)[C@H](O)[C@H]2O)[C@H](O)[C@H]3O)[C@H](O)[C@H]4O)[C@H](O)[C@H]5O)[C, 0 -O=NN1CCCCCCC1, 1 -O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC, 1 -[Cd+2].[Cl-].[Cl-].[H]O[H], 0 -O=C1CCCCC1, 0 -O(CC1(C)C)C1=O, 1 -C1=C2C(=CC=C1)C=CC=C2, 1 -O=C(C)NCCSP(=S)(OC)OC, 0 -N(C([S-])=S)(CC)CC.[S-]C(N(CC)CC)=S.[Cd+2], 0 -NC(=O)CC1=C2C(=CC=C1)C=CC=C2, 0 -O=S(=O)([O-])[O-].[Cd+2], 1 -O=NN1CCCCCC1, 1 -N1=C(SNC2CCCCC2)SC3=C1C=CC=C3, 0 -C1(NC(CN1N=O)=O)=O, 1 -OC(=O)CC1=C2C(=CC=C1)C=CC=C2, 0 -C1(CCCCC1)N.[H]Cl, 0 -O=P(H)(OC)OC, 1 -O=[C@]([C@@H]1C[C@@H](O)CN1N=O)O, 0 -[Cd+2].[Cd+2].[Cd+2].[O-]S(=O)(=O)[O-].[O-]S([O-])(=O)=O.[O-]S([O-])(=O)=O.O.O.O.O.O.O.O.O, 0 -C1(CCCCC1[N+]).O=S(=O)([O-])O, 0 -N(N(CC(O)=O)CC(O)=O)=O, 0 -O=C1c2c(O)cc(C)cc2C(=O)c3cc(O)cc(O)c13, 0 -NC1=C2C(=CC=C1)C(=CC=C2)N, 1 -OC1=C(C=CC(=C1)/C=C/C(=O)O)O, 1 -P(=O)(OC)(OC)N1CCOCC1, 1 -N(CC(CO)O)(C)N=O, 1 -C1=C(CO)OC=C1, 1 -C12C(=CC=CC=1NCCN)C=CC=C2.[H]Cl.[H]Cl, 0 -C(O)(=O)[O-].[K+], 1 -O=C1C2=C(N=CN2C)N(C(=O)N1C)C, 0 -ClCCN(CCCl)[P]1(=O)NCCCO1, 1 -C1(=CC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)C)C, 1 -CN(CCO)N=O, 1 -O=CCCCC=O, 0 -C1=C2C(=CC=C1NC3=CC=C(C=C3)NC4=CC=C5C(=C4)C=CC=C5)C=CC=C2, 0 -.[K+].[Cl-], 0 -C[C@H](C\C=C\C)[C@@H](O)[C@@H]1N(C)C(=O)[C@H](C(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](NC(=O)[C@H](CC(C)C)N(C)C(=O)CN(C)C(=O)[C@H](CC)NC1=O)C(C)C, 0 -N(N(CCCO)C)=O, 1 -NC(=S)NC1=C2C(=CC=C1)C=CC=C2, 0 -CC(C)NCC(O)COc1ccc(cc1)NC(C)=O, 0 -O=[As](O)(O)[O-].[Na+], 0 -O=C1[C@H]3[C@H](C3)[C@@]([C@]4([H])[C@@]([C@@]5([H])[C@]([C@@](CC5)(OC(C)=O)[C@@](C)=O)(C)CC4)([H])C=C2Cl)(C)C2=C1, 1 -O=C(C1=CC=C(C=C1)C(=O)OC)OC, 0 -CC(O)CN(C)N=O, 1 -[As]21O[As]3O[As](O1)O[As](O2)O3, 0 -O=C(O)[C@H](CS)N.Cl, 0 -CN(C)C(C)=O, 0 -CN(CC(C)=O)N=O, 1 -[Na+].[As](=O)[O-], 0 -C(C(C)O)(O[Ca]OC(C(C)O)=O)=O, 0 -O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+], 1 -O=NN(C)CCOS(C1=CC=C(C)C=C1)(=O)=O, 1 -NC1=CC2=C(C=CC=C2)C=C1, 1 -O.O=C(Nc3cccc1c3O/C(=C\C1=O)C2=N\N\N=N2)c5ccc(OCCCCc4ccccc4)cc5.O=C(Nc3cccc1c3O/C(=C\C1=O)/C=2N\N=N/N=2)c5ccc(OCCCCc4ccccc4)cc5, 0 -O=C(N)C1=C(N=CN1)/N=N/N(C)C, 1 -C1(=C2C(=CC=C1N)C=CC=C2)S(=O)(O)=O, 0 -O=C1N(C2=CC=C(C=C2C(=NC1)C3=CC=CC=C3)Cl)CC4CC4, 0 -OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO, 0 -O=C(CN1C(=O)CCC1)NC2=C(C=CC=C2C)C, 0 -O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4, 0 -O=C([C@H](CC1=CC=CC=C1)NC(=O)[C@H](CC(=O)O)N)OC, 0 -CC(OC(=O)OC1CCCCC1)OC(=O)c5cccc6nc(OCC)n(Cc2ccc(cc2)c3ccccc3C\4=N\N=N/N/4)c56, 0 -[Ni], 0 -O=C(CCC(=O)O)NN(C)C, 1 -OC(=O)C1=C(C=CC=C1)OC(=O)C, 0 -C([O-])(C)=O.[O-]C(C)=O.[Ni+2], 0 -O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N, 1 -OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)/C=C\[C@]1(C)[C@H]4C(=O)C[C@@]23C, 0 -CN(C1=CC=CC=C1)N=O, 1 -O=C1CCCCCN1, 0 -ClC(C(C1=C(C=CC=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 0 -C1=CC=C(C(C(=O)OC)C2N(N=O)CCCC2)C=C1, 0 -S=C(N(CCCC)CCCC)S[Ni]SC(=S)N(CCCC)CCCC, 0 -OC1=C(C=C(C=C1)CNC(=O)CCCC/C=C/C(C)C)OC, 1 -ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 1 -CC1=CC=CC=C1OCC(O)CNCCN2/C=C(/C)C(=O)NC2=O.[H]Cl, 0 -CN(CCCCCCCCCCC)N=O, 1 -O=S(=O)([O-])[O-].O.O.O.O.O.O.[Ni+2], 0 -C1=CC=C5C(=C1)N(CC2=CC=C(F)C=C2)C(NC4CCN(CCC3=CC=C(OC)C=C3)CC4)=N5, 0 -C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2, 1 -ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 1 -O=NN1CCOCC1, 1 -NC(=O)C1=CC=CN=C1, 0 -CC(C)NCC(O)COC1(=CC=C(C=C1)CC(=O)N).[H]Cl, 0 -O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl, 1 -ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl, 1 -C1=CC=C(C=[N+]1[O-])C2CCCN2N=O, 1 -ClC1=NC(=NC(=N1)NC(C)C)NCC, 1 -C(NN)(N)=O.Cl, 1 -BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br, 1 -O=NN(CCC1)C(C1)C(=O)O, 0 -CN(CCC2)[C@@H]2[C@]1=CN=CC=C1, 0 -O=C(O[C@@H]2C[C@@H](CC3)N(C)[C@H]3C2)C(CO)C1=CC=CC=C1, 0 -NC(=O)NNC1=CC=CC=C1, 1 -O=NN(CCN1)CC1, 1 -CN(CCC2)[C@@H]2[C@]1=CN=CC=C1.Cl, 0 -N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl, 1 -O[As](=O)(C1=CC=C(C=C1)NC(=O)N)O, 0 -CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl, 1 -NC(N3C)=NC2=C3C(C)=CC1=NC=CC=C12, 1 -OC(=O)C1=CC=CN=C1, 0 -CC(=O)O[C@H]1[C@@H]([C@H](O[C@H]([C@@H]1OC(=O)C)COC(=O)C)S[Au]=P(CC)(CC)CC)OC(=O)C, 0 -O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3, 1 -CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N, 1 -O=C(C1=CC=CN=C1)NN, 1 -N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O, 1 -C12C3=C(C=CC=C3)NC1=CC=CC=2, 1 -N1(C2C(SC3=C1C=CC=C3)=CC=CC=2)CC(N(C)C)C.[H]Cl, 0 -O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C, 0 -O=NN1CCCCC1, 1 -C1=CC=C2C(=C1)C=C(C=C2)C(CNC(C)C)O, 0 -OC(C(C=CC=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=C(C)S3)=O, 0 -CC(=O)O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3, 1 -O=NN1CCC[C@H]1[C@@](O)=O, 0 -C12=C(C=CC(=C1)C(CNC(C)C)O)C=CC=C2.[H]Cl, 0 -OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O, 1 -[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O, 1 -Br/C(Br)=C/[C@H]3[C@@H](C(=O)O[C@H](C#N)c2cccc(Oc1ccccc1)c2)C3(C)C, 0 -[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O, 1 -O=NN1CCCC1, 1 -O=S1(=O)CCCO1, 1 -OC(CC(C1)C)C(C1)C(C)C, 0 -O=[N+]([O-])[O-].[Na+], 0 -ClC(Cl)(Cl)Cl, 1 -CC1SC(SC(N1N=O)C)C, 1 -ClC1=NC(=NC(=N1)NC(C)C)NC(C)C, 0 -N(C(=O)N)(N=O)CC(=O)O, 1 -O=NN1CCSCC1, 1 -O=C1CCO1, 1 -[O-][N+](C1=CC=CC(C2C(C(OC3CN(C(C5=CC=CC=C5)C4=CC=CC=C4)C3)=O)=C(NC(C)=C2C(OC(C)C)=O)N)=C1)=O, 0 -BrC(C(=O)NC(=O)N)(CC)CC, 0 -CC1=C(C=CC=C1)N=O, 1 -OC(COC1=CC=CC2=C1C=CC=C2)CNC(C)C.[H]Cl, 0 -SC1=NC2=C(C=CC=C2)S1, 1 -OC(=O)CN(CC(=O)O)CC(=O)O, 1 -[Na+].[N-]=[N+]=[N-], 0 -CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C, 0 -N#[N+][O-], 0 -O=C(N(CCCC)CC)SCCC, 0 -[S-]C1=NC(C=CC=C2)=C2S1.[S-]C3=NC(C=CC=C4)=C4S3.[Zn+2], 0 -O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC, 0 -C1(/N=N/C2=CC=CC=C2)=CC=CC=C1, 1 -N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O, 1 -C[N+](=NC)[O-], 1 -O=C1C[C@H](C\C=C1\C)C(C)=C, 0 -O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1, 0 -O=N[O-].[Na+], 1 -[N+](=N/CCC)(/CCC)[O-], 1 -OC1=C(C=CC=C1)O, 1 -CC(N(C1=CC=CC2=C1CC3=C2C=CC=C3)C(C)=O)=O, 1 -S=C1NC=NC2=C1N=CN2, 0 -O=[N+](C1=CC(=C(C=C1)OC)N)[O-], 1 -C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2, 1 -C1(=C(C=CC(=C1)NC(N(CC)CC)=O)OCC(CNC(C)(C)C)O)C(C)=O, 0 -O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-], 1 -CC(=O)NNC(=O)C, 0 -COc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C)c4cc3, 0 -O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O, 1 -[O-][N+](C3=CC=C(O3)C1=CN=C2N1C=CC=C2)=O, 1 -O=C(C1=C(C=CC=C1)C(=O)OCC=C)OCC=C, 0 -ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl, 0 -CN(C)CCN(CC1=CC=CO1)C2=CC=CC=N2, 0 -N(N)(CC=C)CC=C, 1 -CC(=O)[O-].[O-]C(=O)C.[Ba+2], 0 -N(NCC=C)CC=C.[H]Cl.[H]Cl, 1 -CN(C)CCN(CC1=CC=CS1)C2=CC=CC=C2, 0 -O=C(C)NCC1=NC(=NO1)C2=CC=C(O2)[N+]([O-])=O, 1 -[Cl-].[Ba+2].[Cl-].O.O, 0 -ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl, 1 -C=CCN(CC=C)N=O, 1 -C(C\C=C/CCCCCCCC)CCCCCC(=O)[O-].[Na+], 0 -CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl, 1 -NC2=NC(C3=CC=CC=C3)=C(CCOCC)C1=NC=NN12, 1 -CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O, 1 -NC1C=CC2=C(N=1)NC3=CC=CC=C23, 1 -O=C(C1=CC(=CC=C1O)/N=N/C2=CC=C(C=C2)C(=O)O)O, 0 -C1(=C(/C=C/C2=C(S(=O)(=O)[O-])C=C(C=C2)N)C=CC(=C1)N)S(=O)(=O)[O-].[Na+].[Na+], 0 -CC1=C(SSC1=S)C2=CN=CC=N2, 0 -[O-][N+](C2=CC=C(O2)C1=CSC=N1)=O, 1 -CC=O, 1 -O=CC1=CC=CC=C1, 1 -O=C1C(=C(C(=O)C(=C1Cl)Cl)Cl)Cl, 0 -NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O, 1 -N/1C(N(\C=C\1)C)=S, 1 -[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O, 1 -CC=NN(C)C=O, 1 -C1=CC=CC=C1, 1 -ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12, 1 -NC1=CC=C(C=C1)/N=N/C2=CC=C(C=C2)N, 0 -NC(C(=O)O)CCSC, 0 -[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O, 1 -ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O, 1 -NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C, 0 -CC(=O)N, 1 -NC1=CC=C(C2=CC=C(N)C=C2)C=C1, 1 -O=S(C1=NC2=C(C=CC(=C2)OC)N1)CC3=C(C(=C(C=N3)C)OC)C, 1 -NC2=CC=C(C(OC)=C2)\N=N/C1=CC=CC=C1, 0 -C1(=CC=C(C=C1)O)NC(C)=O, 1 -C1(C2=CC=C(C=C2)N)=CC=C(C=C1)N.[H]Cl.[H]Cl, 1 -O[As](=O)(C1=CC(=C(C=C1)O)[N+](=O)[O-])O, 0 -O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2, 0 -C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5, 1 -C12(=C(C=C(C=C1C=CC(=C2/N=N/C3=CC=CC=C3)O)S(=O)(=O)[O-])S(=O)(=O)[O-]).[Na+].[Na+], 0 -NC1=C(C=C2C3=C(C=CC=C3)OC2=C1)OC, 1 -O=[N+](C1=CC(=C(C=C1)N)N)[O-], 0 -O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].Cl[O-].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+], 0 -CC#N, 0 -ClC(C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)(Cl)Cl, 0 -O=[N+](C1=CC(=C(C=C1)C)N)[O-], 1 -C1(=CC=CC=C1)C(=O)[O-].[Na+], 0 -C1=COC2=C1C=CC=C2, 1 -ClCl, 0 -O=C(C(=NOC(=O)NC)SC)N(C)C, 0 -COC1=CC=C(C=C1)O, 1 -NC1=NC(=NC(=N1)N)C2=CC=CC=C2, 0 -ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3, 1 -O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-], 1 -C1=CC=C(C(OC)C(=O)O)C=C1, 0 -NC1=CC=C(C=C1)OC2=CC=C(C=C2)Cl, 1 -O=C(C)NC3=CC=C(C2=C3)C1=C(C2=O)C=CC=C1, 1 -O=[N+](C1=CC=C(C=C1)N)[O-], 0 -N(NC(C)=O)C1=CC=C(C=C1)CO, 1 -C1=CC=CC(=C1)C(C(C2=CC=CC=C2)=O)O, 0 -O=C1OC(O)C(C(Cl)Cl)=C1Cl, 1 -N(NC(C)=O)C(C1=CC=NC=C1)=O, 1 -O=C1C=CC(=O)C=C1, 1 -COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2, 1 -COC1=C(C=CC=C1)[N+](=O)[O-], 1 -O=C1C(C(=O)OC(=C1)C)C(=O)C, 0 -N1=C(SSC2=NC3=C(C=CC=C3)S2)SC4=C1C=CC=C4, 0 -ClC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-], 0 -[O-]\[N+](C)=N/CC, 1 -O=[N+](C1=CC(=C(C=C1)C(=O)O)N)[O-], 0 -C1(NNC(C)=O)=CC=CC=C1, 1 -N1C2=C(C=CC=C2)N=N1, 0 -CC(=C)CCl, 1 -O=C(N(CC(C)=O)N=O)NCCCl, 1 -N[C@@H](C\C1=C\N=C/N1)C(O)=O.Cl, 0 -CBr, 0 -O=[N+](C1=CC=CC=C1)[O-], 1 -ClC(C1=CC=CC=C1)(Cl)Cl, 1 -N(C(=O)N)(N=O)CC(C)=O, 1 -CC(OC)(C)C, 1 -O=[N+](C1=CC2=C(C=C1)NC=N2)[O-], 1 -O=C(C1=CC=CC=C1)NN, 1 -NN, 1 -NC(=O)OC, 1 -ClC1=C(C=CC=C1)[N+](=O)[O-], 1 -C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O, 1 -OC(CNC(C)C)COC1=CC=CC=C1OCC=C.Cl, 0 -OS(=O)(=O)O.NN, 1 -O=C(NN)OC, 0 -O=[N+](C1=CC=C(C=C1)Cl)[O-], 1 -NC1=CC=C(C=C1)OC2=CC=C(C=C2)N, 1 -C1(N=C(SC=1)NN)C2=CC=C(C=C2)N, 1 -O=C(C(C)(OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl)C)OC, 1 -Cl.O=P1(OCC(C)(C)CO1)C\4=C(/C)NC(/C)=C(/C(=O)OCCN(Cc2ccccc2)c3ccccc3)C/4c5cccc(c5)[N+]([O-])=O.CCO, 0 -NC1=C(C=CC(=C1)N)Cl, 1 -S=C(N1CCOCC1)SN1CCOCC1, 1 -NNC1=NC(=CS1)C2=CC=C(O2)[N+]([O-])=O, 1 -[K+].C1(=CC=C2C(=N1)N(C=C(C2=O)C([O-])=O)C)/C=C/C3=CC=C(O3)[N+]([O-])=O, 1 -O=[N+](CC)[O-], 0 -CC(=O)OCC1=CC=CC=C1, 1 -NC1=C(C=CC(=C1)Cl)N, 1 -N1=C(SC2=C1C=CC=C2)SN3CCOCC3, 0 -NNC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1, 1 -OCC1=CC=CC=C1, 0 -Nc1cc(Cl)c(N)cc1.OS(O)(=O)=O, 0 -O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.Cl, 0 -O=C(O)Cc1ccc(cc1)NC(C)=O, 0 -ClCC1=CC=CC=C1, 1 -ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-], 1 -ClC1=C(C=CC(=C1)N)C, 0 -O=C(OC)C1=C(C)NC(C)=C(C(OCC(C)(C)CN(CC3=CC=CC=C3)C)=O)C1C2=CC([N+]([O-])=O)=CC=C2F.Cl, 0 -[O-][N+](=O)c1ccc2c3ccccc3Cc2c1, 1 -OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-], 1 -NC1=CC(=CC=C1C)Cl, 1 -CN(N)C=O, 1 -O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-], 1 -C1(=CC=C(NN)C=C1)C(O)=O.[H]Cl, 1 -C=CC=O, 0 -C1(=C(C=CC(=C1)Cl)N)C.[H]Cl, 1 -O=C(C3)C(C(O)=CC(O[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]5[C@H](O)[C@H](O)[C@@H](O)[C@H](C)O5)O4)=C2)=C2O[C@@H]3[C@@]1=CC(OC)=C(OC)C=C1, 0 -[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O, 1 -C=CC(OCC)OCC, 0 -C(CCl)(F)(F)F, 1 -N(C1=CC=CC=C1)NC2=CC=CC=C2, 1 -C=C/C=N/O, 0 -CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O, 1 -NC(=O)Cc2c([O-])on[n+]2Cc1ccccc1, 1 -ClC(Cl)C(F)(F)F, 1 -O=C(C(=C)C)OC, 0 -NC(=O)C=C, 1 -[Be+2].O=S(=O)([O-])[O-], 0 -O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1, 0 -CS(=O)(=O)OC, 1 -[O-][N+](C)=O, 1 -ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C, 1 -OC(=O)C=C, 0 -OCC(=O)[C@@]2(O)CC[C@H]3[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4[C@@H](O)C[C@]23C, 0 -N=C(N(N=O)C)N[N+](=O)[O-], 1 -O=[N+](C1=C2C(=CC=C1)C=CC=C2)[O-], 0 -ClC1=NC(SCC(NCCO)=O)=NC(NC2=CC=CC(C)=C2C)=C1, 1 -C=CC#N, 1 -O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-], 1 -O=C(OCC2=CC=CC(C3=CC=CC=C3)=C2C)C1C(C)(C)C1/C=C(Cl)/C(F)(F)F, 0 -OC1=CC=C(C=C1)O, 1 -C1=C(C=CC=C1)C2=CC=CC=C2, 0 -O=C(C1=CC=CC=C1)CCl, 0 -OC1=CC=C(C=C1)OCC2=CC=CC=C2, 0 -OC(=O)C(C)(C)CCCOc1ccc(OCCCC(C)(C)C(O)=O)c(c1)c2ccccc2, 1 -ClCC(=O)C1=CC=C(NC(=O)C)C=C1, 0 -O=[N+](CCC)[O-], 0 -C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C, 1 -NC1=CC=C(C=C1)Cl, 0 -CC([N+](=O)[O-])C, 0 -NC(=O)CCCCC(=O)N, 0 -OCC(CO)(CBr)CBr, 1 -C1(=CC=C(Cl)C=C1)N.[H]Cl, 1 -C(C1C=CC=CC=1)(=O)N(N=O)C, 1 -OC(=O)CC[N+](=O)[O-], 0 -CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2, 1 -O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1, 1 -C1C(CC(CC1(OOC(C)(C)C)OOC(C)(C)C)(C)C)C, 0 -ClC1=CC=CC=C1C=C(C#N)C#N, 0 -C1(=CC(=CC(=C1N)C)C)C.[H]Cl, 1 -CN(N=O)C(=O)NCCC[C@H](N)C(O)=O, 1 -O=[N+](C1=CC=C2C3=C4C(=CC=C13)C=CC=C4C=C2)[O-], 1 -CCCC[Sn](O[Sn](CCCC)(CCCC)CCCC)(CCCC)CCCC, 0 -O=[N+](C1=CC2=CC=CN=C2C=C1)[O-], 0 -C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC, 1 -CC(CCl)OC(C)CCl, 1 -OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC, 1 -O=[N+](C1=CC=CC2=CC=CN=C12)[O-], 1 -O=C1C2=C(C=CC=C2C(=O)C3=C1C=CC=C3)O, 1 -S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OC)OC, 0 -N(CCCC(F)(F)F)(CCCC(F)(F)F)N=O, 1 -C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl, 0 -CC(C1=C(C(=C(C(=C1[N+](=O)[O-])C)[N+](=O)[O-])C)[N+](=O)[O-])(C)C, 1 -O=C1N(CCC1)C, 1 -N1C(N(CC(C1=O)C)N=O)=O, 0 -CC(C=NOC(=O)NC)(SC)C, 0 -[O-][N+](C1=CC([N+]([O-])=O)=CC([N+]([O-])=O)=C1)=O, 0 -CNC1=NC=NC2=C1N=CN2, 0 -O=NN1CCC(=O)NC1=O, 1 -O=C(N(CCO)N=O)NCC, 1 -O=[N+](OC(CO[N+](=O)[O-])CO[N+](=O)[O-])[O-], 1 -O[C@H]([C@@H]2O)[C@@H](O[C@@H]2CO)N1C(N=CN=C3NC)=C3N=C1, 0 -O=C(N(CCO)N=O)N, 1 -CC(=O)O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3, 0 -O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3, 0 -ClCOCCl, 1 -N(CC(CO)O)(CC(O)C)N=O, 1 -O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.[Mg+2], 1 -N(CC(CO)O)(CC(C)=O)N=O, 1 -O=C1C(NC(=O)N1)NC(=O)N, 0 -CC(C/C=N/N(C=O)C)C, 1 -O=C(N(CCCO)N=O)N, 1 -CC3=CC=C(C=C3)\C(C2=CC=CC=N2)=C/CN1CCCC1.O.Cl, 0 -C=CCO, 0 -C1=CC=C2C(=C1)N=C(N=C2N(CCO)CCO)C3=CC=C(S3)[N+]([O-])=O, 1 -OC1=C(C=CC(=C1)C)O, 1 -O=P(OCCCl)(OCCCl)OCCCl, 1 -C=CCCl, 0 -OC1=CC=CC2=CC=CN=C12, 0 -O=C(N(CCO)N=O)NCCCl, 1 -OC(C=C)C1=CC=C2OCOC2=C1, 1 -Oc1ccc(C[C@](C)(N)C(O)=O)cc1O.OC(=O)[C@@](C)(N)Cc1cc(O)c(O)cc1.O.O.O, 0 -O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br, 1 -C1CO1, 1 -C1(=C(C=CC(=C1)CCNC)OC(C(C)C)=O)OC(C(C)C)=O.[H]Cl, 0 -O=C(N(CC(C)O)N=O)NCCCl, 1 -O=C(CC(C)C)OCC=C, 1 -S=C1NCCN1, 1 -C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1, 1 -ClC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N, 1 -N(CC(C)O)(CCO)N=O, 1 -NC(=O)N(CC=C)N=O, 1 -O=C1NCCN1, 0 -FC(F)(F)CNC(=N)Nc1ccn(CCCCC(N)=O)n1, 1 -N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O, 1 -[Na+].[Na+].S=C(NCCNC(=S)[S-])[S-], 0 -CS(=O)(=O)OCCCNCCCOS(C)(=O)=O.[H]Cl, 0 -CC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)C)N, 1 -S=C(N(C)C)S[Bi](SC(=S)N(C)C)SC(=S)N(C)C, 0 -N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O, 1 -N(CC(=O)[O-])CC(=O)O.[Na+], 0 -ClCCl, 1 -CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1, 1 -C=CCNN.HCl, 1 -C(C1C=CC(=CC=1)O)(C2=CC=C(C=C2)O)(C)C, 0 -O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2, 0 -CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC, 1 -OC(=O)CC1=CNC2=C1C=CC=C2, 0 -O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+], 0 -C12C(=C(C=CC=1NC(C)=O)S(=O)(=O)[O-])C=C(C(=C2O)/N=N/C3=C4C(=C(C=C3)/N=N\C5=CC=C(C=C5)S(=O)(=O)[O-])C=CC(=C4)S(=O)(=O)[O-])S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+], 0 -O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC, 1 -O=C(NC2=C1C=C(C3=NNC(CC3)=O)C=C2)C1(C)C, 1 -O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N, 1 -NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+], 1 -OC1=C(C=C(C=C1C(C)(C)C)C)CC2=CC(=CC(=C2O)C(C)(C)C)C, 0 -O=S(C1=C(/N=N/C2=CC=C(C3=CC=C(\N=N/C4=C(S(=O)([O-])=O)C=C5C(C(N)=CC(S(=O)([O-])=O)=C5)=C4O)C=C3)C=C2)C(O)=C(C(N)=CC(S(=O)([O-])=O)=C6)C6=C1)([O-])=O.[Na+].[Na+].[Na+].[Na+], 1 -O=[W](=O)([O-])[O-].[Na+].[Na+], 0 -C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl, 1 -CCNN.[H]Cl, 1 -CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl, 1 -C12C(=CC(=C(C=1O)/N=N/C3=C(C=C(C=C3)C4=CC(=C(C=C4)/N=N/C5=C(C=C6C(=C5O)C(=CC(=C6)S(=O)(=O)[O-])N)S(=O)(=O)[O-])OC)OC)S(=O)(=O)[O-])C=C(C=C2N)S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+], 1 -O=C(N(CC)N=O)NCCO, 1 -NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+], 1 -N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1, 1 -O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N, 1 -O=C(O[C@H](CC)C(/C=C(C)/C=C/C4=O)CO[C@H](O[C@H](C)[C@H]2O)[C@H](OC)[C@@H]2OC)C[C@@H](O)[C@H](C)[C@H]([C@@H](CC=O)C[C@H]4C)O[C@H]1[C@H](O)[C@@H](N(C)C)[C@H](O[C@H](O[C@@H](C)[C@@H]3O)C[C@@]3(C)O)[C@@H](C)O1.OC(C)C(O)=O, 0 -O=C(N(CC)N=O)NCC(=O)C, 1 -CNN, 1 -O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N, 1 -O=S(=O)(C1=C(C=CC=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+], 0 -O=C1NC(=O)NC=C1, 1 -N#CN(CC)N=O, 1 -IC(I)I, 0 -N(C)[N+].S(=O)(=O)([O-])O, 1 -O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N, 1 -COc3ccccc3N2CCN(CCCN\C1=C\C(=O)N(C)C(=O)N1C)CC2, 0 -O=C(NCCCN(CC)CC)CN1N=CC(C3=CC=CC=C3)=C1C2=CC=CC=C2.O=C(O)/C([H])=C([H])/C(O)=O, 0 -NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1, 1 -C(N)(N)=O, 0 -NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C, 1 -CC1=C2C(=CC=C1)C=CC=C2, 0 -C1(=C2/C(C3=CC(S(=O)(=O)[O-])=CC=C3N2)=O)/C(C4=CC(S(=O)(=O)[O-])=CC=C4N1)=O.[Na+].[Na+], 0 -NC(=O)OCC, 1 -CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O, 0 -NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C.[H]Cl, 1 -CC2=CC1=CC=CC=C1C=C2, 0 -C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O, 1 -O=S(=O)([O-])[O-].[V+2]=O, 0 -CCC1(C2=C(C3=C(C(=CC=C3)CC)N2)CCO1)CC(=O)O, 0 -O=C(O[C@@H]1CC[N+]2([O-])[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C, 1 -CN[N+](=O)[O-], 1 -NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1, 1 -NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1, 1 -C1(=C(C=CC(=C1)N(CCO)CCO)NCCO)[N+]([O-])=O, 0 -OC1=C(C=C(C=C1)CC=C)OC, 0 -C1(C(OCC(C)C)=O)=CC=C(O)C=C1, 0 -OB(O)O, 0 -Cl.N#Cc1ccc(cc1)C3CCCc2cncn23, 0 -Br(=O)(=O)[O-].[K+], 1 -C(CCCN(N=O)C)(O)C1C=NC=CC=1, 1 -O=CCBr, 0 -O=C(C1=CC=CN=C1)CCCN(N=O)C, 1 -CC(=O)OC=C, 1 -[Na+].CN(C)c1ccc(/N=N/S([O-])(=O)=O)cc1, 0 -CC(CON=O)C, 1 -C=CBr, 1 -O.O.O.O.NC(=O)[C@@H]3CCCN3C(=O)[C@@H](NC(=O)[C@@H]1CC(=O)N(C)C(=O)N1)C\C2=C\N=C/N2, 0 -O=[N+](C1=CN=C(S1)N)[O-], 1 -ClC(Cl)Br, 1 -O=NN(C)C1=NC=NC2=C1N=CN2[C@@H]3O[C@H](CO)[C@@H](O)[C@H]3O, 1 -NC(=O)OC=C, 1 -CC/C(C2=CC=CC=C2)=C(C1=CC=CC=C1)/C(C=C3)=CC=C3OCCN(C)C.OC(C(CC(O)=O)(O)CC(O)=O)=O, 1 -CCBr, 1 -S=P(OC1=CC(=C(C=C1)SC)C)(OC)OC, 0 -FC(C(OC(F)F)Cl)(F)F, 0 -C=CCl, 1 -O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N, 1 -O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N, 0 -O=C(NCO)C=C, 1 -C=CF, 1 -CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C, 1 -.[Cl-].[Fe+3].[Cl-].[Cl-], 0 -COC1C=C(C=CC=1C2NC3=CN=CC=C3N=2)S(C)=O, 1 -C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl, 1 -NCCS(O)(=O)=O, 0 -[Fe+3].O=C([O-])CC(O)(CC(=O)[O-])C([O-])=O.O.O.O.O, 0 -O=C(C1=CC=NC=C1)NN, 1 -CC1=CC2=CC=CN=C2C=C1, 0 -O=C(N1)N(C2OCCC2)C=C(F)C1=O, 0 -N(C)(C)C([S-])=S.[Fe+3].[S-]C(=S)N(C)C.[S-]C(=S)N(C)C, 0 -NC(=O)C1=CC=NC=C1, 0 -CC1=CC=CC2=CC=CN=C12, 0 -C=C(Cl)Cl, 1 -Cl/C2=C(\Cl)C3(Cl)C1C(Cl)OC(Cl)C1C2(Cl)C3(Cl)Cl, 0 -OC(=O)C1=CC=NC=C1, 0 -C=CC1=CC=C(C=C1)C, 0 -C=C(F)F, 0 -C1(C(NCC2CCCCN2)=O)=C(C=CC(=C1)OCC(F)(F)F)OCC(F)(F)F.CC(=O)O, 0 -COC1=C(O)C=CC(=C1)C=NNC(=O)C2=CC=NC=C2, 1 -NC1=CC=C(C=C1)C2=CC=CC=C2, 1 -CC1(CC(=CC(=O)C1)C)C, 1 -CN1C2=CC=C(C=C2C(=NC(C1=O)O)C3=CC=CC=C3)Cl, 0 -O=C(NC1=CC=CC(=C1)C(F)(F)F)N(C)C, 0 -NC3=CC1=C(C=C3)OC2=C1C=CC=C2, 1 -O=C1N(C=C)CCC1, 1 -CN1CCN(CC1)/C2=N/C3=CC=CC=C3SC4C=CC(C)=CC2=4, 0 -O=C(C(F)(F)F)NC1=CC3=C(C2=CC=CC=C2C3)C=C1, 1 -C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+], 1 -ClCCN[P]1(=O)OCCCN1CCCl, 1 -N1(C(=CN=C1C)[N+](=O)[O-])CCO, 1 -OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1, 0 -O[C@H]1[C@@H](NC(CO)CO)C[C@](O)(CO)[C@@H](O)[C@@H]1O, 0 -CC(=C)C=C, 1 -CC1=C(C(=CC(=C1)OC(=O)NC)C)N(C)C, 0 -C1(N=CNN=1)N, 1 -O=C(OC)C1=C(C)NC(C)=C(C(OCCC3=CC=C(N4CCN(C(C6=CC=CC=C6)C5=CC=CC=C5)CC4)C=C3)=O)C1C2=CC([N+]([O-])=O)=CC=C2.Cl.Cl, 0 -[Na+].[F-], 0 -OC(C)C, 0 -O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C, 1 -OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C, 0 -OC(=O)CCCCCCCCCCN, 1 -NC2=CC=C(C=C2N)C1=CC=C(N)C(N)=C1.Cl.Cl.Cl.Cl, 1 -NC1=CC=C(C=C1)C2=CC=C(C=C2)F, 1 -CC(OC1=CC=C(C=C1)NC2=CC=CC=C2)C, 0 -ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl, 1 -Cl.CC(C)(C)NCC(O)COc1cccc(C)c1C, 0 -Clc1c([N+]([O-])=O)c(Cl)c(Cl)c(OC)c1Cl, 0 -Cl.CC(=O)O[C@@H](CC)C(C[C@H](C)N(C)C)(c1ccccc1)c2ccccc2, 1 -O=C(NC1=CC=CC(=C1)Cl)OC(C)C, 0 -CC(C)C=O, 0 -ClC1=CC(=C(C=C1C2=C(C=C(C(=C2)Cl)N)Cl)Cl)N, 0 -O=C(C(C1=CC=CC=C1)(C2=CC=CC=C2)CC(N(C)C)C)CC.[H]Cl, 0 -N(=C(C=1)C)N(C(C)C)C=1OC(=O)N(C)C, 0 -C1(C[C@H]([C@@H]([C@H]1CCCCCCC(=O)OC)/C=C/CC(O)(CCCC)C)O)=O, 0 -ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2, 1 -CN(C)CNc2nnc(/C=C/c1ccc(o1)[N+]([O-])=O)o2, 1 -O=C1C(=CNC(=O)N1)F, 1 -O=C(NC1=CC=CC=C1)OC(C)C, 0 -O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H], 1 -CC(=O)O[C@@H]3CC(=O)O[C@H](C)C\C=C\C=C\[C@H](O)[C@H](C)C[C@H](CC=O)[C@H](O[C@@H]2O[C@H](C)[C@@H](O[C@H]1C[C@@](C)(O)[C@H](OC(=O)CC(C)C)[C@H](C)O1)[C@H](N(C)C)[C@H]2O)C3OC, 0 -O=S(=O)(C1=CC(=C(C=C1Cl)Cl)Cl)C2=CC=C(C=C2)Cl, 0 -C1=C(C(=C(C=C1O)C)N(C)C)C, 0 -C(NC)CC(OC1=CC=C(C=C1)C(F)(F)F)C2=CC=CC=C2.[H]Cl, 0 -C/C=C/C1=CC2=C(C=C1)OCO2, 0 -O=[Mo](=O)=O, 1 -[N+].[O-], 0 -C1(C(=CC=C(C=1)C)C)N.[H]Cl, 1 -ClC(CCl)(Cl)Cl, 1 -O=C1N(C2=CC=CC=C2)N(C(=C1N(C)C)C)C, 0 -O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC=C(C=C3)O, 0 -O=C1C(O)=COC(CO)=C1, 1 -ClC(C(Cl)Cl)Cl, 1 -C=O, 1 -O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C, 0 -CC(=C)C#N, 0 -ClC(=C(Cl)Cl)Cl, 1 -O=NN(CCN(C)C)C(=O)[NH2+]CC.[O-]N=O, 1 -[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O, 0 -O=C(O)COC1=C(C)C=C(Cl)C=C1, 0 -OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C, 1 -O=C(N(CCCCC)N=O)N, 1 -CCC(C)=NO, 1 -C1=CC=C(NC(=O)C(/N=N/C2=C(Cl)C=C(C3=CC(Cl)=C(/N=N/C(C(=O)NC4=CC=CC=C4)C(=O)C)C=C3)C=C2)C(=O)C)C=C1, 0 -ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl, 1 -O(C)c1cc(CC=C)ccc1OC, 1 -ClC1=CC(Cl)=C(/N=N/C(C(=O)NC2=C(C=C(C3=CC(C)=C(NC(=O)C(/N=N/C4=C(Cl)C=C(Cl)C=C4)C(=O)C)C=C3)C=C2)C)C(=O)C)C=C1, 0 -CC1=NC=CN1, 1 -C1(C2=CC=C(C(=C2)Cl)N=NC(C(C)=O)C(=O)NC3=C(C=C(C(=C3)OC)Cl)OC)=CC(=C(C=C1)N=NC(C(C)=O)C(=O)NC4=CC(=C(C=C4OC)Cl)OC)Cl, 0 -Cl.CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(cccc1O)[C@@](C)(O)[C@H]4C[C@@H]23, 0 -C/C=C/C1=CC=C(C=C1)OC, 0 -[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O, 1 -[H][C@]12N(CC=C2COC([C@@](O)(C(O)(C)C)[C@H](C)OC)=O)CC[C@@H]1OC(\C(C)=C/C)=O, 1 -S=C(N(CC)CC)SSC(=S)N(CC)CC, 0 -S=C([S-])NCCNC([S-])=S.[Zn+2], 0 -O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2, 0 -O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+], 0 -ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl, 0 -O=CNN, 1 -[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2], 1 -O=S(C1=CC=C2C(C=CC(O)=C2\N=N/C3=CC=C(S(=O)([O-])=O)C=C3)=C1)([O-])=O.[Na+].[Na+], 0 -C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl, 1 -S=C(S[Pb]SC(N(C)C)=S)N(C)C, 0 -F/C(F)=C(\F)F, 1 -[N+](=O)([O-])c1ccccc1C, 1 -O=C(N(C)C)Cl, 1 -O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O, 1 -OCCNC1=C(OCCO)C=C([N+]([O-])=O)C=C1, 0 -C(S)(=S)N(C)C.N(C)C, 0 -O=C2C1=C(CCC2)C(OC[C@@H](O)CNC(C)(C)C)=CC=C1.Cl, 0 -O=C(O)\C=C/C(O)=O.O=C(NC3CC(N4C)CCC4C3)C1=C2C(CC(C)(C)O2)=CC(Cl)=C1, 0 -OC2=C1[C@@](C=C(C)CC3)([H])[C@]3([H])C(C)(C)OC1=CC(CCCCC)=C2, 0 -NC1=CC=CC=C1[H]Cl, 1 -C[N+](CCCCCCCCCCCC)(C)[O-], 0 -C1=COC=C1, 1 -C1CCCO1, 1 -C1(=C(C=CC=C1)N)OC.[H]Cl, 1 -O=S(\N=C(NCCSCC2=CC=C(CNC)O2)/NCC(C1=CC=C(O)C=C1)O)(C)=O, 1 -CN(C=O)C, 0 -O=CC1=CC=CO1, 1 -O=C(O)CC[C@@H](C)[C@]3([H])[C@](CC2)(C)[C@](CC3)([H])[C@@](CC4)([H])[C@@]2([H])[C@]1(C)[C@@]4([H])C[C@H](O)CC1, 0 -C1(=CC=C(N)C=C1)OC.[H]Cl, 0 -O=C3C[C@@H]4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](C)(O)CC[C@@H]12)[C@@]4(C)C\C3=C\O, 1 -CN(C)N, 1 -OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O, 1 -C1=CC=CC=C1C(COC(N)=O)COC(N)=O, 1 -NC1=C(C=CC=C1)C(=O)O, 0 -N(NC)C.[H]Cl.[H]Cl, 1 -O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3, 0 -[O-][N+](C2=CC=C(O2)C1=CSC(NN(C)C)=N1)=O, 1 -S=C([S-])N(CCCC)CCCC.[S-]C(N(CCCC)CCCC)=S.[Zn+2], 0 -[Cl-].OC[P+](CO)(CO)CO, 0 -C1(=N\CCN/1)C(C)OC2C(=CC=CC=2Cl)Cl.[H]Cl, 0 -[O-][N+](=O)N(C)C, 1 -S=C([S-])N(CC)CC.[S-]C(N(CC)CC)=S.[Zn+2], 0 -OC[P+](CO)(CO)CO.[O-]S([O-])(=O)=O.OC[P+](CO)(CO)CO, 0 -CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl, 1 -OC(=O)C1=NN(C2=C1C=CC=C2)CC3=CC=C(C=C3Cl)Cl, 0 -S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2], 1 -S=C(N(C)C)SSC(=S)N(C)C, 0 -NN(C=O)CCC, 1 -O=C(OC)C1=CCCN(C)C1.[H]Cl, 1 -CC(C)(CO)CCCCCCC(C)(C)CO, 0 -OC(C(SC(Cl)=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=CC=C3)=O, 0 -S=C(N(C)C)SC(=S)N(C)C, 0 -O=C(C1=CC(=C(C(=C1)O)O)O)OCCC, 0 -[K+].[I-], 1 -C\C(C)=C/Cl, 1 -C[C@@H](CC)C(=O)O[C@H]2C[C@@H](C)\C=C3\C=C/[C@H](C)[C@H](CC[C@@H]1C[C@@H](O)CC(=O)O1)[C@@H]23, 1 -O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-], 1 -CCCOC(=O)[CH]1[CH](C)CC2=C(C=C3OCOC3=C2)[CH]1C(=O)OCCC, 0 -C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2, 1 -C(=O)(/C=C/C)OC1=C(C(CCCCCC)C)C=C(C=C1[N+]([O-])=O)[N+]([O-])=O, 0 -[Cl-].C/[N+](C)=C1\C=C/C(C=C1)=C(\c2ccc(cc2)N(C)C)c3ccc(cc3)N(C)C, 1 -Cn3nc(CO)nc3NCCCOc2cc(CN1CCCCC1)ccc2, 1 -N#[N+]C1=CC=CC=C1.F[B-](F)(F)F, 0 -S1C=CC(=C1)CN(C2=NC=CC=C2)CCN(C)C, 0 -OC(COC(C)(C)C)C, 1 -CS(=O)(=O)OC1=C(C=C(C=C1C(C)(C)C)[N+]([O-])=O)[N+](=O)[O-], 0 -Cl.Cl.Cl.Cc1ccc(cn1)C\C2=C\N/C(=N\C2=O)NCCSCc3ccc(CN(C)C)o3, 1 -O=C2C=1/N=C\NC=1N(C)C(=O)N2C, 0 -N1=CC=CC=C1, 1 -O=NN(C(=O)N)CCC, 1 -O=C1C23C4C5C6(C(=O)C7=C(O)C(C)=CC(=C7C(C6=C(C2C5O)O)=O)O)C(C4O)C(=C3C(=O)C8=C1C(O)=C(C)C=C8O)O, 1 -N(CCN(C)C)(C)N=O, 1 -N1C(=NC2=C1C=CC=C2)C3=CSC=N3, 0 -[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O, 1 -CC=C, 0 -OC(=O)[C@@H]3[C@]51C[C@@](O)(CC[C@H]1[C@@]24\C=C/[C@H](O)[C@@](C)(C(=O)O2)[C@@H]34)C(=C)C5, 0 -OC[C@@H](NC(C(Cl)Cl)=O)[C@H](O)C1=CC=C(S(=O)(C)=O)C=C1, 0 -CC(CO)O, 0 -O=NN(CCN1N=O)CCC1, 1 -N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N, 1 -Cl[Mg]Cl.O.O.O.O.O.O, 0 -S=P(N1CC1)(N1CC1)N1CC1, 1 -ClC1=C(Cl)C=CC([C@H]2C3=C(C=CC=C3)[C@@H](NC)CC2)=C1.Cl, 0 -CC1CO1, 1 -N12C3=C(C=CC(=N3)N)N=C1C=CC=C2, 1 -C1(CN(N=O)CC(O1)C)C, 1 -[O-]P(=O)=O.[Na+], 0 -NNCCC.[H]Cl, 1 -O=NN1CCN(N=O)CC1, 1 -O=C1C=C(NC(=S)N1)CCC, 1 -O=C(C(SP(=O)(OC)OC)CC(=O)OCC)OCC, 0 -CCOC(=O)N(C)N=O, 1 -CC(=S)N, 1 -O[C@@H]1[C@@](O[C@@H](O[C@H](CO)[C@@H]2Cl)[C@H](O)[C@H]2O)(CCl)O[C@H](CCl)[C@H]1O, 0 -O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC, 0 -C1N(COC1)N=O, 1 -CC(C1=CC(=C(C=C1O)C)SC2=CC(=C(C=C2C)O)C(C)(C)C)(C)C, 0 -O=C1C=CC(=O)NN1, 0 -O=C(N(CCC1=CC=CC=C1)N=O)N, 1 -OC1=C(C=C(C=C1SC2=C(C(=CC(=C2)Cl)Cl)O)Cl)Cl, 0 -O=C(O[C@@H]1[C@@](O[C@@H](O[C@H](COC(C)=O)[C@H]2OC(C(C)C)=O)[C@H](OC(C(C)C)=O)[C@H]2OC(C(C)C)=O)(COC(C)=O)O[C@H](COC(C(C)C)=O)[C@H]1OC(C(C)C)=O)C(C)C, 0 -C1(=CC=C2C(=C1)N(C(\N=C/2C3=CC=CC=C3)=O)C(C)C)C, 0 -C1=CC(=CC=C1NNC(CC[C@@H](C(O)=O)N)=O)CO, 0 -C(=C/C=O)\[O-].[Na+], 1 -C([S-])#N.[Na+], 0 -CCCCOP(=O)(OCCCC)OCCCC, 1 -C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N, 1 -CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-], 0 -O=S(=O)([O-])[O-].O.[Mn+2], 0 -N1C=CC=C(C=1)C2N(N=O)CCC2, 1 -F[B-](F)(F)F.[Na+], 0 -O=P(OC(CCl)CCl)(OC(CCl)CCl)OC(CCl)CCl, 1 -OC(CO)CCl, 0 -Cl.Cl.[O-][N+](=O)c1cccc(c1)C/2C(\C(=O)OC)=C(\C)NC(\C)=C\2C(=O)OCCN3CCN(CC3)C(c4ccccc4)c5ccccc5, 0 -O=C(C1=CC=C(C=C1)N)NC2=CC=C(C=C2)N, 0 -NC(=S)NN, 0 -C1COCCO1, 1 -O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO, 0 -O=C(NC3=CC2=C(C=C3)C1=CC=C(NC(C)=O)C=C1C2)C, 0 -O=C1NC(=S)NC=C1, 1 -NC(=O)C1=NC=CN=C1, 0 -S=P(SC1C(SP(=S)(OCC)OCC)OCCO1)(OCC)OCC, 0 -OCC1CO1, 1 -NC1=C(C=CC(=C1)N)C, 1 -COC2=CC=C(C=C2)CN(CCN(C)C)C1=NC=CC=C1.OC(\C=C/C(O)=O)=O, 1 -[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C, 1 -NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl, 1 -S=C(N1CCCCC1)SSSSSSC(=S)N1CCCCC1, 0 -CN(C)[C@@H]2/C=C\CC[C@@]2(c1ccccc1)C(=O)OCC.OC(=O)\C=C\C(O)=O, 0 -NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl, 0 -C1(=CC(=C(C(=C1)N)C)N).[H]Cl.[H]Cl, 0 -O=NN(CCCCC)CCCCC, 1 -OCC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4, 0 -O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O, 1 -NC1=C(C)C=C(N)C=C1.O=S(O)(O)=O, 0 -C(C1=CC=CC=C1)(C2=CC=CC=C2)OCCN(C)C.[H]Cl, 0 -O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O, 0 -CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3, 0 -N(C1=CC=C(C=C1)NC2=CC=CC=C2)C3=CC=CC=C3, 0 -Cl.CC(C)(C)NCC(O)CO/C1=C/N(C)C(=O)c2ccccc12, 0 -S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC, 0 -N#CC(C1=CC=CC=C1)C2=CC=CC=C2, 0 -[Sn+2].[Cl-].[Cl-], 0 -[Na+].[Na+].OC(=O)[C@]5(C)C[C@H]6/C7=C/C(=O)[C@H]4[C@@](C)(CC[C@@H]3[C@]4(C)CC[C@H](OC2O[C@H](C([O-])=O)[C@@H](O)[C@H](O)[C@H]2O[C@H]1O[C@@H]([C@@H](O)[C@H](O)[C@H]1O)C([O-])=O)C3(C)C)[C@]7(C)CC[C@@]6(C)CC5, 0 -O=[Ti]=O, 0 -C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](\CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=CC=C5.[Na+], 1 -C(C(=O)[O-])(O[Ti](OC(C(=O)[O-])=O)=O)=O.[K+].[K+], 0 -Cl.CCOC(=O)[C@H](CCc1ccccc1)N[C@@H](C)C(=O)N2Cc3ccccc3C[C@H]2C(O)=O, 0 -O=C(OC1=CC=CC=C1)OC2=CC=CC=C2, 0 -[Ti+2](C1=CC=CC1)C2(=CC=CC2).[Cl-].[Cl-], 0 -C(/C1=C(C=C(C=C1)O)S(=O)(=O)[O-])(C2=CC=C(C=C2)N(CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)=C4/C=C/C(C=C4)=[N+](\CC5=CC(=CC=C5)S(=O)(=O)[O-])CC.[Na+].[Na+], 0 -Cl.O=C(c2cn(C)c1ccccc12)[C@H]3CC=4N\C=N/C=4CC3, 0 -O1C2=C(C=CC=C2)OC3=CC=CC=C13, 0 -O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O, 1 -C1(=C(C)C2OC(CCC=2C(=C1OC(=O)C)C)(CCCC(CCCC(CCCC(C)C)C)C)C)C, 0 -CC1=CC(C4=CC(C)=C(/N=N/C5=CC=C(OS(=O)(C6=CC=C(C)C=C6)=O)C=C5)C=C4)=CC=C1/N=N/C2=C(O)C=CC3=CC(S(=O)([O-])=O)=CC(S(=O)([O-])=O)=C23.[Na+].[Na+], 1 -N1(C2=CC=CC=C2)C(C(N(CS(=O)(=O)[O-])C)=C(N1C)C)=O.[Na+], 1 diff --git a/test/data/multicolumn.csv b/test/data/multicolumn.csv deleted file mode 100644 index 2fa9a1c..0000000 --- a/test/data/multicolumn.csv +++ /dev/null @@ -1,5 +0,0 @@ -SMILES, Hamster Carcinogenicity, numeric feature, classification, mixed, string -c1ccccc1NN , 1, 1, true , true , "test" -C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O , 1, 2, false, 7.5 , "test" -O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1, 1, 3, true , 5 , "test" -C1(N=CNN=1)N , 0, 4, false, false, "test" diff --git a/test/dataset.rb b/test/dataset.rb deleted file mode 100644 index b3190b8..0000000 --- a/test/dataset.rb +++ /dev/null @@ -1,99 +0,0 @@ -require 'test/unit' -$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') -require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' -DATASET = "http://ot-dev.in-silico.ch/dataset" -AA ||= "https://opensso.in-silico.ch" -AA_USER = "guest" -AA_PASS = "guest" -@@subjectid = OpenTox::Authorization.authenticate(AA_USER,AA_PASS) - -DATA_DIR = File.join(File.dirname(__FILE__),"data") -# TODO: add subjectids - - -class DatasetTest < Test::Unit::TestCase - - def test_all - puts @@subjectid - datasets = OpenTox::Dataset.all(DATASET, @@subjectid) - assert_equal OpenTox::Dataset, datasets.first.class - end - - def test_create_empty - d = OpenTox::Dataset.create(DATASET, @@subjectid) - assert_equal OpenTox::Dataset, d.class - assert_match /#{DATASET}/, d.uri.to_s - d.delete - end - - def test_create_from_file - d = OpenTox::Dataset.from_file DATASET, File.join(DATA_DIR,"EPAFHM.mini.csv"), @@subjectid - assert_equal OpenTox::Dataset, d.class - assert_equal d.uri, d[RDF::XSD.anyURI] - assert_equal "EPAFHM.mini", d.metadata[RDF::URI("http://purl.org/dc/elements/1.1/title")].first.to_s # DC.title is http://purl.org/dc/terms/title - assert_equal "EPAFHM.mini", d[RDF::URI("http://purl.org/dc/elements/1.1/title")] - d.delete - assert_raise OpenTox::NotFoundError do - d.get - end - end - - def test_from_yaml - @dataset = OpenTox::Dataset.from_file DATASET, File.join(DATA_DIR,"hamster_carcinogenicity.yaml"), @@subjectid - assert_equal OpenTox::Dataset, @dataset.class - assert_equal "hamster_carcinogenicity", @dataset[RDF::URI("http://purl.org/dc/elements/1.1/title")] - hamster_carc? - @dataset.delete - end - -=begin -# TODO: fix (mime type??0 and add Egons example - def test_sdf_with_multiple_features - @dataset = OpenTox::Dataset.from_file DATASET, "#{DATA_DIR}/CPDBAS_v5c_1547_29Apr2008part.sdf" - assert_equal OpenTox::Dataset, @dataset.class - puts @dataset.features.size - puts @dataset.compounds.size - @dataset.delete - end -=end - - def test_multicolumn_csv - @dataset = OpenTox::Dataset.from_file DATASET, "#{DATA_DIR}/multicolumn.csv", @@subjectid - assert_equal 5, @dataset.features.size - assert_equal 4, @dataset.compounds.size - @dataset.delete - end - - def test_from_csv - @dataset = OpenTox::Dataset.from_file DATASET, "#{DATA_DIR}/hamster_carcinogenicity.csv", @@subjectid - assert_equal OpenTox::Dataset, @dataset.class - hamster_carc? - @dataset.delete - end - -=begin - def test_save - d = OpenTox::Dataset.create DATASET - d.metadata - d.metadata[RDF::DC.title] = "test" - d.save - # TODO: save does not work with datasets - #puts d.response.code.inspect - #assert_equal "test", d.metadata[RDF::DC.title] # should reload metadata - d.delete - end -=end -=begin -=end - - - def hamster_carc? - assert_kind_of OpenTox::Dataset, @dataset - #require 'yaml' - #puts @dataset.data_entries.to_yaml - assert_equal 85, @dataset.data_entries.size - assert_equal 85, @dataset.compounds.size - assert_equal 1, @dataset.features.size - assert_equal @dataset.uri, @dataset[RDF::XSD.anyURI] - end -end diff --git a/test/error.rb b/test/error.rb deleted file mode 100644 index d736620..0000000 --- a/test/error.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'test/unit' -$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') -require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' - -class ErrorTest < Test::Unit::TestCase - - def test_bad_request - object = OpenTox::Feature.new "http://this-is-a/fantasy/url" - assert_raise OpenTox::NotFoundError do - response = object.get - end - end - - def test_error_methods - assert_raise OpenTox::NotFoundError do - not_found_error "This is a test" - end - end - - def test_exception - assert_raise Exception do - raise Exception.new "Basic Exception" - end - end - - def test_backtick - assert_raise OpenTox::InternalServerError do - `this call will not work` - end - assert_raise OpenTox::InternalServerError do - `ls inexisting_directory` - end - end - -end diff --git a/test/feature.rb b/test/feature.rb deleted file mode 100644 index f37f298..0000000 --- a/test/feature.rb +++ /dev/null @@ -1,36 +0,0 @@ -require 'test/unit' -$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') -require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' - -class FeatureTest < Test::Unit::TestCase - - def setup - @features = [ - #@@classification_training_dataset.features.keys.first, - "http://apps.ideaconsult.net:8080/ambit2/feature/35796", - #File.join(OpenTox::Model::Lazar.all.last,"predicted","value") - - ] - end - - def test_feature - @features.each do |uri| - f = OpenTox::Feature.new(uri) - assert_equal RDF::OT1.TUM_CDK_nAtom, f[RDF::OWL.sameAs] - assert_equal RDF::OT1.TUM_CDK_nAtom, f.metadata[RDF::OWL.sameAs].first.to_s - assert_equal [RDF::OT1.Feature,RDF::OT1.NumericFeature].sort, f[RDF.type].sort - end - end - -=begin - def test_owl - #@features.each do |uri| - validate_owl @features.first, @@subjectid unless CONFIG[:services]["opentox-dataset"].match(/localhost/) - validate_owl @features.last, @@subjectid unless CONFIG[:services]["opentox-dataset"].match(/localhost/) - # Ambit does not validate - #end - end -=end - - -end diff --git a/test/policy.rb b/test/policy.rb deleted file mode 100644 index eb7e2b6..0000000 --- a/test/policy.rb +++ /dev/null @@ -1,120 +0,0 @@ -require 'test/unit' -$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') -require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','opentox-client.rb')) - -TEST_URI = "http://only_a_test/test/" + rand(1000000).to_s -USER_TYPE = "LDAPUsers" -USER_VALUE = "uid=guest,ou=people,dc=opentox,dc=org" -USER_GROUP = "member" -GROUP_TYPE = "LDAPGroups" -GROUP_VALUE = "cn=member,ou=groups,dc=opentox,dc=org" -POLICY_NAME = "test_policy_#{rand(100000)}" -RULE_NAME = "test_rule_#{rand(100000)}" -SUBJECT_NAME = "test_subject_#{rand(100000)}" - -AA ||= "https://opensso.in-silico.ch" -AA_USER = "guest" -AA_PASS = "guest" - -@@subjectid = OpenTox::Authorization.authenticate(AA_USER,AA_PASS) - -class PolicyTest < Test::Unit::TestCase - - def test_01_class - policies = OpenTox::Policies.new() - assert_equal(policies.class, OpenTox::Policies) - assert_kind_of Array, policies.names - assert_kind_of Array, policies.uris - assert_kind_of Array, policies.names - end - - def test_02_subclasses - policies = OpenTox::Policies.new() - policies.new_policy(POLICY_NAME) - assert_equal(policies.names[0], POLICY_NAME) - assert_equal(policies.policies[policies.names[0]].class, OpenTox::Policy) - policy = policies.policies[policies.names[0]] - policy.rule.name = RULE_NAME - policy.uri = TEST_URI - assert_equal(policy.rule.class, OpenTox::Policy::Rule) - assert_equal(policy.rule.name, RULE_NAME) - assert_equal(policy.rule.uri, TEST_URI) - assert_equal(policy.uri, TEST_URI) - policy.subject.name = SUBJECT_NAME - policy.type = USER_TYPE - policy.value = USER_VALUE - assert_equal(policy.subject.class, OpenTox::Policy::Subject) - assert_equal(policy.subject.name, SUBJECT_NAME) - assert_equal(policy.subject.type, USER_TYPE) - assert_equal(policy.type, USER_TYPE) - assert_equal(policy.subject.value, USER_VALUE) - assert_equal(policy.value, USER_VALUE) - end - - def test_03_read_readwrite - policies = OpenTox::Policies.new() - policies.new_policy(POLICY_NAME) - policy = policies.policies[policies.names[0]] - policy.rule.name = RULE_NAME - policy.uri = TEST_URI - policy.rule.get = "allow" - assert policy.rule.read - assert !policy.rule.readwrite - policy.rule.post = "allow" - policy.rule.put = "allow" - assert !policy.rule.read - assert policy.rule.readwrite - end - - def test_04_group_user - policies = OpenTox::Policies.new() - policies.load_default_policy(AA_USER, TEST_URI, "member") - assert_equal "member", policies.policies["policy_group"].group - assert_equal AA_USER, policies.policies["policy_user"].user - end - - def test_05_DN - policies = OpenTox::Policies.new() - policies.new_policy(POLICY_NAME) - policy = policies.policies[policies.names[0]] - policy.set_ot_user(AA_USER) - assert_equal USER_VALUE, policy.value - assert_equal USER_TYPE, policy.type - policy.set_ot_group(USER_GROUP) - assert_equal GROUP_VALUE, policy.value - assert_equal GROUP_TYPE, policy.type - end - - def test_06_load_xml_and_check_defaults - policies = OpenTox::Policies.new() - xml = File.read(File.join(File.dirname(__FILE__), "../lib/templates/default_policy.xml")) - policies.load_xml(xml) - # check user policy - policy = policies.policies["policy_user"] - assert policy.name == "policy_user" - assert policy.rule.name == "rule_user" - assert policy.rule.uri == "uri" - assert policy.rule.get == "allow" - assert policy.rule.post == "allow" - assert policy.rule.delete == "allow" - assert policy.rule.put == "allow" - assert policy.subject_group == "subjects_user" - assert policy.subject.name == "subject_user" - assert policy.subject.type == USER_TYPE - assert policy.subject.value == USER_VALUE - # check group policy - policy = policies.policies["policy_group"] - assert policy.name == "policy_group" - assert policy.rule.name == "rule_group" - assert policy.rule.uri == "uri" - assert policy.rule.get == "allow" - assert !policy.rule.post - assert !policy.rule.delete - assert !policy.rule.put - assert policy.subject_group == "subjects_group" - assert policy.subject.name == "subject_group" - assert policy.subject.type == GROUP_TYPE - assert policy.subject.value == GROUP_VALUE - end - -end \ No newline at end of file diff --git a/test/task.rb b/test/task.rb deleted file mode 100644 index 399c66e..0000000 --- a/test/task.rb +++ /dev/null @@ -1,85 +0,0 @@ -require 'test/unit' -$LOAD_PATH << File.join(File.dirname(__FILE__),'..','lib') -require File.join File.dirname(__FILE__),'..','lib','opentox-client.rb' -#require "./validate-owl.rb" - -TASK_SERVICE_URI = "http://ot-dev.in-silico.ch/task" -#TASK_SERVICE_URI = "http://ot-test.in-silico.ch/task" -#TASK_SERVICE_URI = "https://ambit.uni-plovdiv.bg:8443/ambit2/task" #not compatible - -class TaskTest < Test::Unit::TestCase - - -=begin -=end - def test_all - all = OpenTox::Task.all(TASK_SERVICE_URI) - assert_equal Array, all.class - t = all.last - assert_equal OpenTox::Task, t.class - assert_equal RDF::OT1.Task, t[RDF.type] - end - - def test_create_and_complete - task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test" do - sleep 1 - TASK_SERVICE_URI - end - assert task.running? - assert_equal "Running", task.hasStatus - task.wait - assert task.completed? - assert_equal "Completed", task.hasStatus - assert_equal TASK_SERVICE_URI, task.resultURI - end - - - def test_create_and_cancel - task = OpenTox::Task.create TASK_SERVICE_URI do - sleep 2 - TASK_SERVICE_URI - end - assert task.running? - task.cancel - assert task.cancelled? - end - - def test_create_and_fail - task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test failure", :creator => "http://test.org/fake_creator" do - sleep 1 - raise "A runtime error occured" - end - assert task.running? - assert_equal "Running", task.hasStatus - task.wait - assert task.error? - assert_equal "Error", task.hasStatus - end - - def test_create_and_fail_with_opentox_error - task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test failure", :creator => "http://test.org/fake_creator" do - sleep 1 - raise OpenTox::Error.new 500, "An OpenTox::Error occured" - end - assert task.running? - assert_equal "Running", task.hasStatus - task.wait - assert task.error? - assert_equal "Error", task.hasStatus - end - -=begin - def test_wrong_result_uri - task = OpenTox::Task.create TASK_SERVICE_URI, :description => "test wrong result uri", :creator => "http://test.org/fake_creator" do - sleep 1 - "Asasadasd" - end - assert task.running? - assert_equal "Running", task.hasStatus - task.wait - assert task.error? - assert_equal "Error", task.hasStatus - end -=end - -end -- cgit v1.2.3 From 09cc5df649f9d9ebf5f01c1a79e28f8d902da399 Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 27 Apr 2012 17:57:00 +0400 Subject: add Gemfile.lock --- Gemfile.lock | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Gemfile.lock diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..bc16a1b --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,30 @@ +PATH + remote: . + specs: + opentox-client (0.0.2pre) + bundler + open4 + rdf + rdf-raptor + rest-client + +GEM + remote: http://rubygems.org/ + specs: + addressable (2.2.7) + ffi (1.0.11) + mime-types (1.17.2) + open4 (1.3.0) + rdf (0.3.5) + addressable (>= 2.2.6) + rdf-raptor (0.4.1) + ffi (>= 1.0) + rdf (~> 0.3.0) + rest-client (1.6.7) + mime-types (>= 1.16) + +PLATFORMS + ruby + +DEPENDENCIES + opentox-client! -- cgit v1.2.3 From 1d49fe0da8e7d4dfc57fdbfffdc4e32db2ef0647 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 2 May 2012 20:06:16 +0000 Subject: initial task service --- lib/error.rb | 38 ++++++++++++++++++++++++++++++++------ lib/opentox-client.rb | 2 ++ lib/opentox.rb | 9 +++++---- lib/overwrite.rb | 3 ++- lib/rest-client-wrapper.rb | 6 ++++-- lib/task.rb | 23 +++++++++++++++++++---- 6 files changed, 64 insertions(+), 17 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 579f42b..58b9816 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -7,12 +7,38 @@ class RuntimeError super message @uri = uri @http_code ||= 500 - $logger.error "\n"+self.report.to_turtle + $logger.error "\n"+self.to_turtle end - def report - # TODO: remove kludge for old task services - OpenTox::ErrorReport.new(@http_code, self) + # define to_ and self.from_ methods for various rdf formats + RDF_FORMATS.each do |format| + + send :define_method, "to_#{format}".to_sym do + rdf = RDF::Writer.for(format).buffer do |writer| + # TODO: not used for turtle + # http://rdf.rubyforge.org/RDF/Writer.html# + writer.prefix :ot, RDF::URI('http://www.opentox.org/api/1.2#') + writer.prefix :ot1_1, RDF::URI('http://www.opentox.org/api/1.1#') + subject = RDF::Node.new + writer << [subject, RDF.type, RDF::OT.ErrorReport] + writer << [subject, RDF::OT.actor, @uri.to_s] + writer << [subject, RDF::OT.message, @message.to_s] + writer << [subject, RDF::OT.statusCode, @http_code] + writer << [subject, RDF::OT.errorCode, self.class.to_s] + + # cut backtrace + backtrace = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact + cut_index = backtrace.find_index{|line| line.match /sinatra|minitest/} + cut_index ||= backtrace.size + cut_index -= 1 + cut_index = backtrace.size-1 if cut_index < 0 + details = backtrace[0..cut_index].join("\n") + details += "REST paramenters:\n#{@request.args.inspect}" if @request + writer << [subject, RDF::OT.errorCause, details] + end + rdf + end + end end @@ -61,6 +87,7 @@ module OpenTox end end +=begin # TODO: create reports directly from errors, requires modified task service class ErrorReport def initialize http_code, error @@ -103,7 +130,6 @@ module OpenTox rdf end -=begin define_singleton_method "from_#{format}".to_sym do |rdf| report = ErrorReport.new RDF::Reader.for(format).new(rdf) do |reader| @@ -111,7 +137,7 @@ module OpenTox end report end -=end end end +=end end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index dec3512..0546634 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -7,6 +7,7 @@ require 'uri' require 'yaml' require 'json' require 'logger' +require "securerandom" # define constants and global variables #TODO: switch services to 1.2 @@ -17,6 +18,7 @@ RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' #CLASSES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "ErrorReport", "Investigation"] CLASSES = ["Generic", "Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] RDF_FORMATS = [:rdfxml,:ntriples,:turtle] +#$default_rdf = "text/plain" $default_rdf = "application/rdf+xml" # Regular expressions for parsing classification data diff --git a/lib/opentox.rb b/lib/opentox.rb index 6ce439d..2682258 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -22,7 +22,8 @@ module OpenTox # Load metadata from service def pull # TODO generic method for all formats - parse_rdfxml RestClientWrapper.get(@uri,{},{:accept => $default_rdf, :subjectid => @subjectid}) + #parse_rdfxml RestClientWrapper.get(@uri,{},{:accept => $default_rdf, :subjectid => @subjectid}) + parse_ntriples RestClientWrapper.get(@uri,{},{:accept => "text/plain", :subjectid => @subjectid}) end # Get object metadata @@ -48,7 +49,7 @@ module OpenTox # Save object at service def save #TODO: dynamic assignment - post self.to_rdfxml, { :content_type => $default_rdf} + put self.to_rdfxml, { :content_type => $default_rdf} end RDF_FORMATS.each do |format| @@ -111,7 +112,7 @@ module OpenTox end def create service_uri, subjectid=nil - #uri = uri(SecureRandom.uuid) + #uri = File.join(service_uri,SecureRandom.uuid) uri = RestClientWrapper.post(service_uri, {}, {:accept => 'text/uri-list', :subjectid => subjectid}) URI.task?(service_uri) ? from_uri(uri, subjectid, false) : from_uri(uri, subjectid) end @@ -126,7 +127,7 @@ module OpenTox uri.chomp! # TODO add waiting task - if URI.task? uri and wait + if URI.task?(uri) and wait t = OpenTox::Task.new(uri) t.wait uri = t.resultURI diff --git a/lib/overwrite.rb b/lib/overwrite.rb index d98769e..37c0bb3 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -15,7 +15,8 @@ module URI end def self.task? uri - uri =~ /task/ and URI.valid? uri + #TODO remove localhost + (uri =~ /task/ or uri =~ /localhost/) and URI.valid? uri end def self.dataset? uri, subjectid=nil diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 3071432..af1ba42 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -19,7 +19,7 @@ module OpenTox @subjectid = headers[:subjectid] ? headers[:subjectid] : nil bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri #TODO fix for internal installations - #not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) + not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| @@ -44,7 +44,9 @@ module OpenTox if [301, 302, 307].include? response.code and request.method == :get response.follow_redirection(request, result) else - raise OpenTox::RestCallError.new response.to_s, request, uri unless response.code < 400 or URI.task? uri + #TODO Reactivate for external services + #raise OpenTox::RestCallError.new response.to_s, request, uri unless response.code < 400 or URI.task? uri + rest_call_error response.to_s, request, uri unless response.code < 400 or URI.task? uri response end end diff --git a/lib/task.rb b/lib/task.rb index bcf806e..4cdbb51 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -8,13 +8,27 @@ module OpenTox def self.create service_uri, params={} - task = Task.new RestClientWrapper.post(service_uri,params).chomp + uri = RDF::URI.new File.join(service_uri,SecureRandom.uuid) + #uri = RestClientWrapper.post service_uri + #puts uri + task = Task.new uri + #task.pull + #puts task.to_turtle + task.rdf << RDF::Statement.new(uri, RDF.type, RDF::OT.Task) + task.rdf << RDF::Statement.new(uri, RDF::DC.date, RDF::Literal.new(DateTime.now)) + task.rdf << RDF::Statement.new(uri, RDF::OT.hasStatus, RDF::Literal.new("Running")) + params.each {|k,v| task.rdf << RDF::Statement.new(uri, k, v)} + task.save pid = fork do begin result_uri = yield task.completed result_uri rescue - RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.report.to_yaml}) if $!.respond_to? :report + if $!.respond_to? :to_ntriples + RestClientWrapper.put(File.join(task.uri,'Error'),:errorReport => $!.to_ntriples,:content_type => 'text/plain') + else + RestClientWrapper.put(File.join(task.uri,'Error')) #if $!.respond_to? :report + end task.kill end end @@ -58,7 +72,8 @@ module OpenTox end def completed(uri) - #not_found_error "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri + #TODO fix for https rewrites + not_found_error "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) end @@ -68,7 +83,7 @@ module OpenTox def wait start_time = Time.new due_to_time = start_time + DEFAULT_TASK_MAX_DURATION - dur = 0 + dur = 0.3 while running? sleep dur dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min -- cgit v1.2.3 From 8b430fdfb285cbbb24116909c7fe69a424b522d2 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 3 May 2012 12:48:06 +0200 Subject: remote task tests working --- lib/rest-client-wrapper.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index af1ba42..d5d9c82 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -44,9 +44,7 @@ module OpenTox if [301, 302, 307].include? response.code and request.method == :get response.follow_redirection(request, result) else - #TODO Reactivate for external services - #raise OpenTox::RestCallError.new response.to_s, request, uri unless response.code < 400 or URI.task? uri - rest_call_error response.to_s, request, uri unless response.code < 400 or URI.task? uri + raise OpenTox::RestCallError.new response.to_s, request, uri unless response.code < 400 or URI.task? uri response end end -- cgit v1.2.3 From 3c68a43dae1ff97aaebc1bee87fcf4bdbc7c6dc9 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 3 May 2012 10:48:09 +0000 Subject: localhost removed as task uri --- lib/overwrite.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 37c0bb3..d98769e 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -15,8 +15,7 @@ module URI end def self.task? uri - #TODO remove localhost - (uri =~ /task/ or uri =~ /localhost/) and URI.valid? uri + uri =~ /task/ and URI.valid? uri end def self.dataset? uri, subjectid=nil -- cgit v1.2.3 From b317039ba3e5ba10e7ea4769f256e345829ce8ff Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 4 May 2012 08:52:42 +0000 Subject: Gemfile.lock excluded --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4040c6c..f6e834a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ +Gemfile.lock *.gem .bundle -Gemfile.lock pkg/* -- cgit v1.2.3 From 8a5e3d69a16fc0c7d551e000270fe243ed121c85 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 4 May 2012 10:29:55 +0000 Subject: ntriples as default format, rdfxml as fallback --- lib/error.rb | 53 ---------------------------------------------- lib/opentox-client.rb | 3 --- lib/opentox.rb | 9 ++++---- lib/rest-client-wrapper.rb | 1 - lib/task.rb | 12 +---------- 5 files changed, 6 insertions(+), 72 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 58b9816..64b0fb1 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -87,57 +87,4 @@ module OpenTox end end -=begin - # TODO: create reports directly from errors, requires modified task service - class ErrorReport - def initialize http_code, error - @http_code = http_code - @report = {} - @report[RDF::OT.actor] = error.uri.to_s - @report[RDF::OT.message] = error.message.to_s - @report[RDF::OT.statusCode] = @http_code - @report[RDF::OT.errorCode] = error.class.to_s - - # cut backtrace - backtrace = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact - cut_index = backtrace.find_index{|line| line.match /sinatra|minitest/} - cut_index ||= backtrace.size - cut_index -= 1 - cut_index = backtrace.size-1 if cut_index < 0 - @report[RDF::OT.errorDetails] = backtrace[0..cut_index].join("\n") - @report[RDF::OT.errorDetails] += "REST paramenters:\n#{error.request.args.inspect}" if defined? error.request - #@report[RDF::OT.message] += "\n" + error.response.body.to_s if defined? error.response - # TODO fix Error cause - # should point to another errorReport, but errorReports do not have URIs - # create a separate service? - #report[RDF::OT.errorCause] = @report if defined?(@report) - end - - # define to_ and self.from_ methods for various rdf formats - RDF_FORMATS.each do |format| - - send :define_method, "to_#{format}".to_sym do - rdf = RDF::Writer.for(format).buffer do |writer| - # TODO: not used for turtle - # http://rdf.rubyforge.org/RDF/Writer.html# - writer.prefix :ot, RDF::URI('http://www.opentox.org/api/1.2#') - writer.prefix :ot1_1, RDF::URI('http://www.opentox.org/api/1.1#') - subject = RDF::Node.new - @report.each do |predicate,object| - writer << [subject, predicate, object] if object - end - end - rdf - end - - define_singleton_method "from_#{format}".to_sym do |rdf| - report = ErrorReport.new - RDF::Reader.for(format).new(rdf) do |reader| - reader.each_statement{ |statement| report.rdf << statement } - end - report - end - end - end -=end end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 0546634..8c19225 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -15,11 +15,8 @@ RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' -#CLASSES = ["Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "ErrorReport", "Investigation"] CLASSES = ["Generic", "Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] RDF_FORMATS = [:rdfxml,:ntriples,:turtle] -#$default_rdf = "text/plain" -$default_rdf = "application/rdf+xml" # Regular expressions for parsing classification data TRUE_REGEXP = /^(true|active|1|1.0|tox|activating|carcinogen|mutagenic)$/i diff --git a/lib/opentox.rb b/lib/opentox.rb index 2682258..f79b51b 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -21,9 +21,9 @@ module OpenTox # Load metadata from service def pull - # TODO generic method for all formats - #parse_rdfxml RestClientWrapper.get(@uri,{},{:accept => $default_rdf, :subjectid => @subjectid}) parse_ntriples RestClientWrapper.get(@uri,{},{:accept => "text/plain", :subjectid => @subjectid}) + rescue # fall back to rdfxml + parse_rdfxml RestClientWrapper.get(@uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid}) end # Get object metadata @@ -48,8 +48,9 @@ module OpenTox # Save object at service def save - #TODO: dynamic assignment - put self.to_rdfxml, { :content_type => $default_rdf} + put self.to_ntriples, { :content_type => "text/plain"} + rescue # fall back to rdfxml + put self.to_rdfxml, { :content_type => "application/rdf+xml"} end RDF_FORMATS.each do |format| diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index d5d9c82..479d5a5 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -18,7 +18,6 @@ module OpenTox # check input @subjectid = headers[:subjectid] ? headers[:subjectid] : nil bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri - #TODO fix for internal installations not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload diff --git a/lib/task.rb b/lib/task.rb index 4cdbb51..ceb6fd9 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -9,11 +9,7 @@ module OpenTox def self.create service_uri, params={} uri = RDF::URI.new File.join(service_uri,SecureRandom.uuid) - #uri = RestClientWrapper.post service_uri - #puts uri task = Task.new uri - #task.pull - #puts task.to_turtle task.rdf << RDF::Statement.new(uri, RDF.type, RDF::OT.Task) task.rdf << RDF::Statement.new(uri, RDF::DC.date, RDF::Literal.new(DateTime.now)) task.rdf << RDF::Statement.new(uri, RDF::OT.hasStatus, RDF::Literal.new("Running")) @@ -27,7 +23,7 @@ module OpenTox if $!.respond_to? :to_ntriples RestClientWrapper.put(File.join(task.uri,'Error'),:errorReport => $!.to_ntriples,:content_type => 'text/plain') else - RestClientWrapper.put(File.join(task.uri,'Error')) #if $!.respond_to? :report + RestClientWrapper.put(File.join(task.uri,'Error')) end task.kill end @@ -72,7 +68,6 @@ module OpenTox end def completed(uri) - #TODO fix for https rewrites not_found_error "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) end @@ -111,11 +106,6 @@ module OpenTox code >= 400 and code != 503 end - def errorReport - # TODO: fix rdf output at task service - not_implemented_error "RDF output of errorReports has to be fixed at task service" - end - [:hasStatus, :resultURI].each do |method| define_method method do response = self.[](RDF::OT[method]) -- cgit v1.2.3 From 6f25a7f04863b4fc6dccab59d690695371f1f0c7 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Mon, 7 May 2012 17:22:47 +0200 Subject: switch to v3.0.0, add version and changelog files --- .gitignore | 1 + ChangeLog | 2 ++ VERSION | 1 + opentox-client.gemspec | 2 +- 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 ChangeLog create mode 100644 VERSION diff --git a/.gitignore b/.gitignore index 4040c6c..553f765 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .bundle Gemfile.lock pkg/* +*~ diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..08d2402 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,2 @@ +v0.0.3 2012-05-07 +* switch from v0.0.2pre to v0.0.3 diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..bcab45a --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.0.3 diff --git a/opentox-client.gemspec b/opentox-client.gemspec index a51fdc6..455e73e 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = "opentox-client" - s.version = "0.0.2pre" + s.version = "0.0.3" s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] s.email = ["helma@in-silico.ch"] s.homepage = "http://github.com/opentox/opentox-client" -- cgit v1.2.3 From 950fffe995027a8463459363a7e6bd069c34fbef Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 9 May 2012 10:29:07 +0000 Subject: subjectid for tasks, uri check on completion disabled --- lib/task.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/task.rb b/lib/task.rb index ceb6fd9..d45b0d2 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -6,10 +6,10 @@ module OpenTox attr_accessor :pid, :observer_pid - def self.create service_uri, params={} + def self.create service_uri, subjectid=nil, params={} uri = RDF::URI.new File.join(service_uri,SecureRandom.uuid) - task = Task.new uri + task = Task.new uri, subjectid task.rdf << RDF::Statement.new(uri, RDF.type, RDF::OT.Task) task.rdf << RDF::Statement.new(uri, RDF::DC.date, RDF::Literal.new(DateTime.now)) task.rdf << RDF::Statement.new(uri, RDF::OT.hasStatus, RDF::Literal.new("Running")) @@ -68,7 +68,8 @@ module OpenTox end def completed(uri) - not_found_error "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri + #puts uri + #not_found_error "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri, @subjectid RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) end -- cgit v1.2.3 From d5d7d0d3a613e93f474996c65e99f8b0f0401f3f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 9 May 2012 10:45:42 +0000 Subject: version bumped to 1.0.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index bcab45a..3eefcb9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.3 +1.0.0 -- cgit v1.2.3 From d0c219c5f04edce6ba74b3a937af412bcf24af14 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 9 May 2012 11:01:34 +0000 Subject: version bumped to 1.0.0 --- Gemfile.lock | 8 ++++---- Rakefile | 10 ---------- opentox-client.gemspec | 2 +- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index bc16a1b..6aa15dc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - opentox-client (0.0.2pre) + opentox-client (1.0.0) bundler open4 rdf @@ -11,11 +11,11 @@ PATH GEM remote: http://rubygems.org/ specs: - addressable (2.2.7) + addressable (2.2.8) ffi (1.0.11) - mime-types (1.17.2) + mime-types (1.18) open4 (1.3.0) - rdf (0.3.5) + rdf (0.3.5.2) addressable (>= 2.2.6) rdf-raptor (0.4.1) ffi (>= 1.0) diff --git a/Rakefile b/Rakefile index 8cbd043..2995527 100644 --- a/Rakefile +++ b/Rakefile @@ -1,11 +1 @@ -require File.join(File.dirname(__FILE__),"lib","opentox-client.rb") require "bundler/gem_tasks" -require 'rake/testtask' - -Rake::TestTask.new do |t| - t.libs << 'lib' - t.libs << 'test' - t.test_files = FileList['test/*.rb'] - t.verbose = true -end - diff --git a/opentox-client.gemspec b/opentox-client.gemspec index 455e73e..75d390b 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| s.name = "opentox-client" - s.version = "0.0.3" + s.version = File.read("./VERSION").strip s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] s.email = ["helma@in-silico.ch"] s.homepage = "http://github.com/opentox/opentox-client" -- cgit v1.2.3 From 5f61cefdefc51a728147478820ffe04c5ec127d5 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Mon, 4 Jun 2012 16:14:07 +0200 Subject: remove URI.ssl and URI.accessable test --- lib/rest-client-wrapper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 479d5a5..5707831 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -18,7 +18,7 @@ module OpenTox # check input @subjectid = headers[:subjectid] ? headers[:subjectid] : nil bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri - not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) + #not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| -- cgit v1.2.3 From 9119cb4f3fbcedb5c233b0a1f3fe1398fcc0e193 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 28 Jun 2012 12:24:52 +0000 Subject: modified assignment operator --- lib/opentox.rb | 24 +++++++++++++++++++++--- lib/overwrite.rb | 20 ++++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index f79b51b..6df16fa 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -46,11 +46,22 @@ module OpenTox result end + def []=(key,value) + uri = RDF::URI.new(@uri) + #@rdf.delete [uri,key,nil] + #result = @rdf.query([RDF::URI.new(@uri),key,nil]).collect{|statement| statement.object} + @rdf << [uri, key, value] + end + + #def []<<(key,value) + #@rdf << [RDF::URI.new(@uri), key, value] + #end + # Save object at service def save put self.to_ntriples, { :content_type => "text/plain"} - rescue # fall back to rdfxml - put self.to_rdfxml, { :content_type => "application/rdf+xml"} + #rescue # fall back to rdfxml + #put self.to_rdfxml, { :content_type => "application/rdf+xml"} end RDF_FORMATS.each do |format| @@ -113,8 +124,15 @@ module OpenTox end def create service_uri, subjectid=nil + bnode = RDF::Node.new + klass = "RDF::OT."+self.class.to_s.split('::').last + #puts self.class + #puts klass + #object = eval "#{~ + @rdf << [bnode, RDF.type, klass] #uri = File.join(service_uri,SecureRandom.uuid) - uri = RestClientWrapper.post(service_uri, {}, {:accept => 'text/uri-list', :subjectid => subjectid}) + uri = RestClientWrapper.post(service_uri, self.to_ntriples, {:content_type => 'text/plain', :accept => 'text/uri-list', :subjectid => subjectid}) + #uri = RestClientWrapper.put(uri, {}, {:accept => 'text/uri-list', :subjectid => subjectid}) URI.task?(service_uri) ? from_uri(uri, subjectid, false) : from_uri(uri, subjectid) end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index d98769e..fa2128a 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -1,3 +1,23 @@ +class Object + # An object is blank if it's false, empty, or a whitespace string. + # For example, "", " ", +nil+, [], and {} are all blank. + def blank? + respond_to?(:empty?) ? empty? : !self + end + + def numeric? + true if Float(self) rescue false + end +end + +=begin +module Enumerable + def duplicates + inject({}) {|h,v| h[v] += 1; h}.reject{|k,v| v==1}.keys + end +end +=end + class String def underscore self.gsub(/::/, '/'). -- cgit v1.2.3 From 5ecdec2682ac6b61912afe74123b6d3d7c15e771 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 28 Jun 2012 14:29:05 +0200 Subject: Dataset.data_entries fixed --- lib/dataset.rb | 13 +++++++++---- lib/opentox.rb | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 8032533..1367d3f 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -4,13 +4,18 @@ module OpenTox class Dataset def data_entries - # TODO fix for api 1.2 data_entries = [] pull @reload = false - metadata[RDF::OT1.dataEntry].collect{|data_entry| - data_entries << @rdf.to_hash[data_entry] - } + begin + metadata[RDF::OT.dataEntry].collect{|data_entry| data_entries << @rdf.to_hash[data_entry] } + rescue + end + begin + # TODO: remove API 1.1 + metadata[RDF::OT1.dataEntry].collect{|data_entry| data_entries << @rdf.to_hash[data_entry] } + rescue + end @reload = true data_entries end diff --git a/lib/opentox.rb b/lib/opentox.rb index f79b51b..b282ed2 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -120,6 +120,7 @@ module OpenTox def from_file service_uri, filename, subjectid=nil file = File.new filename + # TODO: sdf files are incorrectly detected from_uri RestClientWrapper.post(service_uri, {:file => file}, {:subjectid => subjectid, :content_type => file.mime_type, :accept => "text/uri-list"}), subjectid end -- cgit v1.2.3 From 6c657ac84268f2cac458eb43ec156a7a38a4f95a Mon Sep 17 00:00:00 2001 From: gebele Date: Thu, 5 Jul 2012 15:06:34 +0400 Subject: expand methods :finished_at --- lib/task.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/task.rb b/lib/task.rb index d45b0d2..2ca481d 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -107,7 +107,7 @@ module OpenTox code >= 400 and code != 503 end - [:hasStatus, :resultURI].each do |method| + [:hasStatus, :resultURI, :finished_at].each do |method| define_method method do response = self.[](RDF::OT[method]) response = self.[](RDF::OT1[method]) unless response # API 1.1 compatibility -- cgit v1.2.3 From d8e72c6ff7ce2b147b6a11d233b80bbc8f1760d9 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 6 Jul 2012 16:44:12 +0200 Subject: feature and task tests pass --- Gemfile.lock | 4 +- lib/dataset.rb | 10 ++-- lib/opentox.rb | 141 +++++++++++++++++++++++---------------------------------- lib/task.rb | 27 ++++++----- 4 files changed, 77 insertions(+), 105 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6aa15dc..785b3e1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -13,9 +13,9 @@ GEM specs: addressable (2.2.8) ffi (1.0.11) - mime-types (1.18) + mime-types (1.19) open4 (1.3.0) - rdf (0.3.5.2) + rdf (0.3.7) addressable (>= 2.2.6) rdf-raptor (0.4.1) ffi (>= 1.0) diff --git a/lib/dataset.rb b/lib/dataset.rb index 1367d3f..33e1571 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -5,18 +5,18 @@ module OpenTox def data_entries data_entries = [] - pull - @reload = false + #pull + #@reload = false begin - metadata[RDF::OT.dataEntry].collect{|data_entry| data_entries << @rdf.to_hash[data_entry] } + self.[](RDF::OT.dataEntry).collect{|data_entry| data_entries << @rdf.to_hash[data_entry] } rescue end begin # TODO: remove API 1.1 - metadata[RDF::OT1.dataEntry].collect{|data_entry| data_entries << @rdf.to_hash[data_entry] } + self.[](RDF::OT1.dataEntry).collect{|data_entry| data_entries << @rdf.to_hash[data_entry] } rescue end - @reload = true + #@reload = true data_entries end diff --git a/lib/opentox.rb b/lib/opentox.rb index b575e52..b0c786a 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -4,7 +4,7 @@ $logger.level = Logger::DEBUG module OpenTox - attr_accessor :uri, :subjectid, :rdf, :response, :reload + attr_accessor :uri, :subjectid, :rdf # Ruby interface @@ -13,55 +13,72 @@ module OpenTox # @param [optional,String] subjectid # @return [OpenTox] OpenTox object def initialize uri=nil, subjectid=nil - @uri = uri.to_s.chomp - @subjectid = subjectid - @reload = true @rdf = RDF::Graph.new + uri ? @uri = uri.to_s.chomp : @uri = RDF::Node.uuid.to_s + append RDF.type, eval("RDF::OT."+self.class.to_s.split('::').last) + append RDF::DC.date, DateTime.now + @subjectid = subjectid end - # Load metadata from service - def pull - parse_ntriples RestClientWrapper.get(@uri,{},{:accept => "text/plain", :subjectid => @subjectid}) - rescue # fall back to rdfxml - parse_rdfxml RestClientWrapper.get(@uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid}) + # Object metadata + # @return [Hash] Object metadata + def metadata + # return plain strings instead of RDF objects + #puts @rdf.to_hash + @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate.to_s] = values.collect{|v| v.to_s}; h } end - # Get object metadata - # @return [Hash] Metadata - def metadata - pull if @reload # force update - @rdf.to_hash[RDF::URI.new(@uri)] + # Metadata values + # @param [String] Predicate URI + # @return [Array, String] Predicate value(s) + def [](predicate) + metadata[predicate.to_s].size == 1 ? metadata[predicate.to_s].first : metadata[predicate.to_s] + end + + # Set object metadata + # @param [String] Predicate URI + # @param [Array, String] Predicate value(s) + def []=(predicate,values) + @rdf.delete [RDF::URI.new(@uri.to_s),RDF::URI.new(predicate.to_s),nil] + append predicate.to_s, values end - # Get metadata values - # @param [RDF] Key from RDF Vocabularies - # @return [Array] Values for supplied key - def [](key) - pull if @reload # force update - result = @rdf.query([RDF::URI.new(@uri),key,nil]).collect{|statement| statement.object} - # TODO: convert to OpenTox objects?? - return nil if result and result.empty? - return result.first.to_s if result.size == 1 - return result.collect{|r| r.to_s} - result + # Append object metadata + # @param [String] Predicate URI + # @param [Array, String] Predicate value(s) + def append(predicate,values) + uri = RDF::URI.new @uri + predicate = RDF::URI.new predicate + [values].flatten.each { |value| @rdf << [uri, predicate, value] } end - def []=(key,value) - uri = RDF::URI.new(@uri) - #@rdf.delete [uri,key,nil] - #result = @rdf.query([RDF::URI.new(@uri),key,nil]).collect{|statement| statement.object} - @rdf << [uri, key, value] + # Get object from webservice + def get + parse_ntriples RestClientWrapper.get(@uri,{},{:accept => "text/plain", :subjectid => @subjectid}) + rescue # fall back to rdfxml + parse_rdfxml RestClientWrapper.get(@uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid}) end - #def []<<(key,value) - #@rdf << [RDF::URI.new(@uri), key, value] - #end + # Post object to webservice + def post service_uri + RestClientWrapper.post service_uri, to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} + rescue # fall back to rdfxml + RestClientWrapper.post service_uri, to_rdfxml, { :content_type => "application/rdf+xml", :subjectid => @subjectid} + end - # Save object at service - def save - put self.to_ntriples, { :content_type => "text/plain"} - #rescue # fall back to rdfxml - #put self.to_rdfxml, { :content_type => "application/rdf+xml"} + # Save object at webservice + def put + append RDF::DC.modified, DateTime.now + begin + RestClientWrapper.put @uri.to_s, self.to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} + rescue # fall back to rdfxml + RestClientWrapper.put @uri.to_s, self.to_rdfxml, { :content_type => "application/rdf+xml", :subjectid => @subjectid} + end + end + + # Delete object at webservice + def delete + @response = RestClientWrapper.delete(@uri.to_s,nil,{:subjectid => @subjectid}) end RDF_FORMATS.each do |format| @@ -83,38 +100,6 @@ module OpenTox end end - def to_yaml - @rdf.to_hash.to_yaml - end - - def to_json - to_hash.to_json - end - - # REST API - def get headers={} - headers[:subjectid] ||= @subjectid - headers[:accept] ||= 'application/rdf+xml' - @response = RestClientWrapper.get @uri, {}, headers - end - - def post payload={}, headers={} - headers[:subjectid] ||= @subjectid - headers[:accept] ||= 'application/rdf+xml' - @response = RestClientWrapper.post(@uri.to_s, payload, headers) - end - - def put payload={}, headers={} - headers[:subjectid] ||= @subjectid - headers[:accept] ||= 'application/rdf+xml' - @response = RestClientWrapper.put(@uri.to_s, payload, headers) - end - - def delete headers={} - headers[:subjectid] ||= @subjectid - @response = RestClientWrapper.delete(@uri.to_s,nil,headers) - end - # class methods module ClassMethods @@ -123,22 +108,10 @@ module OpenTox uris.collect{|uri| URI.task?(service_uri) ? from_uri(uri, subjectid, false) : from_uri(uri, subjectid)} end - def create service_uri, subjectid=nil - bnode = RDF::Node.new - klass = "RDF::OT."+self.class.to_s.split('::').last - #puts self.class - #puts klass - #object = eval "#{~ - @rdf << [bnode, RDF.type, klass] - #uri = File.join(service_uri,SecureRandom.uuid) - uri = RestClientWrapper.post(service_uri, self.to_ntriples, {:content_type => 'text/plain', :accept => 'text/uri-list', :subjectid => subjectid}) - #uri = RestClientWrapper.put(uri, {}, {:accept => 'text/uri-list', :subjectid => subjectid}) - URI.task?(service_uri) ? from_uri(uri, subjectid, false) : from_uri(uri, subjectid) - end - def from_file service_uri, filename, subjectid=nil file = File.new filename - # TODO: sdf files are incorrectly detected + # sdf files are incorrectly detected + file.mime_type = "chemical/x-mdl-sdfile" if File.extname(filename) == ".sdf" from_uri RestClientWrapper.post(service_uri, {:file => file}, {:subjectid => subjectid, :content_type => file.mime_type, :accept => "text/uri-list"}), subjectid end diff --git a/lib/task.rb b/lib/task.rb index d45b0d2..f3f7f6b 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -8,13 +8,11 @@ module OpenTox def self.create service_uri, subjectid=nil, params={} - uri = RDF::URI.new File.join(service_uri,SecureRandom.uuid) + uri = File.join(service_uri,SecureRandom.uuid) task = Task.new uri, subjectid - task.rdf << RDF::Statement.new(uri, RDF.type, RDF::OT.Task) - task.rdf << RDF::Statement.new(uri, RDF::DC.date, RDF::Literal.new(DateTime.now)) - task.rdf << RDF::Statement.new(uri, RDF::OT.hasStatus, RDF::Literal.new("Running")) - params.each {|k,v| task.rdf << RDF::Statement.new(uri, k, v)} - task.save + task[RDF::OT.hasStatus] = "Running" + params.each { |k,v| task[k] = v } + task.put pid = fork do begin result_uri = yield @@ -53,24 +51,23 @@ module OpenTox end def description - pull - self.[](RDF::DC.description).uniq.first + self.[](RDF::DC.description) end def creator - pull - self.[](RDF::DC.creator).uniq.first + self.[](RDF::DC.creator) end def cancel kill - RestClientWrapper.put(File.join(@uri,'Cancelled'),{}) + self.[]=(RDF::OT.hasStatus, "Cancelled") + put end def completed(uri) - #puts uri - #not_found_error "Result URI \"#{uri}\" does not exist." unless URI.accessible? uri, @subjectid - RestClientWrapper.put(File.join(@uri,'Completed'),{:resultURI => uri}) + self.[]=(RDF::OT.resultURI, uri) + self.[]=(RDF::OT.hasStatus, "Completed") + put end # waits for a task, unless time exceeds or state is no longer running @@ -85,6 +82,7 @@ module OpenTox dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min time_out_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) end + get end end @@ -109,6 +107,7 @@ module OpenTox [:hasStatus, :resultURI].each do |method| define_method method do + get response = self.[](RDF::OT[method]) response = self.[](RDF::OT1[method]) unless response # API 1.1 compatibility response -- cgit v1.2.3 From bf6834445feb6f93f0a20359462dbd1e7e89f4b8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 12 Jul 2012 16:38:03 +0200 Subject: all opentox-client tests pass --- lib/compound.rb | 12 ++--- lib/dataset.rb | 134 ++++++++++++++++++++++++++++++++++++++++++------- lib/error.rb | 5 +- lib/opentox-client.rb | 2 + lib/opentox.rb | 80 +++++++++++++---------------- opentox-client.gemspec | 1 + 6 files changed, 161 insertions(+), 73 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index ce0fdbf..5992ee3 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -40,25 +40,25 @@ module OpenTox # Get InChI # @return [String] InChI string def to_inchi - get(:accept => 'chemical/x-inchi').to_s.chomp if @uri + RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-inchi'}).chomp end # Get (canonical) smiles # @return [String] Smiles string def to_smiles - get(:accept => 'chemical/x-daylight-smiles').chomp + RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-daylight-smiles'}).chomp end # Get sdf # @return [String] SDF string def to_sdf - get(:accept => 'chemical/x-mdl-sdfile').chomp + RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-mdl-sdfile'}).chomp end # Get gif image # @return [image/gif] Image data def to_gif - get("#{CACTUS_URI}#{to_inchi}/image") + RestClientWrapper.get("#{CACTUS_URI}#{to_inchi}/image") end # Get png image @@ -66,7 +66,7 @@ module OpenTox # image = compound.to_png # @return [image/png] Image data def to_png - get(File.join @uri, "image") + RestClientWrapper.get(File.join @uri, "image") end # Get URI of compound image @@ -81,7 +81,7 @@ module OpenTox # @return [String] Compound names def to_names begin - get("#{CACTUS_URI}#{to_inchi}/names").split("\n") + RestClientWrapper.get("#{CACTUS_URI}#{to_inchi}/names").split("\n") rescue "not available" end diff --git a/lib/dataset.rb b/lib/dataset.rb index 33e1571..ed0ccdd 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -3,32 +3,128 @@ module OpenTox # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). class Dataset - def data_entries - data_entries = [] - #pull - #@reload = false - begin - self.[](RDF::OT.dataEntry).collect{|data_entry| data_entries << @rdf.to_hash[data_entry] } - rescue + attr_accessor :features, :compounds, :data_entries + + def initialize uri=nil, subjectid=nil + super uri, subjectid + @features = [] + @compounds = [] + @data_entries = [] + append RDF.type, RDF::OT.OrderedDataset + end + + def upload filename + file = File.new filename + RestClientWrapper.put(@uri, {:file => file}, {:subjectid => @subjectid}) + end + + def get + super + @features = [] + @compounds = [] + @data_entries = [] + query = RDF::Query.new do + pattern [:uri, RDF.type, RDF::OT.OrderedDataset] end - begin - # TODO: remove API 1.1 - self.[](RDF::OT1.dataEntry).collect{|data_entry| data_entries << @rdf.to_hash[data_entry] } - rescue + if query.execute(@rdf).first # ordered dataset + query = RDF::Query.new do + pattern [:uri, RDF.type, RDF::OT.Compound] + pattern [:uri, RDF::OLO.index, :idx] + end + @compounds = query.execute(@rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Compound.new s.uri.to_s} + query = RDF::Query.new do + pattern [:uri, RDF.type, RDF::OT.Feature] + pattern [:uri, RDF::OLO.index, :idx] + end + @features = query.execute(@rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Feature.new(s.uri.to_s)} + numeric_features = @features.collect{|f| f.get; f[RDF.type].include? RDF::OT.NumericFeature} + @compounds.each_with_index do |compound,i| + query = RDF::Query.new do + pattern [:data_entry, RDF::OLO.index, i] + pattern [:data_entry, RDF::OT.values, :values] + pattern [:values, RDF::OT.feature, :feature] + pattern [:feature, RDF::OLO.index, :feature_idx] + pattern [:values, RDF::OT.value, :value] + end + values = query.execute(@rdf).sort_by{|s| s.feature_idx}.collect do |s| + numeric_features[s.feature_idx] ? s.value.to_s.to_f : s.value.to_s + end + @data_entries << values + end + else + query = RDF::Query.new do + pattern [:uri, RDF.type, RDF::OT.Feature] + end + @features = query.execute(@rdf).collect{|s| OpenTox::Feature.new(s.uri.to_s)} + query = RDF::Query.new do + pattern [:data_entry, RDF::OT.compound, :compound] + end + @compounds = query.execute(@rdf).sort_by{|s| s.data_entry}.collect{|s| OpenTox::Compound.new s.compound.to_s} + numeric_features = @features.collect{|f| f.get; f[RDF.type].include? RDF::OT.NumericFeature} + @compounds.each do |compound| + values = [] + @features.each_with_index do |feature,i| + query = RDF::Query.new do + pattern [:data_entry, RDF::OT.compound, RDF::URI.new(compound.uri)] + pattern [:data_entry, RDF::OT.values, :values] + pattern [:values, RDF::OT.feature, RDF::URI.new(feature.uri)] + pattern [:values, RDF::OT.value, :value] + end + value = query.execute(@rdf).first.value.to_s + value = value.to_f if numeric_features[i] + values << value + end + @data_entries << values + end end - #@reload = true - data_entries end - def compounds - uri = File.join(@uri,"compounds") - RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n").collect{|uri| OpenTox::Compound.new uri} + def get_metadata + uri = File.join(@uri,"metadata") + begin + parse_ntriples RestClientWrapper.get(uri,{},{:accept => "text/plain", :subjectid => @subjectid}) + rescue # fall back to rdfxml + parse_rdfxml RestClientWrapper.get(uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid}) + end + metadata end - def features - uri = File.join(@uri,"features") - RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n").collect{|uri| OpenTox::Feature.new uri} + def << data_entry + compound = data_entry.shift + bad_request_error "Dataset features are empty." unless features + bad_request_error "data_entry size does not match features size." unless data_entry.size == features.size + bad_request_error "First data_entry is not a OpenTox::Compound" unless compound.class == OpenTox::Compound + @compounds << compound + @data_entries << data_entry end + RDF_FORMATS.each do |format| + + # redefine rdf serialization methods + send :define_method, "to_#{format}".to_sym do + # TODO: check, might affect appending to unordered datasets + features.each_with_index do |feature,i| + @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Feature)] + @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] + end + compounds.each_with_index do |compound,i| + @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Compound)] + @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] + data_entry_node = RDF::Node.new + @rdf << [RDF::URI.new(@uri), RDF::URI.new(RDF::OT.dataEntry), data_entry_node] + @rdf << [data_entry_node, RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.DataEntry)] + @rdf << [data_entry_node, RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] + @rdf << [data_entry_node, RDF::URI.new(RDF::OT.compound), RDF::URI.new(compound.uri)] + data_entries[i].each_with_index do |value,j| + value_node = RDF::Node.new + @rdf << [data_entry_node, RDF::URI.new(RDF::OT.values), value_node] + @rdf << [value_node, RDF::URI.new(RDF::OT.feature), RDF::URI.new(@features[j].uri)] + @rdf << [value_node, RDF::URI.new(RDF::OT.value), RDF::Literal.new(value)] + end + end + super() + end + + end end end diff --git a/lib/error.rb b/lib/error.rb index 64b0fb1..51451e7 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -10,7 +10,7 @@ class RuntimeError $logger.error "\n"+self.to_turtle end - # define to_ and self.from_ methods for various rdf formats + # define to_ methods for all RuntimeErrors and various rdf formats RDF_FORMATS.each do |format| send :define_method, "to_#{format}".to_sym do @@ -22,7 +22,7 @@ class RuntimeError subject = RDF::Node.new writer << [subject, RDF.type, RDF::OT.ErrorReport] writer << [subject, RDF::OT.actor, @uri.to_s] - writer << [subject, RDF::OT.message, @message.to_s] + writer << [subject, RDF::OT.message, message.to_s] writer << [subject, RDF::OT.statusCode, @http_code] writer << [subject, RDF::OT.errorCode, self.class.to_s] @@ -80,7 +80,6 @@ module OpenTox class RestCallError < Error attr_accessor :request#, :response def initialize message, request, uri - #def initialize request, response, message @request = request #@response = response super 502, message, uri diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 8c19225..ad7d3cc 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -2,6 +2,7 @@ require 'rubygems' require "bundler/setup" require 'rdf' require 'rdf/raptor' +require 'rdf/n3' require "rest-client" require 'uri' require 'yaml' @@ -14,6 +15,7 @@ require "securerandom" RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' +RDF::OLO = RDF::Vocabulary.new 'http://purl.org/ontology/olo/core#' CLASSES = ["Generic", "Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] RDF_FORMATS = [:rdfxml,:ntriples,:turtle] diff --git a/lib/opentox.rb b/lib/opentox.rb index b0c786a..9225bb0 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -14,7 +14,14 @@ module OpenTox # @return [OpenTox] OpenTox object def initialize uri=nil, subjectid=nil @rdf = RDF::Graph.new - uri ? @uri = uri.to_s.chomp : @uri = RDF::Node.uuid.to_s + if uri + @uri = uri.to_s.chomp + else + service = self.class.to_s.split('::').last.downcase + service_uri = eval("$#{service}[:uri]") + bad_request_error "$#{service}[:uri] variable not set. Please set $#{service}[:uri] or use an explicit uri as first constructor argument " unless service_uri + @uri = File.join service_uri, SecureRandom.uuid + end append RDF.type, eval("RDF::OT."+self.class.to_s.split('::').last) append RDF::DC.date, DateTime.now @subjectid = subjectid @@ -24,7 +31,6 @@ module OpenTox # @return [Hash] Object metadata def metadata # return plain strings instead of RDF objects - #puts @rdf.to_hash @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate.to_s] = values.collect{|v| v.to_s}; h } end @@ -32,6 +38,7 @@ module OpenTox # @param [String] Predicate URI # @return [Array, String] Predicate value(s) def [](predicate) + return nil if metadata[predicate.to_s].nil? metadata[predicate.to_s].size == 1 ? metadata[predicate.to_s].first : metadata[predicate.to_s] end @@ -55,30 +62,30 @@ module OpenTox # Get object from webservice def get parse_ntriples RestClientWrapper.get(@uri,{},{:accept => "text/plain", :subjectid => @subjectid}) - rescue # fall back to rdfxml - parse_rdfxml RestClientWrapper.get(@uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid}) + #rescue # fall back to rdfxml + #parse_rdfxml RestClientWrapper.get(@uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid}) end # Post object to webservice def post service_uri RestClientWrapper.post service_uri, to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} - rescue # fall back to rdfxml - RestClientWrapper.post service_uri, to_rdfxml, { :content_type => "application/rdf+xml", :subjectid => @subjectid} + #rescue # fall back to rdfxml + #RestClientWrapper.post service_uri, to_rdfxml, { :content_type => "application/rdf+xml", :subjectid => @subjectid} end # Save object at webservice def put append RDF::DC.modified, DateTime.now - begin + #begin RestClientWrapper.put @uri.to_s, self.to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} - rescue # fall back to rdfxml - RestClientWrapper.put @uri.to_s, self.to_rdfxml, { :content_type => "application/rdf+xml", :subjectid => @subjectid} - end + #rescue # fall back to rdfxml + #RestClientWrapper.put @uri.to_s, self.to_rdfxml, { :content_type => "application/rdf+xml", :subjectid => @subjectid} + #end end # Delete object at webservice def delete - @response = RestClientWrapper.delete(@uri.to_s,nil,{:subjectid => @subjectid}) + RestClientWrapper.delete(@uri.to_s,nil,{:subjectid => @subjectid}) end RDF_FORMATS.each do |format| @@ -100,42 +107,20 @@ module OpenTox end end - # class methods - module ClassMethods - - def all service_uri, subjectid=nil - uris = RestClientWrapper.get(service_uri, {}, :accept => 'text/uri-list').split("\n").compact - uris.collect{|uri| URI.task?(service_uri) ? from_uri(uri, subjectid, false) : from_uri(uri, subjectid)} + def to_turtle # redefine to use prefixes (not supported by RDF::Writer) + prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} + ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } + turtle = RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + @rdf.each{|statement| writer << statement} end + end - def from_file service_uri, filename, subjectid=nil - file = File.new filename - # sdf files are incorrectly detected - file.mime_type = "chemical/x-mdl-sdfile" if File.extname(filename) == ".sdf" - from_uri RestClientWrapper.post(service_uri, {:file => file}, {:subjectid => subjectid, :content_type => file.mime_type, :accept => "text/uri-list"}), subjectid + {:title => RDF::DC.title, :dexcription => RDF::DC.description}.each do |method,predicate| + send :define_method, method do + self.[](predicate) end - - private - def from_uri uri, subjectid=nil, wait=true - - uri.chomp! - # TODO add waiting task - if URI.task?(uri) and wait - t = OpenTox::Task.new(uri) - t.wait - uri = t.resultURI - end - - # guess class from uri, this is potentially unsafe, but polling metadata from large uri lists is way too slow (and not all service provide RDF.type in their metadata) - result = CLASSES.collect{|s| s if uri =~ /#{s.downcase}/}.compact - if result.size == 1 - klass = result.first - else - klass = OpenTox::Generic.new(uri)[RDF.type] - internal_server_error "Cannot determine class from URI '#{uri} (Candidate classes are #{result.inspect}) or matadata." unless klass - end - # initialize with/without subjectid - subjectid ? eval("#{self}.new(\"#{uri}\", \"#{subjectid}\")") : eval("#{self}.new(\"#{uri}\")") + send :define_method, "#{method}=" do |value| + self.[]=(predicate,value) end end @@ -143,7 +128,12 @@ module OpenTox CLASSES.each do |klass| c = Class.new do include OpenTox - extend OpenTox::ClassMethods + #extend OpenTox::ClassMethods + + def self.all service_uri, subjectid=nil + uris = RestClientWrapper.get(service_uri, {}, :accept => 'text/uri-list').split("\n").compact + uris.collect{|uri| self.new(uri, subjectid)} + end end OpenTox.const_set klass,c end diff --git a/opentox-client.gemspec b/opentox-client.gemspec index 75d390b..f9d333a 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -23,6 +23,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency "rest-client" s.add_runtime_dependency "rdf" s.add_runtime_dependency "rdf-raptor" + s.add_runtime_dependency 'rdf-n3' s.add_runtime_dependency "open4" # external requirements -- cgit v1.2.3 From 66dae77b92308bb09781948ad4caf90b770d1ef8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 13 Jul 2012 12:24:37 +0200 Subject: wait for tasks in post/put requests --- lib/dataset.rb | 6 +++--- lib/opentox.rb | 8 +++++--- lib/task.rb | 6 +++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index ed0ccdd..a6c22d0 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -13,9 +13,9 @@ module OpenTox append RDF.type, RDF::OT.OrderedDataset end - def upload filename - file = File.new filename - RestClientWrapper.put(@uri, {:file => file}, {:subjectid => @subjectid}) + def upload filename, wait=true + uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}, {:subjectid => @subjectid}) + OpenTox::Task.new(uri).wait if URI.task?(uri) and wait end def get diff --git a/lib/opentox.rb b/lib/opentox.rb index 9225bb0..019699b 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -67,20 +67,22 @@ module OpenTox end # Post object to webservice - def post service_uri - RestClientWrapper.post service_uri, to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} + def post service_uri, wait=true + uri = RestClientWrapper.post service_uri, to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} + OpenTox::Task.new(uri).wait if URI.task?(uri) and wait #rescue # fall back to rdfxml #RestClientWrapper.post service_uri, to_rdfxml, { :content_type => "application/rdf+xml", :subjectid => @subjectid} end # Save object at webservice - def put + def put wait=true append RDF::DC.modified, DateTime.now #begin RestClientWrapper.put @uri.to_s, self.to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} #rescue # fall back to rdfxml #RestClientWrapper.put @uri.to_s, self.to_rdfxml, { :content_type => "application/rdf+xml", :subjectid => @subjectid} #end + OpenTox::Task.new(uri).wait if URI.task?(uri) and wait end # Delete object at webservice diff --git a/lib/task.rb b/lib/task.rb index f3f7f6b..4f446b7 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -12,7 +12,7 @@ module OpenTox task = Task.new uri, subjectid task[RDF::OT.hasStatus] = "Running" params.each { |k,v| task[k] = v } - task.put + task.put false pid = fork do begin result_uri = yield @@ -61,13 +61,13 @@ module OpenTox def cancel kill self.[]=(RDF::OT.hasStatus, "Cancelled") - put + put false end def completed(uri) self.[]=(RDF::OT.resultURI, uri) self.[]=(RDF::OT.hasStatus, "Completed") - put + put false end # waits for a task, unless time exceeds or state is no longer running -- cgit v1.2.3 From a214c802868e05a5ea90a03c894cf7ef0206da28 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 13 Jul 2012 12:30:41 +0200 Subject: wait for tasks also in get requests --- lib/opentox.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 019699b..2e0f05a 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -60,8 +60,13 @@ module OpenTox end # Get object from webservice - def get - parse_ntriples RestClientWrapper.get(@uri,{},{:accept => "text/plain", :subjectid => @subjectid}) + def get wait=true + response = RestClientWrapper.get(@uri,{},{:accept => "text/plain", :subjectid => @subjectid}) + if URI.task?(response) and wait + t = OpenTox::Task.new(uri).wait + response = RestClientWrapper.get(t.resultURI,{},{:accept => "text/plain", :subjectid => @subjectid}) + end + parse_ntriples response #rescue # fall back to rdfxml #parse_rdfxml RestClientWrapper.get(@uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid}) end -- cgit v1.2.3 From 095decd233ac6d138a412c459735c1376cf25958 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 13 Jul 2012 13:28:06 +0200 Subject: duplicates method for Enumerable --- lib/overwrite.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index fa2128a..137fec8 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -10,13 +10,11 @@ class Object end end -=begin module Enumerable def duplicates - inject({}) {|h,v| h[v] += 1; h}.reject{|k,v| v==1}.keys + inject({}) {|h,v| h[v]=h[v].to_i+1; h}.reject{|k,v| v==1}.keys end end -=end class String def underscore -- cgit v1.2.3 From 76144341d800cec80cbb063b8c1acf6da19fad5d Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 13 Jul 2012 17:12:44 +0200 Subject: csv handling of empty cells fixed --- lib/dataset.rb | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index a6c22d0..e0f2d5a 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -18,6 +18,15 @@ module OpenTox OpenTox::Task.new(uri).wait if URI.task?(uri) and wait end + def to_csv + CSV.generate do |csv| + csv << ["SMILES"] + @features.collect{|f| f.title} + @compounds.each_with_index do |c,i| + csv << [c.to_smiles] + @data_entries[i] + end + end + end + def get super @features = [] @@ -47,9 +56,9 @@ module OpenTox pattern [:values, RDF::OT.value, :value] end values = query.execute(@rdf).sort_by{|s| s.feature_idx}.collect do |s| - numeric_features[s.feature_idx] ? s.value.to_s.to_f : s.value.to_s + (numeric_features[s.feature_idx] and s.value.to_s != "") ? s.value.to_s.to_f : s.value.to_s end - @data_entries << values + @data_entries << values.collect{|v| v == "" ? nil : v} end else query = RDF::Query.new do @@ -71,7 +80,7 @@ module OpenTox pattern [:values, RDF::OT.value, :value] end value = query.execute(@rdf).first.value.to_s - value = value.to_f if numeric_features[i] + value = value.to_f if numeric_features[i] and !value.nil? values << value end @data_entries << values -- cgit v1.2.3 From 81f0924c654875a738b646ad951a28f906e0a97c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 18 Jul 2012 09:59:21 +0200 Subject: rest call error handling fixed --- lib/error.rb | 4 +++- lib/overwrite.rb | 1 - lib/rest-client-wrapper.rb | 24 +++++++++++++++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 51451e7..3017c7f 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -33,7 +33,6 @@ class RuntimeError cut_index -= 1 cut_index = backtrace.size-1 if cut_index < 0 details = backtrace[0..cut_index].join("\n") - details += "REST paramenters:\n#{@request.args.inspect}" if @request writer << [subject, RDF::OT.errorCause, details] end rdf @@ -59,6 +58,7 @@ module OpenTox "LockedError" => 423, "InternalServerError" => 500, "NotImplementedError" => 501, + "RestCallError" => 501, "ServiceUnavailableError" => 503, "TimeOutError" => 504, }.each do |klass,code| @@ -76,6 +76,7 @@ module OpenTox end end +=begin # Errors received from RestClientWrapper calls class RestCallError < Error attr_accessor :request#, :response @@ -85,5 +86,6 @@ module OpenTox super 502, message, uri end end +=end end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 137fec8..0a55ce2 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -93,4 +93,3 @@ module Kernel end end - diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 5707831..e89c90d 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -42,8 +42,30 @@ module OpenTox @response = @request.execute do |response, request, result| if [301, 302, 307].include? response.code and request.method == :get response.follow_redirection(request, result) + elsif response.code >= 400 and !URI.task?(uri) + message = response.to_s + message += "\nREST paramenters:\n#{request.args.inspect}" + case response.code + when 400 + bad_request_error message, uri + when 401 + not_authorized_error message, uri + when 404 + not_found_error message, uri + when 433 + locked_error message, uri + when 500 + internal_server_error message, uri + when 501 + not_implemented_error message, uri + when 503 + service_unavailable_error message, uri + when 504 + time_out_error message, uri + else + rest_call_error message, uri + end else - raise OpenTox::RestCallError.new response.to_s, request, uri unless response.code < 400 or URI.task? uri response end end -- cgit v1.2.3 From b3d32c18947b659dfa98b066931fb8912f7dc102 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 18 Jul 2012 16:27:21 +0200 Subject: dataset-large tests pass --- lib/error.rb | 12 ------------ lib/opentox.rb | 37 +++++++++++++++++++++++-------------- lib/overwrite.rb | 4 ++-- 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 3017c7f..d1abe52 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -76,16 +76,4 @@ module OpenTox end end -=begin - # Errors received from RestClientWrapper calls - class RestCallError < Error - attr_accessor :request#, :response - def initialize message, request, uri - @request = request - #@response = response - super 502, message, uri - end - end -=end - end diff --git a/lib/opentox.rb b/lib/opentox.rb index 2e0f05a..825531c 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -60,34 +60,29 @@ module OpenTox end # Get object from webservice - def get wait=true + def get + # TODO: RDFXML response = RestClientWrapper.get(@uri,{},{:accept => "text/plain", :subjectid => @subjectid}) - if URI.task?(response) and wait - t = OpenTox::Task.new(uri).wait + if URI.task?(response) + wait_for_task response response = RestClientWrapper.get(t.resultURI,{},{:accept => "text/plain", :subjectid => @subjectid}) end parse_ntriples response - #rescue # fall back to rdfxml - #parse_rdfxml RestClientWrapper.get(@uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid}) end # Post object to webservice def post service_uri, wait=true + # TODO: RDFXML uri = RestClientWrapper.post service_uri, to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} - OpenTox::Task.new(uri).wait if URI.task?(uri) and wait - #rescue # fall back to rdfxml - #RestClientWrapper.post service_uri, to_rdfxml, { :content_type => "application/rdf+xml", :subjectid => @subjectid} + wait_for_task uri if wait end # Save object at webservice def put wait=true + # TODO: RDFXML append RDF::DC.modified, DateTime.now - #begin - RestClientWrapper.put @uri.to_s, self.to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} - #rescue # fall back to rdfxml - #RestClientWrapper.put @uri.to_s, self.to_rdfxml, { :content_type => "application/rdf+xml", :subjectid => @subjectid} - #end - OpenTox::Task.new(uri).wait if URI.task?(uri) and wait + uri = RestClientWrapper.put @uri.to_s, self.to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} + wait_for_task uri if wait end # Delete object at webservice @@ -95,6 +90,20 @@ module OpenTox RestClientWrapper.delete(@uri.to_s,nil,{:subjectid => @subjectid}) end + def wait_for_task uri + if URI.task?(uri) + t = OpenTox::Task.new uri + t.wait + if t.completed? + uri = t.resultURI + else + #TODO raise correct error + internal_server_error "Task #{uri} failed with #{$!.inspect}" + end + end + uri + end + RDF_FORMATS.each do |format| # rdf parse methods for all formats e.g. parse_rdfxml diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 0a55ce2..785fbcd 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -86,10 +86,10 @@ module Kernel stdout = stdout_stream.read stderr = stderr_stream.read end - internal_server_error "`" + cmd + "` failed.\n" + stdout + stderr if !status.success? + internal_server_error "`" + cmd + "` failed.\n" + stdout + stderr unless status.success? return stdout rescue - internal_server_error $!.message + internal_server_error $!.message end end -- cgit v1.2.3 From 2aa0cf90210d179f802c6755298217380543b70c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 18 Jul 2012 19:20:38 +0200 Subject: toxbank policy tests pass --- lib/opentox.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 825531c..800874f 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -60,14 +60,14 @@ module OpenTox end # Get object from webservice - def get - # TODO: RDFXML - response = RestClientWrapper.get(@uri,{},{:accept => "text/plain", :subjectid => @subjectid}) + def get mime_type="text/plain" + response = RestClientWrapper.get(@uri,{},{:accept => mime_type, :subjectid => @subjectid}) if URI.task?(response) wait_for_task response - response = RestClientWrapper.get(t.resultURI,{},{:accept => "text/plain", :subjectid => @subjectid}) + response = RestClientWrapper.get(t.resultURI,{},{:accept => mime_type, :subjectid => @subjectid}) end - parse_ntriples response + parse_ntriples response if mime_type == "text/plain" + parse_rdfxml response if mime_type == "application/rdf+xml" end # Post object to webservice -- cgit v1.2.3 From 65c67111098ba37171ac12f6215c20c2a321d1de Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 18 Jul 2012 21:37:21 +0200 Subject: code cleanup in opentox.rb --- lib/opentox.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 800874f..d3b73fb 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -144,7 +144,6 @@ module OpenTox CLASSES.each do |klass| c = Class.new do include OpenTox - #extend OpenTox::ClassMethods def self.all service_uri, subjectid=nil uris = RestClientWrapper.get(service_uri, {}, :accept => 'text/uri-list').split("\n").compact -- cgit v1.2.3 From fc0397cd0d51df4fe7c23f601c2f211c2ebfbf77 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 26 Jul 2012 16:23:44 +0200 Subject: parameter settting for algorithms and models --- Gemfile.lock | 3 +++ lib/model.rb | 5 +++-- lib/opentox-client.rb | 24 ++++++++++++++---------- lib/opentox.rb | 30 +++++++++++++++++++++++++++++- 4 files changed, 49 insertions(+), 13 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 785b3e1..085e974 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,6 +5,7 @@ PATH bundler open4 rdf + rdf-n3 rdf-raptor rest-client @@ -17,6 +18,8 @@ GEM open4 (1.3.0) rdf (0.3.7) addressable (>= 2.2.6) + rdf-n3 (0.3.7) + rdf (>= 0.3.4) rdf-raptor (0.4.1) ffi (>= 1.0) rdf (~> 0.3.0) diff --git a/lib/model.rb b/lib/model.rb index 95aa9ff..c104e64 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -6,8 +6,9 @@ module OpenTox # @param [Hash] params Parameters for OpenTox model # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [text/uri-list] Task or resource URI - def run params=nil - post params, {:accept => 'text/uri-list'} + def run params=nil, wait=true + uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => @subjectid} + wait_for_task uri if wait end end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index ad7d3cc..276d378 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -24,13 +24,17 @@ RDF_FORMATS = [:rdfxml,:ntriples,:turtle] TRUE_REGEXP = /^(true|active|1|1.0|tox|activating|carcinogen|mutagenic)$/i FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-mutagenic)$/i -require File.join(File.dirname(__FILE__),"overwrite.rb") -require File.join(File.dirname(__FILE__),"error.rb") -require File.join(File.dirname(__FILE__),"rest-client-wrapper.rb") -require File.join(File.dirname(__FILE__),"authorization.rb") -require File.join(File.dirname(__FILE__),"policy.rb") -require File.join(File.dirname(__FILE__),"otlogger.rb") # avoid require conflicts with logger -require File.join(File.dirname(__FILE__),"opentox.rb") -require File.join(File.dirname(__FILE__),"task.rb") -require File.join(File.dirname(__FILE__),"compound.rb") -require File.join(File.dirname(__FILE__),"dataset.rb") +[ + "overwrite.rb", + "error.rb", + "rest-client-wrapper.rb", + "authorization.rb", + "policy.rb", + "otlogger.rb", + "opentox.rb", + "task.rb", + "compound.rb", + "dataset.rb", + "model.rb", +].each{ |f| require File.join(File.dirname(__FILE__),f) } + diff --git a/lib/opentox.rb b/lib/opentox.rb index d3b73fb..2c4578f 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -50,6 +50,30 @@ module OpenTox append predicate.to_s, values end + def parameters + params = {} + query = RDF::Query.new({ + :parameter => { + RDF.type => RDF::OT.Parameter, + :property => :value, + } + }) + query.execute(@rdf).each do |solution| + params[solution.parameter] = {} unless params[solution.parameter] + params[solution.parameter][solution.property.to_s] = solution.value.to_s + end + params.values + end + + def parameters=(parameters) + parameters.each do |param| + p_node = RDF::Node.new + @rdf << [RDF::URI.new(@uri), RDF::OT.parameters, p_node] + @rdf << [p_node, RDF.type, RDF::OT.Parameter] + param.each{ |p,o| @rdf << [p_node, p, o] } + end + end + # Append object metadata # @param [String] Predicate URI # @param [Array, String] Predicate value(s) @@ -131,7 +155,11 @@ module OpenTox end end - {:title => RDF::DC.title, :dexcription => RDF::DC.description}.each do |method,predicate| + { + :title => RDF::DC.title, + :dexcription => RDF::DC.description, + :type => RDF.type + }.each do |method,predicate| send :define_method, method do self.[](predicate) end -- cgit v1.2.3 From 32ad3c8f6e1e16cfe9fd59a47df6b560ffb13ddd Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 1 Aug 2012 14:56:08 +0200 Subject: task error handling improved --- lib/compound.rb | 2 +- lib/error.rb | 56 +++++++++++++++++++++++++--------------------- lib/opentox.rb | 12 +++++----- lib/rest-client-wrapper.rb | 6 ++--- lib/task.rb | 17 ++++++++++++-- 5 files changed, 55 insertions(+), 38 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 5992ee3..7d84a3c 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -83,7 +83,7 @@ module OpenTox begin RestClientWrapper.get("#{CACTUS_URI}#{to_inchi}/names").split("\n") rescue - "not available" + "CACTVS service not responding." end end diff --git a/lib/error.rb b/lib/error.rb index d1abe52..84918b7 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -7,43 +7,49 @@ class RuntimeError super message @uri = uri @http_code ||= 500 - $logger.error "\n"+self.to_turtle + @rdf = RDF::Graph.new + subject = RDF::Node.new + @rdf << [subject, RDF.type, RDF::OT.ErrorReport] + @rdf << [subject, RDF::OT.actor, @uri.to_s] + @rdf << [subject, RDF::OT.message, message.to_s] + @rdf << [subject, RDF::OT.statusCode, @http_code] + @rdf << [subject, RDF::OT.errorCode, self.class.to_s] + @rdf << [subject, RDF::OT.errorCause, short_backtrace] + $logger.error("\n"+self.to_turtle) end - # define to_ methods for all RuntimeErrors and various rdf formats - RDF_FORMATS.each do |format| + def short_backtrace + backtrace = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact + cut_index = backtrace.find_index{|line| line.match /sinatra|minitest/} + cut_index ||= backtrace.size + cut_index -= 1 + cut_index = backtrace.size-1 if cut_index < 0 + backtrace[0..cut_index].join("\n") + end + RDF_FORMATS.each do |format| + # rdf serialization methods for all formats e.g. to_rdfxml send :define_method, "to_#{format}".to_sym do - rdf = RDF::Writer.for(format).buffer do |writer| - # TODO: not used for turtle - # http://rdf.rubyforge.org/RDF/Writer.html# - writer.prefix :ot, RDF::URI('http://www.opentox.org/api/1.2#') - writer.prefix :ot1_1, RDF::URI('http://www.opentox.org/api/1.1#') - subject = RDF::Node.new - writer << [subject, RDF.type, RDF::OT.ErrorReport] - writer << [subject, RDF::OT.actor, @uri.to_s] - writer << [subject, RDF::OT.message, message.to_s] - writer << [subject, RDF::OT.statusCode, @http_code] - writer << [subject, RDF::OT.errorCode, self.class.to_s] - - # cut backtrace - backtrace = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact - cut_index = backtrace.find_index{|line| line.match /sinatra|minitest/} - cut_index ||= backtrace.size - cut_index -= 1 - cut_index = backtrace.size-1 if cut_index < 0 - details = backtrace[0..cut_index].join("\n") - writer << [subject, RDF::OT.errorCause, details] + RDF::Writer.for(format).buffer do |writer| + @rdf.each{|statement| writer << statement} end - rdf end + end + def to_turtle # redefine to use prefixes (not supported by RDF::Writer) + prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} + ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } + RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + @rdf.each{|statement| writer << statement} + end end + end module OpenTox class Error < RuntimeError + def initialize code, message, uri=nil @http_code = code super message, uri @@ -72,7 +78,7 @@ module OpenTox # define global methods for raising errors, eg. bad_request_error Object.send(:define_method, klass.underscore.to_sym) do |message,uri=nil| - raise c, message, uri + raise c.new(message, uri) end end diff --git a/lib/opentox.rb b/lib/opentox.rb index 2c4578f..80644db 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -118,12 +118,11 @@ module OpenTox if URI.task?(uri) t = OpenTox::Task.new uri t.wait - if t.completed? - uri = t.resultURI - else + unless t.completed? #TODO raise correct error - internal_server_error "Task #{uri} failed with #{$!.inspect}" + #internal_server_error "Task #{uri} failed with #{$!.inspect}" end + uri = t.resultURI end uri end @@ -140,17 +139,16 @@ module OpenTox # rdf serialization methods for all formats e.g. to_rdfxml send :define_method, "to_#{format}".to_sym do - rdf = RDF::Writer.for(format).buffer do |writer| + RDF::Writer.for(format).buffer do |writer| @rdf.each{|statement| writer << statement} end - rdf end end def to_turtle # redefine to use prefixes (not supported by RDF::Writer) prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } - turtle = RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| @rdf.each{|statement| writer << statement} end end diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index e89c90d..387a01b 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -17,9 +17,9 @@ module OpenTox # check input @subjectid = headers[:subjectid] ? headers[:subjectid] : nil - bad_request_error "Invalid URI: '#{uri}'" unless URI.valid? uri - #not_found_error "URI '#{uri}' not found." unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) - bad_request_error "Headers are not a hash: #{headers.inspect}" unless headers==nil or headers.is_a?(Hash) + bad_request_error "Invalid URI: '#{uri}'", uri unless URI.valid? uri + #not_found_error "URI '#{uri}' not found.", uri unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) + bad_request_error "Headers are not a hash: #{headers.inspect}", uri unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| if defined? $aa || URI(uri).host == URI($aa[:uri]).host diff --git a/lib/task.rb b/lib/task.rb index 0b0aea2..42bc84b 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -47,7 +47,7 @@ module OpenTox def kill Process.kill(9,@pid) Process.kill(9,@observer_pid) - rescue # no need to raise an exeption if processes are not running + rescue # no need to raise an exception if processes are not running end def description @@ -82,7 +82,6 @@ module OpenTox dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min time_out_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) end - get end end @@ -114,6 +113,20 @@ module OpenTox end end + def error_report + report = {} + query = RDF::Query.new({ + :report => { + RDF.type => RDF::OT.ErrorReport, + :property => :value, + } + }) + query.execute(@rdf).each do |solution| + report[solution.property] = solution.value.to_s + end + report + end + #TODO: subtasks (only for progress) end -- cgit v1.2.3 From 75b1d2a98c17d8ef86c3a7a974e1be5444c9fb20 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 2 Aug 2012 23:33:11 +0200 Subject: error handling improved --- lib/error.rb | 22 ++++++---------------- lib/opentox-client.rb | 2 +- lib/rest-client-wrapper.rb | 43 ++++++++++++++++++++----------------------- 3 files changed, 27 insertions(+), 40 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 84918b7..e58ed5d 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -5,12 +5,12 @@ class RuntimeError attr_accessor :http_code, :uri def initialize message, uri=nil super message - @uri = uri + @uri = uri.to_s.sub(%r{//.*:.*@},'//') # remove credentials from uri @http_code ||= 500 @rdf = RDF::Graph.new subject = RDF::Node.new @rdf << [subject, RDF.type, RDF::OT.ErrorReport] - @rdf << [subject, RDF::OT.actor, @uri.to_s] + @rdf << [subject, RDF::OT.actor, @uri] @rdf << [subject, RDF::OT.message, message.to_s] @rdf << [subject, RDF::OT.statusCode, @http_code] @rdf << [subject, RDF::OT.errorCode, self.class.to_s] @@ -57,27 +57,17 @@ module OpenTox end # OpenTox errors - { - "BadRequestError" => 400, - "NotAuthorizedError" => 401, - "NotFoundError" => 404, - "LockedError" => 423, - "InternalServerError" => 500, - "NotImplementedError" => 501, - "RestCallError" => 501, - "ServiceUnavailableError" => 503, - "TimeOutError" => 504, - }.each do |klass,code| + RestClientWrapper.known_errors.each do |error| # create error classes c = Class.new Error do define_method :initialize do |message, uri=nil| - super code, message, uri + super error[:code], message, uri end end - OpenTox.const_set klass,c + OpenTox.const_set error[:class],c # define global methods for raising errors, eg. bad_request_error - Object.send(:define_method, klass.underscore.to_sym) do |message,uri=nil| + Object.send(:define_method, error[:method]) do |message,uri=nil| raise c.new(message, uri) end end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 276d378..5f5a106 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -26,8 +26,8 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m [ "overwrite.rb", - "error.rb", "rest-client-wrapper.rb", + "error.rb", "authorization.rb", "policy.rb", "otlogger.rb", diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 387a01b..67a6264 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -18,13 +18,13 @@ module OpenTox # check input @subjectid = headers[:subjectid] ? headers[:subjectid] : nil bad_request_error "Invalid URI: '#{uri}'", uri unless URI.valid? uri - #not_found_error "URI '#{uri}' not found.", uri unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) + #resource_not_found_error "URI '#{uri}' not found.", uri unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) bad_request_error "Headers are not a hash: #{headers.inspect}", uri unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| if defined? $aa || URI(uri).host == URI($aa[:uri]).host else - bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] + bad_request_error "#{header} should be submitted in the headers", uri if payload and payload.is_a?(Hash) and payload[header] end end @@ -44,27 +44,11 @@ module OpenTox response.follow_redirection(request, result) elsif response.code >= 400 and !URI.task?(uri) message = response.to_s - message += "\nREST paramenters:\n#{request.args.inspect}" - case response.code - when 400 - bad_request_error message, uri - when 401 - not_authorized_error message, uri - when 404 - not_found_error message, uri - when 433 - locked_error message, uri - when 500 - internal_server_error message, uri - when 501 - not_implemented_error message, uri - when 503 - service_unavailable_error message, uri - when 504 - time_out_error message, uri - else - rest_call_error message, uri - end + parameters = request.args + parameters[:headers][:subjectid] = "REMOVED" if parameters[:headers] and parameters[:headers][:subjectid] + message += "\nREST paramenters:\n#{parameters.inspect}" + error = known_errors.collect{|e| e if e[:code] == response.code}.compact.first + Object.method(error[:method]).call message, uri # call error method else response end @@ -72,5 +56,18 @@ module OpenTox end end + def self.known_errors + errors = [] + RestClient::STATUSES.each do |code,k| + if code >= 400 + method = k.underscore.gsub(/ |'/,'_') + method += "_error" unless method.match(/_error$/) + klass = method.split("_").collect{|s| s.capitalize}.join("") + errors << {:code => code, :method => method.to_sym, :class => klass} + end + end + errors + end + end end -- cgit v1.2.3 From 7046901ac5b45e138669c4faa482007a0481e53e Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 3 Aug 2012 13:06:27 +0200 Subject: add library links to README --- README.markdown | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 41b7a28..47f9c70 100644 --- a/README.markdown +++ b/README.markdown @@ -1,8 +1,23 @@ -opentox-ruby-minimal +opentox-client ==================== Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API +Libraries: + +* {OpenTox::Algorithm} Wrapper for OpenTox Algorithms +* {OpenTox::Authorization} Authorization and Authentication +* {OpenTox::Compound} Compound Library +* {OpenTox::Dataset} Dataset Library +* {OpenTox::Error} extends Exception class according the OpenTox API +* {OpenTox::Model} Model Library +* {OpenTox} OpenTox Library - general definition of OpenTox objects +* {OTLogger} OpenTox Logger Extensions +* {OpenTox::Policies} parse and serialize XML for the openSSO A&A server +* {OpenTox::RestClientWrapper} wrapper for the RestClient gem +* {OpenTox::Task} Task Library + + Dependencies ------------ -- cgit v1.2.3 From f965db794d27cf5f298fb2fc276da1cf829cd985 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 7 Aug 2012 09:33:45 +0200 Subject: resource_not_found_error when authentication is impossible --- lib/authorization.rb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index fd20f68..438c7c6 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -5,7 +5,7 @@ module OpenTox #@example Authentication # require "opentox-client" # OpenTox::Authorization::AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml - # token = OpenTox::Authorization.authenticate("username", "password") + # subjectid = OpenTox::Authorization.authenticate("username", "password") #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification module Authorization @@ -65,6 +65,7 @@ module OpenTox out = RestClientWrapper.post("#{AA}/auth/authenticate",{:username=>user, :password => pw}).sub("token.id=","").sub("\n","") return out rescue + resource_not_found_error "#{out.inspect}" return nil end end @@ -87,11 +88,12 @@ module OpenTox # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). def self.authorize(uri, action, subjectid) return true if !AA - begin - return true if RestClientWrapper.post("#{AA}/auth/authorize",{:uri => uri, :action => action, :subjectid => subjectid})== "boolean=true\n" - rescue - return nil - end + #begin + return true if RestClientWrapper.post("#{AA}/auth/authorize",{:uri => uri, :action => action, :subjectid => subjectid})== "boolean=true\n" + return false + #rescue + # return nil + #end end #Checks if a token is a valid token @@ -101,7 +103,7 @@ module OpenTox return true if !AA begin return true if RestClientWrapper.post("#{AA}/auth/isTokenValid",:tokenid => subjectid) == "boolean=true\n" - rescue + rescue #do rescue because openSSO throws 401 return false end return false -- cgit v1.2.3 From 523275b0e30412078a33d618dcb5a6f077716376 Mon Sep 17 00:00:00 2001 From: davor Date: Thu, 9 Aug 2012 18:30:07 +0200 Subject: Added bin/installer. --- bin/opentox-client-install | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 bin/opentox-client-install diff --git a/bin/opentox-client-install b/bin/opentox-client-install new file mode 100755 index 0000000..48905ca --- /dev/null +++ b/bin/opentox-client-install @@ -0,0 +1,59 @@ +#!/bin/sh + +# Installs Opentox Webservice. +# Author: Christoph Helma, Andreas Maunz. + +SELF=$(basename $0 -install) +[ "`id -u`" = "0" ] && echo "This script must be run as non-root." 1>&2 && exit 1 + +# Adjust ruby version here! +RUBY_NUM_VER="1.9.3-p194" + +echo +echo "Welcome to service installation ( to continue)." +read delete_me + + +# check wd is root of service +DIR=`pwd` +if echo $DIR | grep "$SELF/bin" >/dev/null 2>&1 ; then cd ..; fi + +# # # Boot the script + +# load base config, helper funs, environment +OT_CONFIG_DIR="$HOME/.opentox" +! [ -f "$OT_CONFIG_DIR/config/install/config.sh" ] && echo "config.sh not found." 1>&2 && exit 1 || . $OT_CONFIG_DIR/config/install/config.sh +! [ -f "$OT_PREFIX/install/utils.sh" ] && echo "utils.sh not found." 1>&2 && exit 1 || . $OT_PREFIX/install/utils.sh +[ -f $OT_CONFIG_DIR/opentox-ui.sh ] && . $OT_CONFIG_DIR/opentox-ui.sh # should have been done by user already +RUBY_DIR="$HOME/.rbenv/versions/$RUBY_NUM_VER" + + +# # # Install + +LOG="$OT_PREFIX/tmp/`basename $0`.log" +check_utils "rbenv find" +echo +echo "Installation ('$LOG'):" +echo + +# ruby +[ "`$RBENV local 2>/dev/null`" = "$RUBY_NUM_VER" ] || install_ruby + +# self +echo +install_with_bundler + +echo +echo "Installation finished." +echo +echo "IMPORTANT: How to configure your system:" +echo "IMPORTANT: a) Include '$OT_UI_CONF' in shell startup (e.g. ~/.bashrc)." +echo "IMPORTANT: b) Manually source '$OT_UI_CONF' every time." +echo "IMPORTANT: The command in both cases: '. $OT_UI_CONF'" +echo "IMPORTANT: NOW would be the best time to configure!" +echo +echo "Thank you for your attention." +echo + +# return to wd +cd "$DIR" -- cgit v1.2.3 From 2c28ce19166bd4f2329a1726eead602d6ec2f8c8 Mon Sep 17 00:00:00 2001 From: davor Date: Thu, 16 Aug 2012 18:48:23 +0200 Subject: Added functions from utils.sh --- bin/opentox-client-install | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/bin/opentox-client-install b/bin/opentox-client-install index 48905ca..4be2d6c 100755 --- a/bin/opentox-client-install +++ b/bin/opentox-client-install @@ -30,11 +30,8 @@ RUBY_DIR="$HOME/.rbenv/versions/$RUBY_NUM_VER" # # # Install -LOG="$OT_PREFIX/tmp/`basename $0`.log" check_utils "rbenv find" -echo -echo "Installation ('$LOG'):" -echo +check_log $SELF # ruby [ "`$RBENV local 2>/dev/null`" = "$RUBY_NUM_VER" ] || install_ruby @@ -43,17 +40,7 @@ echo echo install_with_bundler -echo -echo "Installation finished." -echo -echo "IMPORTANT: How to configure your system:" -echo "IMPORTANT: a) Include '$OT_UI_CONF' in shell startup (e.g. ~/.bashrc)." -echo "IMPORTANT: b) Manually source '$OT_UI_CONF' every time." -echo "IMPORTANT: The command in both cases: '. $OT_UI_CONF'" -echo "IMPORTANT: NOW would be the best time to configure!" -echo -echo "Thank you for your attention." -echo +notify # return to wd cd "$DIR" -- cgit v1.2.3 From 36ddfa15a91ddea1ed468c9cef4834fa5aebdbdd Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 20 Aug 2012 14:33:48 +0200 Subject: new compound serialisation methods --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index e0f2d5a..4816b5a 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -22,7 +22,7 @@ module OpenTox CSV.generate do |csv| csv << ["SMILES"] + @features.collect{|f| f.title} @compounds.each_with_index do |c,i| - csv << [c.to_smiles] + @data_entries[i] + csv << [c.smiles] + @data_entries[i] end end end -- cgit v1.2.3 From fdad1b78a4ec89c160bff710f0374614c22cda56 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 20 Aug 2012 14:36:39 +0200 Subject: cached compound representations, initial pubchem and chembl methods --- VERSION | 2 +- lib/compound.rb | 56 ++++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/VERSION b/VERSION index 3eefcb9..8c5ba87 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0 +5.0.0pre1 diff --git a/lib/compound.rb b/lib/compound.rb index 7d84a3c..127a6ee 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -11,6 +11,7 @@ module OpenTox # @param [String] smiles Smiles string # @return [OpenTox::Compound] Compound def self.from_smiles service_uri, smiles, subjectid=nil + @smiles = smiles Compound.new RestClientWrapper.post(service_uri, smiles, {:content_type => 'chemical/x-daylight-smiles', :subjectid => subjectid}) end @@ -18,6 +19,7 @@ module OpenTox # @param [String] smiles InChI string # @return [OpenTox::Compound] Compound def self.from_inchi service_uri, inchi, subjectid=nil + @inchi = inchi Compound.new RestClientWrapper.post(service_uri, inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) end @@ -33,60 +35,78 @@ module OpenTox # compound = OpenTox::Compound.from_name("Benzene") # @param [String] name name can be also an InChI/InChiKey, CAS number, etc # @return [OpenTox::Compound] Compound + # def self.from_name service_uri, name, subjectid=nil - Compound.new RestClientWrapper.post(service_uri, name, {:content_type => 'text/plain', :subjectid => subjectid}) + @inchi = RestClientWrapper.get File.join(CACTUS_URI,URI.escape(name),"stdinchi") + Compound.new RestClientWrapper.post(service_uri, @inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) end # Get InChI # @return [String] InChI string - def to_inchi - RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-inchi'}).chomp + def inchi + @inchi ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-inchi'}).chomp + end + + # Get InChIKey + # @return [String] InChI string + def inchikey + @inchikey ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-inchikey'}).chomp end # Get (canonical) smiles # @return [String] Smiles string - def to_smiles - RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-daylight-smiles'}).chomp + def smiles + @smiles ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-daylight-smiles'}).chomp end # Get sdf # @return [String] SDF string - def to_sdf + def sdf RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-mdl-sdfile'}).chomp end # Get gif image # @return [image/gif] Image data - def to_gif - RestClientWrapper.get("#{CACTUS_URI}#{to_inchi}/image") + def gif + RestClientWrapper.get File.join(CACTUS_URI,inchi,"image") end # Get png image # @example - # image = compound.to_png + # image = compound.png # @return [image/png] Image data - def to_png + def png RestClientWrapper.get(File.join @uri, "image") end # Get URI of compound image # @return [String] Compound image URI - def to_image_uri + def image_uri File.join @uri, "image" end # Get all known compound names. Relies on an external service for name lookups. # @example - # names = compound.to_names + # names = compound.names # @return [String] Compound names - def to_names - begin - RestClientWrapper.get("#{CACTUS_URI}#{to_inchi}/names").split("\n") - rescue - "CACTVS service not responding." - end + def names + RestClientWrapper.get("#{CACTUS_URI}#{inchi}/names").split("\n") end + def cid + pug_uri = "http://pubchem.ncbi.nlm.nih.gov/rest/pug/" + @cid ||= RestClientWrapper.post(File.join(pug_uri, "compound", "inchi", "cids", "TXT"),{:inchi => inchi}).strip + end + + def chebi + end + + def chemblid + # https://www.ebi.ac.uk/chembldb/ws#individualCompoundByInChiKey + uri = "http://www.ebi.ac.uk/chemblws/compounds/smiles/#{smiles}.json" + @chemblid = JSON.parse(RestClientWrapper.get(uri))["compounds"].first["chemblId"] + end + =begin # Match a smarts string # @example -- cgit v1.2.3 From 8839ee789e77055e457113c628a7903f99a0795c Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 21 Aug 2012 13:22:29 +0300 Subject: Removed Ruby Check --- bin/opentox-client-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/opentox-client-install b/bin/opentox-client-install index 4be2d6c..d52dace 100755 --- a/bin/opentox-client-install +++ b/bin/opentox-client-install @@ -34,7 +34,7 @@ check_utils "rbenv find" check_log $SELF # ruby -[ "`$RBENV local 2>/dev/null`" = "$RUBY_NUM_VER" ] || install_ruby +install_ruby # self echo -- cgit v1.2.3 From 65538d053f8c05ae344b09cbcfd862395fadbbe4 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 23 Aug 2012 08:57:58 +0200 Subject: version set to 1.0.0.pre1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8c5ba87..274edc4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.0.0pre1 +1.0.0pre1 -- cgit v1.2.3 From d1645d959ab2b0701ff6bd616d44ca7aaeaf0eca Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Mon, 3 Sep 2012 16:57:50 +0200 Subject: Fixed ruby version --- bin/opentox-client-install | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/opentox-client-install b/bin/opentox-client-install index d52dace..61e2edf 100755 --- a/bin/opentox-client-install +++ b/bin/opentox-client-install @@ -6,9 +6,6 @@ SELF=$(basename $0 -install) [ "`id -u`" = "0" ] && echo "This script must be run as non-root." 1>&2 && exit 1 -# Adjust ruby version here! -RUBY_NUM_VER="1.9.3-p194" - echo echo "Welcome to service installation ( to continue)." read delete_me @@ -33,6 +30,9 @@ RUBY_DIR="$HOME/.rbenv/versions/$RUBY_NUM_VER" check_utils "rbenv find" check_log $SELF +# Adjust ruby version here! +RUBY_NUM_VER="1.9.3-p194" + # ruby install_ruby -- cgit v1.2.3 From 607be1ffb0a001e4a2bf9cae2babd44b4d898d25 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 6 Sep 2012 16:13:47 +0200 Subject: Fixed post --- Gemfile.lock | 8 ++++---- lib/algorithm.rb | 2 +- lib/opentox-client.rb | 1 + lib/opentox.rb | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 085e974..345faf2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - opentox-client (1.0.0) + opentox-client (1.0.0pre1) bundler open4 rdf @@ -12,11 +12,11 @@ PATH GEM remote: http://rubygems.org/ specs: - addressable (2.2.8) - ffi (1.0.11) + addressable (2.3.2) + ffi (1.1.5) mime-types (1.19) open4 (1.3.0) - rdf (0.3.7) + rdf (0.3.8) addressable (>= 2.2.6) rdf-n3 (0.3.7) rdf (>= 0.3.4) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 4986c40..0c633f2 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -8,7 +8,7 @@ module OpenTox # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [String] URI of new resource (dataset, model, ...) def run params=nil - post params, {:accept => 'text/uri-list'} + post params end end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 5f5a106..d08d07a 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -36,5 +36,6 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m "compound.rb", "dataset.rb", "model.rb", + "algorithm.rb" ].each{ |f| require File.join(File.dirname(__FILE__),f) } diff --git a/lib/opentox.rb b/lib/opentox.rb index 80644db..faa7b58 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -95,9 +95,9 @@ module OpenTox end # Post object to webservice - def post service_uri, wait=true + def post params=nil, wait=true # TODO: RDFXML - uri = RestClientWrapper.post service_uri, to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} + uri = RestClientWrapper.post @uri.to_s, params, { :content_type => "text/plain", :subjectid => @subjectid} wait_for_task uri if wait end -- cgit v1.2.3 From 781e7f714130dcd054d5d437f9c9f95c02cf9f7f Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 6 Sep 2012 16:59:57 +0200 Subject: Added match routines --- lib/compound.rb | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/lib/compound.rb b/lib/compound.rb index 127a6ee..19d00fb 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -186,5 +186,44 @@ module OpenTox end end =end + + # Match an array of smarts strings, returns array with matching smarts + # @example + # compound = Compound.from_name("Benzene") + # compound.match(['cc','cN']) # returns ['cc'] + # @param [Array] smarts_array Array with Smarts strings + # @return [Array] Array with matching Smarts strings + def match(smarts_array) + obconversion = OpenBabel::OBConversion.new + obmol = OpenBabel::OBMol.new + obconversion.set_in_format('inchi') + obconversion.read_string(obmol,inchi) + smarts_pattern = OpenBabel::OBSmartsPattern.new + smarts_array.collect { |smarts| + smarts_pattern.init(smarts) + smarts if smarts_pattern.match(obmol) + }.compact + end + + # Match an array of smarts strings, returns hash with matching smarts as key and number of non-unique hits as value + # @param [Array] smarts_array Array with Smarts strings + # @return [Hash] Hash with matching smarts as key and number of non-unique hits as value + def match_hits(smarts_array) + obconversion = OpenBabel::OBConversion.new + obmol = OpenBabel::OBMol.new + obconversion.set_in_format('inchi') + obconversion.read_string(obmol,inchi) + smarts_pattern = OpenBabel::OBSmartsPattern.new + smarts_hits = {} + smarts_array.collect do |smarts| + smarts_pattern.init(smarts) + if smarts_pattern.match(obmol) + hits = smarts_pattern.get_map_list + smarts_hits[smarts] = hits.to_a.size + end + end + return smarts_hits + end + end end -- cgit v1.2.3 From 43fa88e989ab0b846a91f49b381895c983fe95c2 Mon Sep 17 00:00:00 2001 From: davor Date: Tue, 11 Sep 2012 12:31:02 +0200 Subject: Added silent mode. --- bin/opentox-client-install | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/bin/opentox-client-install b/bin/opentox-client-install index 61e2edf..17e20f2 100755 --- a/bin/opentox-client-install +++ b/bin/opentox-client-install @@ -6,10 +6,20 @@ SELF=$(basename $0 -install) [ "`id -u`" = "0" ] && echo "This script must be run as non-root." 1>&2 && exit 1 -echo -echo "Welcome to service installation ( to continue)." -read delete_me - +SILENT=false +if [ -n "$1" ] +then + if [ "$1" = "silent" ] + then + SILENT=true + fi +fi + +if [ $SILENT = false ]; then + echo + echo "Welcome to service installation ( to continue)." + read delete_me +fi # check wd is root of service DIR=`pwd` @@ -40,7 +50,9 @@ install_ruby echo install_with_bundler -notify +if [ $SILENT = false ]; then + notify +fi # return to wd cd "$DIR" -- cgit v1.2.3 From fcb0574da3d9e52ad68669b7c84e0a8e029ad240 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 11 Sep 2012 12:57:00 +0200 Subject: Updated match routines --- lib/compound.rb | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 19d00fb..da16c85 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -187,28 +187,18 @@ module OpenTox end =end - # Match an array of smarts strings, returns array with matching smarts - # @example - # compound = Compound.from_name("Benzene") - # compound.match(['cc','cN']) # returns ['cc'] - # @param [Array] smarts_array Array with Smarts strings - # @return [Array] Array with matching Smarts strings - def match(smarts_array) - obconversion = OpenBabel::OBConversion.new - obmol = OpenBabel::OBMol.new - obconversion.set_in_format('inchi') - obconversion.read_string(obmol,inchi) - smarts_pattern = OpenBabel::OBSmartsPattern.new - smarts_array.collect { |smarts| - smarts_pattern.init(smarts) - smarts if smarts_pattern.match(obmol) - }.compact - end - # Match an array of smarts strings, returns hash with matching smarts as key and number of non-unique hits as value + + # Match an array of smarts strings, returns hash + # Keys: matching smarts, values: number of non-unique hits, or 1 # @param [Array] smarts_array Array with Smarts strings - # @return [Hash] Hash with matching smarts as key and number of non-unique hits as value - def match_hits(smarts_array) + # @param [Boolean] Whether non-unique hits or 1 should be produced + # @return [Array] Array with matching Smarts strings + # @example { + # compound = Compound.from_name("Benzene") + # compound.match(['cc','cN']) # returns { 'cc' => 12, 'cN' => 0 } + # } + def match_hits(smarts_array, use_hits=true) obconversion = OpenBabel::OBConversion.new obmol = OpenBabel::OBMol.new obconversion.set_in_format('inchi') @@ -218,12 +208,21 @@ module OpenTox smarts_array.collect do |smarts| smarts_pattern.init(smarts) if smarts_pattern.match(obmol) - hits = smarts_pattern.get_map_list - smarts_hits[smarts] = hits.to_a.size + if use_hits + hits = smarts_pattern.get_map_list + smarts_hits[smarts] = hits.to_a.size + else + smarts_hits[smarts] = 1 + end end end return smarts_hits end + # Provided for backward compatibility + def match(smarts_array) + match_hits(smarts_array,false) + end + end end -- cgit v1.2.3 From b4ba72cd339f4067ab411dbd51beabf22a2e23e2 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 13 Sep 2012 15:16:38 +0200 Subject: Array overwrite methods --- lib/overwrite.rb | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 785fbcd..574d922 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -93,3 +93,30 @@ module Kernel end end + + +class Array + + # Sum of an array for Arrays + # @param [Array] Array of arrays + # @return [Integer] Sum of size of array elements + def sum_size + self.inject(0) { |s,a| + if a.respond_to?('size') + s+=a.size + else + internal_server_error "No size available: #{a.inspect}" + end + } + end + + # For symbolic features + # @param [Array] Array to test. + # @return [Boolean] Whether the array has just one unique value. + def zero_variance? + return self.uniq.size == 1 + end + + +end + -- cgit v1.2.3 From 9eb282dbe9a15fd7066e8dab793c33ac12976f2f Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Mon, 1 Oct 2012 13:45:33 +0200 Subject: Added force-no-query parameter --- lib/dataset.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 4816b5a..8c855a9 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -27,8 +27,8 @@ module OpenTox end end - def get - super + def get(force_no_backend_query=false) + super() unless (force_no_backend_query and @rdf.size>0) @features = [] @compounds = [] @data_entries = [] -- cgit v1.2.3 From f393427d352d68467d8f2010f0a1c7b9990b7bb1 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 5 Oct 2012 12:33:53 +0200 Subject: methode to check URI-owner --- lib/authorization.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/authorization.rb b/lib/authorization.rb index 438c7c6..1fe5c51 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -164,6 +164,13 @@ module OpenTox end end + #Returns true or false if owner (who created the first policy) of an URI + # @param [String, String]uri,subjectid + # return [Boolean]true,false status of ownership of the URI + def self.uri_owner?(uri, subjectid) + get_uri_owner(uri, subjectid) == get_user(subjectid) + end + #Checks if a policy exists to a URI. Requires URI and token. # @param [String, String]uri,subjectid # return [Boolean] -- cgit v1.2.3 From fb278d6d54b81e64ca81a76cccdfd0c71ac5f394 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 10 Oct 2012 15:01:25 +0200 Subject: Fixed uri on force_no_lookup --- lib/dataset.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 8c855a9..c52952f 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -35,7 +35,9 @@ module OpenTox query = RDF::Query.new do pattern [:uri, RDF.type, RDF::OT.OrderedDataset] end - if query.execute(@rdf).first # ordered dataset + s=query.execute(@rdf) + if s.first # ordered dataset + @uri = s[0].uri.to_s if force_no_backend_query # AM: must rewrite URI query = RDF::Query.new do pattern [:uri, RDF.type, RDF::OT.Compound] pattern [:uri, RDF::OLO.index, :idx] @@ -101,7 +103,7 @@ module OpenTox def << data_entry compound = data_entry.shift bad_request_error "Dataset features are empty." unless features - bad_request_error "data_entry size does not match features size." unless data_entry.size == features.size + bad_request_error "data_entry size '#{data_entry.size}' does not match features size '#{features.size}'." unless data_entry.size == features.size bad_request_error "First data_entry is not a OpenTox::Compound" unless compound.class == OpenTox::Compound @compounds << compound @data_entries << data_entry -- cgit v1.2.3 From f1028bbed9f5b00391c66bf843eb95a39253ccf4 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Thu, 11 Oct 2012 15:16:44 +0200 Subject: Fixed RestClientWrapper description --- lib/rest-client-wrapper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 67a6264..1258339 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -6,7 +6,7 @@ module OpenTox # REST methods # Raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) - # Waits for Task to finish and returns result URI of Task per default + # Does not wait for task to finish and returns task uri # @param [String] destination URI # @param [optional,Hash|String] Payload data posted to the service # @param [optional,Hash] Headers with params like :accept, :content_type, :subjectid @@ -46,7 +46,7 @@ module OpenTox message = response.to_s parameters = request.args parameters[:headers][:subjectid] = "REMOVED" if parameters[:headers] and parameters[:headers][:subjectid] - message += "\nREST paramenters:\n#{parameters.inspect}" + message += "\nREST parameters:\n#{parameters.inspect}" error = known_errors.collect{|e| e if e[:code] == response.code}.compact.first Object.method(error[:method]).call message, uri # call error method else -- cgit v1.2.3 From d182e4f3d666ad2586161c2ae84775148d3c11ad Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Fri, 19 Oct 2012 15:57:11 +0200 Subject: Support for subgraphs as numeric values --- lib/dataset.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index c52952f..85b942a 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -48,7 +48,10 @@ module OpenTox pattern [:uri, RDF::OLO.index, :idx] end @features = query.execute(@rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Feature.new(s.uri.to_s)} - numeric_features = @features.collect{|f| f.get; f[RDF.type].include? RDF::OT.NumericFeature} + numeric_features = @features.collect{|f| + f.get + f[RDF.type].include?(RDF::OT.NumericFeature) or f[RDF.type].include?(RDF::OT.Substructure) + } @compounds.each_with_index do |compound,i| query = RDF::Query.new do pattern [:data_entry, RDF::OLO.index, i] @@ -58,7 +61,7 @@ module OpenTox pattern [:values, RDF::OT.value, :value] end values = query.execute(@rdf).sort_by{|s| s.feature_idx}.collect do |s| - (numeric_features[s.feature_idx] and s.value.to_s != "") ? s.value.to_s.to_f : s.value.to_s + (numeric_features[s.feature_idx] and s.value.to_s != "") ? s.value.to_s.to_f : s.value.to_s end @data_entries << values.collect{|v| v == "" ? nil : v} end -- cgit v1.2.3 From 9c8b20a910d316c19d24e79dcf52868b6b8383b7 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 24 Oct 2012 16:35:09 +0200 Subject: Merged shims --- lib/opentox-client.rb | 3 ++ lib/utils/diag.rb | 11 +++++ lib/utils/html.rb | 49 +++++++++++++++++++++ lib/utils/shims/dataset.rb | 104 +++++++++++++++++++++++++++++++++++++++++++++ lib/utils/shims/feature.rb | 87 +++++++++++++++++++++++++++++++++++++ lib/utils/shims/opentox.rb | 51 ++++++++++++++++++++++ lib/utils/shims/task.rb | 22 ++++++++++ 7 files changed, 327 insertions(+) create mode 100644 lib/utils/diag.rb create mode 100644 lib/utils/html.rb create mode 100644 lib/utils/shims/dataset.rb create mode 100644 lib/utils/shims/feature.rb create mode 100644 lib/utils/shims/opentox.rb create mode 100644 lib/utils/shims/task.rb diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index d08d07a..67e0ce7 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -39,3 +39,6 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m "algorithm.rb" ].each{ |f| require File.join(File.dirname(__FILE__),f) } +Dir["#{File.dirname(__FILE__)}/utils/shims/*.rb"].each { |f| require f } # Shims for legacy code +Dir["#{File.dirname(__FILE__)}/utils/*.rb"].each { |f| require f } # Utils for Libs + diff --git a/lib/utils/diag.rb b/lib/utils/diag.rb new file mode 100644 index 0000000..fd37945 --- /dev/null +++ b/lib/utils/diag.rb @@ -0,0 +1,11 @@ +=begin +* Name: diag.rb +* Description: Diagnostic tools +* Author: Andreas Maunz +* Date: 10/2012 +=end + +# Print a diagnostic message +def uri_list + puts "My load path is:\n#{$LOAD_PATH.join("\n")} \nI have loaded #{$LOADED_FEATURES.size} objects.\n\n" +end diff --git a/lib/utils/html.rb b/lib/utils/html.rb new file mode 100644 index 0000000..91dfc64 --- /dev/null +++ b/lib/utils/html.rb @@ -0,0 +1,49 @@ +#OT_LOGO = File.join(CONFIG[:services]["opentox-validation"],"resources/ot-logo.png") + +=begin +* Name: html.rb +* Description: Tools to provide html output +* Author: Andreas Maunz +* Date: 10/2012 +=end + +# AM: needed since this gem has a nested directory structure + +class String + # encloses URI in text with with link tag + # @return [String] new text with marked links + def link_urls + regex = Regexp.new '(https?:\/\/[\S]+)([>"])' + self.gsub( regex, '\1\2' ) + end +end + +module OpenTox + + # produces a html page for making web services browser friendly + # format of text (=string params) is preserved (e.g. line breaks) + # urls are marked as links + # + # @param [String] text this is the actual content, + # @param [optional,String] related_links info on related resources + # @param [optional,String] description general info + # @param [optional,Array] post_command, infos for the post operation, object defined below + # @return [String] html page + def self.text_to_html( text, subjectid=nil, related_links=nil, description=nil, post_command=nil ) + + # TODO add title as parameter + title = nil #$sinatra.url_for($sinatra.request.env['PATH_INFO'], :full) if $sinatra + html = "" + html += ""+title+"" if title + #html += "<\/img>" + + html += "

Description

"+description.link_urls+"

" if description + html += "

Related links

"+related_links.link_urls+"

" if related_links + html += "

Content

" if description || related_links + html += "

" + html += text.link_urls + html += "

" + html + end + +end diff --git a/lib/utils/shims/dataset.rb b/lib/utils/shims/dataset.rb new file mode 100644 index 0000000..75948e0 --- /dev/null +++ b/lib/utils/shims/dataset.rb @@ -0,0 +1,104 @@ +=begin +* Name: dataset.rb +* Description: Dataset shims +* Author: Andreas Maunz +* Date: 10/2012 +=end + +module OpenTox + + # Shims for the Dataset Class + class Dataset + + attr_accessor :feature_positions, :compound_positions + + # Load a dataset from URI + # @param [String] Dataset URI + # @return [OpenTox::Dataset] Dataset object + def self.find(uri, subjectid=nil) + return nil unless uri + ds = OpenTox::Dataset.new uri, subjectid + ds.get + ds + end + + + + ### Index Structures + + # Create value map + # @param [OpenTox::Feature] A feature + # @return [Hash] A hash with keys 1...feature.training_classes.size and values training classes + def value_map(feature) + training_classes = feature.accept_values + training_classes.each_index.inject({}) { |h,idx| h[idx+1]=training_classes[idx]; h } + end + + # Create feature positions map + # @return [Hash] A hash with keys feature uris and values feature positions + def build_feature_positions + unless @feature_positions + @feature_positions = @features.each_index.inject({}) { |h,idx| + internal_server_error "Duplicate Feature '#{@features[idx].uri}' in dataset '#{@uri}'" if h[@features[idx].uri] + h[@features[idx].uri] = idx + h + } + end + end + + # Create compounds positions map + # @return [Hash] A hash with keys compound uris and values compound position arrays + def build_compound_positions + unless @compound_positions + @compound_positions = @compounds.each_index.inject({}) { |h,idx| + inchi=OpenTox::Compound.new(@compounds[idx].uri).inchi + h[inchi] = [] unless h[inchi] + h[inchi] << idx if inchi =~ /InChI/ + h + } + end + end + + + ### Associative Search Operations + + # Search a dataset for a feature given its URI + # @param [String] Feature URI + # @return [OpenTox::Feature] Feature object, or nil if not present + def find_feature(uri) + build_feature_positions + res = @features[@feature_positions[uri]] if @feature_positions[uri] + res + end + + # Search a dataset for a compound given its URI + # @param [String] Compound URI + # @return [OpenTox::Compound] Array of compound objects, or nil if not present + def find_compound(uri) + build_compound_positions + inchi = OpenTox::Compound.new(uri).inchi + res = @compounds[@compound_positions[inchi]] if inchi =~ /InChI/ and @compound_positions[inchi] + res + end + + # Search a dataset for a data entry given compound URI and feature URI + # @param [String] Compound URI + # @param [String] Feature URI + # @return [Object] Data entry, or nil if not present + def find_data_entry(compound_uri, feature_uri) + build_compound_positions + build_feature_positions + inchi = OpenTox::Compound.new(compound_uri).inchi + if @compound_positions[inchi] && @feature_positions[feature_uri] + res = [] + @compound_positions[inchi].each { |idx| + res << data_entries[idx][@feature_positions[feature_uri]] + } + end + res + end + + end + + +end diff --git a/lib/utils/shims/feature.rb b/lib/utils/shims/feature.rb new file mode 100644 index 0000000..297748b --- /dev/null +++ b/lib/utils/shims/feature.rb @@ -0,0 +1,87 @@ +=begin +* Name: feature.rb +* Description: Feature shims +* Author: Andreas Maunz +* Date: 10/2012 +=end + +module OpenTox + + # Shims for the feature class + class Feature + + # Load a feature from URI + # @param [String] Feature URI + # @return [OpenTox::Feature] Feature object with the full data + def self.find(uri, subjectid=nil) + return nil unless uri + f = OpenTox::Feature.new uri, subjectid + f.get + f + end + + # Load or create a feature given its title and metadata + # Create it if: a) not present, or b) present, but differs in metadata + # Newly created features are stored at the backend + # @param[String] title Feature title + # @param[Hash] metadata Feature metadata + # @return [OpenTox::Feature] Feature object with the full data, or nil + def self.find_by_title(title, metadata) + metadata[RDF.type] = [] unless metadata[RDF.type] + metadata[RDF.type] << RDF::OT.Feature unless metadata[RDF.type].include?(RDF::OT.Feature) + metadata[RDF::DC.title] = title unless (metadata[RDF::DC.title]) + feature = feature_new = OpenTox::Feature.new File.join($feature[:uri], SecureRandom.uuid), @subjectid + feature_new.metadata = metadata + sparql = "SELECT DISTINCT ?feature WHERE { ?feature <#{RDF.type}> <#{RDF::OT['feature'.capitalize]}>. ?feature <#{RDF::DC.title}> '#{title.to_s}' }" + feature_uris = OpenTox::Backend::FourStore.query(sparql,"text/uri-list").split("\n") + features_equal = false # relevant also when no features found + feature_uris.each_with_index { |feature_uri,idx| + feature_existing = OpenTox::Feature.find(feature_uri, @subjectid) + if (feature_new.metadata.size+1 == feature_existing.metadata.size) # +1 due to title + features_equal = metadata.keys.collect { |predicate| + unless ( predicate == RDF::DC.title ) + if feature_new[predicate].class == feature_existing[predicate].class + case feature_new[predicate].class.to_s + when "Array" then (feature_new[predicate].sort == feature_existing[predicate].sort) + else (feature_new[predicate] == feature_existing[predicate]) + end + end + else + true + end + }.uniq == [true] + end + (feature=feature_existing and break) if features_equal + } + unless features_equal + feature_new.put + end + feature + end + + # Find out feature type + # Classification takes precedence + # @return [String] Feature type + def feature_type + bad_request_error "rdf type of feature '#{@uri}' not set" unless self[RDF.type] + if self[RDF.type].include?(OT.NominalFeature) + "classification" + elsif [RDF.type].to_a.flatten.include?(OT.NumericFeature) + "regression" + else + "unknown" + end + end + + # Get accept values + # @param[String] Feature URI + # @return[Array] Accept values + def accept_values + accept_values = self[OT.acceptValue] + accept_values.sort if accept_values + accept_values + end + + end + +end diff --git a/lib/utils/shims/opentox.rb b/lib/utils/shims/opentox.rb new file mode 100644 index 0000000..c10d535 --- /dev/null +++ b/lib/utils/shims/opentox.rb @@ -0,0 +1,51 @@ +=begin +* Name: opentox.rb +* Description: Architecture shims +* Author: Andreas Maunz +* Date: 10/2012 +=end + +# This avoids having to prefix everything with "RDF::" (e.g. "RDF::DC"). +# So that we can use our old code mostly as is. +include RDF + +module OpenTox + + # Help function to provide the metadata= functionality. + # Downward compatible to opentox-ruby. + # @param [Hash] Key-Value pairs with the metadata + # @return self + def metadata=(hsh) + hsh.each {|k,v| + self[k]=v + } + end + + + ### Index Structures + + # Create parameter positions map + # @return [Hash] A hash with keys parameter names and values parameter positions + def build_parameter_positions + unless @parameter_positions + @parameters = parameters + @parameter_positions = @parameters.each_index.inject({}) { |h,idx| + h[@parameters[idx][DC.title.to_s]] = idx + h + } + end + end + + + ### Associative Search Operations + + # Search a model for a given parameter + # @param[String] The parameter title + # @return[Object] The parameter value + def find_parameter_value(title) + build_parameter_positions + res = @parameters[@parameter_positions[title]][OT.paramValue.to_s] if @parameter_positions[title] + res + end + +end diff --git a/lib/utils/shims/task.rb b/lib/utils/shims/task.rb new file mode 100644 index 0000000..cb73e72 --- /dev/null +++ b/lib/utils/shims/task.rb @@ -0,0 +1,22 @@ +=begin +* Name: task.rb +* Description: Task shims +* Author: Andreas Maunz +* Date: 10/2012 +=end + + +module OpenTox + + # Shims for the Task class + class Task + + # Check status of a task + # @return [String] Status + def status + self[RDF::OT.hasStatus] + end + + end + +end -- cgit v1.2.3 From 66ae34a7f1fcf01767d94f8c11a0ab2842e19112 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Fri, 26 Oct 2012 10:17:13 +0200 Subject: Improved ds read performance (see http://goo.gl/ajKQn) --- lib/dataset.rb | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 85b942a..286c3cb 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -52,19 +52,31 @@ module OpenTox f.get f[RDF.type].include?(RDF::OT.NumericFeature) or f[RDF.type].include?(RDF::OT.Substructure) } - @compounds.each_with_index do |compound,i| - query = RDF::Query.new do - pattern [:data_entry, RDF::OLO.index, i] - pattern [:data_entry, RDF::OT.values, :values] - pattern [:values, RDF::OT.feature, :feature] - pattern [:feature, RDF::OLO.index, :feature_idx] - pattern [:values, RDF::OT.value, :value] + query = RDF::Query.new do + pattern [:data_entry, RDF::OLO.index, :cidx] # compound index: now a free variable + pattern [:data_entry, RDF::OT.values, :vals] + pattern [:vals, RDF::OT.feature, :f] + pattern [:f, RDF::OLO.index, :fidx] + pattern [:vals, RDF::OT.value, :val] + end + clim=(@compounds.size-1) + cidx=0 + fidx=0 + num=numeric_features[fidx] + @data_entries = (Array.new(@compounds.size*@features.size)).each_slice(@features.size).to_a # init to nil + query.execute(@rdf).order_by(:fidx, :cidx).each { |entry| # order by feature index as to compute numeric status less frequently + val = entry.val.to_s + unless val.blank? + @data_entries[cidx][fidx] = (num ? val.to_f : val) end - values = query.execute(@rdf).sort_by{|s| s.feature_idx}.collect do |s| - (numeric_features[s.feature_idx] and s.value.to_s != "") ? s.value.to_s.to_f : s.value.to_s + if (cidx < clim) + cidx+=1 + else + cidx=0 + fidx+=1 + num=numeric_features[fidx] end - @data_entries << values.collect{|v| v == "" ? nil : v} - end + } else query = RDF::Query.new do pattern [:uri, RDF.type, RDF::OT.Feature] -- cgit v1.2.3 From a5ff12a57811fbaa116ec19c54b8a029a7630cd7 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Fri, 26 Oct 2012 10:55:43 +0200 Subject: Added ds speed doc --- doc/dsspeed.md | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 doc/dsspeed.md diff --git a/doc/dsspeed.md b/doc/dsspeed.md new file mode 100644 index 0000000..2fe0b5c --- /dev/null +++ b/doc/dsspeed.md @@ -0,0 +1,126 @@ +Filename: `dsspeed.pdf` +Description: A benchmark comparison of different dataset implementations. +Author: Andreas Maunz `` +Date: 10/2012 + +# Request per row + +(Old) implementation with one query for data entries **per compound**. + + @compounds.each_with_index do |compound,i| + query = RDF::Query.new do + pattern [:data_entry, RDF::OLO.index, i] + pattern [:data_entry, RDF::OT.values, :values] + pattern [:values, RDF::OT.feature, :feature] + pattern [:feature, RDF::OLO.index, :feature_idx] + pattern [:values, RDF::OT.value, :value] + end + values = query.execute(@rdf).sort_by{|s| s.feature_idx}.collect do |s| + (numeric_features[s.feature_idx] and s.value.to_s != "") ? \ + s.value.to_s.to_f : s.value.to_s + end + @data_entries << values.collect{|v| v == "" ? nil : v} + end + +Timings for reading a BBRC feature dataset (85 compounds, 53 features. Repeated three times, median reported): + + user system total real + ds reading 6.640000 0.090000 6.730000 ( 7.429505) + + +# Single Table + +Now some optimized versions that retrieve entries all at once. A few variables have been renamed for clarity in the query: + + query = RDF::Query.new do + # compound index: now a free variable + pattern [:data_entry, RDF::OLO.index, :cidx] + pattern [:data_entry, RDF::OT.values, :vals] + pattern [:vals, RDF::OT.feature, :f] + pattern [:f, RDF::OLO.index, :fidx] + pattern [:vals, RDF::OT.value, :val] + end + +Also `RDF::Query::Solutions#order_by` is used instead of the generic `Enumerable#sort_by`, which may have advantages (not tested seperately). + +## 'Row Slicing' Version + +Results are sorted by compound, then by feature. The long array is sliced into rows. + + @data_entries = query.execute(@rdf).order_by(:cidx, :fidx).collect { |entry| + entry.val.to_s.blank? ? nil : \ + (numeric_features[entry.fidx] ? entry.val.to_s.to_f : entry.val.to_s) + }.each_slice(@features.size).to_a + +Timings: + + user system total real + ds reading 3.850000 0.090000 3.940000 ( 4.643435) + +## 'Fill Table' Version + +A modification that avoids lookup operations where possible. Also pre-allocates `@data_entries`. + + clim=(@compounds.size-1) + cidx=0 + fidx=0 + num=numeric_features[fidx] + @data_entries = \ + (Array.new(@compounds.size*@features.size)).each_slice(@features.size).to_a + # order by feature index as to compute numeric status less frequently + query.execute(@rdf).order_by(:fidx, :cidx).each { |entry| + val = entry.val.to_s + unless val.blank? + @data_entries[cidx][fidx] = (num ? val.to_f : val) + end + if (cidx < clim) + cidx+=1 + else + cidx=0 + fidx+=1 + num=numeric_features[fidx] + end + } + +Timings: + + user system total real + ds reading 3.820000 0.040000 3.860000 ( 4.540800) + + +# Dataset Tests + +Test runtimes changed as follows: + +Test old new +---------------- ------- ------- +dataset.rb 6.998s 7.406s +dataset_large.rb 64.230s 25.231s + +Table: Runtimes + + +## Conclusions + +Based on the results I implemented the 'Fill Table' variant. + + +## Note + +A further modification that avoids querying compounds separately made runtimes much worse again. +The idea was to get the compound together with each data entry: + + ######## + +One would add compounds to `@compounds` only for the first run through column no '1'. + -- cgit v1.2.3 From f519c7cf4ef23289dd3511fc00312dbed2b56d09 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Fri, 26 Oct 2012 14:45:52 +0200 Subject: Added shims for SPARQL retrieval --- lib/utils/shims/dataset.rb | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/lib/utils/shims/dataset.rb b/lib/utils/shims/dataset.rb index 75948e0..b5faf18 100644 --- a/lib/utils/shims/dataset.rb +++ b/lib/utils/shims/dataset.rb @@ -23,6 +23,43 @@ module OpenTox end + # Load features via SPARQL (fast) + # @param [String] Dataset URI + # @return [Array] Features in order + def self.find_features(uri) + sparql = "SELECT DISTINCT ?s FROM <#{uri}> WHERE { + ?s <#{RDF.type}> <#{RDF::OT.Feature}> ; + <#{RDF::OLO.index}> ?fidx + } ORDER BY ?fidx" + OpenTox::Backend::FourStore.query(sparql, "text/uri-list").split("\n").collect { |uri| OpenTox::Feature.new uri.strip } + end + + # Load compounds via SPARQL (fast) + # @param [String] Dataset URI + # @return [Array] Compounds in order + def self.find_compounds(uri) + sparql = "SELECT DISTINCT ?compound FROM <#{uri}> WHERE { + ?s <#{RDF.type}> <#{RDF::OT.DataEntry}> ; + <#{RDF::OLO.index}> ?cidx; + <#{RDF::OT.compound}> ?compound + } ORDER BY ?cidx" + OpenTox::Backend::FourStore.query(sparql, "text/uri-list").split("\n").collect { |uri| OpenTox::Compound.new uri.strip } + end + + # Load data entries via SPARQL (fast) + # @param [String] Dataset uri + # @return [Array] Data entries, ordered primarily over rows and secondarily over cols + def self.find_data_entries(uri) + sparql = "SELECT ?value FROM <#{uri}> WHERE { + ?data_entry <#{RDF::OLO.index}> ?cidx ; + <#{RDF::OT.values}> ?v . + ?v <#{RDF::OT.feature}> ?f; + <#{RDF::OT.value}> ?value . + ?f <#{RDF::OLO.index}> ?fidx. + } ORDER BY ?cidx ?fidx" + OpenTox::Backend::FourStore.query(sparql,"text/uri-list").split("\n").collect { |val| val.strip } + end + ### Index Structures -- cgit v1.2.3 From b55f670feb82dff3c782b4f86bf90ac1212a0361 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Fri, 26 Oct 2012 16:11:43 +0200 Subject: Separate libs for sparql and rdf --- lib/dataset.rb | 32 +++++++++-------------------- lib/opentox-client.rb | 2 ++ lib/utils/rdf/dataset.rb | 48 ++++++++++++++++++++++++++++++++++++++++++++ lib/utils/shims/dataset.rb | 38 ----------------------------------- lib/utils/sparql/dataset.rb | 49 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 109 insertions(+), 60 deletions(-) create mode 100644 lib/utils/rdf/dataset.rb create mode 100644 lib/utils/sparql/dataset.rb diff --git a/lib/dataset.rb b/lib/dataset.rb index 286c3cb..e700ad0 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -36,36 +36,22 @@ module OpenTox pattern [:uri, RDF.type, RDF::OT.OrderedDataset] end s=query.execute(@rdf) - if s.first # ordered dataset + + # AM: read ordered dataset from RDF + if s.first @uri = s[0].uri.to_s if force_no_backend_query # AM: must rewrite URI - query = RDF::Query.new do - pattern [:uri, RDF.type, RDF::OT.Compound] - pattern [:uri, RDF::OLO.index, :idx] - end - @compounds = query.execute(@rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Compound.new s.uri.to_s} - query = RDF::Query.new do - pattern [:uri, RDF.type, RDF::OT.Feature] - pattern [:uri, RDF::OLO.index, :idx] - end - @features = query.execute(@rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Feature.new(s.uri.to_s)} + @compounds = OpenTox::Dataset.find_compounds_rdf(@rdf) + @features = OpenTox::Dataset.find_features_rdf(@rdf) numeric_features = @features.collect{|f| f.get f[RDF.type].include?(RDF::OT.NumericFeature) or f[RDF.type].include?(RDF::OT.Substructure) } - query = RDF::Query.new do - pattern [:data_entry, RDF::OLO.index, :cidx] # compound index: now a free variable - pattern [:data_entry, RDF::OT.values, :vals] - pattern [:vals, RDF::OT.feature, :f] - pattern [:f, RDF::OLO.index, :fidx] - pattern [:vals, RDF::OT.value, :val] - end + table = OpenTox::Dataset.find_data_entries_rdf(@rdf) clim=(@compounds.size-1) - cidx=0 - fidx=0 + cidx = fidx = 0 num=numeric_features[fidx] @data_entries = (Array.new(@compounds.size*@features.size)).each_slice(@features.size).to_a # init to nil - query.execute(@rdf).order_by(:fidx, :cidx).each { |entry| # order by feature index as to compute numeric status less frequently - val = entry.val.to_s + table.each { |val| unless val.blank? @data_entries[cidx][fidx] = (num ? val.to_f : val) end @@ -77,6 +63,8 @@ module OpenTox num=numeric_features[fidx] end } + + # AM: read unordered dataset from RDF else query = RDF::Query.new do pattern [:uri, RDF.type, RDF::OT.Feature] diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 67e0ce7..8b56411 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -40,5 +40,7 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m ].each{ |f| require File.join(File.dirname(__FILE__),f) } Dir["#{File.dirname(__FILE__)}/utils/shims/*.rb"].each { |f| require f } # Shims for legacy code +Dir["#{File.dirname(__FILE__)}/utils/sparql/*.rb"].each { |f| require f } # SPARQL code +Dir["#{File.dirname(__FILE__)}/utils/rdf/*.rb"].each { |f| require f } # RDF code Dir["#{File.dirname(__FILE__)}/utils/*.rb"].each { |f| require f } # Utils for Libs diff --git a/lib/utils/rdf/dataset.rb b/lib/utils/rdf/dataset.rb new file mode 100644 index 0000000..5cfb827 --- /dev/null +++ b/lib/utils/rdf/dataset.rb @@ -0,0 +1,48 @@ +=begin +* Name: dataset.rb +* Description: Dataset RDF tools +* Author: Andreas Maunz +* Date: 10/2012 +=end + +module OpenTox + class Dataset + + # Load features via RDF (slow) + # @param [String] Dataset URI + # @return [Array] Features in order + def self.find_features_rdf(rdf) + query = RDF::Query.new do + pattern [:uri, RDF.type, RDF::OT.Feature] + pattern [:uri, RDF::OLO.index, :idx] + end + query.execute(rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Feature.new(s.uri.to_s)} + end + + # Load compounds via RDF (slow) + # @param [String] Dataset URI + # @return [Array] Compounds in order + def self.find_compounds_rdf(rdf) + query = RDF::Query.new do + pattern [:uri, RDF.type, RDF::OT.Compound] + pattern [:uri, RDF::OLO.index, :idx] + end + query.execute(rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Compound.new(s.uri.to_s)} + end + + # Load data entries via RDF (slow) + # @param [String] Dataset uri + # @return [Array] Data entries, ordered primarily over rows and secondarily over cols + def self.find_data_entries_rdf(rdf) + query = RDF::Query.new do + pattern [:data_entry, RDF::OLO.index, :cidx] # compound index: now a free variable + pattern [:data_entry, RDF::OT.values, :vals] + pattern [:vals, RDF::OT.feature, :f] + pattern [:f, RDF::OLO.index, :fidx] + pattern [:vals, RDF::OT.value, :val] + end + query.execute(rdf).order_by(:fidx, :cidx).collect { |s| s.val.to_s } + end + + end +end diff --git a/lib/utils/shims/dataset.rb b/lib/utils/shims/dataset.rb index b5faf18..912510c 100644 --- a/lib/utils/shims/dataset.rb +++ b/lib/utils/shims/dataset.rb @@ -23,44 +23,6 @@ module OpenTox end - # Load features via SPARQL (fast) - # @param [String] Dataset URI - # @return [Array] Features in order - def self.find_features(uri) - sparql = "SELECT DISTINCT ?s FROM <#{uri}> WHERE { - ?s <#{RDF.type}> <#{RDF::OT.Feature}> ; - <#{RDF::OLO.index}> ?fidx - } ORDER BY ?fidx" - OpenTox::Backend::FourStore.query(sparql, "text/uri-list").split("\n").collect { |uri| OpenTox::Feature.new uri.strip } - end - - # Load compounds via SPARQL (fast) - # @param [String] Dataset URI - # @return [Array] Compounds in order - def self.find_compounds(uri) - sparql = "SELECT DISTINCT ?compound FROM <#{uri}> WHERE { - ?s <#{RDF.type}> <#{RDF::OT.DataEntry}> ; - <#{RDF::OLO.index}> ?cidx; - <#{RDF::OT.compound}> ?compound - } ORDER BY ?cidx" - OpenTox::Backend::FourStore.query(sparql, "text/uri-list").split("\n").collect { |uri| OpenTox::Compound.new uri.strip } - end - - # Load data entries via SPARQL (fast) - # @param [String] Dataset uri - # @return [Array] Data entries, ordered primarily over rows and secondarily over cols - def self.find_data_entries(uri) - sparql = "SELECT ?value FROM <#{uri}> WHERE { - ?data_entry <#{RDF::OLO.index}> ?cidx ; - <#{RDF::OT.values}> ?v . - ?v <#{RDF::OT.feature}> ?f; - <#{RDF::OT.value}> ?value . - ?f <#{RDF::OLO.index}> ?fidx. - } ORDER BY ?cidx ?fidx" - OpenTox::Backend::FourStore.query(sparql,"text/uri-list").split("\n").collect { |val| val.strip } - end - - ### Index Structures # Create value map diff --git a/lib/utils/sparql/dataset.rb b/lib/utils/sparql/dataset.rb new file mode 100644 index 0000000..e781f08 --- /dev/null +++ b/lib/utils/sparql/dataset.rb @@ -0,0 +1,49 @@ +=begin +* Name: dataset.rb +* Description: Dataset SPARQL tools +* Author: Andreas Maunz +* Date: 10/2012 +=end + +module OpenTox + class Dataset + + # Load features via SPARQL (fast) + # @param [String] Dataset URI + # @return [Array] Features in order + def self.find_features_sparql(uri) + sparql = "SELECT DISTINCT ?s FROM <#{uri}> WHERE { + ?s <#{RDF.type}> <#{RDF::OT.Feature}> ; + <#{RDF::OLO.index}> ?fidx + } ORDER BY ?fidx" + OpenTox::Backend::FourStore.query(sparql, "text/uri-list").split("\n").collect { |uri| OpenTox::Feature.new uri.strip } + end + + # Load compounds via SPARQL (fast) + # @param [String] Dataset URI + # @return [Array] Compounds in order + def self.find_compounds_sparql(uri) + sparql = "SELECT DISTINCT ?compound FROM <#{uri}> WHERE { + ?s <#{RDF.type}> <#{RDF::OT.DataEntry}> ; + <#{RDF::OLO.index}> ?cidx; + <#{RDF::OT.compound}> ?compound + } ORDER BY ?cidx" + OpenTox::Backend::FourStore.query(sparql, "text/uri-list").split("\n").collect { |uri| OpenTox::Compound.new uri.strip } + end + + # Load data entries via SPARQL (fast) + # @param [String] Dataset uri + # @return [Array] Data entries, ordered primarily over rows and secondarily over cols + def self.find_data_entries_sparql(uri) + sparql = "SELECT ?value FROM <#{uri}> WHERE { + ?data_entry <#{RDF::OLO.index}> ?cidx ; + <#{RDF::OT.values}> ?v . + ?v <#{RDF::OT.feature}> ?f; + <#{RDF::OT.value}> ?value . + ?f <#{RDF::OLO.index}> ?fidx. + } ORDER BY ?cidx ?fidx" + OpenTox::Backend::FourStore.query(sparql,"text/uri-list").split("\n").collect { |val| val.strip } + end + + end +end -- cgit v1.2.3 From 19582925f0496e4cb07e71ead8aea1261abf0bc8 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Mon, 29 Oct 2012 16:44:03 +0100 Subject: sparql property request function --- lib/utils/rdf/dataset.rb | 12 ++++++------ lib/utils/sparql/dataset.rb | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/lib/utils/rdf/dataset.rb b/lib/utils/rdf/dataset.rb index 5cfb827..b2deeb8 100644 --- a/lib/utils/rdf/dataset.rb +++ b/lib/utils/rdf/dataset.rb @@ -9,8 +9,8 @@ module OpenTox class Dataset # Load features via RDF (slow) - # @param [String] Dataset URI - # @return [Array] Features in order + # @param [String] uri Dataset URI + # @return [Array] features Features in order def self.find_features_rdf(rdf) query = RDF::Query.new do pattern [:uri, RDF.type, RDF::OT.Feature] @@ -20,8 +20,8 @@ module OpenTox end # Load compounds via RDF (slow) - # @param [String] Dataset URI - # @return [Array] Compounds in order + # @param [String] uri Dataset URI + # @return [Array] compounds Compounds in order def self.find_compounds_rdf(rdf) query = RDF::Query.new do pattern [:uri, RDF.type, RDF::OT.Compound] @@ -31,8 +31,8 @@ module OpenTox end # Load data entries via RDF (slow) - # @param [String] Dataset uri - # @return [Array] Data entries, ordered primarily over rows and secondarily over cols + # @param [String] uri Dataset uri + # @return [Array] entries Data entries, ordered primarily over rows and secondarily over cols def self.find_data_entries_rdf(rdf) query = RDF::Query.new do pattern [:data_entry, RDF::OLO.index, :cidx] # compound index: now a free variable diff --git a/lib/utils/sparql/dataset.rb b/lib/utils/sparql/dataset.rb index e781f08..ecc0321 100644 --- a/lib/utils/sparql/dataset.rb +++ b/lib/utils/sparql/dataset.rb @@ -9,8 +9,8 @@ module OpenTox class Dataset # Load features via SPARQL (fast) - # @param [String] Dataset URI - # @return [Array] Features in order + # @param [String] uri Dataset URI + # @return [Array] features OpenTox::Features in order def self.find_features_sparql(uri) sparql = "SELECT DISTINCT ?s FROM <#{uri}> WHERE { ?s <#{RDF.type}> <#{RDF::OT.Feature}> ; @@ -19,9 +19,36 @@ module OpenTox OpenTox::Backend::FourStore.query(sparql, "text/uri-list").split("\n").collect { |uri| OpenTox::Feature.new uri.strip } end + # Load properties via SPARQL (fast) + # @param [Array] uris URIs (assumed ordered) + # @param [Hash] properties Properties (keys: user-defined identifier, values: rdf identifier as strings) + # @return [Array] types Properties in order of URIs + def self.find_props_sparql(uris, props) + selects = props.keys + conditions = selects.collect{ |k| + "<#{props[k]}> ?#{k.to_s}" + } + h={} + uris.each{ |uri| + sparql = "SELECT ?id #{selects.collect{|k| "?#{k.to_s}"}.join(" ")} FROM <#{uri}> WHERE { ?id #{conditions.join(";")} }" + res = OpenTox::Backend::FourStore.query(sparql, "text/uri-list") + res.split("\n").inject(h){ |h,row| + values = row.split("\t") + id=values.shift + h[id] = {} + values.each_with_index { |val,idx| + h[id][selects[idx]] = [] unless h[id][selects[idx]] + h[id][selects[idx]] << val.to_s + } + h + } + } + h + end + # Load compounds via SPARQL (fast) - # @param [String] Dataset URI - # @return [Array] Compounds in order + # @param [String] uri Dataset URI + # @return [Array] compounds Compounds in order def self.find_compounds_sparql(uri) sparql = "SELECT DISTINCT ?compound FROM <#{uri}> WHERE { ?s <#{RDF.type}> <#{RDF::OT.DataEntry}> ; @@ -32,8 +59,8 @@ module OpenTox end # Load data entries via SPARQL (fast) - # @param [String] Dataset uri - # @return [Array] Data entries, ordered primarily over rows and secondarily over cols + # @param [String] uri Dataset uri + # @return [Array] entries Data entries, ordered primarily over rows and secondarily over cols def self.find_data_entries_sparql(uri) sparql = "SELECT ?value FROM <#{uri}> WHERE { ?data_entry <#{RDF::OLO.index}> ?cidx ; -- cgit v1.2.3 From 931e7f00c8a5df5d5c8ea4ae6d8fdd841ec63c90 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 30 Oct 2012 16:02:28 +0100 Subject: Loading entries by sparql (mv'd 4store.rb), ordered status via rdf --- lib/4store.rb | 122 ++++++++++++++++++++++++++++++++++++++++++++ lib/dataset.rb | 19 ++++--- lib/opentox-client.rb | 3 +- lib/utils/rdf/dataset.rb | 15 +++++- lib/utils/sparql/dataset.rb | 4 +- 5 files changed, 151 insertions(+), 12 deletions(-) create mode 100644 lib/4store.rb diff --git a/lib/4store.rb b/lib/4store.rb new file mode 100644 index 0000000..3ed081d --- /dev/null +++ b/lib/4store.rb @@ -0,0 +1,122 @@ +module OpenTox + module Backend + class FourStore + + @@accept_formats = [ "application/rdf+xml", "text/turtle", "text/plain", "text/uri-list", "text/html", 'application/sparql-results+xml' ] + @@content_type_formats = [ "application/rdf+xml", "text/turtle", "text/plain" ] + + def self.list mime_type + mime_type = "text/html" if mime_type.match(%r{\*/\*}) + bad_request_error "'#{mime_type}' is not a supported mime type. Please specify one of #{@@accept_formats.join(", ")} in the Accept Header." unless @@accept_formats.include? mime_type + if mime_type =~ /uri-list/ + sparql = "SELECT DISTINCT ?g WHERE {GRAPH ?g {?s <#{RDF.type}> <#{klass}>; ?p ?o. } }" + else + sparql = "CONSTRUCT {?s ?p ?o.} WHERE {?s <#{RDF.type}> <#{klass}>; ?p ?o. }" + end + query sparql, mime_type + end + + def self.get uri, mime_type + mime_type = "text/html" if mime_type.match(%r{\*/\*}) + bad_request_error "'#{mime_type}' is not a supported mime type. Please specify one of #{@@accept_formats.join(", ")} in the Accept Header." unless @@accept_formats.include? mime_type + sparql = "CONSTRUCT {?s ?p ?o.} FROM <#{uri}> WHERE { ?s ?p ?o. }" + rdf = query sparql, mime_type + resource_not_found_error "#{uri} not found." if rdf.empty? + rdf + end + + def self.post uri, rdf, mime_type + bad_request_error "'#{mime_type}' is not a supported content type. Please use one of #{@@content_type_formats.join(", ")}." unless @@content_type_formats.include? mime_type or mime_type == "multipart/form-data" + bad_request_error "Reqest body empty." unless rdf + mime_type = "application/x-turtle" if mime_type == "text/plain" # ntriples is turtle in 4store + begin + RestClient.post File.join(four_store_uri,"data")+"/", :data => rdf, :graph => uri, "mime-type" => mime_type + rescue + bad_request_error $!.message, File.join(four_store_uri,"data")+"/" + end + end + + def self.put uri, rdf, mime_type + bad_request_error "'#{mime_type}' is not a supported content type. Please use one of #{@@content_type_formats.join(", ")}." unless @@content_type_formats.include? mime_type + bad_request_error "Reqest body empty." unless rdf + mime_type = "application/x-turtle" if mime_type == "text/plain" + #begin + RestClientWrapper.put File.join(four_store_uri,"data",uri), rdf, :content_type => mime_type + #rescue + #bad_request_error $!.message, File.join(four_store_uri,"data",uri) + #end + end + + def self.delete uri + RestClientWrapper.delete data_uri(uri) + end + + def self.update sparql + RestClient.post(update_uri, :update => sparql ) + end + + def self.query sparql, mime_type + if sparql =~ /SELECT/i +# return list unless mime_type + case mime_type + when 'application/sparql-results+xml' + RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => mime_type).body + when "text/uri-list" + RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/plain").body.gsub(/"|<|>/,'').split("\n").drop(1).join("\n") + else + bad_request_error "#{mime_type} is not a supported mime type for SELECT statements." + end + elsif sparql =~ /CONSTRUCT/i + case mime_type + when "text/plain", "application/rdf+xml" + RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => mime_type).body + when /html|turtle/ + # TODO: fix and improve + nt = RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/plain").body # 4store returns ntriples for turtle + + rdf = RDF::Graph.new + RDF::Reader.for(:ntriples).new(nt) do |reader| + reader.each_statement { |statement| rdf << statement } + end + prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"} + ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } + # TODO: fails for large datasets?? multi_cell_call + turtle = RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + rdf.each{|statement| writer << statement} + end + regex = Regexp.new '(https?:\/\/[\S]+)([>"])' + turtle = "" + turtle.gsub( regex, '\1\2' ).gsub(/\n/,'
') + "" if mime_type =~ /html/ and !turtle.empty? + turtle + end + else + # TODO: check if this prevents SPARQL injections + bad_request_error "Only SELECT and CONSTRUCT are accepted SPARQL statements." + end + rescue + bad_request_error $!.message, sparql_uri + end + + def self.klass + RDF::OT[SERVICE.capitalize] + end + + def self.four_store_uri + # credentials are removed from uri in error.rb + $four_store[:uri].sub(%r{//},"//#{$four_store[:user]}:#{$four_store[:password]}@") + end + + def self.sparql_uri + File.join(four_store_uri, "sparql") + '/' + end + + def self.update_uri + File.join(four_store_uri, "update") + '/' + end + + def self.data_uri uri + File.join(four_store_uri, "data","?graph=#{uri}") + end + + end + end +end diff --git a/lib/dataset.rb b/lib/dataset.rb index e700ad0..8d135a6 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -28,25 +28,28 @@ module OpenTox end def get(force_no_backend_query=false) - super() unless (force_no_backend_query and @rdf.size>0) + have_rdf = (force_no_backend_query and @rdf.size>0) + super() unless have_rdf + ordered = (have_rdf or OpenTox::Dataset.ordered?(@uri)) @features = [] @compounds = [] @data_entries = [] - query = RDF::Query.new do - pattern [:uri, RDF.type, RDF::OT.OrderedDataset] - end - s=query.execute(@rdf) # AM: read ordered dataset from RDF - if s.first - @uri = s[0].uri.to_s if force_no_backend_query # AM: must rewrite URI + if ordered + @uri = s[0].uri.to_s if have_rdf # AM: must rewrite URI @compounds = OpenTox::Dataset.find_compounds_rdf(@rdf) @features = OpenTox::Dataset.find_features_rdf(@rdf) numeric_features = @features.collect{|f| f.get f[RDF.type].include?(RDF::OT.NumericFeature) or f[RDF.type].include?(RDF::OT.Substructure) } - table = OpenTox::Dataset.find_data_entries_rdf(@rdf) + if have_rdf + table = OpenTox::Dataset.find_data_entries_rdf(@rdf) + else + values = OpenTox::Dataset.find_data_entries_sparql(@uri) + table = values + Array.new(@compounds.size*@features.size-values.size, "") + end clim=(@compounds.size-1) cidx = fidx = 0 num=numeric_features[fidx] diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 8b56411..ac7f4e6 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -36,7 +36,8 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m "compound.rb", "dataset.rb", "model.rb", - "algorithm.rb" + "algorithm.rb", + "4store.rb" ].each{ |f| require File.join(File.dirname(__FILE__),f) } Dir["#{File.dirname(__FILE__)}/utils/shims/*.rb"].each { |f| require f } # Shims for legacy code diff --git a/lib/utils/rdf/dataset.rb b/lib/utils/rdf/dataset.rb index b2deeb8..ab720d7 100644 --- a/lib/utils/rdf/dataset.rb +++ b/lib/utils/rdf/dataset.rb @@ -32,7 +32,7 @@ module OpenTox # Load data entries via RDF (slow) # @param [String] uri Dataset uri - # @return [Array] entries Data entries, ordered primarily over rows and secondarily over cols + # @return [Array] entries Data entries, ordered primarily over cols and secondarily over rows def self.find_data_entries_rdf(rdf) query = RDF::Query.new do pattern [:data_entry, RDF::OLO.index, :cidx] # compound index: now a free variable @@ -44,5 +44,18 @@ module OpenTox query.execute(rdf).order_by(:fidx, :cidx).collect { |s| s.val.to_s } end + # Query a dataset URI for ordered status + # by loading its metadata (OpenTox compliant) + # @param [String] uri Dataset uri + # @return [TrueClass,FalseClass] status Whether the dataset is ordered + def self.ordered?(uri) + ds = OpenTox::Dataset.new # dummy + ds.parse_rdfxml(RestClient.get([uri,"metadata"].join("/"),{:accept => "application/rdf+xml"})) + query = RDF::Query.new do + pattern [:dataset, RDF.type, RDF::OT.OrderedDataset] + end + query.execute(ds.rdf).size>0 + end + end end diff --git a/lib/utils/sparql/dataset.rb b/lib/utils/sparql/dataset.rb index ecc0321..7ba57ee 100644 --- a/lib/utils/sparql/dataset.rb +++ b/lib/utils/sparql/dataset.rb @@ -60,7 +60,7 @@ module OpenTox # Load data entries via SPARQL (fast) # @param [String] uri Dataset uri - # @return [Array] entries Data entries, ordered primarily over rows and secondarily over cols + # @return [Array] entries Data entries, ordered primarily over cols and secondarily over rows def self.find_data_entries_sparql(uri) sparql = "SELECT ?value FROM <#{uri}> WHERE { ?data_entry <#{RDF::OLO.index}> ?cidx ; @@ -68,7 +68,7 @@ module OpenTox ?v <#{RDF::OT.feature}> ?f; <#{RDF::OT.value}> ?value . ?f <#{RDF::OLO.index}> ?fidx. - } ORDER BY ?cidx ?fidx" + } ORDER BY ?fidx ?cidx" OpenTox::Backend::FourStore.query(sparql,"text/uri-list").split("\n").collect { |val| val.strip } end -- cgit v1.2.3 From 6c680de98c58ab1628adbf851741f59433cb130e Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 30 Oct 2012 16:16:29 +0100 Subject: SPARQL version --- doc/dsspeed.md | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/doc/dsspeed.md b/doc/dsspeed.md index 2fe0b5c..c2a2ee3 100644 --- a/doc/dsspeed.md +++ b/doc/dsspeed.md @@ -59,7 +59,7 @@ Timings: ## 'Fill Table' Version -A modification that avoids lookup operations where possible. Also pre-allocates `@data_entries`. +Modification of 'Row Slicing' that avoids lookup operations where possible. Also pre-allocates `@data_entries`. clim=(@compounds.size-1) cidx=0 @@ -87,22 +87,39 @@ Timings: user system total real ds reading 3.820000 0.040000 3.860000 ( 4.540800) +## 'SPARQL' Version + +Modification of 'Fill Table' that loads data entrues via SPARQL, not RDF query. + + sparql = "SELECT ?value FROM <#{uri}> WHERE { + ?data_entry <#{RDF::OLO.index}> ?cidx ; + <#{RDF::OT.values}> ?v . + ?v <#{RDF::OT.feature}> ?f; + <#{RDF::OT.value}> ?value . + ?f <#{RDF::OLO.index}> ?fidx. + } ORDER BY ?fidx ?cidx" + +Timings: + + user system total real +ds reading 1.690000 0.050000 1.740000 ( 2.362236) + # Dataset Tests Test runtimes changed as follows: -Test old new ----------------- ------- ------- -dataset.rb 6.998s 7.406s -dataset_large.rb 64.230s 25.231s +Test old 'Row Slicing' 'SPARQL' +---------------- ------- ------------- -------- +dataset.rb 6.998s 7.406s 6.341s +dataset_large.rb 64.230s 25.231s 25.071 Table: Runtimes ## Conclusions -Based on the results I implemented the 'Fill Table' variant. +In view of the results I implemented the 'SPARQL' version. ## Note -- cgit v1.2.3 From 3c7161c8c7ff4193245eb4a7b428712def99b22e Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Tue, 30 Oct 2012 16:51:22 +0100 Subject: rdf tools turned to dynamic --- lib/dataset.rb | 6 +++--- lib/utils/rdf/dataset.rb | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 8d135a6..4351dc5 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -38,14 +38,14 @@ module OpenTox # AM: read ordered dataset from RDF if ordered @uri = s[0].uri.to_s if have_rdf # AM: must rewrite URI - @compounds = OpenTox::Dataset.find_compounds_rdf(@rdf) - @features = OpenTox::Dataset.find_features_rdf(@rdf) + @compounds = find_compounds_rdf + @features = find_features_rdf numeric_features = @features.collect{|f| f.get f[RDF.type].include?(RDF::OT.NumericFeature) or f[RDF.type].include?(RDF::OT.Substructure) } if have_rdf - table = OpenTox::Dataset.find_data_entries_rdf(@rdf) + table = find_data_entries_rdf else values = OpenTox::Dataset.find_data_entries_sparql(@uri) table = values + Array.new(@compounds.size*@features.size-values.size, "") diff --git a/lib/utils/rdf/dataset.rb b/lib/utils/rdf/dataset.rb index ab720d7..e101b67 100644 --- a/lib/utils/rdf/dataset.rb +++ b/lib/utils/rdf/dataset.rb @@ -11,29 +11,29 @@ module OpenTox # Load features via RDF (slow) # @param [String] uri Dataset URI # @return [Array] features Features in order - def self.find_features_rdf(rdf) + def find_features_rdf query = RDF::Query.new do pattern [:uri, RDF.type, RDF::OT.Feature] pattern [:uri, RDF::OLO.index, :idx] end - query.execute(rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Feature.new(s.uri.to_s)} + query.execute(@rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Feature.new(s.uri.to_s)} end # Load compounds via RDF (slow) # @param [String] uri Dataset URI # @return [Array] compounds Compounds in order - def self.find_compounds_rdf(rdf) + def find_compounds_rdf query = RDF::Query.new do pattern [:uri, RDF.type, RDF::OT.Compound] pattern [:uri, RDF::OLO.index, :idx] end - query.execute(rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Compound.new(s.uri.to_s)} + query.execute(@rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Compound.new(s.uri.to_s)} end # Load data entries via RDF (slow) # @param [String] uri Dataset uri # @return [Array] entries Data entries, ordered primarily over cols and secondarily over rows - def self.find_data_entries_rdf(rdf) + def find_data_entries_rdf query = RDF::Query.new do pattern [:data_entry, RDF::OLO.index, :cidx] # compound index: now a free variable pattern [:data_entry, RDF::OT.values, :vals] @@ -41,7 +41,7 @@ module OpenTox pattern [:f, RDF::OLO.index, :fidx] pattern [:vals, RDF::OT.value, :val] end - query.execute(rdf).order_by(:fidx, :cidx).collect { |s| s.val.to_s } + query.execute(@rdf).order_by(:fidx, :cidx).collect { |s| s.val.to_s } end # Query a dataset URI for ordered status -- cgit v1.2.3 From 8a2b749ccef94b229a32ec716c93388f5c7495d7 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 31 Oct 2012 15:35:34 +0100 Subject: Fixed get for dataset from RDF --- doc/dsspeed.md | 2 +- lib/dataset.rb | 12 ++++++++---- lib/opentox.rb | 4 ++-- lib/utils/rdf/dataset.rb | 14 +++++++++++++- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/doc/dsspeed.md b/doc/dsspeed.md index c2a2ee3..62ab1c9 100644 --- a/doc/dsspeed.md +++ b/doc/dsspeed.md @@ -89,7 +89,7 @@ Timings: ## 'SPARQL' Version -Modification of 'Fill Table' that loads data entrues via SPARQL, not RDF query. +Modification of 'Fill Table' that loads data entries via SPARQL, not RDF query. sparql = "SELECT ?value FROM <#{uri}> WHERE { ?data_entry <#{RDF::OLO.index}> ?cidx ; diff --git a/lib/dataset.rb b/lib/dataset.rb index 4351dc5..288e4d3 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -29,17 +29,21 @@ module OpenTox def get(force_no_backend_query=false) have_rdf = (force_no_backend_query and @rdf.size>0) - super() unless have_rdf ordered = (have_rdf or OpenTox::Dataset.ordered?(@uri)) + super() if (!have_rdf and !ordered) @features = [] @compounds = [] @data_entries = [] # AM: read ordered dataset from RDF if ordered - @uri = s[0].uri.to_s if have_rdf # AM: must rewrite URI - @compounds = find_compounds_rdf - @features = find_features_rdf + # Read only some data as rdf + unless have_rdf + self.parse_rdfxml( RestClient.get([@uri,"allnde"].join("/"),{:accept => "application/rdf+xml"}), true ) + end + @compounds = self.find_compounds_rdf + @features = self.find_features_rdf + numeric_features = @features.collect{|f| f.get f[RDF.type].include?(RDF::OT.NumericFeature) or f[RDF.type].include?(RDF::OT.Substructure) diff --git a/lib/opentox.rb b/lib/opentox.rb index faa7b58..0f29c30 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -130,8 +130,8 @@ module OpenTox RDF_FORMATS.each do |format| # rdf parse methods for all formats e.g. parse_rdfxml - send :define_method, "parse_#{format}".to_sym do |rdf| - @rdf = RDF::Graph.new + send :define_method, "parse_#{format}".to_sym do |rdf,init=true| + @rdf = RDF::Graph.new if init RDF::Reader.for(format).new(rdf) do |reader| reader.each_statement{ |statement| @rdf << statement } end diff --git a/lib/utils/rdf/dataset.rb b/lib/utils/rdf/dataset.rb index e101b67..2cb32a9 100644 --- a/lib/utils/rdf/dataset.rb +++ b/lib/utils/rdf/dataset.rb @@ -47,7 +47,7 @@ module OpenTox # Query a dataset URI for ordered status # by loading its metadata (OpenTox compliant) # @param [String] uri Dataset uri - # @return [TrueClass,FalseClass] status Whether the dataset is ordered + # @return [TrueClass, FalseClass] status Whether the dataset is ordered def self.ordered?(uri) ds = OpenTox::Dataset.new # dummy ds.parse_rdfxml(RestClient.get([uri,"metadata"].join("/"),{:accept => "application/rdf+xml"})) @@ -57,5 +57,17 @@ module OpenTox query.execute(ds.rdf).size>0 end + # Load dataset URI from given RDF (slow) + # @param [String] rdf RDF + # @return [String] uri URI + def self.uri_from_rdf(rdf) + ds = OpenTox::Dataset.new # dummy + ds.parse_rdfxml(rdf) + query = RDF::Query.new do + pattern [:dataset, RDF.type, RDF::OT.Dataset] + end + query.execute(ds.rdf).collect { |s| s.dataset.to_s }[0] + end + end end -- cgit v1.2.3 From 461a20d9071ad80f334d7a3d8c334e2e085821d2 Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Wed, 31 Oct 2012 17:19:20 +0100 Subject: Compounds removed from allnde target --- lib/dataset.rb | 17 ++++++++++++++--- lib/utils/sparql/dataset.rb | 5 ++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 288e4d3..4ce5fc4 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -37,23 +37,34 @@ module OpenTox # AM: read ordered dataset from RDF if ordered + # Read only some data as rdf unless have_rdf self.parse_rdfxml( RestClient.get([@uri,"allnde"].join("/"),{:accept => "application/rdf+xml"}), true ) end - @compounds = self.find_compounds_rdf - @features = self.find_features_rdf + # Features + @features = self.find_features_rdf numeric_features = @features.collect{|f| f.get f[RDF.type].include?(RDF::OT.NumericFeature) or f[RDF.type].include?(RDF::OT.Substructure) } + + # Compounds + if have_rdf + @compounds = self.find_compounds_rdf + else + @compounds = RestClient.get([@uri,"compounds"].join("/"),{:accept => "text/uri-list"}).split("\n").collect { |cmpd| OpenTox::Compound.new cmpd } + end + + # Data Entries if have_rdf - table = find_data_entries_rdf + table = self.find_data_entries_rdf else values = OpenTox::Dataset.find_data_entries_sparql(@uri) table = values + Array.new(@compounds.size*@features.size-values.size, "") end + clim=(@compounds.size-1) cidx = fidx = 0 num=numeric_features[fidx] diff --git a/lib/utils/sparql/dataset.rb b/lib/utils/sparql/dataset.rb index 7ba57ee..ecf55b6 100644 --- a/lib/utils/sparql/dataset.rb +++ b/lib/utils/sparql/dataset.rb @@ -51,9 +51,8 @@ module OpenTox # @return [Array] compounds Compounds in order def self.find_compounds_sparql(uri) sparql = "SELECT DISTINCT ?compound FROM <#{uri}> WHERE { - ?s <#{RDF.type}> <#{RDF::OT.DataEntry}> ; - <#{RDF::OLO.index}> ?cidx; - <#{RDF::OT.compound}> ?compound + ?compound <#{RDF.type}> <#{RDF::OT.Compound}> ; + <#{RDF::OLO.index}> ?cidx; } ORDER BY ?cidx" OpenTox::Backend::FourStore.query(sparql, "text/uri-list").split("\n").collect { |uri| OpenTox::Compound.new uri.strip } end -- cgit v1.2.3 From 3cbb1ef43dc03e89b780ac67a74cc30773d8cacf Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Sat, 3 Nov 2012 11:28:43 +0100 Subject: Added CSV upload analysis --- doc/dsspeed.md | 53 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/doc/dsspeed.md b/doc/dsspeed.md index 62ab1c9..498181c 100644 --- a/doc/dsspeed.md +++ b/doc/dsspeed.md @@ -3,9 +3,44 @@ Description: A benchmark comparison of different dataset implementations. Author: Andreas Maunz `` Date: 10/2012 -# Request per row +# Dataset Creation -(Old) implementation with one query for data entries **per compound**. +Storing a dataset in the 4store backend. + +## Data analysis Generation of triples. + +Implementation with querying the `/compound` service for compound URIs. + + date + task=`curl -X POST -F "file=@/home/am/opentox-ruby/opentox-test/test/data/kazius.csv;type=text/csv" + http://localhost:8083/dataset 2>/dev/null` + get_result $task + date + +Timings for uploading the Kazius dataset (>4000 compounds. Repeated three times, median reported): + + Sat Nov 3 11:10:04 CET 2012 + http://localhost:8083/dataset/6a92fbf1-9c46-4c72-a487-365589c1210d + Sat Nov 3 11:10:41 CET 2012 + +Uploading takes 37s. This time is consumed by the workflow as follows: + +- Compound Triples: 33.236s (89.8 %) +- Value Triples: 1.052s (0.03 %) +- Other Triples: <1s (<0.03 %) +- 4store upload: <3s (<0.1 %) + +Based on these results I suggest to avoid querying the compound service. + + + +# Dataset Read-In + +Populating an `OpenTox::Dataset` object in memory, by reading from the 4store backend. + +## Request per row + +Implementation with one query for data entries **per compound**. @compounds.each_with_index do |compound,i| query = RDF::Query.new do @@ -28,7 +63,7 @@ Timings for reading a BBRC feature dataset (85 compounds, 53 features. Repeated ds reading 6.640000 0.090000 6.730000 ( 7.429505) -# Single Table +## Single Table Now some optimized versions that retrieve entries all at once. A few variables have been renamed for clarity in the query: @@ -43,7 +78,7 @@ Now some optimized versions that retrieve entries all at once. A few variables h Also `RDF::Query::Solutions#order_by` is used instead of the generic `Enumerable#sort_by`, which may have advantages (not tested seperately). -## 'Row Slicing' Version +### 'Row Slicing' Version Results are sorted by compound, then by feature. The long array is sliced into rows. @@ -57,7 +92,7 @@ Timings: user system total real ds reading 3.850000 0.090000 3.940000 ( 4.643435) -## 'Fill Table' Version +### 'Fill Table' Version Modification of 'Row Slicing' that avoids lookup operations where possible. Also pre-allocates `@data_entries`. @@ -87,7 +122,7 @@ Timings: user system total real ds reading 3.820000 0.040000 3.860000 ( 4.540800) -## 'SPARQL' Version +### 'SPARQL' Version Modification of 'Fill Table' that loads data entries via SPARQL, not RDF query. @@ -105,7 +140,7 @@ Timings: ds reading 1.690000 0.050000 1.740000 ( 2.362236) -# Dataset Tests +## Dataset Tests Test runtimes changed as follows: @@ -117,12 +152,12 @@ dataset_large.rb 64.230s 25.231s 25.071 Table: Runtimes -## Conclusions +### Conclusions In view of the results I implemented the 'SPARQL' version. -## Note +### Note A further modification that avoids querying compounds separately made runtimes much worse again. The idea was to get the compound together with each data entry: -- cgit v1.2.3 From fbc1b7b37d2888594e5c1e28621cb4d8039228c9 Mon Sep 17 00:00:00 2001 From: gebele Date: Wed, 7 Nov 2012 10:46:27 +0100 Subject: added method created_at --- lib/task.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/task.rb b/lib/task.rb index 42bc84b..23e6e9e 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -10,6 +10,7 @@ module OpenTox uri = File.join(service_uri,SecureRandom.uuid) task = Task.new uri, subjectid + task[RDF::OT.created_at] = DateTime.now task[RDF::OT.hasStatus] = "Running" params.each { |k,v| task[k] = v } task.put false @@ -61,12 +62,14 @@ module OpenTox def cancel kill self.[]=(RDF::OT.hasStatus, "Cancelled") + self.[]=(RDF::OT.finished_at, DateTime.now) put false end def completed(uri) self.[]=(RDF::OT.resultURI, uri) self.[]=(RDF::OT.hasStatus, "Completed") + self.[]=(RDF::OT.finished_at, DateTime.now) put false end @@ -104,7 +107,7 @@ module OpenTox code >= 400 and code != 503 end - [:hasStatus, :resultURI, :finished_at].each do |method| + [:hasStatus, :resultURI, :created_at, :finished_at].each do |method| define_method method do get response = self.[](RDF::OT[method]) -- cgit v1.2.3 From 09441ff5d86cb2826367171c05d59cdad909769d Mon Sep 17 00:00:00 2001 From: Andreas Maunz Date: Fri, 16 Nov 2012 10:20:30 +0100 Subject: Updated dsspeed doc --- doc/dsspeed.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/doc/dsspeed.md b/doc/dsspeed.md index 498181c..9f04efd 100644 --- a/doc/dsspeed.md +++ b/doc/dsspeed.md @@ -3,17 +3,20 @@ Description: A benchmark comparison of different dataset implementations. Author: Andreas Maunz `` Date: 10/2012 +Some experiments made on branch `development`, using a VirtualBox VM (2 CPU, 2G of RAM), Debian 6.0.5, 64bit. + # Dataset Creation -Storing a dataset in the 4store backend. +Storing a dataset at the 4store backend. -## Data analysis Generation of triples. +## Generating and Storing Triples. Implementation with querying the `/compound` service for compound URIs. date - task=`curl -X POST -F "file=@/home/am/opentox-ruby/opentox-test/test/data/kazius.csv;type=text/csv" - http://localhost:8083/dataset 2>/dev/null` + task=`curl -X POST \ + -F "file=@/home/am/opentox-ruby/opentox-test/test/data/kazius.csv;type=text/csv" + http://localhost:8083/dataset 2>/dev/null` get_result $task date -- cgit v1.2.3 From 7e27259d5db7349e0e29762244298c986146ca37 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 7 Dec 2012 16:59:56 +0100 Subject: extend html support get request in service root now returns uri-list accept header for html requests is fixed in before-method fix link parsing in to_html method add png image to to_html method --- lib/4store.rb | 9 ++++----- lib/utils/html.rb | 9 ++++++--- lib/utils/shims/feature.rb | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/4store.rb b/lib/4store.rb index 3ed081d..5a2714b 100644 --- a/lib/4store.rb +++ b/lib/4store.rb @@ -6,9 +6,8 @@ module OpenTox @@content_type_formats = [ "application/rdf+xml", "text/turtle", "text/plain" ] def self.list mime_type - mime_type = "text/html" if mime_type.match(%r{\*/\*}) bad_request_error "'#{mime_type}' is not a supported mime type. Please specify one of #{@@accept_formats.join(", ")} in the Accept Header." unless @@accept_formats.include? mime_type - if mime_type =~ /uri-list/ + if mime_type =~ /(uri-list|html)/ sparql = "SELECT DISTINCT ?g WHERE {GRAPH ?g {?s <#{RDF.type}> <#{klass}>; ?p ?o. } }" else sparql = "CONSTRUCT {?s ?p ?o.} WHERE {?s <#{RDF.type}> <#{klass}>; ?p ?o. }" @@ -17,7 +16,6 @@ module OpenTox end def self.get uri, mime_type - mime_type = "text/html" if mime_type.match(%r{\*/\*}) bad_request_error "'#{mime_type}' is not a supported mime type. Please specify one of #{@@accept_formats.join(", ")} in the Accept Header." unless @@accept_formats.include? mime_type sparql = "CONSTRUCT {?s ?p ?o.} FROM <#{uri}> WHERE { ?s ?p ?o. }" rdf = query sparql, mime_type @@ -61,8 +59,9 @@ module OpenTox case mime_type when 'application/sparql-results+xml' RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => mime_type).body - when "text/uri-list" - RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/plain").body.gsub(/"|<|>/,'').split("\n").drop(1).join("\n") + when /(uri-list|html)/ + uri_list = RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/plain").body.gsub(/"|<|>/,'').split("\n").drop(1).join("\n") + uri_list = OpenTox.text_to_html(uri_list) if mime_type=~/html/ else bad_request_error "#{mime_type} is not a supported mime type for SELECT statements." end diff --git a/lib/utils/html.rb b/lib/utils/html.rb index 91dfc64..d74f357 100644 --- a/lib/utils/html.rb +++ b/lib/utils/html.rb @@ -7,15 +7,17 @@ * Date: 10/2012 =end +require "base64" + # AM: needed since this gem has a nested directory structure class String # encloses URI in text with with link tag # @return [String] new text with marked links def link_urls - regex = Regexp.new '(https?:\/\/[\S]+)([>"])' - self.gsub( regex, '\1\2' ) + self.gsub(/(?i)http(s?):\/\/[^\r\n\s']*/, '\0') end + end module OpenTox @@ -29,7 +31,7 @@ module OpenTox # @param [optional,String] description general info # @param [optional,Array] post_command, infos for the post operation, object defined below # @return [String] html page - def self.text_to_html( text, subjectid=nil, related_links=nil, description=nil, post_command=nil ) + def self.text_to_html( text, subjectid=nil, related_links=nil, description=nil, post_command=nil, png_image=nil ) # TODO add title as parameter title = nil #$sinatra.url_for($sinatra.request.env['PATH_INFO'], :full) if $sinatra @@ -41,6 +43,7 @@ module OpenTox html += "

Related links

"+related_links.link_urls+"

" if related_links html += "

Content

" if description || related_links html += "

" + html += "\n" if png_image html += text.link_urls html += "

" html diff --git a/lib/utils/shims/feature.rb b/lib/utils/shims/feature.rb index 297748b..f49bb39 100644 --- a/lib/utils/shims/feature.rb +++ b/lib/utils/shims/feature.rb @@ -30,7 +30,7 @@ module OpenTox metadata[RDF.type] = [] unless metadata[RDF.type] metadata[RDF.type] << RDF::OT.Feature unless metadata[RDF.type].include?(RDF::OT.Feature) metadata[RDF::DC.title] = title unless (metadata[RDF::DC.title]) - feature = feature_new = OpenTox::Feature.new File.join($feature[:uri], SecureRandom.uuid), @subjectid + feature = feature_new = OpenTox::Feature.new(File.join($feature[:uri], SecureRandom.uuid), @subjectid) feature_new.metadata = metadata sparql = "SELECT DISTINCT ?feature WHERE { ?feature <#{RDF.type}> <#{RDF::OT['feature'.capitalize]}>. ?feature <#{RDF::DC.title}> '#{title.to_s}' }" feature_uris = OpenTox::Backend::FourStore.query(sparql,"text/uri-list").split("\n") -- cgit v1.2.3 From 8f493dac66edefc37a3349ffef5259673bb41acb Mon Sep 17 00:00:00 2001 From: rautenberg Date: Mon, 10 Dec 2012 12:25:22 +0100 Subject: fix missing return in text/uri-list case --- lib/4store.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/4store.rb b/lib/4store.rb index 5a2714b..5a5cd66 100644 --- a/lib/4store.rb +++ b/lib/4store.rb @@ -62,6 +62,7 @@ module OpenTox when /(uri-list|html)/ uri_list = RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/plain").body.gsub(/"|<|>/,'').split("\n").drop(1).join("\n") uri_list = OpenTox.text_to_html(uri_list) if mime_type=~/html/ + return uri_list else bad_request_error "#{mime_type} is not a supported mime type for SELECT statements." end -- cgit v1.2.3 From 29bdb0d3984bd215278b913ad5d5cde06f67a7d0 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Mon, 10 Dec 2012 19:02:01 +0100 Subject: URI.accessible? for ssl --- lib/overwrite.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 574d922..f90e494 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -54,7 +54,16 @@ module URI Net::HTTP.get_response(URI.parse(uri)) true else - Net::HTTP.get_response(URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : ""))).code.to_i < 400 + parsed_uri = URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : "")) + unless URI.ssl? uri + Net::HTTP.get_response(parsed_uri).code.to_i < 400 + else + http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) + http.use_ssl = true + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + request = Net::HTTP::Get.new(parsed_uri.request_uri) + http.request(request).code.to_i < 400 + end end rescue false -- cgit v1.2.3 From 7dadfce0978e6e4fd7286db4f4f9ac2da392eca0 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Mon, 10 Dec 2012 19:04:42 +0100 Subject: URI.accessible? for ssl --- lib/overwrite.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index f90e494..c7bb312 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -55,7 +55,7 @@ module URI true else parsed_uri = URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : "")) - unless URI.ssl? uri + unless URI.ssl? uri Net::HTTP.get_response(parsed_uri).code.to_i < 400 else http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) -- cgit v1.2.3 From 8a374b38d1e8b727f365b6ce5edf5424eb1a0c7d Mon Sep 17 00:00:00 2001 From: davor Date: Thu, 13 Dec 2012 15:27:30 +0100 Subject: Update lib/utils/html.rb Changed color ;-) --- lib/utils/html.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/utils/html.rb b/lib/utils/html.rb index d74f357..d1fb323 100644 --- a/lib/utils/html.rb +++ b/lib/utils/html.rb @@ -42,7 +42,7 @@ module OpenTox html += "

Description

"+description.link_urls+"

" if description html += "

Related links

"+related_links.link_urls+"

" if related_links html += "

Content

" if description || related_links - html += "

" + html += "

" html += "\n" if png_image html += text.link_urls html += "

" -- cgit v1.2.3 From 55e88016d29aa40e427a904d6e9f3bb8dc39d921 Mon Sep 17 00:00:00 2001 From: gebele Date: Mon, 17 Dec 2012 16:49:28 +0100 Subject: get uri-list sorted by 4store --- lib/4store.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/4store.rb b/lib/4store.rb index 5a5cd66..c9947a7 100644 --- a/lib/4store.rb +++ b/lib/4store.rb @@ -7,8 +7,8 @@ module OpenTox def self.list mime_type bad_request_error "'#{mime_type}' is not a supported mime type. Please specify one of #{@@accept_formats.join(", ")} in the Accept Header." unless @@accept_formats.include? mime_type - if mime_type =~ /(uri-list|html)/ - sparql = "SELECT DISTINCT ?g WHERE {GRAPH ?g {?s <#{RDF.type}> <#{klass}>; ?p ?o. } }" + if mime_type =~ /(uri-list|html)/ + sparql = "SELECT DISTINCT ?g WHERE {GRAPH ?g {?s <#{RDF.type}> <#{klass}>; <#{RDF::DC.modified}> ?o.} } ORDER BY ?o" else sparql = "CONSTRUCT {?s ?p ?o.} WHERE {?s <#{RDF.type}> <#{klass}>; ?p ?o. }" end -- cgit v1.2.3 From 147e1b7351975f19697e1e6ff4a6106fd38174ae Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 23 Jan 2013 12:53:43 +0100 Subject: url_for removed auto insertion of RDF::DC.modified --- Gemfile.lock | 12 ++++++------ lib/4store.rb | 10 ++++++---- lib/compound.rb | 4 ++-- lib/opentox.rb | 2 +- lib/utils/html.rb | 2 +- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 345faf2..f778e78 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -13,16 +13,16 @@ GEM remote: http://rubygems.org/ specs: addressable (2.3.2) - ffi (1.1.5) + ffi (1.3.1) mime-types (1.19) open4 (1.3.0) - rdf (0.3.8) + rdf (0.3.11.1) addressable (>= 2.2.6) - rdf-n3 (0.3.7) - rdf (>= 0.3.4) - rdf-raptor (0.4.1) + rdf-n3 (0.3.8) + rdf (>= 0.3.11) + rdf-raptor (0.4.2) ffi (>= 1.0) - rdf (~> 0.3.0) + rdf (~> 0.3.8) rest-client (1.6.7) mime-types (>= 1.16) diff --git a/lib/4store.rb b/lib/4store.rb index c9947a7..32d8817 100644 --- a/lib/4store.rb +++ b/lib/4store.rb @@ -29,6 +29,7 @@ module OpenTox mime_type = "application/x-turtle" if mime_type == "text/plain" # ntriples is turtle in 4store begin RestClient.post File.join(four_store_uri,"data")+"/", :data => rdf, :graph => uri, "mime-type" => mime_type + update "INSERT DATA { GRAPH <#{uri}> { <#{uri}> <#{RDF::DC.modified}> \"#{DateTime.now}\" } }" rescue bad_request_error $!.message, File.join(four_store_uri,"data")+"/" end @@ -38,11 +39,12 @@ module OpenTox bad_request_error "'#{mime_type}' is not a supported content type. Please use one of #{@@content_type_formats.join(", ")}." unless @@content_type_formats.include? mime_type bad_request_error "Reqest body empty." unless rdf mime_type = "application/x-turtle" if mime_type == "text/plain" - #begin + begin RestClientWrapper.put File.join(four_store_uri,"data",uri), rdf, :content_type => mime_type - #rescue - #bad_request_error $!.message, File.join(four_store_uri,"data",uri) - #end + update "INSERT DATA { GRAPH <#{uri}> { <#{uri}> <#{RDF::DC.modified}> \"#{DateTime.now}\" } }" + rescue + bad_request_error $!.message, File.join(four_store_uri,"data",uri) + end end def self.delete uri diff --git a/lib/compound.rb b/lib/compound.rb index da16c85..a0d6ec7 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -11,7 +11,7 @@ module OpenTox # @param [String] smiles Smiles string # @return [OpenTox::Compound] Compound def self.from_smiles service_uri, smiles, subjectid=nil - @smiles = smiles + #@smiles = smiles Compound.new RestClientWrapper.post(service_uri, smiles, {:content_type => 'chemical/x-daylight-smiles', :subjectid => subjectid}) end @@ -19,7 +19,7 @@ module OpenTox # @param [String] smiles InChI string # @return [OpenTox::Compound] Compound def self.from_inchi service_uri, inchi, subjectid=nil - @inchi = inchi + #@inchi = inchi Compound.new RestClientWrapper.post(service_uri, inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) end diff --git a/lib/opentox.rb b/lib/opentox.rb index 0f29c30..877c5d5 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -104,7 +104,7 @@ module OpenTox # Save object at webservice def put wait=true # TODO: RDFXML - append RDF::DC.modified, DateTime.now + #append RDF::DC.modified, DateTime.now uri = RestClientWrapper.put @uri.to_s, self.to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} wait_for_task uri if wait end diff --git a/lib/utils/html.rb b/lib/utils/html.rb index d1fb323..4a4c9e1 100644 --- a/lib/utils/html.rb +++ b/lib/utils/html.rb @@ -34,7 +34,7 @@ module OpenTox def self.text_to_html( text, subjectid=nil, related_links=nil, description=nil, post_command=nil, png_image=nil ) # TODO add title as parameter - title = nil #$sinatra.url_for($sinatra.request.env['PATH_INFO'], :full) if $sinatra + title = nil #$sinatra.to($sinatra.request.env['PATH_INFO'], :full) if $sinatra html = "" html += ""+title+"" if title #html += "<\/img>" -- cgit v1.2.3 From 5127847aa91af7add1cd15f39ae3c037365eb610 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 24 Jan 2013 11:42:42 +0100 Subject: remove some rescue blocks from A&A --- lib/authorization.rb | 70 +++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 1fe5c51..95d6c46 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -77,7 +77,7 @@ module OpenTox begin out = RestClientWrapper.post("#{AA}/auth/logout",:subjectid => subjectid) return true unless is_token_valid(subjectid) - rescue + rescue #openSSO throws 500 if token is invalid return false end return false @@ -88,12 +88,8 @@ module OpenTox # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). def self.authorize(uri, action, subjectid) return true if !AA - #begin return true if RestClientWrapper.post("#{AA}/auth/authorize",{:uri => uri, :action => action, :subjectid => subjectid})== "boolean=true\n" return false - #rescue - # return nil - #end end #Checks if a token is a valid token @@ -103,7 +99,7 @@ module OpenTox return true if !AA begin return true if RestClientWrapper.post("#{AA}/auth/isTokenValid",:tokenid => subjectid) == "boolean=true\n" - rescue #do rescue because openSSO throws 401 + rescue #do rescue because openSSO throws 401 if token invalid return false end return false @@ -113,23 +109,23 @@ module OpenTox # @param [String]subjectid requires subjectid # @return [Array, nil] returns an Array of policy names or nil if request fails def self.list_policies(subjectid) - begin + #begin out = RestClientWrapper.get("#{AA}/pol",nil,:subjectid => subjectid) return out.split("\n") - rescue - return nil - end + #rescue + # return nil + #end end #Returns a policy in xml-format # @param [String, String]policy,subjectid # @return [String] XML of the policy def self.list_policy(policy, subjectid) - begin + #begin return RestClientWrapper.get("#{AA}/pol",nil,{:subjectid => subjectid,:id => policy}) - rescue - return nil - end + #rescue + # return nil + #end end # Lists policies alongside with affected uris @@ -157,11 +153,11 @@ module OpenTox # @param [String, String]uri,subjectid # return [String, nil]owner,nil returns owner of the URI def self.get_uri_owner(uri, subjectid) - begin - return RestClientWrapper.get("#{AA}/pol",nil,{:subjectid => subjectid, :uri => uri}).sub("\n","") - rescue - return nil - end + #begin + return RestClientWrapper.get("#{AA}/pol",nil,{:subjectid => subjectid, :uri => uri}).sub("\n","") + #rescue + # return nil + #end end #Returns true or false if owner (who created the first policy) of an URI @@ -184,7 +180,7 @@ module OpenTox # @param [String, String]uri,subjectid # return [Array, nil] returns an Array of policy names or nil if request fails def self.list_uri_policies(uri, subjectid) - begin + #begin out = RestClientWrapper.get("#{AA}/pol",nil,{:uri => uri, :polnames => true, :subjectid => subjectid}) policies = []; notfirstline = false out.split("\n").each do |line| @@ -192,56 +188,56 @@ module OpenTox notfirstline = true end return policies - rescue - return nil - end + #rescue + # return nil + #end end #Sends a policy in xml-format to opensso server. Requires policy-xml and token. # @param [String, String]policyxml,subjectid # return [Boolean] returns true if policy is created def self.create_policy(policy, subjectid) - begin + #begin $logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s return true if RestClientWrapper.post("#{AA}/Pol/opensso-pol",policy, {:subjectid => subjectid, :content_type => "application/xml"}) - rescue + #rescue return false - end + #end end #Deletes a policy # @param [String, String]policyname,subjectid # @return [Boolean,nil] def self.delete_policy(policy, subjectid) - begin + #begin $logger.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" return true if RestClientWrapper.delete("#{AA}/pol",nil, {:subjectid => subjectid, :id => policy}) - rescue + #rescue return nil - end + #end end #Returns array of the LDAP-Groups of an user # @param [String]subjectid # @return [Array] gives array of LDAP groups of a user def self.list_user_groups(user, subjectid) - begin + #begin out = RestClientWrapper.post("#{AA}/opensso/identity/read", {:name => user, :admin => subjectid, :attributes_names => "group"}) grps = [] out.split("\n").each do |line| grps << line.sub("identitydetails.group=","") if line.include?("identitydetails.group=") end return grps - rescue - [] - end + #rescue + # [] + #end end #Returns the owner (user id) of a token # @param [String]subjectid # @return [String]user def self.get_user(subjectid) - begin + #begin out = RestClientWrapper.post("#{AA}/opensso/identity/attributes", {:subjectid => subjectid, :attributes_names => "uid"}) user = ""; check = false out.split("\n").each do |line| @@ -252,9 +248,9 @@ module OpenTox check = true if line.include?("userdetails.attribute.name=uid") end return user - rescue - nil - end + #rescue + # nil + #end end #Send default policy with Authorization::Helper class -- cgit v1.2.3 From 2d094d61663c36004915b5e124ba2001364392ac Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 24 Jan 2013 13:05:05 +0100 Subject: one step back --- lib/authorization.rb | 70 +++++++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 95d6c46..1fe5c51 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -77,7 +77,7 @@ module OpenTox begin out = RestClientWrapper.post("#{AA}/auth/logout",:subjectid => subjectid) return true unless is_token_valid(subjectid) - rescue #openSSO throws 500 if token is invalid + rescue return false end return false @@ -88,8 +88,12 @@ module OpenTox # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). def self.authorize(uri, action, subjectid) return true if !AA + #begin return true if RestClientWrapper.post("#{AA}/auth/authorize",{:uri => uri, :action => action, :subjectid => subjectid})== "boolean=true\n" return false + #rescue + # return nil + #end end #Checks if a token is a valid token @@ -99,7 +103,7 @@ module OpenTox return true if !AA begin return true if RestClientWrapper.post("#{AA}/auth/isTokenValid",:tokenid => subjectid) == "boolean=true\n" - rescue #do rescue because openSSO throws 401 if token invalid + rescue #do rescue because openSSO throws 401 return false end return false @@ -109,23 +113,23 @@ module OpenTox # @param [String]subjectid requires subjectid # @return [Array, nil] returns an Array of policy names or nil if request fails def self.list_policies(subjectid) - #begin + begin out = RestClientWrapper.get("#{AA}/pol",nil,:subjectid => subjectid) return out.split("\n") - #rescue - # return nil - #end + rescue + return nil + end end #Returns a policy in xml-format # @param [String, String]policy,subjectid # @return [String] XML of the policy def self.list_policy(policy, subjectid) - #begin + begin return RestClientWrapper.get("#{AA}/pol",nil,{:subjectid => subjectid,:id => policy}) - #rescue - # return nil - #end + rescue + return nil + end end # Lists policies alongside with affected uris @@ -153,11 +157,11 @@ module OpenTox # @param [String, String]uri,subjectid # return [String, nil]owner,nil returns owner of the URI def self.get_uri_owner(uri, subjectid) - #begin - return RestClientWrapper.get("#{AA}/pol",nil,{:subjectid => subjectid, :uri => uri}).sub("\n","") - #rescue - # return nil - #end + begin + return RestClientWrapper.get("#{AA}/pol",nil,{:subjectid => subjectid, :uri => uri}).sub("\n","") + rescue + return nil + end end #Returns true or false if owner (who created the first policy) of an URI @@ -180,7 +184,7 @@ module OpenTox # @param [String, String]uri,subjectid # return [Array, nil] returns an Array of policy names or nil if request fails def self.list_uri_policies(uri, subjectid) - #begin + begin out = RestClientWrapper.get("#{AA}/pol",nil,{:uri => uri, :polnames => true, :subjectid => subjectid}) policies = []; notfirstline = false out.split("\n").each do |line| @@ -188,56 +192,56 @@ module OpenTox notfirstline = true end return policies - #rescue - # return nil - #end + rescue + return nil + end end #Sends a policy in xml-format to opensso server. Requires policy-xml and token. # @param [String, String]policyxml,subjectid # return [Boolean] returns true if policy is created def self.create_policy(policy, subjectid) - #begin + begin $logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s return true if RestClientWrapper.post("#{AA}/Pol/opensso-pol",policy, {:subjectid => subjectid, :content_type => "application/xml"}) - #rescue + rescue return false - #end + end end #Deletes a policy # @param [String, String]policyname,subjectid # @return [Boolean,nil] def self.delete_policy(policy, subjectid) - #begin + begin $logger.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" return true if RestClientWrapper.delete("#{AA}/pol",nil, {:subjectid => subjectid, :id => policy}) - #rescue + rescue return nil - #end + end end #Returns array of the LDAP-Groups of an user # @param [String]subjectid # @return [Array] gives array of LDAP groups of a user def self.list_user_groups(user, subjectid) - #begin + begin out = RestClientWrapper.post("#{AA}/opensso/identity/read", {:name => user, :admin => subjectid, :attributes_names => "group"}) grps = [] out.split("\n").each do |line| grps << line.sub("identitydetails.group=","") if line.include?("identitydetails.group=") end return grps - #rescue - # [] - #end + rescue + [] + end end #Returns the owner (user id) of a token # @param [String]subjectid # @return [String]user def self.get_user(subjectid) - #begin + begin out = RestClientWrapper.post("#{AA}/opensso/identity/attributes", {:subjectid => subjectid, :attributes_names => "uid"}) user = ""; check = false out.split("\n").each do |line| @@ -248,9 +252,9 @@ module OpenTox check = true if line.include?("userdetails.attribute.name=uid") end return user - #rescue - # nil - #end + rescue + nil + end end #Send default policy with Authorization::Helper class -- cgit v1.2.3 From 54b833546cea44e03eca3183ad4a37b9f30651a1 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 4 Feb 2013 14:07:28 +0100 Subject: add validation, some debug messages, small adjustments --- lib/opentox-client.rb | 3 +- lib/opentox.rb | 4 + lib/rest-client-wrapper.rb | 8 +- lib/utils/shims/dataset.rb | 98 +++++++++++++ lib/utils/shims/feature.rb | 2 +- lib/utils/shims/model.rb | 40 +++++ lib/utils/shims/task.rb | 40 +++++ lib/validation.rb | 356 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 546 insertions(+), 5 deletions(-) create mode 100644 lib/utils/shims/model.rb create mode 100644 lib/validation.rb diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index ac7f4e6..65a9177 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -37,7 +37,8 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m "dataset.rb", "model.rb", "algorithm.rb", - "4store.rb" + "4store.rb", + "validation.rb" ].each{ |f| require File.join(File.dirname(__FILE__),f) } Dir["#{File.dirname(__FILE__)}/utils/shims/*.rb"].each { |f| require f } # Shims for legacy code diff --git a/lib/opentox.rb b/lib/opentox.rb index 0f29c30..f125c30 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -115,6 +115,10 @@ module OpenTox end def wait_for_task uri + OpenTox.wait_for_task uri + end + + def self.wait_for_task uri if URI.task?(uri) t = OpenTox::Task.new uri t.wait diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 1258339..0d1c56b 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -13,13 +13,13 @@ module OpenTox # @return [RestClient::Response] REST call response [:head,:get,:post,:put,:delete].each do |method| - define_singleton_method method do |uri,payload={},headers={}| + define_singleton_method method do |uri,payload={},headers={},waiting_task=nil| - # check input + # check input + bad_request_error "Headers are not a hash: #{headers.inspect}", uri unless headers==nil or headers.is_a?(Hash) @subjectid = headers[:subjectid] ? headers[:subjectid] : nil bad_request_error "Invalid URI: '#{uri}'", uri unless URI.valid? uri #resource_not_found_error "URI '#{uri}' not found.", uri unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) - bad_request_error "Headers are not a hash: #{headers.inspect}", uri unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| if defined? $aa || URI(uri).host == URI($aa[:uri]).host @@ -36,6 +36,8 @@ module OpenTox args[:payload] = payload headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems args[:headers] = headers + + $logger.debug "POST #{uri} #{payload.inspect}" if method.to_s=="post" && payload.is_a?(Hash) @request = RestClient::Request.new(args) # ignore error codes from Task services (may return error codes >= 400 according to API, which causes exceptions in RestClient and RDF::Reader) diff --git a/lib/utils/shims/dataset.rb b/lib/utils/shims/dataset.rb index 912510c..f72ff1b 100644 --- a/lib/utils/shims/dataset.rb +++ b/lib/utils/shims/dataset.rb @@ -21,7 +21,104 @@ module OpenTox ds.get ds end + + def self.exist?(uri, subjectid=nil) + ds = OpenTox::Dataset.new uri, subjectid + begin + ds.get_metadata + true + rescue + false + end + end + + def split( compound_indices, feats, metadata, subjectid=nil) + + raise "Dataset.split : pls give compounds as indices" if compound_indices.size==0 or !compound_indices[0].is_a?(Fixnum) + raise "Dataset.split : pls give features as feature objects (given: #{feats})" if feats!=nil and feats.size>0 and !feats[0].is_a?(OpenTox::Feature) + $logger.debug "split dataset using "+compound_indices.size.to_s+"/"+@compounds.size.to_s+" compounds" + + dataset = OpenTox::Dataset.new(nil, subjectid) + dataset.metadata = metadata + dataset.features = (feats ? feats : self.features) + compound_indices.each do |c_idx| + dataset << [ self.compounds[c_idx] ] + dataset.features.each_with_index.collect{|f,f_idx| self.data_entries[c_idx][f_idx]} + end + #compound_indices.each do |c_idx| + # c = @compounds[c_idx] + # dataset.add_compound(c) + # if @data_entries[c] + # features.each do |f| + # if @data_entries[c][f] + # dataset.add_data_entry c,f,@data_entries[c][f][entry_index(c_idx)] + # else + # dataset.add_data_entry c,f,nil + # end + # end + # end + # end + + dataset.put subjectid + dataset + end + + + # maps a compound-index from another dataset to a compound-index from this dataset + # mapping works as follows: + # (compound c is the compound identified by the compound-index of the other dataset) + # * c occurs only once in this dataset? map compound-index of other dataset to index in this dataset + # * c occurs >1 in this dataset? + # ** number of occurences is equal in both datasets? assume order is preserved(!) and map accordingly + # ** number of occurences is not equal in both datasets? cannot map, raise error + # @param [OpenTox::Dataset] dataset that should be mapped to this dataset (fully loaded) + # @param [Fixnum] compound_index, corresponding to dataset + def compound_index( dataset, compound_index ) + unless defined?(@index_map) and @index_map[dataset.uri] + map = {} + dataset.compounds.collect{|c| c.uri}.uniq.each do |compound| + self_indices = compound_indices(compound) + next unless self_indices + dataset_indices = dataset.compound_indices(compound) + if self_indices.size==1 + dataset_indices.size.times do |i| + map[dataset_indices[i]] = self_indices[0] + end + elsif self_indices.size==dataset_indices.size + # we do assume that the order is preseverd! + dataset_indices.size.times do |i| + map[dataset_indices[i]] = self_indices[i] + end + else + raise "cannot map compound #{compound} from dataset #{dataset.uri} to dataset #{uri}, "+ + "compound occurs #{dataset_indices.size} times and #{self_indices.size} times" + end + end + @index_map = {} unless defined?(@index_map) + @index_map[dataset.uri] = map + end + @index_map[dataset.uri][compound_index] + end + + def compound_indices( compound ) + unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound) + @cmp_indices = {} + @compounds.size.times do |i| + c = @compounds[i].uri + if @cmp_indices[c]==nil + @cmp_indices[c] = [i] + else + @cmp_indices[c] = @cmp_indices[c]+[i] + end + end + end + @cmp_indices[compound] + end + + def data_entry_value(compound_index, feature_uri) + build_feature_positions unless @feature_positions + @data_entries[compound_index][@feature_positions[feature_uri]] + end ### Index Structures @@ -30,6 +127,7 @@ module OpenTox # @return [Hash] A hash with keys 1...feature.training_classes.size and values training classes def value_map(feature) training_classes = feature.accept_values + raise "no accept values for feature #{feature.uri} in dataset #{uri}" unless training_classes training_classes.each_index.inject({}) { |h,idx| h[idx+1]=training_classes[idx]; h } end diff --git a/lib/utils/shims/feature.rb b/lib/utils/shims/feature.rb index f49bb39..9afa5c2 100644 --- a/lib/utils/shims/feature.rb +++ b/lib/utils/shims/feature.rb @@ -66,7 +66,7 @@ module OpenTox bad_request_error "rdf type of feature '#{@uri}' not set" unless self[RDF.type] if self[RDF.type].include?(OT.NominalFeature) "classification" - elsif [RDF.type].to_a.flatten.include?(OT.NumericFeature) + elsif self[RDF.type].include?(OT.NumericFeature) "regression" else "unknown" diff --git a/lib/utils/shims/model.rb b/lib/utils/shims/model.rb new file mode 100644 index 0000000..26a82c4 --- /dev/null +++ b/lib/utils/shims/model.rb @@ -0,0 +1,40 @@ + + +module OpenTox + + # Shims for the Task class + class Model + + def feature_type(subjectid=nil) + unless @feature_type + get unless metadata[OT.dependentVariables.to_s] + raise "cannot determine feature type, dependent variable missing" unless metadata[OT.dependentVariables.to_s] + @feature_type = OpenTox::Feature.find( metadata[OT.dependentVariables.to_s][0], subjectid ).feature_type + end + @feature_type + end + + def predicted_variable(subjectid=nil) + load_predicted_variables(subjectid) unless defined? @predicted_var + @predicted_var + end + + def predicted_confidence(subjectid=nil) + load_predicted_variables(subjectid) unless defined? @predicted_conf + @predicted_conf + end + + private + def load_predicted_variables(subjectid=nil) + metadata[OT.predictedVariables.to_s].each do |f| + feat = OpenTox::Feature.find( f, subjectid ) + if feat.title =~ /confidence/ + @predicted_conf = f + else + @predicted_var = f unless @predicted_var + end + end + end + + end +end \ No newline at end of file diff --git a/lib/utils/shims/task.rb b/lib/utils/shims/task.rb index cb73e72..7ac8a7d 100644 --- a/lib/utils/shims/task.rb +++ b/lib/utils/shims/task.rb @@ -11,12 +11,52 @@ module OpenTox # Shims for the Task class class Task + def self.run(description, creator, subjectid=nil) + create($task[:uri],subjectid,{ RDF::DC.description => description, RDF::DC.creator => creator},&Proc.new) + end + # Check status of a task # @return [String] Status def status self[RDF::OT.hasStatus] end + + def code + RestClientWrapper.head(@uri).code + end end end + + +module OpenTox + + class SubTask + + def initialize(task, min, max) + #TODO add subtask code + end + + def self.create(task, min, max) + if task + SubTask.new(task, min, max) + else + nil + end + end + + def waiting_for(task_uri) + #TODO add subtask code + end + + def progress(pct) + #TODO add subtask code + end + + def running?() + #TODO add subtask code + end + end + +end \ No newline at end of file diff --git a/lib/validation.rb b/lib/validation.rb new file mode 100644 index 0000000..47f74d7 --- /dev/null +++ b/lib/validation.rb @@ -0,0 +1,356 @@ +require "yaml" + +module OldOpenTox + attr_accessor :metadata, :uri + + def initialize(uri=nil) + @metadata = {} + self.uri = uri if uri + end + + # loads metadata via yaml + def load_metadata( subjectid=nil ) + yaml = OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid, :accept => "application/x-yaml"}) + #puts uri + #puts yaml + @metadata = YAML.load(yaml) + end +end + +module OpenTox + + class Validation + include OldOpenTox + + # find validation, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::Validation] + def self.find( uri, subjectid=nil ) + val = Validation.new(uri) + val.load_metadata( subjectid ) + val + end + + # returns a filtered list of validation uris + # @param [Hash,optional] params, validation-params to filter the uris (could be model, training_dataset, ..) + # @return [Array] + def self.list( params={} ) + filter_string = "" + params.each do |k,v| + filter_string += (filter_string.length==0 ? "?" : "&") + v = v.to_s.gsub(/;/, "%3b") if v.to_s =~ /;/ + filter_string += k.to_s+"="+v.to_s + end + (OpenTox::RestClientWrapper.get($validation[:uri]+filter_string).split("\n")) + end + + # creates a training test split validation, waits until it finishes, may take some time + # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,split_ratio(0.67),random_seed(1)) + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::Validation] + def self.create_training_test_split( params, subjectid=nil, waiting_task=nil ) + params[:subjectid] = subjectid if subjectid + uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"training_test_split"), + params,{:content_type => "text/uri-list"},waiting_task ) + Validation.new(OpenTox.wait_for_task(uri)) + end + + # creates a training test validation, waits until it finishes, may take some time + # @param [Hash] params (required:algorithm_uri,training_dataset_uri,prediction_feature,test_dataset_uri,optional:algorithm_params) + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::Validation] + def self.create_training_test_validation( params, subjectid=nil, waiting_task=nil ) + params[:subjectid] = subjectid if subjectid + uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"training_test_validation"), + params,{:content_type => "text/uri-list"},waiting_task ) + Validation.new(OpenTox.wait_for_task(uri)) + end + + # creates a bootstrapping validation, waits until it finishes, may take some time + # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,random_seed(1)) + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::Validation] + def self.create_bootstrapping_validation( params, subjectid=nil, waiting_task=nil ) + params[:subjectid] = subjectid if subjectid + uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"bootstrapping"), + params,{:content_type => "text/uri-list"},waiting_task ) + Validation.new(OpenTox.wait_for_task(uri)) + end + + # looks for report for this validation, creates a report if no report is found + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [String] report uri + def find_or_create_report( subjectid=nil, waiting_task=nil ) + @report = ValidationReport.find_for_validation(@uri, subjectid) unless @report + @report = ValidationReport.create(@uri, {}, subjectid, waiting_task) unless @report + @report.uri + end + + # creates a validation object from crossvaldiation statistics, raise error if not found + # (as crossvaldiation statistics are returned as an average valdidation over all folds) + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @return [OpenTox::Validation] + def self.from_cv_statistics( crossvalidation_uri, subjectid=nil ) + find( File.join(crossvalidation_uri, 'statistics'),subjectid ) + end + + # returns confusion matrix as array, predicted values are in rows + # example: + # [[nil,"active","moderate","inactive"],["active",1,3,99],["moderate",4,2,8],["inactive",3,8,6]] + # -> 99 inactive compounds have been predicted as active + def confusion_matrix + raise "no classification statistics, probably a regression valdiation" unless @metadata[OT.classificationStatistics] + matrix = @metadata[OT.classificationStatistics][OT.confusionMatrix][OT.confusionMatrixCell] + values = matrix.collect{|cell| cell[OT.confusionMatrixPredicted]}.uniq + table = [[nil]+values] + values.each do |c| + table << [c] + values.each do |r| + matrix.each do |cell| + if cell[OT.confusionMatrixPredicted]==c and cell[OT.confusionMatrixActual]==r + table[-1] << cell[OT.confusionMatrixValue].to_f + break + end + end + end + end + table + end + + # returns probability-distribution for a given prediction + # it takes all predictions into account that have a confidence value that is >= confidence and that have the same predicted value + # (minimum 12 predictions with the hightest confidence are selected (even if the confidence is lower than the given param) + # + # @param [Float] confidence value (between 0 and 1) + # @param [String] predicted value + # @param [String,optional] subjectid + # @return [Hash] see example + # + # Example 1: + # validation.probabilities(0.3,"active") + # -> {:min_confidence=>0.32, :num_predictions=>20, :probs=>{"active"=>0.7, "moderate"=>0.25 "inactive"=>0.05}} + # there have been 20 "active" predictions with confidence >= 0.3, 70 percent of them beeing correct + # + # Example 2: + # validation.probabilities(0.8,"active") + # -> {:min_confidence=>0.45, :num_predictions=>12, :probs=>{"active"=>0.9, "moderate"=>0.1 "inactive"=>0}} + # the given confidence value was to high (i.e. <12 predictions with confidence value >= 0.8) + # the top 12 "active" predictions have a min_confidence of 0.45, 90 percent of them beeing correct + # + def probabilities( confidence, prediction, subjectid=nil ) + YAML.load(OpenTox::RestClientWrapper.get(@uri+"/probabilities?prediction="+prediction.to_s+"&confidence="+confidence.to_s,nil, + {:subjectid => subjectid, :accept => "application/x-yaml"})) + end + end + + class Crossvalidation + include OldOpenTox + + attr_reader :report + + # find crossvalidation, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::Crossvalidation] + def self.find( uri, subjectid=nil ) + cv = Crossvalidation.new(uri) + cv.load_metadata( subjectid ) + cv + end + + # returns a filtered list of crossvalidation uris + # @param [Hash,optional] params, crossvalidation-params to filter the uris (could be algorithm, dataset, ..) + # @return [Array] + def self.list( params={} ) + filter_string = "" + params.each do |k,v| + filter_string += (filter_string.length==0 ? "?" : "&") + v = v.to_s.gsub(/;/, "%3b") if v.to_s =~ /;/ + filter_string += k.to_s+"="+v.to_s + end + (OpenTox::RestClientWrapper.get(File.join($validation[:uri],"crossvalidation")+filter_string).split("\n")) + end + + # creates a crossvalidations, waits until it finishes, may take some time + # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,num_folds(10),random_seed(1),stratified(false)) + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::Crossvalidation] + def self.create( params, subjectid=nil, waiting_task=nil ) + params[:subjectid] = subjectid if subjectid + uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"crossvalidation"), + params,{:content_type => "text/uri-list"},waiting_task ) + Crossvalidation.new(OpenTox.wait_for_task(uri)) + end + + # looks for report for this crossvalidation, creates a report if no report is found + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [String] report uri + def find_or_create_report( subjectid=nil, waiting_task=nil ) + @report = CrossvalidationReport.find_for_crossvalidation(@uri, subjectid) unless @report + @report = CrossvalidationReport.create(@uri, subjectid, waiting_task) unless @report + @report.uri + end + + # loads metadata via yaml from crossvalidation object + # fields (like for example the validations) can be acces via validation.metadata[OT.validation] + def load_metadata( subjectid=nil ) + @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid, :accept => "application/x-yaml"})) + end + + # returns a Validation object containing the statistics of the crossavlidation + def statistics( subjectid=nil ) + Validation.from_cv_statistics( @uri, subjectid ) + end + + # documentation see OpenTox::Validation.probabilities + def probabilities( confidence, prediction, subjectid=nil ) + YAML.load(OpenTox::RestClientWrapper.get(@uri+"/statistics/probabilities?prediction="+prediction.to_s+"&confidence="+confidence.to_s,nil, + {:subjectid => subjectid, :accept => "application/x-yaml"})) + end + + end + + class ValidationReport + include OldOpenTox + + # finds ValidationReport via uri, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::ValidationReport] + def self.find( uri, subjectid=nil ) + OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid}) + rep = ValidationReport.new(uri) + rep.load_metadata( subjectid ) + rep + end + + # finds ValidationReport for a particular validation + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @return [OpenTox::ValidationReport] nil if no report found + def self.find_for_validation( validation_uri, subjectid=nil ) + uris = RestClientWrapper.get(File.join($validation[:uri], + "/report/validation?validation="+validation_uri),nil,{:subjectid => subjectid}).chomp.split("\n") + uris.size==0 ? nil : ValidationReport.new(uris[-1]) + end + + # creates a validation report via validation + # @param [String] validation uri + # @param [Hash] params addiditonal possible + # (min_confidence, params={}, min_num_predictions, max_num_predictions) + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::ValidationReport] + def self.create( validation_uri, params={}, subjectid=nil, waiting_task=nil ) + params = {} if params==nil + raise OpenTox::BadRequestError.new "params is no hash" unless params.is_a?(Hash) + params[:validation_uris] = validation_uri + params[:subjectid] = subjectid + uri = RestClientWrapper.post(File.join($validation[:uri],"/report/validation"), + params, {}, waiting_task ) + ValidationReport.new(OpenTox.wait_for_task(uri)) + end + + end + + class CrossvalidationReport + include OldOpenTox + + # finds CrossvalidationReport via uri, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::CrossvalidationReport] + def self.find( uri, subjectid=nil ) + OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid}) + rep = CrossvalidationReport.new(uri) + rep.load_metadata( subjectid ) + rep + end + + # finds CrossvalidationReport for a particular crossvalidation + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @return [OpenTox::CrossvalidationReport] nil if no report found + def self.find_for_crossvalidation( crossvalidation_uri, subjectid=nil ) + uris = RestClientWrapper.get(File.join($validation[:uri], + "/report/crossvalidation?crossvalidation="+crossvalidation_uri),nil,{:subjectid => subjectid}).chomp.split("\n") + uris.size==0 ? nil : CrossvalidationReport.new(uris[-1]) + end + + # creates a crossvalidation report via crossvalidation + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::CrossvalidationReport] + def self.create( crossvalidation_uri, subjectid=nil, waiting_task=nil ) + uri = RestClientWrapper.post(File.join($validation[:uri],"/report/crossvalidation"), + { :validation_uris => crossvalidation_uri, :subjectid => subjectid }, {}, waiting_task ) + CrossvalidationReport.new(OpenTox.wait_for_task(uri)) + end + end + + + class AlgorithmComparisonReport + include OldOpenTox + + # finds AlgorithmComparisonReport via uri, raises error if not found + # @param [String] uri + # @param [String,optional] subjectid + # @return [OpenTox::CrossvalidationReport] + def self.find( uri, subjectid=nil ) + OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid}) + rep = AlgorithmComparisonReport.new(uri) + rep.load_metadata( subjectid ) + rep + end + + # finds AlgorithmComparisonReport for a particular crossvalidation + # @param [String] crossvalidation uri + # @param [String,optional] subjectid + # @return [OpenTox::AlgorithmComparisonReport] nil if no report found + def self.find_for_crossvalidation( crossvalidation_uri, subjectid=nil ) + uris = RestClientWrapper.get(File.join($validation[:uri], + "/report/algorithm_comparison?crossvalidation="+crossvalidation_uri),nil,{:subjectid => subjectid}).chomp.split("\n") + uris.size==0 ? nil : AlgorithmComparisonReport.new(uris[-1]) + end + + # creates a algorithm comparison report via crossvalidation uris + # @param [Hash] crossvalidation uri_hash, see example + # @param [Hash] params addiditonal possible + # (ttest_significance, ttest_attributes, min_confidence, min_num_predictions, max_num_predictions) + # @param [String,optional] subjectid + # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @return [OpenTox::AlgorithmComparisonReport] + # example for hash: + # { :lazar-bbrc => [ http://host/validation/crossvalidation/x1, http://host/validation/crossvalidation/x2 ], + # :lazar-last => [ http://host/validation/crossvalidation/xy, http://host/validation/crossvalidation/xy ] } + def self.create( crossvalidation_uri_hash, params={}, subjectid=nil, waiting_task=nil ) + identifier = [] + validation_uris = [] + crossvalidation_uri_hash.each do |id, uris| + uris.each do |uri| + identifier << id + validation_uris << uri + end + end + params = {} if params==nil + raise OpenTox::BadRequestError.new "params is no hash" unless params.is_a?(Hash) + params[:validation_uris] = validation_uris.join(",") + params[:identifier] = identifier.join(",") + params[:subjectid] = subjectid + uri = RestClientWrapper.post(File.join($validation[:uri],"/report/algorithm_comparison"), + params, {}, waiting_task ) + AlgorithmComparisonReport.new(OpenTox.wait_for_task(uri)) + end + end + +end + -- cgit v1.2.3 From 01856c1edf64ca1f33e2c3c99e539f48d3d19dda Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 4 Feb 2013 17:39:56 +0100 Subject: add pending fix to log non-runtime-errors --- lib/task.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/task.rb b/lib/task.rb index 23e6e9e..315dc18 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -18,7 +18,16 @@ module OpenTox begin result_uri = yield task.completed result_uri - rescue + rescue + unless $!.is_a?(RuntimeError) # PENDING: only runtime Errors are logged when raised + cut_index = $!.backtrace.find_index{|line| line.match /gems\/sinatra/} + msg = "\nTask ERROR\n"+ + "task description: #{params[RDF::DC.description]}\n"+ + "task uri: #{$!.class.to_s}\n"+ + "error msg: #{$!.message}\n"+ + "error backtrace:\n#{$!.backtrace[0..cut_index].join("\n")}\n" + $logger.error msg + end if $!.respond_to? :to_ntriples RestClientWrapper.put(File.join(task.uri,'Error'),:errorReport => $!.to_ntriples,:content_type => 'text/plain') else -- cgit v1.2.3 From cadc92f526a04dd270134bade08d053f4b099923 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 4 Feb 2013 18:24:24 +0100 Subject: add delete method for validations --- lib/validation.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/validation.rb b/lib/validation.rb index 47f74d7..5c91f7c 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -15,6 +15,10 @@ module OldOpenTox #puts yaml @metadata = YAML.load(yaml) end + + def delete (subjectid=nil) + OpenTox::RestClientWrapper.delete(@uri.to_s,nil,{:subjectid => subjectid}) + end end module OpenTox -- cgit v1.2.3 From f1a6d9f9d5bc73d757e0864d998c95f10ebeecbb Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 7 Feb 2013 11:55:53 +0100 Subject: add regex filter for URL authentification --- lib/authorization.rb | 2 +- lib/rest-client-wrapper.rb | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 1fe5c51..8eefc63 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -12,7 +12,7 @@ module OpenTox #Helper Class to create and send default policies out of xml templates #@example Creating a default policy to a URI - # aa=OpenTox::Authorization::AA.new(tok) + # aa=OpenTox::Authorization::Helper.new(tok) # xml=aa.get_xml('http://uri....') # OpenTox::Authorization.create_policy(xml,tok) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 1258339..79a65d9 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -45,7 +45,8 @@ module OpenTox elsif response.code >= 400 and !URI.task?(uri) message = response.to_s parameters = request.args - parameters[:headers][:subjectid] = "REMOVED" if parameters[:headers] and parameters[:headers][:subjectid] + parameters[:headers][:subjectid] = "REMOVED" if parameters[:headers] and parameters[:headers][:subjectid] + parameters[:url] = parameters[:url].gsub(/(http|https|)\:\/\/[a-zA-Z0-9\-]+\:[a-zA-Z0-9]+\@/, "REMOVED@") if parameters[:url] message += "\nREST parameters:\n#{parameters.inspect}" error = known_errors.collect{|e| e if e[:code] == response.code}.compact.first Object.method(error[:method]).call message, uri # call error method -- cgit v1.2.3 From 8fd10bbf42654d5b367713258b26acdeb47d7c4c Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 8 Feb 2013 17:27:39 +0000 Subject: implemented json support for user uri list --- lib/4store.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/4store.rb b/lib/4store.rb index c9947a7..c7c4eb3 100644 --- a/lib/4store.rb +++ b/lib/4store.rb @@ -55,10 +55,12 @@ module OpenTox def self.query sparql, mime_type if sparql =~ /SELECT/i -# return list unless mime_type + # return list unless mime_type case mime_type when 'application/sparql-results+xml' RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => mime_type).body + when 'application/json' + RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => mime_type).body when /(uri-list|html)/ uri_list = RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/plain").body.gsub(/"|<|>/,'').split("\n").drop(1).join("\n") uri_list = OpenTox.text_to_html(uri_list) if mime_type=~/html/ -- cgit v1.2.3 From faa7d4a127debbf1a7f31947eccb3a25d5f82240 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 11 Feb 2013 14:03:06 +0100 Subject: csv required for dataset --- Gemfile.lock | 33 --------------------------------- lib/dataset.rb | 2 ++ 2 files changed, 2 insertions(+), 33 deletions(-) delete mode 100644 Gemfile.lock diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index f778e78..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,33 +0,0 @@ -PATH - remote: . - specs: - opentox-client (1.0.0pre1) - bundler - open4 - rdf - rdf-n3 - rdf-raptor - rest-client - -GEM - remote: http://rubygems.org/ - specs: - addressable (2.3.2) - ffi (1.3.1) - mime-types (1.19) - open4 (1.3.0) - rdf (0.3.11.1) - addressable (>= 2.2.6) - rdf-n3 (0.3.8) - rdf (>= 0.3.11) - rdf-raptor (0.4.2) - ffi (>= 1.0) - rdf (~> 0.3.8) - rest-client (1.6.7) - mime-types (>= 1.16) - -PLATFORMS - ruby - -DEPENDENCIES - opentox-client! diff --git a/lib/dataset.rb b/lib/dataset.rb index 4ce5fc4..55d5fa8 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -1,3 +1,5 @@ +require 'csv' + module OpenTox # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). -- cgit v1.2.3 From 83f4b12aaacfd27e7019517ac7089ddd912ba259 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 12 Feb 2013 22:49:12 +0100 Subject: error methods within wait_for_task fixed --- lib/opentox.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 050e078..d1e09f6 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -104,7 +104,6 @@ module OpenTox # Save object at webservice def put wait=true # TODO: RDFXML - #append RDF::DC.modified, DateTime.now uri = RestClientWrapper.put @uri.to_s, self.to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} wait_for_task uri if wait end @@ -123,8 +122,8 @@ module OpenTox t = OpenTox::Task.new uri t.wait unless t.completed? - #TODO raise correct error - #internal_server_error "Task #{uri} failed with #{$!.inspect}" + method = RestClientWrapper.known_errors.select{|error| error[:code] == t.hasStatus.to_i}.first[:method] + Object.send(method,t.message,t.uri) end uri = t.resultURI end -- cgit v1.2.3 From dee8892491dcda0bfa68c413ee0fbbc0ddd33f12 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 15 Feb 2013 12:23:52 +0100 Subject: error messages in tasks fixed --- lib/error.rb | 2 +- lib/opentox.rb | 5 +++-- lib/task.rb | 13 ++++++++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index e58ed5d..3dd2950 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -31,7 +31,7 @@ class RuntimeError # rdf serialization methods for all formats e.g. to_rdfxml send :define_method, "to_#{format}".to_sym do RDF::Writer.for(format).buffer do |writer| - @rdf.each{|statement| writer << statement} + @rdf.each{|statement| writer << statement} if @rdf end end end diff --git a/lib/opentox.rb b/lib/opentox.rb index d1e09f6..221a8dd 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -122,8 +122,9 @@ module OpenTox t = OpenTox::Task.new uri t.wait unless t.completed? - method = RestClientWrapper.known_errors.select{|error| error[:code] == t.hasStatus.to_i}.first[:method] - Object.send(method,t.message,t.uri) + method = RestClientWrapper.known_errors.select{|error| error[:code] == t.code}.first[:method] + t.get + Object.send(method,t.error_report[RDF::OT.message],t.uri) end uri = t.resultURI end diff --git a/lib/task.rb b/lib/task.rb index 315dc18..3d427bc 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -92,27 +92,30 @@ module OpenTox while running? sleep dur dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min - time_out_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) + request_timeout_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) end end end + def code + RestClientWrapper.head(@uri).code.to_i + end + # get only header for status requests def running? - RestClientWrapper.head(@uri).code == 202 + code == 202 end def cancelled? - RestClientWrapper.head(@uri).code == 503 + code == 503 end def completed? - RestClientWrapper.head(@uri).code == 200 + code == 200 end def error? - code = RestClientWrapper.head(@uri).code code >= 400 and code != 503 end -- cgit v1.2.3 From 97d39cf958ecb9d7b35073a9a56945552073b678 Mon Sep 17 00:00:00 2001 From: gebele Date: Mon, 18 Feb 2013 10:09:16 +0000 Subject: changed content-type to application/x-turtle for large imports --- lib/4store.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/4store.rb b/lib/4store.rb index e6eb914..338573d 100644 --- a/lib/4store.rb +++ b/lib/4store.rb @@ -3,7 +3,7 @@ module OpenTox class FourStore @@accept_formats = [ "application/rdf+xml", "text/turtle", "text/plain", "text/uri-list", "text/html", 'application/sparql-results+xml' ] - @@content_type_formats = [ "application/rdf+xml", "text/turtle", "text/plain" ] + @@content_type_formats = [ "application/rdf+xml", "text/turtle", "text/plain", "application/x-turtle" ] def self.list mime_type bad_request_error "'#{mime_type}' is not a supported mime type. Please specify one of #{@@accept_formats.join(", ")} in the Accept Header." unless @@accept_formats.include? mime_type -- cgit v1.2.3 From 7169fcdea7271ac87a9a67783b0b08a092106d34 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 21 Feb 2013 16:18:31 +0100 Subject: OpenTox error handling for NoMethodError --- lib/error.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/error.rb b/lib/error.rb index 3dd2950..51168f4 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,7 +1,7 @@ require 'open4' # add additional fields to Exception class to format errors according to OT-API -class RuntimeError +module OpenToxError attr_accessor :http_code, :uri def initialize message, uri=nil super message @@ -46,6 +46,14 @@ class RuntimeError end +class RuntimeError + include OpenToxError +end + +class NoMethodError + include OpenToxError +end + module OpenTox class Error < RuntimeError -- cgit v1.2.3 From 6d1520b5662b8371a674bbd24b392fd794aa26be Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 21 Feb 2013 18:21:18 +0100 Subject: OpenTox error handling removed from NoMethodError --- lib/error.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 51168f4..4fed343 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -50,9 +50,10 @@ class RuntimeError include OpenToxError end -class NoMethodError - include OpenToxError -end +# clutters log file with library errors +#class NoMethodError + #include OpenToxError +#end module OpenTox -- cgit v1.2.3 From 4ba2cc9849473f97baf75195bb36c5057f1c58d4 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 22 Feb 2013 10:39:56 +0100 Subject: fix pending log messages for non-runtime errors --- lib/task.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/task.rb b/lib/task.rb index 3d427bc..82e1665 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -21,6 +21,7 @@ module OpenTox rescue unless $!.is_a?(RuntimeError) # PENDING: only runtime Errors are logged when raised cut_index = $!.backtrace.find_index{|line| line.match /gems\/sinatra/} + cut_index = -1 unless cut_index msg = "\nTask ERROR\n"+ "task description: #{params[RDF::DC.description]}\n"+ "task uri: #{$!.class.to_s}\n"+ -- cgit v1.2.3 From a54db46684680d98311631804eca367cc949a715 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 26 Mar 2013 10:56:04 +0100 Subject: code cleanup and refactoring. --- lib/4store.rb | 126 -------------- lib/algorithm.rb | 6 +- lib/compound.rb | 12 +- lib/dataset.rb | 390 ++++++++++++++++++++++++++++++++------------ lib/error.rb | 30 ++-- lib/feature.rb | 37 +++++ lib/model.rb | 31 ++++ lib/opentox-client.rb | 9 +- lib/opentox.rb | 225 +++++++++++++++---------- lib/overwrite.rb | 68 +++++++- lib/rest-client-wrapper.rb | 2 - lib/task.rb | 90 +++++++--- lib/utils/diag.rb | 11 -- lib/utils/html.rb | 52 ------ lib/utils/rdf/dataset.rb | 73 --------- lib/utils/shims/dataset.rb | 201 ----------------------- lib/utils/shims/feature.rb | 87 ---------- lib/utils/shims/model.rb | 40 ----- lib/utils/shims/opentox.rb | 51 ------ lib/utils/shims/task.rb | 62 ------- lib/utils/sparql/dataset.rb | 75 --------- 21 files changed, 653 insertions(+), 1025 deletions(-) delete mode 100644 lib/4store.rb create mode 100644 lib/feature.rb delete mode 100644 lib/utils/diag.rb delete mode 100644 lib/utils/html.rb delete mode 100644 lib/utils/rdf/dataset.rb delete mode 100644 lib/utils/shims/dataset.rb delete mode 100644 lib/utils/shims/feature.rb delete mode 100644 lib/utils/shims/model.rb delete mode 100644 lib/utils/shims/opentox.rb delete mode 100644 lib/utils/shims/task.rb delete mode 100644 lib/utils/sparql/dataset.rb diff --git a/lib/4store.rb b/lib/4store.rb deleted file mode 100644 index 338573d..0000000 --- a/lib/4store.rb +++ /dev/null @@ -1,126 +0,0 @@ -module OpenTox - module Backend - class FourStore - - @@accept_formats = [ "application/rdf+xml", "text/turtle", "text/plain", "text/uri-list", "text/html", 'application/sparql-results+xml' ] - @@content_type_formats = [ "application/rdf+xml", "text/turtle", "text/plain", "application/x-turtle" ] - - def self.list mime_type - bad_request_error "'#{mime_type}' is not a supported mime type. Please specify one of #{@@accept_formats.join(", ")} in the Accept Header." unless @@accept_formats.include? mime_type - if mime_type =~ /(uri-list|html)/ - sparql = "SELECT DISTINCT ?g WHERE {GRAPH ?g {?s <#{RDF.type}> <#{klass}>; <#{RDF::DC.modified}> ?o.} } ORDER BY ?o" - else - sparql = "CONSTRUCT {?s ?p ?o.} WHERE {?s <#{RDF.type}> <#{klass}>; ?p ?o. }" - end - query sparql, mime_type - end - - def self.get uri, mime_type - bad_request_error "'#{mime_type}' is not a supported mime type. Please specify one of #{@@accept_formats.join(", ")} in the Accept Header." unless @@accept_formats.include? mime_type - sparql = "CONSTRUCT {?s ?p ?o.} FROM <#{uri}> WHERE { ?s ?p ?o. }" - rdf = query sparql, mime_type - resource_not_found_error "#{uri} not found." if rdf.empty? - rdf - end - - def self.post uri, rdf, mime_type - bad_request_error "'#{mime_type}' is not a supported content type. Please use one of #{@@content_type_formats.join(", ")}." unless @@content_type_formats.include? mime_type or mime_type == "multipart/form-data" - bad_request_error "Reqest body empty." unless rdf - mime_type = "application/x-turtle" if mime_type == "text/plain" # ntriples is turtle in 4store - begin - RestClient.post File.join(four_store_uri,"data")+"/", :data => rdf, :graph => uri, "mime-type" => mime_type - update "INSERT DATA { GRAPH <#{uri}> { <#{uri}> <#{RDF::DC.modified}> \"#{DateTime.now}\" } }" - rescue - bad_request_error $!.message, File.join(four_store_uri,"data")+"/" - end - end - - def self.put uri, rdf, mime_type - bad_request_error "'#{mime_type}' is not a supported content type. Please use one of #{@@content_type_formats.join(", ")}." unless @@content_type_formats.include? mime_type - bad_request_error "Reqest body empty." unless rdf - mime_type = "application/x-turtle" if mime_type == "text/plain" - begin - RestClientWrapper.put File.join(four_store_uri,"data",uri), rdf, :content_type => mime_type - update "INSERT DATA { GRAPH <#{uri}> { <#{uri}> <#{RDF::DC.modified}> \"#{DateTime.now}\" } }" - rescue - bad_request_error $!.message, File.join(four_store_uri,"data",uri) - end - end - - def self.delete uri - RestClientWrapper.delete data_uri(uri) - end - - def self.update sparql - RestClient.post(update_uri, :update => sparql ) - end - - def self.query sparql, mime_type - if sparql =~ /SELECT/i - # return list unless mime_type - case mime_type - when 'application/sparql-results+xml' - RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => mime_type).body - when 'application/json' - RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => mime_type).body - when /(uri-list|html)/ - uri_list = RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/plain").body.gsub(/"|<|>/,'').split("\n").drop(1).join("\n") - uri_list = OpenTox.text_to_html(uri_list) if mime_type=~/html/ - return uri_list - else - bad_request_error "#{mime_type} is not a supported mime type for SELECT statements." - end - elsif sparql =~ /CONSTRUCT/i - case mime_type - when "text/plain", "application/rdf+xml" - RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => mime_type).body - when /html|turtle/ - # TODO: fix and improve - nt = RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/plain").body # 4store returns ntriples for turtle - - rdf = RDF::Graph.new - RDF::Reader.for(:ntriples).new(nt) do |reader| - reader.each_statement { |statement| rdf << statement } - end - prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"} - ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } - # TODO: fails for large datasets?? multi_cell_call - turtle = RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| - rdf.each{|statement| writer << statement} - end - regex = Regexp.new '(https?:\/\/[\S]+)([>"])' - turtle = "" + turtle.gsub( regex, '\1\2' ).gsub(/\n/,'
') + "" if mime_type =~ /html/ and !turtle.empty? - turtle - end - else - # TODO: check if this prevents SPARQL injections - bad_request_error "Only SELECT and CONSTRUCT are accepted SPARQL statements." - end - rescue - bad_request_error $!.message, sparql_uri - end - - def self.klass - RDF::OT[SERVICE.capitalize] - end - - def self.four_store_uri - # credentials are removed from uri in error.rb - $four_store[:uri].sub(%r{//},"//#{$four_store[:user]}:#{$four_store[:password]}@") - end - - def self.sparql_uri - File.join(four_store_uri, "sparql") + '/' - end - - def self.update_uri - File.join(four_store_uri, "update") + '/' - end - - def self.data_uri uri - File.join(four_store_uri, "data","?graph=#{uri}") - end - - end - end -end diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 0c633f2..455e9ad 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -7,9 +7,9 @@ module OpenTox # @param [optional,Hash] params Algorithm parameters # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [String] URI of new resource (dataset, model, ...) - def run params=nil - post params + def run params=nil, wait=true + uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => @subjectid} + wait_for_task uri if wait end - end end diff --git a/lib/compound.rb b/lib/compound.rb index a0d6ec7..5d77dec 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -10,23 +10,21 @@ module OpenTox # compound = OpenTox::Compound.from_smiles("c1ccccc1") # @param [String] smiles Smiles string # @return [OpenTox::Compound] Compound - def self.from_smiles service_uri, smiles, subjectid=nil - #@smiles = smiles + def self.from_smiles smiles, subjectid=nil Compound.new RestClientWrapper.post(service_uri, smiles, {:content_type => 'chemical/x-daylight-smiles', :subjectid => subjectid}) end # Create a compound from inchi string # @param [String] smiles InChI string # @return [OpenTox::Compound] Compound - def self.from_inchi service_uri, inchi, subjectid=nil - #@inchi = inchi + def self.from_inchi inchi, subjectid=nil Compound.new RestClientWrapper.post(service_uri, inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) end # Create a compound from sdf string # @param [String] smiles SDF string # @return [OpenTox::Compound] Compound - def self.from_sdf service_uri, sdf, subjectid=nil + def self.from_sdf sdf, subjectid=nil Compound.new RestClientWrapper.post(service_uri, sdf, {:content_type => 'chemical/x-mdl-sdfile', :subjectid => subjectid}) end @@ -36,7 +34,7 @@ module OpenTox # @param [String] name name can be also an InChI/InChiKey, CAS number, etc # @return [OpenTox::Compound] Compound # - def self.from_name service_uri, name, subjectid=nil + def self.from_name name, subjectid=nil @inchi = RestClientWrapper.get File.join(CACTUS_URI,URI.escape(name),"stdinchi") Compound.new RestClientWrapper.post(service_uri, @inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) end @@ -216,7 +214,7 @@ module OpenTox end end end - return smarts_hits + smarts_hits end # Provided for backward compatibility diff --git a/lib/dataset.rb b/lib/dataset.rb index 55d5fa8..8d1aed0 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -5,160 +5,344 @@ module OpenTox # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). class Dataset - attr_accessor :features, :compounds, :data_entries + attr_writer :features, :compounds, :data_entries def initialize uri=nil, subjectid=nil super uri, subjectid @features = [] @compounds = [] @data_entries = [] - append RDF.type, RDF::OT.OrderedDataset end - def upload filename, wait=true - uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}, {:subjectid => @subjectid}) - OpenTox::Task.new(uri).wait if URI.task?(uri) and wait - end + # Get data (lazy loading from dataset service) - def to_csv - CSV.generate do |csv| - csv << ["SMILES"] + @features.collect{|f| f.title} - @compounds.each_with_index do |c,i| - csv << [c.smiles] + @data_entries[i] + def metadata force_update=false + if @metadata.empty? or force_update + uri = File.join(@uri,"metadata") + begin + parse_ntriples RestClientWrapper.get(uri,{},{:accept => "text/plain", :subjectid => @subjectid}) + rescue # fall back to rdfxml + parse_rdfxml RestClientWrapper.get(uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid}) end + @metadata = @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } end + @metadata end - def get(force_no_backend_query=false) - have_rdf = (force_no_backend_query and @rdf.size>0) - ordered = (have_rdf or OpenTox::Dataset.ordered?(@uri)) - super() if (!have_rdf and !ordered) - @features = [] - @compounds = [] - @data_entries = [] - - # AM: read ordered dataset from RDF - if ordered + def features force_update=false + if @features.empty? or force_update + uri = File.join(@uri,"features") + uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n") # ordered datasets return ordered features + @features = uris.collect{|uri| Feature.new(uri,@subjectid)} + end + @features + end - # Read only some data as rdf - unless have_rdf - self.parse_rdfxml( RestClient.get([@uri,"allnde"].join("/"),{:accept => "application/rdf+xml"}), true ) + def compounds force_update=false + if @compounds.empty? or force_update + uri = File.join(@uri,"compounds") + uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n") # ordered datasets return ordered compounds + @compounds = uris.collect{|uri| Compound.new(uri,@subjectid)} + end + @compounds + end + + def data_entries force_update=false + if @data_entries.empty? or force_update + sparql = "SELECT ?cidx ?fidx ?value FROM <#{uri}> WHERE { + ?data_entry <#{RDF::OLO.index}> ?cidx ; + <#{RDF::OT.values}> ?v . + ?v <#{RDF::OT.feature}> ?f; + <#{RDF::OT.value}> ?value . + ?f <#{RDF::OLO.index}> ?fidx. + } ORDER BY ?fidx ?cidx" + RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n").each do |row| + r,c,v = row.split("\t") + @data_entries[r.to_i] ||= [] + @data_entries[r.to_i][c.to_i] = v + end + # TODO: fallbacks for external and unordered datasets + features.each_with_index do |feature,i| + if feature[RDF.type].include? RDF::OT.NumericFeature + @data_entries.each { |row| row[i] = row[i].to_f if row[i] } + end end + end + @data_entries + end - # Features - @features = self.find_features_rdf - numeric_features = @features.collect{|f| - f.get - f[RDF.type].include?(RDF::OT.NumericFeature) or f[RDF.type].include?(RDF::OT.Substructure) - } - - # Compounds - if have_rdf - @compounds = self.find_compounds_rdf - else - @compounds = RestClient.get([@uri,"compounds"].join("/"),{:accept => "text/uri-list"}).split("\n").collect { |cmpd| OpenTox::Compound.new cmpd } - end + # Find data entry values for a given compound and feature + # @param [OpenTox::Compound] Compound + # @param [OpenTox::Feature] Feature + # @return [Array] Data entry values + def values(compound, feature) + #puts compounds.inspect + #puts "==" + #puts compound.inspect + rows = (0 ... compounds.length).select { |r| compounds[r].uri == compound.uri } + #puts rows.inspect + col = features.collect{|f| f.uri}.index feature.uri + #puts col + #puts data_entries(true).inspect + rows.collect{|row| data_entries[row][col]} + end - # Data Entries - if have_rdf - table = self.find_data_entries_rdf - else - values = OpenTox::Dataset.find_data_entries_sparql(@uri) - table = values + Array.new(@compounds.size*@features.size-values.size, "") - end - - clim=(@compounds.size-1) - cidx = fidx = 0 - num=numeric_features[fidx] - @data_entries = (Array.new(@compounds.size*@features.size)).each_slice(@features.size).to_a # init to nil - table.each { |val| - unless val.blank? - @data_entries[cidx][fidx] = (num ? val.to_f : val) - end - if (cidx < clim) - cidx+=1 - else - cidx=0 - fidx+=1 - num=numeric_features[fidx] - end - } + # Convenience methods to search by compound/feature URIs - # AM: read unordered dataset from RDF - else - query = RDF::Query.new do - pattern [:uri, RDF.type, RDF::OT.Feature] - end - @features = query.execute(@rdf).collect{|s| OpenTox::Feature.new(s.uri.to_s)} - query = RDF::Query.new do - pattern [:data_entry, RDF::OT.compound, :compound] + # Search a dataset for a feature given its URI + # @param [String] Feature URI + # @return [OpenTox::Feature] Feature object, or nil if not present + def find_feature_uri(uri) + features.select{|f| f.uri == uri}.first + end + + # Search a dataset for a compound given its URI + # @param [String] Compound URI + # @return [OpenTox::Compound] Compound object, or nil if not present + def find_compound_uri(uri) + compounds.select{|f| f.uri == uri}.first + end + + def predictions + predictions = [] + prediction_feature = nil + confidence_feature = nil + metadata[RDF::OT.predictedVariables].each do |uri| + feature = OpenTox::Feature.new uri, @subjectid + case feature.title + when /prediction$/ + prediction_feature = feature + when /confidence$/ + confidence_feature = feature end - @compounds = query.execute(@rdf).sort_by{|s| s.data_entry}.collect{|s| OpenTox::Compound.new s.compound.to_s} - numeric_features = @features.collect{|f| f.get; f[RDF.type].include? RDF::OT.NumericFeature} - @compounds.each do |compound| - values = [] - @features.each_with_index do |feature,i| - query = RDF::Query.new do - pattern [:data_entry, RDF::OT.compound, RDF::URI.new(compound.uri)] - pattern [:data_entry, RDF::OT.values, :values] - pattern [:values, RDF::OT.feature, RDF::URI.new(feature.uri)] - pattern [:values, RDF::OT.value, :value] - end - value = query.execute(@rdf).first.value.to_s - value = value.to_f if numeric_features[i] and !value.nil? - values << value - end - @data_entries << values + end + if prediction_feature and confidence_feature + compounds.each do |compound| + value = values(compound,prediction_feature).first + confidence = values(compound,confidence_feature).first + predictions << {:compound => compound, :value => value, :confidence => confidence} if value and confidence end end + predictions + end + + # Adding data (@features and @compounds are also writable) + + def upload filename, wait=true + uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}, {:subjectid => @subjectid}) + wait_for_task uri if URI.task?(uri) and wait + metadata true + @uri end - def get_metadata - uri = File.join(@uri,"metadata") - begin - parse_ntriples RestClientWrapper.get(uri,{},{:accept => "text/plain", :subjectid => @subjectid}) - rescue # fall back to rdfxml - parse_rdfxml RestClientWrapper.get(uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid}) + def add_data_entry compound, feature, value + @compounds << compound unless @compounds.collect{|c| c.uri}.include?(compound.uri) + row = @compounds.collect{|c| c.uri}.index(compound.uri) + @features << feature unless @features.collect{|f| f.uri}.include?(feature.uri) + col = @features.collect{|f| f.uri}.index(feature.uri) + @data_entries[row] ||= [] + if @data_entries[row][col] # duplicated values + #row = @compounds.size + @compounds << compound + row = @compounds.collect{|c| c.uri}.rindex(compound.uri) end - metadata + @data_entries[row][col] = value end - def << data_entry - compound = data_entry.shift - bad_request_error "Dataset features are empty." unless features - bad_request_error "data_entry size '#{data_entry.size}' does not match features size '#{features.size}'." unless data_entry.size == features.size - bad_request_error "First data_entry is not a OpenTox::Compound" unless compound.class == OpenTox::Compound + # TODO: remove? might be dangerous if feature ordering is incorrect + def << row + compound = row.shift + bad_request_error "Dataset features are empty." unless @features + bad_request_error "Row size '#{row.size}' does not match features size '#{@features.size}'." unless row.size == @features.size + bad_request_error "First column is not a OpenTox::Compound" unless compound.class == OpenTox::Compound @compounds << compound - @data_entries << data_entry + @data_entries << row + end + + # Serialisation + + def to_csv + CSV.generate do |csv| + csv << ["SMILES"] + features.collect{|f| f.title} + compounds.each_with_index do |c,i| + csv << [c.smiles] + data_entries[i] + end + end end RDF_FORMATS.each do |format| + + # redefine rdf parse methods for all formats e.g. parse_rdfxml + send :define_method, "parse_#{format}".to_sym do |rdf| + # TODO: parse ordered dataset + # TODO: parse data entries + # TODO: parse metadata + @rdf = RDF::Graph.new + RDF::Reader.for(format).new(rdf) do |reader| + reader.each_statement{ |statement| @rdf << statement } + end + query = RDF::Query.new({ :uri => { RDF.type => RDF::OT.Compound } }) + @compounds = query.execute(@rdf).collect { |solution| OpenTox::Compound.new solution.uri } + query = RDF::Query.new({ :uri => { RDF.type => RDF::OT.Feature } }) + @features = query.execute(@rdf).collect { |solution| OpenTox::Feature.new solution.uri } + @compounds.each_with_index do |c,i| + @features.each_with_index do |f,j| + end + end + end + # redefine rdf serialization methods send :define_method, "to_#{format}".to_sym do - # TODO: check, might affect appending to unordered datasets - features.each_with_index do |feature,i| + @metadata[RDF.type] = RDF::OT.OrderedDataset + create_rdf + @features.each_with_index do |feature,i| @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Feature)] @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] end - compounds.each_with_index do |compound,i| + @compounds.each_with_index do |compound,i| @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Compound)] + if defined? @neighbors and neighbors.include? compound + @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Neighbor)] + end + @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] data_entry_node = RDF::Node.new @rdf << [RDF::URI.new(@uri), RDF::URI.new(RDF::OT.dataEntry), data_entry_node] @rdf << [data_entry_node, RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.DataEntry)] @rdf << [data_entry_node, RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] @rdf << [data_entry_node, RDF::URI.new(RDF::OT.compound), RDF::URI.new(compound.uri)] - data_entries[i].each_with_index do |value,j| + @data_entries[i].each_with_index do |value,j| value_node = RDF::Node.new @rdf << [data_entry_node, RDF::URI.new(RDF::OT.values), value_node] @rdf << [value_node, RDF::URI.new(RDF::OT.feature), RDF::URI.new(@features[j].uri)] @rdf << [value_node, RDF::URI.new(RDF::OT.value), RDF::Literal.new(value)] end end - super() + RDF::Writer.for(format).buffer do |writer| + @rdf.each{|statement| writer << statement} + end + end + + end + +=begin +# TODO: fix bug that affects data_entry positions + def to_ntriples # redefined string version for better performance + + ntriples = "" + @metadata[RDF.type] = [ RDF::OT.Dataset, RDF::OT.OrderedDataset ] + @metadata[RDF.type] ||= eval("RDF::OT."+self.class.to_s.split('::').last) + @metadata[RDF::DC.date] ||= DateTime.now + @metadata.each do |predicate,values| + [values].flatten.each { |value| ntriples << "<#{@uri}> <#{predicate}> '#{value}' .\n" } + end + @parameters.each do |parameter| + p_node = RDF::Node.new.to_s + ntriples << "<#{@uri}> <#{RDF::OT.parameters}> #{p_node} .\n" + ntriples << "#{p_node} <#{RDF.type}> <#{RDF::OT.Parameter}> .\n" + parameter.each { |k,v| ntriples << "#{p_node} <#{k}> '#{v}' .\n" } + end + @features.each_with_index do |feature,i| + ntriples << "<#{feature.uri}> <#{RDF.type}> <#{RDF::OT.Feature}> .\n" + ntriples << "<#{feature.uri}> <#{RDF::OLO.index}> '#{i}' .\n" + end + @compounds.each_with_index do |compound,i| + ntriples << "<#{compound.uri}> <#{RDF.type}> <#{RDF::OT.Compound}> .\n" + if defined? @neighbors and neighbors.include? compound + ntriples << "<#{compound.uri}> <#{RDF.type}> <#{RDF::OT.Neighbor}> .\n" + end + + ntriples << "<#{compound.uri}> <#{RDF::OLO.index}> '#{i}' .\n" + data_entry_node = RDF::Node.new + ntriples << "<#{@uri}> <#{RDF::OT.dataEntry}> #{data_entry_node} .\n" + ntriples << "#{data_entry_node} <#{RDF.type}> <#{RDF::OT.DataEntry}> .\n" + ntriples << "#{data_entry_node} <#{RDF::OLO.index}> '#{i}' .\n" + ntriples << "#{data_entry_node} <#{RDF::OT.compound}> <#{compound.uri}> .\n" + @data_entries[i].each_with_index do |value,j| + value_node = RDF::Node.new + ntriples << "#{data_entry_node} <#{RDF::OT.values}> #{value_node} .\n" + ntriples << "#{value_node} <#{RDF::OT.feature}> <#{@features[j].uri}> .\n" + ntriples << "#{value_node} <#{RDF::OT.value}> '#{value}' .\n" + end end + ntriples + + end +=end + + # Methods for for validation service + + def split( compound_indices, feats, metadata, subjectid=nil) + + bad_request_error "Dataset.split : Please give compounds as indices" if compound_indices.size==0 or !compound_indices[0].is_a?(Fixnum) + bad_request_error "Dataset.split : Please give features as feature objects (given: #{feats})" if feats!=nil and feats.size>0 and !feats[0].is_a?(OpenTox::Feature) + dataset = OpenTox::Dataset.new(nil, subjectid) + dataset.metadata = metadata + dataset.features = (feats ? feats : self.features) + compound_indices.each do |c_idx| + dataset << [ self.compounds[c_idx] ] + dataset.features.each_with_index.collect{|f,f_idx| self.data_entries[c_idx][f_idx]} + end + dataset.put + dataset + end + + # maps a compound-index from another dataset to a compound-index from this dataset + # mapping works as follows: + # (compound c is the compound identified by the compound-index of the other dataset) + # * c occurs only once in this dataset? map compound-index of other dataset to index in this dataset + # * c occurs >1 in this dataset? + # ** number of occurences is equal in both datasets? assume order is preserved(!) and map accordingly + # ** number of occurences is not equal in both datasets? cannot map, raise error + # @param [OpenTox::Dataset] dataset that should be mapped to this dataset (fully loaded) + # @param [Fixnum] compound_index, corresponding to dataset + def compound_index( dataset, compound_index ) + unless defined?(@index_map) and @index_map[dataset.uri] + map = {} + dataset.compounds.collect{|c| c.uri}.uniq.each do |compound| + self_indices = compound_indices(compound) + next unless self_indices + dataset_indices = dataset.compound_indices(compound) + if self_indices.size==1 + dataset_indices.size.times do |i| + map[dataset_indices[i]] = self_indices[0] + end + elsif self_indices.size==dataset_indices.size + # we do assume that the order is preseverd! + dataset_indices.size.times do |i| + map[dataset_indices[i]] = self_indices[i] + end + else + raise "cannot map compound #{compound} from dataset #{dataset.uri} to dataset #{uri}, "+ + "compound occurs #{dataset_indices.size} times and #{self_indices.size} times" + end + end + @index_map = {} unless defined?(@index_map) + @index_map[dataset.uri] = map + end + @index_map[dataset.uri][compound_index] + end + + def compound_indices( compound ) + unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound) + @cmp_indices = {} + @compounds.size.times do |i| + c = @compounds[i].uri + if @cmp_indices[c]==nil + @cmp_indices[c] = [i] + else + @cmp_indices[c] = @cmp_indices[c]+[i] + end + end + end + @cmp_indices[compound] + end + + def data_entry_value(compound_index, feature_uri) + col = @features.collect{|f| f.uri}.index feature_uri + @data_entries[compound_index][col] end end + end diff --git a/lib/error.rb b/lib/error.rb index 4fed343..eb72144 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -5,17 +5,19 @@ module OpenToxError attr_accessor :http_code, :uri def initialize message, uri=nil super message - @uri = uri.to_s.sub(%r{//.*:.*@},'//') # remove credentials from uri - @http_code ||= 500 - @rdf = RDF::Graph.new - subject = RDF::Node.new - @rdf << [subject, RDF.type, RDF::OT.ErrorReport] - @rdf << [subject, RDF::OT.actor, @uri] - @rdf << [subject, RDF::OT.message, message.to_s] - @rdf << [subject, RDF::OT.statusCode, @http_code] - @rdf << [subject, RDF::OT.errorCode, self.class.to_s] - @rdf << [subject, RDF::OT.errorCause, short_backtrace] - $logger.error("\n"+self.to_turtle) + #unless self.is_a? Errno::EAGAIN # avoid "Resource temporarily unavailable" errors + @uri = uri.to_s.sub(%r{//.*:.*@},'//') # remove credentials from uri + @http_code ||= 500 + @rdf = RDF::Graph.new + subject = RDF::Node.new + @rdf << [subject, RDF.type, RDF::OT.ErrorReport] + @rdf << [subject, RDF::OT.actor, @uri] + @rdf << [subject, RDF::OT.message, message.sub(/^"/,'').sub(/"$/,'')] + @rdf << [subject, RDF::OT.statusCode, @http_code] + @rdf << [subject, RDF::OT.errorCode, self.class.to_s] + @rdf << [subject, RDF::OT.errorCause, short_backtrace] + $logger.error("\n"+self.to_turtle) + #end end def short_backtrace @@ -40,13 +42,14 @@ module OpenToxError prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| - @rdf.each{|statement| writer << statement} + @rdf.each{|statement| writer << statement} if @rdf end end end class RuntimeError +#class StandardError include OpenToxError end @@ -58,6 +61,7 @@ end module OpenTox class Error < RuntimeError + include OpenToxError def initialize code, message, uri=nil @http_code = code @@ -77,7 +81,7 @@ module OpenTox # define global methods for raising errors, eg. bad_request_error Object.send(:define_method, error[:method]) do |message,uri=nil| - raise c.new(message, uri) + raise c.new(message.inspect, uri) end end diff --git a/lib/feature.rb b/lib/feature.rb new file mode 100644 index 0000000..5d3d962 --- /dev/null +++ b/lib/feature.rb @@ -0,0 +1,37 @@ +module OpenTox + + class Feature + + # Find out feature type + # Classification takes precedence + # @return [String] Feature type + def feature_type + if self[RDF.type].include?(RDF::OT.NominalFeature) + "classification" + elsif self[RDF.type].include?(RDF::OT.NumericFeature) + "regression" + else + "unknown" + end + end + + # Get accept values + # + # @return[Array] Accept values + def accept_values + self[RDF::OT.acceptValue] ? self[RDF::OT.acceptValue].sort : nil + end + + # Create value map + # @param [OpenTox::Feature] Feature + # @return [Hash] A hash with keys 1...feature.training_classes.size and values training classes + def value_map + unless defined? @value_map + accept_values ? @value_map = accept_values.each_index.inject({}) { |h,idx| h[idx+1]=accept_values[idx]; h } : @value_map = nil + end + @value_map + end + + end + +end diff --git a/lib/model.rb b/lib/model.rb index c104e64..144c8c3 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -11,5 +11,36 @@ module OpenTox wait_for_task uri if wait end + def feature_type # CH: subjectid is a object variable, no need to pass it as a parameter + unless @feature_type + get unless metadata[OT.dependentVariables.to_s] + bad_request_error "Cannot determine feature type, dependent variable missing in model #{@uri}" unless metadata[OT.dependentVariables.to_s] + @feature_type = OpenTox::Feature.new( metadata[OT.dependentVariables.to_s][0], @subjectid ).feature_type + end + @feature_type + end + + def predicted_variable + load_predicted_variables unless defined? @predicted_variable + @predicted_variable + end + + def predicted_confidence + load_predicted_variables unless defined? @predicted_confidence + @predicted_confidence + end + + private + def load_predicted_variables + metadata[OT.predictedVariables.to_s].each do |f| + feat = OpenTox::Feature.find( f, @subjectid ) + if feat.title =~ /confidence/ + @predicted_confidence = f + else + @predicted_variable = f unless @predicted_variable + end + end + end + end end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 65a9177..1fe084b 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -34,15 +34,10 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m "opentox.rb", "task.rb", "compound.rb", + "feature.rb", "dataset.rb", "model.rb", "algorithm.rb", - "4store.rb", "validation.rb" -].each{ |f| require File.join(File.dirname(__FILE__),f) } - -Dir["#{File.dirname(__FILE__)}/utils/shims/*.rb"].each { |f| require f } # Shims for legacy code -Dir["#{File.dirname(__FILE__)}/utils/sparql/*.rb"].each { |f| require f } # SPARQL code -Dir["#{File.dirname(__FILE__)}/utils/rdf/*.rb"].each { |f| require f } # RDF code -Dir["#{File.dirname(__FILE__)}/utils/*.rb"].each { |f| require f } # Utils for Libs +].each{ |f| require_relative f } diff --git a/lib/opentox.rb b/lib/opentox.rb index 221a8dd..1251f33 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -3,109 +3,110 @@ $logger = OTLogger.new(STDERR) $logger.level = Logger::DEBUG module OpenTox + #include RDF CH: leads to namespace clashes with URI class - attr_accessor :uri, :subjectid, :rdf + attr_reader :uri, :subjectid + attr_writer :metadata, :parameters # Ruby interface - # Create a new OpenTox object (does not load data from service) + # Create a new OpenTox object # @param [optional,String] URI # @param [optional,String] subjectid # @return [OpenTox] OpenTox object def initialize uri=nil, subjectid=nil @rdf = RDF::Graph.new - if uri - @uri = uri.to_s.chomp - else - service = self.class.to_s.split('::').last.downcase - service_uri = eval("$#{service}[:uri]") - bad_request_error "$#{service}[:uri] variable not set. Please set $#{service}[:uri] or use an explicit uri as first constructor argument " unless service_uri - @uri = File.join service_uri, SecureRandom.uuid - end - append RDF.type, eval("RDF::OT."+self.class.to_s.split('::').last) - append RDF::DC.date, DateTime.now @subjectid = subjectid + @metadata = {} + @parameters = [] + uri ? @uri = uri.to_s.chomp : @uri = File.join(service_uri, SecureRandom.uuid) end - # Object metadata + # Object metadata (lazy loading) # @return [Hash] Object metadata - def metadata - # return plain strings instead of RDF objects - @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate.to_s] = values.collect{|v| v.to_s}; h } + def metadata force_update=false + if (@metadata.empty? or force_update) and URI.accessible? @uri + get if @rdf.empty? or force_update + # return values as plain strings instead of RDF objects + @metadata = @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } + end + @metadata end # Metadata values # @param [String] Predicate URI # @return [Array, String] Predicate value(s) def [](predicate) - return nil if metadata[predicate.to_s].nil? - metadata[predicate.to_s].size == 1 ? metadata[predicate.to_s].first : metadata[predicate.to_s] + return nil if metadata[predicate].nil? + metadata[predicate].size == 1 ? metadata[predicate].first : metadata[predicate] end - # Set object metadata + # Set a metadata entry # @param [String] Predicate URI # @param [Array, String] Predicate value(s) def []=(predicate,values) - @rdf.delete [RDF::URI.new(@uri.to_s),RDF::URI.new(predicate.to_s),nil] - append predicate.to_s, values - end - - def parameters - params = {} - query = RDF::Query.new({ - :parameter => { - RDF.type => RDF::OT.Parameter, - :property => :value, - } - }) - query.execute(@rdf).each do |solution| - params[solution.parameter] = {} unless params[solution.parameter] - params[solution.parameter][solution.property.to_s] = solution.value.to_s - end - params.values - end - - def parameters=(parameters) - parameters.each do |param| - p_node = RDF::Node.new - @rdf << [RDF::URI.new(@uri), RDF::OT.parameters, p_node] - @rdf << [p_node, RDF.type, RDF::OT.Parameter] - param.each{ |p,o| @rdf << [p_node, p, o] } + @metadata[predicate] = [values].flatten + end + + def parameters force_update=false + if (@parameters.empty? or force_update) and URI.accessible? @uri + get if @rdf.empty? or force_update + params = {} + query = RDF::Query.new({ + :parameter => { + RDF.type => RDF::OT.Parameter, + :property => :value, + } + }) + query.execute(@rdf).each do |solution| + params[solution.parameter] = {} unless params[solution.parameter] + params[solution.parameter][solution.property] = solution.value + end + @parameters = params.values end + @parameters end - # Append object metadata - # @param [String] Predicate URI - # @param [Array, String] Predicate value(s) - def append(predicate,values) - uri = RDF::URI.new @uri - predicate = RDF::URI.new predicate - [values].flatten.each { |value| @rdf << [uri, predicate, value] } + def parameter_value title + @parameters.collect{|p| p[RDF::OT.paramValue] if p[RDF::DC.title] == title}.compact.first end # Get object from webservice def get mime_type="text/plain" + bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" response = RestClientWrapper.get(@uri,{},{:accept => mime_type, :subjectid => @subjectid}) if URI.task?(response) - wait_for_task response - response = RestClientWrapper.get(t.resultURI,{},{:accept => mime_type, :subjectid => @subjectid}) + uri = wait_for_task response + response = RestClientWrapper.get(uri,{},{:accept => mime_type, :subjectid => @subjectid}) end parse_ntriples response if mime_type == "text/plain" parse_rdfxml response if mime_type == "application/rdf+xml" end - # Post object to webservice - def post params=nil, wait=true - # TODO: RDFXML - uri = RestClientWrapper.post @uri.to_s, params, { :content_type => "text/plain", :subjectid => @subjectid} - wait_for_task uri if wait - end - - # Save object at webservice - def put wait=true - # TODO: RDFXML - uri = RestClientWrapper.put @uri.to_s, self.to_ntriples, { :content_type => "text/plain", :subjectid => @subjectid} - wait_for_task uri if wait + # Post object to webservice (append to object), rarely useful and deprecated + def post wait=true, mime_type="text/plain" + bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" + case mime_type + when 'text/plain' + body = self.to_ntriples + when 'application/rdf+xml' + body = self.to_rdfxml + end + uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type, :subjectid => @subjectid} + wait ? wait_for_task(uri) : uri + end + + # Save object at webservice (replace or create object) + def put wait=true, mime_type="text/plain" + bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" + case mime_type + when 'text/plain' + body = self.to_ntriples + when 'application/rdf+xml' + body = self.to_rdfxml + end + uri = RestClientWrapper.put @uri.to_s, body, { :content_type => mime_type, :subjectid => @subjectid} + wait ? wait_for_task(uri) : uri end # Delete object at webservice @@ -113,29 +114,30 @@ module OpenTox RestClientWrapper.delete(@uri.to_s,nil,{:subjectid => @subjectid}) end - def wait_for_task uri - OpenTox.wait_for_task uri + def service_uri + self.class.service_uri end - def self.wait_for_task uri - if URI.task?(uri) - t = OpenTox::Task.new uri - t.wait - unless t.completed? - method = RestClientWrapper.known_errors.select{|error| error[:code] == t.code}.first[:method] - t.get - Object.send(method,t.error_report[RDF::OT.message],t.uri) - end - uri = t.resultURI + def create_rdf + @rdf = RDF::Graph.new + @metadata[RDF.type] ||= eval("RDF::OT."+self.class.to_s.split('::').last) + @metadata[RDF::DC.date] ||= DateTime.now + @metadata.each do |predicate,values| + [values].flatten.each { |value| @rdf << [RDF::URI.new(@uri), predicate, value] } + end + @parameters.each do |parameter| + p_node = RDF::Node.new + @rdf << [RDF::URI.new(@uri), RDF::OT.parameters, p_node] + @rdf << [p_node, RDF.type, RDF::OT.Parameter] + parameter.each { |k,v| @rdf << [p_node, k, v] } end - uri end RDF_FORMATS.each do |format| # rdf parse methods for all formats e.g. parse_rdfxml - send :define_method, "parse_#{format}".to_sym do |rdf,init=true| - @rdf = RDF::Graph.new if init + send :define_method, "parse_#{format}".to_sym do |rdf| + @rdf = RDF::Graph.new RDF::Reader.for(format).new(rdf) do |reader| reader.each_statement{ |statement| @rdf << statement } end @@ -143,25 +145,27 @@ module OpenTox # rdf serialization methods for all formats e.g. to_rdfxml send :define_method, "to_#{format}".to_sym do - RDF::Writer.for(format).buffer do |writer| + create_rdf + RDF::Writer.for(format).buffer(:encoding => Encoding::ASCII) do |writer| @rdf.each{|statement| writer << statement} end end end - def to_turtle # redefine to use prefixes (not supported by RDF::Writer) + def to_turtle # redefined to use prefixes (not supported by RDF::Writer) prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } + create_rdf RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| @rdf.each{|statement| writer << statement} end end - { - :title => RDF::DC.title, - :dexcription => RDF::DC.description, - :type => RDF.type - }.each do |method,predicate| + def to_html + to_turtle.to_html + end + + { :title => RDF::DC.title, :dexcription => RDF::DC.description, :type => RDF.type }.each do |method,predicate| send :define_method, method do self.[](predicate) end @@ -170,15 +174,58 @@ module OpenTox end end - # create default OpenTox classes + # create default OpenTox classes with class methods CLASSES.each do |klass| c = Class.new do include OpenTox - def self.all service_uri, subjectid=nil + def self.all subjectid=nil uris = RestClientWrapper.get(service_uri, {}, :accept => 'text/uri-list').split("\n").compact uris.collect{|uri| self.new(uri, subjectid)} end + + def self.find uri, subjectid=nil + URI.accessible?(uri) ? self.new(uri, subjectid) : nil + end + + def self.create metadata, subjectid=nil + object = self.new nil, subjectid + object.metadata = metadata + object.put + object + end + + def self.find_or_create metadata, subjectid=nil + sparql = "SELECT DISTINCT ?s WHERE { " + metadata.each do |predicate,objects| + unless [RDF::DC.date,RDF::DC.modified,RDF::DC.description].include? predicate # remove dates and description (strange characters in description may lead to SPARQL errors) + if objects.is_a? String + URI.valid?(objects) ? o = "<#{objects}>" : o = "'''#{objects}'''" + sparql << "?s <#{predicate}> #{o}. " + elsif objects.is_a? Array + objects.each do |object| + URI.valid?(object) ? o = "<#{object}>" : o = "'#{object}'" + sparql << "?s <#{predicate}> #{o}. " + end + end + end + end + sparql << "}" + uris = RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n") + if uris.empty? + self.create metadata, subjectid + else + self.new uris.first + end + end + + def self.service_uri + service = self.to_s.split('::').last.downcase + eval("$#{service}[:uri]") + rescue + bad_request_error "$#{service}[:uri] variable not set. Please set $#{service}[:uri] or use an explicit uri as first constructor argument " + end + end OpenTox.const_set klass,c end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index c7bb312..d27434b 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -1,3 +1,4 @@ +require "base64" class Object # An object is blank if it's false, empty, or a whitespace string. # For example, "", " ", +nil+, [], and {} are all blank. @@ -17,6 +18,7 @@ module Enumerable end class String + def underscore self.gsub(/::/, '/'). gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). @@ -24,6 +26,44 @@ class String tr("-", "_"). downcase end + + # encloses URI in text with with link tag + # @return [String] new text with marked links + def link_urls + self.gsub(/(?i)http(s?):\/\/[^\r\n\s']*/, '\0') + end + + # produces a html page for making web services browser friendly + # format of text (=string params) is preserved (e.g. line breaks) + # urls are marked as links + # + # @param [String] text this is the actual content, + # @param [optional,String] related_links info on related resources + # @param [optional,String] description general info + # @param [optional,Array] post_command, infos for the post operation, object defined below + # @return [String] html page + def to_html(related_links=nil, description=nil, png_image=nil ) + + # TODO add title as parameter + title = nil #$sinatra.to($sinatra.request.env['PATH_INFO'], :full) if $sinatra + html = "" + html << ""+title+"" if title + #html += "<\/img>" + + html << "

Description

"+description.link_urls+"

" if description + html << "

Related links

"+related_links.link_urls+"

" if related_links + html << "

Content

" if description || related_links + html << "

" + html << "\n" if png_image + html << self.link_urls + html << "

" + html + end + + def uri? + URI.valid?(self) + end + end module URI @@ -84,11 +124,11 @@ class File end end -# overwrite backtick operator to catch system errors module Kernel - # Override raises an error if _cmd_ returns a non-zero exit status. - # Returns stdout if _cmd_ succeeds. Note that these are simply concatenated; STDERR is not inline. + # overwrite backtick operator to catch system errors + # Override raises an error if _cmd_ returns a non-zero exit status. CH: I do not understand this comment + # Returns stdout if _cmd_ succeeds. Note that these are simply concatenated; STDERR is not inline. CH: I do not understand this comment def ` cmd stdout, stderr = '' status = Open4::popen4(cmd) do |pid, stdin_stream, stdout_stream, stderr_stream| @@ -101,6 +141,27 @@ module Kernel internal_server_error $!.message end + def wait_for_task uri + if URI.task?(uri) + t = OpenTox::Task.new uri + t.wait + unless t.completed? + begin # handle known (i.e. OpenTox) errors + error = OpenTox::RestClientWrapper.known_errors.select{|error| error[:code] == t.code}.first + error ? error_method = error[:method] : error_method = :internal_server_error + report = t.error_report + report ? error_message = report[RDF::OT.message] : error_message = $!.message + Object.send(error_method,error_message,t.uri) + rescue + internal_server_error "#{$!.message}\n#{$!.backtrace}", t.uri + end + end + uri = t.resultURI + end + uri + end + + end @@ -126,6 +187,5 @@ class Array return self.uniq.size == 1 end - end diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index f3c56c8..38219c1 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -37,8 +37,6 @@ module OpenTox headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems args[:headers] = headers - $logger.debug "POST #{uri} #{payload.inspect}" if method.to_s=="post" && payload.is_a?(Hash) - @request = RestClient::Request.new(args) # ignore error codes from Task services (may return error codes >= 400 according to API, which causes exceptions in RestClient and RDF::Reader) @response = @request.execute do |response, request, result| diff --git a/lib/task.rb b/lib/task.rb index 82e1665..07c0b05 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -6,33 +6,55 @@ module OpenTox attr_accessor :pid, :observer_pid - def self.create service_uri, subjectid=nil, params={} + def metadata + super true # always update metadata + end + + def self.run(description, creator=nil, subjectid=nil) - uri = File.join(service_uri,SecureRandom.uuid) - task = Task.new uri, subjectid + task = Task.new nil, subjectid task[RDF::OT.created_at] = DateTime.now task[RDF::OT.hasStatus] = "Running" - params.each { |k,v| task[k] = v } - task.put false + task[RDF::DC.description] = description.to_s + task[RDF::DC.creator] = creator.to_s + task.put pid = fork do begin - result_uri = yield - task.completed result_uri + task.completed yield + #result_uri = yield + #task.completed result_uri rescue - unless $!.is_a?(RuntimeError) # PENDING: only runtime Errors are logged when raised - cut_index = $!.backtrace.find_index{|line| line.match /gems\/sinatra/} - cut_index = -1 unless cut_index +=begin + #unless $!.is_a?(RuntimeError) # PENDING: only runtime Errors are logged when raised msg = "\nTask ERROR\n"+ - "task description: #{params[RDF::DC.description]}\n"+ + "task description: #{task[RDF::DC.description]}\n"+ "task uri: #{$!.class.to_s}\n"+ "error msg: #{$!.message}\n"+ "error backtrace:\n#{$!.backtrace[0..cut_index].join("\n")}\n" $logger.error msg - end + #end +=end if $!.respond_to? :to_ntriples + puts $!.to_turtle RestClientWrapper.put(File.join(task.uri,'Error'),:errorReport => $!.to_ntriples,:content_type => 'text/plain') else - RestClientWrapper.put(File.join(task.uri,'Error')) + cut_index = $!.backtrace.find_index{|line| line.match /gems\/sinatra/} + cut_index = -1 unless cut_index + @rdf = RDF::Graph.new + subject = RDF::Node.new + @rdf << [subject, RDF.type, RDF::OT.ErrorReport] + @rdf << [subject, RDF::OT.message, $!.message] + @rdf << [subject, RDF::OT.errorCode, $!.class.to_s] + @rdf << [subject, RDF::OT.errorCause, $!.backtrace[0..cut_index].join("\n")] + prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#", :ot => RDF::OT.to_s} + turtle = RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + @rdf.each{|statement| writer << statement} + end + $logger.error turtle + nt = RDF::Writer.for(:ntriples).buffer do |writer| + @rdf.each{|statement| writer << statement} + end + RestClientWrapper.put(File.join(task.uri,'Error'),:errorReport => nt,:content_type => 'text/plain') end task.kill end @@ -73,23 +95,21 @@ module OpenTox kill self.[]=(RDF::OT.hasStatus, "Cancelled") self.[]=(RDF::OT.finished_at, DateTime.now) - put false + put end def completed(uri) self.[]=(RDF::OT.resultURI, uri) self.[]=(RDF::OT.hasStatus, "Completed") self.[]=(RDF::OT.finished_at, DateTime.now) - put false + put end # waits for a task, unless time exceeds or state is no longer running - # @param [optional,Numeric] dur seconds pausing before checking again for completion - # TODO: add waiting task def wait start_time = Time.new due_to_time = start_time + DEFAULT_TASK_MAX_DURATION - dur = 0.3 + dur = 0.2 while running? sleep dur dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min @@ -122,14 +142,20 @@ module OpenTox [:hasStatus, :resultURI, :created_at, :finished_at].each do |method| define_method method do - get response = self.[](RDF::OT[method]) response = self.[](RDF::OT1[method]) unless response # API 1.1 compatibility response end end + # Check status of a task + # @return [String] Status + def status + self[RDF::OT.hasStatus] + end + def error_report + get report = {} query = RDF::Query.new({ :report => { @@ -144,5 +170,31 @@ module OpenTox end #TODO: subtasks (only for progress) + class SubTask + + def initialize(task, min, max) + #TODO add subtask code + end + + def self.create(task, min, max) + if task + SubTask.new(task, min, max) + else + nil + end + end + + def waiting_for(task_uri) + #TODO add subtask code + end + + def progress(pct) + #TODO add subtask code + end + + def running?() + #TODO add subtask code + end + end end diff --git a/lib/utils/diag.rb b/lib/utils/diag.rb deleted file mode 100644 index fd37945..0000000 --- a/lib/utils/diag.rb +++ /dev/null @@ -1,11 +0,0 @@ -=begin -* Name: diag.rb -* Description: Diagnostic tools -* Author: Andreas Maunz -* Date: 10/2012 -=end - -# Print a diagnostic message -def uri_list - puts "My load path is:\n#{$LOAD_PATH.join("\n")} \nI have loaded #{$LOADED_FEATURES.size} objects.\n\n" -end diff --git a/lib/utils/html.rb b/lib/utils/html.rb deleted file mode 100644 index 4a4c9e1..0000000 --- a/lib/utils/html.rb +++ /dev/null @@ -1,52 +0,0 @@ -#OT_LOGO = File.join(CONFIG[:services]["opentox-validation"],"resources/ot-logo.png") - -=begin -* Name: html.rb -* Description: Tools to provide html output -* Author: Andreas Maunz -* Date: 10/2012 -=end - -require "base64" - -# AM: needed since this gem has a nested directory structure - -class String - # encloses URI in text with with link tag - # @return [String] new text with marked links - def link_urls - self.gsub(/(?i)http(s?):\/\/[^\r\n\s']*/, '\0') - end - -end - -module OpenTox - - # produces a html page for making web services browser friendly - # format of text (=string params) is preserved (e.g. line breaks) - # urls are marked as links - # - # @param [String] text this is the actual content, - # @param [optional,String] related_links info on related resources - # @param [optional,String] description general info - # @param [optional,Array] post_command, infos for the post operation, object defined below - # @return [String] html page - def self.text_to_html( text, subjectid=nil, related_links=nil, description=nil, post_command=nil, png_image=nil ) - - # TODO add title as parameter - title = nil #$sinatra.to($sinatra.request.env['PATH_INFO'], :full) if $sinatra - html = "" - html += ""+title+"" if title - #html += "<\/img>" - - html += "

Description

"+description.link_urls+"

" if description - html += "

Related links

"+related_links.link_urls+"

" if related_links - html += "

Content

" if description || related_links - html += "

" - html += "\n" if png_image - html += text.link_urls - html += "

" - html - end - -end diff --git a/lib/utils/rdf/dataset.rb b/lib/utils/rdf/dataset.rb deleted file mode 100644 index 2cb32a9..0000000 --- a/lib/utils/rdf/dataset.rb +++ /dev/null @@ -1,73 +0,0 @@ -=begin -* Name: dataset.rb -* Description: Dataset RDF tools -* Author: Andreas Maunz -* Date: 10/2012 -=end - -module OpenTox - class Dataset - - # Load features via RDF (slow) - # @param [String] uri Dataset URI - # @return [Array] features Features in order - def find_features_rdf - query = RDF::Query.new do - pattern [:uri, RDF.type, RDF::OT.Feature] - pattern [:uri, RDF::OLO.index, :idx] - end - query.execute(@rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Feature.new(s.uri.to_s)} - end - - # Load compounds via RDF (slow) - # @param [String] uri Dataset URI - # @return [Array] compounds Compounds in order - def find_compounds_rdf - query = RDF::Query.new do - pattern [:uri, RDF.type, RDF::OT.Compound] - pattern [:uri, RDF::OLO.index, :idx] - end - query.execute(@rdf).sort_by{|s| s.idx}.collect{|s| OpenTox::Compound.new(s.uri.to_s)} - end - - # Load data entries via RDF (slow) - # @param [String] uri Dataset uri - # @return [Array] entries Data entries, ordered primarily over cols and secondarily over rows - def find_data_entries_rdf - query = RDF::Query.new do - pattern [:data_entry, RDF::OLO.index, :cidx] # compound index: now a free variable - pattern [:data_entry, RDF::OT.values, :vals] - pattern [:vals, RDF::OT.feature, :f] - pattern [:f, RDF::OLO.index, :fidx] - pattern [:vals, RDF::OT.value, :val] - end - query.execute(@rdf).order_by(:fidx, :cidx).collect { |s| s.val.to_s } - end - - # Query a dataset URI for ordered status - # by loading its metadata (OpenTox compliant) - # @param [String] uri Dataset uri - # @return [TrueClass, FalseClass] status Whether the dataset is ordered - def self.ordered?(uri) - ds = OpenTox::Dataset.new # dummy - ds.parse_rdfxml(RestClient.get([uri,"metadata"].join("/"),{:accept => "application/rdf+xml"})) - query = RDF::Query.new do - pattern [:dataset, RDF.type, RDF::OT.OrderedDataset] - end - query.execute(ds.rdf).size>0 - end - - # Load dataset URI from given RDF (slow) - # @param [String] rdf RDF - # @return [String] uri URI - def self.uri_from_rdf(rdf) - ds = OpenTox::Dataset.new # dummy - ds.parse_rdfxml(rdf) - query = RDF::Query.new do - pattern [:dataset, RDF.type, RDF::OT.Dataset] - end - query.execute(ds.rdf).collect { |s| s.dataset.to_s }[0] - end - - end -end diff --git a/lib/utils/shims/dataset.rb b/lib/utils/shims/dataset.rb deleted file mode 100644 index f72ff1b..0000000 --- a/lib/utils/shims/dataset.rb +++ /dev/null @@ -1,201 +0,0 @@ -=begin -* Name: dataset.rb -* Description: Dataset shims -* Author: Andreas Maunz -* Date: 10/2012 -=end - -module OpenTox - - # Shims for the Dataset Class - class Dataset - - attr_accessor :feature_positions, :compound_positions - - # Load a dataset from URI - # @param [String] Dataset URI - # @return [OpenTox::Dataset] Dataset object - def self.find(uri, subjectid=nil) - return nil unless uri - ds = OpenTox::Dataset.new uri, subjectid - ds.get - ds - end - - def self.exist?(uri, subjectid=nil) - ds = OpenTox::Dataset.new uri, subjectid - begin - ds.get_metadata - true - rescue - false - end - end - - def split( compound_indices, feats, metadata, subjectid=nil) - - raise "Dataset.split : pls give compounds as indices" if compound_indices.size==0 or !compound_indices[0].is_a?(Fixnum) - raise "Dataset.split : pls give features as feature objects (given: #{feats})" if feats!=nil and feats.size>0 and !feats[0].is_a?(OpenTox::Feature) - $logger.debug "split dataset using "+compound_indices.size.to_s+"/"+@compounds.size.to_s+" compounds" - - dataset = OpenTox::Dataset.new(nil, subjectid) - dataset.metadata = metadata - dataset.features = (feats ? feats : self.features) - compound_indices.each do |c_idx| - dataset << [ self.compounds[c_idx] ] + dataset.features.each_with_index.collect{|f,f_idx| self.data_entries[c_idx][f_idx]} - end - - #compound_indices.each do |c_idx| - # c = @compounds[c_idx] - # dataset.add_compound(c) - # if @data_entries[c] - # features.each do |f| - # if @data_entries[c][f] - # dataset.add_data_entry c,f,@data_entries[c][f][entry_index(c_idx)] - # else - # dataset.add_data_entry c,f,nil - # end - # end - # end - # end - - dataset.put subjectid - dataset - end - - - # maps a compound-index from another dataset to a compound-index from this dataset - # mapping works as follows: - # (compound c is the compound identified by the compound-index of the other dataset) - # * c occurs only once in this dataset? map compound-index of other dataset to index in this dataset - # * c occurs >1 in this dataset? - # ** number of occurences is equal in both datasets? assume order is preserved(!) and map accordingly - # ** number of occurences is not equal in both datasets? cannot map, raise error - # @param [OpenTox::Dataset] dataset that should be mapped to this dataset (fully loaded) - # @param [Fixnum] compound_index, corresponding to dataset - def compound_index( dataset, compound_index ) - unless defined?(@index_map) and @index_map[dataset.uri] - map = {} - dataset.compounds.collect{|c| c.uri}.uniq.each do |compound| - self_indices = compound_indices(compound) - next unless self_indices - dataset_indices = dataset.compound_indices(compound) - if self_indices.size==1 - dataset_indices.size.times do |i| - map[dataset_indices[i]] = self_indices[0] - end - elsif self_indices.size==dataset_indices.size - # we do assume that the order is preseverd! - dataset_indices.size.times do |i| - map[dataset_indices[i]] = self_indices[i] - end - else - raise "cannot map compound #{compound} from dataset #{dataset.uri} to dataset #{uri}, "+ - "compound occurs #{dataset_indices.size} times and #{self_indices.size} times" - end - end - @index_map = {} unless defined?(@index_map) - @index_map[dataset.uri] = map - end - @index_map[dataset.uri][compound_index] - end - - def compound_indices( compound ) - unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound) - @cmp_indices = {} - @compounds.size.times do |i| - c = @compounds[i].uri - if @cmp_indices[c]==nil - @cmp_indices[c] = [i] - else - @cmp_indices[c] = @cmp_indices[c]+[i] - end - end - end - @cmp_indices[compound] - end - - def data_entry_value(compound_index, feature_uri) - build_feature_positions unless @feature_positions - @data_entries[compound_index][@feature_positions[feature_uri]] - end - - ### Index Structures - - # Create value map - # @param [OpenTox::Feature] A feature - # @return [Hash] A hash with keys 1...feature.training_classes.size and values training classes - def value_map(feature) - training_classes = feature.accept_values - raise "no accept values for feature #{feature.uri} in dataset #{uri}" unless training_classes - training_classes.each_index.inject({}) { |h,idx| h[idx+1]=training_classes[idx]; h } - end - - # Create feature positions map - # @return [Hash] A hash with keys feature uris and values feature positions - def build_feature_positions - unless @feature_positions - @feature_positions = @features.each_index.inject({}) { |h,idx| - internal_server_error "Duplicate Feature '#{@features[idx].uri}' in dataset '#{@uri}'" if h[@features[idx].uri] - h[@features[idx].uri] = idx - h - } - end - end - - # Create compounds positions map - # @return [Hash] A hash with keys compound uris and values compound position arrays - def build_compound_positions - unless @compound_positions - @compound_positions = @compounds.each_index.inject({}) { |h,idx| - inchi=OpenTox::Compound.new(@compounds[idx].uri).inchi - h[inchi] = [] unless h[inchi] - h[inchi] << idx if inchi =~ /InChI/ - h - } - end - end - - - ### Associative Search Operations - - # Search a dataset for a feature given its URI - # @param [String] Feature URI - # @return [OpenTox::Feature] Feature object, or nil if not present - def find_feature(uri) - build_feature_positions - res = @features[@feature_positions[uri]] if @feature_positions[uri] - res - end - - # Search a dataset for a compound given its URI - # @param [String] Compound URI - # @return [OpenTox::Compound] Array of compound objects, or nil if not present - def find_compound(uri) - build_compound_positions - inchi = OpenTox::Compound.new(uri).inchi - res = @compounds[@compound_positions[inchi]] if inchi =~ /InChI/ and @compound_positions[inchi] - res - end - - # Search a dataset for a data entry given compound URI and feature URI - # @param [String] Compound URI - # @param [String] Feature URI - # @return [Object] Data entry, or nil if not present - def find_data_entry(compound_uri, feature_uri) - build_compound_positions - build_feature_positions - inchi = OpenTox::Compound.new(compound_uri).inchi - if @compound_positions[inchi] && @feature_positions[feature_uri] - res = [] - @compound_positions[inchi].each { |idx| - res << data_entries[idx][@feature_positions[feature_uri]] - } - end - res - end - - end - - -end diff --git a/lib/utils/shims/feature.rb b/lib/utils/shims/feature.rb deleted file mode 100644 index 9afa5c2..0000000 --- a/lib/utils/shims/feature.rb +++ /dev/null @@ -1,87 +0,0 @@ -=begin -* Name: feature.rb -* Description: Feature shims -* Author: Andreas Maunz -* Date: 10/2012 -=end - -module OpenTox - - # Shims for the feature class - class Feature - - # Load a feature from URI - # @param [String] Feature URI - # @return [OpenTox::Feature] Feature object with the full data - def self.find(uri, subjectid=nil) - return nil unless uri - f = OpenTox::Feature.new uri, subjectid - f.get - f - end - - # Load or create a feature given its title and metadata - # Create it if: a) not present, or b) present, but differs in metadata - # Newly created features are stored at the backend - # @param[String] title Feature title - # @param[Hash] metadata Feature metadata - # @return [OpenTox::Feature] Feature object with the full data, or nil - def self.find_by_title(title, metadata) - metadata[RDF.type] = [] unless metadata[RDF.type] - metadata[RDF.type] << RDF::OT.Feature unless metadata[RDF.type].include?(RDF::OT.Feature) - metadata[RDF::DC.title] = title unless (metadata[RDF::DC.title]) - feature = feature_new = OpenTox::Feature.new(File.join($feature[:uri], SecureRandom.uuid), @subjectid) - feature_new.metadata = metadata - sparql = "SELECT DISTINCT ?feature WHERE { ?feature <#{RDF.type}> <#{RDF::OT['feature'.capitalize]}>. ?feature <#{RDF::DC.title}> '#{title.to_s}' }" - feature_uris = OpenTox::Backend::FourStore.query(sparql,"text/uri-list").split("\n") - features_equal = false # relevant also when no features found - feature_uris.each_with_index { |feature_uri,idx| - feature_existing = OpenTox::Feature.find(feature_uri, @subjectid) - if (feature_new.metadata.size+1 == feature_existing.metadata.size) # +1 due to title - features_equal = metadata.keys.collect { |predicate| - unless ( predicate == RDF::DC.title ) - if feature_new[predicate].class == feature_existing[predicate].class - case feature_new[predicate].class.to_s - when "Array" then (feature_new[predicate].sort == feature_existing[predicate].sort) - else (feature_new[predicate] == feature_existing[predicate]) - end - end - else - true - end - }.uniq == [true] - end - (feature=feature_existing and break) if features_equal - } - unless features_equal - feature_new.put - end - feature - end - - # Find out feature type - # Classification takes precedence - # @return [String] Feature type - def feature_type - bad_request_error "rdf type of feature '#{@uri}' not set" unless self[RDF.type] - if self[RDF.type].include?(OT.NominalFeature) - "classification" - elsif self[RDF.type].include?(OT.NumericFeature) - "regression" - else - "unknown" - end - end - - # Get accept values - # @param[String] Feature URI - # @return[Array] Accept values - def accept_values - accept_values = self[OT.acceptValue] - accept_values.sort if accept_values - accept_values - end - - end - -end diff --git a/lib/utils/shims/model.rb b/lib/utils/shims/model.rb deleted file mode 100644 index 26a82c4..0000000 --- a/lib/utils/shims/model.rb +++ /dev/null @@ -1,40 +0,0 @@ - - -module OpenTox - - # Shims for the Task class - class Model - - def feature_type(subjectid=nil) - unless @feature_type - get unless metadata[OT.dependentVariables.to_s] - raise "cannot determine feature type, dependent variable missing" unless metadata[OT.dependentVariables.to_s] - @feature_type = OpenTox::Feature.find( metadata[OT.dependentVariables.to_s][0], subjectid ).feature_type - end - @feature_type - end - - def predicted_variable(subjectid=nil) - load_predicted_variables(subjectid) unless defined? @predicted_var - @predicted_var - end - - def predicted_confidence(subjectid=nil) - load_predicted_variables(subjectid) unless defined? @predicted_conf - @predicted_conf - end - - private - def load_predicted_variables(subjectid=nil) - metadata[OT.predictedVariables.to_s].each do |f| - feat = OpenTox::Feature.find( f, subjectid ) - if feat.title =~ /confidence/ - @predicted_conf = f - else - @predicted_var = f unless @predicted_var - end - end - end - - end -end \ No newline at end of file diff --git a/lib/utils/shims/opentox.rb b/lib/utils/shims/opentox.rb deleted file mode 100644 index c10d535..0000000 --- a/lib/utils/shims/opentox.rb +++ /dev/null @@ -1,51 +0,0 @@ -=begin -* Name: opentox.rb -* Description: Architecture shims -* Author: Andreas Maunz -* Date: 10/2012 -=end - -# This avoids having to prefix everything with "RDF::" (e.g. "RDF::DC"). -# So that we can use our old code mostly as is. -include RDF - -module OpenTox - - # Help function to provide the metadata= functionality. - # Downward compatible to opentox-ruby. - # @param [Hash] Key-Value pairs with the metadata - # @return self - def metadata=(hsh) - hsh.each {|k,v| - self[k]=v - } - end - - - ### Index Structures - - # Create parameter positions map - # @return [Hash] A hash with keys parameter names and values parameter positions - def build_parameter_positions - unless @parameter_positions - @parameters = parameters - @parameter_positions = @parameters.each_index.inject({}) { |h,idx| - h[@parameters[idx][DC.title.to_s]] = idx - h - } - end - end - - - ### Associative Search Operations - - # Search a model for a given parameter - # @param[String] The parameter title - # @return[Object] The parameter value - def find_parameter_value(title) - build_parameter_positions - res = @parameters[@parameter_positions[title]][OT.paramValue.to_s] if @parameter_positions[title] - res - end - -end diff --git a/lib/utils/shims/task.rb b/lib/utils/shims/task.rb deleted file mode 100644 index 7ac8a7d..0000000 --- a/lib/utils/shims/task.rb +++ /dev/null @@ -1,62 +0,0 @@ -=begin -* Name: task.rb -* Description: Task shims -* Author: Andreas Maunz -* Date: 10/2012 -=end - - -module OpenTox - - # Shims for the Task class - class Task - - def self.run(description, creator, subjectid=nil) - create($task[:uri],subjectid,{ RDF::DC.description => description, RDF::DC.creator => creator},&Proc.new) - end - - # Check status of a task - # @return [String] Status - def status - self[RDF::OT.hasStatus] - end - - def code - RestClientWrapper.head(@uri).code - end - - end - -end - - -module OpenTox - - class SubTask - - def initialize(task, min, max) - #TODO add subtask code - end - - def self.create(task, min, max) - if task - SubTask.new(task, min, max) - else - nil - end - end - - def waiting_for(task_uri) - #TODO add subtask code - end - - def progress(pct) - #TODO add subtask code - end - - def running?() - #TODO add subtask code - end - end - -end \ No newline at end of file diff --git a/lib/utils/sparql/dataset.rb b/lib/utils/sparql/dataset.rb deleted file mode 100644 index ecf55b6..0000000 --- a/lib/utils/sparql/dataset.rb +++ /dev/null @@ -1,75 +0,0 @@ -=begin -* Name: dataset.rb -* Description: Dataset SPARQL tools -* Author: Andreas Maunz -* Date: 10/2012 -=end - -module OpenTox - class Dataset - - # Load features via SPARQL (fast) - # @param [String] uri Dataset URI - # @return [Array] features OpenTox::Features in order - def self.find_features_sparql(uri) - sparql = "SELECT DISTINCT ?s FROM <#{uri}> WHERE { - ?s <#{RDF.type}> <#{RDF::OT.Feature}> ; - <#{RDF::OLO.index}> ?fidx - } ORDER BY ?fidx" - OpenTox::Backend::FourStore.query(sparql, "text/uri-list").split("\n").collect { |uri| OpenTox::Feature.new uri.strip } - end - - # Load properties via SPARQL (fast) - # @param [Array] uris URIs (assumed ordered) - # @param [Hash] properties Properties (keys: user-defined identifier, values: rdf identifier as strings) - # @return [Array] types Properties in order of URIs - def self.find_props_sparql(uris, props) - selects = props.keys - conditions = selects.collect{ |k| - "<#{props[k]}> ?#{k.to_s}" - } - h={} - uris.each{ |uri| - sparql = "SELECT ?id #{selects.collect{|k| "?#{k.to_s}"}.join(" ")} FROM <#{uri}> WHERE { ?id #{conditions.join(";")} }" - res = OpenTox::Backend::FourStore.query(sparql, "text/uri-list") - res.split("\n").inject(h){ |h,row| - values = row.split("\t") - id=values.shift - h[id] = {} - values.each_with_index { |val,idx| - h[id][selects[idx]] = [] unless h[id][selects[idx]] - h[id][selects[idx]] << val.to_s - } - h - } - } - h - end - - # Load compounds via SPARQL (fast) - # @param [String] uri Dataset URI - # @return [Array] compounds Compounds in order - def self.find_compounds_sparql(uri) - sparql = "SELECT DISTINCT ?compound FROM <#{uri}> WHERE { - ?compound <#{RDF.type}> <#{RDF::OT.Compound}> ; - <#{RDF::OLO.index}> ?cidx; - } ORDER BY ?cidx" - OpenTox::Backend::FourStore.query(sparql, "text/uri-list").split("\n").collect { |uri| OpenTox::Compound.new uri.strip } - end - - # Load data entries via SPARQL (fast) - # @param [String] uri Dataset uri - # @return [Array] entries Data entries, ordered primarily over cols and secondarily over rows - def self.find_data_entries_sparql(uri) - sparql = "SELECT ?value FROM <#{uri}> WHERE { - ?data_entry <#{RDF::OLO.index}> ?cidx ; - <#{RDF::OT.values}> ?v . - ?v <#{RDF::OT.feature}> ?f; - <#{RDF::OT.value}> ?value . - ?f <#{RDF::OLO.index}> ?fidx. - } ORDER BY ?fidx ?cidx" - OpenTox::Backend::FourStore.query(sparql,"text/uri-list").split("\n").collect { |val| val.strip } - end - - end -end -- cgit v1.2.3 From 84417ada7c4d0a3b44ed35a8eee60db2e1e751f6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 27 Mar 2013 17:11:50 +0100 Subject: validation tests ok --- lib/dataset.rb | 9 ++------- lib/model.rb | 9 ++++----- lib/opentox.rb | 4 ++-- lib/overwrite.rb | 3 ++- lib/validation.rb | 34 ++++++++++++++++++++-------------- 5 files changed, 30 insertions(+), 29 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 8d1aed0..402d2a1 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -76,14 +76,8 @@ module OpenTox # @param [OpenTox::Feature] Feature # @return [Array] Data entry values def values(compound, feature) - #puts compounds.inspect - #puts "==" - #puts compound.inspect rows = (0 ... compounds.length).select { |r| compounds[r].uri == compound.uri } - #puts rows.inspect col = features.collect{|f| f.uri}.index feature.uri - #puts col - #puts data_entries(true).inspect rows.collect{|row| data_entries[row][col]} end @@ -340,8 +334,9 @@ module OpenTox end def data_entry_value(compound_index, feature_uri) + data_entries(true) if @data_entries.empty? col = @features.collect{|f| f.uri}.index feature_uri - @data_entries[compound_index][col] + @data_entries[compound_index] ? @data_entries[compound_index][col] : nil end end diff --git a/lib/model.rb b/lib/model.rb index 144c8c3..a354cfa 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -13,9 +13,8 @@ module OpenTox def feature_type # CH: subjectid is a object variable, no need to pass it as a parameter unless @feature_type - get unless metadata[OT.dependentVariables.to_s] - bad_request_error "Cannot determine feature type, dependent variable missing in model #{@uri}" unless metadata[OT.dependentVariables.to_s] - @feature_type = OpenTox::Feature.new( metadata[OT.dependentVariables.to_s][0], @subjectid ).feature_type + bad_request_error "Cannot determine feature type, dependent variable missing in model #{@uri}" unless metadata[RDF::OT.dependentVariables] + @feature_type = OpenTox::Feature.new( metadata[RDF::OT.dependentVariables][0], @subjectid ).feature_type end @feature_type end @@ -32,8 +31,8 @@ module OpenTox private def load_predicted_variables - metadata[OT.predictedVariables.to_s].each do |f| - feat = OpenTox::Feature.find( f, @subjectid ) + metadata[RDF::OT.predictedVariables].each do |f| + feat = OpenTox::Feature.new( f, @subjectid ) if feat.title =~ /confidence/ @predicted_confidence = f else diff --git a/lib/opentox.rb b/lib/opentox.rb index 1251f33..db7ba5c 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -25,8 +25,8 @@ module OpenTox # Object metadata (lazy loading) # @return [Hash] Object metadata def metadata force_update=false - if (@metadata.empty? or force_update) and URI.accessible? @uri - get if @rdf.empty? or force_update + if (@metadata.nil? or @metadata.empty? or force_update) and URI.accessible? @uri + get if @rdf.nil? or @rdf.empty? or force_update # return values as plain strings instead of RDF objects @metadata = @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index d27434b..c2c06dd 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -153,7 +153,8 @@ module Kernel report ? error_message = report[RDF::OT.message] : error_message = $!.message Object.send(error_method,error_message,t.uri) rescue - internal_server_error "#{$!.message}\n#{$!.backtrace}", t.uri + internal_server_error "#{$!.message}", t.uri + #internal_server_error "#{$!.message}\n#{$!.backtrace}", t.uri end end uri = t.resultURI diff --git a/lib/validation.rb b/lib/validation.rb index 5c91f7c..fa43ba0 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -58,7 +58,7 @@ module OpenTox params[:subjectid] = subjectid if subjectid uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"training_test_split"), params,{:content_type => "text/uri-list"},waiting_task ) - Validation.new(OpenTox.wait_for_task(uri)) + Validation.new(wait_for_task(uri)) end # creates a training test validation, waits until it finishes, may take some time @@ -70,7 +70,7 @@ module OpenTox params[:subjectid] = subjectid if subjectid uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"training_test_validation"), params,{:content_type => "text/uri-list"},waiting_task ) - Validation.new(OpenTox.wait_for_task(uri)) + Validation.new(wait_for_task(uri)) end # creates a bootstrapping validation, waits until it finishes, may take some time @@ -82,7 +82,7 @@ module OpenTox params[:subjectid] = subjectid if subjectid uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"bootstrapping"), params,{:content_type => "text/uri-list"},waiting_task ) - Validation.new(OpenTox.wait_for_task(uri)) + Validation.new(wait_for_task(uri)) end # looks for report for this validation, creates a report if no report is found @@ -109,16 +109,16 @@ module OpenTox # [[nil,"active","moderate","inactive"],["active",1,3,99],["moderate",4,2,8],["inactive",3,8,6]] # -> 99 inactive compounds have been predicted as active def confusion_matrix - raise "no classification statistics, probably a regression valdiation" unless @metadata[OT.classificationStatistics] - matrix = @metadata[OT.classificationStatistics][OT.confusionMatrix][OT.confusionMatrixCell] - values = matrix.collect{|cell| cell[OT.confusionMatrixPredicted]}.uniq + raise "no classification statistics, probably a regression valdiation" unless @metadata[RDF::OT.classificationStatistics] + matrix = @metadata[RDF::OT.classificationStatistics][RDF::OT.confusionMatrix][RDF::OT.confusionMatrixCell] + values = matrix.collect{|cell| cell[RDF::OT.confusionMatrixPredicted]}.uniq table = [[nil]+values] values.each do |c| table << [c] values.each do |r| matrix.each do |cell| - if cell[OT.confusionMatrixPredicted]==c and cell[OT.confusionMatrixActual]==r - table[-1] << cell[OT.confusionMatrixValue].to_f + if cell[RDF::OT.confusionMatrixPredicted]==c and cell[RDF::OT.confusionMatrixActual]==r + table[-1] << cell[RDF::OT.confusionMatrixValue].to_f break end end @@ -190,7 +190,7 @@ module OpenTox params[:subjectid] = subjectid if subjectid uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"crossvalidation"), params,{:content_type => "text/uri-list"},waiting_task ) - Crossvalidation.new(OpenTox.wait_for_task(uri)) + Crossvalidation.new(wait_for_task(uri)) end # looks for report for this crossvalidation, creates a report if no report is found @@ -204,7 +204,7 @@ module OpenTox end # loads metadata via yaml from crossvalidation object - # fields (like for example the validations) can be acces via validation.metadata[OT.validation] + # fields (like for example the validations) can be acces via validation.metadata[RDF::OT.validation] def load_metadata( subjectid=nil ) @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid, :accept => "application/x-yaml"})) end @@ -255,12 +255,14 @@ module OpenTox # @return [OpenTox::ValidationReport] def self.create( validation_uri, params={}, subjectid=nil, waiting_task=nil ) params = {} if params==nil - raise OpenTox::BadRequestError.new "params is no hash" unless params.is_a?(Hash) + bad_request_error "params is no hash" unless params.is_a?(Hash) params[:validation_uris] = validation_uri params[:subjectid] = subjectid uri = RestClientWrapper.post(File.join($validation[:uri],"/report/validation"), params, {}, waiting_task ) - ValidationReport.new(OpenTox.wait_for_task(uri)) + puts uri + uri = wait_for_task(uri) + ValidationReport.new(uri) end end @@ -297,7 +299,7 @@ module OpenTox def self.create( crossvalidation_uri, subjectid=nil, waiting_task=nil ) uri = RestClientWrapper.post(File.join($validation[:uri],"/report/crossvalidation"), { :validation_uris => crossvalidation_uri, :subjectid => subjectid }, {}, waiting_task ) - CrossvalidationReport.new(OpenTox.wait_for_task(uri)) + CrossvalidationReport.new(wait_for_task(uri)) end end @@ -352,7 +354,11 @@ module OpenTox params[:subjectid] = subjectid uri = RestClientWrapper.post(File.join($validation[:uri],"/report/algorithm_comparison"), params, {}, waiting_task ) - AlgorithmComparisonReport.new(OpenTox.wait_for_task(uri)) + puts uri + + uri = wait_for_task(uri) + #AlgorithmComparisonReport.new(wait_for_task(uri)) + AlgorithmComparisonReport.new(uri) end end -- cgit v1.2.3 From ea2514ce2a6c220491da575037c60034fd46103c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 27 Mar 2013 18:08:35 +0100 Subject: wait_for_task fixed for crossvalidation --- lib/validation.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/validation.rb b/lib/validation.rb index fa43ba0..0a08e97 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -190,7 +190,8 @@ module OpenTox params[:subjectid] = subjectid if subjectid uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"crossvalidation"), params,{:content_type => "text/uri-list"},waiting_task ) - Crossvalidation.new(wait_for_task(uri)) + uri = wait_for_task(uri) + Crossvalidation.new(uri) end # looks for report for this crossvalidation, creates a report if no report is found @@ -299,7 +300,8 @@ module OpenTox def self.create( crossvalidation_uri, subjectid=nil, waiting_task=nil ) uri = RestClientWrapper.post(File.join($validation[:uri],"/report/crossvalidation"), { :validation_uris => crossvalidation_uri, :subjectid => subjectid }, {}, waiting_task ) - CrossvalidationReport.new(wait_for_task(uri)) + uri = wait_for_task(uri) + CrossvalidationReport.new(uri) end end -- cgit v1.2.3 From 9b31acdf5241ebdf700ecc1d798ca6c181aa1b5d Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 28 Mar 2013 12:47:39 +0100 Subject: remove comments and old logger messages --- lib/authorization.rb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 8eefc63..361e259 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -88,12 +88,8 @@ module OpenTox # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). def self.authorize(uri, action, subjectid) return true if !AA - #begin return true if RestClientWrapper.post("#{AA}/auth/authorize",{:uri => uri, :action => action, :subjectid => subjectid})== "boolean=true\n" return false - #rescue - # return nil - #end end #Checks if a token is a valid token @@ -323,10 +319,8 @@ module OpenTox def self.authorized?(uri, request_method, subjectid) request_method = request_method.to_sym if request_method if $aa[:free_request].include?(request_method) - #$logger.debug "authorized? >>true<< (request is free), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true elsif OpenTox::Authorization.free_uri?(uri, request_method) - #$logger.debug "authorized? >>true<< (uris is free_uri), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" true elsif $aa[:authenticate_request].include?(request_method) ret = OpenTox::Authorization.is_token_valid(subjectid) -- cgit v1.2.3 From bf5e9cb689daa7202a269f8b3f7076fad2fdf237 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Mon, 8 Apr 2013 10:26:10 +0200 Subject: fix accessible? check for ssl --- lib/overwrite.rb | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index c2c06dd..d1f3d9d 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -89,21 +89,16 @@ module URI end def self.accessible?(uri, subjectid=nil) - if URI.task? uri or URI.compound? uri - # just try to get a response, valid tasks may return codes > 400 - Net::HTTP.get_response(URI.parse(uri)) - true + parsed_uri = URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : "")) + http_code = URI.task?(uri) ? 600 : 400 + unless URI.ssl? uri + Net::HTTP.get_response(parsed_uri).code.to_i < http_code else - parsed_uri = URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : "")) - unless URI.ssl? uri - Net::HTTP.get_response(parsed_uri).code.to_i < 400 - else - http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) - http.use_ssl = true - http.verify_mode = OpenSSL::SSL::VERIFY_NONE - request = Net::HTTP::Get.new(parsed_uri.request_uri) - http.request(request).code.to_i < 400 - end + http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) + http.use_ssl = true + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + request = Net::HTTP::Get.new(parsed_uri.request_uri) + http.request(request).code.to_i < http_code end rescue false -- cgit v1.2.3 From f7e130d1729e06510b5678c251e51b5377b422e3 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 8 Apr 2013 17:59:31 +0200 Subject: debug messsages partially removed, gem depencies updated. tested with ruby 2.0.0p0 --- Gemfile | 2 +- lib/task.rb | 1 - lib/validation.rb | 9 +-------- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/Gemfile b/Gemfile index f98dbde..3be9c3c 100644 --- a/Gemfile +++ b/Gemfile @@ -1,2 +1,2 @@ -source :gemcutter +source "https://rubygems.org" gemspec diff --git a/lib/task.rb b/lib/task.rb index 07c0b05..944f20c 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -35,7 +35,6 @@ module OpenTox #end =end if $!.respond_to? :to_ntriples - puts $!.to_turtle RestClientWrapper.put(File.join(task.uri,'Error'),:errorReport => $!.to_ntriples,:content_type => 'text/plain') else cut_index = $!.backtrace.find_index{|line| line.match /gems\/sinatra/} diff --git a/lib/validation.rb b/lib/validation.rb index 0a08e97..c4f6868 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -11,8 +11,6 @@ module OldOpenTox # loads metadata via yaml def load_metadata( subjectid=nil ) yaml = OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid, :accept => "application/x-yaml"}) - #puts uri - #puts yaml @metadata = YAML.load(yaml) end @@ -261,7 +259,6 @@ module OpenTox params[:subjectid] = subjectid uri = RestClientWrapper.post(File.join($validation[:uri],"/report/validation"), params, {}, waiting_task ) - puts uri uri = wait_for_task(uri) ValidationReport.new(uri) end @@ -354,12 +351,8 @@ module OpenTox params[:validation_uris] = validation_uris.join(",") params[:identifier] = identifier.join(",") params[:subjectid] = subjectid - uri = RestClientWrapper.post(File.join($validation[:uri],"/report/algorithm_comparison"), - params, {}, waiting_task ) - puts uri - + uri = RestClientWrapper.post(File.join($validation[:uri],"/report/algorithm_comparison"), params, {}, waiting_task ) uri = wait_for_task(uri) - #AlgorithmComparisonReport.new(wait_for_task(uri)) AlgorithmComparisonReport.new(uri) end end -- cgit v1.2.3 From 5fa051cc0997a9f734d7c08968855da1a076f0e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 16 Apr 2013 15:40:07 +0300 Subject: Update opentox.rb group review of opentox.rb accomplished --- lib/opentox.rb | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index db7ba5c..309a47d 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -48,6 +48,9 @@ module OpenTox @metadata[predicate] = [values].flatten end + # Object parameters (lazy loading) + # {http://opentox.org/dev/apis/api-1.2/interfaces OpenTox API} + # @return [Hash] Object parameters def parameters force_update=false if (@parameters.empty? or force_update) and URI.accessible? @uri get if @rdf.empty? or force_update @@ -66,12 +69,16 @@ module OpenTox end @parameters end - + + # Parameter value + # @param [String] title + # @return [String] value def parameter_value title @parameters.collect{|p| p[RDF::OT.paramValue] if p[RDF::DC.title] == title}.compact.first end # Get object from webservice + # @param [String,optional] mime_type def get mime_type="text/plain" bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" response = RestClientWrapper.get(@uri,{},{:accept => mime_type, :subjectid => @subjectid}) @@ -84,6 +91,7 @@ module OpenTox end # Post object to webservice (append to object), rarely useful and deprecated + # @deprecated def post wait=true, mime_type="text/plain" bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" case mime_type @@ -117,7 +125,7 @@ module OpenTox def service_uri self.class.service_uri end - + def create_rdf @rdf = RDF::Graph.new @metadata[RDF.type] ||= eval("RDF::OT."+self.class.to_s.split('::').last) @@ -132,7 +140,8 @@ module OpenTox parameter.each { |k,v| @rdf << [p_node, k, v] } end end - + + # as defined in opentox-client.rb RDF_FORMATS.each do |format| # rdf parse methods for all formats e.g. parse_rdfxml @@ -165,7 +174,8 @@ module OpenTox to_turtle.to_html end - { :title => RDF::DC.title, :dexcription => RDF::DC.description, :type => RDF.type }.each do |method,predicate| + # short access for metadata keys title, description and type + { :title => RDF::DC.title, :description => RDF::DC.description, :type => RDF.type }.each do |method,predicate| send :define_method, method do self.[](predicate) end @@ -175,6 +185,7 @@ module OpenTox end # create default OpenTox classes with class methods + # (defined in opentox-client.rb) CLASSES.each do |klass| c = Class.new do include OpenTox @@ -184,6 +195,8 @@ module OpenTox uris.collect{|uri| self.new(uri, subjectid)} end + #@example fetching a model + # OpenTox::Model.find() -> model-object def self.find uri, subjectid=nil URI.accessible?(uri) ? self.new(uri, subjectid) : nil end -- cgit v1.2.3 From 18926800328cadcc166f5f684f600dec5336040e Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 19 Apr 2013 13:49:49 +0200 Subject: install with ruby version 2.0.0-p0 --- bin/opentox-client-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/opentox-client-install b/bin/opentox-client-install index 17e20f2..bd2f17f 100755 --- a/bin/opentox-client-install +++ b/bin/opentox-client-install @@ -41,7 +41,7 @@ check_utils "rbenv find" check_log $SELF # Adjust ruby version here! -RUBY_NUM_VER="1.9.3-p194" +RUBY_NUM_VER="2.0.0-p0" # ruby install_ruby -- cgit v1.2.3 From 85710039e5c8959208e98478761bce1f7534569a Mon Sep 17 00:00:00 2001 From: davor Date: Mon, 22 Apr 2013 13:04:59 +0300 Subject: Update opentox-client.gemspec Set older gem version for testing. --- opentox-client.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentox-client.gemspec b/opentox-client.gemspec index f9d333a..b636a93 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -22,7 +22,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency "bundler" s.add_runtime_dependency "rest-client" s.add_runtime_dependency "rdf" - s.add_runtime_dependency "rdf-raptor" + s.add_runtime_dependency "rdf-raptor", '~> 0.4.2' s.add_runtime_dependency 'rdf-n3' s.add_runtime_dependency "open4" -- cgit v1.2.3 From 1d77184d371dcebe4c8f9953e0f631739e5d70b7 Mon Sep 17 00:00:00 2001 From: Micha Rautenberg Date: Tue, 23 Apr 2013 17:02:43 +0300 Subject: rdf-raptor 1.0.0 is fixed to 1.0.1 see https://github.com/ruby-rdf/rdf-raptor/issues/11 --- opentox-client.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentox-client.gemspec b/opentox-client.gemspec index b636a93..f9d333a 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -22,7 +22,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency "bundler" s.add_runtime_dependency "rest-client" s.add_runtime_dependency "rdf" - s.add_runtime_dependency "rdf-raptor", '~> 0.4.2' + s.add_runtime_dependency "rdf-raptor" s.add_runtime_dependency 'rdf-n3' s.add_runtime_dependency "open4" -- cgit v1.2.3 From d1aee784626156b1acefaa39e90628d8143531dc Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 24 Apr 2013 20:08:45 +0200 Subject: numbered anonymous nodes for dataentries. --- lib/dataset.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 402d2a1..ec0abdb 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -220,8 +220,8 @@ module OpenTox end -=begin # TODO: fix bug that affects data_entry positions +=begin def to_ntriples # redefined string version for better performance ntriples = "" @@ -248,13 +248,15 @@ module OpenTox end ntriples << "<#{compound.uri}> <#{RDF::OLO.index}> '#{i}' .\n" - data_entry_node = RDF::Node.new + #data_entry_node = RDF::Node.new + data_entry_node = "_:dataentry"+ i.to_s ntriples << "<#{@uri}> <#{RDF::OT.dataEntry}> #{data_entry_node} .\n" ntriples << "#{data_entry_node} <#{RDF.type}> <#{RDF::OT.DataEntry}> .\n" ntriples << "#{data_entry_node} <#{RDF::OLO.index}> '#{i}' .\n" ntriples << "#{data_entry_node} <#{RDF::OT.compound}> <#{compound.uri}> .\n" @data_entries[i].each_with_index do |value,j| - value_node = RDF::Node.new + value_node = data_entry_node+ "_value"+ j.to_s + #value_node = RDF::Node.new ntriples << "#{data_entry_node} <#{RDF::OT.values}> #{value_node} .\n" ntriples << "#{value_node} <#{RDF::OT.feature}> <#{@features[j].uri}> .\n" ntriples << "#{value_node} <#{RDF::OT.value}> '#{value}' .\n" -- cgit v1.2.3 From c2b56cb98075fa74f01eb52f78a78e0c5bd8a697 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 24 Apr 2013 20:09:25 +0200 Subject: additional RDF vocabularies. --- lib/opentox-client.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 1fe084b..b0d0dc9 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -16,6 +16,9 @@ RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' RDF::OLO = RDF::Vocabulary.new 'http://purl.org/ontology/olo/core#' +RDF::TB = RDF::Vocabulary.new "http://onto.toxbank.net/api/" +RDF::ISA = RDF::Vocabulary.new "http://onto.toxbank.net/isa/" +RDF::OWL = RDF::Vocabulary.new "http://www.w3.org/2002/07/owl#" CLASSES = ["Generic", "Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] RDF_FORMATS = [:rdfxml,:ntriples,:turtle] -- cgit v1.2.3 From 4e5063039fd2207799e76b9afd97614c1091303b Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 25 Apr 2013 10:43:30 +0200 Subject: add basic AA --- lib/authorization.rb | 6 +----- lib/dataset.rb | 1 + lib/opentox.rb | 5 ++++- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 361e259..5a846c9 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -283,11 +283,7 @@ module OpenTox # @return [Boolean] true if policy checked/created successfully (or no uri/subjectid given), false else def self.check_policy(uri, subjectid) return true unless uri and subjectid - token_valid = OpenTox::Authorization.is_token_valid(subjectid) - $logger.debug "OpenTox::Authorization.check_policy with uri: #{uri}, subjectid: #{subjectid} is valid: #{token_valid}" - # check if subjectid is valid - unless token_valid - # abort if invalid + unless OpenTox::Authorization.is_token_valid(subjectid) $logger.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{subjectid}" return false end diff --git a/lib/dataset.rb b/lib/dataset.rb index 402d2a1..22c606c 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -123,6 +123,7 @@ module OpenTox # Adding data (@features and @compounds are also writable) def upload filename, wait=true + Authorization.check_policy(@uri, @subjectid) if $aa[:uri] uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}, {:subjectid => @subjectid}) wait_for_task uri if URI.task?(uri) and wait metadata true diff --git a/lib/opentox.rb b/lib/opentox.rb index 309a47d..80df507 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -100,6 +100,7 @@ module OpenTox when 'application/rdf+xml' body = self.to_rdfxml end + Authorization.check_policy(@uri, @subjectid) if $aa[:uri] uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type, :subjectid => @subjectid} wait ? wait_for_task(uri) : uri end @@ -113,6 +114,7 @@ module OpenTox when 'application/rdf+xml' body = self.to_rdfxml end + Authorization.check_policy(@uri, @subjectid) if $aa[:uri] uri = RestClientWrapper.put @uri.to_s, body, { :content_type => mime_type, :subjectid => @subjectid} wait ? wait_for_task(uri) : uri end @@ -120,6 +122,7 @@ module OpenTox # Delete object at webservice def delete RestClientWrapper.delete(@uri.to_s,nil,{:subjectid => @subjectid}) + Authorization.delete_policies_from_uri(@uri, @subjectid) if $aa[:uri] end def service_uri @@ -191,7 +194,7 @@ module OpenTox include OpenTox def self.all subjectid=nil - uris = RestClientWrapper.get(service_uri, {}, :accept => 'text/uri-list').split("\n").compact + uris = RestClientWrapper.get(service_uri, {}, :accept => 'text/uri-list', :subjectid => subjectid).split("\n").compact uris.collect{|uri| self.new(uri, subjectid)} end -- cgit v1.2.3 From 0f9d5366ce75f6fcf29d7adfc37ab8f5dfc9dc75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Thu, 25 Apr 2013 13:47:31 +0300 Subject: removing old comment --- lib/opentox-client.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 1fe084b..ae377bd 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -11,7 +11,6 @@ require 'logger' require "securerandom" # define constants and global variables -#TODO: switch services to 1.2 RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' -- cgit v1.2.3 From 4bc69e53be060e8de1d9938e94b3bb0938016a84 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 26 Apr 2013 17:49:31 +0200 Subject: remove policy check might not be the right one --- lib/dataset.rb | 1 - lib/opentox.rb | 1 - 2 files changed, 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index dd019a1..ec0abdb 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -123,7 +123,6 @@ module OpenTox # Adding data (@features and @compounds are also writable) def upload filename, wait=true - Authorization.check_policy(@uri, @subjectid) if $aa[:uri] uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}, {:subjectid => @subjectid}) wait_for_task uri if URI.task?(uri) and wait metadata true diff --git a/lib/opentox.rb b/lib/opentox.rb index 80df507..040b0df 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -114,7 +114,6 @@ module OpenTox when 'application/rdf+xml' body = self.to_rdfxml end - Authorization.check_policy(@uri, @subjectid) if $aa[:uri] uri = RestClientWrapper.put @uri.to_s, body, { :content_type => mime_type, :subjectid => @subjectid} wait ? wait_for_task(uri) : uri end -- cgit v1.2.3 From 0ca380fc80332e38fe9c230ad60486e3dfef9df3 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 2 May 2013 11:09:05 +0200 Subject: fix AA issues --- lib/opentox.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 040b0df..78a6923 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -25,7 +25,7 @@ module OpenTox # Object metadata (lazy loading) # @return [Hash] Object metadata def metadata force_update=false - if (@metadata.nil? or @metadata.empty? or force_update) and URI.accessible? @uri + if (@metadata.nil? or @metadata.empty? or force_update) and URI.accessible? @uri, @subjectid get if @rdf.nil? or @rdf.empty? or force_update # return values as plain strings instead of RDF objects @metadata = @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } @@ -52,7 +52,7 @@ module OpenTox # {http://opentox.org/dev/apis/api-1.2/interfaces OpenTox API} # @return [Hash] Object parameters def parameters force_update=false - if (@parameters.empty? or force_update) and URI.accessible? @uri + if (@parameters.empty? or force_update) and URI.accessible? @uri, @subjectid get if @rdf.empty? or force_update params = {} query = RDF::Query.new({ @@ -200,7 +200,7 @@ module OpenTox #@example fetching a model # OpenTox::Model.find() -> model-object def self.find uri, subjectid=nil - URI.accessible?(uri) ? self.new(uri, subjectid) : nil + URI.accessible?(uri, subjectid) ? self.new(uri, subjectid) : nil end def self.create metadata, subjectid=nil @@ -226,11 +226,11 @@ module OpenTox end end sparql << "}" - uris = RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n") + uris = RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list", :subjectid => subjectid}).split("\n") if uris.empty? self.create metadata, subjectid else - self.new uris.first + self.new uris.first, subjectid end end -- cgit v1.2.3 From 5430c1f53f544d61a24236ed5c78c5972f102405 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 2 May 2013 12:33:19 +0200 Subject: add subjectid --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index ec0abdb..f261641 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -178,7 +178,7 @@ module OpenTox query = RDF::Query.new({ :uri => { RDF.type => RDF::OT.Compound } }) @compounds = query.execute(@rdf).collect { |solution| OpenTox::Compound.new solution.uri } query = RDF::Query.new({ :uri => { RDF.type => RDF::OT.Feature } }) - @features = query.execute(@rdf).collect { |solution| OpenTox::Feature.new solution.uri } + @features = query.execute(@rdf).collect { |solution| OpenTox::Feature.new solution.uri, @subjectid } @compounds.each_with_index do |c,i| @features.each_with_index do |f,j| end -- cgit v1.2.3 From ae55440e99529c18367f93e3f6e6b40816767f44 Mon Sep 17 00:00:00 2001 From: gebele Date: Tue, 7 May 2013 17:06:27 +0200 Subject: exchanged accessible rule with HEAD request --- lib/overwrite.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index d1f3d9d..10a68e7 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -91,13 +91,15 @@ module URI def self.accessible?(uri, subjectid=nil) parsed_uri = URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : "")) http_code = URI.task?(uri) ? 600 : 400 - unless URI.ssl? uri - Net::HTTP.get_response(parsed_uri).code.to_i < http_code + unless (URI.ssl? uri) == true + http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) + request = Net::HTTP::Head.new(parsed_uri.request_uri) + http.request(request).code.to_i < http_code else http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE - request = Net::HTTP::Get.new(parsed_uri.request_uri) + request = Net::HTTP::Head.new(parsed_uri.request_uri) http.request(request).code.to_i < http_code end rescue -- cgit v1.2.3 From 508cff7269bff31ad3b8f319125522762fe54372 Mon Sep 17 00:00:00 2001 From: gebele Date: Wed, 8 May 2013 10:22:59 +0200 Subject: removed head request from accessible? --- lib/overwrite.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 10a68e7..b758450 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -93,13 +93,13 @@ module URI http_code = URI.task?(uri) ? 600 : 400 unless (URI.ssl? uri) == true http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) - request = Net::HTTP::Head.new(parsed_uri.request_uri) + request = Net::HTTP::Get.new(parsed_uri.request_uri) http.request(request).code.to_i < http_code else http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE - request = Net::HTTP::Head.new(parsed_uri.request_uri) + request = Net::HTTP::Get.new(parsed_uri.request_uri) http.request(request).code.to_i < http_code end rescue -- cgit v1.2.3 From 7fe4a8863cd0876e4b3c932da17b11454b7c2523 Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 10 May 2013 17:12:32 +0200 Subject: changed rdf reader/writer --- lib/error.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/error.rb b/lib/error.rb index eb72144..85ce35d 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -41,7 +41,7 @@ module OpenToxError def to_turtle # redefine to use prefixes (not supported by RDF::Writer) prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } - RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + RDF::Turtle::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| @rdf.each{|statement| writer << statement} if @rdf end end -- cgit v1.2.3 From e2399fc85379066abf0b72803402fc440b61629c Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 10 May 2013 17:14:08 +0200 Subject: changed rdf reader/writer --- lib/opentox.rb | 2 +- lib/task.rb | 2 +- opentox-client.gemspec | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 78a6923..292eb6f 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -167,7 +167,7 @@ module OpenTox prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } create_rdf - RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + RDF::Turtle::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| @rdf.each{|statement| writer << statement} end end diff --git a/lib/task.rb b/lib/task.rb index 944f20c..3cc05c0 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -46,7 +46,7 @@ module OpenTox @rdf << [subject, RDF::OT.errorCode, $!.class.to_s] @rdf << [subject, RDF::OT.errorCause, $!.backtrace[0..cut_index].join("\n")] prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#", :ot => RDF::OT.to_s} - turtle = RDF::N3::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + turtle = RDF::Turtle::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| @rdf.each{|statement| writer << statement} end $logger.error turtle diff --git a/opentox-client.gemspec b/opentox-client.gemspec index f9d333a..dd4d06c 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency "rest-client" s.add_runtime_dependency "rdf" s.add_runtime_dependency "rdf-raptor" - s.add_runtime_dependency 'rdf-n3' + s.add_runtime_dependency 'rdf-turtle' s.add_runtime_dependency "open4" # external requirements -- cgit v1.2.3 From fda7902689d879e593406d3a710f6d6a8c322db7 Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 10 May 2013 17:14:56 +0200 Subject: changed rdf reader/writer --- lib/opentox-client.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 16b8552..02724c2 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -2,7 +2,7 @@ require 'rubygems' require "bundler/setup" require 'rdf' require 'rdf/raptor' -require 'rdf/n3' +require 'rdf/turtle' require "rest-client" require 'uri' require 'yaml' -- cgit v1.2.3 From 11ce0ec19003d177920891e815a2a16f2b53f347 Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 10 May 2013 17:17:22 +0200 Subject: changed accessible rule to HEAD request --- lib/overwrite.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index b758450..10a68e7 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -93,13 +93,13 @@ module URI http_code = URI.task?(uri) ? 600 : 400 unless (URI.ssl? uri) == true http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) - request = Net::HTTP::Get.new(parsed_uri.request_uri) + request = Net::HTTP::Head.new(parsed_uri.request_uri) http.request(request).code.to_i < http_code else http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE - request = Net::HTTP::Get.new(parsed_uri.request_uri) + request = Net::HTTP::Head.new(parsed_uri.request_uri) http.request(request).code.to_i < http_code end rescue -- cgit v1.2.3 From 7def60bb82474c5e12bbc0362476752524e25d53 Mon Sep 17 00:00:00 2001 From: gebele Date: Wed, 15 May 2013 13:43:20 +0200 Subject: require openbabel --- lib/compound.rb | 1 + opentox-client.gemspec | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/compound.rb b/lib/compound.rb index 5d77dec..294aa90 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -1,3 +1,4 @@ +require "openbabel" CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/" module OpenTox diff --git a/opentox-client.gemspec b/opentox-client.gemspec index dd4d06c..872a985 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -25,6 +25,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency "rdf-raptor" s.add_runtime_dependency 'rdf-turtle' s.add_runtime_dependency "open4" + s.add_runtime_dependency "openbabel" # external requirements ["libraptor-dev"].each{|r| s.requirements << r} -- cgit v1.2.3 From 91fb2899d89311ad5f52c1a5aded3a833ea9fb1d Mon Sep 17 00:00:00 2001 From: gebele Date: Wed, 15 May 2013 20:03:00 +0200 Subject: check rdf befor build --- lib/opentox.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 292eb6f..211fc7b 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -129,7 +129,7 @@ module OpenTox end def create_rdf - @rdf = RDF::Graph.new + @rdf = RDF::Graph.new if @rdf.empty? or URI.task?(@uri) @metadata[RDF.type] ||= eval("RDF::OT."+self.class.to_s.split('::').last) @metadata[RDF::DC.date] ||= DateTime.now @metadata.each do |predicate,values| -- cgit v1.2.3 From 3922d47b9695014fddde72aacfe3c6f226491902 Mon Sep 17 00:00:00 2001 From: davor Date: Tue, 21 May 2013 17:43:53 +0200 Subject: Added detailed filter for NominalFeature. --- lib/dataset.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index f261641..8d5f5d1 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -64,7 +64,15 @@ module OpenTox # TODO: fallbacks for external and unordered datasets features.each_with_index do |feature,i| if feature[RDF.type].include? RDF::OT.NumericFeature - @data_entries.each { |row| row[i] = row[i].to_f if row[i] } + if feature[RDF.type].include? RDF::OT.NominalFeature + if feature[RDF.type].include? RDF::OT.StringFeature + @data_entries.each { |row| row[i] = row[i].to_s if row[i] } + else + @data_entries.each { |row| row[i] = row[i] if row[i] } + end + else + @data_entries.each { |row| row[i] = row[i].to_f if row[i] } + end end end end -- cgit v1.2.3 From ccafc5212c633310ad21d043236cc5a440827bf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 28 May 2013 11:23:18 +0200 Subject: added comments to overwrite --- lib/overwrite.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 10a68e7..52b8a9f 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -12,13 +12,14 @@ class Object end module Enumerable + # @return [Array] only the duplicates of an enumerable def duplicates inject({}) {|h,v| h[v]=h[v].to_i+1; h}.reject{|k,v| v==1}.keys end end class String - + # @return [String] converts camel-case to underscore-case (OpenTox::SuperModel -> open_tox/super_model) def underscore self.gsub(/::/, '/'). gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). @@ -88,6 +89,7 @@ module URI URI.parse(uri).instance_of? URI::HTTPS end + # @return [Boolean] checks if resource exists by making a HEAD-request def self.accessible?(uri, subjectid=nil) parsed_uri = URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : "")) http_code = URI.task?(uri) ? 600 : 400 @@ -116,6 +118,7 @@ module URI end class File + # @return [String] mime_type including charset using linux cmd command def mime_type `file -ib #{self.path}`.chomp end @@ -138,6 +141,7 @@ module Kernel internal_server_error $!.message end + # @return [String] uri of task result, if task fails, an error according to task is raised def wait_for_task uri if URI.task?(uri) t = OpenTox::Task.new uri @@ -165,7 +169,7 @@ end class Array - # Sum of an array for Arrays + # Sum up the size of single arrays in an array of arrays # @param [Array] Array of arrays # @return [Integer] Sum of size of array elements def sum_size -- cgit v1.2.3 From 68d1f71f268fde0a36d0e530385c8025dcb5d132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 28 May 2013 12:28:29 +0300 Subject: add comment --- lib/otlogger.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/otlogger.rb b/lib/otlogger.rb index 57b8170..0f0caa4 100644 --- a/lib/otlogger.rb +++ b/lib/otlogger.rb @@ -1,3 +1,5 @@ + +# extend logger to add current source file, line-number and source location where the log command is called class OTLogger < Logger def pwd -- cgit v1.2.3 From 39b094bf106b35fb8fa41fd387bbb43bfe285672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 28 May 2013 12:37:52 +0300 Subject: added short comment --- lib/rest-client-wrapper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 38219c1..f3e6300 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -57,6 +57,7 @@ module OpenTox end end + #@return [Array] of hashes with error code, method and class def self.known_errors errors = [] RestClient::STATUSES.each do |code,k| -- cgit v1.2.3 From 81b0d1f738ccb61f25ffde4162ceead49180f0d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 28 May 2013 12:44:43 +0300 Subject: updating comments --- lib/algorithm.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 455e9ad..530296a 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -5,7 +5,7 @@ module OpenTox # Execute algorithm with parameters, please consult the OpenTox API and the webservice documentation for acceptable parameters # @param [optional,Hash] params Algorithm parameters - # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param [optional,Boolean] set to true if method should wait for task result # @return [String] URI of new resource (dataset, model, ...) def run params=nil, wait=true uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => @subjectid} -- cgit v1.2.3 From 2de472ba1c066aec3d4416b21a68b0b480e9aeb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Tue, 28 May 2013 12:59:31 +0300 Subject: update comments --- lib/authorization.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 5a846c9..4d49b40 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -1,10 +1,10 @@ module OpenTox AA = $aa[:uri] if defined? $aa - AA ||= "https://opensso.in-silico.ch" #if not set in .opentox/conf/[application]/[test].rb + AA ||= "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb #Module for Authorization and Authentication #@example Authentication # require "opentox-client" - # OpenTox::Authorization::AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml + # OpenTox::Authorization::AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb # subjectid = OpenTox::Authorization.authenticate("username", "password") #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification @@ -337,10 +337,11 @@ module OpenTox end private + # @return [Boolean] checks if uri-method pair is included in :free_uri def self.free_uri?(uri, request_method) if $aa[:free_uris] $aa[:free_uris].each do |request_methods,uris| - if request_methods and uris and request_methods.include?(request_method.to_s) + if request_methods and uris and request_methods.include?(request_method.to_sym) uris.each do |u| return true if u.match uri end @@ -350,6 +351,7 @@ module OpenTox return false end + # @return [Boolean] checks if uri-method pair is included in :authorize_exceptions def self.authorize_exception?(uri, request_method) if $aa[:authorize_exceptions] $aa[:authorize_exceptions].each do |request_methods,uris| -- cgit v1.2.3 From 0df97a547ad623cff5d714076addbaa3cc73c53b Mon Sep 17 00:00:00 2001 From: davor Date: Tue, 28 May 2013 12:15:36 +0200 Subject: Replacing tab with two spaces. --- lib/compound.rb | 126 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 294aa90..2eccdcd 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -4,7 +4,7 @@ CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/" module OpenTox # Ruby wrapper for OpenTox Compound Webservices (http://opentox.org/dev/apis/api-1.2/structure). - class Compound + class Compound # Create a compound from smiles string # @example @@ -40,57 +40,57 @@ module OpenTox Compound.new RestClientWrapper.post(service_uri, @inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) end - # Get InChI + # Get InChI # @return [String] InChI string - def inchi + def inchi @inchi ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-inchi'}).chomp - end + end - # Get InChIKey + # Get InChIKey # @return [String] InChI string - def inchikey + def inchikey @inchikey ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-inchikey'}).chomp - end + end - # Get (canonical) smiles + # Get (canonical) smiles # @return [String] Smiles string - def smiles + def smiles @smiles ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-daylight-smiles'}).chomp - end + end # Get sdf # @return [String] SDF string - def sdf + def sdf RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-mdl-sdfile'}).chomp - end + end # Get gif image # @return [image/gif] Image data - def gif + def gif RestClientWrapper.get File.join(CACTUS_URI,inchi,"image") - end + end # Get png image # @example # image = compound.png # @return [image/png] Image data - def png + def png RestClientWrapper.get(File.join @uri, "image") - end + end # Get URI of compound image # @return [String] Compound image URI - def image_uri + def image_uri File.join @uri, "image" - end + end # Get all known compound names. Relies on an external service for name lookups. # @example # names = compound.names # @return [String] Compound names - def names + def names RestClientWrapper.get("#{CACTUS_URI}#{inchi}/names").split("\n") - end + end def cid pug_uri = "http://pubchem.ncbi.nlm.nih.gov/rest/pug/" @@ -107,40 +107,40 @@ module OpenTox end =begin - # Match a smarts string + # Match a smarts string # @example # compound = OpenTox::Compound.from_name("Benzene") # compound.match?("cN") # returns false # @param [String] smarts Smarts string - def match?(smarts) - obconversion = OpenBabel::OBConversion.new - obmol = OpenBabel::OBMol.new - obconversion.set_in_format('inchi') - obconversion.read_string(obmol,@inchi) - smarts_pattern = OpenBabel::OBSmartsPattern.new - smarts_pattern.init(smarts) - smarts_pattern.match(obmol) - end - - # Match an array of smarts strings, returns array with matching smarts + def match?(smarts) + obconversion = OpenBabel::OBConversion.new + obmol = OpenBabel::OBMol.new + obconversion.set_in_format('inchi') + obconversion.read_string(obmol,@inchi) + smarts_pattern = OpenBabel::OBSmartsPattern.new + smarts_pattern.init(smarts) + smarts_pattern.match(obmol) + end + + # Match an array of smarts strings, returns array with matching smarts # @example # compound = OpenTox::Compound.from_name("Benzene") # compound.match(['cc','cN']) # returns ['cc'] # @param [Array] smarts_array Array with Smarts strings # @return [Array] Array with matching Smarts strings - def match(smarts_array) + def match(smarts_array) # avoid recreation of OpenBabel objects - obconversion = OpenBabel::OBConversion.new - obmol = OpenBabel::OBMol.new - obconversion.set_in_format('inchi') - obconversion.read_string(obmol,@inchi) - smarts_pattern = OpenBabel::OBSmartsPattern.new - smarts_array.collect do |smarts| + obconversion = OpenBabel::OBConversion.new + obmol = OpenBabel::OBMol.new + obconversion.set_in_format('inchi') + obconversion.read_string(obmol,@inchi) + smarts_pattern = OpenBabel::OBSmartsPattern.new + smarts_array.collect do |smarts| smarts_pattern.init(smarts) smarts if smarts_pattern.match(obmol) end.compact #smarts_array.collect { |s| s if match?(s)}.compact - end + end # Get URI of compound image with highlighted fragments # @@ -157,33 +157,33 @@ module OpenTox private # Convert sdf to inchi - def self.sdf2inchi(sdf) - Compound.obconversion(sdf,'sdf','inchi') - end + def self.sdf2inchi(sdf) + Compound.obconversion(sdf,'sdf','inchi') + end # Convert smiles to inchi - def self.smiles2inchi(smiles) - Compound.obconversion(smiles,'smi','inchi') - end + def self.smiles2inchi(smiles) + Compound.obconversion(smiles,'smi','inchi') + end # Convert smiles to canonical smiles - def self.smiles2cansmi(smiles) - Compound.obconversion(smiles,'smi','can') - end + def self.smiles2cansmi(smiles) + Compound.obconversion(smiles,'smi','can') + end # Convert identifier from OpenBabel input_format to OpenBabel output_format - def self.obconversion(identifier,input_format,output_format) - obconversion = OpenBabel::OBConversion.new - obmol = OpenBabel::OBMol.new - obconversion.set_in_and_out_formats input_format, output_format - obconversion.read_string obmol, identifier - case output_format - when /smi|can|inchi/ - obconversion.write_string(obmol).gsub(/\s/,'').chomp - else - obconversion.write_string(obmol) - end - end + def self.obconversion(identifier,input_format,output_format) + obconversion = OpenBabel::OBConversion.new + obmol = OpenBabel::OBMol.new + obconversion.set_in_and_out_formats input_format, output_format + obconversion.read_string obmol, identifier + case output_format + when /smi|can|inchi/ + obconversion.write_string(obmol).gsub(/\s/,'').chomp + else + obconversion.write_string(obmol) + end + end =end @@ -207,7 +207,7 @@ module OpenTox smarts_array.collect do |smarts| smarts_pattern.init(smarts) if smarts_pattern.match(obmol) - if use_hits + if use_hits hits = smarts_pattern.get_map_list smarts_hits[smarts] = hits.to_a.size else @@ -223,5 +223,5 @@ module OpenTox match_hits(smarts_array,false) end - end + end end -- cgit v1.2.3 From ef122484598a8979de915344cdeff475cff752c5 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 29 May 2013 15:03:22 +0200 Subject: authorization.rb merge free_uri? and authorize_exceptions? --- lib/authorization.rb | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 4d49b40..469c16c 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -337,33 +337,24 @@ module OpenTox end private - # @return [Boolean] checks if uri-method pair is included in :free_uri - def self.free_uri?(uri, request_method) - if $aa[:free_uris] - $aa[:free_uris].each do |request_methods,uris| - if request_methods and uris and request_methods.include?(request_method.to_sym) - uris.each do |u| - return true if u.match uri - end - end - end - end - return false - end - - # @return [Boolean] checks if uri-method pair is included in :authorize_exceptions - def self.authorize_exception?(uri, request_method) - if $aa[:authorize_exceptions] - $aa[:authorize_exceptions].each do |request_methods,uris| - if request_methods and uris and request_methods.include?(request_method.to_sym) - uris.each do |u| - return true if u.match uri + # extend class methods + class << self + # methods: free_uri and authorize_exception + # @return [Boolean] checks if uri-method pair is included in $aa[:free_uri] or $aa[:authorize_exception] + [:free_uri, :authorize_exception].each do |method| + define_method "#{method}?".to_sym do |uri, request_method| + if $aa["#{method}s".to_sym] + $aa["#{method}s".to_sym].each do |request_methods, uris| + if request_methods and uris and request_methods.include?(request_method.to_sym) + uris.each do |u| + return true if u.match uri + end + end end end + return false end end - return false end - end end -- cgit v1.2.3 From 0f770837cbfe17fe17fc86aa0d360c55e281c7f7 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 29 May 2013 15:10:46 +0200 Subject: modification date inserted at client to improve performance --- lib/compound.rb | 2 +- lib/opentox.rb | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/compound.rb b/lib/compound.rb index 5d77dec..2bef69e 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -183,7 +183,6 @@ module OpenTox obconversion.write_string(obmol) end end -=end @@ -221,6 +220,7 @@ module OpenTox def match(smarts_array) match_hits(smarts_array,false) end +=end end end diff --git a/lib/opentox.rb b/lib/opentox.rb index 78a6923..04edd0c 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -108,6 +108,8 @@ module OpenTox # Save object at webservice (replace or create object) def put wait=true, mime_type="text/plain" bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" + @metadata[RDF::OT.created_at] = DateTime.now unless URI.accessible? @uri, @subjectid + @metadata[RDF::DC.modified] = DateTime.now case mime_type when 'text/plain' body = self.to_ntriples -- cgit v1.2.3 From 962773d59d94f8d16dae11b6290fdf30aaf09d7b Mon Sep 17 00:00:00 2001 From: rautenberg Date: Mon, 3 Jun 2013 15:25:33 +0200 Subject: make yard documentation full yard 0.8.6.1 compatible --- lib/algorithm.rb | 4 +- lib/authorization.rb | 49 ++++++++++++------- lib/compound.rb | 9 ++-- lib/dataset.rb | 58 +++++++++++----------- lib/model.rb | 4 +- lib/opentox.rb | 10 ++-- lib/overwrite.rb | 21 ++++---- lib/policy.rb | 17 +++---- lib/validation.rb | 132 +++++++++++++++++++++++++-------------------------- 9 files changed, 158 insertions(+), 146 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 530296a..8576681 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -1,11 +1,11 @@ module OpenTox # Wrapper for OpenTox Algorithms - class Algorithm + class Algorithm # Execute algorithm with parameters, please consult the OpenTox API and the webservice documentation for acceptable parameters # @param [optional,Hash] params Algorithm parameters - # @param [optional,Boolean] set to true if method should wait for task result + # @param [optional,Boolean] wait set to true if method should wait for task result # @return [String] URI of new resource (dataset, model, ...) def run params=nil, wait=true uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => @subjectid} diff --git a/lib/authorization.rb b/lib/authorization.rb index 469c16c..7f0e840 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -6,6 +6,7 @@ module OpenTox # require "opentox-client" # OpenTox::Authorization::AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb # subjectid = OpenTox::Authorization.authenticate("username", "password") + # puts OpenTox::Authorization.authorize("http://example.uri/testpath/", "GET", subjectid) #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification module Authorization @@ -29,7 +30,7 @@ module OpenTox #Cleans AA Policies and loads default xml file into policy attribute #set uri and user, returns Policyfile(XML) for open-sso - # @param [String] URI to create a policy for + # @param uri [String] URI to create a policy for def get_xml(uri) @policy.drop_policies @policy.load_default_policy(@user, uri) @@ -37,7 +38,7 @@ module OpenTox end #Loads and sends Policyfile(XML) to open-sso server - # @param [String] URI to create a policy for + # @param uri [String] URI to create a policy for def send(uri) xml = get_xml(uri) ret = false @@ -57,7 +58,8 @@ module OpenTox end #Authentication against OpenSSO. Returns token. Requires Username and Password. - # @param [String, String]Username,Password + # @param user [String] Username + # @param pw [String] Password # @return [String, nil] gives subjectid or nil def self.authenticate(user, pw) return nil if !AA @@ -71,7 +73,7 @@ module OpenTox end #Logout on opensso. Make token invalid. Requires token - # @param [String]subjectid the subjectid + # @param [String] subjectid the subjectid # @return [Boolean] true if logout is OK def self.logout(subjectid) begin @@ -84,7 +86,9 @@ module OpenTox end #Authorization against OpenSSO for a URI with request-method (action) [GET/POST/PUT/DELETE] - # @param [String,String,String]uri,action,subjectid + # @param [String] uri URI to request + # @param [String] action request method + # @param [String] subjectid # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). def self.authorize(uri, action, subjectid) return true if !AA @@ -118,7 +122,8 @@ module OpenTox end #Returns a policy in xml-format - # @param [String, String]policy,subjectid + # @param policy [String] policyname + # @param subjectid [String] # @return [String] XML of the policy def self.list_policy(policy, subjectid) begin @@ -150,7 +155,8 @@ module OpenTox end #Returns the owner (who created the first policy) of an URI - # @param [String, String]uri,subjectid + # @param uri [String] URI + # @param subjectid [String] subjectid # return [String, nil]owner,nil returns owner of the URI def self.get_uri_owner(uri, subjectid) begin @@ -161,14 +167,16 @@ module OpenTox end #Returns true or false if owner (who created the first policy) of an URI - # @param [String, String]uri,subjectid + # @param uri [String] URI + # @param subjectid [String] # return [Boolean]true,false status of ownership of the URI def self.uri_owner?(uri, subjectid) get_uri_owner(uri, subjectid) == get_user(subjectid) end #Checks if a policy exists to a URI. Requires URI and token. - # @param [String, String]uri,subjectid + # @param uri [String] URI + # @param subjectid [String] # return [Boolean] def self.uri_has_policy(uri, subjectid) owner = get_uri_owner(uri, subjectid) @@ -177,7 +185,8 @@ module OpenTox end #List all policynames for a URI. Requires URI and token. - # @param [String, String]uri,subjectid + # @param uri [String] URI + # @param subjectid [String] # return [Array, nil] returns an Array of policy names or nil if request fails def self.list_uri_policies(uri, subjectid) begin @@ -194,7 +203,8 @@ module OpenTox end #Sends a policy in xml-format to opensso server. Requires policy-xml and token. - # @param [String, String]policyxml,subjectid + # @param policy [String] XML string of a policy + # @param subjectid [String] # return [Boolean] returns true if policy is created def self.create_policy(policy, subjectid) begin @@ -206,7 +216,8 @@ module OpenTox end #Deletes a policy - # @param [String, String]policyname,subjectid + # @param policy [String] policyname + # @param subjectid [String] # @return [Boolean,nil] def self.delete_policy(policy, subjectid) begin @@ -254,7 +265,8 @@ module OpenTox end #Send default policy with Authorization::Helper class - # @param [String, String]URI,subjectid + # @param uri [String] URI + # @param subjectid [String] def self.send_policy(uri, subjectid) return true if !AA aa = Authorization::Helper.new(subjectid) @@ -264,7 +276,8 @@ module OpenTox end #Deletes all policies of an URI - # @param [String, String]URI,subjectid + # @param uri [String] URI + # @param subjectid [String] # @return [Boolean] def self.delete_policies_from_uri(uri, subjectid) policies = list_uri_policies(uri, subjectid) @@ -308,9 +321,9 @@ module OpenTox end # Check Authorization for a resource (identified via URI) with method and subjectid. - # @param [String] uri - # @param [String] request_method, should be GET, POST, PUT, DELETE - # @param [String] subjectid + # @param uri [String] URI + # @param request_method [String] GET, POST, PUT, DELETE + # @param subjectid [String] # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method, subjectid) request_method = request_method.to_sym if request_method @@ -345,7 +358,7 @@ module OpenTox define_method "#{method}?".to_sym do |uri, request_method| if $aa["#{method}s".to_sym] $aa["#{method}s".to_sym].each do |request_methods, uris| - if request_methods and uris and request_methods.include?(request_method.to_sym) + if request_methods and uris and request_methods.include?(request_method.to_sym) uris.each do |u| return true if u.match uri end diff --git a/lib/compound.rb b/lib/compound.rb index 2eccdcd..a278244 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -16,14 +16,14 @@ module OpenTox end # Create a compound from inchi string - # @param [String] smiles InChI string + # @param inchi [String] smiles InChI string # @return [OpenTox::Compound] Compound def self.from_inchi inchi, subjectid=nil Compound.new RestClientWrapper.post(service_uri, inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) end # Create a compound from sdf string - # @param [String] smiles SDF string + # @param sdf [String] smiles SDF string # @return [OpenTox::Compound] Compound def self.from_sdf sdf, subjectid=nil Compound.new RestClientWrapper.post(service_uri, sdf, {:content_type => 'chemical/x-mdl-sdfile', :subjectid => subjectid}) @@ -32,9 +32,8 @@ module OpenTox # Create a compound from name. Relies on an external service for name lookups. # @example # compound = OpenTox::Compound.from_name("Benzene") - # @param [String] name name can be also an InChI/InChiKey, CAS number, etc + # @param name [String] can be also an InChI/InChiKey, CAS number, etc # @return [OpenTox::Compound] Compound - # def self.from_name name, subjectid=nil @inchi = RestClientWrapper.get File.join(CACTUS_URI,URI.escape(name),"stdinchi") Compound.new RestClientWrapper.post(service_uri, @inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) @@ -191,7 +190,7 @@ module OpenTox # Match an array of smarts strings, returns hash # Keys: matching smarts, values: number of non-unique hits, or 1 # @param [Array] smarts_array Array with Smarts strings - # @param [Boolean] Whether non-unique hits or 1 should be produced + # @param use_hits [Boolean] Whether non-unique hits or 1 should be produced # @return [Array] Array with matching Smarts strings # @example { # compound = Compound.from_name("Benzene") diff --git a/lib/dataset.rb b/lib/dataset.rb index 8d5f5d1..19d05c9 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -3,7 +3,7 @@ require 'csv' module OpenTox # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). - class Dataset + class Dataset attr_writer :features, :compounds, :data_entries @@ -46,7 +46,7 @@ module OpenTox end @compounds end - + def data_entries force_update=false if @data_entries.empty? or force_update sparql = "SELECT ?cidx ?fidx ?value FROM <#{uri}> WHERE { @@ -55,7 +55,7 @@ module OpenTox ?v <#{RDF::OT.feature}> ?f; <#{RDF::OT.value}> ?value . ?f <#{RDF::OLO.index}> ?fidx. - } ORDER BY ?fidx ?cidx" + } ORDER BY ?fidx ?cidx" RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n").each do |row| r,c,v = row.split("\t") @data_entries[r.to_i] ||= [] @@ -79,9 +79,9 @@ module OpenTox @data_entries end - # Find data entry values for a given compound and feature - # @param [OpenTox::Compound] Compound - # @param [OpenTox::Feature] Feature + # Find data entry values for a given compound and feature + # @param compound [OpenTox::Compound] OpenTox Compound object + # @param feature [OpenTox::Feature] OpenTox Feature object # @return [Array] Data entry values def values(compound, feature) rows = (0 ... compounds.length).select { |r| compounds[r].uri == compound.uri } @@ -92,14 +92,14 @@ module OpenTox # Convenience methods to search by compound/feature URIs # Search a dataset for a feature given its URI - # @param [String] Feature URI + # @param uri [String] Feature URI # @return [OpenTox::Feature] Feature object, or nil if not present def find_feature_uri(uri) features.select{|f| f.uri == uri}.first end # Search a dataset for a compound given its URI - # @param [String] Compound URI + # @param uri [String] Compound URI # @return [OpenTox::Compound] Compound object, or nil if not present def find_compound_uri(uri) compounds.select{|f| f.uri == uri}.first @@ -133,7 +133,7 @@ module OpenTox def upload filename, wait=true uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}, {:subjectid => @subjectid}) wait_for_task uri if URI.task?(uri) and wait - metadata true + metadata true @uri end @@ -173,7 +173,7 @@ module OpenTox end RDF_FORMATS.each do |format| - + # redefine rdf parse methods for all formats e.g. parse_rdfxml send :define_method, "parse_#{format}".to_sym do |rdf| # TODO: parse ordered dataset @@ -194,13 +194,13 @@ module OpenTox end - # redefine rdf serialization methods + # redefine rdf serialization methods send :define_method, "to_#{format}".to_sym do - @metadata[RDF.type] = RDF::OT.OrderedDataset + @metadata[RDF.type] = RDF::OT.OrderedDataset create_rdf @features.each_with_index do |feature,i| - @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Feature)] - @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] + @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Feature)] + @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] end @compounds.each_with_index do |compound,i| @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Compound)] @@ -246,8 +246,8 @@ module OpenTox parameter.each { |k,v| ntriples << "#{p_node} <#{k}> '#{v}' .\n" } end @features.each_with_index do |feature,i| - ntriples << "<#{feature.uri}> <#{RDF.type}> <#{RDF::OT.Feature}> .\n" - ntriples << "<#{feature.uri}> <#{RDF::OLO.index}> '#{i}' .\n" + ntriples << "<#{feature.uri}> <#{RDF.type}> <#{RDF::OT.Feature}> .\n" + ntriples << "<#{feature.uri}> <#{RDF::OLO.index}> '#{i}' .\n" end @compounds.each_with_index do |compound,i| ntriples << "<#{compound.uri}> <#{RDF.type}> <#{RDF::OT.Compound}> .\n" @@ -276,21 +276,21 @@ module OpenTox =end # Methods for for validation service - + def split( compound_indices, feats, metadata, subjectid=nil) - + bad_request_error "Dataset.split : Please give compounds as indices" if compound_indices.size==0 or !compound_indices[0].is_a?(Fixnum) bad_request_error "Dataset.split : Please give features as feature objects (given: #{feats})" if feats!=nil and feats.size>0 and !feats[0].is_a?(OpenTox::Feature) dataset = OpenTox::Dataset.new(nil, subjectid) dataset.metadata = metadata dataset.features = (feats ? feats : self.features) compound_indices.each do |c_idx| - dataset << [ self.compounds[c_idx] ] + dataset.features.each_with_index.collect{|f,f_idx| self.data_entries[c_idx][f_idx]} + dataset << [ self.compounds[c_idx] ] + dataset.features.each_with_index.collect{|f,f_idx| self.data_entries[c_idx][f_idx]} end dataset.put - dataset + dataset end - + # maps a compound-index from another dataset to a compound-index from this dataset # mapping works as follows: @@ -299,8 +299,8 @@ module OpenTox # * c occurs >1 in this dataset? # ** number of occurences is equal in both datasets? assume order is preserved(!) and map accordingly # ** number of occurences is not equal in both datasets? cannot map, raise error - # @param [OpenTox::Dataset] dataset that should be mapped to this dataset (fully loaded) - # @param [Fixnum] compound_index, corresponding to dataset + # @param dataset [OpenTox::Dataset] dataset that should be mapped to this dataset (fully loaded) + # @param compound_index [Fixnum], corresponding to dataset def compound_index( dataset, compound_index ) unless defined?(@index_map) and @index_map[dataset.uri] map = {} @@ -308,7 +308,7 @@ module OpenTox self_indices = compound_indices(compound) next unless self_indices dataset_indices = dataset.compound_indices(compound) - if self_indices.size==1 + if self_indices.size==1 dataset_indices.size.times do |i| map[dataset_indices[i]] = self_indices[0] end @@ -321,13 +321,13 @@ module OpenTox raise "cannot map compound #{compound} from dataset #{dataset.uri} to dataset #{uri}, "+ "compound occurs #{dataset_indices.size} times and #{self_indices.size} times" end - end + end @index_map = {} unless defined?(@index_map) @index_map[dataset.uri] = map end @index_map[dataset.uri][compound_index] - end - + end + def compound_indices( compound ) unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound) @cmp_indices = {} @@ -337,12 +337,12 @@ module OpenTox @cmp_indices[c] = [i] else @cmp_indices[c] = @cmp_indices[c]+[i] - end + end end end @cmp_indices[compound] end - + def data_entry_value(compound_index, feature_uri) data_entries(true) if @data_entries.empty? col = @features.collect{|f| f.uri}.index feature_uri diff --git a/lib/model.rb b/lib/model.rb index a354cfa..e49eff3 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -3,8 +3,8 @@ module OpenTox class Model # Run a model with parameters - # @param [Hash] params Parameters for OpenTox model - # @param [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param params [Hash] Parameters for OpenTox model + # @param wait [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [text/uri-list] Task or resource URI def run params=nil, wait=true uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => @subjectid} diff --git a/lib/opentox.rb b/lib/opentox.rb index 211fc7b..171e397 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -11,8 +11,8 @@ module OpenTox # Ruby interface # Create a new OpenTox object - # @param [optional,String] URI - # @param [optional,String] subjectid + # @param uri [optional,String] URI + # @param subjectid [optional,String] # @return [OpenTox] OpenTox object def initialize uri=nil, subjectid=nil @rdf = RDF::Graph.new @@ -34,7 +34,7 @@ module OpenTox end # Metadata values - # @param [String] Predicate URI + # @param predicate [String] Predicate URI # @return [Array, String] Predicate value(s) def [](predicate) return nil if metadata[predicate].nil? @@ -42,8 +42,8 @@ module OpenTox end # Set a metadata entry - # @param [String] Predicate URI - # @param [Array, String] Predicate value(s) + # @param predicate [String] Predicate URI + # @param values [Array, String] Predicate value(s) def []=(predicate,values) @metadata[predicate] = [values].flatten end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 52b8a9f..6a71338 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -38,19 +38,18 @@ class String # format of text (=string params) is preserved (e.g. line breaks) # urls are marked as links # - # @param [String] text this is the actual content, - # @param [optional,String] related_links info on related resources - # @param [optional,String] description general info - # @param [optional,Array] post_command, infos for the post operation, object defined below + # @param related_links [optional,String] uri on related resources + # @param description [optional,String] general info + # @param png_image [optional,String] imagename # @return [String] html page def to_html(related_links=nil, description=nil, png_image=nil ) - + # TODO add title as parameter title = nil #$sinatra.to($sinatra.request.env['PATH_INFO'], :full) if $sinatra html = "" html << ""+title+"" if title #html += "<\/img>" - + html << "

Description

"+description.link_urls+"

" if description html << "

Related links

"+related_links.link_urls+"

" if related_links html << "

Content

" if description || related_links @@ -60,7 +59,7 @@ class String html << "

" html end - + def uri? URI.valid?(self) end @@ -76,7 +75,7 @@ module URI def self.task? uri uri =~ /task/ and URI.valid? uri end - + def self.dataset? uri, subjectid=nil uri =~ /dataset/ and URI.accessible? uri, subjectid=nil end @@ -119,7 +118,7 @@ end class File # @return [String] mime_type including charset using linux cmd command - def mime_type + def mime_type `file -ib #{self.path}`.chomp end end @@ -138,12 +137,12 @@ module Kernel internal_server_error "`" + cmd + "` failed.\n" + stdout + stderr unless status.success? return stdout rescue - internal_server_error $!.message + internal_server_error $!.message end # @return [String] uri of task result, if task fails, an error according to task is raised def wait_for_task uri - if URI.task?(uri) + if URI.task?(uri) t = OpenTox::Task.new uri t.wait unless t.completed? diff --git a/lib/policy.rb b/lib/policy.rb index 3e7c143..e5676ba 100644 --- a/lib/policy.rb +++ b/lib/policy.rb @@ -3,7 +3,7 @@ module OpenTox #Module for policy-processing # @see also http://www.opentox.org/dev/apis/api-1.2/AA for opentox API specs - # Class Policies corresponds to container of an xml-policy-fle + # Class Policies corresponds to container of an xml-policy-file class Policies #Hash for policy objects see {Policy Policy} @@ -205,12 +205,13 @@ module OpenTox end # Subject type LDAPUsers or LDAPGroups + # @return [String] def type @subject.type end # Set subject type - # @param [String],type + # @param type [String] the subjecttype def type=(type) @subject.type = type end @@ -221,19 +222,19 @@ module OpenTox end # sets LDAP Distinguished Name (DN) for policy e.g. - # @param [String],LDAPString + # @param value [String] LDAPString def value=(value) @subject.value = value end # uri affected by policy - # @return uri affected by policy + # @return [String] uri affected by policy def uri @rule.uri end # sets uri affected by policy - # @param [String] set URI + # @param uri [String] set URI def uri=(uri) @rule.uri = uri end @@ -251,14 +252,14 @@ module OpenTox end # helper method sets value and type to opentox LDAP Distinguished Name (DN) of a user - # @param [String]Username set a username into LDAP DN + # @param username [String] set a username into LDAP DN def set_ot_user(username) self.value = "uid=#{username},ou=people,dc=opentox,dc=org" self.type = "LDAPUsers" true end - # @param [String]Username set a groupname into LDAP DN + # @param groupname [String] Username set a groupname into LDAP DN def set_ot_group(groupname) self.value = "cn=#{groupname},ou=groups,dc=opentox,dc=org" self.type = "LDAPGroups" @@ -277,7 +278,7 @@ module OpenTox end #Set Rule attribute for request-method GET - # @param [String]value (allow,deny,nil) + # @param value [String] (allow,deny,nil) def get=(value) @get = check_value(value, @get) end diff --git a/lib/validation.rb b/lib/validation.rb index c4f6868..cb73ce6 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -2,7 +2,7 @@ require "yaml" module OldOpenTox attr_accessor :metadata, :uri - + def initialize(uri=nil) @metadata = {} self.uri = uri if uri @@ -13,17 +13,17 @@ module OldOpenTox yaml = OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid, :accept => "application/x-yaml"}) @metadata = YAML.load(yaml) end - + def delete (subjectid=nil) OpenTox::RestClientWrapper.delete(@uri.to_s,nil,{:subjectid => subjectid}) end end module OpenTox - + class Validation include OldOpenTox - + # find validation, raises error if not found # @param [String] uri # @param [String,optional] subjectid @@ -33,10 +33,10 @@ module OpenTox val.load_metadata( subjectid ) val end - + # returns a filtered list of validation uris - # @param [Hash,optional] params, validation-params to filter the uris (could be model, training_dataset, ..) - # @return [Array] + # @param params [Hash,optional] validation-params to filter the uris (could be model, training_dataset, ..) + # @return [Array] def self.list( params={} ) filter_string = "" params.each do |k,v| @@ -46,7 +46,7 @@ module OpenTox end (OpenTox::RestClientWrapper.get($validation[:uri]+filter_string).split("\n")) end - + # creates a training test split validation, waits until it finishes, may take some time # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,split_ratio(0.67),random_seed(1)) # @param [String,optional] subjectid @@ -58,7 +58,7 @@ module OpenTox params,{:content_type => "text/uri-list"},waiting_task ) Validation.new(wait_for_task(uri)) end - + # creates a training test validation, waits until it finishes, may take some time # @param [Hash] params (required:algorithm_uri,training_dataset_uri,prediction_feature,test_dataset_uri,optional:algorithm_params) # @param [String,optional] subjectid @@ -70,7 +70,7 @@ module OpenTox params,{:content_type => "text/uri-list"},waiting_task ) Validation.new(wait_for_task(uri)) end - + # creates a bootstrapping validation, waits until it finishes, may take some time # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,random_seed(1)) # @param [String,optional] subjectid @@ -82,7 +82,7 @@ module OpenTox params,{:content_type => "text/uri-list"},waiting_task ) Validation.new(wait_for_task(uri)) end - + # looks for report for this validation, creates a report if no report is found # @param [String,optional] subjectid # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly @@ -92,20 +92,20 @@ module OpenTox @report = ValidationReport.create(@uri, {}, subjectid, waiting_task) unless @report @report.uri end - + # creates a validation object from crossvaldiation statistics, raise error if not found # (as crossvaldiation statistics are returned as an average valdidation over all folds) - # @param [String] crossvalidation uri + # @param crossvalidation_uri [String] crossvalidation uri # @param [String,optional] subjectid # @return [OpenTox::Validation] def self.from_cv_statistics( crossvalidation_uri, subjectid=nil ) find( File.join(crossvalidation_uri, 'statistics'),subjectid ) end - + # returns confusion matrix as array, predicted values are in rows # example: # [[nil,"active","moderate","inactive"],["active",1,3,99],["moderate",4,2,8],["inactive",3,8,6]] - # -> 99 inactive compounds have been predicted as active + # -> 99 inactive compounds have been predicted as active def confusion_matrix raise "no classification statistics, probably a regression valdiation" unless @metadata[RDF::OT.classificationStatistics] matrix = @metadata[RDF::OT.classificationStatistics][RDF::OT.confusionMatrix][RDF::OT.confusionMatrixCell] @@ -124,38 +124,38 @@ module OpenTox end table end - + # returns probability-distribution for a given prediction # it takes all predictions into account that have a confidence value that is >= confidence and that have the same predicted value # (minimum 12 predictions with the hightest confidence are selected (even if the confidence is lower than the given param) - # - # @param [Float] confidence value (between 0 and 1) - # @param [String] predicted value - # @param [String,optional] subjectid + # + # @param confidence [Float] confidence value (between 0 and 1) + # @param prediction [String] predicted value + # @param subjectid [String,optional] # @return [Hash] see example # # Example 1: - # validation.probabilities(0.3,"active") - # -> {:min_confidence=>0.32, :num_predictions=>20, :probs=>{"active"=>0.7, "moderate"=>0.25 "inactive"=>0.05}} + # validation.probabilities(0.3,"active") + # -> { :min_confidence=>0.32, :num_predictions=>20, :probs=>{"active"=>0.7, "moderate"=>0.25 "inactive"=>0.05 } } # there have been 20 "active" predictions with confidence >= 0.3, 70 percent of them beeing correct # # Example 2: - # validation.probabilities(0.8,"active") - # -> {:min_confidence=>0.45, :num_predictions=>12, :probs=>{"active"=>0.9, "moderate"=>0.1 "inactive"=>0}} + # validation.probabilities(0.8,"active") + # -> { :min_confidence=>0.45, :num_predictions=>12, :probs=>{"active"=>0.9, "moderate"=>0.1 "inactive"=>0 } } # the given confidence value was to high (i.e. <12 predictions with confidence value >= 0.8) # the top 12 "active" predictions have a min_confidence of 0.45, 90 percent of them beeing correct - # + # def probabilities( confidence, prediction, subjectid=nil ) YAML.load(OpenTox::RestClientWrapper.get(@uri+"/probabilities?prediction="+prediction.to_s+"&confidence="+confidence.to_s,nil, {:subjectid => subjectid, :accept => "application/x-yaml"})) end end - + class Crossvalidation include OldOpenTox attr_reader :report - + # find crossvalidation, raises error if not found # @param [String] uri # @param [String,optional] subjectid @@ -165,10 +165,10 @@ module OpenTox cv.load_metadata( subjectid ) cv end - + # returns a filtered list of crossvalidation uris - # @param [Hash,optional] params, crossvalidation-params to filter the uris (could be algorithm, dataset, ..) - # @return [Array] + # @param params [Hash,optional] crossvalidation-params to filter the uris (could be algorithm, dataset, ..) + # @return [Array] def self.list( params={} ) filter_string = "" params.each do |k,v| @@ -201,29 +201,29 @@ module OpenTox @report = CrossvalidationReport.create(@uri, subjectid, waiting_task) unless @report @report.uri end - + # loads metadata via yaml from crossvalidation object # fields (like for example the validations) can be acces via validation.metadata[RDF::OT.validation] def load_metadata( subjectid=nil ) @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid, :accept => "application/x-yaml"})) end - + # returns a Validation object containing the statistics of the crossavlidation def statistics( subjectid=nil ) Validation.from_cv_statistics( @uri, subjectid ) end - + # documentation see OpenTox::Validation.probabilities def probabilities( confidence, prediction, subjectid=nil ) YAML.load(OpenTox::RestClientWrapper.get(@uri+"/statistics/probabilities?prediction="+prediction.to_s+"&confidence="+confidence.to_s,nil, {:subjectid => subjectid, :accept => "application/x-yaml"})) end - + end - + class ValidationReport include OldOpenTox - + # finds ValidationReport via uri, raises error if not found # @param [String] uri # @param [String,optional] subjectid @@ -234,23 +234,23 @@ module OpenTox rep.load_metadata( subjectid ) rep end - + # finds ValidationReport for a particular validation - # @param [String] crossvalidation uri - # @param [String,optional] subjectid + # @param validation_uri [String] crossvalidation uri + # @param subjectid [String,optional] # @return [OpenTox::ValidationReport] nil if no report found def self.find_for_validation( validation_uri, subjectid=nil ) uris = RestClientWrapper.get(File.join($validation[:uri], "/report/validation?validation="+validation_uri),nil,{:subjectid => subjectid}).chomp.split("\n") uris.size==0 ? nil : ValidationReport.new(uris[-1]) end - + # creates a validation report via validation - # @param [String] validation uri - # @param [Hash] params addiditonal possible + # @param validation_uri [String] validation uri + # @param params [Hash] params addiditonal possible # (min_confidence, params={}, min_num_predictions, max_num_predictions) - # @param [String,optional] subjectid - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param subjectid [String,optional] + # @param waiting_task [OpenTox::Task,optional] (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::ValidationReport] def self.create( validation_uri, params={}, subjectid=nil, waiting_task=nil ) params = {} if params==nil @@ -262,12 +262,12 @@ module OpenTox uri = wait_for_task(uri) ValidationReport.new(uri) end - + end class CrossvalidationReport include OldOpenTox - + # finds CrossvalidationReport via uri, raises error if not found # @param [String] uri # @param [String,optional] subjectid @@ -278,21 +278,21 @@ module OpenTox rep.load_metadata( subjectid ) rep end - + # finds CrossvalidationReport for a particular crossvalidation - # @param [String] crossvalidation uri - # @param [String,optional] subjectid + # @param crossvalidation_uri [String] crossvalidation uri + # @param subjectid [String,optional] # @return [OpenTox::CrossvalidationReport] nil if no report found def self.find_for_crossvalidation( crossvalidation_uri, subjectid=nil ) uris = RestClientWrapper.get(File.join($validation[:uri], "/report/crossvalidation?crossvalidation="+crossvalidation_uri),nil,{:subjectid => subjectid}).chomp.split("\n") uris.size==0 ? nil : CrossvalidationReport.new(uris[-1]) end - + # creates a crossvalidation report via crossvalidation - # @param [String] crossvalidation uri - # @param [String,optional] subjectid - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param crossvalidation_uri [String] crossvalidation uri + # @param subjectid [String,optional] + # @param waiting_task [OpenTox::Task,optional] (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::CrossvalidationReport] def self.create( crossvalidation_uri, subjectid=nil, waiting_task=nil ) uri = RestClientWrapper.post(File.join($validation[:uri],"/report/crossvalidation"), @@ -301,11 +301,11 @@ module OpenTox CrossvalidationReport.new(uri) end end - - + + class AlgorithmComparisonReport include OldOpenTox - + # finds AlgorithmComparisonReport via uri, raises error if not found # @param [String] uri # @param [String,optional] subjectid @@ -316,23 +316,23 @@ module OpenTox rep.load_metadata( subjectid ) rep end - + # finds AlgorithmComparisonReport for a particular crossvalidation - # @param [String] crossvalidation uri - # @param [String,optional] subjectid + # @param crossvalidation_uri [String] crossvalidation uri + # @param subjectid [String,optional] # @return [OpenTox::AlgorithmComparisonReport] nil if no report found def self.find_for_crossvalidation( crossvalidation_uri, subjectid=nil ) uris = RestClientWrapper.get(File.join($validation[:uri], "/report/algorithm_comparison?crossvalidation="+crossvalidation_uri),nil,{:subjectid => subjectid}).chomp.split("\n") uris.size==0 ? nil : AlgorithmComparisonReport.new(uris[-1]) end - + # creates a algorithm comparison report via crossvalidation uris - # @param [Hash] crossvalidation uri_hash, see example - # @param [Hash] params addiditonal possible + # @param crossvalidation_uri_hash [Hash] crossvalidation uri_hash, see example + # @param params [Hash] params addiditonal possible # (ttest_significance, ttest_attributes, min_confidence, min_num_predictions, max_num_predictions) - # @param [String,optional] subjectid - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly + # @param subjectid [String,optional] + # @param waiting_task [OpenTox::Task,optional] (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::AlgorithmComparisonReport] # example for hash: # { :lazar-bbrc => [ http://host/validation/crossvalidation/x1, http://host/validation/crossvalidation/x2 ], @@ -355,7 +355,7 @@ module OpenTox uri = wait_for_task(uri) AlgorithmComparisonReport.new(uri) end - end - + end + end -- cgit v1.2.3 From 617ff7b6b8e59678655da80a7171f8656baf0022 Mon Sep 17 00:00:00 2001 From: gebele Date: Wed, 5 Jun 2013 16:01:47 +0200 Subject: border colour --- lib/overwrite.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 52b8a9f..1579469 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -54,7 +54,7 @@ class String html << "

Description

"+description.link_urls+"

" if description html << "

Related links

"+related_links.link_urls+"

" if related_links html << "

Content

" if description || related_links - html << "

" + html << "

" html << "\n" if png_image html << self.link_urls html << "

" -- cgit v1.2.3 From 0c20a7e7841c2c85a4d3260d018017d350bc0953 Mon Sep 17 00:00:00 2001 From: gebele Date: Wed, 5 Jun 2013 16:37:06 +0200 Subject: simplify RDF::Writer method --- lib/opentox.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 211fc7b..305b5d9 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -133,7 +133,9 @@ module OpenTox @metadata[RDF.type] ||= eval("RDF::OT."+self.class.to_s.split('::').last) @metadata[RDF::DC.date] ||= DateTime.now @metadata.each do |predicate,values| - [values].flatten.each { |value| @rdf << [RDF::URI.new(@uri), predicate, value] } + [values].flatten.each do |value| + predicate =~ /#{RDF::DC.date}|#{RDF::DC.title}|#{RDF::DC.description}/ ? @rdf.update([RDF::URI.new(@uri), predicate, value]) : @rdf << [RDF::URI.new(@uri), predicate, value] + end end @parameters.each do |parameter| p_node = RDF::Node.new @@ -158,7 +160,7 @@ module OpenTox send :define_method, "to_#{format}".to_sym do create_rdf RDF::Writer.for(format).buffer(:encoding => Encoding::ASCII) do |writer| - @rdf.each{|statement| writer << statement} + writer << @rdf end end end @@ -167,8 +169,8 @@ module OpenTox prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } create_rdf - RDF::Turtle::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| - @rdf.each{|statement| writer << statement} + RDF::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + writer << @rdf end end -- cgit v1.2.3 From 183ccb509592f4a9cf0c473c5a3ebcd957f7bb70 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 5 Jun 2013 19:41:42 +0200 Subject: rdf serialisation of modified objects fixed. DC.modified removed. --- lib/opentox.rb | 4 ++-- lib/overwrite.rb | 16 ++++++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index ac174f3..8817798 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -109,7 +109,7 @@ module OpenTox def put wait=true, mime_type="text/plain" bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" @metadata[RDF::OT.created_at] = DateTime.now unless URI.accessible? @uri, @subjectid - @metadata[RDF::DC.modified] = DateTime.now + #@metadata[RDF::DC.modified] = DateTime.now case mime_type when 'text/plain' body = self.to_ntriples @@ -131,7 +131,7 @@ module OpenTox end def create_rdf - @rdf = RDF::Graph.new if @rdf.empty? or URI.task?(@uri) + @rdf = RDF::Graph.new #if @rdf.empty? or URI.task?(@uri) @metadata[RDF.type] ||= eval("RDF::OT."+self.class.to_s.split('::').last) @metadata[RDF::DC.date] ||= DateTime.now @metadata.each do |predicate,values| diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 6a71338..3317c79 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -77,11 +77,11 @@ module URI end def self.dataset? uri, subjectid=nil - uri =~ /dataset/ and URI.accessible? uri, subjectid=nil + uri =~ /dataset/ and URI.accessible? uri, subjectid end def self.model? uri, subjectid=nil - uri =~ /model/ and URI.accessible? uri, subjectid=nil + uri =~ /model/ and URI.accessible? uri, subjectid end def self.ssl? uri, subjectid=nil @@ -92,17 +92,13 @@ module URI def self.accessible?(uri, subjectid=nil) parsed_uri = URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : "")) http_code = URI.task?(uri) ? 600 : 400 - unless (URI.ssl? uri) == true - http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) - request = Net::HTTP::Head.new(parsed_uri.request_uri) - http.request(request).code.to_i < http_code - else - http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) + http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) + if (URI.ssl? uri) == true http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE - request = Net::HTTP::Head.new(parsed_uri.request_uri) - http.request(request).code.to_i < http_code end + request = Net::HTTP::Head.new(parsed_uri.request_uri) + http.request(request).code.to_i < http_code rescue false end -- cgit v1.2.3 From fa108ccae6f824b4b38b7ea1cd8ea5ece87c1d66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Thu, 6 Jun 2013 12:44:21 +0200 Subject: commenting to_turtle and to_html --- lib/opentox.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/opentox.rb b/lib/opentox.rb index adf0030..9d908bc 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -165,6 +165,7 @@ module OpenTox end end + # @return [String] converts object to turtle-string def to_turtle # redefined to use prefixes (not supported by RDF::Writer) prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } @@ -174,6 +175,7 @@ module OpenTox end end + # @return [String] converts OpenTox object into html document (by first converting it to a string) def to_html to_turtle.to_html end -- cgit v1.2.3 From 498ec077e6b8290cf5efee08aaa6af7759ddccc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Thu, 6 Jun 2013 12:58:26 +0200 Subject: commenting cid, chemblid, and match_hits --- lib/compound.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index a278244..51ef96d 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -91,14 +91,18 @@ module OpenTox RestClientWrapper.get("#{CACTUS_URI}#{inchi}/names").split("\n") end + # @return [String] PubChem Compound Identifier (CID), derieved via restcall to pubchem def cid pug_uri = "http://pubchem.ncbi.nlm.nih.gov/rest/pug/" @cid ||= RestClientWrapper.post(File.join(pug_uri, "compound", "inchi", "cids", "TXT"),{:inchi => inchi}).strip end + # @todo def chebi + raise_internal_error "not yet implemented" end + # @return [String] ChEMBL database compound id, derieved via restcall to chembl def chemblid # https://www.ebi.ac.uk/chembldb/ws#individualCompoundByInChiKey uri = "http://www.ebi.ac.uk/chemblws/compounds/smiles/#{smiles}.json" @@ -191,11 +195,11 @@ module OpenTox # Keys: matching smarts, values: number of non-unique hits, or 1 # @param [Array] smarts_array Array with Smarts strings # @param use_hits [Boolean] Whether non-unique hits or 1 should be produced - # @return [Array] Array with matching Smarts strings - # @example { + # @return [Hash] Hash with matching Smarts as keys, nr-of-hits/1 as values + # @example # compound = Compound.from_name("Benzene") - # compound.match(['cc','cN']) # returns { 'cc' => 12, 'cN' => 0 } - # } + # compound.match(['cc','cN'],true) # returns { 'cc' => 12 }, 'cN' is not included because it does not match + # compound.match(['cc','cN'],false) # returns { 'cc' => 1 } def match_hits(smarts_array, use_hits=true) obconversion = OpenBabel::OBConversion.new obmol = OpenBabel::OBMol.new -- cgit v1.2.3 From f6f0c4b80ffc78c217343392120fc81305f8b2d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Thu, 6 Jun 2013 13:10:42 +0200 Subject: link to opentox metadata in comment --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 19d05c9..5efd224 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -15,7 +15,7 @@ module OpenTox end # Get data (lazy loading from dataset service) - + # overrides {OpenTox#metadata} def metadata force_update=false if @metadata.empty? or force_update uri = File.join(@uri,"metadata") -- cgit v1.2.3 From b93927f080644954479590b65d097c62e49b63b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20G=C3=BCtlein?= Date: Thu, 6 Jun 2013 15:34:24 +0300 Subject: comment dataset.rb --- lib/dataset.rb | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 5efd224..9efae20 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -15,7 +15,8 @@ module OpenTox end # Get data (lazy loading from dataset service) - # overrides {OpenTox#metadata} + # overrides {OpenTox#metadata} to only load the metadata instead of the whole dataset + # @return [Hash] the metadata def metadata force_update=false if @metadata.empty? or force_update uri = File.join(@uri,"metadata") @@ -29,6 +30,7 @@ module OpenTox @metadata end + # @return [Array] feature objects (NOT uris) def features force_update=false if @features.empty? or force_update uri = File.join(@uri,"features") @@ -38,6 +40,7 @@ module OpenTox @features end + # @return [Array] compound objects (NOT uris) def compounds force_update=false if @compounds.empty? or force_update uri = File.join(@uri,"compounds") @@ -47,6 +50,8 @@ module OpenTox @compounds end + # @return [Array] with two dimensions, + # first index: compounds, second index: features, values: compound feature values def data_entries force_update=false if @data_entries.empty? or force_update sparql = "SELECT ?cidx ?fidx ?value FROM <#{uri}> WHERE { @@ -105,6 +110,9 @@ module OpenTox compounds.select{|f| f.uri == uri}.first end + # for prediction result datasets + # assumes that there are features with title prediction and confidence + # @return [Array] of Hashes with keys { :compound, :value ,:confidence } (compound value is object not uri) def predictions predictions = [] prediction_feature = nil @@ -128,15 +136,23 @@ module OpenTox predictions end - # Adding data (@features and @compounds are also writable) + # Adding data methods + # (Alternatively, you can directly change @features and @compounds) + # Create a dataset from file (csv,sdf,...) + # @param filename [String] + # @return [String] dataset uri def upload filename, wait=true uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}, {:subjectid => @subjectid}) wait_for_task uri if URI.task?(uri) and wait metadata true @uri end - + + # @param compound [OpenTox::Compound] + # @param feature [OpenTox::Feature] + # @param value [Object] (will be converted to String) + # @return [Array] data_entries def add_data_entry compound, feature, value @compounds << compound unless @compounds.collect{|c| c.uri}.include?(compound.uri) row = @compounds.collect{|c| c.uri}.index(compound.uri) @@ -152,8 +168,15 @@ module OpenTox end # TODO: remove? might be dangerous if feature ordering is incorrect + # MG: I would not remove this because add_data_entry is very slow (4 times searching in arrays) + # @param row [Array] + # @example + # d = Dataset.new + # d.features << Feature.new(a) + # d.features << Feature.new(b) + # d << [ Compound.new("c1ccccc1"), feature-value-a, feature-value-b ] def << row - compound = row.shift + compound = row.shift # removes the compound from the array bad_request_error "Dataset features are empty." unless @features bad_request_error "Row size '#{row.size}' does not match features size '#{@features.size}'." unless row.size == @features.size bad_request_error "First column is not a OpenTox::Compound" unless compound.class == OpenTox::Compound @@ -163,6 +186,8 @@ module OpenTox # Serialisation + # converts dataset to csv format including compound smiles as first column, other column headers are feature titles + # @return [String] def to_csv CSV.generate do |csv| csv << ["SMILES"] + features.collect{|f| f.title} @@ -277,6 +302,11 @@ module OpenTox # Methods for for validation service + # create a new dataset with the specified compounds and features + # @param compound_indices [Array] compound indices (integers) + # @param feats [Array] features objects + # @param metadata [Hash] + # @return [OpenTox::Dataset] def split( compound_indices, feats, metadata, subjectid=nil) bad_request_error "Dataset.split : Please give compounds as indices" if compound_indices.size==0 or !compound_indices[0].is_a?(Fixnum) @@ -328,6 +358,9 @@ module OpenTox @index_map[dataset.uri][compound_index] end + # returns the inidices of the compound in the dataset + # @param compound [OpenTox::Compound] + # @return [Array] compound index (position) of the compound in the dataset, array-size is 1 unless multiple occurences def compound_indices( compound ) unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound) @cmp_indices = {} @@ -343,6 +376,7 @@ module OpenTox @cmp_indices[compound] end + # returns compound feature value using the compound-index and the feature_uri def data_entry_value(compound_index, feature_uri) data_entries(true) if @data_entries.empty? col = @features.collect{|f| f.uri}.index feature_uri -- cgit v1.2.3 From 69e0385b1a80721cbbeb948ede341da647dd7f2d Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 7 Jun 2013 16:36:33 +0200 Subject: use subclass to get all predicates in turtle output --- lib/opentox.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 9d908bc..09e5e41 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -170,7 +170,7 @@ module OpenTox prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } create_rdf - RDF::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + RDF::Turtle::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| writer << @rdf end end -- cgit v1.2.3 From d1059d024ac3f87af041626b1ade3a928e8099e4 Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 7 Jun 2013 18:43:38 +0200 Subject: ignore yarddoc --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c9daf01..8f883a0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ Gemfile.lock .bundle pkg/* *~ +.yardoc/ +doc/ -- cgit v1.2.3 From 1a78b5b282bdf274dcae8f6740e2fc258cab316a Mon Sep 17 00:00:00 2001 From: gebele Date: Wed, 12 Jun 2013 19:07:25 +0200 Subject: add subjectid to delete method --- lib/opentox.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 09e5e41..c933f97 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -119,7 +119,7 @@ module OpenTox end # Delete object at webservice - def delete + def delete subjectid=nil RestClientWrapper.delete(@uri.to_s,nil,{:subjectid => @subjectid}) Authorization.delete_policies_from_uri(@uri, @subjectid) if $aa[:uri] end -- cgit v1.2.3 From cb390ae0091b416ef217aad1bd0645409b5657dc Mon Sep 17 00:00:00 2001 From: gebele Date: Wed, 12 Jun 2013 19:08:21 +0200 Subject: add type to dataset metadata --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 9efae20..5df20b4 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -221,7 +221,7 @@ module OpenTox # redefine rdf serialization methods send :define_method, "to_#{format}".to_sym do - @metadata[RDF.type] = RDF::OT.OrderedDataset + @metadata[RDF.type] = [RDF::OT.Dataset, RDF::OT.OrderedDataset] create_rdf @features.each_with_index do |feature,i| @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Feature)] -- cgit v1.2.3 From fc931b802f4e32d4d19ff37e9d1d708a39efbce9 Mon Sep 17 00:00:00 2001 From: gebele Date: Tue, 18 Jun 2013 17:45:47 +0200 Subject: ot-objects api uri as triple object value must be RDF::URI --- lib/opentox.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index c933f97..8099f41 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -129,13 +129,11 @@ module OpenTox end def create_rdf - @rdf = RDF::Graph.new if @rdf.empty? or URI.task?(@uri) - @metadata[RDF.type] ||= eval("RDF::OT."+self.class.to_s.split('::').last) + @rdf = RDF::Graph.new + @metadata[RDF.type] ||= RDF::URI.new(eval("RDF::OT."+self.class.to_s.split('::').last)) @metadata[RDF::DC.date] ||= DateTime.now @metadata.each do |predicate,values| - [values].flatten.each do |value| - predicate =~ /#{RDF::DC.date}|#{RDF::DC.title}|#{RDF::DC.description}/ ? @rdf.update([RDF::URI.new(@uri), predicate, value]) : @rdf << [RDF::URI.new(@uri), predicate, value] - end + [values].flatten.each{ |value| @rdf << [RDF::URI.new(@uri), predicate, (value == eval("RDF::OT."+self.class.to_s.split('::').last)) ? RDF::URI.new(value) : value] } end @parameters.each do |parameter| p_node = RDF::Node.new -- cgit v1.2.3 From bc9d5b9266e18d39ab5fd83db272bffde98c4161 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Jun 2013 16:29:43 +0200 Subject: openbabel requirement removed. initial descriptor classes. --- lib/algorithm.rb | 29 ++++++++++++++++++++++++++++- lib/compound.rb | 23 ++++++++++++++++++++++- lib/overwrite.rb | 8 ++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 8576681..1ffc883 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -5,11 +5,38 @@ module OpenTox # Execute algorithm with parameters, please consult the OpenTox API and the webservice documentation for acceptable parameters # @param [optional,Hash] params Algorithm parameters - # @param [optional,Boolean] wait set to true if method should wait for task result + # @param [optional,Boolean] wait set to false if method should return a task uri instead of the algorithm result # @return [String] URI of new resource (dataset, model, ...) def run params=nil, wait=true uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => @subjectid} wait_for_task uri if wait end end + + module Descriptor + + class Smarts + + def self.fingerprint compounds, smarts, count=false + matcher = Algorithm.new File.join($algorithm[:uri],"descriptor","smarts","fingerprint") + smarts = [smarts] unless smarts.is_a? Array + if compounds.is_a? OpenTox::Compound + json = matcher.run :compound_uri => compounds.uri, :smarts => smarts, :count => count + elsif compounds.is_a? OpenTox::Dataset + # TODO: add task and return dataset instead of result + json = matcher.run :dataset_uri => compounds.uri, :smarts => smarts, :count => count + else + bad_request_error "Cannot match smarts on #{compounds.class} objects." + end + + JSON.parse json + end + + def self.count compounds, smarts + fingerprint compounds,smarts,true + end + end + + + end end diff --git a/lib/compound.rb b/lib/compound.rb index 89bf840..daeabb9 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -1,4 +1,4 @@ -require "openbabel" +#require "openbabel" CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/" module OpenTox @@ -110,6 +110,27 @@ module OpenTox end =begin + # Match a smarts string + # @example + # compound = OpenTox::Compound.from_name("Benzene") + # compound.match?("cN") # returns false + # @param [String] smarts Smarts string + def match?(smarts) + matcher = Algorithm.new File.join($algorithm[:uri],"descriptor","smarts") + matcher.run :compound_uri => @uri, :smarts => smarts, :count => false + end + + # Match an array of smarts strings, returns array with matching smarts + # @example + # compound = OpenTox::Compound.from_name("Benzene") + # compound.match(['cc','cN']) # returns ['cc'] + # @param [Array] smarts_array Array with Smarts strings + # @return [Array] Array with matching Smarts strings + def match(smarts_array) + matcher = Algorithm.new File.join($algorithm[:uri],"descriptor","smarts") + matcher.run :compound_uri => @uri, :smarts => smarts_array, :count => false + end + # Match a smarts string # @example # compound = OpenTox::Compound.from_name("Benzene") diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 04de58d..b2382e0 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -28,6 +28,14 @@ class String downcase end + # convert strings to boolean values + # @return [TrueClass,FalseClass] true or false + def to_boolean + return true if self == true || self =~ (/(true|t|yes|y|1)$/i) + return false if self == false || self.nil? || self =~ (/(false|f|no|n|0)$/i) + bad_request_error "invalid value for Boolean: \"#{self}\"" + end + # encloses URI in text with with link tag # @return [String] new text with marked links def link_urls -- cgit v1.2.3 From 7fb2e94dc94c3ca70f7ceb420be290f49cb4d894 Mon Sep 17 00:00:00 2001 From: gebele Date: Tue, 25 Jun 2013 15:52:45 +0200 Subject: change html border color --- lib/overwrite.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index b2382e0..687f2ba 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -61,7 +61,7 @@ class String html << "

Description

"+description.link_urls+"

" if description html << "

Related links

"+related_links.link_urls+"

" if related_links html << "

Content

" if description || related_links - html << "

" + html << "

" html << "\n" if png_image html << self.link_urls html << "

" -- cgit v1.2.3 From 4daf449b001f4e44fbb337ebc29ceef29ce6ac64 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Mon, 1 Jul 2013 09:25:44 +0200 Subject: add subjectids, changes in yard doc --- lib/validation.rb | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/validation.rb b/lib/validation.rb index cb73ce6..76e723e 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -44,7 +44,7 @@ module OpenTox v = v.to_s.gsub(/;/, "%3b") if v.to_s =~ /;/ filter_string += k.to_s+"="+v.to_s end - (OpenTox::RestClientWrapper.get($validation[:uri]+filter_string).split("\n")) + (OpenTox::RestClientWrapper.get($validation[:uri]+filter_string,nil,{:subjectid => subjectid}).split("\n")) end # creates a training test split validation, waits until it finishes, may take some time @@ -55,7 +55,7 @@ module OpenTox def self.create_training_test_split( params, subjectid=nil, waiting_task=nil ) params[:subjectid] = subjectid if subjectid uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"training_test_split"), - params,{:content_type => "text/uri-list"},waiting_task ) + params,{:content_type => "text/uri-list", :subjectid => subjectid},waiting_task ) Validation.new(wait_for_task(uri)) end @@ -67,7 +67,7 @@ module OpenTox def self.create_training_test_validation( params, subjectid=nil, waiting_task=nil ) params[:subjectid] = subjectid if subjectid uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"training_test_validation"), - params,{:content_type => "text/uri-list"},waiting_task ) + params,{:content_type => "text/uri-list", :subjectid => subjectid},waiting_task ) Validation.new(wait_for_task(uri)) end @@ -79,7 +79,7 @@ module OpenTox def self.create_bootstrapping_validation( params, subjectid=nil, waiting_task=nil ) params[:subjectid] = subjectid if subjectid uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"bootstrapping"), - params,{:content_type => "text/uri-list"},waiting_task ) + params,{:content_type => "text/uri-list", :subjectid => subjectid},waiting_task ) Validation.new(wait_for_task(uri)) end @@ -103,8 +103,8 @@ module OpenTox end # returns confusion matrix as array, predicted values are in rows - # example: - # [[nil,"active","moderate","inactive"],["active",1,3,99],["moderate",4,2,8],["inactive",3,8,6]] + # @example + # [[nil,"active","moderate","inactive"],["active",1,3,99],["moderate",4,2,8],["inactive",3,8,6]] # -> 99 inactive compounds have been predicted as active def confusion_matrix raise "no classification statistics, probably a regression valdiation" unless @metadata[RDF::OT.classificationStatistics] @@ -133,17 +133,17 @@ module OpenTox # @param prediction [String] predicted value # @param subjectid [String,optional] # @return [Hash] see example - # - # Example 1: + # @example + # Example 1: # validation.probabilities(0.3,"active") # -> { :min_confidence=>0.32, :num_predictions=>20, :probs=>{"active"=>0.7, "moderate"=>0.25 "inactive"=>0.05 } } - # there have been 20 "active" predictions with confidence >= 0.3, 70 percent of them beeing correct + # there have been 20 "active" predictions with confidence >= 0.3, 70 percent of them beeing correct # - # Example 2: - # validation.probabilities(0.8,"active") - # -> { :min_confidence=>0.45, :num_predictions=>12, :probs=>{"active"=>0.9, "moderate"=>0.1 "inactive"=>0 } } - # the given confidence value was to high (i.e. <12 predictions with confidence value >= 0.8) - # the top 12 "active" predictions have a min_confidence of 0.45, 90 percent of them beeing correct + # Example 2: + # validation.probabilities(0.8,"active") + # -> { :min_confidence=>0.45, :num_predictions=>12, :probs=>{"active"=>0.9, "moderate"=>0.1 "inactive"=>0 } } + # the given confidence value was to high (i.e. <12 predictions with confidence value >= 0.8) + # the top 12 "active" predictions have a min_confidence of 0.45, 90 percent of them beeing correct # def probabilities( confidence, prediction, subjectid=nil ) YAML.load(OpenTox::RestClientWrapper.get(@uri+"/probabilities?prediction="+prediction.to_s+"&confidence="+confidence.to_s,nil, @@ -187,7 +187,7 @@ module OpenTox def self.create( params, subjectid=nil, waiting_task=nil ) params[:subjectid] = subjectid if subjectid uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"crossvalidation"), - params,{:content_type => "text/uri-list"},waiting_task ) + params,{:content_type => "text/uri-list", :subjectid => subjectid},waiting_task ) uri = wait_for_task(uri) Crossvalidation.new(uri) end @@ -258,7 +258,7 @@ module OpenTox params[:validation_uris] = validation_uri params[:subjectid] = subjectid uri = RestClientWrapper.post(File.join($validation[:uri],"/report/validation"), - params, {}, waiting_task ) + params, {:subjectid => subjectid}, waiting_task ) uri = wait_for_task(uri) ValidationReport.new(uri) end @@ -351,7 +351,7 @@ module OpenTox params[:validation_uris] = validation_uris.join(",") params[:identifier] = identifier.join(",") params[:subjectid] = subjectid - uri = RestClientWrapper.post(File.join($validation[:uri],"/report/algorithm_comparison"), params, {}, waiting_task ) + uri = RestClientWrapper.post(File.join($validation[:uri],"/report/algorithm_comparison"), params, {:subjectid => subjectid}, waiting_task ) uri = wait_for_task(uri) AlgorithmComparisonReport.new(uri) end -- cgit v1.2.3 From 6c35e3f8369ba96cb251eac487424bd949fdcf6c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 2 Jul 2013 19:23:01 +0200 Subject: Algorithms and Models are modules instead of classes. --- lib/algorithm.rb | 57 ++++++++++++++++++++++++++++++++++----------------- lib/authorization.rb | 10 +++++++-- lib/compound.rb | 4 ++++ lib/dataset.rb | 3 +++ lib/model.rb | 23 +++++++++++++++++++-- lib/opentox-client.rb | 12 +++++++++-- lib/opentox.rb | 22 ++++++++++++-------- 7 files changed, 98 insertions(+), 33 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 1ffc883..7d9a5a2 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -1,7 +1,8 @@ module OpenTox # Wrapper for OpenTox Algorithms - class Algorithm + module Algorithm + include OpenTox # Execute algorithm with parameters, please consult the OpenTox API and the webservice documentation for acceptable parameters # @param [optional,Hash] params Algorithm parameters @@ -11,32 +12,50 @@ module OpenTox uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => @subjectid} wait_for_task uri if wait end - end - module Descriptor + class Generic + include OpenTox + include Algorithm + end - class Smarts + class Descriptor + include OpenTox + include Algorithm + + [:smarts_match,:smarts_count,:openbabel,:cdk,:joelib,:physchem,:lookup].each do |descriptor| + Descriptor.define_singleton_method(descriptor) do |compounds,descriptors| + descriptors = [descriptors] unless descriptors.is_a? Array + case compounds.class.to_s + when "Array" + klasses = compounds.collect{|c| c.class}.uniq + bad_request_error "First argument contains objects with a different class than OpenTox::Compound or OpenTox::Dataset #{klasses.inspect}" unless klasses.size == 1 and klasses.first == Compound + JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s), SUBJECTID).run(:compound_uri => compounds.collect{|c| c.uri}, :descriptors => descriptors)) + when "OpenTox::Compound" + JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s), SUBJECTID).run(:compound_uri => compounds.uri, :descriptors => descriptors)) + when "OpenTox::Dataset" + task_uri = Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s), SUBJECTID).run(:dataset_uri => compounds.uri, :descriptors => descriptors) + puts task_uri + #task_uri + Dataset.new(Task.new(task_uri).wait_for_task) + else + bad_request_error "First argument contains objects with a different class than OpenTox::Compound or OpenTox::Dataset" + end - def self.fingerprint compounds, smarts, count=false - matcher = Algorithm.new File.join($algorithm[:uri],"descriptor","smarts","fingerprint") - smarts = [smarts] unless smarts.is_a? Array - if compounds.is_a? OpenTox::Compound - json = matcher.run :compound_uri => compounds.uri, :smarts => smarts, :count => count - elsif compounds.is_a? OpenTox::Dataset - # TODO: add task and return dataset instead of result - json = matcher.run :dataset_uri => compounds.uri, :smarts => smarts, :count => count - else - bad_request_error "Cannot match smarts on #{compounds.class} objects." end - - JSON.parse json end - def self.count compounds, smarts - fingerprint compounds,smarts,true - end end + class Fminer + include OpenTox + include Algorithm + def self.bbrc params + Fminer.new(File.join(service_uri, "fminer", "bbrc")).run params + end + def self.last params + Fminer.new(File.join(service_uri, "fminer", "last")).run params + end + end end end diff --git a/lib/authorization.rb b/lib/authorization.rb index 7f0e840..4b63cef 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -1,6 +1,12 @@ module OpenTox - AA = $aa[:uri] if defined? $aa - AA ||= "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb + if defined?($aa) and $aa[:uri] + AA = $aa[:uri] + SUBJECTID = OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) + unauthorized_error "Failed to authenticate user \"#{$aa[:user]}\"." unless OpenTox::Authorization.is_token_valid(SUBJECTID) + else + AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb + SUBJECTID = nil + end #Module for Authorization and Authentication #@example Authentication # require "opentox-client" diff --git a/lib/compound.rb b/lib/compound.rb index daeabb9..9bd2066 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -6,6 +6,10 @@ module OpenTox # Ruby wrapper for OpenTox Compound Webservices (http://opentox.org/dev/apis/api-1.2/structure). class Compound + def ==(c) + @uri == c.uri + end + # Create a compound from smiles string # @example # compound = OpenTox::Compound.from_smiles("c1ccccc1") diff --git a/lib/dataset.rb b/lib/dataset.rb index 5df20b4..354b443 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -64,6 +64,8 @@ module OpenTox RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n").each do |row| r,c,v = row.split("\t") @data_entries[r.to_i] ||= [] + #v = v.to_f if v.numeric? + #v = nil if v.is_a? String and v.empty? @data_entries[r.to_i][c.to_i] = v end # TODO: fallbacks for external and unordered datasets @@ -169,6 +171,7 @@ module OpenTox # TODO: remove? might be dangerous if feature ordering is incorrect # MG: I would not remove this because add_data_entry is very slow (4 times searching in arrays) + # CH: do you have measurements? compound and feature arrays are not that big, I suspect that feature search/creation is the time critical step # @param row [Array] # @example # d = Dataset.new diff --git a/lib/model.rb b/lib/model.rb index e49eff3..1dbac6d 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -1,7 +1,7 @@ module OpenTox - class Model - + module Model +=begin # Run a model with parameters # @param params [Hash] Parameters for OpenTox model # @param wait [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly @@ -10,6 +10,7 @@ module OpenTox uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => @subjectid} wait_for_task uri if wait end +=end def feature_type # CH: subjectid is a object variable, no need to pass it as a parameter unless @feature_type @@ -41,5 +42,23 @@ module OpenTox end end + class Generic + include OpenTox + include OpenTox::Algorithm + end + + class Lazar + include OpenTox + include OpenTox::Algorithm + def self.create params + Lazar.new(File.join($algorithm[:uri], "lazar")).run params + end + + def predict params + run params + end + + end + end end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 02724c2..f25f05a 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -10,6 +10,13 @@ require 'json' require 'logger' require "securerandom" +default_config = File.join(ENV["HOME"],".opentox","config","default.rb") +client_config = File.join(ENV["HOME"],".opentox","config","opentox-client.rb") + +puts "Could not find configuration files #{default_config} or #{client_config}" unless File.exist? default_config or File.exist? client_config +require default_config if File.exist? default_config +require client_config if File.exist? client_config + # define constants and global variables RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' @@ -19,7 +26,8 @@ RDF::TB = RDF::Vocabulary.new "http://onto.toxbank.net/api/" RDF::ISA = RDF::Vocabulary.new "http://onto.toxbank.net/isa/" RDF::OWL = RDF::Vocabulary.new "http://www.w3.org/2002/07/owl#" -CLASSES = ["Generic", "Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] +#CLASSES = ["Generic", "Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] +CLASSES = ["Compound", "Feature", "Dataset", "Validation", "Task", "Investigation"] RDF_FORMATS = [:rdfxml,:ntriples,:turtle] # Regular expressions for parsing classification data @@ -38,8 +46,8 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m "compound.rb", "feature.rb", "dataset.rb", - "model.rb", "algorithm.rb", + "model.rb", "validation.rb" ].each{ |f| require_relative f } diff --git a/lib/opentox.rb b/lib/opentox.rb index 52f705c..044da4b 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -190,6 +190,20 @@ module OpenTox end end + # define class methods within module + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + def service_uri + service = self.to_s.split('::')[1].downcase + eval("$#{service}[:uri]") + rescue + bad_request_error "$#{service}[:uri] variable not set. Please set $#{service}[:uri] or use an explicit uri as first constructor argument " + end + end + # create default OpenTox classes with class methods # (defined in opentox-client.rb) CLASSES.each do |klass| @@ -237,14 +251,6 @@ module OpenTox self.new uris.first, subjectid end end - - def self.service_uri - service = self.to_s.split('::').last.downcase - eval("$#{service}[:uri]") - rescue - bad_request_error "$#{service}[:uri] variable not set. Please set $#{service}[:uri] or use an explicit uri as first constructor argument " - end - end OpenTox.const_set klass,c end -- cgit v1.2.3 From c31aa9dfd79ceab353b69226ef7499371a42ef04 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 3 Jul 2013 09:14:46 +0200 Subject: fix list method with subjectid --- lib/validation.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/validation.rb b/lib/validation.rb index 76e723e..3b1cf13 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -37,7 +37,7 @@ module OpenTox # returns a filtered list of validation uris # @param params [Hash,optional] validation-params to filter the uris (could be model, training_dataset, ..) # @return [Array] - def self.list( params={} ) + def self.list( params={}, subjectid=nil ) filter_string = "" params.each do |k,v| filter_string += (filter_string.length==0 ? "?" : "&") -- cgit v1.2.3 From 7f50763c6e14ee252875d68cece373e0a779b7b6 Mon Sep 17 00:00:00 2001 From: gebele Date: Wed, 3 Jul 2013 12:18:36 +0200 Subject: redo merge deletes;typo --- lib/overwrite.rb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 687f2ba..fc050ce 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -101,18 +101,23 @@ module URI parsed_uri = URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : "")) http_code = URI.task?(uri) ? 600 : 400 http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) - if (URI.ssl? uri) == true + unless (URI.ssl? uri) == true + http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) + request = Net::HTTP::Head.new(parsed_uri.request_uri) + http.request(request).code.to_i < http_code + else + http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE + request = Net::HTTP::Head.new(parsed_uri.request_uri) + http.request(request).code.to_i < http_code end - request = Net::HTTP::Head.new(parsed_uri.request_uri) - http.request(request).code.to_i < http_code rescue false end def self.valid? uri - u = URI::parse(uri) + u = URI.parse(uri) u.scheme!=nil and u.host!=nil rescue URI::InvalidURIError false -- cgit v1.2.3 From 0c441d6c0b06b969bd18809eefd99cc082e32612 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 4 Jul 2013 16:36:07 +0200 Subject: descriptor calculation fixed --- lib/algorithm.rb | 8 +++----- lib/opentox.rb | 1 + 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 7d9a5a2..5cffa88 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -22,8 +22,8 @@ module OpenTox include OpenTox include Algorithm - [:smarts_match,:smarts_count,:openbabel,:cdk,:joelib,:physchem,:lookup].each do |descriptor| - Descriptor.define_singleton_method(descriptor) do |compounds,descriptors| + [:smarts_match,:smarts_count,:physchem,:lookup].each do |descriptor| + Descriptor.define_singleton_method(descriptor) do |compounds,descriptors=nil| descriptors = [descriptors] unless descriptors.is_a? Array case compounds.class.to_s when "Array" @@ -34,9 +34,7 @@ module OpenTox JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s), SUBJECTID).run(:compound_uri => compounds.uri, :descriptors => descriptors)) when "OpenTox::Dataset" task_uri = Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s), SUBJECTID).run(:dataset_uri => compounds.uri, :descriptors => descriptors) - puts task_uri - #task_uri - Dataset.new(Task.new(task_uri).wait_for_task) + Dataset.new(wait_for_task task_uri) else bad_request_error "First argument contains objects with a different class than OpenTox::Compound or OpenTox::Dataset" end diff --git a/lib/opentox.rb b/lib/opentox.rb index 044da4b..ec18c0f 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -229,6 +229,7 @@ module OpenTox end def self.find_or_create metadata, subjectid=nil + puts metadata.inspect sparql = "SELECT DISTINCT ?s WHERE { " metadata.each do |predicate,objects| unless [RDF::DC.date,RDF::DC.modified,RDF::DC.description].include? predicate # remove dates and description (strange characters in description may lead to SPARQL errors) -- cgit v1.2.3 From 3262e3cf2ed1ce896dcd11d9c1bde5222ea720ce Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 4 Jul 2013 18:17:56 +0200 Subject: Algorithm::Generic and Model::Generic classes. --- lib/compound.rb | 139 -------------------------------------------------------- lib/model.rb | 2 + 2 files changed, 2 insertions(+), 139 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 9bd2066..82f0d73 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -112,144 +112,5 @@ module OpenTox uri = "http://www.ebi.ac.uk/chemblws/compounds/smiles/#{smiles}.json" @chemblid = JSON.parse(RestClientWrapper.get(uri))["compounds"].first["chemblId"] end - -=begin - # Match a smarts string - # @example - # compound = OpenTox::Compound.from_name("Benzene") - # compound.match?("cN") # returns false - # @param [String] smarts Smarts string - def match?(smarts) - matcher = Algorithm.new File.join($algorithm[:uri],"descriptor","smarts") - matcher.run :compound_uri => @uri, :smarts => smarts, :count => false - end - - # Match an array of smarts strings, returns array with matching smarts - # @example - # compound = OpenTox::Compound.from_name("Benzene") - # compound.match(['cc','cN']) # returns ['cc'] - # @param [Array] smarts_array Array with Smarts strings - # @return [Array] Array with matching Smarts strings - def match(smarts_array) - matcher = Algorithm.new File.join($algorithm[:uri],"descriptor","smarts") - matcher.run :compound_uri => @uri, :smarts => smarts_array, :count => false - end - - # Match a smarts string - # @example - # compound = OpenTox::Compound.from_name("Benzene") - # compound.match?("cN") # returns false - # @param [String] smarts Smarts string - def match?(smarts) - obconversion = OpenBabel::OBConversion.new - obmol = OpenBabel::OBMol.new - obconversion.set_in_format('inchi') - obconversion.read_string(obmol,@inchi) - smarts_pattern = OpenBabel::OBSmartsPattern.new - smarts_pattern.init(smarts) - smarts_pattern.match(obmol) - end - - # Match an array of smarts strings, returns array with matching smarts - # @example - # compound = OpenTox::Compound.from_name("Benzene") - # compound.match(['cc','cN']) # returns ['cc'] - # @param [Array] smarts_array Array with Smarts strings - # @return [Array] Array with matching Smarts strings - def match(smarts_array) - # avoid recreation of OpenBabel objects - obconversion = OpenBabel::OBConversion.new - obmol = OpenBabel::OBMol.new - obconversion.set_in_format('inchi') - obconversion.read_string(obmol,@inchi) - smarts_pattern = OpenBabel::OBSmartsPattern.new - smarts_array.collect do |smarts| - smarts_pattern.init(smarts) - smarts if smarts_pattern.match(obmol) - end.compact - #smarts_array.collect { |s| s if match?(s)}.compact - end - - # Get URI of compound image with highlighted fragments - # - # @param [Array] activating Array with activating Smarts strings - # @param [Array] deactivating Array with deactivating Smarts strings - # @return [String] URI for compound image with highlighted fragments - def matching_smarts_image_uri(activating, deactivating) - activating_smarts = URI.encode "\"#{activating.join("\"/\"")}\"" - deactivating_smarts = URI.encode "\"#{deactivating.join("\"/\"")}\"" - File.join @uri, "smarts/activating", URI.encode(activating_smarts),"deactivating", URI.encode(deactivating_smarts) - end - - - private - - # Convert sdf to inchi - def self.sdf2inchi(sdf) - Compound.obconversion(sdf,'sdf','inchi') - end - - # Convert smiles to inchi - def self.smiles2inchi(smiles) - Compound.obconversion(smiles,'smi','inchi') - end - - # Convert smiles to canonical smiles - def self.smiles2cansmi(smiles) - Compound.obconversion(smiles,'smi','can') - end - - # Convert identifier from OpenBabel input_format to OpenBabel output_format - def self.obconversion(identifier,input_format,output_format) - obconversion = OpenBabel::OBConversion.new - obmol = OpenBabel::OBMol.new - obconversion.set_in_and_out_formats input_format, output_format - obconversion.read_string obmol, identifier - case output_format - when /smi|can|inchi/ - obconversion.write_string(obmol).gsub(/\s/,'').chomp - else - obconversion.write_string(obmol) - end - end - - - - # Match an array of smarts strings, returns hash - # Keys: matching smarts, values: number of non-unique hits, or 1 - # @param [Array] smarts_array Array with Smarts strings - # @param use_hits [Boolean] Whether non-unique hits or 1 should be produced - # @return [Hash] Hash with matching Smarts as keys, nr-of-hits/1 as values - # @example - # compound = Compound.from_name("Benzene") - # compound.match(['cc','cN'],true) # returns { 'cc' => 12 }, 'cN' is not included because it does not match - # compound.match(['cc','cN'],false) # returns { 'cc' => 1 } - def match_hits(smarts_array, use_hits=true) - obconversion = OpenBabel::OBConversion.new - obmol = OpenBabel::OBMol.new - obconversion.set_in_format('inchi') - obconversion.read_string(obmol,inchi) - smarts_pattern = OpenBabel::OBSmartsPattern.new - smarts_hits = {} - smarts_array.collect do |smarts| - smarts_pattern.init(smarts) - if smarts_pattern.match(obmol) - if use_hits - hits = smarts_pattern.get_map_list - smarts_hits[smarts] = hits.to_a.size - else - smarts_hits[smarts] = 1 - end - end - end - smarts_hits - end - - # Provided for backward compatibility - def match(smarts_array) - match_hits(smarts_array,false) - end -=end - end end diff --git a/lib/model.rb b/lib/model.rb index 1dbac6d..c2914eb 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -45,11 +45,13 @@ module OpenTox class Generic include OpenTox include OpenTox::Algorithm + include Model end class Lazar include OpenTox include OpenTox::Algorithm + include Model def self.create params Lazar.new(File.join($algorithm[:uri], "lazar")).run params end -- cgit v1.2.3 From ddb83b4302e8628b333402d24e3e05fc90b3faef Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 10 Jul 2013 14:36:39 +0200 Subject: subjectids partially removed --- lib/algorithm.rb | 8 ++++---- lib/authorization.rb | 11 +++++------ lib/compound.rb | 17 ++++++++--------- lib/dataset.rb | 14 +++++++------- lib/model.rb | 16 +++------------- lib/opentox-client.rb | 10 +++++++++- lib/opentox.rb | 43 ++++++++++++++++++++----------------------- lib/overwrite.rb | 8 ++++---- lib/rest-client-wrapper.rb | 2 +- lib/task.rb | 20 ++++---------------- 10 files changed, 65 insertions(+), 84 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 5cffa88..a725141 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -9,7 +9,7 @@ module OpenTox # @param [optional,Boolean] wait set to false if method should return a task uri instead of the algorithm result # @return [String] URI of new resource (dataset, model, ...) def run params=nil, wait=true - uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => @subjectid} + uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => SUBJECTID} wait_for_task uri if wait end @@ -29,11 +29,11 @@ module OpenTox when "Array" klasses = compounds.collect{|c| c.class}.uniq bad_request_error "First argument contains objects with a different class than OpenTox::Compound or OpenTox::Dataset #{klasses.inspect}" unless klasses.size == 1 and klasses.first == Compound - JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s), SUBJECTID).run(:compound_uri => compounds.collect{|c| c.uri}, :descriptors => descriptors)) + JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s)).run(:compound_uri => compounds.collect{|c| c.uri}, :descriptors => descriptors)) when "OpenTox::Compound" - JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s), SUBJECTID).run(:compound_uri => compounds.uri, :descriptors => descriptors)) + JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s)).run(:compound_uri => compounds.uri, :descriptors => descriptors)) when "OpenTox::Dataset" - task_uri = Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s), SUBJECTID).run(:dataset_uri => compounds.uri, :descriptors => descriptors) + task_uri = Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s)).run(:dataset_uri => compounds.uri, :descriptors => descriptors) Dataset.new(wait_for_task task_uri) else bad_request_error "First argument contains objects with a different class than OpenTox::Compound or OpenTox::Dataset" diff --git a/lib/authorization.rb b/lib/authorization.rb index 4b63cef..4a193ae 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -1,12 +1,11 @@ module OpenTox + if defined?($aa) and $aa[:uri] AA = $aa[:uri] - SUBJECTID = OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) - unauthorized_error "Failed to authenticate user \"#{$aa[:user]}\"." unless OpenTox::Authorization.is_token_valid(SUBJECTID) else AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb - SUBJECTID = nil end + #Module for Authorization and Authentication #@example Authentication # require "opentox-client" @@ -70,11 +69,11 @@ module OpenTox def self.authenticate(user, pw) return nil if !AA begin - out = RestClientWrapper.post("#{AA}/auth/authenticate",{:username=>user, :password => pw}).sub("token.id=","").sub("\n","") + out = RestClientWrapper.post("#{AA}/auth/authenticate",{:username=>user, :password => pw},{:subjectid => ""}).sub("token.id=","").sub("\n","") return out rescue - resource_not_found_error "#{out.inspect}" - return nil + bad_request_error "Authentication failed #{out.inspect}" + #return nil # does not return after throwing an error end end diff --git a/lib/compound.rb b/lib/compound.rb index 82f0d73..9d99ae9 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -1,4 +1,3 @@ -#require "openbabel" CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/" module OpenTox @@ -15,22 +14,22 @@ module OpenTox # compound = OpenTox::Compound.from_smiles("c1ccccc1") # @param [String] smiles Smiles string # @return [OpenTox::Compound] Compound - def self.from_smiles smiles, subjectid=nil - Compound.new RestClientWrapper.post(service_uri, smiles, {:content_type => 'chemical/x-daylight-smiles', :subjectid => subjectid}) + def self.from_smiles smiles + Compound.new RestClientWrapper.post(service_uri, smiles, {:content_type => 'chemical/x-daylight-smiles'}) end # Create a compound from inchi string # @param inchi [String] smiles InChI string # @return [OpenTox::Compound] Compound - def self.from_inchi inchi, subjectid=nil - Compound.new RestClientWrapper.post(service_uri, inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) + def self.from_inchi inchi + Compound.new RestClientWrapper.post(service_uri, inchi, {:content_type => 'chemical/x-inchi'}) end # Create a compound from sdf string # @param sdf [String] smiles SDF string # @return [OpenTox::Compound] Compound - def self.from_sdf sdf, subjectid=nil - Compound.new RestClientWrapper.post(service_uri, sdf, {:content_type => 'chemical/x-mdl-sdfile', :subjectid => subjectid}) + def self.from_sdf sdf + Compound.new RestClientWrapper.post(service_uri, sdf, {:content_type => 'chemical/x-mdl-sdfile'}) end # Create a compound from name. Relies on an external service for name lookups. @@ -38,9 +37,9 @@ module OpenTox # compound = OpenTox::Compound.from_name("Benzene") # @param name [String] can be also an InChI/InChiKey, CAS number, etc # @return [OpenTox::Compound] Compound - def self.from_name name, subjectid=nil + def self.from_name name @inchi = RestClientWrapper.get File.join(CACTUS_URI,URI.escape(name),"stdinchi") - Compound.new RestClientWrapper.post(service_uri, @inchi, {:content_type => 'chemical/x-inchi', :subjectid => subjectid}) + Compound.new RestClientWrapper.post(service_uri, @inchi, {:content_type => 'chemical/x-inchi'}) end # Get InChI diff --git a/lib/dataset.rb b/lib/dataset.rb index 354b443..c2ff833 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -7,7 +7,7 @@ module OpenTox attr_writer :features, :compounds, :data_entries - def initialize uri=nil, subjectid=nil + def initialize uri=nil, subjectid=SUBJECTID super uri, subjectid @features = [] @compounds = [] @@ -35,7 +35,7 @@ module OpenTox if @features.empty? or force_update uri = File.join(@uri,"features") uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n") # ordered datasets return ordered features - @features = uris.collect{|uri| Feature.new(uri,@subjectid)} + @features = uris.collect{|uri| Feature.new(uri)} end @features end @@ -45,7 +45,7 @@ module OpenTox if @compounds.empty? or force_update uri = File.join(@uri,"compounds") uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n") # ordered datasets return ordered compounds - @compounds = uris.collect{|uri| Compound.new(uri,@subjectid)} + @compounds = uris.collect{|uri| Compound.new(uri)} end @compounds end @@ -120,7 +120,7 @@ module OpenTox prediction_feature = nil confidence_feature = nil metadata[RDF::OT.predictedVariables].each do |uri| - feature = OpenTox::Feature.new uri, @subjectid + feature = OpenTox::Feature.new uri case feature.title when /prediction$/ prediction_feature = feature @@ -214,7 +214,7 @@ module OpenTox query = RDF::Query.new({ :uri => { RDF.type => RDF::OT.Compound } }) @compounds = query.execute(@rdf).collect { |solution| OpenTox::Compound.new solution.uri } query = RDF::Query.new({ :uri => { RDF.type => RDF::OT.Feature } }) - @features = query.execute(@rdf).collect { |solution| OpenTox::Feature.new solution.uri, @subjectid } + @features = query.execute(@rdf).collect { |solution| OpenTox::Feature.new solution.uri } @compounds.each_with_index do |c,i| @features.each_with_index do |f,j| end @@ -310,11 +310,11 @@ module OpenTox # @param feats [Array] features objects # @param metadata [Hash] # @return [OpenTox::Dataset] - def split( compound_indices, feats, metadata, subjectid=nil) + def split( compound_indices, feats, metadata) bad_request_error "Dataset.split : Please give compounds as indices" if compound_indices.size==0 or !compound_indices[0].is_a?(Fixnum) bad_request_error "Dataset.split : Please give features as feature objects (given: #{feats})" if feats!=nil and feats.size>0 and !feats[0].is_a?(OpenTox::Feature) - dataset = OpenTox::Dataset.new(nil, subjectid) + dataset = OpenTox::Dataset.new dataset.metadata = metadata dataset.features = (feats ? feats : self.features) compound_indices.each do |c_idx| diff --git a/lib/model.rb b/lib/model.rb index c2914eb..356f4e4 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -1,21 +1,11 @@ module OpenTox module Model -=begin - # Run a model with parameters - # @param params [Hash] Parameters for OpenTox model - # @param wait [optional,OpenTox::Task] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [text/uri-list] Task or resource URI - def run params=nil, wait=true - uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => @subjectid} - wait_for_task uri if wait - end -=end - def feature_type # CH: subjectid is a object variable, no need to pass it as a parameter + def feature_type unless @feature_type bad_request_error "Cannot determine feature type, dependent variable missing in model #{@uri}" unless metadata[RDF::OT.dependentVariables] - @feature_type = OpenTox::Feature.new( metadata[RDF::OT.dependentVariables][0], @subjectid ).feature_type + @feature_type = OpenTox::Feature.new( metadata[RDF::OT.dependentVariables][0]).feature_type end @feature_type end @@ -33,7 +23,7 @@ module OpenTox private def load_predicted_variables metadata[RDF::OT.predictedVariables].each do |f| - feat = OpenTox::Feature.new( f, @subjectid ) + feat = OpenTox::Feature.new( f) if feat.title =~ /confidence/ @predicted_confidence = f else diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index f25f05a..77c6eae 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -26,7 +26,6 @@ RDF::TB = RDF::Vocabulary.new "http://onto.toxbank.net/api/" RDF::ISA = RDF::Vocabulary.new "http://onto.toxbank.net/isa/" RDF::OWL = RDF::Vocabulary.new "http://www.w3.org/2002/07/owl#" -#CLASSES = ["Generic", "Compound", "Feature", "Dataset", "Algorithm", "Model", "Validation", "Task", "Investigation"] CLASSES = ["Compound", "Feature", "Dataset", "Validation", "Task", "Investigation"] RDF_FORMATS = [:rdfxml,:ntriples,:turtle] @@ -51,3 +50,12 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m "validation.rb" ].each{ |f| require_relative f } +module OpenTox + if defined?($aa) and $aa[:uri] + SUBJECTID = OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) + unauthorized_error "Failed to authenticate user \"#{$aa[:user]}\"." unless OpenTox::Authorization.is_token_valid(SUBJECTID) + else + SUBJECTID = nil + end +end + diff --git a/lib/opentox.rb b/lib/opentox.rb index ec18c0f..e6fcf63 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -12,11 +12,9 @@ module OpenTox # Create a new OpenTox object # @param uri [optional,String] URI - # @param subjectid [optional,String] # @return [OpenTox] OpenTox object - def initialize uri=nil, subjectid=nil + def initialize uri=nil, subjectid=SUBJECTID @rdf = RDF::Graph.new - @subjectid = subjectid @metadata = {} @parameters = [] uri ? @uri = uri.to_s.chomp : @uri = File.join(service_uri, SecureRandom.uuid) @@ -25,7 +23,7 @@ module OpenTox # Object metadata (lazy loading) # @return [Hash] Object metadata def metadata force_update=false - if (@metadata.nil? or @metadata.empty? or force_update) and URI.accessible? @uri, @subjectid + if (@metadata.nil? or @metadata.empty? or force_update) and URI.accessible? @uri get if @rdf.nil? or @rdf.empty? or force_update # return values as plain strings instead of RDF objects @metadata = @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } @@ -52,7 +50,7 @@ module OpenTox # {http://opentox.org/dev/apis/api-1.2/interfaces OpenTox API} # @return [Hash] Object parameters def parameters force_update=false - if (@parameters.empty? or force_update) and URI.accessible? @uri, @subjectid + if (@parameters.empty? or force_update) and URI.accessible? @uri get if @rdf.empty? or force_update params = {} query = RDF::Query.new({ @@ -81,10 +79,10 @@ module OpenTox # @param [String,optional] mime_type def get mime_type="text/plain" bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" - response = RestClientWrapper.get(@uri,{},{:accept => mime_type, :subjectid => @subjectid}) + response = RestClientWrapper.get(@uri,{},{:accept => mime_type,:subjectid => @subjectid}) if URI.task?(response) uri = wait_for_task response - response = RestClientWrapper.get(uri,{},{:accept => mime_type, :subjectid => @subjectid}) + response = RestClientWrapper.get(uri,{},{:accept => mime_type,:subjectid => @subjectid}) end parse_ntriples response if mime_type == "text/plain" parse_rdfxml response if mime_type == "application/rdf+xml" @@ -100,15 +98,15 @@ module OpenTox when 'application/rdf+xml' body = self.to_rdfxml end - Authorization.check_policy(@uri, @subjectid) if $aa[:uri] - uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type, :subjectid => @subjectid} + Authorization.check_policy(@uri, SUBJECTID) if $aa[:uri] + uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type,:subjectid => @subjectid} wait ? wait_for_task(uri) : uri end # Save object at webservice (replace or create object) def put wait=true, mime_type="text/plain" bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" - @metadata[RDF::OT.created_at] = DateTime.now unless URI.accessible? @uri, @subjectid + @metadata[RDF::OT.created_at] = DateTime.now unless URI.accessible? @uri #@metadata[RDF::DC.modified] = DateTime.now case mime_type when 'text/plain' @@ -116,14 +114,14 @@ module OpenTox when 'application/rdf+xml' body = self.to_rdfxml end - uri = RestClientWrapper.put @uri.to_s, body, { :content_type => mime_type, :subjectid => @subjectid} + uri = RestClientWrapper.put @uri.to_s, body, { :content_type => mime_type,:subjectid => @subjectid} wait ? wait_for_task(uri) : uri end # Delete object at webservice - def delete subjectid=nil - RestClientWrapper.delete(@uri.to_s,nil,{:subjectid => @subjectid}) - Authorization.delete_policies_from_uri(@uri, @subjectid) if $aa[:uri] + def delete + RestClientWrapper.delete(@uri.to_s,{},{:subjectid => @subjectid}) + Authorization.delete_policies_from_uri(@uri, SUBJECTID) if $aa[:uri] end def service_uri @@ -210,26 +208,25 @@ module OpenTox c = Class.new do include OpenTox - def self.all subjectid=nil - uris = RestClientWrapper.get(service_uri, {}, :accept => 'text/uri-list', :subjectid => subjectid).split("\n").compact - uris.collect{|uri| self.new(uri, subjectid)} + def self.all + uris = RestClientWrapper.get(service_uri, {},{:accept => 'text/uri-list',:subjectid=>@subjectid}).split("\n").compact + uris.collect{|uri| self.new(uri)} end #@example fetching a model # OpenTox::Model.find() -> model-object - def self.find uri, subjectid=nil - URI.accessible?(uri, subjectid) ? self.new(uri, subjectid) : nil + def self.find uri, subjectid=SUBJECTID + URI.accessible?(uri) ? self.new(uri) : nil end - def self.create metadata, subjectid=nil + def self.create metadata, subjectid=SUBJECTID object = self.new nil, subjectid object.metadata = metadata object.put object end - def self.find_or_create metadata, subjectid=nil - puts metadata.inspect + def self.find_or_create metadata, subjectid=SUBJECTID sparql = "SELECT DISTINCT ?s WHERE { " metadata.each do |predicate,objects| unless [RDF::DC.date,RDF::DC.modified,RDF::DC.description].include? predicate # remove dates and description (strange characters in description may lead to SPARQL errors) @@ -245,7 +242,7 @@ module OpenTox end end sparql << "}" - uris = RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list", :subjectid => subjectid}).split("\n") + uris = RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list",:subjectid=>subjectid}).split("\n") if uris.empty? self.create metadata, subjectid else diff --git a/lib/overwrite.rb b/lib/overwrite.rb index fc050ce..c6bf02a 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -84,20 +84,20 @@ module URI uri =~ /task/ and URI.valid? uri end - def self.dataset? uri, subjectid=nil + def self.dataset? uri, subjectid=OpenTox::SUBJECTID uri =~ /dataset/ and URI.accessible? uri, subjectid end - def self.model? uri, subjectid=nil + def self.model? uri, subjectid=OpenTox::SUBJECTID uri =~ /model/ and URI.accessible? uri, subjectid end - def self.ssl? uri, subjectid=nil + def self.ssl? uri, subjectid=OpenTox::SUBJECTID URI.parse(uri).instance_of? URI::HTTPS end # @return [Boolean] checks if resource exists by making a HEAD-request - def self.accessible?(uri, subjectid=nil) + def self.accessible?(uri, subjectid=OpenTox::SUBJECTID) parsed_uri = URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : "")) http_code = URI.task?(uri) ? 600 : 400 http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index f3e6300..2de9377 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -17,7 +17,7 @@ module OpenTox # check input bad_request_error "Headers are not a hash: #{headers.inspect}", uri unless headers==nil or headers.is_a?(Hash) - @subjectid = headers[:subjectid] ? headers[:subjectid] : nil + headers[:subjectid] ||= OpenTox::SUBJECTID bad_request_error "Invalid URI: '#{uri}'", uri unless URI.valid? uri #resource_not_found_error "URI '#{uri}' not found.", uri unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) # make sure that no header parameters are set in the payload diff --git a/lib/task.rb b/lib/task.rb index 3cc05c0..d642f48 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -10,7 +10,7 @@ module OpenTox super true # always update metadata end - def self.run(description, creator=nil, subjectid=nil) + def self.run(description, creator=nil, subjectid=SUBJECTID) task = Task.new nil, subjectid task[RDF::OT.created_at] = DateTime.now @@ -21,21 +21,9 @@ module OpenTox pid = fork do begin task.completed yield - #result_uri = yield - #task.completed result_uri rescue -=begin - #unless $!.is_a?(RuntimeError) # PENDING: only runtime Errors are logged when raised - msg = "\nTask ERROR\n"+ - "task description: #{task[RDF::DC.description]}\n"+ - "task uri: #{$!.class.to_s}\n"+ - "error msg: #{$!.message}\n"+ - "error backtrace:\n#{$!.backtrace[0..cut_index].join("\n")}\n" - $logger.error msg - #end -=end if $!.respond_to? :to_ntriples - RestClientWrapper.put(File.join(task.uri,'Error'),:errorReport => $!.to_ntriples,:content_type => 'text/plain') + RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.to_ntriples},{:content_type => 'text/plain', :subjectid => task.subjectid}) else cut_index = $!.backtrace.find_index{|line| line.match /gems\/sinatra/} cut_index = -1 unless cut_index @@ -53,7 +41,7 @@ module OpenTox nt = RDF::Writer.for(:ntriples).buffer do |writer| @rdf.each{|statement| writer << statement} end - RestClientWrapper.put(File.join(task.uri,'Error'),:errorReport => nt,:content_type => 'text/plain') + RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => nt},{:content_type => 'text/plain', :subjectid => task.subjectid}) end task.kill end @@ -119,7 +107,7 @@ module OpenTox end def code - RestClientWrapper.head(@uri).code.to_i + RestClientWrapper.head(@uri,{},:subjectid => @subjectid).code.to_i end # get only header for status requests -- cgit v1.2.3 From 9c9e53fcb550e6ba01a8de965bfaa2c182e5b05f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 10 Jul 2013 17:49:49 +0200 Subject: descriptor-long test fixed --- lib/opentox.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index e6fcf63..93e2c52 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -133,7 +133,7 @@ module OpenTox @metadata[RDF.type] ||= RDF::URI.new(eval("RDF::OT."+self.class.to_s.split('::').last)) @metadata[RDF::DC.date] ||= DateTime.now @metadata.each do |predicate,values| - [values].flatten.each{ |value| @rdf << [RDF::URI.new(@uri), predicate, (value == eval("RDF::OT."+self.class.to_s.split('::').last)) ? RDF::URI.new(value) : value] } + [values].flatten.each{ |value| @rdf << [RDF::URI.new(@uri), predicate, (value == eval("RDF::OT."+self.class.to_s.split('::').last)) ? RDF::URI.new(value) : value] unless value.nil? } end @parameters.each do |parameter| p_node = RDF::Node.new @@ -156,7 +156,10 @@ module OpenTox # rdf serialization methods for all formats e.g. to_rdfxml send :define_method, "to_#{format}".to_sym do + puts format + puts self.inspect create_rdf + puts @rdf.to_s RDF::Writer.for(format).buffer(:encoding => Encoding::ASCII) do |writer| writer << @rdf end -- cgit v1.2.3 From 18454895a9e426e3a6499ff268044687a996993e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 12 Jul 2013 18:12:18 +0200 Subject: value type identification/conversion fixed --- lib/dataset.rb | 35 ++++++++++++++--------------------- lib/opentox.rb | 3 --- lib/validation.rb | 4 ++-- 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index c2ff833..cb64406 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -64,24 +64,13 @@ module OpenTox RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n").each do |row| r,c,v = row.split("\t") @data_entries[r.to_i] ||= [] - #v = v.to_f if v.numeric? - #v = nil if v.is_a? String and v.empty? - @data_entries[r.to_i][c.to_i] = v - end - # TODO: fallbacks for external and unordered datasets - features.each_with_index do |feature,i| - if feature[RDF.type].include? RDF::OT.NumericFeature - if feature[RDF.type].include? RDF::OT.NominalFeature - if feature[RDF.type].include? RDF::OT.StringFeature - @data_entries.each { |row| row[i] = row[i].to_s if row[i] } - else - @data_entries.each { |row| row[i] = row[i] if row[i] } - end - else - @data_entries.each { |row| row[i] = row[i].to_f if row[i] } + # adjust value class depending on feature type, StringFeature takes precedence over NumericFeature + if features[c.to_i][RDF.type].include? RDF::OT.NumericFeature and ! features[c.to_i][RDF.type].include? RDF::OT.StringFeature + v = v.to_f if v end + @data_entries[r.to_i][c.to_i] = v if v end - end + # TODO: fallbacks for external and unordered datasets end @data_entries end @@ -131,7 +120,8 @@ module OpenTox if prediction_feature and confidence_feature compounds.each do |compound| value = values(compound,prediction_feature).first - confidence = values(compound,confidence_feature).first + value = value.to_f if prediction_feature[RDF.type].include? RDF::OT.NumericFeature and ! prediction_feature[RDF.type].include? RDF::OT.StringFeature + confidence = values(compound,confidence_feature).first.to_f predictions << {:compound => compound, :value => value, :confidence => confidence} if value and confidence end end @@ -147,6 +137,8 @@ module OpenTox def upload filename, wait=true uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}, {:subjectid => @subjectid}) wait_for_task uri if URI.task?(uri) and wait + compounds true + features true metadata true @uri end @@ -160,13 +152,14 @@ module OpenTox row = @compounds.collect{|c| c.uri}.index(compound.uri) @features << feature unless @features.collect{|f| f.uri}.include?(feature.uri) col = @features.collect{|f| f.uri}.index(feature.uri) - @data_entries[row] ||= [] - if @data_entries[row][col] # duplicated values - #row = @compounds.size + if @data_entries[row] and @data_entries[row][col] # duplicated values @compounds << compound row = @compounds.collect{|c| c.uri}.rindex(compound.uri) end - @data_entries[row][col] = value + if value + @data_entries[row] ||= [] + @data_entries[row][col] = value + end end # TODO: remove? might be dangerous if feature ordering is incorrect diff --git a/lib/opentox.rb b/lib/opentox.rb index 93e2c52..73a33d3 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -156,10 +156,7 @@ module OpenTox # rdf serialization methods for all formats e.g. to_rdfxml send :define_method, "to_#{format}".to_sym do - puts format - puts self.inspect create_rdf - puts @rdf.to_s RDF::Writer.for(format).buffer(:encoding => Encoding::ASCII) do |writer| writer << @rdf end diff --git a/lib/validation.rb b/lib/validation.rb index 3b1cf13..565a366 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -53,7 +53,7 @@ module OpenTox # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::Validation] def self.create_training_test_split( params, subjectid=nil, waiting_task=nil ) - params[:subjectid] = subjectid if subjectid + #params[:subjectid] = subjectid if subjectid uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"training_test_split"), params,{:content_type => "text/uri-list", :subjectid => subjectid},waiting_task ) Validation.new(wait_for_task(uri)) @@ -185,7 +185,7 @@ module OpenTox # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::Crossvalidation] def self.create( params, subjectid=nil, waiting_task=nil ) - params[:subjectid] = subjectid if subjectid + #params[:subjectid] = subjectid if subjectid uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"crossvalidation"), params,{:content_type => "text/uri-list", :subjectid => subjectid},waiting_task ) uri = wait_for_task(uri) -- cgit v1.2.3 From 10ffab4d032e3e5584c318a45521e774d49bd3d7 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Mon, 15 Jul 2013 23:05:54 +0200 Subject: add .opentox/config/opentox-clint.rb to install script --- bin/opentox-client-install | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bin/opentox-client-install b/bin/opentox-client-install index bd2f17f..9bb2308 100755 --- a/bin/opentox-client-install +++ b/bin/opentox-client-install @@ -35,6 +35,11 @@ OT_CONFIG_DIR="$HOME/.opentox" RUBY_DIR="$HOME/.rbenv/versions/$RUBY_NUM_VER" +# config +[ -f $OT_CONFIG_DIR/config/$SELF.rb ] || touch $OT_CONFIG_DIR/config/$SELF.rb +if ! cat "$OT_CONFIG_DIR/config/$SELF.rb" | grep "default.rb">/dev/null 2>&1; then echo 'require_relative "default.rb"' >> $OT_CONFIG_DIR/config/$SELF.rb; fi + + # # # Install check_utils "rbenv find" -- cgit v1.2.3 From 80c1821e3a55b0d9c1ee51537e109dff3bc79423 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 16 Jul 2013 17:45:08 +0200 Subject: subjectid handled by RestClientWrapper --- lib/algorithm.rb | 2 +- lib/dataset.rb | 16 +++--- lib/opentox-client.rb | 8 +++ lib/opentox.rb | 40 ++++++++------ lib/overwrite.rb | 14 ++--- lib/rest-client-wrapper.rb | 12 +++- lib/task.rb | 10 ++-- lib/validation.rb | 135 ++++++++++++++++++--------------------------- 8 files changed, 118 insertions(+), 119 deletions(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index a725141..036d345 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -9,7 +9,7 @@ module OpenTox # @param [optional,Boolean] wait set to false if method should return a task uri instead of the algorithm result # @return [String] URI of new resource (dataset, model, ...) def run params=nil, wait=true - uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list", :subjectid => SUBJECTID} + uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list"} wait_for_task uri if wait end diff --git a/lib/dataset.rb b/lib/dataset.rb index cb64406..4fad05b 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -7,8 +7,8 @@ module OpenTox attr_writer :features, :compounds, :data_entries - def initialize uri=nil, subjectid=SUBJECTID - super uri, subjectid + def initialize uri=nil + super uri @features = [] @compounds = [] @data_entries = [] @@ -21,9 +21,9 @@ module OpenTox if @metadata.empty? or force_update uri = File.join(@uri,"metadata") begin - parse_ntriples RestClientWrapper.get(uri,{},{:accept => "text/plain", :subjectid => @subjectid}) + parse_ntriples RestClientWrapper.get(uri,{},{:accept => "text/plain"}) rescue # fall back to rdfxml - parse_rdfxml RestClientWrapper.get(uri,{},{:accept => "application/rdf+xml", :subjectid => @subjectid}) + parse_rdfxml RestClientWrapper.get(uri,{},{:accept => "application/rdf+xml"}) end @metadata = @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } end @@ -34,7 +34,7 @@ module OpenTox def features force_update=false if @features.empty? or force_update uri = File.join(@uri,"features") - uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n") # ordered datasets return ordered features + uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list"}).split("\n") # ordered datasets return ordered features @features = uris.collect{|uri| Feature.new(uri)} end @features @@ -44,7 +44,7 @@ module OpenTox def compounds force_update=false if @compounds.empty? or force_update uri = File.join(@uri,"compounds") - uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n") # ordered datasets return ordered compounds + uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list"}).split("\n") # ordered datasets return ordered compounds @compounds = uris.collect{|uri| Compound.new(uri)} end @compounds @@ -61,7 +61,7 @@ module OpenTox <#{RDF::OT.value}> ?value . ?f <#{RDF::OLO.index}> ?fidx. } ORDER BY ?fidx ?cidx" - RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list", :subjectid => @subjectid}).split("\n").each do |row| + RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list"}).split("\n").each do |row| r,c,v = row.split("\t") @data_entries[r.to_i] ||= [] # adjust value class depending on feature type, StringFeature takes precedence over NumericFeature @@ -135,7 +135,7 @@ module OpenTox # @param filename [String] # @return [String] dataset uri def upload filename, wait=true - uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}, {:subjectid => @subjectid}) + uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}) wait_for_task uri if URI.task?(uri) and wait compounds true features true diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 77c6eae..8683d0f 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -50,6 +50,13 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m "validation.rb" ].each{ |f| require_relative f } +if defined?($aa) and $aa[:uri] + OpenTox::RestClientWrapper.subjectid = OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) + unauthorized_error "Failed to authenticate user \"#{$aa[:user]}\"." unless OpenTox::Authorization.is_token_valid(OpenTox::RestClientWrapper.subjectid) +#else + #@@subjectid = nil +end +=begin module OpenTox if defined?($aa) and $aa[:uri] SUBJECTID = OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) @@ -58,4 +65,5 @@ module OpenTox SUBJECTID = nil end end +=end diff --git a/lib/opentox.rb b/lib/opentox.rb index 73a33d3..87b241a 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -5,7 +5,7 @@ $logger.level = Logger::DEBUG module OpenTox #include RDF CH: leads to namespace clashes with URI class - attr_reader :uri, :subjectid + attr_reader :uri attr_writer :metadata, :parameters # Ruby interface @@ -13,7 +13,7 @@ module OpenTox # Create a new OpenTox object # @param uri [optional,String] URI # @return [OpenTox] OpenTox object - def initialize uri=nil, subjectid=SUBJECTID + def initialize uri=nil @rdf = RDF::Graph.new @metadata = {} @parameters = [] @@ -79,10 +79,10 @@ module OpenTox # @param [String,optional] mime_type def get mime_type="text/plain" bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" - response = RestClientWrapper.get(@uri,{},{:accept => mime_type,:subjectid => @subjectid}) + response = RestClientWrapper.get(@uri,{},{:accept => mime_type}) if URI.task?(response) uri = wait_for_task response - response = RestClientWrapper.get(uri,{},{:accept => mime_type,:subjectid => @subjectid}) + response = RestClientWrapper.get(uri,{},{:accept => mime_type}) end parse_ntriples response if mime_type == "text/plain" parse_rdfxml response if mime_type == "application/rdf+xml" @@ -98,8 +98,8 @@ module OpenTox when 'application/rdf+xml' body = self.to_rdfxml end - Authorization.check_policy(@uri, SUBJECTID) if $aa[:uri] - uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type,:subjectid => @subjectid} + Authorization.check_policy(@uri, RestClientWrapper.subjectid) if $aa[:uri] + uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type} wait ? wait_for_task(uri) : uri end @@ -114,14 +114,14 @@ module OpenTox when 'application/rdf+xml' body = self.to_rdfxml end - uri = RestClientWrapper.put @uri.to_s, body, { :content_type => mime_type,:subjectid => @subjectid} + uri = RestClientWrapper.put @uri, body, { :content_type => mime_type} wait ? wait_for_task(uri) : uri end # Delete object at webservice def delete - RestClientWrapper.delete(@uri.to_s,{},{:subjectid => @subjectid}) - Authorization.delete_policies_from_uri(@uri, SUBJECTID) if $aa[:uri] + RestClientWrapper.delete(@uri) + Authorization.delete_policies_from_uri(@uri, RestClientWrapper.subjectid) if $aa[:uri] end def service_uri @@ -200,6 +200,12 @@ module OpenTox rescue bad_request_error "$#{service}[:uri] variable not set. Please set $#{service}[:uri] or use an explicit uri as first constructor argument " end + def subjectid + RestClientWrapper.subjectid + end + def subjectid=(subjectid) + RestClientWrapper.subjectid = subjectid + end end # create default OpenTox classes with class methods @@ -209,24 +215,24 @@ module OpenTox include OpenTox def self.all - uris = RestClientWrapper.get(service_uri, {},{:accept => 'text/uri-list',:subjectid=>@subjectid}).split("\n").compact + uris = RestClientWrapper.get(service_uri, {},{:accept => 'text/uri-list'}).split("\n").compact uris.collect{|uri| self.new(uri)} end #@example fetching a model # OpenTox::Model.find() -> model-object - def self.find uri, subjectid=SUBJECTID + def self.find uri URI.accessible?(uri) ? self.new(uri) : nil end - def self.create metadata, subjectid=SUBJECTID - object = self.new nil, subjectid + def self.create metadata + object = self.new object.metadata = metadata object.put object end - def self.find_or_create metadata, subjectid=SUBJECTID + def self.find_or_create metadata sparql = "SELECT DISTINCT ?s WHERE { " metadata.each do |predicate,objects| unless [RDF::DC.date,RDF::DC.modified,RDF::DC.description].include? predicate # remove dates and description (strange characters in description may lead to SPARQL errors) @@ -242,11 +248,11 @@ module OpenTox end end sparql << "}" - uris = RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list",:subjectid=>subjectid}).split("\n") + uris = RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list"}).split("\n") if uris.empty? - self.create metadata, subjectid + self.create metadata else - self.new uris.first, subjectid + self.new uris.first end end end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index c6bf02a..ff43347 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -84,21 +84,21 @@ module URI uri =~ /task/ and URI.valid? uri end - def self.dataset? uri, subjectid=OpenTox::SUBJECTID - uri =~ /dataset/ and URI.accessible? uri, subjectid + def self.dataset? uri + uri =~ /dataset/ and URI.accessible? uri end - def self.model? uri, subjectid=OpenTox::SUBJECTID - uri =~ /model/ and URI.accessible? uri, subjectid + def self.model? uri + uri =~ /model/ and URI.accessible? uri end - def self.ssl? uri, subjectid=OpenTox::SUBJECTID + def self.ssl? uri URI.parse(uri).instance_of? URI::HTTPS end # @return [Boolean] checks if resource exists by making a HEAD-request - def self.accessible?(uri, subjectid=OpenTox::SUBJECTID) - parsed_uri = URI.parse(uri + (subjectid ? "?subjectid=#{CGI.escape subjectid}" : "")) + def self.accessible?(uri) + parsed_uri = URI.parse(uri + (OpenTox::RestClientWrapper.subjectid ? "?subjectid=#{CGI.escape OpenTox::RestClientWrapper.subjectid}" : "")) http_code = URI.task?(uri) ? 600 : 400 http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) unless (URI.ssl? uri) == true diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 2de9377..134dd32 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -4,6 +4,16 @@ module OpenTox attr_accessor :request, :response + @@subjectid = nil + + def self.subjectid=(subjectid) + @@subjectid = subjectid + end + + def self.subjectid + @@subjectid + end + # REST methods # Raises OpenTox::Error if call fails (rescued in overwrite.rb -> halt 502) # Does not wait for task to finish and returns task uri @@ -17,7 +27,7 @@ module OpenTox # check input bad_request_error "Headers are not a hash: #{headers.inspect}", uri unless headers==nil or headers.is_a?(Hash) - headers[:subjectid] ||= OpenTox::SUBJECTID + headers[:subjectid] ||= @@subjectid bad_request_error "Invalid URI: '#{uri}'", uri unless URI.valid? uri #resource_not_found_error "URI '#{uri}' not found.", uri unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) # make sure that no header parameters are set in the payload diff --git a/lib/task.rb b/lib/task.rb index d642f48..07efc0f 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -10,9 +10,9 @@ module OpenTox super true # always update metadata end - def self.run(description, creator=nil, subjectid=SUBJECTID) + def self.run(description, creator=nil) - task = Task.new nil, subjectid + task = Task.new nil task[RDF::OT.created_at] = DateTime.now task[RDF::OT.hasStatus] = "Running" task[RDF::DC.description] = description.to_s @@ -23,7 +23,7 @@ module OpenTox task.completed yield rescue if $!.respond_to? :to_ntriples - RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.to_ntriples},{:content_type => 'text/plain', :subjectid => task.subjectid}) + RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.to_ntriples},{:content_type => 'text/plain'}) else cut_index = $!.backtrace.find_index{|line| line.match /gems\/sinatra/} cut_index = -1 unless cut_index @@ -41,7 +41,7 @@ module OpenTox nt = RDF::Writer.for(:ntriples).buffer do |writer| @rdf.each{|statement| writer << statement} end - RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => nt},{:content_type => 'text/plain', :subjectid => task.subjectid}) + RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => nt},{:content_type => 'text/plain'}) end task.kill end @@ -107,7 +107,7 @@ module OpenTox end def code - RestClientWrapper.head(@uri,{},:subjectid => @subjectid).code.to_i + RestClientWrapper.head(@uri).code.to_i end # get only header for status requests diff --git a/lib/validation.rb b/lib/validation.rb index 565a366..997f814 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -9,13 +9,13 @@ module OldOpenTox end # loads metadata via yaml - def load_metadata( subjectid=nil ) - yaml = OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid, :accept => "application/x-yaml"}) + def load_metadata + yaml = OpenTox::RestClientWrapper.get(uri,nil,{:accept => "application/x-yaml"}) @metadata = YAML.load(yaml) end - def delete (subjectid=nil) - OpenTox::RestClientWrapper.delete(@uri.to_s,nil,{:subjectid => subjectid}) + def delete + OpenTox::RestClientWrapper.delete @uri.to_s end end @@ -26,80 +26,71 @@ module OpenTox # find validation, raises error if not found # @param [String] uri - # @param [String,optional] subjectid # @return [OpenTox::Validation] - def self.find( uri, subjectid=nil ) + def self.find( uri ) val = Validation.new(uri) - val.load_metadata( subjectid ) + val.load_metadata val end # returns a filtered list of validation uris # @param params [Hash,optional] validation-params to filter the uris (could be model, training_dataset, ..) # @return [Array] - def self.list( params={}, subjectid=nil ) + def self.list( params={} ) filter_string = "" params.each do |k,v| filter_string += (filter_string.length==0 ? "?" : "&") v = v.to_s.gsub(/;/, "%3b") if v.to_s =~ /;/ filter_string += k.to_s+"="+v.to_s end - (OpenTox::RestClientWrapper.get($validation[:uri]+filter_string,nil,{:subjectid => subjectid}).split("\n")) + (OpenTox::RestClientWrapper.get($validation[:uri]+filter_string).split("\n")) end # creates a training test split validation, waits until it finishes, may take some time # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,split_ratio(0.67),random_seed(1)) - # @param [String,optional] subjectid # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::Validation] - def self.create_training_test_split( params, subjectid=nil, waiting_task=nil ) - #params[:subjectid] = subjectid if subjectid + def self.create_training_test_split( params, waiting_task=nil ) uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"training_test_split"), - params,{:content_type => "text/uri-list", :subjectid => subjectid},waiting_task ) + params,{:content_type => "text/uri-list"},waiting_task ) Validation.new(wait_for_task(uri)) end # creates a training test validation, waits until it finishes, may take some time # @param [Hash] params (required:algorithm_uri,training_dataset_uri,prediction_feature,test_dataset_uri,optional:algorithm_params) - # @param [String,optional] subjectid # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::Validation] - def self.create_training_test_validation( params, subjectid=nil, waiting_task=nil ) - params[:subjectid] = subjectid if subjectid + def self.create_training_test_validation( params, waiting_task=nil ) uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"training_test_validation"), - params,{:content_type => "text/uri-list", :subjectid => subjectid},waiting_task ) + params,{:content_type => "text/uri-list"},waiting_task ) Validation.new(wait_for_task(uri)) end # creates a bootstrapping validation, waits until it finishes, may take some time # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,random_seed(1)) - # @param [String,optional] subjectid # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::Validation] - def self.create_bootstrapping_validation( params, subjectid=nil, waiting_task=nil ) - params[:subjectid] = subjectid if subjectid + def self.create_bootstrapping_validation( params, waiting_task=nil ) uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"bootstrapping"), - params,{:content_type => "text/uri-list", :subjectid => subjectid},waiting_task ) + params,{:content_type => "text/uri-list"},waiting_task ) Validation.new(wait_for_task(uri)) end # looks for report for this validation, creates a report if no report is found - # @param [String,optional] subjectid # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [String] report uri - def find_or_create_report( subjectid=nil, waiting_task=nil ) - @report = ValidationReport.find_for_validation(@uri, subjectid) unless @report - @report = ValidationReport.create(@uri, {}, subjectid, waiting_task) unless @report + def find_or_create_report( waiting_task=nil ) + @report = ValidationReport.find_for_validation(@uri) unless @report + @report = ValidationReport.create(@uri, waiting_task) unless @report @report.uri end # creates a validation object from crossvaldiation statistics, raise error if not found # (as crossvaldiation statistics are returned as an average valdidation over all folds) # @param crossvalidation_uri [String] crossvalidation uri - # @param [String,optional] subjectid # @return [OpenTox::Validation] - def self.from_cv_statistics( crossvalidation_uri, subjectid=nil ) - find( File.join(crossvalidation_uri, 'statistics'),subjectid ) + def self.from_cv_statistics( crossvalidation_uri ) + find( File.join(crossvalidation_uri, 'statistics') ) end # returns confusion matrix as array, predicted values are in rows @@ -131,7 +122,6 @@ module OpenTox # # @param confidence [Float] confidence value (between 0 and 1) # @param prediction [String] predicted value - # @param subjectid [String,optional] # @return [Hash] see example # @example # Example 1: @@ -145,9 +135,9 @@ module OpenTox # the given confidence value was to high (i.e. <12 predictions with confidence value >= 0.8) # the top 12 "active" predictions have a min_confidence of 0.45, 90 percent of them beeing correct # - def probabilities( confidence, prediction, subjectid=nil ) + def probabilities( confidence, prediction ) YAML.load(OpenTox::RestClientWrapper.get(@uri+"/probabilities?prediction="+prediction.to_s+"&confidence="+confidence.to_s,nil, - {:subjectid => subjectid, :accept => "application/x-yaml"})) + {:accept => "application/x-yaml"})) end end @@ -158,11 +148,10 @@ module OpenTox # find crossvalidation, raises error if not found # @param [String] uri - # @param [String,optional] subjectid # @return [OpenTox::Crossvalidation] - def self.find( uri, subjectid=nil ) + def self.find( uri ) cv = Crossvalidation.new(uri) - cv.load_metadata( subjectid ) + cv.load_metadata cv end @@ -181,42 +170,39 @@ module OpenTox # creates a crossvalidations, waits until it finishes, may take some time # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,num_folds(10),random_seed(1),stratified(false)) - # @param [String,optional] subjectid # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::Crossvalidation] - def self.create( params, subjectid=nil, waiting_task=nil ) - #params[:subjectid] = subjectid if subjectid + def self.create( params, waiting_task=nil ) uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"crossvalidation"), - params,{:content_type => "text/uri-list", :subjectid => subjectid},waiting_task ) + params,{:content_type => "text/uri-list"},waiting_task ) uri = wait_for_task(uri) Crossvalidation.new(uri) end # looks for report for this crossvalidation, creates a report if no report is found - # @param [String,optional] subjectid # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [String] report uri - def find_or_create_report( subjectid=nil, waiting_task=nil ) - @report = CrossvalidationReport.find_for_crossvalidation(@uri, subjectid) unless @report - @report = CrossvalidationReport.create(@uri, subjectid, waiting_task) unless @report + def find_or_create_report( waiting_task=nil ) + @report = CrossvalidationReport.find_for_crossvalidation(@uri) unless @report + @report = CrossvalidationReport.create(@uri, waiting_task) unless @report @report.uri end # loads metadata via yaml from crossvalidation object # fields (like for example the validations) can be acces via validation.metadata[RDF::OT.validation] - def load_metadata( subjectid=nil ) - @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid, :accept => "application/x-yaml"})) + def load_metadata + @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,nil,{:accept => "application/x-yaml"})) end # returns a Validation object containing the statistics of the crossavlidation - def statistics( subjectid=nil ) - Validation.from_cv_statistics( @uri, subjectid ) + def statistics + Validation.from_cv_statistics( @uri ) end # documentation see OpenTox::Validation.probabilities - def probabilities( confidence, prediction, subjectid=nil ) + def probabilities( confidence, prediction ) YAML.load(OpenTox::RestClientWrapper.get(@uri+"/statistics/probabilities?prediction="+prediction.to_s+"&confidence="+confidence.to_s,nil, - {:subjectid => subjectid, :accept => "application/x-yaml"})) + {:accept => "application/x-yaml"})) end end @@ -226,22 +212,20 @@ module OpenTox # finds ValidationReport via uri, raises error if not found # @param [String] uri - # @param [String,optional] subjectid # @return [OpenTox::ValidationReport] - def self.find( uri, subjectid=nil ) - OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid}) + def self.find( uri ) + OpenTox::RestClientWrapper.get(uri) rep = ValidationReport.new(uri) - rep.load_metadata( subjectid ) + rep.load_metadata rep end # finds ValidationReport for a particular validation # @param validation_uri [String] crossvalidation uri - # @param subjectid [String,optional] # @return [OpenTox::ValidationReport] nil if no report found - def self.find_for_validation( validation_uri, subjectid=nil ) + def self.find_for_validation( validation_uri ) uris = RestClientWrapper.get(File.join($validation[:uri], - "/report/validation?validation="+validation_uri),nil,{:subjectid => subjectid}).chomp.split("\n") + "/report/validation?validation="+validation_uri)).chomp.split("\n") uris.size==0 ? nil : ValidationReport.new(uris[-1]) end @@ -249,16 +233,14 @@ module OpenTox # @param validation_uri [String] validation uri # @param params [Hash] params addiditonal possible # (min_confidence, params={}, min_num_predictions, max_num_predictions) - # @param subjectid [String,optional] # @param waiting_task [OpenTox::Task,optional] (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::ValidationReport] - def self.create( validation_uri, params={}, subjectid=nil, waiting_task=nil ) + def self.create( validation_uri, params={}, waiting_task=nil ) params = {} if params==nil bad_request_error "params is no hash" unless params.is_a?(Hash) params[:validation_uris] = validation_uri - params[:subjectid] = subjectid uri = RestClientWrapper.post(File.join($validation[:uri],"/report/validation"), - params, {:subjectid => subjectid}, waiting_task ) + params, {}, waiting_task ) uri = wait_for_task(uri) ValidationReport.new(uri) end @@ -270,33 +252,30 @@ module OpenTox # finds CrossvalidationReport via uri, raises error if not found # @param [String] uri - # @param [String,optional] subjectid # @return [OpenTox::CrossvalidationReport] - def self.find( uri, subjectid=nil ) - OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid}) + def self.find( uri ) + OpenTox::RestClientWrapper.get(uri) rep = CrossvalidationReport.new(uri) - rep.load_metadata( subjectid ) + rep.load_metadata rep end # finds CrossvalidationReport for a particular crossvalidation # @param crossvalidation_uri [String] crossvalidation uri - # @param subjectid [String,optional] # @return [OpenTox::CrossvalidationReport] nil if no report found - def self.find_for_crossvalidation( crossvalidation_uri, subjectid=nil ) + def self.find_for_crossvalidation( crossvalidation_uri ) uris = RestClientWrapper.get(File.join($validation[:uri], - "/report/crossvalidation?crossvalidation="+crossvalidation_uri),nil,{:subjectid => subjectid}).chomp.split("\n") + "/report/crossvalidation?crossvalidation="+crossvalidation_uri)).chomp.split("\n") uris.size==0 ? nil : CrossvalidationReport.new(uris[-1]) end # creates a crossvalidation report via crossvalidation # @param crossvalidation_uri [String] crossvalidation uri - # @param subjectid [String,optional] # @param waiting_task [OpenTox::Task,optional] (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::CrossvalidationReport] - def self.create( crossvalidation_uri, subjectid=nil, waiting_task=nil ) + def self.create( crossvalidation_uri, waiting_task=nil ) uri = RestClientWrapper.post(File.join($validation[:uri],"/report/crossvalidation"), - { :validation_uris => crossvalidation_uri, :subjectid => subjectid }, {}, waiting_task ) + { :validation_uris => crossvalidation_uri }, {}, waiting_task ) uri = wait_for_task(uri) CrossvalidationReport.new(uri) end @@ -308,22 +287,20 @@ module OpenTox # finds AlgorithmComparisonReport via uri, raises error if not found # @param [String] uri - # @param [String,optional] subjectid # @return [OpenTox::CrossvalidationReport] - def self.find( uri, subjectid=nil ) - OpenTox::RestClientWrapper.get(uri,nil,{:subjectid => subjectid}) + def self.find( uri ) + OpenTox::RestClientWrapper.get(uri) rep = AlgorithmComparisonReport.new(uri) - rep.load_metadata( subjectid ) + rep.load_metadata rep end # finds AlgorithmComparisonReport for a particular crossvalidation # @param crossvalidation_uri [String] crossvalidation uri - # @param subjectid [String,optional] # @return [OpenTox::AlgorithmComparisonReport] nil if no report found - def self.find_for_crossvalidation( crossvalidation_uri, subjectid=nil ) + def self.find_for_crossvalidation( crossvalidation_uri ) uris = RestClientWrapper.get(File.join($validation[:uri], - "/report/algorithm_comparison?crossvalidation="+crossvalidation_uri),nil,{:subjectid => subjectid}).chomp.split("\n") + "/report/algorithm_comparison?crossvalidation="+crossvalidation_uri)).chomp.split("\n") uris.size==0 ? nil : AlgorithmComparisonReport.new(uris[-1]) end @@ -331,13 +308,12 @@ module OpenTox # @param crossvalidation_uri_hash [Hash] crossvalidation uri_hash, see example # @param params [Hash] params addiditonal possible # (ttest_significance, ttest_attributes, min_confidence, min_num_predictions, max_num_predictions) - # @param subjectid [String,optional] # @param waiting_task [OpenTox::Task,optional] (can be a OpenTox::Subtask as well), progress is updated accordingly # @return [OpenTox::AlgorithmComparisonReport] # example for hash: # { :lazar-bbrc => [ http://host/validation/crossvalidation/x1, http://host/validation/crossvalidation/x2 ], # :lazar-last => [ http://host/validation/crossvalidation/xy, http://host/validation/crossvalidation/xy ] } - def self.create( crossvalidation_uri_hash, params={}, subjectid=nil, waiting_task=nil ) + def self.create( crossvalidation_uri_hash, params={}, waiting_task=nil ) identifier = [] validation_uris = [] crossvalidation_uri_hash.each do |id, uris| @@ -350,8 +326,7 @@ module OpenTox raise OpenTox::BadRequestError.new "params is no hash" unless params.is_a?(Hash) params[:validation_uris] = validation_uris.join(",") params[:identifier] = identifier.join(",") - params[:subjectid] = subjectid - uri = RestClientWrapper.post(File.join($validation[:uri],"/report/algorithm_comparison"), params, {:subjectid => subjectid}, waiting_task ) + uri = RestClientWrapper.post(File.join($validation[:uri],"/report/algorithm_comparison"), params, waiting_task ) uri = wait_for_task(uri) AlgorithmComparisonReport.new(uri) end -- cgit v1.2.3 From 2feb76632284109b45aba5cdcedf377541acf7ef Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 16 Jul 2013 18:54:25 +0200 Subject: comments removed --- lib/opentox-client.rb | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 8683d0f..7c48d9c 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -53,17 +53,5 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m if defined?($aa) and $aa[:uri] OpenTox::RestClientWrapper.subjectid = OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) unauthorized_error "Failed to authenticate user \"#{$aa[:user]}\"." unless OpenTox::Authorization.is_token_valid(OpenTox::RestClientWrapper.subjectid) -#else - #@@subjectid = nil end -=begin -module OpenTox - if defined?($aa) and $aa[:uri] - SUBJECTID = OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) - unauthorized_error "Failed to authenticate user \"#{$aa[:user]}\"." unless OpenTox::Authorization.is_token_valid(SUBJECTID) - else - SUBJECTID = nil - end -end -=end -- cgit v1.2.3 From 16414dd1acc267211b55f222c31f4a8d299f23bb Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 17 Jul 2013 12:29:15 +0200 Subject: dataset ntriples serialisation fixed and activated --- lib/dataset.rb | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 4fad05b..2d3c533 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -250,7 +250,6 @@ module OpenTox end # TODO: fix bug that affects data_entry positions -=begin def to_ntriples # redefined string version for better performance ntriples = "" @@ -268,7 +267,7 @@ module OpenTox end @features.each_with_index do |feature,i| ntriples << "<#{feature.uri}> <#{RDF.type}> <#{RDF::OT.Feature}> .\n" - ntriples << "<#{feature.uri}> <#{RDF::OLO.index}> '#{i}' .\n" + ntriples << "<#{feature.uri}> <#{RDF::OLO.index}> '#{i}'^^ .\n" # sorting at dataset service does not work without type information end @compounds.each_with_index do |compound,i| ntriples << "<#{compound.uri}> <#{RDF.type}> <#{RDF::OT.Compound}> .\n" @@ -276,16 +275,14 @@ module OpenTox ntriples << "<#{compound.uri}> <#{RDF.type}> <#{RDF::OT.Neighbor}> .\n" end - ntriples << "<#{compound.uri}> <#{RDF::OLO.index}> '#{i}' .\n" - #data_entry_node = RDF::Node.new + ntriples << "<#{compound.uri}> <#{RDF::OLO.index}> '#{i}'^^ .\n" # sorting at dataset service does not work without type information data_entry_node = "_:dataentry"+ i.to_s ntriples << "<#{@uri}> <#{RDF::OT.dataEntry}> #{data_entry_node} .\n" ntriples << "#{data_entry_node} <#{RDF.type}> <#{RDF::OT.DataEntry}> .\n" - ntriples << "#{data_entry_node} <#{RDF::OLO.index}> '#{i}' .\n" + ntriples << "#{data_entry_node} <#{RDF::OLO.index}> '#{i}'^^ .\n" # sorting at dataset service does not work without type information ntriples << "#{data_entry_node} <#{RDF::OT.compound}> <#{compound.uri}> .\n" @data_entries[i].each_with_index do |value,j| value_node = data_entry_node+ "_value"+ j.to_s - #value_node = RDF::Node.new ntriples << "#{data_entry_node} <#{RDF::OT.values}> #{value_node} .\n" ntriples << "#{value_node} <#{RDF::OT.feature}> <#{@features[j].uri}> .\n" ntriples << "#{value_node} <#{RDF::OT.value}> '#{value}' .\n" @@ -294,7 +291,6 @@ module OpenTox ntriples end -=end # Methods for for validation service -- cgit v1.2.3 From e1ab21b21e88254b796c47c83f44d406e37f06a8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 17 Jul 2013 14:50:35 +0200 Subject: uri objects fixed in ntriples serialsiation --- lib/dataset.rb | 12 +++++++----- lib/opentox.rb | 13 +++++++++++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 2d3c533..153cdce 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -254,13 +254,15 @@ module OpenTox ntriples = "" @metadata[RDF.type] = [ RDF::OT.Dataset, RDF::OT.OrderedDataset ] - @metadata[RDF.type] ||= eval("RDF::OT."+self.class.to_s.split('::').last) - @metadata[RDF::DC.date] ||= DateTime.now + @metadata.each do |predicate,values| - [values].flatten.each { |value| ntriples << "<#{@uri}> <#{predicate}> '#{value}' .\n" } + [values].flatten.each do |value| + URI.valid?(value) ? value = "<#{value}>" : value = "'#{value}'" + ntriples << "<#{@uri}> <#{predicate}> #{value} .\n" + end end - @parameters.each do |parameter| - p_node = RDF::Node.new.to_s + @parameters.each_with_index do |parameter,i| + p_node = "_:parameter"+ i.to_s ntriples << "<#{@uri}> <#{RDF::OT.parameters}> #{p_node} .\n" ntriples << "#{p_node} <#{RDF.type}> <#{RDF::OT.Parameter}> .\n" parameter.each { |k,v| ntriples << "#{p_node} <#{k}> '#{v}' .\n" } diff --git a/lib/opentox.rb b/lib/opentox.rb index 87b241a..5e0bc29 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -233,6 +233,7 @@ module OpenTox end def self.find_or_create metadata + t = Time.now sparql = "SELECT DISTINCT ?s WHERE { " metadata.each do |predicate,objects| unless [RDF::DC.date,RDF::DC.modified,RDF::DC.description].include? predicate # remove dates and description (strange characters in description may lead to SPARQL errors) @@ -248,11 +249,19 @@ module OpenTox end end sparql << "}" + puts "Create SPARQL: #{Time.now-t}" + t = Time.new uris = RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list"}).split("\n") + puts "Query: #{Time.now-t}" + t = Time.new if uris.empty? - self.create metadata + f=self.create metadata + puts "Create: #{Time.now-t}" + f else - self.new uris.first + f=self.new uris.first + puts "Found: #{Time.now-t}" + f end end end -- cgit v1.2.3 From 99cdafeb2ec52aa2b9a3464efbd15c477cbe480e Mon Sep 17 00:00:00 2001 From: davor Date: Tue, 23 Jul 2013 17:39:21 +0200 Subject: Fixed RDF parser problem in to_ntriples. --- lib/dataset.rb | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 153cdce..ffe6e09 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -50,7 +50,7 @@ module OpenTox @compounds end - # @return [Array] with two dimensions, + # @return [Array] with two dimensions, # first index: compounds, second index: features, values: compound feature values def data_entries force_update=false if @data_entries.empty? or force_update @@ -68,7 +68,7 @@ module OpenTox if features[c.to_i][RDF.type].include? RDF::OT.NumericFeature and ! features[c.to_i][RDF.type].include? RDF::OT.StringFeature v = v.to_f if v end - @data_entries[r.to_i][c.to_i] = v if v + @data_entries[r.to_i][c.to_i] = v if v end # TODO: fallbacks for external and unordered datasets end @@ -142,7 +142,7 @@ module OpenTox metadata true @uri end - + # @param compound [OpenTox::Compound] # @param feature [OpenTox::Feature] # @param value [Object] (will be converted to String) @@ -164,8 +164,8 @@ module OpenTox # TODO: remove? might be dangerous if feature ordering is incorrect # MG: I would not remove this because add_data_entry is very slow (4 times searching in arrays) - # CH: do you have measurements? compound and feature arrays are not that big, I suspect that feature search/creation is the time critical step - # @param row [Array] + # CH: do you have measurements? compound and feature arrays are not that big, I suspect that feature search/creation is the time critical step + # @param row [Array] # @example # d = Dataset.new # d.features << Feature.new(a) @@ -257,19 +257,19 @@ module OpenTox @metadata.each do |predicate,values| [values].flatten.each do |value| - URI.valid?(value) ? value = "<#{value}>" : value = "'#{value}'" - ntriples << "<#{@uri}> <#{predicate}> #{value} .\n" + URI.valid?(value) ? value = "<#{value}>" : value = "\"#{value}\"" + ntriples << "<#{@uri}> <#{predicate}> #{value} ." #\n" end end @parameters.each_with_index do |parameter,i| p_node = "_:parameter"+ i.to_s ntriples << "<#{@uri}> <#{RDF::OT.parameters}> #{p_node} .\n" ntriples << "#{p_node} <#{RDF.type}> <#{RDF::OT.Parameter}> .\n" - parameter.each { |k,v| ntriples << "#{p_node} <#{k}> '#{v}' .\n" } + parameter.each { |k,v| ntriples << "#{p_node} <#{k}> \"#{v}\" .\n" } end @features.each_with_index do |feature,i| ntriples << "<#{feature.uri}> <#{RDF.type}> <#{RDF::OT.Feature}> .\n" - ntriples << "<#{feature.uri}> <#{RDF::OLO.index}> '#{i}'^^ .\n" # sorting at dataset service does not work without type information + ntriples << "<#{feature.uri}> <#{RDF::OLO.index}> \"#{i}\"^^ .\n" # sorting at dataset service does not work without type information end @compounds.each_with_index do |compound,i| ntriples << "<#{compound.uri}> <#{RDF.type}> <#{RDF::OT.Compound}> .\n" @@ -277,17 +277,17 @@ module OpenTox ntriples << "<#{compound.uri}> <#{RDF.type}> <#{RDF::OT.Neighbor}> .\n" end - ntriples << "<#{compound.uri}> <#{RDF::OLO.index}> '#{i}'^^ .\n" # sorting at dataset service does not work without type information + ntriples << "<#{compound.uri}> <#{RDF::OLO.index}> \"#{i}\"^^ .\n" # sorting at dataset service does not work without type information data_entry_node = "_:dataentry"+ i.to_s ntriples << "<#{@uri}> <#{RDF::OT.dataEntry}> #{data_entry_node} .\n" ntriples << "#{data_entry_node} <#{RDF.type}> <#{RDF::OT.DataEntry}> .\n" - ntriples << "#{data_entry_node} <#{RDF::OLO.index}> '#{i}'^^ .\n" # sorting at dataset service does not work without type information + ntriples << "#{data_entry_node} <#{RDF::OLO.index}> \"#{i}\"^^ .\n" # sorting at dataset service does not work without type information ntriples << "#{data_entry_node} <#{RDF::OT.compound}> <#{compound.uri}> .\n" @data_entries[i].each_with_index do |value,j| value_node = data_entry_node+ "_value"+ j.to_s ntriples << "#{data_entry_node} <#{RDF::OT.values}> #{value_node} .\n" ntriples << "#{value_node} <#{RDF::OT.feature}> <#{@features[j].uri}> .\n" - ntriples << "#{value_node} <#{RDF::OT.value}> '#{value}' .\n" + ntriples << "#{value_node} <#{RDF::OT.value}> \"#{value}\" .\n" end end ntriples -- cgit v1.2.3 From 4c67ec94dec9d8116dcd122ac4e0c58631881adb Mon Sep 17 00:00:00 2001 From: davor Date: Wed, 24 Jul 2013 18:57:50 +0200 Subject: Fixed RDF parser problem. --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index ffe6e09..6bb0874 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -265,7 +265,7 @@ module OpenTox p_node = "_:parameter"+ i.to_s ntriples << "<#{@uri}> <#{RDF::OT.parameters}> #{p_node} .\n" ntriples << "#{p_node} <#{RDF.type}> <#{RDF::OT.Parameter}> .\n" - parameter.each { |k,v| ntriples << "#{p_node} <#{k}> \"#{v}\" .\n" } + parameter.each { |k,v| ntriples << "#{p_node} <#{k}> \"#{v.to_s.tr('"', '\'')}\" .\n" } end @features.each_with_index do |feature,i| ntriples << "<#{feature.uri}> <#{RDF.type}> <#{RDF::OT.Feature}> .\n" -- cgit v1.2.3 From 38d7ac9891d3289d665197619f9d456174b68456 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 26 Jul 2013 13:04:06 +0200 Subject: remove some subjectids --- lib/authorization.rb | 137 ++++++++++++++++++++++++++------------------------- 1 file changed, 70 insertions(+), 67 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 4a193ae..b5997b8 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -10,8 +10,8 @@ module OpenTox #@example Authentication # require "opentox-client" # OpenTox::Authorization::AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb - # subjectid = OpenTox::Authorization.authenticate("username", "password") - # puts OpenTox::Authorization.authorize("http://example.uri/testpath/", "GET", subjectid) + # OpenTox::Authorization.authenticate("username", "password") + # puts OpenTox::Authorization.authorize("http://example.uri/testpath/", "GET") #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification module Authorization @@ -23,13 +23,12 @@ module OpenTox # OpenTox::Authorization.create_policy(xml,tok) class Helper - attr_accessor :user, :subjectid, :policy + attr_accessor :user, :policy #Generates AA object - requires subjectid # @param [String] subjectid - def initialize(subjectid) - @user = Authorization.get_user(subjectid) - @subjectid = subjectid + def initialize + @user = Authorization.get_user @policy = Policies.new() end @@ -47,10 +46,10 @@ module OpenTox def send(uri) xml = get_xml(uri) ret = false - ret = Authorization.create_policy(xml, @subjectid) - $logger.warn "Create policy on openSSO failed for URI: #{uri} subjectid: #{@subjectid}. Will try again." if !ret - ret = Authorization.create_policy(xml, @subjectid) if !ret - $logger.debug "Policy send with subjectid: #{@subjectid}" + ret = Authorization.create_policy(xml) + $logger.warn "Create policy on openSSO failed for URI: #{uri} subjectid: #{RestClientWrapper.subjectid}. Will try again." if !ret + ret = Authorization.create_policy(xml) if !ret + $logger.debug "Policy send with subjectid: #{RestClientWrapper.subjectid}" $logger.error "Not created Policy is: #{xml}" if !ret ret end @@ -69,11 +68,15 @@ module OpenTox def self.authenticate(user, pw) return nil if !AA begin - out = RestClientWrapper.post("#{AA}/auth/authenticate",{:username=>user, :password => pw},{:subjectid => ""}).sub("token.id=","").sub("\n","") - return out + res = RestClientWrapper.post("#{AA}/auth/authenticate",{:username=>user, :password => pw},{:subjectid => ""}).sub("token.id=","").sub("\n","") + if is_token_valid(res) + RestClientWrapper.subjectid = res + return true + else + bad_request_error "Authentication failed #{res.inspect}" + end rescue - bad_request_error "Authentication failed #{out.inspect}" - #return nil # does not return after throwing an error + bad_request_error "Authentication failed #{res.inspect}" end end @@ -82,7 +85,7 @@ module OpenTox # @return [Boolean] true if logout is OK def self.logout(subjectid) begin - out = RestClientWrapper.post("#{AA}/auth/logout",:subjectid => subjectid) + out = RestClientWrapper.post("#{AA}/auth/logout", :subjectid => subjectid) return true unless is_token_valid(subjectid) rescue return false @@ -95,9 +98,9 @@ module OpenTox # @param [String] action request method # @param [String] subjectid # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). - def self.authorize(uri, action, subjectid) + def self.authorize(uri, action) return true if !AA - return true if RestClientWrapper.post("#{AA}/auth/authorize",{:uri => uri, :action => action, :subjectid => subjectid})== "boolean=true\n" + return true if RestClientWrapper.post("#{AA}/auth/authorize",{:uri => uri, :action => action})== "boolean=true\n" return false end @@ -117,9 +120,9 @@ module OpenTox #Returns array with all policies of the token owner # @param [String]subjectid requires subjectid # @return [Array, nil] returns an Array of policy names or nil if request fails - def self.list_policies(subjectid) + def self.list_policies begin - out = RestClientWrapper.get("#{AA}/pol",nil,:subjectid => subjectid) + out = RestClientWrapper.get("#{AA}/pol",nil) return out.split("\n") rescue return nil @@ -130,9 +133,9 @@ module OpenTox # @param policy [String] policyname # @param subjectid [String] # @return [String] XML of the policy - def self.list_policy(policy, subjectid) + def self.list_policy(policy) begin - return RestClientWrapper.get("#{AA}/pol",nil,{:subjectid => subjectid,:id => policy}) + return RestClientWrapper.get("#{AA}/pol",nil,{:id => policy}) rescue return nil end @@ -141,11 +144,11 @@ module OpenTox # Lists policies alongside with affected uris # @param [String] subjectid # @return [Hash] keys: all policies of the subjectid owner, values: uris affected by those policies - def self.list_policies_uris( subjectid ) - names = list_policies(subjectid) + def self.list_policies_uris + names = list_policies policies = {} names.each do |n| - policies[n] = list_policy_uris( n, subjectid ) + policies[n] = list_policy_uris n end policies end @@ -153,9 +156,9 @@ module OpenTox # Lists policies alongside with affected uris # @param [String] subjectid # @return [Hash] keys: all policies of the subjectid owner, values: uris affected by those policies - def self.list_policy_uris( policy, subjectid ) + def self.list_policy_uris( policy ) p = OpenTox::Policies.new - p.load_xml( list_policy(policy, subjectid) ) + p.load_xml( list_policy(policy) ) p.uris end @@ -163,9 +166,9 @@ module OpenTox # @param uri [String] URI # @param subjectid [String] subjectid # return [String, nil]owner,nil returns owner of the URI - def self.get_uri_owner(uri, subjectid) + def self.get_uri_owner(uri) begin - return RestClientWrapper.get("#{AA}/pol",nil,{:subjectid => subjectid, :uri => uri}).sub("\n","") + return RestClientWrapper.get("#{AA}/pol",nil,{:uri => uri}).sub("\n","") rescue return nil end @@ -175,16 +178,16 @@ module OpenTox # @param uri [String] URI # @param subjectid [String] # return [Boolean]true,false status of ownership of the URI - def self.uri_owner?(uri, subjectid) - get_uri_owner(uri, subjectid) == get_user(subjectid) + def self.uri_owner?(uri) + get_uri_owner(uri) == get_user end #Checks if a policy exists to a URI. Requires URI and token. # @param uri [String] URI # @param subjectid [String] # return [Boolean] - def self.uri_has_policy(uri, subjectid) - owner = get_uri_owner(uri, subjectid) + def self.uri_has_policy(uri) + owner = get_uri_owner(uri) return true if owner and owner != "null" false end @@ -193,9 +196,9 @@ module OpenTox # @param uri [String] URI # @param subjectid [String] # return [Array, nil] returns an Array of policy names or nil if request fails - def self.list_uri_policies(uri, subjectid) + def self.list_uri_policies(uri) begin - out = RestClientWrapper.get("#{AA}/pol",nil,{:uri => uri, :polnames => true, :subjectid => subjectid}) + out = RestClientWrapper.get("#{AA}/pol",nil,{:uri => uri, :polnames => true}) policies = []; notfirstline = false out.split("\n").each do |line| policies << line if notfirstline @@ -211,10 +214,10 @@ module OpenTox # @param policy [String] XML string of a policy # @param subjectid [String] # return [Boolean] returns true if policy is created - def self.create_policy(policy, subjectid) + def self.create_policy(policy) begin - $logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token:" + subjectid.to_s + " length: " + subjectid.length.to_s - return true if RestClientWrapper.post("#{AA}/Pol/opensso-pol",policy, {:subjectid => subjectid, :content_type => "application/xml"}) + $logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token: #{RestClientWrapper.subjectid} ." + return true if RestClientWrapper.post("#{AA}/Pol/opensso-pol",policy, {:content_type => "application/xml"}) rescue return false end @@ -224,10 +227,10 @@ module OpenTox # @param policy [String] policyname # @param subjectid [String] # @return [Boolean,nil] - def self.delete_policy(policy, subjectid) + def self.delete_policy(policy) begin - $logger.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{subjectid}" - return true if RestClientWrapper.delete("#{AA}/pol",nil, {:subjectid => subjectid, :id => policy}) + $logger.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{RestClientWrapper.subjectid}" + return true if RestClientWrapper.delete("#{AA}/pol",nil, {:id => policy}) rescue return nil end @@ -236,9 +239,9 @@ module OpenTox #Returns array of the LDAP-Groups of an user # @param [String]subjectid # @return [Array] gives array of LDAP groups of a user - def self.list_user_groups(user, subjectid) + def self.list_user_groups(user) begin - out = RestClientWrapper.post("#{AA}/opensso/identity/read", {:name => user, :admin => subjectid, :attributes_names => "group"}) + out = RestClientWrapper.post("#{AA}/opensso/identity/read", {:name => user, :admin => RestClientWrapper.subjectid, :attributes_names => "group"}) grps = [] out.split("\n").each do |line| grps << line.sub("identitydetails.group=","") if line.include?("identitydetails.group=") @@ -252,9 +255,9 @@ module OpenTox #Returns the owner (user id) of a token # @param [String]subjectid # @return [String]user - def self.get_user(subjectid) + def self.get_user begin - out = RestClientWrapper.post("#{AA}/opensso/identity/attributes", {:subjectid => subjectid, :attributes_names => "uid"}) + out = RestClientWrapper.post("#{AA}/opensso/identity/attributes", {:attributes_names => "uid"}) user = ""; check = false out.split("\n").each do |line| if check @@ -272,11 +275,11 @@ module OpenTox #Send default policy with Authorization::Helper class # @param uri [String] URI # @param subjectid [String] - def self.send_policy(uri, subjectid) + def self.send_policy(uri) return true if !AA - aa = Authorization::Helper.new(subjectid) + aa = Authorization::Helper.new ret = aa.send(uri) - $logger.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{subjectid} - policy created: #{ret}" + $logger.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{RestClientWrapper.subjectid} - policy created: #{ret}" ret end @@ -284,12 +287,12 @@ module OpenTox # @param uri [String] URI # @param subjectid [String] # @return [Boolean] - def self.delete_policies_from_uri(uri, subjectid) - policies = list_uri_policies(uri, subjectid) + def self.delete_policies_from_uri(uri) + policies = list_uri_policies(uri) if policies policies.each do |policy| - ret = delete_policy(policy, subjectid) - $logger.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" + ret = delete_policy(policy) + $logger.debug "OpenTox::Authorization delete policy: #{RestClientWrapper.policy} - with result: #{ret}" end end return true @@ -299,22 +302,22 @@ module OpenTox # @param [String] uri # @param [String] subjectid # @return [Boolean] true if policy checked/created successfully (or no uri/subjectid given), false else - def self.check_policy(uri, subjectid) - return true unless uri and subjectid - unless OpenTox::Authorization.is_token_valid(subjectid) - $logger.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{subjectid}" + def self.check_policy(uri) + return true unless uri and RestClientWrapper.subjectid + unless OpenTox::Authorization.is_token_valid(RestClientWrapper.subjectid) + $logger.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{RestClientWrapper.subjectid}" return false end - if !uri_has_policy(uri, subjectid) + if !uri_has_policy(uri) # if no policy exists, create a policy, return result of send policy - send_policy(uri, subjectid) + send_policy(uri) else # if policy exists check for POST rights - if authorize(uri, "POST", subjectid) + if authorize(uri, "POST") true else - $logger.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{subjectid}" + $logger.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{RestClientWrapper.subjectid}" false end end @@ -330,26 +333,26 @@ module OpenTox # @param request_method [String] GET, POST, PUT, DELETE # @param subjectid [String] # @return [Boolean] true if access granted, else otherwise - def self.authorized?(uri, request_method, subjectid) + def self.authorized?(uri, request_method) request_method = request_method.to_sym if request_method if $aa[:free_request].include?(request_method) true elsif OpenTox::Authorization.free_uri?(uri, request_method) true elsif $aa[:authenticate_request].include?(request_method) - ret = OpenTox::Authorization.is_token_valid(subjectid) - $logger.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + ret = OpenTox::Authorization.is_token_valid(RestClientWrapper.subjectid) + $logger.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{RestClientWrapper.subjectid}" unless ret ret elsif OpenTox::Authorization.authorize_exception?(uri, request_method) - ret = OpenTox::Authorization.is_token_valid(subjectid) - $logger.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + ret = OpenTox::Authorization.is_token_valid(RestClientWrapper.subjectid) + $logger.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{RestClientWrapper.subjectid}" unless ret ret elsif $aa[:authorize_request].include?(request_method) - ret = OpenTox::Authorization.authorize(uri, request_method, subjectid) - $logger.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" unless ret + ret = OpenTox::Authorization.authorize(uri, request_method) + $logger.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{RestClientWrapper.subjectid}" unless ret ret else - $logger.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{subjectid}" + $logger.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{RestClientWrapper.subjectid}" false end end -- cgit v1.2.3 From ee6f20df383639029df001bb10312cd6b58c977a Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 26 Jul 2013 14:47:05 +0200 Subject: remove some more subjectids --- lib/authorization.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index b5997b8..6c3d42b 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -83,7 +83,7 @@ module OpenTox #Logout on opensso. Make token invalid. Requires token # @param [String] subjectid the subjectid # @return [Boolean] true if logout is OK - def self.logout(subjectid) + def self.logout(subjectid=RestClientWrapper.subjectid) begin out = RestClientWrapper.post("#{AA}/auth/logout", :subjectid => subjectid) return true unless is_token_valid(subjectid) @@ -107,7 +107,7 @@ module OpenTox #Checks if a token is a valid token # @param [String]subjectid subjectid from openSSO session # @return [Boolean] subjectid is valid or not. - def self.is_token_valid(subjectid) + def self.is_token_valid(subjectid=RestClientWrapper.subjectid) return true if !AA begin return true if RestClientWrapper.post("#{AA}/auth/isTokenValid",:tokenid => subjectid) == "boolean=true\n" -- cgit v1.2.3 From e82e7a33763357ba71c2b964f32afc8fd3afb755 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 26 Jul 2013 15:20:20 +0200 Subject: remove some more subjectids --- lib/authorization.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 6c3d42b..b819dde 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -98,9 +98,9 @@ module OpenTox # @param [String] action request method # @param [String] subjectid # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). - def self.authorize(uri, action) + def self.authorize(uri, action, subjectid=RestClientWrapper.subjectid) return true if !AA - return true if RestClientWrapper.post("#{AA}/auth/authorize",{:uri => uri, :action => action})== "boolean=true\n" + return true if RestClientWrapper.post("#{AA}/auth/authorize",{:subjectid => subjectid, :uri => uri, :action => action})== "boolean=true\n" return false end @@ -253,11 +253,11 @@ module OpenTox end #Returns the owner (user id) of a token - # @param [String]subjectid + # @param [String]subjectid optional (normally only used for testing) # @return [String]user - def self.get_user + def self.get_user subjectid=RestClientWrapper.subjectid begin - out = RestClientWrapper.post("#{AA}/opensso/identity/attributes", {:attributes_names => "uid"}) + out = RestClientWrapper.post("#{AA}/opensso/identity/attributes", {:subjectid => subjectid, :attributes_names => "uid"}) user = ""; check = false out.split("\n").each do |line| if check -- cgit v1.2.3 From 20d6373016907ddd78a5e8ce89875dc63ec3ea5a Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 26 Jul 2013 16:53:36 +0200 Subject: remove even more subjectids --- lib/opentox.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 5e0bc29..685f6fc 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -98,7 +98,7 @@ module OpenTox when 'application/rdf+xml' body = self.to_rdfxml end - Authorization.check_policy(@uri, RestClientWrapper.subjectid) if $aa[:uri] + Authorization.check_policy(@uri) if $aa[:uri] uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type} wait ? wait_for_task(uri) : uri end @@ -121,7 +121,7 @@ module OpenTox # Delete object at webservice def delete RestClientWrapper.delete(@uri) - Authorization.delete_policies_from_uri(@uri, RestClientWrapper.subjectid) if $aa[:uri] + Authorization.delete_policies_from_uri(@uri) if $aa[:uri] end def service_uri -- cgit v1.2.3 From 7b28a16318ceaa4298dc3d4a6c23f7814eb8c3a1 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 26 Jul 2013 16:57:09 +0200 Subject: fix error --- lib/authorization.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index b819dde..3884d8e 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -292,7 +292,7 @@ module OpenTox if policies policies.each do |policy| ret = delete_policy(policy) - $logger.debug "OpenTox::Authorization delete policy: #{RestClientWrapper.policy} - with result: #{ret}" + $logger.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" end end return true -- cgit v1.2.3 From 71952d83f6c4a668999036416129ae7eced15173 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Sat, 27 Jul 2013 12:38:01 +0200 Subject: fix AA entry test --- lib/opentox-client.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 7c48d9c..d492fef 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -51,7 +51,7 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m ].each{ |f| require_relative f } if defined?($aa) and $aa[:uri] - OpenTox::RestClientWrapper.subjectid = OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) + OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) unauthorized_error "Failed to authenticate user \"#{$aa[:user]}\"." unless OpenTox::Authorization.is_token_valid(OpenTox::RestClientWrapper.subjectid) end -- cgit v1.2.3 From 5322a77bbed60e79196ba65bd79a97dc313ffe9a Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 6 Aug 2013 12:54:45 +0200 Subject: move policy management to opentox-server --- lib/opentox.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 685f6fc..d6f7669 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -98,7 +98,7 @@ module OpenTox when 'application/rdf+xml' body = self.to_rdfxml end - Authorization.check_policy(@uri) if $aa[:uri] + #Authorization.check_policy(@uri) if $aa[:uri] uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type} wait ? wait_for_task(uri) : uri end @@ -121,7 +121,7 @@ module OpenTox # Delete object at webservice def delete RestClientWrapper.delete(@uri) - Authorization.delete_policies_from_uri(@uri) if $aa[:uri] + #Authorization.delete_policies_from_uri(@uri) if $aa[:uri] end def service_uri -- cgit v1.2.3 From 8df7c351733c56b22a638244b88feeca833e196f Mon Sep 17 00:00:00 2001 From: davor Date: Wed, 7 Aug 2013 09:23:47 +0200 Subject: Updated ruby to 2.0.0-p247 --- bin/opentox-client-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/opentox-client-install b/bin/opentox-client-install index 9bb2308..06fa9cb 100755 --- a/bin/opentox-client-install +++ b/bin/opentox-client-install @@ -46,7 +46,7 @@ check_utils "rbenv find" check_log $SELF # Adjust ruby version here! -RUBY_NUM_VER="2.0.0-p0" +RUBY_NUM_VER="2.0.0-p247" # ruby install_ruby -- cgit v1.2.3 From b4c39cd8c4dfcc40bdabc9db205bd347c2c0d826 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 8 Aug 2013 16:40:54 +0200 Subject: error handling rewrite: making sure to pass backtrace --- lib/error.rb | 43 +++++++++++++++++++++++++++---------------- lib/overwrite.rb | 16 ++++++---------- lib/rest-client-wrapper.rb | 23 +++++++++++++++++------ lib/task.rb | 26 ++++---------------------- 4 files changed, 54 insertions(+), 54 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 85ce35d..23e738d 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -2,8 +2,11 @@ require 'open4' # add additional fields to Exception class to format errors according to OT-API module OpenToxError - attr_accessor :http_code, :uri - def initialize message, uri=nil + attr_accessor :http_code, :uri, :error_cause + def initialize(message, uri=nil, cause=nil) + message.gsub!(/\A"|"\Z/, '') # remove quotes + @error_cause = cause ? OpenToxError::cut_backtrace(cause) : short_backtrace + super message #unless self.is_a? Errno::EAGAIN # avoid "Resource temporarily unavailable" errors @uri = uri.to_s.sub(%r{//.*:.*@},'//') # remove credentials from uri @@ -12,21 +15,29 @@ module OpenToxError subject = RDF::Node.new @rdf << [subject, RDF.type, RDF::OT.ErrorReport] @rdf << [subject, RDF::OT.actor, @uri] - @rdf << [subject, RDF::OT.message, message.sub(/^"/,'').sub(/"$/,'')] + @rdf << [subject, RDF::OT.message, message] @rdf << [subject, RDF::OT.statusCode, @http_code] @rdf << [subject, RDF::OT.errorCode, self.class.to_s] - @rdf << [subject, RDF::OT.errorCause, short_backtrace] + @rdf << [subject, RDF::OT.errorCause, @error_cause] $logger.error("\n"+self.to_turtle) #end end - + + def self.cut_backtrace(trace) + if trace.is_a?(Array) + cut_index = trace.find_index{|line| line.match(/sinatra|minitest/)} + cut_index ||= trace.size + cut_index -= 1 + cut_index = trace.size-1 if cut_index < 0 + trace[0..cut_index].join("\n") + else + trace + end + end + def short_backtrace backtrace = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact - cut_index = backtrace.find_index{|line| line.match /sinatra|minitest/} - cut_index ||= backtrace.size - cut_index -= 1 - cut_index = backtrace.size-1 if cut_index < 0 - backtrace[0..cut_index].join("\n") + OpenToxError::cut_backtrace(backtrace) end RDF_FORMATS.each do |format| @@ -63,9 +74,9 @@ module OpenTox class Error < RuntimeError include OpenToxError - def initialize code, message, uri=nil + def initialize(code, message, uri=nil, cause=nil) @http_code = code - super message, uri + super message, uri, cause end end @@ -73,15 +84,15 @@ module OpenTox RestClientWrapper.known_errors.each do |error| # create error classes c = Class.new Error do - define_method :initialize do |message, uri=nil| - super error[:code], message, uri + define_method :initialize do |message, uri=nil, cause=nil| + super error[:code], message, uri, cause end end OpenTox.const_set error[:class],c # define global methods for raising errors, eg. bad_request_error - Object.send(:define_method, error[:method]) do |message,uri=nil| - raise c.new(message.inspect, uri) + Object.send(:define_method, error[:method]) do |message,uri=nil,cause=nil| + raise c.new(message.inspect, uri, cause) end end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index ff43347..0830490 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -155,16 +155,12 @@ module Kernel t = OpenTox::Task.new uri t.wait unless t.completed? - begin # handle known (i.e. OpenTox) errors - error = OpenTox::RestClientWrapper.known_errors.select{|error| error[:code] == t.code}.first - error ? error_method = error[:method] : error_method = :internal_server_error - report = t.error_report - report ? error_message = report[RDF::OT.message] : error_message = $!.message - Object.send(error_method,error_message,t.uri) - rescue - internal_server_error "#{$!.message}", t.uri - #internal_server_error "#{$!.message}\n#{$!.backtrace}", t.uri - end + error = OpenTox::RestClientWrapper.known_errors.select{|error| error[:code] == t.code}.first + error_method = error ? error[:method] : :internal_server_error + report = t.error_report + error_message = report ? report[RDF::OT.message] : $!.message + error_cause = report ? report[RDF::OT.errorCause] : nil + Object.send(error_method,error_message,t.uri,error_cause) end uri = t.resultURI end diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 134dd32..3ed41ad 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -53,13 +53,24 @@ module OpenTox if [301, 302, 307].include? response.code and request.method == :get response.follow_redirection(request, result) elsif response.code >= 400 and !URI.task?(uri) - message = response.to_s - parameters = request.args - parameters[:headers][:subjectid] = "REMOVED" if parameters[:headers] and parameters[:headers][:subjectid] - parameters[:url] = parameters[:url].gsub(/(http|https|)\:\/\/[a-zA-Z0-9\-]+\:[a-zA-Z0-9]+\@/, "REMOVED@") if parameters[:url] - message += "\nREST parameters:\n#{parameters.inspect}" + #TODO add parameters to error-report + #parameters = request.args + #parameters[:headers][:subjectid] = "REMOVED" if parameters[:headers] and parameters[:headers][:subjectid] + #parameters[:url] = parameters[:url].gsub(/(http|https|)\:\/\/[a-zA-Z0-9\-]+\:[a-zA-Z0-9]+\@/, "REMOVED@") if parameters[:url] + #message += "\nREST parameters:\n#{parameters.inspect}" error = known_errors.collect{|e| e if e[:code] == response.code}.compact.first - Object.method(error[:method]).call message, uri # call error method + begin # errors are returned as error reports in turtle, try to parse + content = {} + RDF::Reader.for(:turtle).new(response.to_s) do |reader| + reader.each_triple{|triple| content[triple[1]] = triple[2]} + end + msg = content[RDF::OT.message].to_s + cause = content[RDF::OT.errorCause].to_s + rescue # parsing error failed, use complete content as message + msg = response.to_s + cause = nil + end + Object.method(error[:method]).call msg, uri, cause # call error method else response end diff --git a/lib/task.rb b/lib/task.rb index 07efc0f..6d6a3a7 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -21,28 +21,10 @@ module OpenTox pid = fork do begin task.completed yield - rescue - if $!.respond_to? :to_ntriples - RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => $!.to_ntriples},{:content_type => 'text/plain'}) - else - cut_index = $!.backtrace.find_index{|line| line.match /gems\/sinatra/} - cut_index = -1 unless cut_index - @rdf = RDF::Graph.new - subject = RDF::Node.new - @rdf << [subject, RDF.type, RDF::OT.ErrorReport] - @rdf << [subject, RDF::OT.message, $!.message] - @rdf << [subject, RDF::OT.errorCode, $!.class.to_s] - @rdf << [subject, RDF::OT.errorCause, $!.backtrace[0..cut_index].join("\n")] - prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#", :ot => RDF::OT.to_s} - turtle = RDF::Turtle::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| - @rdf.each{|statement| writer << statement} - end - $logger.error turtle - nt = RDF::Writer.for(:ntriples).buffer do |writer| - @rdf.each{|statement| writer << statement} - end - RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => nt},{:content_type => 'text/plain'}) - end + rescue => e + # wrap non-opentox-errors first + e = OpenTox::Error.new(500,e.message,nil,e.backtrace) unless e.is_a?(OpenTox::Error) + RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => e.to_ntriples},{:content_type => 'text/plain'}) task.kill end end -- cgit v1.2.3 From afdc083b5b5d8b3a52f231a929ef63f36a926cbd Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 9 Aug 2013 09:31:19 +0200 Subject: allow error messages to be nil --- lib/error.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 23e738d..5dba36a 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -3,8 +3,8 @@ require 'open4' # add additional fields to Exception class to format errors according to OT-API module OpenToxError attr_accessor :http_code, :uri, :error_cause - def initialize(message, uri=nil, cause=nil) - message.gsub!(/\A"|"\Z/, '') # remove quotes + def initialize(message=nil, uri=nil, cause=nil) + message.gsub!(/\A"|"\Z/, '') if message # remove quotes @error_cause = cause ? OpenToxError::cut_backtrace(cause) : short_backtrace super message @@ -15,7 +15,7 @@ module OpenToxError subject = RDF::Node.new @rdf << [subject, RDF.type, RDF::OT.ErrorReport] @rdf << [subject, RDF::OT.actor, @uri] - @rdf << [subject, RDF::OT.message, message] + @rdf << [subject, RDF::OT.message, message.to_s] @rdf << [subject, RDF::OT.statusCode, @http_code] @rdf << [subject, RDF::OT.errorCode, self.class.to_s] @rdf << [subject, RDF::OT.errorCause, @error_cause] @@ -74,7 +74,7 @@ module OpenTox class Error < RuntimeError include OpenToxError - def initialize(code, message, uri=nil, cause=nil) + def initialize(code, message=nil, uri=nil, cause=nil) @http_code = code super message, uri, cause end @@ -84,7 +84,7 @@ module OpenTox RestClientWrapper.known_errors.each do |error| # create error classes c = Class.new Error do - define_method :initialize do |message, uri=nil, cause=nil| + define_method :initialize do |message=nil, uri=nil, cause=nil| super error[:code], message, uri, cause end end -- cgit v1.2.3 From c98a4fb6a3c13c9f55e56de9fb454fcd601eea27 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 9 Aug 2013 12:01:22 +0200 Subject: do not convert error message via 'inspect', this creates 'nil' strings and escapes special chars --- lib/error.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 5dba36a..ade649e 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -4,7 +4,7 @@ require 'open4' module OpenToxError attr_accessor :http_code, :uri, :error_cause def initialize(message=nil, uri=nil, cause=nil) - message.gsub!(/\A"|"\Z/, '') if message # remove quotes + message = message.to_s.gsub(/\A"|"\Z/, '') if message # remove quotes @error_cause = cause ? OpenToxError::cut_backtrace(cause) : short_backtrace super message @@ -92,7 +92,7 @@ module OpenTox # define global methods for raising errors, eg. bad_request_error Object.send(:define_method, error[:method]) do |message,uri=nil,cause=nil| - raise c.new(message.inspect, uri, cause) + raise c.new(message, uri, cause) end end -- cgit v1.2.3 From a5904f0c097df8d53bfdf0b4a8209e953700d489 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 9 Aug 2013 12:03:44 +0200 Subject: add find for model --- lib/model.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 356f4e4..2b90a46 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -36,21 +36,21 @@ module OpenTox include OpenTox include OpenTox::Algorithm include Model - end - - class Lazar - include OpenTox - include OpenTox::Algorithm - include Model - def self.create params - Lazar.new(File.join($algorithm[:uri], "lazar")).run params + + def self.find uri + URI.accessible?(uri) ? self.new(uri) : nil end def predict params run params end - end + class Lazar < Generic + + def self.create params + Lazar.new(File.join($algorithm[:uri], "lazar")).run params + end + end end end -- cgit v1.2.3 From 22b353110299ab819fc53cd83b456caa35900508 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 16 Aug 2013 10:35:03 +0200 Subject: fix error handling when non-ot-errors are returned (like e.g. from the 4store) --- lib/rest-client-wrapper.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 3ed41ad..94ff029 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -61,13 +61,14 @@ module OpenTox error = known_errors.collect{|e| e if e[:code] == response.code}.compact.first begin # errors are returned as error reports in turtle, try to parse content = {} - RDF::Reader.for(:turtle).new(response.to_s) do |reader| + RDF::Reader.for(:turtle).new(response) do |reader| reader.each_triple{|triple| content[triple[1]] = triple[2]} end msg = content[RDF::OT.message].to_s cause = content[RDF::OT.errorCause].to_s + raise if msg.size==0 && cause.size==0 # parsing failed rescue # parsing error failed, use complete content as message - msg = response.to_s + msg = "Could not parse error response from rest call '#{method}' to '#{uri}':\n#{response}" cause = nil end Object.method(error[:method]).call msg, uri, cause # call error method -- cgit v1.2.3 From 9548b484a60c271add21a1666f03a414c905c3c3 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Thu, 17 Oct 2013 11:39:55 +0200 Subject: temp fix for: bundle install fails with ssl certificate verification err (see: http://stackoverflow.com/questions/10246023/bundle-install-fails-with-ssl-certificate-verification-error) --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 3be9c3c..1aa98e4 100644 --- a/Gemfile +++ b/Gemfile @@ -1,2 +1,2 @@ -source "https://rubygems.org" +source "http://rubygems.org" gemspec -- cgit v1.2.3 From 085fd4b799dcf32860ece8dea13e8d91f15c33d5 Mon Sep 17 00:00:00 2001 From: gebele Date: Thu, 14 Nov 2013 16:59:44 +0100 Subject: try to improve rdf writer method/add comment --- lib/dataset.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 6bb0874..292b26b 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -243,22 +243,21 @@ module OpenTox end end RDF::Writer.for(format).buffer do |writer| - @rdf.each{|statement| writer << statement} + writer << @rdf end end end -# TODO: fix bug that affects data_entry positions +# TODO: fix bug that affects data_entry positions # DG: who wrotes this comment ? def to_ntriples # redefined string version for better performance - ntriples = "" @metadata[RDF.type] = [ RDF::OT.Dataset, RDF::OT.OrderedDataset ] @metadata.each do |predicate,values| [values].flatten.each do |value| URI.valid?(value) ? value = "<#{value}>" : value = "\"#{value}\"" - ntriples << "<#{@uri}> <#{predicate}> #{value} ." #\n" + ntriples << "<#{@uri}> <#{predicate}> #{value} .\n" #\n" end end @parameters.each_with_index do |parameter,i| -- cgit v1.2.3 From b70f1f7be6540ca99618c36beb94d47006e9ffd7 Mon Sep 17 00:00:00 2001 From: gebele Date: Thu, 14 Nov 2013 17:01:23 +0100 Subject: update metadata handling for rdf parsing to ntriples;e.g. edit a model --- lib/opentox.rb | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index d6f7669..16cecca 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -129,17 +129,22 @@ module OpenTox end def create_rdf + #$logger.debug "#{eval("RDF::OT."+self.class.to_s.split('::').last)}\n" @rdf = RDF::Graph.new - @metadata[RDF.type] ||= RDF::URI.new(eval("RDF::OT."+self.class.to_s.split('::').last)) + # DG: since model is no self.class anymore + @metadata[RDF.type] ||= (eval("RDF::OT."+self.class.to_s.split('::').last) =~ /Lazar|Generic/) ? RDF::URI.new(RDF::OT.Model) : RDF::URI.new(eval("RDF::OT."+self.class.to_s.split('::').last)) + #@metadata[RDF.type] ||= RDF::URI.new(eval("RDF::OT."+self.class.to_s.split('::').last)) @metadata[RDF::DC.date] ||= DateTime.now + # DG: uri in object should be in brackets, otherwise query for uri-list ignores the object. + # see: http://www.w3.org/TR/rdf-testcases/#sec-uri-encoding @metadata.each do |predicate,values| - [values].flatten.each{ |value| @rdf << [RDF::URI.new(@uri), predicate, (value == eval("RDF::OT."+self.class.to_s.split('::').last)) ? RDF::URI.new(value) : value] unless value.nil? } + [values].flatten.each{ |value| @rdf << [RDF::URI.new(@uri), predicate, (URI.valid?(value) ? RDF::URI.new(value) : value)] unless value.nil? } end @parameters.each do |parameter| p_node = RDF::Node.new @rdf << [RDF::URI.new(@uri), RDF::OT.parameters, p_node] @rdf << [p_node, RDF.type, RDF::OT.Parameter] - parameter.each { |k,v| @rdf << [p_node, k, v] } + parameter.each { |k,v| @rdf << [p_node, k, v] unless v.nil?} end end @@ -157,12 +162,16 @@ module OpenTox # rdf serialization methods for all formats e.g. to_rdfxml send :define_method, "to_#{format}".to_sym do create_rdf + # if encoding is used iteration is necessary + # see: http://rubydoc.info/github/ruby-rdf/rdf/RDF/NTriples/Writer RDF::Writer.for(format).buffer(:encoding => Encoding::ASCII) do |writer| - writer << @rdf + @rdf.each_statement do |statement| + writer << statement + end end end end - + # @return [String] converts object to turtle-string def to_turtle # redefined to use prefixes (not supported by RDF::Writer) prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} -- cgit v1.2.3 From 77f61a98a61719ceaf9507723a3fe84a7e0dc925 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 7 Jan 2014 20:53:36 +0100 Subject: fix mime_type for files with spaces --- lib/overwrite.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 0830490..1c9517d 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -128,7 +128,7 @@ end class File # @return [String] mime_type including charset using linux cmd command def mime_type - `file -ib #{self.path}`.chomp + `file -ib '#{self.path}'`.chomp end end -- cgit v1.2.3 From 52d7fa12e3474c425c6caf5830427f12195b6c14 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 25 Feb 2014 09:58:30 +0100 Subject: Update yard documentation, set link to RubyDoc.info --- README.markdown | 8 +++++--- lib/authorization.rb | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/README.markdown b/README.markdown index 47f9c70..353f01f 100644 --- a/README.markdown +++ b/README.markdown @@ -28,10 +28,12 @@ Installation gem install opentox-client -[API documentation](http://rdoc.info/gems/opentox-client) -------------------------------------------------------------------- +Documentation +------------- +* [API documentation](http://rdoc.info/gems/opentox-client) +* [RubyDoc Code documentation](http://rubydoc.info/github/opentox/opentox-client/development/frames) Copyright --------- -Copyright (c) 2009-2012 Christoph Helma, Martin Guetlein, Micha Rautenberg, Andreas Maunz, David Vorgrimmler, Denis Gebele. See LICENSE for details. +Copyright (c) 2009-2014 Christoph Helma, Martin Guetlein, Micha Rautenberg, Andreas Maunz, David Vorgrimmler, Denis Gebele. See LICENSE for details. diff --git a/lib/authorization.rb b/lib/authorization.rb index 3884d8e..0502b37 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -64,7 +64,7 @@ module OpenTox #Authentication against OpenSSO. Returns token. Requires Username and Password. # @param user [String] Username # @param pw [String] Password - # @return [String, nil] gives subjectid or nil + # @return [Boolean] true if successful def self.authenticate(user, pw) return nil if !AA begin -- cgit v1.2.3 From 762617e92dbbd6116fd92ad10a936ae87deab7ea Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 25 Feb 2014 10:01:01 +0100 Subject: Update yard documentationo --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 353f01f..0fee183 100644 --- a/README.markdown +++ b/README.markdown @@ -31,7 +31,7 @@ Installation Documentation ------------- * [API documentation](http://rdoc.info/gems/opentox-client) -* [RubyDoc Code documentation](http://rubydoc.info/github/opentox/opentox-client/development/frames) +* [RubyDoc.info Code documentation](http://rubydoc.info/github/opentox/opentox-client/development/frames) Copyright --------- -- cgit v1.2.3 From 70c7b3496b7cb81b55607d8e358424cbac7a2390 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 25 Feb 2014 10:23:02 +0100 Subject: test webhook for rubydoc --- README.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.markdown b/README.markdown index 0fee183..cd91c81 100644 --- a/README.markdown +++ b/README.markdown @@ -37,3 +37,5 @@ Copyright --------- Copyright (c) 2009-2014 Christoph Helma, Martin Guetlein, Micha Rautenberg, Andreas Maunz, David Vorgrimmler, Denis Gebele. See LICENSE for details. + +x \ No newline at end of file -- cgit v1.2.3 From 94bc82ec09942b4b095302636ba996224a368586 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 25 Feb 2014 10:25:30 +0100 Subject: test webhook for rubydoc --- README.markdown | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.markdown b/README.markdown index cd91c81..70760ae 100644 --- a/README.markdown +++ b/README.markdown @@ -1,7 +1,7 @@ opentox-client ==================== -Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API +Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API. Libraries: @@ -35,7 +35,4 @@ Documentation Copyright --------- - Copyright (c) 2009-2014 Christoph Helma, Martin Guetlein, Micha Rautenberg, Andreas Maunz, David Vorgrimmler, Denis Gebele. See LICENSE for details. - -x \ No newline at end of file -- cgit v1.2.3 From ad1d6a4a7c0939b7c27869563d74809288de2b97 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 25 Feb 2014 10:29:29 +0100 Subject: add .yardopts, mv README.markdown to README.md --- .yardopts | 4 ++++ README.markdown | 38 -------------------------------------- README.md | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 38 deletions(-) create mode 100644 .yardopts delete mode 100644 README.markdown create mode 100644 README.md diff --git a/.yardopts b/.yardopts new file mode 100644 index 0000000..cef1332 --- /dev/null +++ b/.yardopts @@ -0,0 +1,4 @@ +--readme README +--title 'Thin Ruby wrapper for the OpenTox REST API' +--charset utf-8 +yardoc lib/*.rb - README ChangeLog VERSION LICENSE diff --git a/README.markdown b/README.markdown deleted file mode 100644 index 70760ae..0000000 --- a/README.markdown +++ /dev/null @@ -1,38 +0,0 @@ -opentox-client -==================== - -Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API. - -Libraries: - -* {OpenTox::Algorithm} Wrapper for OpenTox Algorithms -* {OpenTox::Authorization} Authorization and Authentication -* {OpenTox::Compound} Compound Library -* {OpenTox::Dataset} Dataset Library -* {OpenTox::Error} extends Exception class according the OpenTox API -* {OpenTox::Model} Model Library -* {OpenTox} OpenTox Library - general definition of OpenTox objects -* {OTLogger} OpenTox Logger Extensions -* {OpenTox::Policies} parse and serialize XML for the openSSO A&A server -* {OpenTox::RestClientWrapper} wrapper for the RestClient gem -* {OpenTox::Task} Task Library - - -Dependencies ------------- - - libraptor1-dev - -Installation ------------- - - gem install opentox-client - -Documentation -------------- -* [API documentation](http://rdoc.info/gems/opentox-client) -* [RubyDoc.info Code documentation](http://rubydoc.info/github/opentox/opentox-client/development/frames) - -Copyright ---------- -Copyright (c) 2009-2014 Christoph Helma, Martin Guetlein, Micha Rautenberg, Andreas Maunz, David Vorgrimmler, Denis Gebele. See LICENSE for details. diff --git a/README.md b/README.md new file mode 100644 index 0000000..70760ae --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +opentox-client +==================== + +Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API. + +Libraries: + +* {OpenTox::Algorithm} Wrapper for OpenTox Algorithms +* {OpenTox::Authorization} Authorization and Authentication +* {OpenTox::Compound} Compound Library +* {OpenTox::Dataset} Dataset Library +* {OpenTox::Error} extends Exception class according the OpenTox API +* {OpenTox::Model} Model Library +* {OpenTox} OpenTox Library - general definition of OpenTox objects +* {OTLogger} OpenTox Logger Extensions +* {OpenTox::Policies} parse and serialize XML for the openSSO A&A server +* {OpenTox::RestClientWrapper} wrapper for the RestClient gem +* {OpenTox::Task} Task Library + + +Dependencies +------------ + + libraptor1-dev + +Installation +------------ + + gem install opentox-client + +Documentation +------------- +* [API documentation](http://rdoc.info/gems/opentox-client) +* [RubyDoc.info Code documentation](http://rubydoc.info/github/opentox/opentox-client/development/frames) + +Copyright +--------- +Copyright (c) 2009-2014 Christoph Helma, Martin Guetlein, Micha Rautenberg, Andreas Maunz, David Vorgrimmler, Denis Gebele. See LICENSE for details. -- cgit v1.2.3 From b399e6c349e4cc6b5cc88991349eb1e180336721 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 25 Feb 2014 10:31:35 +0100 Subject: add .yardopts, mv README.markdown to README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 70760ae..91889ec 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ opentox-client ==================== -Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API. +Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API Libraries: -- cgit v1.2.3 From 6bcfe8099906ad6a2041ac258cb81c232c6f4159 Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 30 May 2014 14:58:02 +0100 Subject: increased timeout for RestClientWrapper --- lib/rest-client-wrapper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 94ff029..732f46e 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -42,7 +42,7 @@ module OpenTox args={} args[:method] = method args[:url] = uri - args[:timeout] = 600 + args[:timeout] = 1800 args[:payload] = payload headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems args[:headers] = headers -- cgit v1.2.3 From 83010d2019650512149cd511f0395023c77d483f Mon Sep 17 00:00:00 2001 From: Micha Rautenberg Date: Tue, 10 Jun 2014 10:08:34 +0200 Subject: update to ruby 2.0.0-p481 to solve openssl wheezy issue --- bin/opentox-client-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/opentox-client-install b/bin/opentox-client-install index 06fa9cb..125db43 100755 --- a/bin/opentox-client-install +++ b/bin/opentox-client-install @@ -46,7 +46,7 @@ check_utils "rbenv find" check_log $SELF # Adjust ruby version here! -RUBY_NUM_VER="2.0.0-p247" +RUBY_NUM_VER="2.0.0-p481" # ruby install_ruby -- cgit v1.2.3 From d465c7792c2eb563c3e3403cb887f672c394b1e5 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 9 Jul 2014 15:32:02 +0200 Subject: set default ssl verification to false to allow self signed certificates --- lib/rest-client-wrapper.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 732f46e..dc1def2 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -19,7 +19,7 @@ module OpenTox # Does not wait for task to finish and returns task uri # @param [String] destination URI # @param [optional,Hash|String] Payload data posted to the service - # @param [optional,Hash] Headers with params like :accept, :content_type, :subjectid + # @param [optional,Hash] Headers with params like :accept, :content_type, :subjectid, :verify_ssl # @return [RestClient::Response] REST call response [:head,:get,:post,:put,:delete].each do |method| @@ -42,10 +42,11 @@ module OpenTox args={} args[:method] = method args[:url] = uri + args[:verify_ssl] = 0 if headers[:verify_ssl].nil? || headers[:verify_ssl].empty? args[:timeout] = 1800 args[:payload] = payload headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems - args[:headers] = headers + args[:headers] = headers @request = RestClient::Request.new(args) # ignore error codes from Task services (may return error codes >= 400 according to API, which causes exceptions in RestClient and RDF::Reader) -- cgit v1.2.3 From a10fabfc533b4f21eff0fc102ced5b1d2c3e3699 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 6 Oct 2014 21:44:59 +0200 Subject: fix split method for datasets with missing values --- lib/dataset.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 292b26b..83ef12b 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -308,7 +308,11 @@ module OpenTox dataset.metadata = metadata dataset.features = (feats ? feats : self.features) compound_indices.each do |c_idx| - dataset << [ self.compounds[c_idx] ] + dataset.features.each_with_index.collect{|f,f_idx| self.data_entries[c_idx][f_idx]} + d = [ self.compounds[c_idx] ] + dataset.features.each_with_index.each do |f,f_idx| + d << (self.data_entries[c_idx] ? self.data_entries[c_idx][f_idx] : nil) + end + dataset << d end dataset.put dataset -- cgit v1.2.3 From ecf667cc0705e2860432c89cce95f47f854e5146 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Mon, 6 Oct 2014 21:49:19 +0200 Subject: fix: code from task has to be fetched via get (this did only work before because a head on task was actually interpreted as a get) --- lib/task.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/task.rb b/lib/task.rb index 6d6a3a7..f5016d5 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -24,6 +24,7 @@ module OpenTox rescue => e # wrap non-opentox-errors first e = OpenTox::Error.new(500,e.message,nil,e.backtrace) unless e.is_a?(OpenTox::Error) + $logger.error "error in task #{task.uri} created by #{creator}" # creator is not logged because error is logged when thrown RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => e.to_ntriples},{:content_type => 'text/plain'}) task.kill end @@ -89,7 +90,7 @@ module OpenTox end def code - RestClientWrapper.head(@uri).code.to_i + RestClientWrapper.get(@uri).code.to_i end # get only header for status requests -- cgit v1.2.3 From 3f17cbaf0d2ff3e95728e46f86c7d826c87df925 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 7 Oct 2014 16:40:20 +0200 Subject: provide list of descriptor names in client --- lib/algorithm.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 036d345..582a1d1 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -42,6 +42,11 @@ module OpenTox end end + # returns a hash, keys: physchem descriptors, values: their description + def self.physchem_descriptors + Hash[ RestClientWrapper.get(File.join(service_uri, "descriptor", "physchem", "list")).to_s.split("\n").collect{|l| l.split("\t")} ] + end + end class Fminer -- cgit v1.2.3 From 0172f39bf3638919735d0bcd2b6597c5885a05d7 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 10 Oct 2014 12:35:50 +0200 Subject: fix error msg --- lib/compound.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compound.rb b/lib/compound.rb index 9d99ae9..f63e127 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -102,7 +102,7 @@ module OpenTox # @todo def chebi - raise_internal_error "not yet implemented" + internal_server_error "not yet implemented" end # @return [String] ChEMBL database compound id, derieved via restcall to chembl -- cgit v1.2.3 From 2207678ae0968b0ace93347430546375ffefc8a3 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 10 Oct 2014 12:38:25 +0200 Subject: extend to_csv for inchi export, do not cache compound_index mapping (to prevent errors on non-mappable compounds) --- lib/dataset.rb | 52 ++++++++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 83ef12b..67722d6 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -184,11 +184,11 @@ module OpenTox # converts dataset to csv format including compound smiles as first column, other column headers are feature titles # @return [String] - def to_csv - CSV.generate do |csv| - csv << ["SMILES"] + features.collect{|f| f.title} + def to_csv(inchi=false) + CSV.generate({:force_quotes=>true}) do |csv| + csv << [inchi ? "InChI" : "SMILES"] + features.collect{|f| f.title} compounds.each_with_index do |c,i| - csv << [c.smiles] + data_entries[i] + csv << [inchi ? c.inchi : c.smiles] + data_entries[i] end end end @@ -329,37 +329,29 @@ module OpenTox # @param dataset [OpenTox::Dataset] dataset that should be mapped to this dataset (fully loaded) # @param compound_index [Fixnum], corresponding to dataset def compound_index( dataset, compound_index ) - unless defined?(@index_map) and @index_map[dataset.uri] - map = {} - dataset.compounds.collect{|c| c.uri}.uniq.each do |compound| - self_indices = compound_indices(compound) - next unless self_indices - dataset_indices = dataset.compound_indices(compound) - if self_indices.size==1 - dataset_indices.size.times do |i| - map[dataset_indices[i]] = self_indices[0] - end - elsif self_indices.size==dataset_indices.size - # we do assume that the order is preseverd! - dataset_indices.size.times do |i| - map[dataset_indices[i]] = self_indices[i] - end - else - raise "cannot map compound #{compound} from dataset #{dataset.uri} to dataset #{uri}, "+ - "compound occurs #{dataset_indices.size} times and #{self_indices.size} times" - end + compound_uri = dataset.compounds[compound_index].uri + self_indices = compound_indices(compound_uri) + if self_indices==nil + nil + else + dataset_indices = dataset.compound_indices(compound_uri) + if self_indices.size==1 + self_indices.first + elsif self_indices.size==dataset_indices.size + # we do assume that the order is preseverd (i.e., the nth occurences in both datasets are mapped to each other)! + self_indices[dataset_indices.index(compound_index)] + else + raise "cannot map compound #{compound} from dataset #{dataset.uri} to dataset #{uri}, "+ + "compound occurs #{dataset_indices.size} times and #{self_indices.size} times" end - @index_map = {} unless defined?(@index_map) - @index_map[dataset.uri] = map end - @index_map[dataset.uri][compound_index] end # returns the inidices of the compound in the dataset - # @param compound [OpenTox::Compound] + # @param compound_uri [String] # @return [Array] compound index (position) of the compound in the dataset, array-size is 1 unless multiple occurences - def compound_indices( compound ) - unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound) + def compound_indices( compound_uri ) + unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound_uri) @cmp_indices = {} @compounds.size.times do |i| c = @compounds[i].uri @@ -370,7 +362,7 @@ module OpenTox end end end - @cmp_indices[compound] + @cmp_indices[compound_uri] end # returns compound feature value using the compound-index and the feature_uri -- cgit v1.2.3 From 072ee55af57655d61ca26f8b7d10c660271dd60e Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 10 Oct 2014 12:39:52 +0200 Subject: log error-report as yaml to prevent printing some un-needed lines --- lib/error.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/error.rb b/lib/error.rb index ade649e..506c542 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -19,9 +19,16 @@ module OpenToxError @rdf << [subject, RDF::OT.statusCode, @http_code] @rdf << [subject, RDF::OT.errorCode, self.class.to_s] @rdf << [subject, RDF::OT.errorCause, @error_cause] - $logger.error("\n"+self.to_turtle) + $logger.error("\n"+self.to_yaml) #end end + + # this method defines what is used for to_yaml (override to skip large @rdf graph) + def encode_with coder + @rdf.each do |statement| + coder[statement.predicate.fragment.to_s] = statement.object.to_s + end + end def self.cut_backtrace(trace) if trace.is_a?(Array) -- cgit v1.2.3 From a9d781dcd792ae9f57021cf2daf2729f6708bb70 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Fri, 10 Oct 2014 12:42:58 +0200 Subject: log post requests --- lib/rest-client-wrapper.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index dc1def2..7011eca 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -47,6 +47,8 @@ module OpenTox args[:payload] = payload headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems args[:headers] = headers + + $logger.debug "post to #{uri} with params #{payload.inspect.to_s[0..1000]}" if method.to_s=="post" @request = RestClient::Request.new(args) # ignore error codes from Task services (may return error codes >= 400 according to API, which causes exceptions in RestClient and RDF::Reader) -- cgit v1.2.3 From 91e2aae79278c5c3b9d3965eb3c3ec6d88e87c39 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 21 Oct 2014 11:06:44 +0200 Subject: ensure to load compound when determening compound indices in dataset --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 67722d6..d875abd 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -353,7 +353,7 @@ module OpenTox def compound_indices( compound_uri ) unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound_uri) @cmp_indices = {} - @compounds.size.times do |i| + compounds().size.times do |i| c = @compounds[i].uri if @cmp_indices[c]==nil @cmp_indices[c] = [i] -- cgit v1.2.3 From 4d65294819866ae20c47a54ab771cd49f4583573 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 21 Oct 2014 11:07:31 +0200 Subject: fix disabling AA --- lib/authorization.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 0502b37..e90feac 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -1,6 +1,6 @@ module OpenTox - if defined?($aa) and $aa[:uri] + if defined?($aa) and $aa.has_key?(:uri) AA = $aa[:uri] else AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb @@ -334,6 +334,7 @@ module OpenTox # @param subjectid [String] # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method) + return true if !AA request_method = request_method.to_sym if request_method if $aa[:free_request].include?(request_method) true -- cgit v1.2.3 From fb1c27c53fb6c67b630e6154b26d472db32adc54 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Tue, 21 Oct 2014 12:27:53 +0200 Subject: do not force quotes when exporting csv --- lib/dataset.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index d875abd..5b08110 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -185,7 +185,7 @@ module OpenTox # converts dataset to csv format including compound smiles as first column, other column headers are feature titles # @return [String] def to_csv(inchi=false) - CSV.generate({:force_quotes=>true}) do |csv| + CSV.generate() do |csv| #{:force_quotes=>true} csv << [inchi ? "InChI" : "SMILES"] + features.collect{|f| f.title} compounds.each_with_index do |c,i| csv << [inchi ? c.inchi : c.smiles] + data_entries[i] -- cgit v1.2.3 From 202bc235211c14ebd71e49c72fe90075c8e356a3 Mon Sep 17 00:00:00 2001 From: Micha Rautenberg Date: Fri, 24 Oct 2014 17:28:24 +0200 Subject: Powerful you have become Dooku, the dark side I sense in you. AA fix fix. --- lib/authorization.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index e90feac..100bd15 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -1,6 +1,6 @@ module OpenTox - if defined?($aa) and $aa.has_key?(:uri) + if defined?($aa) and $aa.has_key?(:uri) and !$aa.nil? AA = $aa[:uri] else AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb -- cgit v1.2.3 From 15e3ed72b5f8a7f07d248807f0523049fe9ea9ba Mon Sep 17 00:00:00 2001 From: rautenberg Date: Fri, 24 Oct 2014 17:35:53 +0200 Subject: AA fix fix fix :( --- lib/authorization.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 100bd15..81f6429 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -1,6 +1,6 @@ module OpenTox - if defined?($aa) and $aa.has_key?(:uri) and !$aa.nil? + if defined?($aa) and $aa.has_key?(:uri) and !$aa[:uri].nil? AA = $aa[:uri] else AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb -- cgit v1.2.3 From 9094fe09345263331e67dc35cdde819700e315e9 Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 30 Oct 2014 14:04:21 +0100 Subject: add method to fetch descriptor values --- lib/algorithm.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 582a1d1..bd4e54a 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -47,6 +47,11 @@ module OpenTox Hash[ RestClientWrapper.get(File.join(service_uri, "descriptor", "physchem", "list")).to_s.split("\n").collect{|l| l.split("\t")} ] end + # returns array of "descriptor-values", as CDK descriptors calculate serveral values, e.g., ALOGP produces ALOGP.ALogP, ALOGP.ALogp2, ALOGP.AMR + def self.physchem_descriptor_values + RestClientWrapper.get(File.join(service_uri, "descriptor", "physchem", "list_values")).to_s.split("\n") + end + end class Fminer -- cgit v1.2.3 From 6abc5c61ac5f011957997b2fbefe5d80cd154e6a Mon Sep 17 00:00:00 2001 From: mguetlein Date: Thu, 30 Oct 2014 14:10:54 +0100 Subject: add option to filter out predictions from validation result according to confidence --- lib/validation.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/validation.rb b/lib/validation.rb index 997f814..18af2c2 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -116,6 +116,18 @@ module OpenTox table end + # filters the validation-predictions and returns validation-metadata with filtered statistics + # @param min_confidence [Float] predictions with confidence < min_confidence are filtered out + # @param min_num_predictions [Integer] optional, additional param to min_confidence, the top min_num_predictions are selected, even if confidence to low + # @param max_num_predictions [Integer] returns the top max_num_predictions (with the highest confidence), not compatible to min_confidence + # return [Hash] metadata + def filter_metadata( min_confidence, min_num_predictions=nil, max_num_predictions=nil ) + conf = min_confidence ? "min_confidence=#{min_confidence}" : nil + min = min_num_predictions ? "min_num_predictions=#{min_num_predictions}" : nil + max = max_num_predictions ? "max_num_predictions=#{max_num_predictions}" : nil + YAML.load(OpenTox::RestClientWrapper.get("#{@uri}?#{[conf,min,max].compact.join("&")}",nil,{:accept => "application/x-yaml"})) + end + # returns probability-distribution for a given prediction # it takes all predictions into account that have a confidence value that is >= confidence and that have the same predicted value # (minimum 12 predictions with the hightest confidence are selected (even if the confidence is lower than the given param) -- cgit v1.2.3 From f6b7f7f812b29ccffb34fcf55d4cef7fbd8b2744 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 4 Nov 2014 17:03:27 +0100 Subject: remove \!AA check --- lib/authorization.rb | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/authorization.rb b/lib/authorization.rb index 81f6429..b530815 100644 --- a/lib/authorization.rb +++ b/lib/authorization.rb @@ -18,21 +18,21 @@ module OpenTox #Helper Class to create and send default policies out of xml templates #@example Creating a default policy to a URI - # aa=OpenTox::Authorization::Helper.new(tok) + # aa=OpenTox::Authorization::Helper.new # xml=aa.get_xml('http://uri....') - # OpenTox::Authorization.create_policy(xml,tok) + # OpenTox::Authorization.create_policy(xml) class Helper attr_accessor :user, :policy - #Generates AA object - requires subjectid + #Generates an AuthorizationHelper object - requires subjectid # @param [String] subjectid def initialize @user = Authorization.get_user @policy = Policies.new() end - #Cleans AA Policies and loads default xml file into policy attribute + #Cleans Policies of AuthorizationHelper object and loads default xml file into policy attribute #set uri and user, returns Policyfile(XML) for open-sso # @param uri [String] URI to create a policy for def get_xml(uri) @@ -66,7 +66,6 @@ module OpenTox # @param pw [String] Password # @return [Boolean] true if successful def self.authenticate(user, pw) - return nil if !AA begin res = RestClientWrapper.post("#{AA}/auth/authenticate",{:username=>user, :password => pw},{:subjectid => ""}).sub("token.id=","").sub("\n","") if is_token_valid(res) @@ -99,7 +98,6 @@ module OpenTox # @param [String] subjectid # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). def self.authorize(uri, action, subjectid=RestClientWrapper.subjectid) - return true if !AA return true if RestClientWrapper.post("#{AA}/auth/authorize",{:subjectid => subjectid, :uri => uri, :action => action})== "boolean=true\n" return false end @@ -108,7 +106,6 @@ module OpenTox # @param [String]subjectid subjectid from openSSO session # @return [Boolean] subjectid is valid or not. def self.is_token_valid(subjectid=RestClientWrapper.subjectid) - return true if !AA begin return true if RestClientWrapper.post("#{AA}/auth/isTokenValid",:tokenid => subjectid) == "boolean=true\n" rescue #do rescue because openSSO throws 401 @@ -276,7 +273,6 @@ module OpenTox # @param uri [String] URI # @param subjectid [String] def self.send_policy(uri) - return true if !AA aa = Authorization::Helper.new ret = aa.send(uri) $logger.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{RestClientWrapper.subjectid} - policy created: #{ret}" @@ -334,7 +330,7 @@ module OpenTox # @param subjectid [String] # @return [Boolean] true if access granted, else otherwise def self.authorized?(uri, request_method) - return true if !AA + return true unless $aa[:uri] request_method = request_method.to_sym if request_method if $aa[:free_request].include?(request_method) true -- cgit v1.2.3 From f3d6c7ec1ff01dd8d060424afd9ab5295cc7fea5 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Tue, 4 Nov 2014 17:14:21 +0100 Subject: add rescue to .features and .compounds methods to make them work with A&A (it do not work if dataset do not exists) --- lib/dataset.rb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 5b08110..ce5fc07 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -34,7 +34,11 @@ module OpenTox def features force_update=false if @features.empty? or force_update uri = File.join(@uri,"features") - uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list"}).split("\n") # ordered datasets return ordered features + begin + uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list"}).split("\n") # ordered datasets return ordered features + rescue + uris = [] + end @features = uris.collect{|uri| Feature.new(uri)} end @features @@ -44,7 +48,11 @@ module OpenTox def compounds force_update=false if @compounds.empty? or force_update uri = File.join(@uri,"compounds") - uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list"}).split("\n") # ordered datasets return ordered compounds + begin + uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list"}).split("\n") # ordered datasets return ordered compounds + rescue + uris = [] + end @compounds = uris.collect{|uri| Compound.new(uri)} end @compounds -- cgit v1.2.3 From cf31fa5d6a4382df2adc34a605c8b84696761676 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 5 Nov 2014 10:39:12 +0100 Subject: fix missing header hash in RestClientWrapper call --- lib/validation.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/validation.rb b/lib/validation.rb index 18af2c2..deba1e3 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -338,7 +338,7 @@ module OpenTox raise OpenTox::BadRequestError.new "params is no hash" unless params.is_a?(Hash) params[:validation_uris] = validation_uris.join(",") params[:identifier] = identifier.join(",") - uri = RestClientWrapper.post(File.join($validation[:uri],"/report/algorithm_comparison"), params, waiting_task ) + uri = RestClientWrapper.post(File.join($validation[:uri],"/report/algorithm_comparison"), params, {}, waiting_task ) uri = wait_for_task(uri) AlgorithmComparisonReport.new(uri) end -- cgit v1.2.3 From ed06e45d0b21987f53875615b055fcd0a1829bd6 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 5 Nov 2014 12:50:35 +0100 Subject: add missing opening body tag in to_html method --- lib/opentox-client.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index d492fef..bafde4c 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -50,8 +50,8 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m "validation.rb" ].each{ |f| require_relative f } -if defined?($aa) and $aa[:uri] - OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) - unauthorized_error "Failed to authenticate user \"#{$aa[:user]}\"." unless OpenTox::Authorization.is_token_valid(OpenTox::RestClientWrapper.subjectid) -end +#if defined?($aa) and $aa[:uri] +# OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) +# unauthorized_error "Failed to authenticate user \"#{$aa[:user]}\"." unless OpenTox::Authorization.is_token_valid(OpenTox::RestClientWrapper.subjectid) +#end -- cgit v1.2.3 From 9fc686c9f1dbf6155a95d6a9c884bc9eb531c797 Mon Sep 17 00:00:00 2001 From: gebele Date: Wed, 5 Nov 2014 14:06:33 +0100 Subject: fixed metadata call for find_or_create, flatten arrays in object; ensure right quotation for string objects --- lib/opentox.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/opentox.rb b/lib/opentox.rb index 16cecca..9564e9c 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -244,14 +244,18 @@ module OpenTox def self.find_or_create metadata t = Time.now sparql = "SELECT DISTINCT ?s WHERE { " + # flatten 3.level arrays in objects + metadata.each{|p,o| o.flatten! if o.is_a? Array} metadata.each do |predicate,objects| unless [RDF::DC.date,RDF::DC.modified,RDF::DC.description].include? predicate # remove dates and description (strange characters in description may lead to SPARQL errors) if objects.is_a? String - URI.valid?(objects) ? o = "<#{objects}>" : o = "'''#{objects}'''" + #URI.valid?(objects) ? o = "<#{objects}>" : o = "'''#{objects}'''" #DG: do not understand this quotation + URI.valid?(objects) ? o = "<#{objects}>" : o = "\"#{objects}\"" sparql << "?s <#{predicate}> #{o}. " elsif objects.is_a? Array objects.each do |object| - URI.valid?(object) ? o = "<#{object}>" : o = "'#{object}'" + #URI.valid?(object) ? o = "<#{object}>" : o = "'#{object}'" #DG: do not understand this quotation + URI.valid?(object) ? o = "<#{object}>" : o = "\"#{object}\"" sparql << "?s <#{predicate}> #{o}. " end end -- cgit v1.2.3 From 7963fa05c510b3e503e04ce91d2cb1246e11a9b2 Mon Sep 17 00:00:00 2001 From: rautenberg Date: Wed, 5 Nov 2014 16:44:41 +0100 Subject: add missing opening body tag in to_html method / remove autologin to avoid confusion with configuration errors --- lib/overwrite.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 1c9517d..c96c2d8 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -54,7 +54,7 @@ class String # TODO add title as parameter title = nil #$sinatra.to($sinatra.request.env['PATH_INFO'], :full) if $sinatra - html = "" + html = "" html << ""+title+"" if title #html += "<\/img>" -- cgit v1.2.3 From 4c9c37c829532fdf0b920e179881cfd010b94ace Mon Sep 17 00:00:00 2001 From: gebele Date: Mon, 9 Mar 2015 10:42:32 +0100 Subject: reintroduce percentageCompleted for task progress;added method to generate a task uri for pass to object to update progress --- lib/task.rb | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/task.rb b/lib/task.rb index f5016d5..a64e668 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -10,13 +10,18 @@ module OpenTox super true # always update metadata end - def self.run(description, creator=nil) + def self.task_uri + Task.new.uri + end + + def self.run(description, creator=nil, uri=nil) - task = Task.new nil + task = Task.new uri task[RDF::OT.created_at] = DateTime.now task[RDF::OT.hasStatus] = "Running" task[RDF::DC.description] = description.to_s task[RDF::DC.creator] = creator.to_s + task[RDF::OT.percentageCompleted] = "0" task.put pid = fork do begin @@ -72,6 +77,7 @@ module OpenTox self.[]=(RDF::OT.resultURI, uri) self.[]=(RDF::OT.hasStatus, "Completed") self.[]=(RDF::OT.finished_at, DateTime.now) + self.[]=(RDF::OT.percentageCompleted, "100") put end @@ -110,7 +116,7 @@ module OpenTox code >= 400 and code != 503 end - [:hasStatus, :resultURI, :created_at, :finished_at].each do |method| + [:hasStatus, :resultURI, :created_at, :finished_at, :percentageCompleted].each do |method| define_method method do response = self.[](RDF::OT[method]) response = self.[](RDF::OT1[method]) unless response # API 1.1 compatibility @@ -139,7 +145,7 @@ module OpenTox report end - #TODO: subtasks (only for progress) + #TODO: subtasks (only for progress in validation) class SubTask def initialize(task, min, max) -- cgit v1.2.3 From 1070a35db8aa6414cf53bcce92c1355986cbc53b Mon Sep 17 00:00:00 2001 From: gebele Date: Thu, 26 Mar 2015 17:09:00 +0100 Subject: avoid data_entries nil error --- lib/dataset.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index ce5fc07..d7c4076 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -261,7 +261,6 @@ module OpenTox def to_ntriples # redefined string version for better performance ntriples = "" @metadata[RDF.type] = [ RDF::OT.Dataset, RDF::OT.OrderedDataset ] - @metadata.each do |predicate,values| [values].flatten.each do |value| URI.valid?(value) ? value = "<#{value}>" : value = "\"#{value}\"" @@ -295,7 +294,7 @@ module OpenTox ntriples << "#{data_entry_node} <#{RDF::OT.values}> #{value_node} .\n" ntriples << "#{value_node} <#{RDF::OT.feature}> <#{@features[j].uri}> .\n" ntriples << "#{value_node} <#{RDF::OT.value}> \"#{value}\" .\n" - end + end unless @data_entries[i].nil? end ntriples -- cgit v1.2.3 From 723d731bc08d90a82f22474c9fafcc504eb424d3 Mon Sep 17 00:00:00 2001 From: ch Date: Wed, 8 Jul 2015 10:58:24 +0200 Subject: feature, error and task (almost) working --- lib/error.rb | 31 ++++++++------- lib/opentox.rb | 95 ++++++++++++++++++++-------------------------- lib/overwrite.rb | 4 +- lib/rest-client-wrapper.rb | 12 +++--- lib/task.rb | 48 +++++++++-------------- 5 files changed, 85 insertions(+), 105 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 506c542..878ed28 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -8,27 +8,27 @@ module OpenToxError @error_cause = cause ? OpenToxError::cut_backtrace(cause) : short_backtrace super message - #unless self.is_a? Errno::EAGAIN # avoid "Resource temporarily unavailable" errors @uri = uri.to_s.sub(%r{//.*:.*@},'//') # remove credentials from uri @http_code ||= 500 - @rdf = RDF::Graph.new - subject = RDF::Node.new - @rdf << [subject, RDF.type, RDF::OT.ErrorReport] - @rdf << [subject, RDF::OT.actor, @uri] - @rdf << [subject, RDF::OT.message, message.to_s] - @rdf << [subject, RDF::OT.statusCode, @http_code] - @rdf << [subject, RDF::OT.errorCode, self.class.to_s] - @rdf << [subject, RDF::OT.errorCause, @error_cause] - $logger.error("\n"+self.to_yaml) - #end + @metadata = { + :type => "ErrorReport", + :actor => @uri, + :message => message.to_s, + :statusCode => @http_code, + :errorCode => self.class.to_s, + :errorCause => @error_cause, + } + $logger.error("\n"+JSON.pretty_generate(@metadata)) end +=begin # this method defines what is used for to_yaml (override to skip large @rdf graph) def encode_with coder @rdf.each do |statement| coder[statement.predicate.fragment.to_s] = statement.object.to_s end end +=end def self.cut_backtrace(trace) if trace.is_a?(Array) @@ -36,7 +36,7 @@ module OpenToxError cut_index ||= trace.size cut_index -= 1 cut_index = trace.size-1 if cut_index < 0 - trace[0..cut_index].join("\n") + trace[0..cut_index] else trace end @@ -47,6 +47,7 @@ module OpenToxError OpenToxError::cut_backtrace(backtrace) end +=begin RDF_FORMATS.each do |format| # rdf serialization methods for all formats e.g. to_rdfxml send :define_method, "to_#{format}".to_sym do @@ -63,11 +64,15 @@ module OpenToxError @rdf.each{|statement| writer << statement} if @rdf end end +=end + + def to_json + @metadata.to_json + end end class RuntimeError -#class StandardError include OpenToxError end diff --git a/lib/opentox.rb b/lib/opentox.rb index 9564e9c..850ef4b 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -3,7 +3,6 @@ $logger = OTLogger.new(STDERR) $logger.level = Logger::DEBUG module OpenTox - #include RDF CH: leads to namespace clashes with URI class attr_reader :uri attr_writer :metadata, :parameters @@ -14,20 +13,16 @@ module OpenTox # @param uri [optional,String] URI # @return [OpenTox] OpenTox object def initialize uri=nil - @rdf = RDF::Graph.new @metadata = {} - @parameters = [] + @metadata[:type] = self.class.to_s.split(/::/).last + #@parameters = [] uri ? @uri = uri.to_s.chomp : @uri = File.join(service_uri, SecureRandom.uuid) end # Object metadata (lazy loading) # @return [Hash] Object metadata def metadata force_update=false - if (@metadata.nil? or @metadata.empty? or force_update) and URI.accessible? @uri - get if @rdf.nil? or @rdf.empty? or force_update - # return values as plain strings instead of RDF objects - @metadata = @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } - end + get #if (@metadata.nil? or @metadata.empty? or force_update) and URI.accessible? @uri @metadata end @@ -35,6 +30,7 @@ module OpenTox # @param predicate [String] Predicate URI # @return [Array, String] Predicate value(s) def [](predicate) + predicate = predicate.to_s return nil if metadata[predicate].nil? metadata[predicate].size == 1 ? metadata[predicate].first : metadata[predicate] end @@ -43,15 +39,17 @@ module OpenTox # @param predicate [String] Predicate URI # @param values [Array, String] Predicate value(s) def []=(predicate,values) + predicate = predicate.to_s @metadata[predicate] = [values].flatten end +=begin # Object parameters (lazy loading) # {http://opentox.org/dev/apis/api-1.2/interfaces OpenTox API} # @return [Hash] Object parameters def parameters force_update=false if (@parameters.empty? or force_update) and URI.accessible? @uri - get if @rdf.empty? or force_update + get #if @rdf.empty? or force_update params = {} query = RDF::Query.new({ :parameter => { @@ -74,20 +72,28 @@ module OpenTox def parameter_value title @parameters.collect{|p| p[RDF::OT.paramValue] if p[RDF::DC.title] == title}.compact.first end +=end # Get object from webservice # @param [String,optional] mime_type - def get mime_type="text/plain" - bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" + def get mime_type="application/json" + bad_request_error "Mime type #{mime_type} is not supported. Please use 'application/json' (default), 'text/plain' (ntriples) or mime_type == 'application/rdf+xml'." unless mime_type == "application/json" or mime_type == "text/plain" or mime_type == "application/rdf+xml" response = RestClientWrapper.get(@uri,{},{:accept => mime_type}) if URI.task?(response) uri = wait_for_task response response = RestClientWrapper.get(uri,{},{:accept => mime_type}) end - parse_ntriples response if mime_type == "text/plain" - parse_rdfxml response if mime_type == "application/rdf+xml" + case mime_type + when 'application/json' + @metadata = JSON.parse(response) + when "text/plain" + parse_ntriples response + when "application/rdf+xml" + parse_rdfxml response + end end +=begin # Post object to webservice (append to object), rarely useful and deprecated # @deprecated def post wait=true, mime_type="text/plain" @@ -102,17 +108,20 @@ module OpenTox uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type} wait ? wait_for_task(uri) : uri end +=end # Save object at webservice (replace or create object) - def put wait=true, mime_type="text/plain" - bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" - @metadata[RDF::OT.created_at] = DateTime.now unless URI.accessible? @uri + def put wait=true, mime_type="application/json" + bad_request_error "Mime type #{mime_type} is not supported. Please use 'application/json' (default)." unless mime_type == "application/json" or mime_type == "text/plain" or mime_type == "application/rdf+xml" + @metadata[:created_at] = DateTime.now unless URI.accessible? @uri #@metadata[RDF::DC.modified] = DateTime.now case mime_type when 'text/plain' body = self.to_ntriples when 'application/rdf+xml' body = self.to_rdfxml + when 'application/json' + body = self.to_json end uri = RestClientWrapper.put @uri, body, { :content_type => mime_type} wait ? wait_for_task(uri) : uri @@ -157,8 +166,11 @@ module OpenTox RDF::Reader.for(format).new(rdf) do |reader| reader.each_statement{ |statement| @rdf << statement } end + # return values as plain strings instead of RDF objects + @metadata = @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } end +=begin # rdf serialization methods for all formats e.g. to_rdfxml send :define_method, "to_#{format}".to_sym do create_rdf @@ -170,6 +182,7 @@ module OpenTox end end end +=end end # @return [String] converts object to turtle-string @@ -182,20 +195,28 @@ module OpenTox end end + def to_json + @metadata[:uri] = @uri + @metadata.to_json + end + # @return [String] converts OpenTox object into html document (by first converting it to a string) def to_html to_turtle.to_html end +=begin # short access for metadata keys title, description and type - { :title => RDF::DC.title, :description => RDF::DC.description, :type => RDF.type }.each do |method,predicate| + #{ :title => RDF::DC.title, :description => RDF::DC.description, :type => RDF.type }.each do |method,predicate| + [ :title , :description, :type ].each do |method| send :define_method, method do - self.[](predicate) + self.[](method) end send :define_method, "#{method}=" do |value| - self.[]=(predicate,value) + self.[]=(method,value) end end +=end # define class methods within module def self.included(base) @@ -242,40 +263,8 @@ module OpenTox end def self.find_or_create metadata - t = Time.now - sparql = "SELECT DISTINCT ?s WHERE { " - # flatten 3.level arrays in objects - metadata.each{|p,o| o.flatten! if o.is_a? Array} - metadata.each do |predicate,objects| - unless [RDF::DC.date,RDF::DC.modified,RDF::DC.description].include? predicate # remove dates and description (strange characters in description may lead to SPARQL errors) - if objects.is_a? String - #URI.valid?(objects) ? o = "<#{objects}>" : o = "'''#{objects}'''" #DG: do not understand this quotation - URI.valid?(objects) ? o = "<#{objects}>" : o = "\"#{objects}\"" - sparql << "?s <#{predicate}> #{o}. " - elsif objects.is_a? Array - objects.each do |object| - #URI.valid?(object) ? o = "<#{object}>" : o = "'#{object}'" #DG: do not understand this quotation - URI.valid?(object) ? o = "<#{object}>" : o = "\"#{object}\"" - sparql << "?s <#{predicate}> #{o}. " - end - end - end - end - sparql << "}" - puts "Create SPARQL: #{Time.now-t}" - t = Time.new - uris = RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list"}).split("\n") - puts "Query: #{Time.now-t}" - t = Time.new - if uris.empty? - f=self.create metadata - puts "Create: #{Time.now-t}" - f - else - f=self.new uris.first - puts "Found: #{Time.now-t}" - f - end + uris = RestClientWrapper.get(service_uri,{:query => metadata},{:accept => "text/uri-list"}).split("\n") + uris.empty? ? self.create(metadata) : self.new(uris.first) end end OpenTox.const_set klass,c diff --git a/lib/overwrite.rb b/lib/overwrite.rb index c96c2d8..692e239 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -158,8 +158,8 @@ module Kernel error = OpenTox::RestClientWrapper.known_errors.select{|error| error[:code] == t.code}.first error_method = error ? error[:method] : :internal_server_error report = t.error_report - error_message = report ? report[RDF::OT.message] : $!.message - error_cause = report ? report[RDF::OT.errorCause] : nil + error_message = report ? report[:message] : $!.message + error_cause = report ? report[:errorCause] : nil Object.send(error_method,error_message,t.uri,error_cause) end uri = t.resultURI diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 7011eca..de1b74f 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -62,13 +62,11 @@ module OpenTox #parameters[:url] = parameters[:url].gsub(/(http|https|)\:\/\/[a-zA-Z0-9\-]+\:[a-zA-Z0-9]+\@/, "REMOVED@") if parameters[:url] #message += "\nREST parameters:\n#{parameters.inspect}" error = known_errors.collect{|e| e if e[:code] == response.code}.compact.first - begin # errors are returned as error reports in turtle, try to parse - content = {} - RDF::Reader.for(:turtle).new(response) do |reader| - reader.each_triple{|triple| content[triple[1]] = triple[2]} - end - msg = content[RDF::OT.message].to_s - cause = content[RDF::OT.errorCause].to_s + begin # errors are returned as error reports in json, try to parse + # TODO: may be the reason for failure of task.rb -n test_11_wait_for_error_task + content = JSON.parse(response) + msg = content["message"].to_s + cause = content["errorCause"].to_s raise if msg.size==0 && cause.size==0 # parsing failed rescue # parsing error failed, use complete content as message msg = "Could not parse error response from rest call '#{method}' to '#{uri}':\n#{response}" diff --git a/lib/task.rb b/lib/task.rb index a64e668..7f4d39a 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -17,11 +17,11 @@ module OpenTox def self.run(description, creator=nil, uri=nil) task = Task.new uri - task[RDF::OT.created_at] = DateTime.now - task[RDF::OT.hasStatus] = "Running" - task[RDF::DC.description] = description.to_s - task[RDF::DC.creator] = creator.to_s - task[RDF::OT.percentageCompleted] = "0" + task[:created_at] = DateTime.now + task[:hasStatus] = "Running" + task[:description] = description.to_s + task[:creator] = creator.to_s + task[:percentageCompleted] = "0" task.put pid = fork do begin @@ -30,7 +30,7 @@ module OpenTox # wrap non-opentox-errors first e = OpenTox::Error.new(500,e.message,nil,e.backtrace) unless e.is_a?(OpenTox::Error) $logger.error "error in task #{task.uri} created by #{creator}" # creator is not logged because error is logged when thrown - RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => e.to_ntriples},{:content_type => 'text/plain'}) + RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => e.to_json},{:content_type => 'application/json'}) task.kill end end @@ -59,25 +59,25 @@ module OpenTox end def description - self.[](RDF::DC.description) + self.[](:description) end def creator - self.[](RDF::DC.creator) + self.[](:creator) end def cancel kill - self.[]=(RDF::OT.hasStatus, "Cancelled") - self.[]=(RDF::OT.finished_at, DateTime.now) + self.[]=(:hasStatus, "Cancelled") + self.[]=(:finished_at, DateTime.now.to_s) put end def completed(uri) - self.[]=(RDF::OT.resultURI, uri) - self.[]=(RDF::OT.hasStatus, "Completed") - self.[]=(RDF::OT.finished_at, DateTime.now) - self.[]=(RDF::OT.percentageCompleted, "100") + self.[]=(:resultURI, uri) + self.[]=(:hasStatus, "Completed") + self.[]=(:finished_at, DateTime.now.to_s) + self.[]=(:percentageCompleted, "100") put end @@ -118,31 +118,19 @@ module OpenTox [:hasStatus, :resultURI, :created_at, :finished_at, :percentageCompleted].each do |method| define_method method do - response = self.[](RDF::OT[method]) - response = self.[](RDF::OT1[method]) unless response # API 1.1 compatibility - response + self.[](method) end end # Check status of a task # @return [String] Status def status - self[RDF::OT.hasStatus] + self[:hasStatus] end def error_report - get - report = {} - query = RDF::Query.new({ - :report => { - RDF.type => RDF::OT.ErrorReport, - :property => :value, - } - }) - query.execute(@rdf).each do |solution| - report[solution.property] = solution.value.to_s - end - report + #get + self[:errorReport] end #TODO: subtasks (only for progress in validation) -- cgit v1.2.3 From f850712765a67bf31b1327401e3eddf59e3e6f50 Mon Sep 17 00:00:00 2001 From: ch Date: Sun, 12 Jul 2015 12:14:13 +0200 Subject: initial dataset tests --- lib/compound.rb | 19 +++++--- lib/dataset.rb | 146 ++++++++++++++++++++++++++++++-------------------------- lib/opentox.rb | 76 ++++++++++++++--------------- lib/task.rb | 10 ++-- 4 files changed, 134 insertions(+), 117 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index f63e127..82ea94e 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -5,8 +5,13 @@ module OpenTox # Ruby wrapper for OpenTox Compound Webservices (http://opentox.org/dev/apis/api-1.2/structure). class Compound + def initialize uri + @data = {} + @data["uri"] = uri + end + def ==(c) - @uri == c.uri + @data["uri"] == c.uri end # Create a compound from smiles string @@ -45,25 +50,25 @@ module OpenTox # Get InChI # @return [String] InChI string def inchi - @inchi ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-inchi'}).chomp + @inchi ||= RestClientWrapper.get(@data["uri"],{},{:accept => 'chemical/x-inchi'}).chomp end # Get InChIKey # @return [String] InChI string def inchikey - @inchikey ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-inchikey'}).chomp + @inchikey ||= RestClientWrapper.get(@data["uri"],{},{:accept => 'chemical/x-inchikey'}).chomp end # Get (canonical) smiles # @return [String] Smiles string def smiles - @smiles ||= RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-daylight-smiles'}).chomp + @smiles ||= RestClientWrapper.get(@data["uri"],{},{:accept => 'chemical/x-daylight-smiles'}).chomp end # Get sdf # @return [String] SDF string def sdf - RestClientWrapper.get(@uri,{},{:accept => 'chemical/x-mdl-sdfile'}).chomp + RestClientWrapper.get(@data["uri"],{},{:accept => 'chemical/x-mdl-sdfile'}).chomp end # Get gif image @@ -77,13 +82,13 @@ module OpenTox # image = compound.png # @return [image/png] Image data def png - RestClientWrapper.get(File.join @uri, "image") + RestClientWrapper.get(File.join @data["uri"], "image") end # Get URI of compound image # @return [String] Compound image URI def image_uri - File.join @uri, "image" + File.join @data["uri"], "image" end # Get all known compound names. Relies on an external service for name lookups. diff --git a/lib/dataset.rb b/lib/dataset.rb index d7c4076..28133b2 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -5,63 +5,75 @@ module OpenTox # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). class Dataset - attr_writer :features, :compounds, :data_entries - def initialize uri=nil super uri - @features = [] - @compounds = [] - @data_entries = [] + @data["features"] ||= [] + @data["compounds"] ||= [] + @data["data_entries"] ||= [] + end + + [:features, :compounds, :data_entries].each do |method| + send :define_method, method do + @data[method.to_s] + end + send :define_method, "#{method}=" do |value| + @data[method.to_s] = value.collect{|v| v.uri} + end + send :define_method, "#{method}<<" do |value| + @data[method.to_s] << value.uri + end end # Get data (lazy loading from dataset service) # overrides {OpenTox#metadata} to only load the metadata instead of the whole dataset # @return [Hash] the metadata def metadata force_update=false - if @metadata.empty? or force_update - uri = File.join(@uri,"metadata") - begin - parse_ntriples RestClientWrapper.get(uri,{},{:accept => "text/plain"}) - rescue # fall back to rdfxml - parse_rdfxml RestClientWrapper.get(uri,{},{:accept => "application/rdf+xml"}) - end - @metadata = @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } + if @data.empty? or force_update + uri = File.join(@data["uri"],"metadata") + #begin + RestClientWrapper.get(uri,{},{:accept => "application/json"}) + @data = JSON.parse RestClientWrapper.get(uri,{},{:accept => "application/json"}) + #parse_ntriples RestClientWrapper.get(uri,{},{:accept => "text/plain"}) + #rescue # fall back to rdfxml + #parse_rdfxml RestClientWrapper.get(uri,{},{:accept => "application/rdf+xml"}) + #end + #@data = @rdf.to_hash[RDF::URI.new(@data["uri"])].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } end - @metadata + @data end # @return [Array] feature objects (NOT uris) def features force_update=false - if @features.empty? or force_update - uri = File.join(@uri,"features") + if @data["features"].empty? or force_update + uri = File.join(@data["uri"],"features") begin uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list"}).split("\n") # ordered datasets return ordered features rescue uris = [] end - @features = uris.collect{|uri| Feature.new(uri)} + @data["features"] = uris.collect{|uri| Feature.new(uri)} end - @features + @data["features"] end # @return [Array] compound objects (NOT uris) def compounds force_update=false - if @compounds.empty? or force_update - uri = File.join(@uri,"compounds") + if @data["compounds"].empty? or force_update + uri = File.join(@data["uri"],"compounds") begin uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list"}).split("\n") # ordered datasets return ordered compounds rescue uris = [] end - @compounds = uris.collect{|uri| Compound.new(uri)} + @data["compounds"] = uris.collect{|uri| Compound.new(uri)} end - @compounds + @data["compounds"] end # @return [Array] with two dimensions, # first index: compounds, second index: features, values: compound feature values def data_entries force_update=false - if @data_entries.empty? or force_update + if @data["data_entries"].empty? or force_update sparql = "SELECT ?cidx ?fidx ?value FROM <#{uri}> WHERE { ?data_entry <#{RDF::OLO.index}> ?cidx ; <#{RDF::OT.values}> ?v . @@ -71,16 +83,16 @@ module OpenTox } ORDER BY ?fidx ?cidx" RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list"}).split("\n").each do |row| r,c,v = row.split("\t") - @data_entries[r.to_i] ||= [] + @data["data_entries"][r.to_i] ||= [] # adjust value class depending on feature type, StringFeature takes precedence over NumericFeature if features[c.to_i][RDF.type].include? RDF::OT.NumericFeature and ! features[c.to_i][RDF.type].include? RDF::OT.StringFeature v = v.to_f if v end - @data_entries[r.to_i][c.to_i] = v if v + @data["data_entries"][r.to_i][c.to_i] = v if v end # TODO: fallbacks for external and unordered datasets end - @data_entries + @data["data_entries"] end # Find data entry values for a given compound and feature @@ -137,18 +149,18 @@ module OpenTox end # Adding data methods - # (Alternatively, you can directly change @features and @compounds) + # (Alternatively, you can directly change @data["features"] and @data["compounds"]) # Create a dataset from file (csv,sdf,...) # @param filename [String] # @return [String] dataset uri def upload filename, wait=true - uri = RestClientWrapper.put(@uri, {:file => File.new(filename)}) + uri = RestClientWrapper.put(@data["uri"], {:file => File.new(filename)}) wait_for_task uri if URI.task?(uri) and wait compounds true features true metadata true - @uri + @data["uri"] end # @param compound [OpenTox::Compound] @@ -156,17 +168,17 @@ module OpenTox # @param value [Object] (will be converted to String) # @return [Array] data_entries def add_data_entry compound, feature, value - @compounds << compound unless @compounds.collect{|c| c.uri}.include?(compound.uri) - row = @compounds.collect{|c| c.uri}.index(compound.uri) - @features << feature unless @features.collect{|f| f.uri}.include?(feature.uri) - col = @features.collect{|f| f.uri}.index(feature.uri) - if @data_entries[row] and @data_entries[row][col] # duplicated values - @compounds << compound - row = @compounds.collect{|c| c.uri}.rindex(compound.uri) + @data["compounds"] << compound unless @data["compounds"].collect{|c| c.uri}.include?(compound.uri) + row = @data["compounds"].collect{|c| c.uri}.index(compound.uri) + @data["features"] << feature unless @data["features"].collect{|f| f.uri}.include?(feature.uri) + col = @data["features"].collect{|f| f.uri}.index(feature.uri) + if @data["data_entries"][row] and @data["data_entries"][row][col] # duplicated values + @data["compounds"] << compound + row = @data["compounds"].collect{|c| c.uri}.rindex(compound.uri) end if value - @data_entries[row] ||= [] - @data_entries[row][col] = value + @data["data_entries"][row] ||= [] + @data["data_entries"][row][col] = value end end @@ -181,15 +193,15 @@ module OpenTox # d << [ Compound.new("c1ccccc1"), feature-value-a, feature-value-b ] def << row compound = row.shift # removes the compound from the array - bad_request_error "Dataset features are empty." unless @features - bad_request_error "Row size '#{row.size}' does not match features size '#{@features.size}'." unless row.size == @features.size + bad_request_error "Dataset features are empty." unless @data["features"] + bad_request_error "Row size '#{row.size}' does not match features size '#{@data["features"].size}'." unless row.size == @data["features"].size bad_request_error "First column is not a OpenTox::Compound" unless compound.class == OpenTox::Compound - @compounds << compound - @data_entries << row + @data["compounds"] << compound.uri + @data["data_entries"] << row end # Serialisation - + # converts dataset to csv format including compound smiles as first column, other column headers are feature titles # @return [String] def to_csv(inchi=false) @@ -213,11 +225,11 @@ module OpenTox reader.each_statement{ |statement| @rdf << statement } end query = RDF::Query.new({ :uri => { RDF.type => RDF::OT.Compound } }) - @compounds = query.execute(@rdf).collect { |solution| OpenTox::Compound.new solution.uri } + @data["compounds"] = query.execute(@rdf).collect { |solution| OpenTox::Compound.new solution.uri } query = RDF::Query.new({ :uri => { RDF.type => RDF::OT.Feature } }) - @features = query.execute(@rdf).collect { |solution| OpenTox::Feature.new solution.uri } - @compounds.each_with_index do |c,i| - @features.each_with_index do |f,j| + @data["features"] = query.execute(@rdf).collect { |solution| OpenTox::Feature.new solution.uri } + @data["compounds"].each_with_index do |c,i| + @data["features"].each_with_index do |f,j| end end end @@ -225,13 +237,13 @@ module OpenTox # redefine rdf serialization methods send :define_method, "to_#{format}".to_sym do - @metadata[RDF.type] = [RDF::OT.Dataset, RDF::OT.OrderedDataset] + @data[RDF.type] = [RDF::OT.Dataset, RDF::OT.OrderedDataset] create_rdf - @features.each_with_index do |feature,i| + @data["features"].each_with_index do |feature,i| @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Feature)] @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] end - @compounds.each_with_index do |compound,i| + @data["compounds"].each_with_index do |compound,i| @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Compound)] if defined? @neighbors and neighbors.include? compound @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Neighbor)] @@ -239,14 +251,14 @@ module OpenTox @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] data_entry_node = RDF::Node.new - @rdf << [RDF::URI.new(@uri), RDF::URI.new(RDF::OT.dataEntry), data_entry_node] + @rdf << [RDF::URI.new(@data["uri"]), RDF::URI.new(RDF::OT.dataEntry), data_entry_node] @rdf << [data_entry_node, RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.DataEntry)] @rdf << [data_entry_node, RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] @rdf << [data_entry_node, RDF::URI.new(RDF::OT.compound), RDF::URI.new(compound.uri)] - @data_entries[i].each_with_index do |value,j| + @data["data_entries"][i].each_with_index do |value,j| value_node = RDF::Node.new @rdf << [data_entry_node, RDF::URI.new(RDF::OT.values), value_node] - @rdf << [value_node, RDF::URI.new(RDF::OT.feature), RDF::URI.new(@features[j].uri)] + @rdf << [value_node, RDF::URI.new(RDF::OT.feature), RDF::URI.new(@data["features"][j].uri)] @rdf << [value_node, RDF::URI.new(RDF::OT.value), RDF::Literal.new(value)] end end @@ -260,24 +272,24 @@ module OpenTox # TODO: fix bug that affects data_entry positions # DG: who wrotes this comment ? def to_ntriples # redefined string version for better performance ntriples = "" - @metadata[RDF.type] = [ RDF::OT.Dataset, RDF::OT.OrderedDataset ] - @metadata.each do |predicate,values| + @data[RDF.type] = [ RDF::OT.Dataset, RDF::OT.OrderedDataset ] + @data.each do |predicate,values| [values].flatten.each do |value| URI.valid?(value) ? value = "<#{value}>" : value = "\"#{value}\"" - ntriples << "<#{@uri}> <#{predicate}> #{value} .\n" #\n" + ntriples << "<#{@data["uri"]}> <#{predicate}> #{value} .\n" #\n" end end @parameters.each_with_index do |parameter,i| p_node = "_:parameter"+ i.to_s - ntriples << "<#{@uri}> <#{RDF::OT.parameters}> #{p_node} .\n" + ntriples << "<#{@data["uri"]}> <#{RDF::OT.parameters}> #{p_node} .\n" ntriples << "#{p_node} <#{RDF.type}> <#{RDF::OT.Parameter}> .\n" parameter.each { |k,v| ntriples << "#{p_node} <#{k}> \"#{v.to_s.tr('"', '\'')}\" .\n" } end - @features.each_with_index do |feature,i| + @data["features"].each_with_index do |feature,i| ntriples << "<#{feature.uri}> <#{RDF.type}> <#{RDF::OT.Feature}> .\n" ntriples << "<#{feature.uri}> <#{RDF::OLO.index}> \"#{i}\"^^ .\n" # sorting at dataset service does not work without type information end - @compounds.each_with_index do |compound,i| + @data["compounds"].each_with_index do |compound,i| ntriples << "<#{compound.uri}> <#{RDF.type}> <#{RDF::OT.Compound}> .\n" if defined? @neighbors and neighbors.include? compound ntriples << "<#{compound.uri}> <#{RDF.type}> <#{RDF::OT.Neighbor}> .\n" @@ -285,16 +297,16 @@ module OpenTox ntriples << "<#{compound.uri}> <#{RDF::OLO.index}> \"#{i}\"^^ .\n" # sorting at dataset service does not work without type information data_entry_node = "_:dataentry"+ i.to_s - ntriples << "<#{@uri}> <#{RDF::OT.dataEntry}> #{data_entry_node} .\n" + ntriples << "<#{@data["uri"]}> <#{RDF::OT.dataEntry}> #{data_entry_node} .\n" ntriples << "#{data_entry_node} <#{RDF.type}> <#{RDF::OT.DataEntry}> .\n" ntriples << "#{data_entry_node} <#{RDF::OLO.index}> \"#{i}\"^^ .\n" # sorting at dataset service does not work without type information ntriples << "#{data_entry_node} <#{RDF::OT.compound}> <#{compound.uri}> .\n" - @data_entries[i].each_with_index do |value,j| + @data["data_entries"][i].each_with_index do |value,j| value_node = data_entry_node+ "_value"+ j.to_s ntriples << "#{data_entry_node} <#{RDF::OT.values}> #{value_node} .\n" - ntriples << "#{value_node} <#{RDF::OT.feature}> <#{@features[j].uri}> .\n" + ntriples << "#{value_node} <#{RDF::OT.feature}> <#{@data["features"][j].uri}> .\n" ntriples << "#{value_node} <#{RDF::OT.value}> \"#{value}\" .\n" - end unless @data_entries[i].nil? + end unless @data["data_entries"][i].nil? end ntriples @@ -361,7 +373,7 @@ module OpenTox unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound_uri) @cmp_indices = {} compounds().size.times do |i| - c = @compounds[i].uri + c = @data["compounds"][i].uri if @cmp_indices[c]==nil @cmp_indices[c] = [i] else @@ -374,9 +386,9 @@ module OpenTox # returns compound feature value using the compound-index and the feature_uri def data_entry_value(compound_index, feature_uri) - data_entries(true) if @data_entries.empty? - col = @features.collect{|f| f.uri}.index feature_uri - @data_entries[compound_index] ? @data_entries[compound_index][col] : nil + data_entries(true) if @data["data_entries"].empty? + col = @data["features"].collect{|f| f.uri}.index feature_uri + @data["data_entries"][compound_index] ? @data["data_entries"][compound_index][col] : nil end end diff --git a/lib/opentox.rb b/lib/opentox.rb index 850ef4b..fe49ece 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -4,26 +4,29 @@ $logger.level = Logger::DEBUG module OpenTox - attr_reader :uri - attr_writer :metadata, :parameters - # Ruby interface # Create a new OpenTox object # @param uri [optional,String] URI # @return [OpenTox] OpenTox object def initialize uri=nil - @metadata = {} - @metadata[:type] = self.class.to_s.split(/::/).last - #@parameters = [] - uri ? @uri = uri.to_s.chomp : @uri = File.join(service_uri, SecureRandom.uuid) + @data = {} + if uri + @data["uri"] = uri.to_s.chomp + get + else + @data["uuid"] = SecureRandom.uuid + @data["uri"] = File.join(service_uri, @data["uuid"]) + @data["created_at"] = DateTime.now.to_s + @data["type"] = self.class.to_s.split('::').last + end end # Object metadata (lazy loading) # @return [Hash] Object metadata def metadata force_update=false - get #if (@metadata.nil? or @metadata.empty? or force_update) and URI.accessible? @uri - @metadata + get if force_update and URI.accessible? @data["uri"] + @data end # Metadata values @@ -31,8 +34,8 @@ module OpenTox # @return [Array, String] Predicate value(s) def [](predicate) predicate = predicate.to_s - return nil if metadata[predicate].nil? - metadata[predicate].size == 1 ? metadata[predicate].first : metadata[predicate] + return nil if @data[predicate].nil? + @data[predicate].size == 1 ? @data[predicate].first : @data[predicate] end # Set a metadata entry @@ -40,7 +43,7 @@ module OpenTox # @param values [Array, String] Predicate value(s) def []=(predicate,values) predicate = predicate.to_s - @metadata[predicate] = [values].flatten + @data[predicate] = [values].flatten end =begin @@ -78,14 +81,14 @@ module OpenTox # @param [String,optional] mime_type def get mime_type="application/json" bad_request_error "Mime type #{mime_type} is not supported. Please use 'application/json' (default), 'text/plain' (ntriples) or mime_type == 'application/rdf+xml'." unless mime_type == "application/json" or mime_type == "text/plain" or mime_type == "application/rdf+xml" - response = RestClientWrapper.get(@uri,{},{:accept => mime_type}) + response = RestClientWrapper.get(@data["uri"],{},{:accept => mime_type}) if URI.task?(response) uri = wait_for_task response response = RestClientWrapper.get(uri,{},{:accept => mime_type}) end case mime_type when 'application/json' - @metadata = JSON.parse(response) + @data = JSON.parse(response) if response when "text/plain" parse_ntriples response when "application/rdf+xml" @@ -112,25 +115,20 @@ module OpenTox # Save object at webservice (replace or create object) def put wait=true, mime_type="application/json" - bad_request_error "Mime type #{mime_type} is not supported. Please use 'application/json' (default)." unless mime_type == "application/json" or mime_type == "text/plain" or mime_type == "application/rdf+xml" - @metadata[:created_at] = DateTime.now unless URI.accessible? @uri - #@metadata[RDF::DC.modified] = DateTime.now case mime_type - when 'text/plain' - body = self.to_ntriples - when 'application/rdf+xml' - body = self.to_rdfxml when 'application/json' - body = self.to_json + body = @data.to_json + else + bad_request_error "Mime type #{mime_type} is not supported. Please use 'application/json' (default)." end - uri = RestClientWrapper.put @uri, body, { :content_type => mime_type} + uri = RestClientWrapper.put @data["uri"], body, { :content_type => mime_type} wait ? wait_for_task(uri) : uri end # Delete object at webservice def delete - RestClientWrapper.delete(@uri) - #Authorization.delete_policies_from_uri(@uri) if $aa[:uri] + RestClientWrapper.delete(@data["uri"]) + #Authorization.delete_policies_from_uri(@data["uri"]) if $aa[:uri] end def service_uri @@ -147,11 +145,11 @@ module OpenTox # DG: uri in object should be in brackets, otherwise query for uri-list ignores the object. # see: http://www.w3.org/TR/rdf-testcases/#sec-uri-encoding @metadata.each do |predicate,values| - [values].flatten.each{ |value| @rdf << [RDF::URI.new(@uri), predicate, (URI.valid?(value) ? RDF::URI.new(value) : value)] unless value.nil? } + [values].flatten.each{ |value| @rdf << [RDF::URI.new(@data["uri"]), predicate, (URI.valid?(value) ? RDF::URI.new(value) : value)] unless value.nil? } end @parameters.each do |parameter| p_node = RDF::Node.new - @rdf << [RDF::URI.new(@uri), RDF::OT.parameters, p_node] + @rdf << [RDF::URI.new(@data["uri"]), RDF::OT.parameters, p_node] @rdf << [p_node, RDF.type, RDF::OT.Parameter] parameter.each { |k,v| @rdf << [p_node, k, v] unless v.nil?} end @@ -167,7 +165,7 @@ module OpenTox reader.each_statement{ |statement| @rdf << statement } end # return values as plain strings instead of RDF objects - @metadata = @rdf.to_hash[RDF::URI.new(@uri)].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } + @metadata = @rdf.to_hash[RDF::URI.new(@data["uri"])].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } end =begin @@ -196,27 +194,23 @@ module OpenTox end def to_json - @metadata[:uri] = @uri - @metadata.to_json + @data.to_json end # @return [String] converts OpenTox object into html document (by first converting it to a string) def to_html - to_turtle.to_html + to_json.to_html end -=begin # short access for metadata keys title, description and type - #{ :title => RDF::DC.title, :description => RDF::DC.description, :type => RDF.type }.each do |method,predicate| - [ :title , :description, :type ].each do |method| + [ :title , :description , :type , :uri, :uuid ].each do |method| send :define_method, method do - self.[](method) + self[method] end send :define_method, "#{method}=" do |value| - self.[]=(method,value) + self[method] = value end end -=end # define class methods within module def self.included(base) @@ -257,13 +251,17 @@ module OpenTox def self.create metadata object = self.new - object.metadata = metadata + metadata.each{|k,v| object[k] = v} object.put object end def self.find_or_create metadata - uris = RestClientWrapper.get(service_uri,{:query => metadata},{:accept => "text/uri-list"}).split("\n") + search = metadata + search.delete("_id") + search.delete("uri") + search.delete("uuid") + uris = RestClientWrapper.get(service_uri,{:query => search},{:accept => "text/uri-list"}).split("\n") uris.empty? ? self.create(metadata) : self.new(uris.first) end end diff --git a/lib/task.rb b/lib/task.rb index 7f4d39a..9d03aed 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -17,7 +17,7 @@ module OpenTox def self.run(description, creator=nil, uri=nil) task = Task.new uri - task[:created_at] = DateTime.now + task[:created_at] = DateTime.now.to_s task[:hasStatus] = "Running" task[:description] = description.to_s task[:creator] = creator.to_s @@ -89,14 +89,14 @@ module OpenTox while running? sleep dur dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min - request_timeout_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) + request_timeout_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+uri.to_s+"'" if (Time.new > due_to_time) end end end def code - RestClientWrapper.get(@uri).code.to_i + RestClientWrapper.get(uri).code.to_i end # get only header for status requests @@ -118,6 +118,7 @@ module OpenTox [:hasStatus, :resultURI, :created_at, :finished_at, :percentageCompleted].each do |method| define_method method do + get self.[](method) end end @@ -125,11 +126,12 @@ module OpenTox # Check status of a task # @return [String] Status def status + get self[:hasStatus] end def error_report - #get + get self[:errorReport] end -- cgit v1.2.3 From 3f9b45990e39f8cb379a1a85ab48819cb36599a8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 16 Jul 2015 10:06:24 +0200 Subject: storage of uris instead of objects --- lib/dataset.rb | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 28133b2..c965388 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -12,10 +12,11 @@ module OpenTox @data["data_entries"] ||= [] end + def data_entries + @data["data_entries"] + end + [:features, :compounds, :data_entries].each do |method| - send :define_method, method do - @data[method.to_s] - end send :define_method, "#{method}=" do |value| @data[method.to_s] = value.collect{|v| v.uri} end @@ -31,7 +32,6 @@ module OpenTox if @data.empty? or force_update uri = File.join(@data["uri"],"metadata") #begin - RestClientWrapper.get(uri,{},{:accept => "application/json"}) @data = JSON.parse RestClientWrapper.get(uri,{},{:accept => "application/json"}) #parse_ntriples RestClientWrapper.get(uri,{},{:accept => "text/plain"}) #rescue # fall back to rdfxml @@ -47,13 +47,13 @@ module OpenTox if @data["features"].empty? or force_update uri = File.join(@data["uri"],"features") begin - uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list"}).split("\n") # ordered datasets return ordered features + uris = JSON.parse RestClientWrapper.get(uri,{},{:accept => "application/json"}) # ordered datasets return ordered features rescue uris = [] end - @data["features"] = uris.collect{|uri| Feature.new(uri)} + @data["features"] = uris#.collect{|uri| Feature.new(uri)} end - @data["features"] + @data["features"].collect{|uri| Feature.new uri} end # @return [Array] compound objects (NOT uris) @@ -61,13 +61,13 @@ module OpenTox if @data["compounds"].empty? or force_update uri = File.join(@data["uri"],"compounds") begin - uris = RestClientWrapper.get(uri,{},{:accept => "text/uri-list"}).split("\n") # ordered datasets return ordered compounds + uris = JSON.parse RestClientWrapper.get(uri,{},{:accept => "application/json"}) # ordered datasets return ordered compounds rescue uris = [] end - @data["compounds"] = uris.collect{|uri| Compound.new(uri)} + @data["compounds"] = uris end - @data["compounds"] + @data["compounds"].collect{|uri| Compound.new(uri)} end # @return [Array] with two dimensions, @@ -348,7 +348,7 @@ module OpenTox # @param dataset [OpenTox::Dataset] dataset that should be mapped to this dataset (fully loaded) # @param compound_index [Fixnum], corresponding to dataset def compound_index( dataset, compound_index ) - compound_uri = dataset.compounds[compound_index].uri + compound_uri = dataset.compounds[compound_index]#.uri self_indices = compound_indices(compound_uri) if self_indices==nil nil @@ -360,7 +360,7 @@ module OpenTox # we do assume that the order is preseverd (i.e., the nth occurences in both datasets are mapped to each other)! self_indices[dataset_indices.index(compound_index)] else - raise "cannot map compound #{compound} from dataset #{dataset.uri} to dataset #{uri}, "+ + raise "cannot map compound #{compound_uri} from dataset #{dataset.uri} to dataset #{uri}, "+ "compound occurs #{dataset_indices.size} times and #{self_indices.size} times" end end @@ -373,7 +373,7 @@ module OpenTox unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound_uri) @cmp_indices = {} compounds().size.times do |i| - c = @data["compounds"][i].uri + c = @data["compounds"][i]#.uri if @cmp_indices[c]==nil @cmp_indices[c] = [i] else -- cgit v1.2.3 From fceabfcc4e281c582ec5cc09ba84eb49e20a13f0 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 16 Jul 2015 16:54:48 +0200 Subject: feature tests for standalone version --- lib/dataset.rb | 2 + lib/opentox-client.rb | 24 +++--- lib/opentox.rb | 228 ++++++++++++++----------------------------------- opentox-client.gemspec | 8 +- 4 files changed, 82 insertions(+), 180 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index c965388..1c938da 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -213,6 +213,7 @@ module OpenTox end end +=begin RDF_FORMATS.each do |format| # redefine rdf parse methods for all formats e.g. parse_rdfxml @@ -268,6 +269,7 @@ module OpenTox end end +=end # TODO: fix bug that affects data_entry positions # DG: who wrotes this comment ? def to_ntriples # redefined string version for better performance diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index bafde4c..9f3373d 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -1,14 +1,16 @@ require 'rubygems' require "bundler/setup" -require 'rdf' -require 'rdf/raptor' -require 'rdf/turtle' +#require 'rdf' +#require 'rdf/raptor' +#require 'rdf/turtle' require "rest-client" require 'uri' require 'yaml' require 'json' require 'logger' require "securerandom" +require 'mongo' +require 'bson' default_config = File.join(ENV["HOME"],".opentox","config","default.rb") client_config = File.join(ENV["HOME"],".opentox","config","opentox-client.rb") @@ -18,16 +20,16 @@ require default_config if File.exist? default_config require client_config if File.exist? client_config # define constants and global variables -RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' -RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' -RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' -RDF::OLO = RDF::Vocabulary.new 'http://purl.org/ontology/olo/core#' -RDF::TB = RDF::Vocabulary.new "http://onto.toxbank.net/api/" -RDF::ISA = RDF::Vocabulary.new "http://onto.toxbank.net/isa/" -RDF::OWL = RDF::Vocabulary.new "http://www.w3.org/2002/07/owl#" +#RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' +#RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' +#RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' +#RDF::OLO = RDF::Vocabulary.new 'http://purl.org/ontology/olo/core#' +#RDF::TB = RDF::Vocabulary.new "http://onto.toxbank.net/api/" +#RDF::ISA = RDF::Vocabulary.new "http://onto.toxbank.net/isa/" +#RDF::OWL = RDF::Vocabulary.new "http://www.w3.org/2002/07/owl#" CLASSES = ["Compound", "Feature", "Dataset", "Validation", "Task", "Investigation"] -RDF_FORMATS = [:rdfxml,:ntriples,:turtle] +#RDF_FORMATS = [:rdfxml,:ntriples,:turtle] # Regular expressions for parsing classification data TRUE_REGEXP = /^(true|active|1|1.0|tox|activating|carcinogen|mutagenic)$/i diff --git a/lib/opentox.rb b/lib/opentox.rb index fe49ece..b2e9c1b 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -1,31 +1,31 @@ # defaults to stderr, may be changed to file output (e.g in opentox-service) $logger = OTLogger.new(STDERR) $logger.level = Logger::DEBUG +Mongo::Logger.logger = $logger +Mongo::Logger.logger.level = Logger::WARN +$mongo = Mongo::Client.new($mongodb[:uri]) module OpenTox # Ruby interface + attr_accessor :data # Create a new OpenTox object - # @param uri [optional,String] URI + # @param id [optional,String] ID # @return [OpenTox] OpenTox object - def initialize uri=nil + def initialize @data = {} - if uri - @data["uri"] = uri.to_s.chomp - get - else - @data["uuid"] = SecureRandom.uuid - @data["uri"] = File.join(service_uri, @data["uuid"]) - @data["created_at"] = DateTime.now.to_s - @data["type"] = self.class.to_s.split('::').last - end + @data["type"] = type + end + + def created_at + # TODO from BSON::ObjectId end # Object metadata (lazy loading) # @return [Hash] Object metadata - def metadata force_update=false - get if force_update and URI.accessible? @data["uri"] + def metadata + get if exists? @data end @@ -43,167 +43,55 @@ module OpenTox # @param values [Array, String] Predicate value(s) def []=(predicate,values) predicate = predicate.to_s - @data[predicate] = [values].flatten + values.is_a?(Array) ? @data[predicate] = [values].flatten : @data[predicate] = values end -=begin - # Object parameters (lazy loading) - # {http://opentox.org/dev/apis/api-1.2/interfaces OpenTox API} - # @return [Hash] Object parameters - def parameters force_update=false - if (@parameters.empty? or force_update) and URI.accessible? @uri - get #if @rdf.empty? or force_update - params = {} - query = RDF::Query.new({ - :parameter => { - RDF.type => RDF::OT.Parameter, - :property => :value, - } - }) - query.execute(@rdf).each do |solution| - params[solution.parameter] = {} unless params[solution.parameter] - params[solution.parameter][solution.property] = solution.value - end - @parameters = params.values - end - @parameters + def id + @data["_id"] end - - # Parameter value - # @param [String] title - # @return [String] value - def parameter_value title - @parameters.collect{|p| p[RDF::OT.paramValue] if p[RDF::DC.title] == title}.compact.first + + def exists? + nr_items = $mongo[collection].find(:_id => @data["_id"]).count + nr_items > 0 ? true : false end -=end # Get object from webservice # @param [String,optional] mime_type - def get mime_type="application/json" - bad_request_error "Mime type #{mime_type} is not supported. Please use 'application/json' (default), 'text/plain' (ntriples) or mime_type == 'application/rdf+xml'." unless mime_type == "application/json" or mime_type == "text/plain" or mime_type == "application/rdf+xml" - response = RestClientWrapper.get(@data["uri"],{},{:accept => mime_type}) - if URI.task?(response) - uri = wait_for_task response - response = RestClientWrapper.get(uri,{},{:accept => mime_type}) - end - case mime_type - when 'application/json' - @data = JSON.parse(response) if response - when "text/plain" - parse_ntriples response - when "application/rdf+xml" - parse_rdfxml response - end + def get + resource_not_found_error("#{@data[:type]} with ID #{@data["_id"]} not found.") unless exists? + @data = $mongo[collection].find(:_id => @data["_id"]).first end -=begin - # Post object to webservice (append to object), rarely useful and deprecated - # @deprecated - def post wait=true, mime_type="text/plain" - bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" - case mime_type - when 'text/plain' - body = self.to_ntriples - when 'application/rdf+xml' - body = self.to_rdfxml - end - #Authorization.check_policy(@uri) if $aa[:uri] - uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type} - wait ? wait_for_task(uri) : uri + def save + @data["_id"] = $mongo[collection].insert_one(@data).inserted_id end -=end # Save object at webservice (replace or create object) - def put wait=true, mime_type="application/json" - case mime_type - when 'application/json' - body = @data.to_json - else - bad_request_error "Mime type #{mime_type} is not supported. Please use 'application/json' (default)." - end - uri = RestClientWrapper.put @data["uri"], body, { :content_type => mime_type} - wait ? wait_for_task(uri) : uri + def put + #@data.delete("_id") # to enable updates + $mongo[collection].find(:_id => @data["_id"]).find_one_and_replace(@data, :upsert => true) end # Delete object at webservice def delete - RestClientWrapper.delete(@data["uri"]) - #Authorization.delete_policies_from_uri(@data["uri"]) if $aa[:uri] - end - - def service_uri - self.class.service_uri - end - - def create_rdf - #$logger.debug "#{eval("RDF::OT."+self.class.to_s.split('::').last)}\n" - @rdf = RDF::Graph.new - # DG: since model is no self.class anymore - @metadata[RDF.type] ||= (eval("RDF::OT."+self.class.to_s.split('::').last) =~ /Lazar|Generic/) ? RDF::URI.new(RDF::OT.Model) : RDF::URI.new(eval("RDF::OT."+self.class.to_s.split('::').last)) - #@metadata[RDF.type] ||= RDF::URI.new(eval("RDF::OT."+self.class.to_s.split('::').last)) - @metadata[RDF::DC.date] ||= DateTime.now - # DG: uri in object should be in brackets, otherwise query for uri-list ignores the object. - # see: http://www.w3.org/TR/rdf-testcases/#sec-uri-encoding - @metadata.each do |predicate,values| - [values].flatten.each{ |value| @rdf << [RDF::URI.new(@data["uri"]), predicate, (URI.valid?(value) ? RDF::URI.new(value) : value)] unless value.nil? } - end - @parameters.each do |parameter| - p_node = RDF::Node.new - @rdf << [RDF::URI.new(@data["uri"]), RDF::OT.parameters, p_node] - @rdf << [p_node, RDF.type, RDF::OT.Parameter] - parameter.each { |k,v| @rdf << [p_node, k, v] unless v.nil?} - end + $mongo[collection].find(:_id => @data["_id"]).find_one_and_delete end - - # as defined in opentox-client.rb - RDF_FORMATS.each do |format| - # rdf parse methods for all formats e.g. parse_rdfxml - send :define_method, "parse_#{format}".to_sym do |rdf| - @rdf = RDF::Graph.new - RDF::Reader.for(format).new(rdf) do |reader| - reader.each_statement{ |statement| @rdf << statement } - end - # return values as plain strings instead of RDF objects - @metadata = @rdf.to_hash[RDF::URI.new(@data["uri"])].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } - end - -=begin - # rdf serialization methods for all formats e.g. to_rdfxml - send :define_method, "to_#{format}".to_sym do - create_rdf - # if encoding is used iteration is necessary - # see: http://rubydoc.info/github/ruby-rdf/rdf/RDF/NTriples/Writer - RDF::Writer.for(format).buffer(:encoding => Encoding::ASCII) do |writer| - @rdf.each_statement do |statement| - writer << statement - end - end - end -=end - end - - # @return [String] converts object to turtle-string - def to_turtle # redefined to use prefixes (not supported by RDF::Writer) - prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} - ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } - create_rdf - RDF::Turtle::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| - writer << @rdf - end + # @return [String] converts OpenTox object into html document (by first converting it to a string) + def to_html + @data.to_json.to_html end - def to_json - @data.to_json + def type + self.class.to_s.split('::').last end - # @return [String] converts OpenTox object into html document (by first converting it to a string) - def to_html - to_json.to_html + def collection + type.downcase end # short access for metadata keys title, description and type - [ :title , :description , :type , :uri, :uuid ].each do |method| + [ :title , :description ].each do |method| send :define_method, method do self[method] end @@ -218,12 +106,6 @@ module OpenTox end module ClassMethods - def service_uri - service = self.to_s.split('::')[1].downcase - eval("$#{service}[:uri]") - rescue - bad_request_error "$#{service}[:uri] variable not set. Please set $#{service}[:uri] or use an explicit uri as first constructor argument " - end def subjectid RestClientWrapper.subjectid end @@ -239,30 +121,44 @@ module OpenTox include OpenTox def self.all - uris = RestClientWrapper.get(service_uri, {},{:accept => 'text/uri-list'}).split("\n").compact - uris.collect{|uri| self.new(uri)} + $mongo[collection].find.collect do |data| + f = self.new + f.data = data + f + end + end + + def self.find_id id + self.find(:_id => id) end #@example fetching a model - # OpenTox::Model.find() -> model-object - def self.find uri - URI.accessible?(uri) ? self.new(uri) : nil + # OpenTox::Model.find() -> model-object + def self.find metadata + f = self.new + items = $mongo[collection].find metadata + items.count > 0 ? f.data = items.first : f = nil + f end def self.create metadata object = self.new - metadata.each{|k,v| object[k] = v} - object.put + object.data = metadata + object.save + object.get object end def self.find_or_create metadata search = metadata search.delete("_id") - search.delete("uri") - search.delete("uuid") - uris = RestClientWrapper.get(service_uri,{:query => search},{:accept => "text/uri-list"}).split("\n") - uris.empty? ? self.create(metadata) : self.new(uris.first) + ids = $mongo[collection].find(search).distinct(:_id) + ids.empty? ? self.create(metadata) : self.find_id(ids.first) + end + + private + def self.collection + self.to_s.split('::').last.downcase end end OpenTox.const_set klass,c diff --git a/opentox-client.gemspec b/opentox-client.gemspec index 872a985..91ee0ae 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -21,11 +21,13 @@ Gem::Specification.new do |s| # specify any dependencies here; for example: s.add_runtime_dependency "bundler" s.add_runtime_dependency "rest-client" - s.add_runtime_dependency "rdf" - s.add_runtime_dependency "rdf-raptor" - s.add_runtime_dependency 'rdf-turtle' + #s.add_runtime_dependency "rdf" + #s.add_runtime_dependency "rdf-raptor" + #s.add_runtime_dependency 'rdf-turtle' s.add_runtime_dependency "open4" s.add_runtime_dependency "openbabel" + s.add_runtime_dependency "mongo" + s.add_runtime_dependency "bson" # external requirements ["libraptor-dev"].each{|r| s.requirements << r} -- cgit v1.2.3 From a8e52efbfd977c7ecfc98df10960686a05ed8afd Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 16 Jul 2015 19:07:29 +0200 Subject: task tests passed --- lib/error.rb | 2 +- lib/opentox.rb | 7 +++- lib/task.rb | 123 +++++++++++++++++---------------------------------------- 3 files changed, 44 insertions(+), 88 deletions(-) diff --git a/lib/error.rb b/lib/error.rb index 878ed28..12e22ff 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -2,7 +2,7 @@ require 'open4' # add additional fields to Exception class to format errors according to OT-API module OpenToxError - attr_accessor :http_code, :uri, :error_cause + attr_accessor :http_code, :uri, :error_cause, :metadata def initialize(message=nil, uri=nil, cause=nil) message = message.to_s.gsub(/\A"|"\Z/, '') if message # remove quotes @error_cause = cause ? OpenToxError::cut_backtrace(cause) : short_backtrace diff --git a/lib/opentox.rb b/lib/opentox.rb index b2e9c1b..9be6078 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -19,7 +19,7 @@ module OpenTox end def created_at - # TODO from BSON::ObjectId + @data["_id"].generation_time end # Object metadata (lazy loading) @@ -66,6 +66,11 @@ module OpenTox @data["_id"] = $mongo[collection].insert_one(@data).inserted_id end + # partial update + def update metadata + $mongo[collection].find(:_id => @data["_id"]).find_one_and_replace('$set' => metadata) + end + # Save object at webservice (replace or create object) def put #@data.delete("_id") # to enable updates diff --git a/lib/task.rb b/lib/task.rb index 9d03aed..f7e4c6f 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -2,83 +2,61 @@ DEFAULT_TASK_MAX_DURATION = 36000 module OpenTox # Class for handling asynchronous tasks - class Task + class Task - attr_accessor :pid, :observer_pid + def self.run(description, creator=nil) - def metadata - super true # always update metadata - end - - def self.task_uri - Task.new.uri - end - - def self.run(description, creator=nil, uri=nil) - - task = Task.new uri - task[:created_at] = DateTime.now.to_s - task[:hasStatus] = "Running" + task = Task.new task[:description] = description.to_s task[:creator] = creator.to_s - task[:percentageCompleted] = "0" - task.put + task[:percentageCompleted] = 0 + task[:code] = 202 + task.save pid = fork do begin task.completed yield rescue => e # wrap non-opentox-errors first e = OpenTox::Error.new(500,e.message,nil,e.backtrace) unless e.is_a?(OpenTox::Error) - $logger.error "error in task #{task.uri} created by #{creator}" # creator is not logged because error is logged when thrown - RestClientWrapper.put(File.join(task.uri,'Error'),{:errorReport => e.to_json},{:content_type => 'application/json'}) + $logger.error "error in task #{task.id} created by #{creator}" # creator is not logged because error is logged when thrown + task.update(:errorReport => e.metadata, :code => e.http_code, :finished_at => Time.now) + task.get task.kill end end Process.detach(pid) - task.pid = pid + task[:pid] = pid # watch if task has been cancelled observer_pid = fork do task.wait begin - Process.kill(9,task.pid) if task.cancelled? + Process.kill(9,task[:pid]) if task.cancelled? rescue - $logger.warn "Could not kill process of task #{task.uri}, pid: #{task.pid}" + $logger.warn "Could not kill process of task #{task.id}, pid: #{task[:pid]}" end end Process.detach(observer_pid) - task.observer_pid = observer_pid + task[:observer_pid] = observer_pid task end def kill - Process.kill(9,@pid) - Process.kill(9,@observer_pid) + Process.kill(9,task[:pid]) + Process.kill(9,task[:observer_pid]) rescue # no need to raise an exception if processes are not running end - def description - self.[](:description) - end - - def creator - self.[](:creator) - end - def cancel kill - self.[]=(:hasStatus, "Cancelled") - self.[]=(:finished_at, DateTime.now.to_s) - put + update(:code => 503, :finished_at => Time.now) + get end - def completed(uri) - self.[]=(:resultURI, uri) - self.[]=(:hasStatus, "Completed") - self.[]=(:finished_at, DateTime.now.to_s) - self.[]=(:percentageCompleted, "100") - put + def completed(result) + update(:code => 200, :finished_at => Time.now, :percentageCompleted => 100, :result => result) + get end # waits for a task, unless time exceeds or state is no longer running @@ -89,17 +67,12 @@ module OpenTox while running? sleep dur dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min - request_timeout_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+uri.to_s+"'" if (Time.new > due_to_time) + request_timeout_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+id.to_s+"'" if (Time.new > due_to_time) end end end - def code - RestClientWrapper.get(uri).code.to_i - end - - # get only header for status requests def running? code == 202 end @@ -116,51 +89,29 @@ module OpenTox code >= 400 and code != 503 end - [:hasStatus, :resultURI, :created_at, :finished_at, :percentageCompleted].each do |method| - define_method method do - get - self.[](method) - end - end - # Check status of a task # @return [String] Status def status - get - self[:hasStatus] - end - - def error_report - get - self[:errorReport] + case code + when 202 + "Running" + when 200 + "Completed" + when 503 + "Cancelled" + else + "Error" + end end - #TODO: subtasks (only for progress in validation) - class SubTask - - def initialize(task, min, max) - #TODO add subtask code + [:code, :description, :creator, :finished_at, :percentageCompleted, :result, :errorReport].each do |method| + define_method method do + $mongo[:task].find(:_id => self.id).distinct(method).first end + end - def self.create(task, min, max) - if task - SubTask.new(task, min, max) - else - nil - end - end - - def waiting_for(task_uri) - #TODO add subtask code - end - - def progress(pct) - #TODO add subtask code - end - - def running?() - #TODO add subtask code - end + def error_report + self.errorReport end end -- cgit v1.2.3 From 1c74a684b8b2992d7e6fce5f1a4677d397ec4dd6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 18 Jul 2015 08:52:39 +0200 Subject: dataset tests pass --- lib/compound.rb | 55 ++++---- lib/dataset.rb | 334 +++++++++++++++++++------------------------------ lib/feature.rb | 15 ++- lib/opentox-client.rb | 18 ++- lib/opentox.rb | 179 ++++---------------------- lib/overwrite.rb | 2 + lib/task.rb | 50 +++++--- opentox-client.gemspec | 9 +- 8 files changed, 254 insertions(+), 408 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 82ea94e..b588c75 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -1,17 +1,15 @@ CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/" +require 'openbabel' module OpenTox # Ruby wrapper for OpenTox Compound Webservices (http://opentox.org/dev/apis/api-1.2/structure). class Compound - def initialize uri - @data = {} - @data["uri"] = uri - end + attr_reader :inchi - def ==(c) - @data["uri"] == c.uri + def initialize inchi + @inchi = inchi end # Create a compound from smiles string @@ -20,21 +18,21 @@ module OpenTox # @param [String] smiles Smiles string # @return [OpenTox::Compound] Compound def self.from_smiles smiles - Compound.new RestClientWrapper.post(service_uri, smiles, {:content_type => 'chemical/x-daylight-smiles'}) + OpenTox::Compound.new obconversion(smiles,"smi","inchi") end # Create a compound from inchi string # @param inchi [String] smiles InChI string # @return [OpenTox::Compound] Compound def self.from_inchi inchi - Compound.new RestClientWrapper.post(service_uri, inchi, {:content_type => 'chemical/x-inchi'}) + OpenTox::Compound.new inchi end # Create a compound from sdf string # @param sdf [String] smiles SDF string # @return [OpenTox::Compound] Compound def self.from_sdf sdf - Compound.new RestClientWrapper.post(service_uri, sdf, {:content_type => 'chemical/x-mdl-sdfile'}) + OpenTox::Compound.new obconversion(sdf,"sdf","inchi") end # Create a compound from name. Relies on an external service for name lookups. @@ -43,32 +41,25 @@ module OpenTox # @param name [String] can be also an InChI/InChiKey, CAS number, etc # @return [OpenTox::Compound] Compound def self.from_name name - @inchi = RestClientWrapper.get File.join(CACTUS_URI,URI.escape(name),"stdinchi") - Compound.new RestClientWrapper.post(service_uri, @inchi, {:content_type => 'chemical/x-inchi'}) - end - - # Get InChI - # @return [String] InChI string - def inchi - @inchi ||= RestClientWrapper.get(@data["uri"],{},{:accept => 'chemical/x-inchi'}).chomp + OpenTox::Compound.new RestClientWrapper.get File.join(CACTUS_URI,URI.escape(name),"stdinchi") end # Get InChIKey # @return [String] InChI string def inchikey - @inchikey ||= RestClientWrapper.get(@data["uri"],{},{:accept => 'chemical/x-inchikey'}).chomp + obconversion(@inchi,"inchi","inchikey") end # Get (canonical) smiles # @return [String] Smiles string def smiles - @smiles ||= RestClientWrapper.get(@data["uri"],{},{:accept => 'chemical/x-daylight-smiles'}).chomp + obconversion(@inchi,"inchi","smi") # "can" gives nonn-canonical smiles?? end # Get sdf # @return [String] SDF string def sdf - RestClientWrapper.get(@data["uri"],{},{:accept => 'chemical/x-mdl-sdfile'}).chomp + obconversion(@inchi,"inchi","sdf") end # Get gif image @@ -82,14 +73,16 @@ module OpenTox # image = compound.png # @return [image/png] Image data def png - RestClientWrapper.get(File.join @data["uri"], "image") + obconversion(@inchi,"inchi","_png2") end +=begin # Get URI of compound image # @return [String] Compound image URI def image_uri File.join @data["uri"], "image" end +=end # Get all known compound names. Relies on an external service for name lookups. # @example @@ -116,5 +109,25 @@ module OpenTox uri = "http://www.ebi.ac.uk/chemblws/compounds/smiles/#{smiles}.json" @chemblid = JSON.parse(RestClientWrapper.get(uri))["compounds"].first["chemblId"] end + + private + + def self.obconversion(identifier,input_format,output_format,option=nil) + obconversion = OpenBabel::OBConversion.new + obconversion.set_options(option, OpenBabel::OBConversion::OUTOPTIONS) if option + obmol = OpenBabel::OBMol.new + obconversion.set_in_and_out_formats input_format, output_format + obconversion.read_string obmol, identifier + case output_format + when /smi|can|inchi/ + obconversion.write_string(obmol).gsub(/\s/,'').chomp + else + obconversion.write_string(obmol) + end + end + + def obconversion(identifier,input_format,output_format,option=nil) + self.class.obconversion(identifier,input_format,output_format,option=nil) + end end end diff --git a/lib/dataset.rb b/lib/dataset.rb index 1c938da..bcbacb2 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -4,95 +4,48 @@ module OpenTox # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). class Dataset - - def initialize uri=nil - super uri - @data["features"] ||= [] - @data["compounds"] ||= [] - @data["data_entries"] ||= [] + include Mongoid::Document + + field :feature_ids, type: Array + field :inchis, type: Array + field :data_entries, type: Array + field :warnings, type: Array + field :source, type: String + + def initialize + super + self.feature_ids = [] + self.inchis = [] + self.data_entries = [] + self.warnings = [] end - def data_entries - @data["data_entries"] + # Readers + + def compounds + inchis.collect{|i| OpenTox::Compound.new i} end - [:features, :compounds, :data_entries].each do |method| - send :define_method, "#{method}=" do |value| - @data[method.to_s] = value.collect{|v| v.uri} - end - send :define_method, "#{method}<<" do |value| - @data[method.to_s] << value.uri - end + def features + self.feature_ids.collect{|id| OpenTox::Feature.find(id)} end - # Get data (lazy loading from dataset service) - # overrides {OpenTox#metadata} to only load the metadata instead of the whole dataset - # @return [Hash] the metadata - def metadata force_update=false - if @data.empty? or force_update - uri = File.join(@data["uri"],"metadata") - #begin - @data = JSON.parse RestClientWrapper.get(uri,{},{:accept => "application/json"}) - #parse_ntriples RestClientWrapper.get(uri,{},{:accept => "text/plain"}) - #rescue # fall back to rdfxml - #parse_rdfxml RestClientWrapper.get(uri,{},{:accept => "application/rdf+xml"}) - #end - #@data = @rdf.to_hash[RDF::URI.new(@data["uri"])].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } - end - @data + # Writers + + def compounds=(compounds) + self.inchis = compounds.collect{|c| c.inchi} end - # @return [Array] feature objects (NOT uris) - def features force_update=false - if @data["features"].empty? or force_update - uri = File.join(@data["uri"],"features") - begin - uris = JSON.parse RestClientWrapper.get(uri,{},{:accept => "application/json"}) # ordered datasets return ordered features - rescue - uris = [] - end - @data["features"] = uris#.collect{|uri| Feature.new(uri)} - end - @data["features"].collect{|uri| Feature.new uri} + def add_compound(compound) + self.inchis << compound.id end - # @return [Array] compound objects (NOT uris) - def compounds force_update=false - if @data["compounds"].empty? or force_update - uri = File.join(@data["uri"],"compounds") - begin - uris = JSON.parse RestClientWrapper.get(uri,{},{:accept => "application/json"}) # ordered datasets return ordered compounds - rescue - uris = [] - end - @data["compounds"] = uris - end - @data["compounds"].collect{|uri| Compound.new(uri)} + def features=(features) + self.feature_ids = features.collect{|f| f.id} end - # @return [Array] with two dimensions, - # first index: compounds, second index: features, values: compound feature values - def data_entries force_update=false - if @data["data_entries"].empty? or force_update - sparql = "SELECT ?cidx ?fidx ?value FROM <#{uri}> WHERE { - ?data_entry <#{RDF::OLO.index}> ?cidx ; - <#{RDF::OT.values}> ?v . - ?v <#{RDF::OT.feature}> ?f; - <#{RDF::OT.value}> ?value . - ?f <#{RDF::OLO.index}> ?fidx. - } ORDER BY ?fidx ?cidx" - RestClientWrapper.get(service_uri,{:query => sparql},{:accept => "text/uri-list"}).split("\n").each do |row| - r,c,v = row.split("\t") - @data["data_entries"][r.to_i] ||= [] - # adjust value class depending on feature type, StringFeature takes precedence over NumericFeature - if features[c.to_i][RDF.type].include? RDF::OT.NumericFeature and ! features[c.to_i][RDF.type].include? RDF::OT.StringFeature - v = v.to_f if v - end - @data["data_entries"][r.to_i][c.to_i] = v if v - end - # TODO: fallbacks for external and unordered datasets - end - @data["data_entries"] + def add_feature(feature) + self.feature_ids << feature.id end # Find data entry values for a given compound and feature @@ -100,8 +53,8 @@ module OpenTox # @param feature [OpenTox::Feature] OpenTox Feature object # @return [Array] Data entry values def values(compound, feature) - rows = (0 ... compounds.length).select { |r| compounds[r].uri == compound.uri } - col = features.collect{|f| f.uri}.index feature.uri + rows = (0 ... inchis.length).select { |r| inchis[r].uri == compound.uri } + col = feature_ids.collect{|f| f.uri}.index feature.uri rows.collect{|row| data_entries[row][col]} end @@ -122,7 +75,7 @@ module OpenTox end # for prediction result datasets - # assumes that there are features with title prediction and confidence + # assumes that there are feature_ids with title prediction and confidence # @return [Array] of Hashes with keys { :compound, :value ,:confidence } (compound value is object not uri) def predictions predictions = [] @@ -149,18 +102,17 @@ module OpenTox end # Adding data methods - # (Alternatively, you can directly change @data["features"] and @data["compounds"]) + # (Alternatively, you can directly change @data["feature_ids"] and @data["compounds"]) # Create a dataset from file (csv,sdf,...) # @param filename [String] # @return [String] dataset uri def upload filename, wait=true - uri = RestClientWrapper.put(@data["uri"], {:file => File.new(filename)}) - wait_for_task uri if URI.task?(uri) and wait - compounds true - features true - metadata true - @data["uri"] + self.title = File.basename(filename) + self.source = filename + table = CSV.read filename, :skip_blanks => true + from_table table + save end # @param compound [OpenTox::Compound] @@ -182,6 +134,7 @@ module OpenTox end end + # TODO: remove? might be dangerous if feature ordering is incorrect # MG: I would not remove this because add_data_entry is very slow (4 times searching in arrays) # CH: do you have measurements? compound and feature arrays are not that big, I suspect that feature search/creation is the time critical step @@ -193,11 +146,11 @@ module OpenTox # d << [ Compound.new("c1ccccc1"), feature-value-a, feature-value-b ] def << row compound = row.shift # removes the compound from the array - bad_request_error "Dataset features are empty." unless @data["features"] - bad_request_error "Row size '#{row.size}' does not match features size '#{@data["features"].size}'." unless row.size == @data["features"].size + bad_request_error "Dataset features are empty." unless feature_ids + bad_request_error "Row size '#{row.size}' does not match features size '#{feature_ids.size}'." unless row.size == feature_ids.size bad_request_error "First column is not a OpenTox::Compound" unless compound.class == OpenTox::Compound - @data["compounds"] << compound.uri - @data["data_entries"] << row + self.inchis << compound.inchi + self.data_entries << row end # Serialisation @@ -213,107 +166,6 @@ module OpenTox end end -=begin - RDF_FORMATS.each do |format| - - # redefine rdf parse methods for all formats e.g. parse_rdfxml - send :define_method, "parse_#{format}".to_sym do |rdf| - # TODO: parse ordered dataset - # TODO: parse data entries - # TODO: parse metadata - @rdf = RDF::Graph.new - RDF::Reader.for(format).new(rdf) do |reader| - reader.each_statement{ |statement| @rdf << statement } - end - query = RDF::Query.new({ :uri => { RDF.type => RDF::OT.Compound } }) - @data["compounds"] = query.execute(@rdf).collect { |solution| OpenTox::Compound.new solution.uri } - query = RDF::Query.new({ :uri => { RDF.type => RDF::OT.Feature } }) - @data["features"] = query.execute(@rdf).collect { |solution| OpenTox::Feature.new solution.uri } - @data["compounds"].each_with_index do |c,i| - @data["features"].each_with_index do |f,j| - end - end - end - - - # redefine rdf serialization methods - send :define_method, "to_#{format}".to_sym do - @data[RDF.type] = [RDF::OT.Dataset, RDF::OT.OrderedDataset] - create_rdf - @data["features"].each_with_index do |feature,i| - @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Feature)] - @rdf << [RDF::URI.new(feature.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] - end - @data["compounds"].each_with_index do |compound,i| - @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Compound)] - if defined? @neighbors and neighbors.include? compound - @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.Neighbor)] - end - - @rdf << [RDF::URI.new(compound.uri), RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] - data_entry_node = RDF::Node.new - @rdf << [RDF::URI.new(@data["uri"]), RDF::URI.new(RDF::OT.dataEntry), data_entry_node] - @rdf << [data_entry_node, RDF::URI.new(RDF.type), RDF::URI.new(RDF::OT.DataEntry)] - @rdf << [data_entry_node, RDF::URI.new(RDF::OLO.index), RDF::Literal.new(i)] - @rdf << [data_entry_node, RDF::URI.new(RDF::OT.compound), RDF::URI.new(compound.uri)] - @data["data_entries"][i].each_with_index do |value,j| - value_node = RDF::Node.new - @rdf << [data_entry_node, RDF::URI.new(RDF::OT.values), value_node] - @rdf << [value_node, RDF::URI.new(RDF::OT.feature), RDF::URI.new(@data["features"][j].uri)] - @rdf << [value_node, RDF::URI.new(RDF::OT.value), RDF::Literal.new(value)] - end - end - RDF::Writer.for(format).buffer do |writer| - writer << @rdf - end - end - - end -=end - -# TODO: fix bug that affects data_entry positions # DG: who wrotes this comment ? - def to_ntriples # redefined string version for better performance - ntriples = "" - @data[RDF.type] = [ RDF::OT.Dataset, RDF::OT.OrderedDataset ] - @data.each do |predicate,values| - [values].flatten.each do |value| - URI.valid?(value) ? value = "<#{value}>" : value = "\"#{value}\"" - ntriples << "<#{@data["uri"]}> <#{predicate}> #{value} .\n" #\n" - end - end - @parameters.each_with_index do |parameter,i| - p_node = "_:parameter"+ i.to_s - ntriples << "<#{@data["uri"]}> <#{RDF::OT.parameters}> #{p_node} .\n" - ntriples << "#{p_node} <#{RDF.type}> <#{RDF::OT.Parameter}> .\n" - parameter.each { |k,v| ntriples << "#{p_node} <#{k}> \"#{v.to_s.tr('"', '\'')}\" .\n" } - end - @data["features"].each_with_index do |feature,i| - ntriples << "<#{feature.uri}> <#{RDF.type}> <#{RDF::OT.Feature}> .\n" - ntriples << "<#{feature.uri}> <#{RDF::OLO.index}> \"#{i}\"^^ .\n" # sorting at dataset service does not work without type information - end - @data["compounds"].each_with_index do |compound,i| - ntriples << "<#{compound.uri}> <#{RDF.type}> <#{RDF::OT.Compound}> .\n" - if defined? @neighbors and neighbors.include? compound - ntriples << "<#{compound.uri}> <#{RDF.type}> <#{RDF::OT.Neighbor}> .\n" - end - - ntriples << "<#{compound.uri}> <#{RDF::OLO.index}> \"#{i}\"^^ .\n" # sorting at dataset service does not work without type information - data_entry_node = "_:dataentry"+ i.to_s - ntriples << "<#{@data["uri"]}> <#{RDF::OT.dataEntry}> #{data_entry_node} .\n" - ntriples << "#{data_entry_node} <#{RDF.type}> <#{RDF::OT.DataEntry}> .\n" - ntriples << "#{data_entry_node} <#{RDF::OLO.index}> \"#{i}\"^^ .\n" # sorting at dataset service does not work without type information - ntriples << "#{data_entry_node} <#{RDF::OT.compound}> <#{compound.uri}> .\n" - @data["data_entries"][i].each_with_index do |value,j| - value_node = data_entry_node+ "_value"+ j.to_s - ntriples << "#{data_entry_node} <#{RDF::OT.values}> #{value_node} .\n" - ntriples << "#{value_node} <#{RDF::OT.feature}> <#{@data["features"][j].uri}> .\n" - ntriples << "#{value_node} <#{RDF::OT.value}> \"#{value}\" .\n" - end unless @data["data_entries"][i].nil? - end - ntriples - - end - # Methods for for validation service # create a new dataset with the specified compounds and features @@ -350,32 +202,32 @@ module OpenTox # @param dataset [OpenTox::Dataset] dataset that should be mapped to this dataset (fully loaded) # @param compound_index [Fixnum], corresponding to dataset def compound_index( dataset, compound_index ) - compound_uri = dataset.compounds[compound_index]#.uri - self_indices = compound_indices(compound_uri) + compound_inchi = dataset.compounds[compound_index].inchi + self_indices = compound_indices(compound_inchi) if self_indices==nil nil else - dataset_indices = dataset.compound_indices(compound_uri) + dataset_indices = dataset.compound_indices(compound_inchi) if self_indices.size==1 self_indices.first elsif self_indices.size==dataset_indices.size # we do assume that the order is preseverd (i.e., the nth occurences in both datasets are mapped to each other)! self_indices[dataset_indices.index(compound_index)] else - raise "cannot map compound #{compound_uri} from dataset #{dataset.uri} to dataset #{uri}, "+ + raise "cannot map compound #{compound_inchi} from dataset #{dataset.id} to dataset #{self.id}, "+ "compound occurs #{dataset_indices.size} times and #{self_indices.size} times" end end end # returns the inidices of the compound in the dataset - # @param compound_uri [String] + # @param compound_inchi [String] # @return [Array] compound index (position) of the compound in the dataset, array-size is 1 unless multiple occurences - def compound_indices( compound_uri ) - unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound_uri) + def compound_indices( compound_inchi ) + unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound_inchi) @cmp_indices = {} compounds().size.times do |i| - c = @data["compounds"][i]#.uri + c = self.compounds[i].inchi if @cmp_indices[c]==nil @cmp_indices[c] = [i] else @@ -383,7 +235,7 @@ module OpenTox end end end - @cmp_indices[compound_uri] + @cmp_indices[compound_inchi] end # returns compound feature value using the compound-index and the feature_uri @@ -392,6 +244,84 @@ module OpenTox col = @data["features"].collect{|f| f.uri}.index feature_uri @data["data_entries"][compound_index] ? @data["data_entries"][compound_index][col] : nil end - end + def from_table table + + # features + feature_names = table.shift.collect{|f| f.strip} + self.warnings << "Duplicate features in table header." unless feature_names.size == feature_names.uniq.size + compound_format = feature_names.shift.strip + bad_request_error "#{compound_format} is not a supported compound format. Accepted formats: SMILES, InChI." unless compound_format =~ /SMILES|InChI/i + ignored_feature_indices = [] + numeric = [] + feature_names.each_with_index do |f,i| + values = table.collect{|row| val=row[i+1].to_s.strip; val.blank? ? nil : val }.uniq.compact + types = values.collect{|v| v.numeric? ? true : false}.uniq + metadata = {"title" => f} + if values.size == 0 # empty feature + elsif values.size > 5 and types.size == 1 and types.first == true # 5 max classes + metadata["numeric"] = true + numeric[i] = true + else + metadata["nominal"] = true + metadata["string"] = true + metadata["accept_values"] = values + numeric[i] = false + end + feature = OpenTox::Feature.find_or_create_by metadata + self.feature_ids << feature.id unless feature.nil? + end + + # compounds and values + r = -1 + table.each_with_index do |values,j| + compound = values.shift + begin + case compound_format + when /SMILES/i + c = OpenTox::Compound.from_smiles(compound) + if c.inchi.empty? + self.warnings << "Cannot parse #{compound_format} compound '#{compound.strip}' at position #{j+2}, all entries are ignored." + next + else + inchi = c.inchi + end + when /InChI/i + # TODO validate inchi + inchi = compound + else + raise "wrong compound format" #should be checked above + end + rescue + self.warnings << "Cannot parse #{compound_format} compound '#{compound}' at position #{j+2}, all entries are ignored." + next + end + + r += 1 + self.inchis << inchi + unless values.size == self.feature_ids.size + self.warnings << "Number of values at position #{j+2} (#{values.size}) is different than header size (#{self.feature_ids.size}), all entries are ignored." + next + end + + self.data_entries << [] + values.each_with_index do |v,i| + if v.blank? + self.data_entries.last << nil + self.warnings << "Empty value for compound '#{compound}' (row #{r+2}) and feature '#{feature_names[i]}' (column #{i+2})." + next + elsif numeric[i] + self.data_entries.last << v.to_f + else + self.data_entries.last << v.strip + end + end + end + self.inchis.duplicates.each do |inchi| + positions = [] + self.inchis.each_with_index{|c,i| positions << i+1 if !c.blank? and c == inchi} + self.warnings << "Duplicate compound #{inchi} at rows #{positions.join(', ')}. Entries are accepted, assuming that measurements come from independent experiments." + end + end + end end diff --git a/lib/feature.rb b/lib/feature.rb index 5d3d962..43cf7e9 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -2,13 +2,18 @@ module OpenTox class Feature + field :string, type: Boolean, default: false + field :nominal, type: Boolean, default: false + field :numeric, type: Boolean, default: false + field :accept_values, type: Array + # Find out feature type # Classification takes precedence # @return [String] Feature type def feature_type - if self[RDF.type].include?(RDF::OT.NominalFeature) + if nominal "classification" - elsif self[RDF.type].include?(RDF::OT.NumericFeature) + elsif numeric "regression" else "unknown" @@ -18,9 +23,9 @@ module OpenTox # Get accept values # # @return[Array] Accept values - def accept_values - self[RDF::OT.acceptValue] ? self[RDF::OT.acceptValue].sort : nil - end + #def accept_values + #self[RDF::OT.acceptValue] ? self[RDF::OT.acceptValue].sort : nil + #end # Create value map # @param [OpenTox::Feature] Feature diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 9f3373d..6358705 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -9,8 +9,7 @@ require 'yaml' require 'json' require 'logger' require "securerandom" -require 'mongo' -require 'bson' +require 'mongoid' default_config = File.join(ENV["HOME"],".opentox","config","default.rb") client_config = File.join(ENV["HOME"],".opentox","config","opentox-client.rb") @@ -18,6 +17,9 @@ client_config = File.join(ENV["HOME"],".opentox","config","opentox-client.rb") puts "Could not find configuration files #{default_config} or #{client_config}" unless File.exist? default_config or File.exist? client_config require default_config if File.exist? default_config require client_config if File.exist? client_config +# TODO switch to production +ENV["MONGOID_ENV"] = "development" +Mongoid.load!("#{ENV['HOME']}/.opentox/config/mongoid.yml") # define constants and global variables #RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' @@ -28,7 +30,8 @@ require client_config if File.exist? client_config #RDF::ISA = RDF::Vocabulary.new "http://onto.toxbank.net/isa/" #RDF::OWL = RDF::Vocabulary.new "http://www.w3.org/2002/07/owl#" -CLASSES = ["Compound", "Feature", "Dataset", "Validation", "Task", "Investigation"] +#CLASSES = ["Compound", "Feature", "Dataset", "Validation", "Task", "Investigation"] +CLASSES = ["Feature", "Dataset", "Validation", "Task", "Investigation"] #RDF_FORMATS = [:rdfxml,:ntriples,:turtle] # Regular expressions for parsing classification data @@ -57,3 +60,12 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m # unauthorized_error "Failed to authenticate user \"#{$aa[:user]}\"." unless OpenTox::Authorization.is_token_valid(OpenTox::RestClientWrapper.subjectid) #end +# defaults to stderr, may be changed to file output (e.g in opentox-service) +$logger = OTLogger.new(STDERR) +$logger.level = Logger::DEBUG +#Mongo::Logger.logger = $logger +Mongo::Logger.level = Logger::WARN +#$mongo = Mongo::Client.new($mongodb[:uri]) +Mongoid.logger.level = Logger::WARN +Mongoid.logger = $logger +#Moped.logger = $logger diff --git a/lib/opentox.rb b/lib/opentox.rb index 9be6078..96cefe0 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -1,172 +1,41 @@ -# defaults to stderr, may be changed to file output (e.g in opentox-service) -$logger = OTLogger.new(STDERR) -$logger.level = Logger::DEBUG -Mongo::Logger.logger = $logger -Mongo::Logger.logger.level = Logger::WARN -$mongo = Mongo::Client.new($mongodb[:uri]) - module OpenTox # Ruby interface - attr_accessor :data - - # Create a new OpenTox object - # @param id [optional,String] ID - # @return [OpenTox] OpenTox object - def initialize - @data = {} - @data["type"] = type - end - - def created_at - @data["_id"].generation_time - end - - # Object metadata (lazy loading) - # @return [Hash] Object metadata - def metadata - get if exists? - @data - end - - # Metadata values - # @param predicate [String] Predicate URI - # @return [Array, String] Predicate value(s) - def [](predicate) - predicate = predicate.to_s - return nil if @data[predicate].nil? - @data[predicate].size == 1 ? @data[predicate].first : @data[predicate] - end - - # Set a metadata entry - # @param predicate [String] Predicate URI - # @param values [Array, String] Predicate value(s) - def []=(predicate,values) - predicate = predicate.to_s - values.is_a?(Array) ? @data[predicate] = [values].flatten : @data[predicate] = values - end - - def id - @data["_id"] - end - - def exists? - nr_items = $mongo[collection].find(:_id => @data["_id"]).count - nr_items > 0 ? true : false - end - - # Get object from webservice - # @param [String,optional] mime_type - def get - resource_not_found_error("#{@data[:type]} with ID #{@data["_id"]} not found.") unless exists? - @data = $mongo[collection].find(:_id => @data["_id"]).first - end - - def save - @data["_id"] = $mongo[collection].insert_one(@data).inserted_id - end - - # partial update - def update metadata - $mongo[collection].find(:_id => @data["_id"]).find_one_and_replace('$set' => metadata) - end - - # Save object at webservice (replace or create object) - def put - #@data.delete("_id") # to enable updates - $mongo[collection].find(:_id => @data["_id"]).find_one_and_replace(@data, :upsert => true) - end - - # Delete object at webservice - def delete - $mongo[collection].find(:_id => @data["_id"]).find_one_and_delete - end - - # @return [String] converts OpenTox object into html document (by first converting it to a string) - def to_html - @data.to_json.to_html - end - - def type - self.class.to_s.split('::').last - end - - def collection - type.downcase - end - - # short access for metadata keys title, description and type - [ :title , :description ].each do |method| - send :define_method, method do - self[method] - end - send :define_method, "#{method}=" do |value| - self[method] = value - end - end - - # define class methods within module - def self.included(base) - base.extend(ClassMethods) - end - - module ClassMethods - def subjectid - RestClientWrapper.subjectid - end - def subjectid=(subjectid) - RestClientWrapper.subjectid = subjectid - end - end - # create default OpenTox classes with class methods - # (defined in opentox-client.rb) + # create default OpenTox classes (defined in opentox-client.rb) + # provides Mongoid's query and persistence methods + # http://mongoid.org/en/mongoid/docs/persistence.html + # http://mongoid.org/en/mongoid/docs/querying.html CLASSES.each do |klass| c = Class.new do include OpenTox + include Mongoid::Document + include Mongoid::Timestamps + store_in collection: klass.downcase.pluralize - def self.all - $mongo[collection].find.collect do |data| - f = self.new - f.data = data - f - end - end + field :title, type: String + field :description, type: String - def self.find_id id - self.find(:_id => id) + # TODO check if needed + def self.subjectid + RestClientWrapper.subjectid end - - #@example fetching a model - # OpenTox::Model.find() -> model-object - def self.find metadata - f = self.new - items = $mongo[collection].find metadata - items.count > 0 ? f.data = items.first : f = nil - f + def self.subjectid=(subjectid) + RestClientWrapper.subjectid = subjectid end + end + OpenTox.const_set klass,c + end - def self.create metadata - object = self.new - object.data = metadata - object.save - object.get - object - end + def type + self.class.to_s.split('::').last + end - def self.find_or_create metadata - search = metadata - search.delete("_id") - ids = $mongo[collection].find(search).distinct(:_id) - ids.empty? ? self.create(metadata) : self.find_id(ids.first) - end + # Serialisation - private - def self.collection - self.to_s.split('::').last.downcase - end - end - OpenTox.const_set klass,c + # @return [String] converts OpenTox object into html document (by first converting it to a string) + def to_html + self.to_json.to_html end end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 692e239..4dafe8d 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -134,6 +134,7 @@ end module Kernel +=begin # overwrite backtick operator to catch system errors # Override raises an error if _cmd_ returns a non-zero exit status. CH: I do not understand this comment # Returns stdout if _cmd_ succeeds. Note that these are simply concatenated; STDERR is not inline. CH: I do not understand this comment @@ -148,6 +149,7 @@ module Kernel rescue internal_server_error $!.message end +=end # @return [String] uri of task result, if task fails, an error according to task is raised def wait_for_task uri diff --git a/lib/task.rb b/lib/task.rb index f7e4c6f..55d024d 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,17 +1,30 @@ DEFAULT_TASK_MAX_DURATION = 36000 module OpenTox + # TODO: fix error reports + # TODO: fix field names and overwrite accessors # Class for handling asynchronous tasks class Task + field :creator, type: String + field :percentageCompleted, type: Float + field :error_code, type: Integer # workaround name, cannot overwrite accessors in current mongoid version + field :finished, type: Time # workaround name, cannot overwrite accessors in current mongoid version + # TODO + field :result_object, type: String + field :report, type: String + field :pid, type: Integer + field :observer_pid, type: Integer + def self.run(description, creator=nil) task = Task.new task[:description] = description.to_s task[:creator] = creator.to_s task[:percentageCompleted] = 0 - task[:code] = 202 + task[:error_code] = 202 task.save + pid = fork do begin task.completed yield @@ -19,8 +32,7 @@ module OpenTox # wrap non-opentox-errors first e = OpenTox::Error.new(500,e.message,nil,e.backtrace) unless e.is_a?(OpenTox::Error) $logger.error "error in task #{task.id} created by #{creator}" # creator is not logged because error is logged when thrown - task.update(:errorReport => e.metadata, :code => e.http_code, :finished_at => Time.now) - task.get + task.update(:report => e.metadata, :error_code => e.http_code, :finished => Time.now) task.kill end end @@ -50,13 +62,11 @@ module OpenTox def cancel kill - update(:code => 503, :finished_at => Time.now) - get + update_attributes(:error_code => 503, :finished => Time.now) end def completed(result) - update(:code => 200, :finished_at => Time.now, :percentageCompleted => 100, :result => result) - get + update_attributes(:error_code => 200, :finished => Time.now, :percentageCompleted => 100, :result_object => result) end # waits for a task, unless time exceeds or state is no longer running @@ -73,6 +83,22 @@ module OpenTox end + def error_report + OpenTox::Task.find(id).report + end + + def code + OpenTox::Task.find(id).error_code + end + + def result + OpenTox::Task.find(id).result_object + end + + def finished_at + OpenTox::Task.find(id).finished + end + def running? code == 202 end @@ -104,14 +130,4 @@ module OpenTox end end - [:code, :description, :creator, :finished_at, :percentageCompleted, :result, :errorReport].each do |method| - define_method method do - $mongo[:task].find(:_id => self.id).distinct(method).first - end - end - - def error_report - self.errorReport - end - end diff --git a/opentox-client.gemspec b/opentox-client.gemspec index 91ee0ae..3bba11c 100644 --- a/opentox-client.gemspec +++ b/opentox-client.gemspec @@ -26,10 +26,9 @@ Gem::Specification.new do |s| #s.add_runtime_dependency 'rdf-turtle' s.add_runtime_dependency "open4" s.add_runtime_dependency "openbabel" - s.add_runtime_dependency "mongo" - s.add_runtime_dependency "bson" - + s.add_runtime_dependency "mongoid", '~> 5.0beta' + # external requirements - ["libraptor-dev"].each{|r| s.requirements << r} - s.post_install_message = "Please check the version of your libraptor library, if installation of rdf.rb fails" + #["libraptor-dev"].each{|r| s.requirements << r} + #s.post_install_message = "Please check the version of your libraptor library, if installation of rdf.rb fails" end -- cgit v1.2.3 From 52fef792922c59d102825193fff05be9c3fa88a8 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 18 Jul 2015 10:14:16 +0200 Subject: initial algorithm changes --- lib/algorithm.rb | 10 +++++++++- lib/opentox.rb | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/algorithm.rb b/lib/algorithm.rb index bd4e54a..8f05d6a 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -16,11 +16,17 @@ module OpenTox class Generic include OpenTox include Algorithm + include Mongoid::Document + include Mongoid::Timestamps + field :parameters, type: Array end class Descriptor include OpenTox include Algorithm + include Mongoid::Document + include Mongoid::Timestamps + field :parameters, type: Array [:smarts_match,:smarts_count,:physchem,:lookup].each do |descriptor| Descriptor.define_singleton_method(descriptor) do |compounds,descriptors=nil| @@ -31,7 +37,9 @@ module OpenTox bad_request_error "First argument contains objects with a different class than OpenTox::Compound or OpenTox::Dataset #{klasses.inspect}" unless klasses.size == 1 and klasses.first == Compound JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s)).run(:compound_uri => compounds.collect{|c| c.uri}, :descriptors => descriptors)) when "OpenTox::Compound" - JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s)).run(:compound_uri => compounds.uri, :descriptors => descriptors)) + p descriptor.to_s + send descriptor.to_sym, compounds + #JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s)).run(:compound_uri => compounds.uri, :descriptors => descriptors)) when "OpenTox::Dataset" task_uri = Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s)).run(:dataset_uri => compounds.uri, :descriptors => descriptors) Dataset.new(wait_for_task task_uri) diff --git a/lib/opentox.rb b/lib/opentox.rb index 96cefe0..68a841b 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -15,6 +15,7 @@ module OpenTox field :title, type: String field :description, type: String + field :parameters, type: Array # TODO check if needed def self.subjectid -- cgit v1.2.3 From 51e7a29c8aac568ff8ef04de5b15d2f6db8f66da Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 19 Jul 2015 21:26:03 +0200 Subject: lazar predictions working in principle --- lib/algorithm.rb | 77 --------------------------------------------------- lib/compound.rb | 4 +++ lib/dataset.rb | 49 +++++++++++++++----------------- lib/feature.rb | 6 ++++ lib/opentox-client.rb | 10 +++---- lib/opentox.rb | 3 +- lib/task.rb | 15 ++++++++-- 7 files changed, 52 insertions(+), 112 deletions(-) delete mode 100644 lib/algorithm.rb diff --git a/lib/algorithm.rb b/lib/algorithm.rb deleted file mode 100644 index 8f05d6a..0000000 --- a/lib/algorithm.rb +++ /dev/null @@ -1,77 +0,0 @@ -module OpenTox - - # Wrapper for OpenTox Algorithms - module Algorithm - include OpenTox - - # Execute algorithm with parameters, please consult the OpenTox API and the webservice documentation for acceptable parameters - # @param [optional,Hash] params Algorithm parameters - # @param [optional,Boolean] wait set to false if method should return a task uri instead of the algorithm result - # @return [String] URI of new resource (dataset, model, ...) - def run params=nil, wait=true - uri = RestClientWrapper.post @uri, params, { :content_type => "text/uri-list"} - wait_for_task uri if wait - end - - class Generic - include OpenTox - include Algorithm - include Mongoid::Document - include Mongoid::Timestamps - field :parameters, type: Array - end - - class Descriptor - include OpenTox - include Algorithm - include Mongoid::Document - include Mongoid::Timestamps - field :parameters, type: Array - - [:smarts_match,:smarts_count,:physchem,:lookup].each do |descriptor| - Descriptor.define_singleton_method(descriptor) do |compounds,descriptors=nil| - descriptors = [descriptors] unless descriptors.is_a? Array - case compounds.class.to_s - when "Array" - klasses = compounds.collect{|c| c.class}.uniq - bad_request_error "First argument contains objects with a different class than OpenTox::Compound or OpenTox::Dataset #{klasses.inspect}" unless klasses.size == 1 and klasses.first == Compound - JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s)).run(:compound_uri => compounds.collect{|c| c.uri}, :descriptors => descriptors)) - when "OpenTox::Compound" - p descriptor.to_s - send descriptor.to_sym, compounds - #JSON.parse(Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s)).run(:compound_uri => compounds.uri, :descriptors => descriptors)) - when "OpenTox::Dataset" - task_uri = Descriptor.new(File.join(self.service_uri, "descriptor", descriptor.to_s)).run(:dataset_uri => compounds.uri, :descriptors => descriptors) - Dataset.new(wait_for_task task_uri) - else - bad_request_error "First argument contains objects with a different class than OpenTox::Compound or OpenTox::Dataset" - end - - end - end - - # returns a hash, keys: physchem descriptors, values: their description - def self.physchem_descriptors - Hash[ RestClientWrapper.get(File.join(service_uri, "descriptor", "physchem", "list")).to_s.split("\n").collect{|l| l.split("\t")} ] - end - - # returns array of "descriptor-values", as CDK descriptors calculate serveral values, e.g., ALOGP produces ALOGP.ALogP, ALOGP.ALogp2, ALOGP.AMR - def self.physchem_descriptor_values - RestClientWrapper.get(File.join(service_uri, "descriptor", "physchem", "list_values")).to_s.split("\n") - end - - end - - class Fminer - include OpenTox - include Algorithm - def self.bbrc params - Fminer.new(File.join(service_uri, "fminer", "bbrc")).run params - end - def self.last params - Fminer.new(File.join(service_uri, "fminer", "last")).run params - end - end - - end -end diff --git a/lib/compound.rb b/lib/compound.rb index b588c75..6cc4707 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -12,6 +12,10 @@ module OpenTox @inchi = inchi end + def == compound + self.inchi == compound.inchi + end + # Create a compound from smiles string # @example # compound = OpenTox::Compound.from_smiles("c1ccccc1") diff --git a/lib/dataset.rb b/lib/dataset.rb index bcbacb2..2a777bb 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -4,21 +4,17 @@ module OpenTox # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). class Dataset - include Mongoid::Document + include Mongoid::Document - field :feature_ids, type: Array - field :inchis, type: Array - field :data_entries, type: Array - field :warnings, type: Array + field :feature_ids, type: Array, default: [] + field :inchis, type: Array, default: [] + field :data_entries, type: Array, default: [] + field :warnings, type: Array, default: [] field :source, type: String - def initialize - super - self.feature_ids = [] - self.inchis = [] - self.data_entries = [] - self.warnings = [] - end + # TODO subclass Datasets + field :dependent_variables, type: BSON::ObjectId + field :predicted_variables, type: Array # Readers @@ -53,8 +49,8 @@ module OpenTox # @param feature [OpenTox::Feature] OpenTox Feature object # @return [Array] Data entry values def values(compound, feature) - rows = (0 ... inchis.length).select { |r| inchis[r].uri == compound.uri } - col = feature_ids.collect{|f| f.uri}.index feature.uri + rows = (0 ... inchis.length).select { |r| inchis[r] == compound.inchi } + col = feature_ids.index feature.id rows.collect{|row| data_entries[row][col]} end @@ -63,9 +59,9 @@ module OpenTox # Search a dataset for a feature given its URI # @param uri [String] Feature URI # @return [OpenTox::Feature] Feature object, or nil if not present - def find_feature_uri(uri) - features.select{|f| f.uri == uri}.first - end + #def find_feature_uri(uri) + #features.select{|f| f.uri == uri}.first + #end # Search a dataset for a compound given its URI # @param uri [String] Compound URI @@ -120,17 +116,18 @@ module OpenTox # @param value [Object] (will be converted to String) # @return [Array] data_entries def add_data_entry compound, feature, value - @data["compounds"] << compound unless @data["compounds"].collect{|c| c.uri}.include?(compound.uri) - row = @data["compounds"].collect{|c| c.uri}.index(compound.uri) - @data["features"] << feature unless @data["features"].collect{|f| f.uri}.include?(feature.uri) - col = @data["features"].collect{|f| f.uri}.index(feature.uri) - if @data["data_entries"][row] and @data["data_entries"][row][col] # duplicated values - @data["compounds"] << compound - row = @data["compounds"].collect{|c| c.uri}.rindex(compound.uri) + # TODO: optimize + add_compound compound unless self.compounds.include?(compound) + row = self.compounds.index(compound) + add_feature feature unless self.features.include?(feature) + col = self.features.index(feature) + if self.data_entries[row] and self.data_entries[row][col] # duplicated values + add_compound compound + row = self.compounds.rindex(compound) end if value - @data["data_entries"][row] ||= [] - @data["data_entries"][row][col] = value + self.data_entries[row] ||= [] + self.data_entries[row][col] = value end end diff --git a/lib/feature.rb b/lib/feature.rb index 43cf7e9..b2ddce4 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -1,10 +1,16 @@ module OpenTox + # TODO subclass features class Feature field :string, type: Boolean, default: false field :nominal, type: Boolean, default: false field :numeric, type: Boolean, default: false + field :substructure, type: Boolean, default: false + field :prediction, type: Boolean + field :smarts, type: String + field :pValue, type: Float + field :effect, type: String field :accept_values, type: Array # Find out feature type diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 6358705..40f87cf 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -4,11 +4,11 @@ require "bundler/setup" #require 'rdf/raptor' #require 'rdf/turtle' require "rest-client" -require 'uri' +#require 'uri' require 'yaml' require 'json' require 'logger' -require "securerandom" +#require "securerandom" require 'mongoid' default_config = File.join(ENV["HOME"],".opentox","config","default.rb") @@ -50,8 +50,8 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m "compound.rb", "feature.rb", "dataset.rb", - "algorithm.rb", - "model.rb", + #"algorithm.rb", + #"model.rb", "validation.rb" ].each{ |f| require_relative f } @@ -61,7 +61,7 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m #end # defaults to stderr, may be changed to file output (e.g in opentox-service) -$logger = OTLogger.new(STDERR) +$logger = OTLogger.new(STDOUT) # STDERR did not work on my development machine (CH) $logger.level = Logger::DEBUG #Mongo::Logger.logger = $logger Mongo::Logger.level = Logger::WARN diff --git a/lib/opentox.rb b/lib/opentox.rb index 68a841b..554e686 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -15,7 +15,8 @@ module OpenTox field :title, type: String field :description, type: String - field :parameters, type: Array + field :parameters, type: Array, default: [] + field :creator, type: String # TODO check if needed def self.subjectid diff --git a/lib/task.rb b/lib/task.rb index 55d024d..cd2dd92 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,3 +1,5 @@ +# TODO: task seems to run twice, see fminser tests +# TODO: do we need tasks for internal use DEFAULT_TASK_MAX_DURATION = 36000 module OpenTox # TODO: fix error reports @@ -5,13 +7,16 @@ module OpenTox # Class for handling asynchronous tasks class Task + include Mongoid::Document + include Mongoid::Timestamps field :creator, type: String field :percentageCompleted, type: Float field :error_code, type: Integer # workaround name, cannot overwrite accessors in current mongoid version field :finished, type: Time # workaround name, cannot overwrite accessors in current mongoid version # TODO - field :result_object, type: String + field :result_type, type: String + field :result_id, type: BSON::ObjectId field :report, type: String field :pid, type: Integer field :observer_pid, type: Integer @@ -66,7 +71,7 @@ module OpenTox end def completed(result) - update_attributes(:error_code => 200, :finished => Time.now, :percentageCompleted => 100, :result_object => result) + update_attributes(:error_code => 200, :finished => Time.now, :percentageCompleted => 100, :result_type => result.type, :result_id => result.id) end # waits for a task, unless time exceeds or state is no longer running @@ -92,7 +97,11 @@ module OpenTox end def result - OpenTox::Task.find(id).result_object + c = OpenTox::Task.find(id).result_type.downcase.to_sym + rid = OpenTox::Task.find(id).result_id + p c, rid + p $mongo[collection].all + $mongo[collection].find(rid).first end def finished_at -- cgit v1.2.3 From e797fda1f946490d288e0ea7fd4eaf58eb18a746 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 21 Jul 2015 10:52:03 +0200 Subject: intermediary commit before switching to generalised storage model --- lib/dataset.rb | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 2a777bb..5e9da44 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -2,19 +2,28 @@ require 'csv' module OpenTox - # Ruby wrapper for OpenTox Dataset Webservices (http://opentox.org/dev/apis/api-1.2/dataset). + class MeasuredDataset < Dataset + end + + class CalculatedDataset < Dataset + field :creator, type: String + end + + class LazarPredictionDataset < CalculatedDataset + field :dependent_variables, type: BSON::ObjectId + field :predicted_variables, type: Array + end + + # provides a basic datastructure similar to R dataframes + # descriptor/feature c class Dataset include Mongoid::Document field :feature_ids, type: Array, default: [] field :inchis, type: Array, default: [] field :data_entries, type: Array, default: [] - field :warnings, type: Array, default: [] field :source, type: String - - # TODO subclass Datasets - field :dependent_variables, type: BSON::ObjectId - field :predicted_variables, type: Array + field :warnings, type: Array, default: [] # Readers @@ -33,7 +42,7 @@ module OpenTox end def add_compound(compound) - self.inchis << compound.id + self.inchis << compound.inchi end def features=(features) @@ -111,6 +120,12 @@ module OpenTox save end + def self.from_csv_file file + dataset = self.new + dataset.upload file + dataset + end + # @param compound [OpenTox::Compound] # @param feature [OpenTox::Feature] # @param value [Object] (will be converted to String) -- cgit v1.2.3 From cd1cba67830505cd2d23ec83e64c0beed42a9f28 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 22 Jul 2015 20:08:12 +0200 Subject: mongo batch import workaround --- lib/compound.rb | 86 ++++++---- lib/data_entry.rb | 36 +++++ lib/dataset.rb | 271 +++++++++++++------------------ lib/feature.rb | 86 +++++----- lib/format-conversion.rb | 406 +++++++++++++++++++++++++++++++++++++++++++++++ lib/opentox-client.rb | 44 ++--- lib/opentox.rb | 24 +-- lib/overwrite.rb | 142 +++-------------- 8 files changed, 687 insertions(+), 408 deletions(-) create mode 100644 lib/data_entry.rb create mode 100644 lib/format-conversion.rb diff --git a/lib/compound.rb b/lib/compound.rb index 6cc4707..4a8089b 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -1,16 +1,20 @@ CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/" require 'openbabel' +require "base64" module OpenTox - # Ruby wrapper for OpenTox Compound Webservices (http://opentox.org/dev/apis/api-1.2/structure). class Compound - attr_reader :inchi - - def initialize inchi - @inchi = inchi - end + field :inchi, type: String + attr_readonly :inchi + field :smiles, type: String + field :inchikey, type: String + field :names, type: Array + field :cid, type: String + field :chemblid, type: String + field :image_id, type: BSON::ObjectId + field :sdf_id, type: BSON::ObjectId def == compound self.inchi == compound.inchi @@ -22,21 +26,23 @@ module OpenTox # @param [String] smiles Smiles string # @return [OpenTox::Compound] Compound def self.from_smiles smiles - OpenTox::Compound.new obconversion(smiles,"smi","inchi") + # do not store smiles because it might be noncanonical + Compound.find_or_create_by :inchi => obconversion(smiles,"smi","inchi") end # Create a compound from inchi string # @param inchi [String] smiles InChI string # @return [OpenTox::Compound] Compound def self.from_inchi inchi - OpenTox::Compound.new inchi + Compound.find_or_create_by :inchi => inchi end # Create a compound from sdf string # @param sdf [String] smiles SDF string # @return [OpenTox::Compound] Compound def self.from_sdf sdf - OpenTox::Compound.new obconversion(sdf,"sdf","inchi") + # do not store sdf because it might be 2D + Compound.find_or_create_by :inchi => obconversion(sdf,"sdf","inchi") end # Create a compound from name. Relies on an external service for name lookups. @@ -45,31 +51,32 @@ module OpenTox # @param name [String] can be also an InChI/InChiKey, CAS number, etc # @return [OpenTox::Compound] Compound def self.from_name name - OpenTox::Compound.new RestClientWrapper.get File.join(CACTUS_URI,URI.escape(name),"stdinchi") + Compound.find_or_create_by :inchi => RestClientWrapper.get(File.join(CACTUS_URI,URI.escape(name),"stdinchi")) end # Get InChIKey # @return [String] InChI string def inchikey - obconversion(@inchi,"inchi","inchikey") + update(:inchikey => obconversion(inchi,"inchi","inchikey")) unless self["inchikey"] + self["inchikey"] end # Get (canonical) smiles # @return [String] Smiles string def smiles - obconversion(@inchi,"inchi","smi") # "can" gives nonn-canonical smiles?? + update(:smiles => obconversion(inchi,"inchi","smi")) unless self["smiles"] # should give canonical smiles, "can" seems to give incorrect results + self["smiles"] end # Get sdf # @return [String] SDF string def sdf - obconversion(@inchi,"inchi","sdf") - end - - # Get gif image - # @return [image/gif] Image data - def gif - RestClientWrapper.get File.join(CACTUS_URI,inchi,"image") + if sdf_id.nil? + sdf = obconversion(inchi,"inchi","sdf") + file = Mongo::Grid::File.new(sdf, :filename => "#{id}.sdf",:content_type => "chemical/x-mdl-sdfile") + sdf_id = $gridfs.insert_one file + end + $gridfs.find_one(_id: sdf_id).data end # Get png image @@ -77,41 +84,37 @@ module OpenTox # image = compound.png # @return [image/png] Image data def png - obconversion(@inchi,"inchi","_png2") - end + if image_id.nil? + png = obconversion(inchi,"inchi","_png2") + file = Mongo::Grid::File.new(Base64.encode64(png), :filename => "#{id}.png", :content_type => "image/png") + update(:image_id => $gridfs.insert_one(file)) + end + Base64.decode64($gridfs.find_one(_id: image_id).data) -=begin - # Get URI of compound image - # @return [String] Compound image URI - def image_uri - File.join @data["uri"], "image" end -=end # Get all known compound names. Relies on an external service for name lookups. # @example # names = compound.names # @return [String] Compound names def names - RestClientWrapper.get("#{CACTUS_URI}#{inchi}/names").split("\n") + update(:names => RestClientWrapper.get("#{CACTUS_URI}#{inchi}/names").split("\n")) unless self["names"] + self["names"] end # @return [String] PubChem Compound Identifier (CID), derieved via restcall to pubchem def cid pug_uri = "http://pubchem.ncbi.nlm.nih.gov/rest/pug/" - @cid ||= RestClientWrapper.post(File.join(pug_uri, "compound", "inchi", "cids", "TXT"),{:inchi => inchi}).strip - end - - # @todo - def chebi - internal_server_error "not yet implemented" + update(:cid => RestClientWrapper.post(File.join(pug_uri, "compound", "inchi", "cids", "TXT"),{:inchi => inchi}).strip) unless self["cid"] + self["cid"] end # @return [String] ChEMBL database compound id, derieved via restcall to chembl def chemblid # https://www.ebi.ac.uk/chembldb/ws#individualCompoundByInChiKey uri = "http://www.ebi.ac.uk/chemblws/compounds/smiles/#{smiles}.json" - @chemblid = JSON.parse(RestClientWrapper.get(uri))["compounds"].first["chemblId"] + update(:chemblid => JSON.parse(RestClientWrapper.get(uri))["compounds"].first["chemblId"]) unless self["chemblid"] + self["chemblid"] end private @@ -125,6 +128,19 @@ module OpenTox case output_format when /smi|can|inchi/ obconversion.write_string(obmol).gsub(/\s/,'').chomp + when /sdf/ + OpenBabel::OBOp.find_type("Gen3D").do(obmol) + sdf = obconversion.write_string(obmol) + if sdf.match(/.nan/) + $logger.warn "3D generation failed for compound #{compound.inchi}, trying to calculate 2D structure" + OpenBabel::OBOp.find_type("Gen2D").do(obmol) + sdf = obconversion.write_string(obmol) + if sdf.match(/.nan/) + $logger.warn "2D generation failed for compound #{compound.inchi}" + sdf = nil + end + end + sdf else obconversion.write_string(obmol) end diff --git a/lib/data_entry.rb b/lib/data_entry.rb new file mode 100644 index 0000000..9f6e786 --- /dev/null +++ b/lib/data_entry.rb @@ -0,0 +1,36 @@ +module OpenTox + + class DataEntry + #field :feature_id, type: BSON::ObjectId + #field :compound_id, type: BSON::ObjectId + # Kludge because csv import removes type information + field :feature_id, type: String + field :compound_id, type: String + field :value + field :warnings, type: String + field :unit, type: String + store_in collection: "data_entries" + + # preferred method for the insertion of data entries + # @example DataEntry.find_or_create compound,feature,value + # @param compound [OpenTox::Compound] + # @param feature [OpenTox::Feature] + # @param value + def self.find_or_create compound, feature, value + self.find_or_create_by( + :compound_id => compound.id, + :feature_id => feature.id, + :value => value + ) + end + + # preferred method for accessing values + # @example DataEntry[compound,feature] + # @param compound [OpenTox::Compound] + # @param feature [OpenTox::Feature] + # @return value + def self.[](compound,feature) + self.where(:compound_id => compound.id.to_s, :feature_id => feature.id.to_s).distinct(:value).first + end + end +end diff --git a/lib/dataset.rb b/lib/dataset.rb index 5e9da44..503e409 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -1,34 +1,20 @@ require 'csv' +require 'tempfile' module OpenTox - class MeasuredDataset < Dataset - end - - class CalculatedDataset < Dataset - field :creator, type: String - end - - class LazarPredictionDataset < CalculatedDataset - field :dependent_variables, type: BSON::ObjectId - field :predicted_variables, type: Array - end - - # provides a basic datastructure similar to R dataframes - # descriptor/feature c class Dataset include Mongoid::Document field :feature_ids, type: Array, default: [] - field :inchis, type: Array, default: [] - field :data_entries, type: Array, default: [] + field :compound_ids, type: Array, default: [] field :source, type: String field :warnings, type: Array, default: [] # Readers def compounds - inchis.collect{|i| OpenTox::Compound.new i} + self.compound_ids.collect{|id| OpenTox::Compound.find id} end def features @@ -38,132 +24,34 @@ module OpenTox # Writers def compounds=(compounds) - self.inchis = compounds.collect{|c| c.inchi} + self.compound_ids = compounds.collect{|c| c.id} end - def add_compound(compound) - self.inchis << compound.inchi + def add_compound compound + self.compound_ids << compound.id end def features=(features) self.feature_ids = features.collect{|f| f.id} end - def add_feature(feature) + def add_feature feature self.feature_ids << feature.id end - # Find data entry values for a given compound and feature - # @param compound [OpenTox::Compound] OpenTox Compound object - # @param feature [OpenTox::Feature] OpenTox Feature object - # @return [Array] Data entry values - def values(compound, feature) - rows = (0 ... inchis.length).select { |r| inchis[r] == compound.inchi } - col = feature_ids.index feature.id - rows.collect{|row| data_entries[row][col]} - end - - # Convenience methods to search by compound/feature URIs - - # Search a dataset for a feature given its URI - # @param uri [String] Feature URI - # @return [OpenTox::Feature] Feature object, or nil if not present - #def find_feature_uri(uri) - #features.select{|f| f.uri == uri}.first - #end - - # Search a dataset for a compound given its URI - # @param uri [String] Compound URI - # @return [OpenTox::Compound] Compound object, or nil if not present - def find_compound_uri(uri) - compounds.select{|f| f.uri == uri}.first + def self.create compounds, features, warnings=[], source=nil + dataset = Dataset.new(:warnings => warnings) + dataset.compounds = compounds + dataset.features = features + dataset end # for prediction result datasets # assumes that there are feature_ids with title prediction and confidence # @return [Array] of Hashes with keys { :compound, :value ,:confidence } (compound value is object not uri) - def predictions - predictions = [] - prediction_feature = nil - confidence_feature = nil - metadata[RDF::OT.predictedVariables].each do |uri| - feature = OpenTox::Feature.new uri - case feature.title - when /prediction$/ - prediction_feature = feature - when /confidence$/ - confidence_feature = feature - end - end - if prediction_feature and confidence_feature - compounds.each do |compound| - value = values(compound,prediction_feature).first - value = value.to_f if prediction_feature[RDF.type].include? RDF::OT.NumericFeature and ! prediction_feature[RDF.type].include? RDF::OT.StringFeature - confidence = values(compound,confidence_feature).first.to_f - predictions << {:compound => compound, :value => value, :confidence => confidence} if value and confidence - end - end - predictions - end - - # Adding data methods - # (Alternatively, you can directly change @data["feature_ids"] and @data["compounds"]) - - # Create a dataset from file (csv,sdf,...) - # @param filename [String] - # @return [String] dataset uri - def upload filename, wait=true - self.title = File.basename(filename) - self.source = filename - table = CSV.read filename, :skip_blanks => true - from_table table - save - end - - def self.from_csv_file file - dataset = self.new - dataset.upload file - dataset - end - - # @param compound [OpenTox::Compound] - # @param feature [OpenTox::Feature] - # @param value [Object] (will be converted to String) - # @return [Array] data_entries - def add_data_entry compound, feature, value - # TODO: optimize - add_compound compound unless self.compounds.include?(compound) - row = self.compounds.index(compound) - add_feature feature unless self.features.include?(feature) - col = self.features.index(feature) - if self.data_entries[row] and self.data_entries[row][col] # duplicated values - add_compound compound - row = self.compounds.rindex(compound) - end - if value - self.data_entries[row] ||= [] - self.data_entries[row][col] = value - end - end - - - # TODO: remove? might be dangerous if feature ordering is incorrect - # MG: I would not remove this because add_data_entry is very slow (4 times searching in arrays) - # CH: do you have measurements? compound and feature arrays are not that big, I suspect that feature search/creation is the time critical step - # @param row [Array] - # @example - # d = Dataset.new - # d.features << Feature.new(a) - # d.features << Feature.new(b) - # d << [ Compound.new("c1ccccc1"), feature-value-a, feature-value-b ] - def << row - compound = row.shift # removes the compound from the array - bad_request_error "Dataset features are empty." unless feature_ids - bad_request_error "Row size '#{row.size}' does not match features size '#{feature_ids.size}'." unless row.size == feature_ids.size - bad_request_error "First column is not a OpenTox::Compound" unless compound.class == OpenTox::Compound - self.inchis << compound.inchi - self.data_entries << row - end + # TODO + #def predictions + #end # Serialisation @@ -185,6 +73,7 @@ module OpenTox # @param feats [Array] features objects # @param metadata [Hash] # @return [OpenTox::Dataset] + # TODO def split( compound_indices, feats, metadata) bad_request_error "Dataset.split : Please give compounds as indices" if compound_indices.size==0 or !compound_indices[0].is_a?(Fixnum) @@ -213,6 +102,7 @@ module OpenTox # ** number of occurences is not equal in both datasets? cannot map, raise error # @param dataset [OpenTox::Dataset] dataset that should be mapped to this dataset (fully loaded) # @param compound_index [Fixnum], corresponding to dataset + # TODO def compound_index( dataset, compound_index ) compound_inchi = dataset.compounds[compound_index].inchi self_indices = compound_indices(compound_inchi) @@ -235,6 +125,7 @@ module OpenTox # returns the inidices of the compound in the dataset # @param compound_inchi [String] # @return [Array] compound index (position) of the compound in the dataset, array-size is 1 unless multiple occurences + # TODO def compound_indices( compound_inchi ) unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound_inchi) @cmp_indices = {} @@ -250,90 +141,142 @@ module OpenTox @cmp_indices[compound_inchi] end - # returns compound feature value using the compound-index and the feature_uri - def data_entry_value(compound_index, feature_uri) - data_entries(true) if @data["data_entries"].empty? - col = @data["features"].collect{|f| f.uri}.index feature_uri - @data["data_entries"][compound_index] ? @data["data_entries"][compound_index][col] : nil + # Adding data methods + # (Alternatively, you can directly change @data["feature_ids"] and @data["compounds"]) + + # Create a dataset from file (csv,sdf,...) + # @param filename [String] + # @return [String] dataset uri + # TODO + #def self.from_sdf_file + #end + + def self.from_csv_file file, source=nil, bioassay=true + source ||= file + table = CSV.read file, :skip_blanks => true + from_table table, source, bioassay end - def from_table table + # parse data in tabular format (e.g. from csv) + # does a lot of guesswork in order to determine feature types + def self.from_table table, source, bioassay=true + + time = Time.now # features feature_names = table.shift.collect{|f| f.strip} - self.warnings << "Duplicate features in table header." unless feature_names.size == feature_names.uniq.size + dataset = Dataset.new(:source => source) + dataset.warnings << "Duplicate features in table header." unless feature_names.size == feature_names.uniq.size compound_format = feature_names.shift.strip bad_request_error "#{compound_format} is not a supported compound format. Accepted formats: SMILES, InChI." unless compound_format =~ /SMILES|InChI/i - ignored_feature_indices = [] + numeric = [] + # guess feature types feature_names.each_with_index do |f,i| values = table.collect{|row| val=row[i+1].to_s.strip; val.blank? ? nil : val }.uniq.compact types = values.collect{|v| v.numeric? ? true : false}.uniq - metadata = {"title" => f} + metadata = {"name" => f, "source" => source} if values.size == 0 # empty feature elsif values.size > 5 and types.size == 1 and types.first == true # 5 max classes metadata["numeric"] = true numeric[i] = true else metadata["nominal"] = true - metadata["string"] = true metadata["accept_values"] = values numeric[i] = false end - feature = OpenTox::Feature.find_or_create_by metadata - self.feature_ids << feature.id unless feature.nil? + if bioassay + if metadata["numeric"] + feature = NumericBioAssay.find_or_create_by(metadata) + elsif metadata["nominal"] + feature = NominalBioAssay.find_or_create_by(metadata) + end + else + metadata.merge({:measured => false, :calculated => true}) + if metadata["numeric"] + feature = NumericFeature.find_or_create_by(metadata) + elsif metadata["nominal"] + feature = NominalFeature.find_or_create_by(metadata) + end + end + dataset.feature_ids << OpenTox::Feature.find_or_create_by(metadata).id end + feature_ids = dataset.features.collect{|f| f.id.to_s} + + $logger.debug "Feature values: #{Time.now-time}" + time = Time.now # compounds and values r = -1 - table.each_with_index do |values,j| - compound = values.shift + csv = ["compound_id,feature_id,value"] + + compound_time = 0 + value_time = 0 + + table.each_with_index do |vals,j| + ct = Time.now + identifier = vals.shift begin case compound_format when /SMILES/i - c = OpenTox::Compound.from_smiles(compound) - if c.inchi.empty? - self.warnings << "Cannot parse #{compound_format} compound '#{compound.strip}' at position #{j+2}, all entries are ignored." + compound = OpenTox::Compound.from_smiles(identifier) + if compound.inchi.empty? + dataset.warnings << "Cannot parse #{compound_format} compound '#{compound.strip}' at position #{j+2}, all entries are ignored." next - else - inchi = c.inchi end when /InChI/i - # TODO validate inchi - inchi = compound - else - raise "wrong compound format" #should be checked above + compound = OpenTox::Compound.from_inchi(identifier) end rescue - self.warnings << "Cannot parse #{compound_format} compound '#{compound}' at position #{j+2}, all entries are ignored." + dataset.warnings << "Cannot parse #{compound_format} compound '#{compound}' at position #{j+2}, all entries are ignored." next end - + compound_time += Time.now-ct + dataset.compound_ids << compound.id + r += 1 - self.inchis << inchi - unless values.size == self.feature_ids.size - self.warnings << "Number of values at position #{j+2} (#{values.size}) is different than header size (#{self.feature_ids.size}), all entries are ignored." + unless vals.size == feature_ids.size # way cheaper than accessing dataset.features + dataset.warnings << "Number of values at position #{j+2} is different than header size (#{vals.size} vs. #{features.size}), all entries are ignored." next end - self.data_entries << [] - values.each_with_index do |v,i| + cid = compound.id.to_s + vals.each_with_index do |v,i| if v.blank? - self.data_entries.last << nil - self.warnings << "Empty value for compound '#{compound}' (row #{r+2}) and feature '#{feature_names[i]}' (column #{i+2})." + dataset.warnings << "Empty value for compound '#{identifier}' (row #{r+2}) and feature '#{feature_names[i]}' (column #{i+2})." next elsif numeric[i] - self.data_entries.last << v.to_f + csv << "#{cid},#{feature_ids[i]},#{v.to_f}" # retrieving ids from dataset.{compounds|features} kills performance else - self.data_entries.last << v.strip + csv << "#{cid},#{feature_ids[i]},#{v.strip}" # retrieving ids from dataset.{compounds|features} kills performance end end end - self.inchis.duplicates.each do |inchi| + dataset.compounds.duplicates.each do |duplicates| + # TODO fix and check positions = [] - self.inchis.each_with_index{|c,i| positions << i+1 if !c.blank? and c == inchi} - self.warnings << "Duplicate compound #{inchi} at rows #{positions.join(', ')}. Entries are accepted, assuming that measurements come from independent experiments." + compounds.each_with_index{|c,i| positions << i+1 if !c.blank? and c == compound} + dataset.warnings << "Duplicate compound #{compound.inchi} at rows #{positions.join(', ')}. Entries are accepted, assuming that measurements come from independent experiments." end + + $logger.debug "Value parsing: #{Time.now-time} (Compound creation: #{compound_time})" + time = Time.now + + # Workaround for mongo bulk insertions (insertion of single data_entries is far too slow) + # Skip ruby JSON serialisation: + # - to_json is too slow to write to file + # - json (or bson) serialisation is probably causing very long parse times of Mongo::BulkWrite, or any other ruby insert operation + f = Tempfile.new("#{dataset.id.to_s}.csv","/tmp") + f.puts csv.join("\n") + f.close + $logger.debug "Write file: #{Time.now-time}" + time = Time.now + # TODO DB name from config + `mongoimport --db opentox --collection data_entries --type csv --headerline --file #{f.path}` + $logger.debug "Bulk insert: #{Time.now-time}" + time = Time.now + + dataset end end end diff --git a/lib/feature.rb b/lib/feature.rb index b2ddce4..b2f9a93 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -1,48 +1,62 @@ module OpenTox - # TODO subclass features class Feature + field :name, as: :title, type: String + field :nominal, type: Boolean + field :numeric, type: Boolean + field :measured, type: Boolean + field :calculated, type: Boolean + field :supervised, type: Boolean + field :source, as: :title, type: String + end - field :string, type: Boolean, default: false - field :nominal, type: Boolean, default: false - field :numeric, type: Boolean, default: false - field :substructure, type: Boolean, default: false - field :prediction, type: Boolean - field :smarts, type: String - field :pValue, type: Float - field :effect, type: String + class NominalFeature < Feature field :accept_values, type: Array - - # Find out feature type - # Classification takes precedence - # @return [String] Feature type - def feature_type - if nominal - "classification" - elsif numeric - "regression" - else - "unknown" - end + def initialize params + super params + nominal = true end + end - # Get accept values - # - # @return[Array] Accept values - #def accept_values - #self[RDF::OT.acceptValue] ? self[RDF::OT.acceptValue].sort : nil - #end - - # Create value map - # @param [OpenTox::Feature] Feature - # @return [Hash] A hash with keys 1...feature.training_classes.size and values training classes - def value_map - unless defined? @value_map - accept_values ? @value_map = accept_values.each_index.inject({}) { |h,idx| h[idx+1]=accept_values[idx]; h } : @value_map = nil - end - @value_map + class NumericFeature < Feature + def initialize params + super params + numeric = true end + end + + class Smarts < NominalFeature + field :name, as: :smarts, type: String # causes warnings + field :algorithm, type: String, default: "OpenTox::Algorithm::Descriptors.smarts_match" + field :parameters, type: Hash, default: {:count => false} + def initialize params + super params + nominal = true + end + end + + class FminerSmarts < Smarts + field :training_algorithm, type: String + field :training_compound_ids, type: Array + field :training_feature_id, type: BSON::ObjectId + field :training_parameters, type: Hash + def initialize params + super params + supervised = true + end + end + + class NominalBioAssay < NominalFeature + field :description, type: String + end + + class NumericBioAssay < NumericFeature + field :description, type: String + end + class PhysChemDescriptor < NumericFeature + field :algorithm, type: String + field :parameters, type: Hash end end diff --git a/lib/format-conversion.rb b/lib/format-conversion.rb new file mode 100644 index 0000000..7563b94 --- /dev/null +++ b/lib/format-conversion.rb @@ -0,0 +1,406 @@ +# defaults to stderr, may be changed to file output (e.g in opentox-service) +$logger = OTLogger.new(STDERR) +$logger.level = Logger::DEBUG + +module OpenTox + + # Ruby interface + + attr_accessor :data + + # Create a new OpenTox object + # @param uri [optional,String] URI + # @return [OpenTox] OpenTox object + def initialize uri=nil + @data = {} + if uri + @data[:uri] = uri.to_s.chomp + get + else + @data[:uuid] = SecureRandom.uuid + @data[:uri] = File.join(service_uri, @data[:uuid]) + end + end + + # Object metadata (lazy loading) + # @return [Hash] Object metadata + def metadata force_update=false + get #if (@metadata.nil? or @metadata.empty? or force_update) and URI.accessible? @uri + @data + end + + # Metadata values + # @param predicate [String] Predicate URI + # @return [Array, String] Predicate value(s) + def [](predicate) + predicate = predicate.to_s + return nil if metadata[predicate].nil? + metadata[predicate].size == 1 ? metadata[predicate].first : metadata[predicate] + end + + # Set a metadata entry + # @param predicate [String] Predicate URI + # @param values [Array, String] Predicate value(s) + def []=(predicate,values) + predicate = predicate.to_s + @data[predicate] = [values].flatten + end + +=begin + # Object parameters (lazy loading) + # {http://opentox.org/dev/apis/api-1.2/interfaces OpenTox API} + # @return [Hash] Object parameters + def parameters force_update=false + if (@parameters.empty? or force_update) and URI.accessible? @uri + get #if @rdf.empty? or force_update + params = {} + query = RDF::Query.new({ + :parameter => { + RDF.type => RDF::OT.Parameter, + :property => :value, + } + }) + query.execute(@rdf).each do |solution| + params[solution.parameter] = {} unless params[solution.parameter] + params[solution.parameter][solution.property] = solution.value + end + @parameters = params.values + end + @parameters + end + + # Parameter value + # @param [String] title + # @return [String] value + def parameter_value title + @parameters.collect{|p| p[RDF::OT.paramValue] if p[RDF::DC.title] == title}.compact.first + end +=end + + # Get object from webservice + # @param [String,optional] mime_type + def get mime_type="application/json" + bad_request_error "Mime type #{mime_type} is not supported. Please use 'application/json' (default), 'text/plain' (ntriples) or mime_type == 'application/rdf+xml'." unless mime_type == "application/json" or mime_type == "text/plain" or mime_type == "application/rdf+xml" + p @data[:uri] + response = RestClientWrapper.get(@data[:uri],{},{:accept => mime_type}) + if URI.task?(response) + uri = wait_for_task response + response = RestClientWrapper.get(uri,{},{:accept => mime_type}) + p uri + end + case mime_type + when 'application/json' + p response + @data = JSON.parse(response) if response + when "text/plain" + parse_ntriples response + when "application/rdf+xml" + parse_rdfxml response + end + end + +=begin + # Post object to webservice (append to object), rarely useful and deprecated + # @deprecated + def post wait=true, mime_type="text/plain" + bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" + case mime_type + when 'text/plain' + body = self.to_ntriples + when 'application/rdf+xml' + body = self.to_rdfxml + end + #Authorization.check_policy(@uri) if $aa[:uri] + uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type} + wait ? wait_for_task(uri) : uri + end +=end + + # Save object at webservice (replace or create object) + def put wait=true, mime_type="application/json" + bad_request_error "Mime type #{mime_type} is not supported. Please use 'application/json' (default)." unless mime_type == "application/json" or mime_type == "text/plain" or mime_type == "application/rdf+xml" + @data[:created_at] = DateTime.now unless URI.accessible? @data[:uri] + #@metadata[RDF::DC.modified] = DateTime.now + @data[:uri] ? @data[:uri] = uri.to_s.chomp : @data[:uri] = File.join(service_uri, SecureRandom.uuid) + case mime_type + when 'text/plain' + body = self.to_ntriples + when 'application/rdf+xml' + body = self.to_rdfxml + when 'application/json' + body = self.to_json + end + uri = RestClientWrapper.put @data[:uri], body, { :content_type => mime_type} + wait ? wait_for_task(uri) : uri + end + + # Delete object at webservice + def delete + RestClientWrapper.delete(@data[:uri]) + #Authorization.delete_policies_from_uri(@data[:uri]) if $aa[:uri] + end + + def service_uri + self.class.service_uri + end + + def create_rdf + #$logger.debug "#{eval("RDF::OT."+self.class.to_s.split('::').last)}\n" + @rdf = RDF::Graph.new + # DG: since model is no self.class anymore + @metadata[RDF.type] ||= (eval("RDF::OT."+self.class.to_s.split('::').last) =~ /Lazar|Generic/) ? RDF::URI.new(RDF::OT.Model) : RDF::URI.new(eval("RDF::OT."+self.class.to_s.split('::').last)) + #@metadata[RDF.type] ||= RDF::URI.new(eval("RDF::OT."+self.class.to_s.split('::').last)) + @metadata[RDF::DC.date] ||= DateTime.now + # DG: uri in object should be in brackets, otherwise query for uri-list ignores the object. + # see: http://www.w3.org/TR/rdf-testcases/#sec-uri-encoding + @metadata.each do |predicate,values| + [values].flatten.each{ |value| @rdf << [RDF::URI.new(@data[:uri]), predicate, (URI.valid?(value) ? RDF::URI.new(value) : value)] unless value.nil? } + end + @parameters.each do |parameter| + p_node = RDF::Node.new + @rdf << [RDF::URI.new(@data[:uri]), RDF::OT.parameters, p_node] + @rdf << [p_node, RDF.type, RDF::OT.Parameter] + parameter.each { |k,v| @rdf << [p_node, k, v] unless v.nil?} + end + end + + # as defined in opentox-client.rb + RDF_FORMATS.each do |format| + + # rdf parse methods for all formats e.g. parse_rdfxml + send :define_method, "parse_#{format}".to_sym do |rdf| + @rdf = RDF::Graph.new + RDF::Reader.for(format).new(rdf) do |reader| + reader.each_statement{ |statement| @rdf << statement } + end + # return values as plain strings instead of RDF objects + @metadata = @rdf.to_hash[RDF::URI.new(@data[:uri])].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } + end + +=begin + # rdf serialization methods for all formats e.g. to_rdfxml + send :define_method, "to_#{format}".to_sym do + create_rdf + # if encoding is used iteration is necessary + # see: http://rubydoc.info/github/ruby-rdf/rdf/RDF/NTriples/Writer + RDF::Writer.for(format).buffer(:encoding => Encoding::ASCII) do |writer| + @rdf.each_statement do |statement| + writer << statement + end + end + end +=end + end + + # @return [String] converts object to turtle-string + def to_turtle # redefined to use prefixes (not supported by RDF::Writer) + prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} + ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } + create_rdf + RDF::Turtle::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| + writer << @rdf + end + end + + def to_json + @data.to_json + end + + # @return [String] converts OpenTox object into html document (by first converting it to a string) + def to_html + to_turtle.to_html + end + + # short access for metadata keys title, description and type + [ :title , :description , :type , :uri, :uuid ].each do |method| + send :define_method, method do + self.data[method] + end + send :define_method, "#{method}=" do |value| + self.data[method] = value + end + end + + # define class methods within module + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + def service_uri + service = self.to_s.split('::')[1].downcase + eval("$#{service}[:uri]") + rescue + bad_request_error "$#{service}[:uri] variable not set. Please set $#{service}[:uri] or use an explicit uri as first constructor argument " + end + def subjectid + RestClientWrapper.subjectid + end + def subjectid=(subjectid) + RestClientWrapper.subjectid = subjectid + end + end + + # create default OpenTox classes with class methods + # (defined in opentox-client.rb) + CLASSES.each do |klass| + c = Class.new do + include OpenTox + + def self.all + uris = RestClientWrapper.get(service_uri, {},{:accept => 'text/uri-list'}).split("\n").compact + uris.collect{|uri| self.new(uri)} + end + + #@example fetching a model + # OpenTox::Model.find() -> model-object + def self.find uri + URI.accessible?(uri) ? self.new(uri) : nil + end + + def self.create metadata + object = self.new + object.data = metadata + object.put + object + end + + def self.find_or_create metadata + uris = RestClientWrapper.get(service_uri,{:query => @data},{:accept => "text/uri-list"}).split("\n") + uris.empty? ? self.create(@data) : self.new(uris.first) + end + end + OpenTox.const_set klass,c + end + +end + +# from overwrite.rb +class String + + # encloses URI in text with with link tag + # @return [String] new text with marked links + def link_urls + self.gsub(/(?i)http(s?):\/\/[^\r\n\s']*/, '\0') + end + + # produces a html page for making web services browser friendly + # format of text (=string params) is preserved (e.g. line breaks) + # urls are marked as links + # + # @param related_links [optional,String] uri on related resources + # @param description [optional,String] general info + # @param png_image [optional,String] imagename + # @return [String] html page + def to_html(related_links=nil, description=nil, png_image=nil ) + + # TODO add title as parameter + title = nil #$sinatra.to($sinatra.request.env['PATH_INFO'], :full) if $sinatra + html = "" + html << ""+title+"" if title + #html += "<\/img>" + + html << "

Description

"+description.link_urls+"

" if description + html << "

Related links

"+related_links.link_urls+"

" if related_links + html << "

Content

" if description || related_links + html << "

" + html << "\n" if png_image + html << self.link_urls + html << "

" + html + end + + def uri? + URI.valid?(self) + end +end + +module Kernel + +=begin + # overwrite backtick operator to catch system errors + # Override raises an error if _cmd_ returns a non-zero exit status. CH: I do not understand this comment + # Returns stdout if _cmd_ succeeds. Note that these are simply concatenated; STDERR is not inline. CH: I do not understand this comment + def ` cmd + stdout, stderr = '' + status = Open4::popen4(cmd) do |pid, stdin_stream, stdout_stream, stderr_stream| + stdout = stdout_stream.read + stderr = stderr_stream.read + end + internal_server_error "`" + cmd + "` failed.\n" + stdout + stderr unless status.success? + return stdout + rescue + internal_server_error $!.message + end +=end + + # @return [String] uri of task result, if task fails, an error according to task is raised + def wait_for_task uri + if URI.task?(uri) + t = OpenTox::Task.new uri + t.wait + unless t.completed? + error = OpenTox::RestClientWrapper.known_errors.select{|error| error[:code] == t.code}.first + error_method = error ? error[:method] : :internal_server_error + report = t.error_report + error_message = report ? report[:message] : $!.message + error_cause = report ? report[:errorCause] : nil + Object.send(error_method,error_message,t.uri,error_cause) + end + uri = t.resultURI + end + uri + end + + +end +module URI + + def self.compound? uri + uri =~ /compound/ and URI.valid? uri + end + + def self.task? uri + uri =~ /task/ and URI.valid? uri + end + + def self.dataset? uri + uri =~ /dataset/ and URI.accessible? uri + end + + def self.model? uri + uri =~ /model/ and URI.accessible? uri + end + + def self.ssl? uri + URI.parse(uri).instance_of? URI::HTTPS + end + + # @return [Boolean] checks if resource exists by making a HEAD-request + def self.accessible?(uri) + parsed_uri = URI.parse(uri + (OpenTox::RestClientWrapper.subjectid ? "?subjectid=#{CGI.escape OpenTox::RestClientWrapper.subjectid}" : "")) + http_code = URI.task?(uri) ? 600 : 400 + http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) + unless (URI.ssl? uri) == true + http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) + request = Net::HTTP::Head.new(parsed_uri.request_uri) + http.request(request).code.to_i < http_code + else + http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) + http.use_ssl = true + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + request = Net::HTTP::Head.new(parsed_uri.request_uri) + http.request(request).code.to_i < http_code + end + rescue + false + end + + def self.valid? uri + u = URI.parse(uri) + u.scheme!=nil and u.host!=nil + rescue URI::InvalidURIError + false + end + +end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 40f87cf..6bffc39 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -1,38 +1,17 @@ require 'rubygems' require "bundler/setup" -#require 'rdf' -#require 'rdf/raptor' -#require 'rdf/turtle' require "rest-client" -#require 'uri' require 'yaml' require 'json' require 'logger' -#require "securerandom" require 'mongoid' -default_config = File.join(ENV["HOME"],".opentox","config","default.rb") -client_config = File.join(ENV["HOME"],".opentox","config","opentox-client.rb") - -puts "Could not find configuration files #{default_config} or #{client_config}" unless File.exist? default_config or File.exist? client_config -require default_config if File.exist? default_config -require client_config if File.exist? client_config -# TODO switch to production +# TODO store development/test, validation, production in separate databases ENV["MONGOID_ENV"] = "development" Mongoid.load!("#{ENV['HOME']}/.opentox/config/mongoid.yml") -# define constants and global variables -#RDF::OT = RDF::Vocabulary.new 'http://www.opentox.org/api/1.2#' -#RDF::OT1 = RDF::Vocabulary.new 'http://www.opentox.org/api/1.1#' -#RDF::OTA = RDF::Vocabulary.new 'http://www.opentox.org/algorithmTypes.owl#' -#RDF::OLO = RDF::Vocabulary.new 'http://purl.org/ontology/olo/core#' -#RDF::TB = RDF::Vocabulary.new "http://onto.toxbank.net/api/" -#RDF::ISA = RDF::Vocabulary.new "http://onto.toxbank.net/isa/" -#RDF::OWL = RDF::Vocabulary.new "http://www.w3.org/2002/07/owl#" - -#CLASSES = ["Compound", "Feature", "Dataset", "Validation", "Task", "Investigation"] -CLASSES = ["Feature", "Dataset", "Validation", "Task", "Investigation"] -#RDF_FORMATS = [:rdfxml,:ntriples,:turtle] +CLASSES = ["Compound", "Feature", "DataEntry","Dataset"]#, "Validation", "Task", "Investigation"] +#CLASSES = ["Feature", "Dataset", "Validation", "Task", "Investigation"] # Regular expressions for parsing classification data TRUE_REGEXP = /^(true|active|1|1.0|tox|activating|carcinogen|mutagenic)$/i @@ -41,14 +20,15 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m [ "overwrite.rb", "rest-client-wrapper.rb", - "error.rb", - "authorization.rb", - "policy.rb", - "otlogger.rb", + #"error.rb", + #"authorization.rb", + #"policy.rb", + #"otlogger.rb", "opentox.rb", - "task.rb", + #"task.rb", "compound.rb", "feature.rb", + "data_entry.rb", "dataset.rb", #"algorithm.rb", #"model.rb", @@ -61,11 +41,11 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m #end # defaults to stderr, may be changed to file output (e.g in opentox-service) -$logger = OTLogger.new(STDOUT) # STDERR did not work on my development machine (CH) +$logger = Logger.new STDOUT #OTLogger.new(STDOUT) # STDERR did not work on my development machine (CH) $logger.level = Logger::DEBUG #Mongo::Logger.logger = $logger Mongo::Logger.level = Logger::WARN -#$mongo = Mongo::Client.new($mongodb[:uri]) +$mongo = Mongo::Client.new('mongodb://127.0.0.1:27017/opentox') +$gridfs = $mongo.database.fs Mongoid.logger.level = Logger::WARN Mongoid.logger = $logger -#Moped.logger = $logger diff --git a/lib/opentox.rb b/lib/opentox.rb index 554e686..33293ac 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -12,33 +12,11 @@ module OpenTox include Mongoid::Document include Mongoid::Timestamps store_in collection: klass.downcase.pluralize + field :title, as: :name, type: String - field :title, type: String - field :description, type: String - field :parameters, type: Array, default: [] - field :creator, type: String - - # TODO check if needed - def self.subjectid - RestClientWrapper.subjectid - end - def self.subjectid=(subjectid) - RestClientWrapper.subjectid = subjectid - end end OpenTox.const_set klass,c end - def type - self.class.to_s.split('::').last - end - - # Serialisation - - # @return [String] converts OpenTox object into html document (by first converting it to a string) - def to_html - self.to_json.to_html - end - end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 4dafe8d..2eb0b39 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -36,61 +36,40 @@ class String bad_request_error "invalid value for Boolean: \"#{self}\"" end - # encloses URI in text with with link tag - # @return [String] new text with marked links - def link_urls - self.gsub(/(?i)http(s?):\/\/[^\r\n\s']*/, '\0') - end - - # produces a html page for making web services browser friendly - # format of text (=string params) is preserved (e.g. line breaks) - # urls are marked as links - # - # @param related_links [optional,String] uri on related resources - # @param description [optional,String] general info - # @param png_image [optional,String] imagename - # @return [String] html page - def to_html(related_links=nil, description=nil, png_image=nil ) - - # TODO add title as parameter - title = nil #$sinatra.to($sinatra.request.env['PATH_INFO'], :full) if $sinatra - html = "" - html << ""+title+"" if title - #html += "<\/img>" - - html << "

Description

"+description.link_urls+"

" if description - html << "

Related links

"+related_links.link_urls+"

" if related_links - html << "

Content

" if description || related_links - html << "

" - html << "\n" if png_image - html << self.link_urls - html << "

" - html - end +end - def uri? - URI.valid?(self) +class File + # @return [String] mime_type including charset using linux cmd command + def mime_type + `file -ib '#{self.path}'`.chomp end - end -module URI +class Array - def self.compound? uri - uri =~ /compound/ and URI.valid? uri + # Sum up the size of single arrays in an array of arrays + # @param [Array] Array of arrays + # @return [Integer] Sum of size of array elements + def sum_size + self.inject(0) { |s,a| + if a.respond_to?('size') + s+=a.size + else + internal_server_error "No size available: #{a.inspect}" + end + } end - def self.task? uri - uri =~ /task/ and URI.valid? uri + # For symbolic features + # @param [Array] Array to test. + # @return [Boolean] Whether the array has just one unique value. + def zero_variance? + return self.uniq.size == 1 end - def self.dataset? uri - uri =~ /dataset/ and URI.accessible? uri - end +end - def self.model? uri - uri =~ /model/ and URI.accessible? uri - end +module URI def self.ssl? uri URI.parse(uri).instance_of? URI::HTTPS @@ -124,76 +103,3 @@ module URI end end - -class File - # @return [String] mime_type including charset using linux cmd command - def mime_type - `file -ib '#{self.path}'`.chomp - end -end - -module Kernel - -=begin - # overwrite backtick operator to catch system errors - # Override raises an error if _cmd_ returns a non-zero exit status. CH: I do not understand this comment - # Returns stdout if _cmd_ succeeds. Note that these are simply concatenated; STDERR is not inline. CH: I do not understand this comment - def ` cmd - stdout, stderr = '' - status = Open4::popen4(cmd) do |pid, stdin_stream, stdout_stream, stderr_stream| - stdout = stdout_stream.read - stderr = stderr_stream.read - end - internal_server_error "`" + cmd + "` failed.\n" + stdout + stderr unless status.success? - return stdout - rescue - internal_server_error $!.message - end -=end - - # @return [String] uri of task result, if task fails, an error according to task is raised - def wait_for_task uri - if URI.task?(uri) - t = OpenTox::Task.new uri - t.wait - unless t.completed? - error = OpenTox::RestClientWrapper.known_errors.select{|error| error[:code] == t.code}.first - error_method = error ? error[:method] : :internal_server_error - report = t.error_report - error_message = report ? report[:message] : $!.message - error_cause = report ? report[:errorCause] : nil - Object.send(error_method,error_message,t.uri,error_cause) - end - uri = t.resultURI - end - uri - end - - -end - - -class Array - - # Sum up the size of single arrays in an array of arrays - # @param [Array] Array of arrays - # @return [Integer] Sum of size of array elements - def sum_size - self.inject(0) { |s,a| - if a.respond_to?('size') - s+=a.size - else - internal_server_error "No size available: #{a.inspect}" - end - } - end - - # For symbolic features - # @param [Array] Array to test. - # @return [Boolean] Whether the array has just one unique value. - def zero_variance? - return self.uniq.size == 1 - end - -end - -- cgit v1.2.3 From 3cea6abe3606ea586b733e943737f77d58f215f9 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 27 Jul 2015 20:51:25 +0200 Subject: reasonable query performace for data_entries --- lib/compound.rb | 8 ++-- lib/data_entry.rb | 12 ++++-- lib/dataset.rb | 113 +++++++++++++++++++++++++++++++++++++++++++----------- lib/feature.rb | 9 +++-- 4 files changed, 108 insertions(+), 34 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 4a8089b..93f609f 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -15,10 +15,12 @@ module OpenTox field :chemblid, type: String field :image_id, type: BSON::ObjectId field :sdf_id, type: BSON::ObjectId + #belongs_to :dataset + #belongs_to :data_entry - def == compound - self.inchi == compound.inchi - end + #def == compound + #self.inchi == compound.inchi + #end # Create a compound from smiles string # @example diff --git a/lib/data_entry.rb b/lib/data_entry.rb index 9f6e786..4eeb66d 100644 --- a/lib/data_entry.rb +++ b/lib/data_entry.rb @@ -1,15 +1,18 @@ module OpenTox class DataEntry - #field :feature_id, type: BSON::ObjectId - #field :compound_id, type: BSON::ObjectId + field :feature_id, type: BSON::ObjectId + field :compound_id, type: BSON::ObjectId # Kludge because csv import removes type information - field :feature_id, type: String - field :compound_id, type: String + #field :feature_id, type: String + #field :compound_id, type: String field :value field :warnings, type: String field :unit, type: String store_in collection: "data_entries" + belongs_to :dataset + has_one :compound + has_one :feature # preferred method for the insertion of data entries # @example DataEntry.find_or_create compound,feature,value @@ -32,5 +35,6 @@ module OpenTox def self.[](compound,feature) self.where(:compound_id => compound.id.to_s, :feature_id => feature.id.to_s).distinct(:value).first end + end end diff --git a/lib/dataset.rb b/lib/dataset.rb index 503e409..2ade033 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -3,14 +3,33 @@ require 'tempfile' module OpenTox + class LazarPrediction < Dataset + field :creator, type: String + end + + class FminerDataset < Dataset + field :training_algorithm, type: String + field :training_dataset_id, type: BSON::ObjectId + field :training_feature_id, type: BSON::ObjectId + field :training_parameters, type: Hash + end + class Dataset include Mongoid::Document + attr_accessor :bulk + + # associations like has_many, belongs_to deteriorate performance field :feature_ids, type: Array, default: [] field :compound_ids, type: Array, default: [] field :source, type: String field :warnings, type: Array, default: [] + def initialize params=nil + super params + @bulk = [] + end + # Readers def compounds @@ -21,6 +40,49 @@ module OpenTox self.feature_ids.collect{|id| OpenTox::Feature.find(id)} end + def [](compound,feature) + bad_request_error "Incorrect parameter type. The first argument is a OpenTox::Compound the second a OpenTox::Feature." unless compound.is_a? Compound and feature.is_a? Feature + DataEntry.where(dataset_id: self.id, compound_id: compound.id, feature_id: feature.id).distinct(:value).first + end + + def fingerprint(compound) + data_entries[compound.id] + end + + def data_entries + unless @data_entries + entries = {} + t = Time.now + DataEntry.where(dataset_id: self.id).each do |de| + entries[de.compound_id] ||= {} + entries[de.compound_id][de.feature_id] = de.value.first + end + $logger.debug "Retrieving data: #{Time.now-t}" + t = Time.now + @data_entries = {} + # TODO: check performance overhead + compound_ids.each do |cid| + @data_entries[cid] = [] + feature_ids.each_with_index do |fid,i| + @data_entries[cid][i] = entries[cid][fid] + end + end + $logger.debug "Create @data_entries: #{Time.now-t}" + end + @data_entries + end + + # Find data entry values for a given compound and feature + # @param compound [OpenTox::Compound] OpenTox Compound object + # @param feature [OpenTox::Feature] OpenTox Feature object + # @return [Array] Data entry values + def values(compound, feature) + data_entries.where(:compound_id => compound.id, :feature_id => feature.id).distinct(:value) + #rows = (0 ... compound_ids.length).select { |r| compound_ids[r] == compound.id } + #col = feature_ids.index feature.id + #rows.collect{|row| data_entries[row][col]} + end + # Writers def compounds=(compounds) @@ -151,21 +213,40 @@ module OpenTox #def self.from_sdf_file #end + def bulk_write + time = Time.now + # Workaround for mongo bulk insertions (insertion of single data_entries is far too slow) + # Skip ruby JSON serialisation: + # - to_json is too slow to write to file + # - json (or bson) serialisation is probably causing very long parse times of Mongo::BulkWrite, or any other ruby insert operation + # this method causes a noticeable overhead compared to direct string serialisation (e.g. total processing time 16" instead of 12" for rat fminer dataset), but it can be reused at different places + dataset_id = self.id.to_s + f = Tempfile.new("#{dataset_id}.json","/tmp") + f.puts @bulk.collect{|row| "{'dataset_id': {'$oid': '#{dataset_id}'},'compound_id': {'$oid': '#{row[0]}'}, 'feature_id': {'$oid': '#{row[1]}'}, 'value': #{row[2]}}"}.join("\n") + f.close + $logger.debug "Write JSON file: #{Time.now-time}" + # TODO DB name from config + puts `mongoimport --db opentox --collection data_entries --type json --file #{f.path} 2>&1` + $logger.debug "Bulk import: #{Time.now-time}" + @bulk = [] + end + def self.from_csv_file file, source=nil, bioassay=true source ||= file table = CSV.read file, :skip_blanks => true - from_table table, source, bioassay + parse_table table, source, bioassay end # parse data in tabular format (e.g. from csv) # does a lot of guesswork in order to determine feature types - def self.from_table table, source, bioassay=true + def self.parse_table table, source, bioassay=true time = Time.now # features feature_names = table.shift.collect{|f| f.strip} dataset = Dataset.new(:source => source) + dataset_id = dataset.id.to_s dataset.warnings << "Duplicate features in table header." unless feature_names.size == feature_names.uniq.size compound_format = feature_names.shift.strip bad_request_error "#{compound_format} is not a supported compound format. Accepted formats: SMILES, InChI." unless compound_format =~ /SMILES|InChI/i @@ -175,7 +256,7 @@ module OpenTox feature_names.each_with_index do |f,i| values = table.collect{|row| val=row[i+1].to_s.strip; val.blank? ? nil : val }.uniq.compact types = values.collect{|v| v.numeric? ? true : false}.uniq - metadata = {"name" => f, "source" => source} + metadata = {"name" => File.basename(f), "source" => source} if values.size == 0 # empty feature elsif values.size > 5 and types.size == 1 and types.first == true # 5 max classes metadata["numeric"] = true @@ -208,7 +289,6 @@ module OpenTox # compounds and values r = -1 - csv = ["compound_id,feature_id,value"] compound_time = 0 value_time = 0 @@ -246,36 +326,23 @@ module OpenTox dataset.warnings << "Empty value for compound '#{identifier}' (row #{r+2}) and feature '#{feature_names[i]}' (column #{i+2})." next elsif numeric[i] - csv << "#{cid},#{feature_ids[i]},#{v.to_f}" # retrieving ids from dataset.{compounds|features} kills performance + dataset.bulk << [cid,feature_ids[i],v.to_f] else - csv << "#{cid},#{feature_ids[i]},#{v.strip}" # retrieving ids from dataset.{compounds|features} kills performance + dataset.bulk << [cid,feature_ids[i],v.split] end end end - dataset.compounds.duplicates.each do |duplicates| - # TODO fix and check + dataset.compounds.duplicates.each do |compound| positions = [] - compounds.each_with_index{|c,i| positions << i+1 if !c.blank? and c == compound} + dataset.compounds.each_with_index{|c,i| positions << i+1 if !c.blank? and c.inchi == compound.inchi} dataset.warnings << "Duplicate compound #{compound.inchi} at rows #{positions.join(', ')}. Entries are accepted, assuming that measurements come from independent experiments." end $logger.debug "Value parsing: #{Time.now-time} (Compound creation: #{compound_time})" time = Time.now + dataset.bulk_write + dataset.save - # Workaround for mongo bulk insertions (insertion of single data_entries is far too slow) - # Skip ruby JSON serialisation: - # - to_json is too slow to write to file - # - json (or bson) serialisation is probably causing very long parse times of Mongo::BulkWrite, or any other ruby insert operation - f = Tempfile.new("#{dataset.id.to_s}.csv","/tmp") - f.puts csv.join("\n") - f.close - $logger.debug "Write file: #{Time.now-time}" - time = Time.now - # TODO DB name from config - `mongoimport --db opentox --collection data_entries --type csv --headerline --file #{f.path}` - $logger.debug "Bulk insert: #{Time.now-time}" - time = Time.now - dataset end end diff --git a/lib/feature.rb b/lib/feature.rb index b2f9a93..de8e4c9 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -8,6 +8,8 @@ module OpenTox field :calculated, type: Boolean field :supervised, type: Boolean field :source, as: :title, type: String + #belongs_to :dataset + #belongs_to :data_entry end class NominalFeature < Feature @@ -36,10 +38,9 @@ module OpenTox end class FminerSmarts < Smarts - field :training_algorithm, type: String - field :training_compound_ids, type: Array - field :training_feature_id, type: BSON::ObjectId - field :training_parameters, type: Hash + field :pValue, type: Float + field :effect, type: String + field :dataset_id def initialize params super params supervised = true -- cgit v1.2.3 From 823fc0c2ef763851cc7b2fcc0b2bfd07120f90e9 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 29 Jul 2015 12:39:07 +0200 Subject: save data_entries in GridFS (fastest method up to now) --- lib/dataset.rb | 103 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 2ade033..51c472b 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -18,10 +18,12 @@ module OpenTox include Mongoid::Document attr_accessor :bulk + attr_accessor :data_entries # associations like has_many, belongs_to deteriorate performance field :feature_ids, type: Array, default: [] field :compound_ids, type: Array, default: [] + field :data_entries_id, type: BSON::ObjectId field :source, type: String field :warnings, type: Array, default: [] @@ -30,44 +32,41 @@ module OpenTox @bulk = [] end + def save_all + dump = Marshal.dump(@data_entries) + file = Mongo::Grid::File.new(dump, :filename => "#{self.id.to_s}.data_entries") + data_entries_id = $gridfs.insert_one(file) + update(:data_entries_id => data_entries_id) + save + end + # Readers def compounds - self.compound_ids.collect{|id| OpenTox::Compound.find id} + @compounds ||= self.compound_ids.collect{|id| OpenTox::Compound.find id} + @compounds end def features - self.feature_ids.collect{|id| OpenTox::Feature.find(id)} + @features ||= self.feature_ids.collect{|id| OpenTox::Feature.find(id)} + @features end def [](compound,feature) bad_request_error "Incorrect parameter type. The first argument is a OpenTox::Compound the second a OpenTox::Feature." unless compound.is_a? Compound and feature.is_a? Feature - DataEntry.where(dataset_id: self.id, compound_id: compound.id, feature_id: feature.id).distinct(:value).first + #DataEntry.where(dataset_id: self.id, compound_id: compound.id, feature_id: feature.id).distinct(:value).first + data_entries[compound_ids.index(compound.id)][feature_ids.index(feature.id)] end def fingerprint(compound) - data_entries[compound.id] + data_entries[compound_ids.index(compound.id)] end def data_entries unless @data_entries - entries = {} t = Time.now - DataEntry.where(dataset_id: self.id).each do |de| - entries[de.compound_id] ||= {} - entries[de.compound_id][de.feature_id] = de.value.first - end + @data_entries = Marshal.load($gridfs.find_one(_id: data_entries_id).data) $logger.debug "Retrieving data: #{Time.now-t}" - t = Time.now - @data_entries = {} - # TODO: check performance overhead - compound_ids.each do |cid| - @data_entries[cid] = [] - feature_ids.each_with_index do |fid,i| - @data_entries[cid][i] = entries[cid][fid] - end - end - $logger.debug "Create @data_entries: #{Time.now-t}" end @data_entries end @@ -77,10 +76,10 @@ module OpenTox # @param feature [OpenTox::Feature] OpenTox Feature object # @return [Array] Data entry values def values(compound, feature) - data_entries.where(:compound_id => compound.id, :feature_id => feature.id).distinct(:value) - #rows = (0 ... compound_ids.length).select { |r| compound_ids[r] == compound.id } - #col = feature_ids.index feature.id - #rows.collect{|row| data_entries[row][col]} + #data_entries.where(:compound_id => compound.id, :feature_id => feature.id).distinct(:value) + rows = (0 ... compound_ids.length).select { |r| compound_ids[r] == compound.id } + col = feature_ids.index feature.id + rows.collect{|row| data_entries[row][col]} end # Writers @@ -234,29 +233,29 @@ module OpenTox def self.from_csv_file file, source=nil, bioassay=true source ||= file table = CSV.read file, :skip_blanks => true - parse_table table, source, bioassay + dataset = Dataset.new(:source => source, :name => File.basename(file)) + dataset.parse_table table, bioassay + dataset end # parse data in tabular format (e.g. from csv) # does a lot of guesswork in order to determine feature types - def self.parse_table table, source, bioassay=true + def parse_table table, bioassay=true time = Time.now # features feature_names = table.shift.collect{|f| f.strip} - dataset = Dataset.new(:source => source) - dataset_id = dataset.id.to_s - dataset.warnings << "Duplicate features in table header." unless feature_names.size == feature_names.uniq.size + warnings << "Duplicate features in table header." unless feature_names.size == feature_names.uniq.size compound_format = feature_names.shift.strip bad_request_error "#{compound_format} is not a supported compound format. Accepted formats: SMILES, InChI." unless compound_format =~ /SMILES|InChI/i numeric = [] # guess feature types feature_names.each_with_index do |f,i| + metadata = {} values = table.collect{|row| val=row[i+1].to_s.strip; val.blank? ? nil : val }.uniq.compact types = values.collect{|v| v.numeric? ? true : false}.uniq - metadata = {"name" => File.basename(f), "source" => source} if values.size == 0 # empty feature elsif values.size > 5 and types.size == 1 and types.first == true # 5 max classes metadata["numeric"] = true @@ -280,20 +279,21 @@ module OpenTox feature = NominalFeature.find_or_create_by(metadata) end end - dataset.feature_ids << OpenTox::Feature.find_or_create_by(metadata).id + feature_ids << OpenTox::Feature.find_or_create_by(metadata).id end - feature_ids = dataset.features.collect{|f| f.id.to_s} + #feature_ids = dataset.features.collect{|f| f.id.to_s} $logger.debug "Feature values: #{Time.now-time}" time = Time.now - # compounds and values r = -1 - compound_time = 0 value_time = 0 - table.each_with_index do |vals,j| + # compounds and values + @data_entries = Array.new(table.size){Array.new(table.first.size-1)} + + table.each_with_index do |vals,i| ct = Time.now identifier = vals.shift begin @@ -301,49 +301,52 @@ module OpenTox when /SMILES/i compound = OpenTox::Compound.from_smiles(identifier) if compound.inchi.empty? - dataset.warnings << "Cannot parse #{compound_format} compound '#{compound.strip}' at position #{j+2}, all entries are ignored." + warnings << "Cannot parse #{compound_format} compound '#{compound.strip}' at position #{i+2}, all entries are ignored." next end when /InChI/i + # compounds and values compound = OpenTox::Compound.from_inchi(identifier) end rescue - dataset.warnings << "Cannot parse #{compound_format} compound '#{compound}' at position #{j+2}, all entries are ignored." + warnings << "Cannot parse #{compound_format} compound '#{compound}' at position #{i+2}, all entries are ignored." next end compound_time += Time.now-ct - dataset.compound_ids << compound.id + compound_ids << compound.id r += 1 - unless vals.size == feature_ids.size # way cheaper than accessing dataset.features - dataset.warnings << "Number of values at position #{j+2} is different than header size (#{vals.size} vs. #{features.size}), all entries are ignored." + unless vals.size == feature_ids.size # way cheaper than accessing features + warnings << "Number of values at position #{i+2} is different than header size (#{vals.size} vs. #{features.size}), all entries are ignored." next end cid = compound.id.to_s - vals.each_with_index do |v,i| + vals.each_with_index do |v,j| if v.blank? - dataset.warnings << "Empty value for compound '#{identifier}' (row #{r+2}) and feature '#{feature_names[i]}' (column #{i+2})." + warnings << "Empty value for compound '#{identifier}' (row #{r+2}) and feature '#{feature_names[j]}' (column #{j+2})." next - elsif numeric[i] - dataset.bulk << [cid,feature_ids[i],v.to_f] + elsif numeric[j] + @data_entries[i][j] = v.to_f + #dataset.bulk << [cid,feature_ids[j],v.to_f] else - dataset.bulk << [cid,feature_ids[i],v.split] + @data_entries[i][j] = v.strip + #dataset.bulk << [cid,feature_ids[j],v.strip] end end end - dataset.compounds.duplicates.each do |compound| + compounds.duplicates.each do |compound| positions = [] - dataset.compounds.each_with_index{|c,i| positions << i+1 if !c.blank? and c.inchi == compound.inchi} - dataset.warnings << "Duplicate compound #{compound.inchi} at rows #{positions.join(', ')}. Entries are accepted, assuming that measurements come from independent experiments." + compounds.each_with_index{|c,i| positions << i+1 if !c.blank? and c.inchi == compound.inchi} + warnings << "Duplicate compound #{compound.inchi} at rows #{positions.join(', ')}. Entries are accepted, assuming that measurements come from independent experiments." end $logger.debug "Value parsing: #{Time.now-time} (Compound creation: #{compound_time})" time = Time.now - dataset.bulk_write - dataset.save + #dataset.bulk_write + save_all + $logger.debug "Saving: #{Time.now-time}" - dataset end end end -- cgit v1.2.3 From fc51ffa8442632c541ce560b3e3a417ffb9bf54a Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 29 Jul 2015 15:05:02 +0200 Subject: bbrc features for kazius with minfreq 20 successfully created and stored --- lib/dataset.rb | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 51c472b..1392de5 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -18,7 +18,7 @@ module OpenTox include Mongoid::Document attr_accessor :bulk - attr_accessor :data_entries + #attr_writer :data_entries # associations like has_many, belongs_to deteriorate performance field :feature_ids, type: Array, default: [] @@ -52,10 +52,27 @@ module OpenTox @features end - def [](compound,feature) - bad_request_error "Incorrect parameter type. The first argument is a OpenTox::Compound the second a OpenTox::Feature." unless compound.is_a? Compound and feature.is_a? Feature + def fill_nil_with n + (0 .. compound_ids.size-1).each do |i| + @data_entries[i] ||= [] + (0 .. feature_ids.size-1).each do |j| + @data_entries[i][j] ||= n + end + end + end + + def [](row,col) + #bad_request_error "Incorrect parameter type. The first argument is a OpenTox::Compound the second a OpenTox::Feature." unless compound.is_a? Compound and feature.is_a? Feature #DataEntry.where(dataset_id: self.id, compound_id: compound.id, feature_id: feature.id).distinct(:value).first - data_entries[compound_ids.index(compound.id)][feature_ids.index(feature.id)] + #data_entries[compound_ids.index(compound.id)][feature_ids.index(feature.id)] + @data_entries[row,col] + end + + def []=(row,col,v) + @data_entries ||= [] + @data_entries[row] ||= [] + #@data_entries ||= Array.new(compound_ids.size){Array.new(feature_ids.size)} + @data_entries[row][col] = v end def fingerprint(compound) @@ -66,6 +83,9 @@ module OpenTox unless @data_entries t = Time.now @data_entries = Marshal.load($gridfs.find_one(_id: data_entries_id).data) + bad_request_error "Data entries (#{data_entries_id}) are not a 2D-Array" unless @data_entries.is_a? Array and @data_entries.first.is_a? Array + bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries.size} rows, but dataset (#{id}) has #{compound_ids.size} compounds" unless @data_entries.size == compound_ids.size + bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries..first.size} columns, but dataset (#{id}) has #{feature_ids.size} features" unless @data_entries.first.size == feature_ids.size $logger.debug "Retrieving data: #{Time.now-t}" end @data_entries -- cgit v1.2.3 From 364139c560748bf266197e07f303af9028f713ec Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 29 Jul 2015 17:10:25 +0200 Subject: kazius lazar predictions working --- lib/opentox-client.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 6bffc39..f296837 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -20,7 +20,7 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m [ "overwrite.rb", "rest-client-wrapper.rb", - #"error.rb", + "error.rb", #"authorization.rb", #"policy.rb", #"otlogger.rb", @@ -28,7 +28,7 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m #"task.rb", "compound.rb", "feature.rb", - "data_entry.rb", + #"data_entry.rb", "dataset.rb", #"algorithm.rb", #"model.rb", -- cgit v1.2.3 From e68c69f90036bb7c47c57acb1ee3652b73c835c1 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 31 Jul 2015 10:59:53 +0200 Subject: descriptor tests working --- lib/compound.rb | 13 +++++++------ lib/dataset.rb | 38 +++++++++++++++----------------------- lib/feature.rb | 3 ++- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 93f609f..4d36915 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -73,12 +73,13 @@ module OpenTox # Get sdf # @return [String] SDF string def sdf - if sdf_id.nil? + if self.sdf_id.nil? sdf = obconversion(inchi,"inchi","sdf") file = Mongo::Grid::File.new(sdf, :filename => "#{id}.sdf",:content_type => "chemical/x-mdl-sdfile") sdf_id = $gridfs.insert_one file + update :sdf_id => sdf_id end - $gridfs.find_one(_id: sdf_id).data + $gridfs.find_one(_id: self.sdf_id).data end # Get png image @@ -86,12 +87,12 @@ module OpenTox # image = compound.png # @return [image/png] Image data def png - if image_id.nil? + if self.image_id.nil? png = obconversion(inchi,"inchi","_png2") file = Mongo::Grid::File.new(Base64.encode64(png), :filename => "#{id}.png", :content_type => "image/png") update(:image_id => $gridfs.insert_one(file)) end - Base64.decode64($gridfs.find_one(_id: image_id).data) + Base64.decode64($gridfs.find_one(_id: self.image_id).data) end @@ -134,11 +135,11 @@ module OpenTox OpenBabel::OBOp.find_type("Gen3D").do(obmol) sdf = obconversion.write_string(obmol) if sdf.match(/.nan/) - $logger.warn "3D generation failed for compound #{compound.inchi}, trying to calculate 2D structure" + $logger.warn "3D generation failed for compound #{identifier}, trying to calculate 2D structure" OpenBabel::OBOp.find_type("Gen2D").do(obmol) sdf = obconversion.write_string(obmol) if sdf.match(/.nan/) - $logger.warn "2D generation failed for compound #{compound.inchi}" + $logger.warn "2D generation failed for compound #{identifier}" sdf = nil end end diff --git a/lib/dataset.rb b/lib/dataset.rb index 1392de5..92ef7b5 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -18,7 +18,7 @@ module OpenTox include Mongoid::Document attr_accessor :bulk - #attr_writer :data_entries + attr_writer :data_entries # associations like has_many, belongs_to deteriorate performance field :feature_ids, type: Array, default: [] @@ -62,19 +62,29 @@ module OpenTox end def [](row,col) - #bad_request_error "Incorrect parameter type. The first argument is a OpenTox::Compound the second a OpenTox::Feature." unless compound.is_a? Compound and feature.is_a? Feature - #DataEntry.where(dataset_id: self.id, compound_id: compound.id, feature_id: feature.id).distinct(:value).first - #data_entries[compound_ids.index(compound.id)][feature_ids.index(feature.id)] @data_entries[row,col] end def []=(row,col,v) @data_entries ||= [] @data_entries[row] ||= [] - #@data_entries ||= Array.new(compound_ids.size){Array.new(feature_ids.size)} @data_entries[row][col] = v end + # merge dataset (i.e. append features) + def +(dataset) + bad_request_error "Dataset merge failed because the argument is not a OpenTox::Dataset but a #{dataset.class}" unless dataset.is_a? Dataset + bad_request_error "Dataset merge failed because compounds are unequal in datasets #{self.id} and #{dataset.id}" unless compound_ids == dataset.compound_ids + self.feature_ids ||= [] + self.feature_ids = self.feature_ids + dataset.feature_ids + @data_entries ||= Array.new(compound_ids.size){[]} + @data_entries.each_with_index do |row,i| + @data_entries[i] = row + dataset.fingerprint(compounds[i]) + end + self + + end + def fingerprint(compound) data_entries[compound_ids.index(compound.id)] end @@ -232,24 +242,6 @@ module OpenTox #def self.from_sdf_file #end - def bulk_write - time = Time.now - # Workaround for mongo bulk insertions (insertion of single data_entries is far too slow) - # Skip ruby JSON serialisation: - # - to_json is too slow to write to file - # - json (or bson) serialisation is probably causing very long parse times of Mongo::BulkWrite, or any other ruby insert operation - # this method causes a noticeable overhead compared to direct string serialisation (e.g. total processing time 16" instead of 12" for rat fminer dataset), but it can be reused at different places - dataset_id = self.id.to_s - f = Tempfile.new("#{dataset_id}.json","/tmp") - f.puts @bulk.collect{|row| "{'dataset_id': {'$oid': '#{dataset_id}'},'compound_id': {'$oid': '#{row[0]}'}, 'feature_id': {'$oid': '#{row[1]}'}, 'value': #{row[2]}}"}.join("\n") - f.close - $logger.debug "Write JSON file: #{Time.now-time}" - # TODO DB name from config - puts `mongoimport --db opentox --collection data_entries --type json --file #{f.path} 2>&1` - $logger.debug "Bulk import: #{Time.now-time}" - @bulk = [] - end - def self.from_csv_file file, source=nil, bioassay=true source ||= file table = CSV.read file, :skip_blanks => true diff --git a/lib/feature.rb b/lib/feature.rb index de8e4c9..e565875 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -56,8 +56,9 @@ module OpenTox end class PhysChemDescriptor < NumericFeature - field :algorithm, type: String + field :algorithm, type: String, default: "OpenTox::Algorithm::Descriptor.physchem" field :parameters, type: Hash + field :creator, type: String end end -- cgit v1.2.3 From f93333d7f5df30875eae9135f4b5e65a98d923b6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 31 Jul 2015 19:25:13 +0200 Subject: intermediary commit --- lib/compound.rb | 4 ++++ lib/dataset.rb | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/compound.rb b/lib/compound.rb index 4d36915..0c27553 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -1,3 +1,7 @@ +# TODO: check +# *** Open Babel Error in ParseFile +# Could not find contribution data file. +# 3d creation?? CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/" require 'openbabel' require "base64" diff --git a/lib/dataset.rb b/lib/dataset.rb index 92ef7b5..38e195b 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -7,7 +7,11 @@ module OpenTox field :creator, type: String end - class FminerDataset < Dataset + class DescriptorDataset < Dataset + field :feature_calculation_algorithm, type: String + end + + class FminerDataset < DescriptorDataset field :training_algorithm, type: String field :training_dataset_id, type: BSON::ObjectId field :training_feature_id, type: BSON::ObjectId -- cgit v1.2.3 From 2d02fabfafccb164093062a962f392bb7d13647a Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 1 Aug 2015 18:03:09 +0200 Subject: 50 times faster bbrc setup by eliminating @fminer.add_fminer_data --- lib/data_entry.rb | 40 ---------------------------------------- lib/dataset.rb | 13 ++++--------- lib/feature.rb | 1 - lib/opentox-client.rb | 2 +- 4 files changed, 5 insertions(+), 51 deletions(-) delete mode 100644 lib/data_entry.rb diff --git a/lib/data_entry.rb b/lib/data_entry.rb deleted file mode 100644 index 4eeb66d..0000000 --- a/lib/data_entry.rb +++ /dev/null @@ -1,40 +0,0 @@ -module OpenTox - - class DataEntry - field :feature_id, type: BSON::ObjectId - field :compound_id, type: BSON::ObjectId - # Kludge because csv import removes type information - #field :feature_id, type: String - #field :compound_id, type: String - field :value - field :warnings, type: String - field :unit, type: String - store_in collection: "data_entries" - belongs_to :dataset - has_one :compound - has_one :feature - - # preferred method for the insertion of data entries - # @example DataEntry.find_or_create compound,feature,value - # @param compound [OpenTox::Compound] - # @param feature [OpenTox::Feature] - # @param value - def self.find_or_create compound, feature, value - self.find_or_create_by( - :compound_id => compound.id, - :feature_id => feature.id, - :value => value - ) - end - - # preferred method for accessing values - # @example DataEntry[compound,feature] - # @param compound [OpenTox::Compound] - # @param feature [OpenTox::Feature] - # @return value - def self.[](compound,feature) - self.where(:compound_id => compound.id.to_s, :feature_id => feature.id.to_s).distinct(:value).first - end - - end -end diff --git a/lib/dataset.rb b/lib/dataset.rb index 38e195b..45f7119 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -5,6 +5,10 @@ module OpenTox class LazarPrediction < Dataset field :creator, type: String + def value compound + end + def confidence compound + end end class DescriptorDataset < Dataset @@ -21,7 +25,6 @@ module OpenTox class Dataset include Mongoid::Document - attr_accessor :bulk attr_writer :data_entries # associations like has_many, belongs_to deteriorate performance @@ -31,11 +34,6 @@ module OpenTox field :source, type: String field :warnings, type: Array, default: [] - def initialize params=nil - super params - @bulk = [] - end - def save_all dump = Marshal.dump(@data_entries) file = Mongo::Grid::File.new(dump, :filename => "#{self.id.to_s}.data_entries") @@ -344,10 +342,8 @@ module OpenTox next elsif numeric[j] @data_entries[i][j] = v.to_f - #dataset.bulk << [cid,feature_ids[j],v.to_f] else @data_entries[i][j] = v.strip - #dataset.bulk << [cid,feature_ids[j],v.strip] end end end @@ -359,7 +355,6 @@ module OpenTox $logger.debug "Value parsing: #{Time.now-time} (Compound creation: #{compound_time})" time = Time.now - #dataset.bulk_write save_all $logger.debug "Saving: #{Time.now-time}" diff --git a/lib/feature.rb b/lib/feature.rb index e565875..0801a47 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -9,7 +9,6 @@ module OpenTox field :supervised, type: Boolean field :source, as: :title, type: String #belongs_to :dataset - #belongs_to :data_entry end class NominalFeature < Feature diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index f296837..7a5c8c0 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -10,7 +10,7 @@ require 'mongoid' ENV["MONGOID_ENV"] = "development" Mongoid.load!("#{ENV['HOME']}/.opentox/config/mongoid.yml") -CLASSES = ["Compound", "Feature", "DataEntry","Dataset"]#, "Validation", "Task", "Investigation"] +CLASSES = ["Compound", "Feature", "Dataset"]#, "Validation", "Task", "Investigation"] #CLASSES = ["Feature", "Dataset", "Validation", "Task", "Investigation"] # Regular expressions for parsing classification data -- cgit v1.2.3 From 6efd73ed92c0a1eee46464ec11d0ed41df3570e9 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 3 Aug 2015 18:04:58 +0200 Subject: initial classification validation --- lib/dataset.rb | 105 ++++++++++++++------------------------------------ lib/opentox-client.rb | 2 +- 2 files changed, 29 insertions(+), 78 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 45f7119..152545b 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -5,9 +5,10 @@ module OpenTox class LazarPrediction < Dataset field :creator, type: String - def value compound - end - def confidence compound + field :prediction_feature_id, type: String + + def prediction_feature + Feature.find prediction_feature_id end end @@ -159,80 +160,32 @@ module OpenTox end end - # Methods for for validation service - - # create a new dataset with the specified compounds and features - # @param compound_indices [Array] compound indices (integers) - # @param feats [Array] features objects - # @param metadata [Hash] - # @return [OpenTox::Dataset] - # TODO - def split( compound_indices, feats, metadata) - - bad_request_error "Dataset.split : Please give compounds as indices" if compound_indices.size==0 or !compound_indices[0].is_a?(Fixnum) - bad_request_error "Dataset.split : Please give features as feature objects (given: #{feats})" if feats!=nil and feats.size>0 and !feats[0].is_a?(OpenTox::Feature) - dataset = OpenTox::Dataset.new - dataset.metadata = metadata - dataset.features = (feats ? feats : self.features) - compound_indices.each do |c_idx| - d = [ self.compounds[c_idx] ] - dataset.features.each_with_index.each do |f,f_idx| - d << (self.data_entries[c_idx] ? self.data_entries[c_idx][f_idx] : nil) - end - dataset << d - end - dataset.put - dataset - end - - - # maps a compound-index from another dataset to a compound-index from this dataset - # mapping works as follows: - # (compound c is the compound identified by the compound-index of the other dataset) - # * c occurs only once in this dataset? map compound-index of other dataset to index in this dataset - # * c occurs >1 in this dataset? - # ** number of occurences is equal in both datasets? assume order is preserved(!) and map accordingly - # ** number of occurences is not equal in both datasets? cannot map, raise error - # @param dataset [OpenTox::Dataset] dataset that should be mapped to this dataset (fully loaded) - # @param compound_index [Fixnum], corresponding to dataset - # TODO - def compound_index( dataset, compound_index ) - compound_inchi = dataset.compounds[compound_index].inchi - self_indices = compound_indices(compound_inchi) - if self_indices==nil - nil - else - dataset_indices = dataset.compound_indices(compound_inchi) - if self_indices.size==1 - self_indices.first - elsif self_indices.size==dataset_indices.size - # we do assume that the order is preseverd (i.e., the nth occurences in both datasets are mapped to each other)! - self_indices[dataset_indices.index(compound_index)] - else - raise "cannot map compound #{compound_inchi} from dataset #{dataset.id} to dataset #{self.id}, "+ - "compound occurs #{dataset_indices.size} times and #{self_indices.size} times" - end + # split dataset into n folds + def folds n + len = self.compound_ids.size + indices = (0..len-1).to_a.shuffle + mid = (len/n) + chunks = [] + start = 0 + 1.upto(n) do |i| + last = start+mid + last = last-1 unless len%n >= i + test_idxs = indices[start..last] || [] + test_cids = test_idxs.collect{|i| self.compound_ids[i]} + test_data_entries = test_idxs.collect{|i| self.data_entries[i]} + test_dataset = self.class.new(:compound_ids => test_cids, :feature_ids => self.feature_ids, :data_entries => test_data_entries) + training_idxs = indices-test_idxs + training_cids = training_idxs.collect{|i| self.compound_ids[i]} + training_data_entries = training_idxs.collect{|i| self.data_entries[i]} + training_dataset = self.class.new(:compound_ids => training_cids, :feature_ids => self.feature_ids, :data_entries => training_data_entries) + test_dataset.save_all + training_dataset.save_all + chunks << [training_dataset,test_dataset] + start = last+1 end + chunks end - # returns the inidices of the compound in the dataset - # @param compound_inchi [String] - # @return [Array] compound index (position) of the compound in the dataset, array-size is 1 unless multiple occurences - # TODO - def compound_indices( compound_inchi ) - unless defined?(@cmp_indices) and @cmp_indices.has_key?(compound_inchi) - @cmp_indices = {} - compounds().size.times do |i| - c = self.compounds[i].inchi - if @cmp_indices[c]==nil - @cmp_indices[c] = [i] - else - @cmp_indices[c] = @cmp_indices[c]+[i] - end - end - end - @cmp_indices[compound_inchi] - end # Adding data methods # (Alternatively, you can directly change @data["feature_ids"] and @data["compounds"]) @@ -247,7 +200,7 @@ module OpenTox def self.from_csv_file file, source=nil, bioassay=true source ||= file table = CSV.read file, :skip_blanks => true - dataset = Dataset.new(:source => source, :name => File.basename(file)) + dataset = self.new(:source => source, :name => File.basename(file)) dataset.parse_table table, bioassay dataset end @@ -295,7 +248,6 @@ module OpenTox end feature_ids << OpenTox::Feature.find_or_create_by(metadata).id end - #feature_ids = dataset.features.collect{|f| f.id.to_s} $logger.debug "Feature values: #{Time.now-time}" time = Time.now @@ -319,7 +271,6 @@ module OpenTox next end when /InChI/i - # compounds and values compound = OpenTox::Compound.from_inchi(identifier) end rescue diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 7a5c8c0..42e8186 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -32,7 +32,7 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m "dataset.rb", #"algorithm.rb", #"model.rb", - "validation.rb" + #"validation.rb" ].each{ |f| require_relative f } #if defined?($aa) and $aa[:uri] -- cgit v1.2.3 From 04af01b8135ea147e9ce253e5526e3ee3adcc675 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 7 Aug 2015 19:50:09 +0200 Subject: initial k-nn weighted average implementation --- lib/compound.rb | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++- lib/dataset.rb | 27 +++++++++++++++++--- lib/feature.rb | 7 ++++- lib/opentox-client.rb | 6 +++-- 4 files changed, 104 insertions(+), 7 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 0c27553..4d292f1 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -1,7 +1,7 @@ # TODO: check # *** Open Babel Error in ParseFile # Could not find contribution data file. -# 3d creation?? + CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/" require 'openbabel' require "base64" @@ -9,6 +9,34 @@ require "base64" module OpenTox class Compound + include OpenTox + +# OpenBabel FP4 fingerprints +# OpenBabel http://open-babel.readthedocs.org/en/latest/Fingerprints/intro.html +# TODO store in DB +fp4 = FingerprintSmarts.find +unless fp4 + fp4 = [] + File.open(File.join(File.dirname(__FILE__),"SMARTS_InteLigand.txt")).each do |l| + l.strip! + unless l.empty? or l.match /^#/ + name,smarts = l.split(': ') + fp4 << OpenTox::FingerprintSmarts.find_or_create_by(:name => name, :smarts => smarts) unless smarts.nil? + end + end +end +FP4 = fp4 + +# TODO investigate other types of fingerprints (MACCS) +# OpenBabel http://open-babel.readthedocs.org/en/latest/Fingerprints/intro.html +# http://www.dalkescientific.com/writings/diary/archive/2008/06/26/fingerprint_background.html +# OpenBabel MNA http://openbabel.org/docs/dev/FileFormats/Multilevel_Neighborhoods_of_Atoms_(MNA).html#multilevel-neighborhoods-of-atoms-mna +# Morgan ECFP, FCFP +# http://cdk.github.io/cdk/1.5/docs/api/org/openscience/cdk/fingerprint/CircularFingerprinter.html +# http://www.rdkit.org/docs/GettingStartedInPython.html +# Chemfp +# https://chemfp.readthedocs.org/en/latest/using-tools.html +# CACTVS/PubChem field :inchi, type: String attr_readonly :inchi @@ -19,6 +47,8 @@ module OpenTox field :chemblid, type: String field :image_id, type: BSON::ObjectId field :sdf_id, type: BSON::ObjectId + field :fp4, type: Array + field :fp4_size, type: Integer #belongs_to :dataset #belongs_to :data_entry @@ -26,6 +56,22 @@ module OpenTox #self.inchi == compound.inchi #end + def self.find_or_create_by params + compound = self.find_or_initialize_by params + unless compound.fp4 + compound.fp4_size = 0 + compound.fp4 = [] + Algorithm::Descriptor.smarts_match(compound, FP4.collect{|f| f.smarts}).each_with_index do |m,i| + if m > 0 + compound.fp4 << FP4[i].id + compound.fp4_size += 1 + end + end + end + compound.save + compound + end + # Create a compound from smiles string # @example # compound = OpenTox::Compound.from_smiles("c1ccccc1") @@ -124,6 +170,29 @@ module OpenTox self["chemblid"] end + def neighbors threshold=0.3 + # from http://blog.matt-swain.com/post/87093745652/chemical-similarity-search-in-mongodb + qn = fp4.size + qmin = qn * threshold + qmax = qn / threshold + #not sure if it is worth the effort of keeping feature counts up to date (compound deletions, additions, ...) + #reqbits = [count['_id'] for count in db.mfp_counts.find({'_id': {'$in': qfp}}).sort('count', 1).limit(qn - qmin + 1)] + aggregate = [ + #{'$match': {'mfp.count': {'$gte': qmin, '$lte': qmax}, 'mfp.bits': {'$in': reqbits}}}, + {'$project': { + 'tanimoto': {'$let': { + 'vars': {'common': {'$size': {'$setIntersection': ['$fp4', fp4]}}}, + 'in': {'$divide': ['$$common', {'$subtract': [{'$add': [qn, '$fp4_size']}, '$$common']}]} + }}, + '_id': 1 + }}, + {'$match': {'tanimoto': {'$gte': threshold}}}, + {'$sort': {'tanimoto': -1}} + ] + + $mongo["compounds"].aggregate(aggregate).collect { |r| [Compound.find(r["_id"]), r["tanimoto"]]} + end + private def self.obconversion(identifier,input_format,output_format,option=nil) diff --git a/lib/dataset.rb b/lib/dataset.rb index 152545b..0447bb0 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -10,6 +10,7 @@ module OpenTox def prediction_feature Feature.find prediction_feature_id end + end class DescriptorDataset < Dataset @@ -74,6 +75,18 @@ module OpenTox @data_entries[row][col] = v end + def correlation_plot training_dataset + R.assign "features", data_entries + R.assign "activities", training_dataset.data_entries.collect{|de| de.first} + R.eval "featurePlot(features,activities)" + end + + def density_plot + R.assign "acts", data_entries.collect{|r| r.first }#.compact + R.eval "plot(density(log(acts),na.rm= TRUE), main='log(#{features.first.name})')" + # TODO kill Rserve plots + end + # merge dataset (i.e. append features) def +(dataset) bad_request_error "Dataset merge failed because the argument is not a OpenTox::Dataset but a #{dataset.class}" unless dataset.is_a? Dataset @@ -89,7 +102,8 @@ module OpenTox end def fingerprint(compound) - data_entries[compound_ids.index(compound.id)] + i = compound_ids.index(compound.id) + i.nil? ? nil : data_entries[i] end def data_entries @@ -209,6 +223,8 @@ module OpenTox # does a lot of guesswork in order to determine feature types def parse_table table, bioassay=true + # TODO: remove empty entries + write tests + time = Time.now # features @@ -220,7 +236,7 @@ module OpenTox numeric = [] # guess feature types feature_names.each_with_index do |f,i| - metadata = {} + metadata = {:name => f} values = table.collect{|row| val=row[i+1].to_s.strip; val.blank? ? nil : val }.uniq.compact types = values.collect{|v| v.numeric? ? true : false}.uniq if values.size == 0 # empty feature @@ -246,7 +262,7 @@ module OpenTox feature = NominalFeature.find_or_create_by(metadata) end end - feature_ids << OpenTox::Feature.find_or_create_by(metadata).id + feature_ids << feature.id end $logger.debug "Feature values: #{Time.now-time}" @@ -262,6 +278,11 @@ module OpenTox table.each_with_index do |vals,i| ct = Time.now identifier = vals.shift + #if vals.compact.empty? + #warnings << "No values for compound at position #{i+2}, all entries are ignored." + #@data_entries.pop + #next + #end begin case compound_format when /SMILES/i diff --git a/lib/feature.rb b/lib/feature.rb index 0801a47..005d78f 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -27,7 +27,8 @@ module OpenTox end class Smarts < NominalFeature - field :name, as: :smarts, type: String # causes warnings + field :smarts, type: String + #field :name, as: :smarts, type: String # causes warnings field :algorithm, type: String, default: "OpenTox::Algorithm::Descriptors.smarts_match" field :parameters, type: Hash, default: {:count => false} def initialize params @@ -46,6 +47,10 @@ module OpenTox end end + class FingerprintSmarts < Smarts + field :count, type: Integer + end + class NominalBioAssay < NominalFeature field :description, type: String end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 42e8186..092b84e 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -5,12 +5,14 @@ require 'yaml' require 'json' require 'logger' require 'mongoid' +require 'rserve' # TODO store development/test, validation, production in separate databases ENV["MONGOID_ENV"] = "development" Mongoid.load!("#{ENV['HOME']}/.opentox/config/mongoid.yml") +R = Rserve::Connection.new -CLASSES = ["Compound", "Feature", "Dataset"]#, "Validation", "Task", "Investigation"] +CLASSES = ["Feature","Compound", "Dataset"]#, "Validation", "Task", "Investigation"] #CLASSES = ["Feature", "Dataset", "Validation", "Task", "Investigation"] # Regular expressions for parsing classification data @@ -26,8 +28,8 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m #"otlogger.rb", "opentox.rb", #"task.rb", - "compound.rb", "feature.rb", + "compound.rb", #"data_entry.rb", "dataset.rb", #"algorithm.rb", -- cgit v1.2.3 From cb5f5f64028006f3180059324b79e835b58f2726 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 7 Aug 2015 19:50:48 +0200 Subject: SMARTS_InteLigand.txt added --- lib/SMARTS_InteLigand.txt | 983 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 983 insertions(+) create mode 100644 lib/SMARTS_InteLigand.txt diff --git a/lib/SMARTS_InteLigand.txt b/lib/SMARTS_InteLigand.txt new file mode 100644 index 0000000..23bc6e2 --- /dev/null +++ b/lib/SMARTS_InteLigand.txt @@ -0,0 +1,983 @@ +# +# SMARTS Patterns for Functional Group Classification +# +# written by Christian Laggner +# Copyright 2005 Inte:Ligand Software-Entwicklungs und Consulting GmbH +# +# Released under the Lesser General Public License (LGPL license) +# see http://www.gnu.org/copyleft/lesser.html +# Modified from Version 221105 +##################################################################################################### + +# General Stuff: +# These patters were written in an attempt to represent the classification of organic compounds +# from the viewpoint of an organic chemist. +# They are often very restrictive. This may be generally a good thing, but it also takes some time +# for filtering/indexing large compound sets. +# For filtering undesired groups (in druglike compounds) one will want to have more general patterns +# (e.g. you don't want *any* halide of *any* acid, *neither* aldehyde *nor* formyl esters and amides, ...). +# + +# Part I: Carbon +# ============== + + +# I.1: Carbon-Carbon Bonds +# ------------------------ + +# I.1.1 Alkanes: + +Primary_carbon: [CX4H3][#6] + +Secondary_carbon: [CX4H2]([#6])[#6] + +Tertiary_carbon: [CX4H1]([#6])([#6])[#6] + +Quaternary_carbon: [CX4]([#6])([#6])([#6])[#6] + + +# I.1.2 C-C double and Triple Bonds + +Alkene: [CX3;$([H2]),$([H1][#6]),$(C([#6])[#6])]=[CX3;$([H2]),$([H1][#6]),$(C([#6])[#6])] +# sp2 C may be substituted only by C or H - +# does not hit ketenes and allenes, nor enamines, enols and the like + +Alkyne: [CX2]#[CX2] +# non-carbon substituents (e.g. alkynol ethers) are rather rare, thus no further discrimination + +Allene: [CX3]=[CX2]=[CX3] + + +# I.2: One Carbon-Hetero Bond +# --------------------------- + + +# I.2.1 Alkyl Halogenides + +Alkylchloride: [ClX1][CX4] +# will also hit chloromethylethers and the like, but no chloroalkenes, -alkynes or -aromats +# a more restrictive version can be obtained by modifying the Alcohol string. + +Alkylfluoride: [FX1][CX4] + +Alkylbromide: [BrX1][CX4] + +Alkyliodide: [IX1][CX4] + + +# I.2.2 Alcohols and Ethers + +Alcohol: [OX2H][CX4;!$(C([OX2H])[O,S,#7,#15])] +# nonspecific definition, no acetals, aminals, and the like + +Primary_alcohol: [OX2H][CX4H2;!$(C([OX2H])[O,S,#7,#15])] + +Secondary_alcohol: [OX2H][CX4H;!$(C([OX2H])[O,S,#7,#15])] + +Tertiary_alcohol: [OX2H][CX4D4;!$(C([OX2H])[O,S,#7,#15])] + +Dialkylether: [OX2]([CX4;!$(C([OX2])[O,S,#7,#15,F,Cl,Br,I])])[CX4;!$(C([OX2])[O,S,#7,#15])] +# no acetals and the like; no enolethers + +Dialkylthioether: [SX2]([CX4;!$(C([OX2])[O,S,#7,#15,F,Cl,Br,I])])[CX4;!$(C([OX2])[O,S,#7,#15])] +# no acetals and the like; no enolethers + +Alkylarylether: [OX2](c)[CX4;!$(C([OX2])[O,S,#7,#15,F,Cl,Br,I])] +# no acetals and the like; no enolethers + +Diarylether: [c][OX2][c] + +Alkylarylthioether: [SX2](c)[CX4;!$(C([OX2])[O,S,#7,#15,F,Cl,Br,I])] + +Diarylthioether: [c][SX2][c] + +Oxonium: [O+;!$([O]~[!#6]);!$([S]*~[#7,#8,#15,#16])] +# can't be aromatic, thus O and not #8 + +# I.2.3 Amines + +Amine: [NX3+0,NX4+;!$([N]~[!#6]);!$([N]*~[#7,#8,#15,#16])] +# hits all amines (prim/sec/tert/quart), including ammonium salts, also enamines, but not amides, imides, aminals, ... + +# the following amines include also the protonated forms + +Primary_aliph_amine: [NX3H2+0,NX4H3+;!$([N][!C]);!$([N]*~[#7,#8,#15,#16])] + +Secondary_aliph_amine: [NX3H1+0,NX4H2+;!$([N][!C]);!$([N]*~[#7,#8,#15,#16])] + +Tertiary_aliph_amine: [NX3H0+0,NX4H1+;!$([N][!C]);!$([N]*~[#7,#8,#15,#16])] + +Quaternary_aliph_ammonium: [NX4H0+;!$([N][!C]);!$([N]*~[#7,#8,#15,#16])] + +Primary_arom_amine: [NX3H2+0,NX4H3+]c + +Secondary_arom_amine: [NX3H1+0,NX4H2+;!$([N][!c]);!$([N]*~[#7,#8,#15,#16])] + +Tertiary_arom_amine: [NX3H0+0,NX4H1+;!$([N][!c]);!$([N]*~[#7,#8,#15,#16])] + +Quaternary_arom_ammonium: [NX4H0+;!$([N][!c]);!$([N]*~[#7,#8,#15,#16])] + +Secondary_mixed_amine: [NX3H1+0,NX4H2+;$([N]([c])[C]);!$([N]*~[#7,#8,#15,#16])] + +Tertiary_mixed_amine: [NX3H0+0,NX4H1+;$([N]([c])([C])[#6]);!$([N]*~[#7,#8,#15,#16])] + +Quaternary_mixed_ammonium: [NX4H0+;$([N]([c])([C])[#6][#6]);!$([N]*~[#7,#8,#15,#16])] + +Ammonium: [N+;!$([N]~[!#6]);!$(N=*);!$([N]*~[#7,#8,#15,#16])] +# only C and H substituents allowed. Quaternary or protonated amines +# NX4+ or Nv4+ is not recognized by Daylight's depictmatch if less than four C are present + + +# I.2.4 Others + +Alkylthiol: [SX2H][CX4;!$(C([SX2H])~[O,S,#7,#15])] + +Dialkylthioether: [SX2]([CX4;!$(C([SX2])[O,S,#7,#15,F,Cl,Br,I])])[CX4;!$(C([SX2])[O,S,#7,#15])] + +Alkylarylthioether: [SX2](c)[CX4;!$(C([SX2])[O,S,#7,#15])] + +Disulfide: [SX2D2][SX2D2] + +1,2-Aminoalcohol: [OX2H][CX4;!$(C([OX2H])[O,S,#7,#15,F,Cl,Br,I])][CX4;!$(C([N])[O,S,#7,#15])][NX3;!$(NC=[O,S,N])] +# does not hit alpha-amino acids, enaminoalcohols, 1,2-aminoacetals, o-aminophenols, etc. + +1,2-Diol: [OX2H][CX4;!$(C([OX2H])[O,S,#7,#15])][CX4;!$(C([OX2H])[O,S,#7,#15])][OX2H] +# does not hit alpha-hydroxy acids, enolalcohols, 1,2-hydroxyacetals, 1,2-diphenols, etc. + +1,1-Diol: [OX2H][CX4;!$(C([OX2H])([OX2H])[O,S,#7,#15])][OX2H] + +Hydroperoxide: [OX2H][OX2] +#does not neccessarily have to be connected to a carbon atom, includes also hydrotrioxides + +Peroxo: [OX2D2][OX2D2] + +Organolithium_compounds: [LiX1][#6,#14] + +Organomagnesium_compounds: [MgX2][#6,#14] +# not restricted to Grignard compounds, also dialkyl Mg + +Organometallic_compounds: [!#1;!#5;!#6;!#7;!#8;!#9;!#14;!#15;!#16;!#17;!#33;!#34;!#35;!#52;!#53;!#85]~[#6;!-] +# very general, includes all metals covalently bound to carbon + + +# I.3: Two Carbon-Hetero Bonds (Carbonyl and Derivatives) +# ---------------------------- + +# I.3.1 Double Bond to Hetero + +Aldehyde: [$([CX3H][#6]),$([CX3H2])]=[OX1] +# hits aldehydes including formaldehyde + +Ketone: [#6][CX3](=[OX1])[#6] +# does not include oxo-groups connected to a (hetero-) aromatic ring + +Thioaldehyde: [$([CX3H][#6]),$([CX3H2])]=[SX1] + +Thioketone: [#6][CX3](=[SX1])[#6] +# does not include thioxo-groups connected to a (hetero-) aromatic ring + +Imine: [NX2;$([N][#6]),$([NH]);!$([N][CX3]=[#7,#8,#15,#16])]=[CX3;$([CH2]),$([CH][#6]),$([C]([#6])[#6])] +# nitrogen is not part of an amidelike strukture, nor of an aromatic ring, but can be part of an aminal or similar + +Immonium: [NX3+;!$([N][!#6]);!$([N][CX3]=[#7,#8,#15,#16])] + +Oxime: [NX2](=[CX3;$([CH2]),$([CH][#6]),$([C]([#6])[#6])])[OX2H] + +Oximether: [NX2](=[CX3;$([CH2]),$([CH][#6]),$([C]([#6])[#6])])[OX2][#6;!$(C=[#7,#8])] +# ether, not ester or amide; does not hit isoxazole + + +# I.3.2. Two Single Bonds to Hetero + +Acetal: [OX2]([#6;!$(C=[O,S,N])])[CX4;!$(C(O)(O)[!#6])][OX2][#6;!$(C=[O,S,N])] +# does not hit hydroxy-methylesters, ketenacetals, hemiacetals, orthoesters, etc. + +Hemiacetal: [OX2H][CX4;!$(C(O)(O)[!#6])][OX2][#6;!$(C=[O,S,N])] + +Aminal: [NX3v3;!$(NC=[#7,#8,#15,#16])]([#6])[CX4;!$(C(N)(N)[!#6])][NX3v3;!$(NC=[#7,#8,#15,#16])][#6] +# Ns are not part of an amide or similar. v3 ist to exclude nitro and similar groups + +Hemiaminal: [NX3v3;!$(NC=[#7,#8,#15,#16])]([#6])[CX4;!$(C(N)(N)[!#6])][OX2H] + +Thioacetal: [SX2]([#6;!$(C=[O,S,N])])[CX4;!$(C(S)(S)[!#6])][SX2][#6;!$(C=[O,S,N])] + +Thiohemiacetal: [SX2]([#6;!$(C=[O,S,N])])[CX4;!$(C(S)(S)[!#6])][OX2H] + +Halogen_acetal_like: [NX3v3,SX2,OX2;!$(*C=[#7,#8,#15,#16])][CX4;!$(C([N,S,O])([N,S,O])[!#6])][FX1,ClX1,BrX1,IX1] +# hits chloromethylenethers and other reactive alkylating agents + +Acetal_like: [NX3v3,SX2,OX2;!$(*C=[#7,#8,#15,#16])][CX4;!$(C([N,S,O])([N,S,O])[!#6])][FX1,ClX1,BrX1,IX1,NX3v3,SX2,OX2;!$(*C=[#7,#8,#15,#16])] +# includes all of the above and other combinations (S-C-N, hydrates, ...), but still no aminomethylenesters and similar + +Halogenmethylen_ester_and_similar: [NX3v3,SX2,OX2;$(**=[#7,#8,#15,#16])][CX4;!$(C([N,S,O])([N,S,O])[!#6])][FX1,ClX1,BrX1,IX1] +# also reactive alkylating agents. Acid does not have to be carboxylic acid, also S- and P-based acids allowed + +NOS_methylen_ester_and_similar: [NX3v3,SX2,OX2;$(**=[#7,#8,#15,#16])][CX4;!$(C([N,S,O])([N,S,O])[!#6])][NX3v3,SX2,OX2;!$(*C=[#7,#8,#15,#16])] +# Same as above, but N,O or S instead of halogen. Ester/amide allowed only on one side + +Hetero_methylen_ester_and_similar: [NX3v3,SX2,OX2;$(**=[#7,#8,#15,#16])][CX4;!$(C([N,S,O])([N,S,O])[!#6])][FX1,ClX1,BrX1,IX1,NX3v3,SX2,OX2;!$(*C=[#7,#8,#15,#16])] +# Combination of the last two patterns + +Cyanhydrine: [NX1]#[CX2][CX4;$([CH2]),$([CH]([CX2])[#6]),$(C([CX2])([#6])[#6])][OX2H] + + +# I.3.3 Single Bond to Hetero, C=C Double Bond (Enols and Similar) + +Chloroalkene: [ClX1][CX3]=[CX3] + +Fluoroalkene: [FX1][CX3]=[CX3] + +Bromoalkene: [BrX1][CX3]=[CX3] + +Iodoalkene: [IX1][CX3]=[CX3] + +Enol: [OX2H][CX3;$([H1]),$(C[#6])]=[CX3] +# no phenols + +Endiol: [OX2H][CX3;$([H1]),$(C[#6])]=[CX3;$([H1]),$(C[#6])][OX2H] +# no 1,2-diphenols, ketenacetals, ... + +Enolether: [OX2]([#6;!$(C=[N,O,S])])[CX3;$([H0][#6]),$([H1])]=[CX3] +# finds also endiodiethers, but not enolesters, no aromats + +Enolester: [OX2]([CX3]=[OX1])[#6X3;$([#6][#6]),$([H1])]=[#6X3;!$(C[OX2H])] + + +Enamine: [NX3;$([NH2][CX3]),$([NH1]([CX3])[#6]),$([N]([CX3])([#6])[#6]);!$([N]*=[#7,#8,#15,#16])][CX3;$([CH]),$([C][#6])]=[CX3] +# does not hit amines attached to aromatic rings, nor may the nitrogen be aromatic + +Thioenol: [SX2H][CX3;$([H1]),$(C[#6])]=[CX3] + +Thioenolether: [SX2]([#6;!$(C=[N,O,S])])[CX3;$(C[#6]),$([CH])]=[CX3] + + +# I.4: Three Carbon-Hetero Bonds (Carboxyl and Derivatives) +# ------------------------------ + +Acylchloride: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[ClX1] + +Acylfluoride: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[FX1] + +Acylbromide: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[BrX1] + +Acyliodide: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[IX1] + +Acylhalide: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[FX1,ClX1,BrX1,IX1] +# all of the above + + +# The following contains all simple carboxylic combinations of O, N, S, & Hal - +# - acids, esters, amides, ... as well as a few extra cases (anhydride, hydrazide...) +# Cyclic structures (including aromats) like lactones, lactames, ... got their own +# definitions. Structures where both heteroatoms are part of an aromatic ring +# (oxazoles, imidazoles, ...) were excluded. + +Carboxylic_acid: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[$([OX2H]),$([OX1-])] +# includes carboxylate anions + +Carboxylic_ester: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[OX2][#6;!$(C=[O,N,S])] +# does not hit anhydrides or lactones + +Lactone: [#6][#6X3R](=[OX1])[#8X2][#6;!$(C=[O,N,S])] +# may also be aromatic + +Carboxylic_anhydride: [CX3;$([H0][#6]),$([H1])](=[OX1])[#8X2][CX3;$([H0][#6]),$([H1])](=[OX1]) +# anhydride formed by two carboxylic acids, no mixed anhydrides (e.g. between carboxylic acid and sulfuric acid); may be part of a ring, even aromatic + +Carboxylic_acid_derivative: [$([#6X3H0][#6]),$([#6X3H])](=[!#6])[!#6] +# includes most of the structures of I.4 and many more, also 1,3-heteroaromatics such as isoxazole + +Carbothioic_acid: [CX3;!R;$([C][#6]),$([CH]);$([C](=[OX1])[$([SX2H]),$([SX1-])]),$([C](=[SX1])[$([OX2H]),$([OX1-])])] +# hits both tautomeric forms, as well as anions + +Carbothioic_S_ester: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[SX2][#6;!$(C=[O,N,S])] + +Carbothioic_S_lactone: [#6][#6X3R](=[OX1])[#16X2][#6;!$(C=[O,N,S])] +# may also be aromatic + +Carbothioic_O_ester: [CX3;$([H0][#6]),$([H1])](=[SX1])[OX2][#6;!$(C=[O,N,S])] + +Carbothioic_O_lactone: [#6][#6X3R](=[SX1])[#8X2][#6;!$(C=[O,N,S])] + +Carbothioic_halide: [CX3;$([H0][#6]),$([H1])](=[SX1])[FX1,ClX1,BrX1,IX1] + +Carbodithioic_acid: [CX3;!R;$([C][#6]),$([CH]);$([C](=[SX1])[SX2H])] + +Carbodithioic_ester: [CX3;!R;$([C][#6]),$([CH]);$([C](=[SX1])[SX2][#6;!$(C=[O,N,S])])] + +Carbodithiolactone: [#6][#6X3R](=[SX1])[#16X2][#6;!$(C=[O,N,S])] + + +Amide: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] +# does not hit lactames + +Primary_amide: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[NX3H2] + +Secondary_amide: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[#7X3H1][#6;!$(C=[O,N,S])] + +Tertiary_amide: [CX3;$([R0][#6]),$([H1R0])](=[OX1])[#7X3H0]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])] + +Lactam: [#6R][#6X3R](=[OX1])[#7X3;$([H1][#6;!$(C=[O,N,S])]),$([H0]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] +# cyclic amides, may also be aromatic + +Alkyl_imide: [#6X3;$([H0][#6]),$([H1])](=[OX1])[#7X3H0]([#6])[#6X3;$([H0][#6]),$([H1])](=[OX1]) +# may be part of a ring, even aromatic. only C allowed at central N. May also be triacyl amide + +N_hetero_imide: [#6X3;$([H0][#6]),$([H1])](=[OX1])[#7X3H0]([!#6])[#6X3;$([H0][#6]),$([H1])](=[OX1]) +# everything else than H or C at central N + +Imide_acidic: [#6X3;$([H0][#6]),$([H1])](=[OX1])[#7X3H1][#6X3;$([H0][#6]),$([H1])](=[OX1]) +# can be deprotonated + +Thioamide: [$([CX3;!R][#6]),$([CX3H;!R])](=[SX1])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] +# does not hit thiolactames + +Thiolactam: [#6R][#6X3R](=[SX1])[#7X3;$([H1][#6;!$(C=[O,N,S])]),$([H0]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] +# cyclic thioamides, may also be aromatic + + +Oximester: [#6X3;$([H0][#6]),$([H1])](=[OX1])[#8X2][#7X2]=,:[#6X3;$([H0]([#6])[#6]),$([H1][#6]),$([H2])] +# may also be part of a ring / aromatic + +Amidine: [NX3;!$(NC=[O,S])][CX3;$([CH]),$([C][#6])]=[NX2;!$(NC=[O,S])] +# only basic amidines, not as part of aromatic ring (e.g. imidazole) + +Hydroxamic_acid: [CX3;$([H0][#6]),$([H1])](=[OX1])[#7X3;$([H1]),$([H0][#6;!$(C=[O,N,S])])][$([OX2H]),$([OX1-])] + +Hydroxamic_acid_ester: [CX3;$([H0][#6]),$([H1])](=[OX1])[#7X3;$([H1]),$([H0][#6;!$(C=[O,N,S])])][OX2][#6;!$(C=[O,N,S])] +# does not hit anhydrides of carboxylic acids withs hydroxamic acids + + +Imidoacid: [CX3R0;$([H0][#6]),$([H1])](=[NX2;$([H1]),$([H0][#6;!$(C=[O,N,S])])])[$([OX2H]),$([OX1-])] +# not cyclic + +Imidoacid_cyclic: [#6R][#6X3R](=,:[#7X2;$([H1]),$([H0][#6;!$(C=[O,N,S])])])[$([OX2H]),$([OX1-])] +# the enamide-form of lactames. may be aromatic like 2-hydroxypyridine + +Imidoester: [CX3R0;$([H0][#6]),$([H1])](=[NX2;$([H1]),$([H0][#6;!$(C=[O,N,S])])])[OX2][#6;!$(C=[O,N,S])] +# esters of the above structures. no anhydrides. + +Imidolactone: [#6R][#6X3R](=,:[#7X2;$([H1]),$([H0][#6;!$(C=[O,N,S])])])[OX2][#6;!$(C=[O,N,S])] +# no oxazoles and similar + +Imidothioacid: [CX3R0;$([H0][#6]),$([H1])](=[NX2;$([H1]),$([H0][#6;!$(C=[O,N,S])])])[$([SX2H]),$([SX1-])] +# not cyclic + +Imidothioacid_cyclic: [#6R][#6X3R](=,:[#7X2;$([H1]),$([H0][#6;!$(C=[O,N,S])])])[$([SX2H]),$([SX1-])] +# the enamide-form of thiolactames. may be aromatic like 2-thiopyridine + +Imidothioester: [CX3R0;$([H0][#6]),$([H1])](=[NX2;$([H1]),$([H0][#6;!$(C=[O,N,S])])])[SX2][#6;!$(C=[O,N,S])] +# thioesters of the above structures. no anhydrides. + +Imidothiolactone: [#6R][#6X3R](=,:[#7X2;$([H1]),$([H0][#6;!$(C=[O,N,S])])])[SX2][#6;!$(C=[O,N,S])] +# no thioxazoles and similar + +Amidine: [#7X3v3;!$(N([#6X3]=[#7X2])C=[O,S])][CX3R0;$([H1]),$([H0][#6])]=[NX2v3;!$(N(=[#6X3][#7X3])C=[O,S])] +# only basic amidines, not substituted by carbonyl or thiocarbonyl, not as part of a ring + +Imidolactam: [#6][#6X3R;$([H0](=[NX2;!$(N(=[#6X3][#7X3])C=[O,S])])[#7X3;!$(N([#6X3]=[#7X2])C=[O,S])]),$([H0](-[NX3;!$(N([#6X3]=[#7X2])C=[O,S])])=,:[#7X2;!$(N(=[#6X3][#7X3])C=[O,S])])] +# one of the two C~N bonds is part of a ring (may be aromatic), but not both - thus no imidazole + +Imidoylhalide: [CX3R0;$([H0][#6]),$([H1])](=[NX2;$([H1]),$([H0][#6;!$(C=[O,N,S])])])[FX1,ClX1,BrX1,IX1] +# not cyclic + +Imidoylhalide_cyclic: [#6R][#6X3R](=,:[#7X2;$([H1]),$([H0][#6;!$(C=[O,N,S])])])[FX1,ClX1,BrX1,IX1] +# may also be aromatic + +# may be ring, aromatic, substituted with carbonyls, hetero, ... +# (everything else would get too complicated) + +Amidrazone: [$([$([#6X3][#6]),$([#6X3H])](=[#7X2v3])[#7X3v3][#7X3v3]),$([$([#6X3][#6]),$([#6X3H])]([#7X3v3])=[#7X2v3][#7X3v3])] +# hits both tautomers. as above, it may be ring, aromatic, substituted with carbonyls, hetero, ... + + +Alpha_aminoacid: [NX3,NX4+;!$([N]~[!#6]);!$([N]*~[#7,#8,#15,#16])][C][CX3](=[OX1])[OX2H,OX1-] +# N may be alkylated, but not part of an amide (as in peptides), ionic forms are included +# includes also non-natural aminoacids with double-bonded or two aliph./arom. substituents at alpha-C +# N may not be aromatic as in 1H-pyrrole-2-carboxylic acid + +Alpha_hydroxyacid: [OX2H][C][CX3](=[OX1])[OX2H,OX1-] + +Peptide_middle: [NX3;$([N][CX3](=[OX1])[C][NX3,NX4+])][C][CX3](=[OX1])[NX3;$([N][C][CX3](=[OX1])[NX3,OX2,OX1-])] +# finds peptidic structures which are neither C- nor N-terminal. Both neighbours must be amino-acids/peptides + +Peptide_C_term: [NX3;$([N][CX3](=[OX1])[C][NX3,NX4+])][C][CX3](=[OX1])[OX2H,OX1-] +# finds C-terminal amino acids + +Peptide_N_term: [NX3,NX4+;!$([N]~[!#6]);!$([N]*~[#7,#8,#15,#16])][C][CX3](=[OX1])[NX3;$([N][C][CX3](=[OX1])[NX3,OX2,OX1-])] +# finds N-terminal amino acids. As above, N may be substituted, but not part of an amide-bond. + + +Carboxylic_orthoester: [#6][OX2][CX4;$(C[#6]),$([CH])]([OX2][#6])[OX2][#6] +# hits also anhydride like struktures (e. g. HC(OMe)2-OC=O residues) + +Ketene: [CX3]=[CX2]=[OX1] + +Ketenacetal: [#7X2,#8X3,#16X2;$(*[#6,#14])][#6X3]([#7X2,#8X3,#16X2;$(*[#6,#14])])=[#6X3] +# includes aminals, silylacetals, ketenesters, etc. C=C DB is not aromatic, everything else may be + +Nitrile: [NX1]#[CX2] +# includes cyanhydrines + +Isonitrile: [CX1-]#[NX2+] + + +Vinylogous_carbonyl_or_carboxyl_derivative: [#6X3](=[OX1])[#6X3]=,:[#6X3][#7,#8,#16,F,Cl,Br,I] +# may be part of a ring, even aromatic + +Vinylogous_acid: [#6X3](=[OX1])[#6X3]=,:[#6X3][$([OX2H]),$([OX1-])] + +Vinylogous_ester: [#6X3](=[OX1])[#6X3]=,:[#6X3][#6;!$(C=[O,N,S])] + +Vinylogous_amide: [#6X3](=[OX1])[#6X3]=,:[#6X3][#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Vinylogous_halide: [#6X3](=[OX1])[#6X3]=,:[#6X3][FX1,ClX1,BrX1,IX1] + + + +# I.5: Four Carbon-Hetero Bonds (Carbonic Acid and Derivatives) +# ----------------------------- + +Carbonic_acid_dieester: [#6;!$(C=[O,N,S])][#8X2][#6X3](=[OX1])[#8X2][#6;!$(C=[O,N,S])] +# may be part of a ring, even aromatic + +Carbonic_acid_esterhalide: [#6;!$(C=[O,N,S])][OX2;!R][CX3](=[OX1])[OX2][FX1,ClX1,BrX1,IX1] + +Carbonic_acid_monoester: [#6;!$(C=[O,N,S])][OX2;!R][CX3](=[OX1])[$([OX2H]),$([OX1-])] +# unstable + +Carbonic_acid_derivatives: [!#6][#6X3](=[!#6])[!#6] + + +Thiocarbonic_acid_dieester: [#6;!$(C=[O,N,S])][#8X2][#6X3](=[SX1])[#8X2][#6;!$(C=[O,N,S])] +# may be part of a ring, even aromatic + +Thiocarbonic_acid_esterhalide: [#6;!$(C=[O,N,S])][OX2;!R][CX3](=[SX1])[OX2][FX1,ClX1,BrX1,IX1] + +Thiocarbonic_acid_monoester: [#6;!$(C=[O,N,S])][OX2;!R][CX3](=[SX1])[$([OX2H]),$([OX1-])] + + +Urea:[#7X3;!$([#7][!#6])][#6X3](=[OX1])[#7X3;!$([#7][!#6])] +# no check whether part of imide, biuret, etc. Aromatic structures are only hit if +# both N share no double bonds, like in the dioxo-form of uracil + +Thiourea: [#7X3;!$([#7][!#6])][#6X3](=[SX1])[#7X3;!$([#7][!#6])] + +Isourea: [#7X2;!$([#7][!#6])]=,:[#6X3]([#8X2&!$([#8][!#6]),OX1-])[#7X3;!$([#7][!#6])] +# O may be substituted. no check whether further amide-like bonds are present. Aromatic +# structures are only hit if single bonded N shares no additional double bond, like in +# the 1-hydroxy-3-oxo form of uracil + +Isothiourea: [#7X2;!$([#7][!#6])]=,:[#6X3]([#16X2&!$([#16][!#6]),SX1-])[#7X3;!$([#7][!#6])] + +Guanidine: [N;v3X3,v4X4+][CX3](=[N;v3X2,v4X3+])[N;v3X3,v4X4+] +# also hits guanidinium salts. v3 and v4 to avoid nitroamidines + +Carbaminic_acid: [NX3]C(=[OX1])[O;X2H,X1-] +# quite unstable, unlikely to be found. Also hits salts + +Urethan: [#7X3][#6](=[OX1])[#8X2][#6] +# also hits when part of a ring, no check whether the last C is part of carbonyl + +Biuret: [#7X3][#6](=[OX1])[#7X3][#6](=[OX1])[#7X3] + +Semicarbazide: [#7X3][#7X3][#6X3]([#7X3;!$([#7][#7])])=[OX1] + +Carbazide: [#7X3][#7X3][#6X3]([#7X3][#7X3])=[OX1] + +Semicarbazone: [#7X2](=[#6])[#7X3][#6X3]([#7X3;!$([#7][#7])])=[OX1] + +Carbazone: [#7X2](=[#6])[#7X3][#6X3]([#7X3][#7X3])=[OX1] + +Thiosemicarbazide: [#7X3][#7X3][#6X3]([#7X3;!$([#7][#7])])=[SX1] + +Thiocarbazide: [#7X3][#7X3][#6X3]([#7X3][#7X3])=[SX1] + +Thiosemicarbazone: [#7X2](=[#6])[#7X3][#6X3]([#7X3;!$([#7][#7])])=[SX1] + +Thiocarbazone: [#7X2](=[#6])[#7X3][#6X3]([#7X3][#7X3])=[SX1] + + +Isocyanate: [NX2]=[CX2]=[OX1] + +Cyanate: [OX2][CX2]#[NX1] + +Isothiocyanate: [NX2]=[CX2]=[SX1] + +Thiocyanate: [SX2][CX2]#[NX1] + +Carbodiimide: [NX2]=[CX2]=[NX2] + +Orthocarbonic_derivatives: [CX4H0]([O,S,#7])([O,S,#7])([O,S,#7])[O,S,#7,F,Cl,Br,I] +# halogen allowed just once, to avoid mapping to -OCF3 and similar groups (much more +# stable as for example C(OCH3)4) + + +# I.6 Aromatics +# ------------- + +# I know that this classification is not very logical, arylamines are found under I.2 ... + +Phenol: [OX2H][c] + +1,2-Diphenol: [OX2H][c][c][OX2H] + +Arylchloride: [Cl][c] + +Arylfluoride: [F][c] + +Arylbromide: [Br][c] + +Aryliodide: [I][c] + +Arylthiol: [SX2H][c] + +Iminoarene: [c]=[NX2;$([H1]),$([H0][#6;!$([C]=[N,S,O])])] +# N may be substituted with H or C, but not carbonyl or similar +# aromatic atom is always C, not S or P (these are not planar when substituted) + +Oxoarene: [c]=[OX1] + +Thioarene: [c]=[SX1] + +Hetero_N_basic_H: [nX3H1+0] +# as in pyrole. uncharged to exclude pyridinium ions + +Hetero_N_basic_no_H: [nX3H0+0] +# as in N-methylpyrole. uncharged to exclude pyridinium ions + +Hetero_N_nonbasic: [nX2,nX3+] +# as in pyridine, pyridinium + +Hetero_O: [o] + +Hetero_S: [sX2] +# X2 because Daylight's depictmatch falsely describes C1=CS(=O)C=C1 as aromatic +# (is not planar because of lonepair at S) + +Heteroaromatic: [a;!c] + + +# Part II: N, S, P, Si, B +# ======================= + + +# II.1 Nitrogen +# ------------- + +Nitrite: [NX2](=[OX1])[O;$([X2]),$([X1-])] +# hits nitrous acid, its anion, esters, and other O-substituted derivatives + +Thionitrite: [SX2][NX2]=[OX1] + +Nitrate: [$([NX3](=[OX1])(=[OX1])[O;$([X2]),$([X1-])]),$([NX3+]([OX1-])(=[OX1])[O;$([X2]),$([X1-])])] +# hits nitric acid, its anion, esters, and other O-substituted derivatives + +Nitro: [$([NX3](=O)=O),$([NX3+](=O)[O-])][!#8] +# hits nitro groups attached to C,N, ... but not nitrates + +Nitroso: [NX2](=[OX1])[!#7;!#8] +# no nitrites, no nitrosamines + +Azide: [NX1]~[NX2]~[NX2,NX1] +# hits both mesomeric forms, also anion + +Acylazide: [CX3](=[OX1])[NX2]~[NX2]~[NX1] + +Diazo: [$([#6]=[NX2+]=[NX1-]),$([#6-]-[NX2+]#[NX1])] + +Diazonium: [#6][NX2+]#[NX1] + +Nitrosamine: [#7;!$(N*=O)][NX2]=[OX1] + +Nitrosamide: [NX2](=[OX1])N-*=O +# includes nitrososulfonamides + +N-Oxide: [$([#7+][OX1-]),$([#7v5]=[OX1]);!$([#7](~[O])~[O]);!$([#7]=[#7])] +# Hits both forms. Won't hit azoxy, nitro, nitroso, or nitrate. + + +Hydrazine: [NX3;$([H2]),$([H1][#6]),$([H0]([#6])[#6]);!$(NC=[O,N,S])][NX3;$([H2]),$([H1][#6]),$([H0]([#6])[#6]);!$(NC=[O,N,S])] +# no hydrazides + +Hydrazone: [NX3;$([H2]),$([H1][#6]),$([H0]([#6])[#6]);!$(NC=[O,N,S])][NX2]=[#6] + +Hydroxylamine: [NX3;$([H2]),$([H1][#6]),$([H0]([#6])[#6]);!$(NC=[O,N,S])][OX2;$([H1]),$(O[#6;!$(C=[N,O,S])])] +# no discrimination between O-, N-, and O,N-substitution + + +# II.2 Sulfur +# ----------- + +Sulfon: [$([SX4](=[OX1])(=[OX1])([#6])[#6]),$([SX4+2]([OX1-])([OX1-])([#6])[#6])] +# can't be aromatic, thus S and not #16 + +Sulfoxide: [$([SX3](=[OX1])([#6])[#6]),$([SX3+]([OX1-])([#6])[#6])] + +Sulfonium: [S+;!$([S]~[!#6]);!$([S]*~[#7,#8,#15,#16])] +# can't be aromatic, thus S and not #16 + +Sulfuric_acid: [SX4](=[OX1])(=[OX1])([$([OX2H]),$([OX1-])])[$([OX2H]),$([OX1-])] +# includes anions + +Sulfuric_monoester: [SX4](=[OX1])(=[OX1])([$([OX2H]),$([OX1-])])[OX2][#6;!$(C=[O,N,S])] + +Sulfuric_diester: [SX4](=[OX1])(=[OX1])([OX2][#6;!$(C=[O,N,S])])[OX2][#6;!$(C=[O,N,S])] + +Sulfuric_monoamide: [SX4](=[OX1])(=[OX1])([#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])])[$([OX2H]),$([OX1-])] + +Sulfuric_diamide: [SX4](=[OX1])(=[OX1])([#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Sulfuric_esteramide: [SX4](=[OX1])(=[OX1])([#7X3][#6;!$(C=[O,N,S])])[OX2][#6;!$(C=[O,N,S])] + +Sulfuric_derivative: [SX4D4](=[!#6])(=[!#6])([!#6])[!#6] +# everything else (would not be a "true" derivative of sulfuric acid, if one of the substituents were less electronegative +# than sulfur, but this should be very very rare, anyway) + + + +#### sulfurous acid and derivatives missing!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + + +Sulfonic_acid: [SX4;$([H1]),$([H0][#6])](=[OX1])(=[OX1])[$([OX2H]),$([OX1-])] + +Sulfonamide: [SX4;$([H1]),$([H0][#6])](=[OX1])(=[OX1])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Sulfonic_ester: [SX4;$([H1]),$([H0][#6])](=[OX1])(=[OX1])[OX2][#6;!$(C=[O,N,S])] + +Sulfonic_halide: [SX4;$([H1]),$([H0][#6])](=[OX1])(=[OX1])[FX1,ClX1,BrX1,IX1] + +Sulfonic_derivative: [SX4;$([H1]),$([H0][#6])](=[!#6])(=[!#6])[!#6] +# includes all of the above and many more +# for comparison: this is what "all sulfonic derivatives but not the ones above" would look like: +# [$([SX4;$([H1]),$([H0][#6])](=[!#6])(=[!#6;!O])[!#6]),$([SX4;$([H1]),$([H0][#6])](=[OX1])(=[OX1])[!$([FX1,ClX1,BrX1,IX1]);!$([#6]);!$([OX2H]);!$([OX1-]);!$([OX2][#6;!$(C=[O,N,S])]);!$([#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])])])] + + +Sulfinic_acid: [SX3;$([H1]),$([H0][#6])](=[OX1])[$([OX2H]),$([OX1-])] + +Sulfinic_amide: [SX3;$([H1]),$([H0][#6])](=[OX1])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Sulfinic_ester: [SX3;$([H1]),$([H0][#6])](=[OX1])[OX2][#6;!$(C=[O,N,S])] + +Sulfinic_halide: [SX3;$([H1]),$([H0][#6])](=[OX1])[FX1,ClX1,BrX1,IX1] + +Sulfinic_derivative: [SX3;$([H1]),$([H0][#6])](=[!#6])[!#6] + +Sulfenic_acid: [SX2;$([H1]),$([H0][#6])][$([OX2H]),$([OX1-])] + +Sulfenic_amide: [SX2;$([H1]),$([H0][#6])][#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Sulfenic_ester: [SX2;$([H1]),$([H0][#6])][OX2][#6;!$(C=[O,N,S])] + +Sulfenic_halide: [SX2;$([H1]),$([H0][#6])][FX1,ClX1,BrX1,IX1] + +Sulfenic_derivative: [SX2;$([H1]),$([H0][#6])][!#6] + + +# II.3 Phosphorous +# ---------------- + +Phosphine: [PX3;$([H3]),$([H2][#6]),$([H1]([#6])[#6]),$([H0]([#6])([#6])[#6])] +# similar to amine, but less restrictive: includes also amide- and aminal-analogues + +Phosphine_oxide: [PX4;$([H3]=[OX1]),$([H2](=[OX1])[#6]),$([H1](=[OX1])([#6])[#6]),$([H0](=[OX1])([#6])([#6])[#6])] + +Phosphonium: [P+;!$([P]~[!#6]);!$([P]*~[#7,#8,#15,#16])] +# similar to Ammonium + +Phosphorylen: [PX4;$([H3]=[CX3]),$([H2](=[CX3])[#6]),$([H1](=[CX3])([#6])[#6]),$([H0](=[CX3])([#6])([#6])[#6])] + + +# conventions for the following acids and derivatives: +# acids find protonated and deprotonated acids +# esters do not find mixed anhydrides ( ...P-O-C(=O)) +# derivatives: subtituents which go in place of the OH and =O are not H or C (may also be O, +# thus including acids and esters) + +Phosphonic_acid: [PX4;$([H1]),$([H0][#6])](=[OX1])([$([OX2H]),$([OX1-])])[$([OX2H]),$([OX1-])] +# includes anions + +Phosphonic_monoester: [PX4;$([H1]),$([H0][#6])](=[OX1])([$([OX2H]),$([OX1-])])[OX2][#6;!$(C=[O,N,S])] + +Phosphonic_diester: [PX4;$([H1]),$([H0][#6])](=[OX1])([OX2][#6;!$(C=[O,N,S])])[OX2][#6;!$(C=[O,N,S])] + +Phosphonic_monoamide: [PX4;$([H1]),$([H0][#6])](=[OX1])([$([OX2H]),$([OX1-])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphonic_diamide: [PX4;$([H1]),$([H0][#6])](=[OX1])([#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphonic_esteramide: [PX4;$([H1]),$([H0][#6])](=[OX1])([OX2][#6;!$(C=[O,N,S])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphonic_acid_derivative: [PX4;$([H1]),$([H0][#6])](=[!#6])([!#6])[!#6] +# all of the above and much more + + +Phosphoric_acid: [PX4D4](=[OX1])([$([OX2H]),$([OX1-])])([$([OX2H]),$([OX1-])])[$([OX2H]),$([OX1-])] +# includes anions + +Phosphoric_monoester: [PX4D4](=[OX1])([$([OX2H]),$([OX1-])])([$([OX2H]),$([OX1-])])[OX2][#6;!$(C=[O,N,S])] + +Phosphoric_diester: [PX4D4](=[OX1])([$([OX2H]),$([OX1-])])([OX2][#6;!$(C=[O,N,S])])[OX2][#6;!$(C=[O,N,S])] + +Phosphoric_triester: [PX4D4](=[OX1])([OX2][#6;!$(C=[O,N,S])])([OX2][#6;!$(C=[O,N,S])])[OX2][#6;!$(C=[O,N,S])] + +Phosphoric_monoamide: [PX4D4](=[OX1])([$([OX2H]),$([OX1-])])([$([OX2H]),$([OX1-])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphoric_diamide: [PX4D4](=[OX1])([$([OX2H]),$([OX1-])])([#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphoric_triamide: [PX4D4](=[OX1])([#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])])([#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphoric_monoestermonoamide: [PX4D4](=[OX1])([$([OX2H]),$([OX1-])])([OX2][#6;!$(C=[O,N,S])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphoric_diestermonoamide: [PX4D4](=[OX1])([OX2][#6;!$(C=[O,N,S])])([OX2][#6;!$(C=[O,N,S])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphoric_monoesterdiamide: [PX4D4](=[OX1])([OX2][#6;!$(C=[O,N,S])])([#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphoric_acid_derivative: [PX4D4](=[!#6])([!#6])([!#6])[!#6] + + +Phosphinic_acid: [PX4;$([H2]),$([H1][#6]),$([H0]([#6])[#6])](=[OX1])[$([OX2H]),$([OX1-])] + +Phosphinic_ester: [PX4;$([H2]),$([H1][#6]),$([H0]([#6])[#6])](=[OX1])[OX2][#6;!$(C=[O,N,S])] + +Phosphinic_amide: [PX4;$([H2]),$([H1][#6]),$([H0]([#6])[#6])](=[OX1])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphinic_acid_derivative: [PX4;$([H2]),$([H1][#6]),$([H0]([#6])[#6])](=[!#6])[!#6] + + +Phosphonous_acid: [PX3;$([H1]),$([H0][#6])]([$([OX2H]),$([OX1-])])[$([OX2H]),$([OX1-])] + +Phosphonous_monoester: [PX3;$([H1]),$([H0][#6])]([$([OX2H]),$([OX1-])])[OX2][#6;!$(C=[O,N,S])] + +Phosphonous_diester: [PX3;$([H1]),$([H0][#6])]([OX2][#6;!$(C=[O,N,S])])[OX2][#6;!$(C=[O,N,S])] + +Phosphonous_monoamide: [PX3;$([H1]),$([H0][#6])]([$([OX2H]),$([OX1-])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphonous_diamide: [PX3;$([H1]),$([H0][#6])]([#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphonous_esteramide: [PX3;$([H1]),$([H0][#6])]([OX2][#6;!$(C=[O,N,S])])[#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphonous_derivatives: [PX3;$([D2]),$([D3][#6])]([!#6])[!#6] + + +Phosphinous_acid: [PX3;$([H2]),$([H1][#6]),$([H0]([#6])[#6])][$([OX2H]),$([OX1-])] + +Phosphinous_ester: [PX3;$([H2]),$([H1][#6]),$([H0]([#6])[#6])][OX2][#6;!$(C=[O,N,S])] + +Phosphinous_amide: [PX3;$([H2]),$([H1][#6]),$([H0]([#6])[#6])][#7X3;$([H2]),$([H1][#6;!$(C=[O,N,S])]),$([#7]([#6;!$(C=[O,N,S])])[#6;!$(C=[O,N,S])])] + +Phosphinous_derivatives: [PX3;$([H2]),$([H1][#6]),$([H0]([#6])[#6])][!#6] + + +# II.4 Silicon +# ------------ + +Quart_silane: [SiX4]([#6])([#6])([#6])[#6] +# four C-substituents. non-reactive, non-toxic, in experimental phase for drug development + +Non-quart_silane: [SiX4;$([H1]([#6])([#6])[#6]),$([H2]([#6])[#6]),$([H3][#6]),$([H4])] +# has 1-4 hydride(s), reactive. Daylight's depictmatch does not add hydrogens automatically to +# the free positions at Si, thus Hs had to be added implicitly + +Silylmonohalide: [SiX4]([FX1,ClX1,BrX1,IX1])([#6])([#6])[#6] +# reagents for inserting protection groups + +Het_trialkylsilane: [SiX4]([!#6])([#6])([#6])[#6] +# mostly acid-labile protection groups such as trimethylsilyl-ethers + +Dihet_dialkylsilane: [SiX4]([!#6])([!#6])([#6])[#6] + +Trihet_alkylsilane: [SiX4]([!#6])([!#6])([!#6])[#6] + +Silicic_acid_derivative: [SiX4]([!#6])([!#6])([!#6])[!#6] +# four substituent which are neither C nor H + + +# II.5 Boron +# ---------- + +Trialkylborane: [BX3]([#6])([#6])[#6] +# also carbonyls allowed + +Boric_acid_derivatives: [BX3]([!#6])([!#6])[!#6] +# includes acids, esters, amides, ... H-substituent at B is very rare. + +Boronic_acid_derivative: [BX3]([!#6])([!#6])[!#6] +# # includes acids, esters, amides, ... + +Borohydride: [BH1,BH2,BH3,BH4] +# at least one H attached to B + +Quaternary_boron: [BX4] +# mostly borates (negative charge), in complex with Lewis-base + + + +# Part III: Some Special Patterns +# =============================== + + +# III.1 Chains +# ------------ + +# some simple chains + + + +# III.2 Rings +# ----------- + +Aromatic: a + +Heterocyclic: [!#6;!R0] +# may be aromatic or not + +Epoxide: [OX2r3]1[#6r3][#6r3]1 +# toxic/reactive. may be annelated to aromat, but must not be aromatic itself (oxirane-2,3-dione) + +NH_aziridine: [NX3H1r3]1[#6r3][#6r3]1 +# toxic/reactive according to Maybridge's garbage filter + +Spiro: [D4R;$(*(@*)(@*)(@*)@*)] +# at least two different rings can be found which are sharing just one atom. +# these two rings can be connected by a third ring, so it matches also some +# bridged systems, like morphine + +Annelated_rings: [R;$(*(@*)(@*)@*);!$([R2;$(*(@*)(@*)(@*)@*)])]@[R;$(*(@*)(@*)@*);!$([R2;$(*(@*)(@*)(@*)@*)])] +# two different rings sharing exactly two atoms + +Bridged_rings: [R;$(*(@*)(@*)@*);!$([D4R;$(*(@*)(@*)(@*)@*)]);!$([R;$(*(@*)(@*)@*);!$([R2;$(*(@*)(@*)(@*)@*)])]@[R;$(*(@*)(@*)@*);!$([R2;$(*(@*)(@*)(@*)@*)])])] +# part of two or more rings, not spiro, not annelated -> finds bridgehead atoms, +# but only if they are not annelated at the same time - otherwise impossible (?) +# to distinguish from non-bridgehead annelated atoms + +# some basic ring-patterns (just size, no other information): + + + + + +# III.3 Sugars and Nucleosides/Nucleotides, Steroids +# -------------------------------------------------- + +# because of the large variety of sugar derivatives, different patterns can be applied. +# The choice of patterns and their combinations will depend on the contents of the database +# e.g. natural products, nucleoside analoges with modified sugars, ... as well as on the +# desired restriction + + +Sugar_pattern_1: [OX2;$([r5]1@C@C@C(O)@C1),$([r6]1@C@C@C(O)@C(O)@C1)] +# 5 or 6-membered ring containing one O and at least one (r5) or two (r6) oxygen-substituents. + +Sugar_pattern_2: [OX2;$([r5]1@C(!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C@C1),$([r6]1@C(!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C@C@C1)] +# 5 or 6-membered ring containing one O and an acetal-like bond at postion 2. + +Sugar_pattern_combi: [OX2;$([r5]1@C(!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C(O)@C1),$([r6]1@C(!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C(O)@C(O)@C1)] +# combination of the two above + +Sugar_pattern_2_reducing: [OX2;$([r5]1@C(!@[OX2H1])@C@C@C1),$([r6]1@C(!@[OX2H1])@C@C@C@C1)] +# 5 or 6-membered cyclic hemi-acetal + +Sugar_pattern_2_alpha: [OX2;$([r5]1@[C@@](!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C@C1),$([r6]1@[C@@](!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C@C@C1)] +# 5 or 6-membered cyclic hemi-acetal + +Sugar_pattern_2_beta: [OX2;$([r5]1@[C@](!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C@C1),$([r6]1@[C@](!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C@C@C1)] +# 5 or 6-membered cyclic hemi-acetal + +##Poly_sugar_1: ([OX2;$([r5]1@C@C@C(O)@C1),$([r6]1@C@C@C(O)@C(O)@C1)].[OX2;$([r5]1@C@C@C(O)@C1),$([r6]1@C@C@C(O)@C(O)@C1)]) +# pattern1 occours more than once (in same molecule, but moieties don't have to be adjacent!) + +##Poly_sugar_2: ([OX2;$([r5]1@C(!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C@C1),$([r6]1@C(!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C@C@C1)].[OX2;$([r5]1@C(!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C@C1),$([r6]1@C(!@[OX2,NX3,SX2,FX1,ClX1,BrX1,IX1])@C@C@C@C1)]) +# pattern2 occours more than once (in same molecule, but moieties don't have to be adjacent!) + + +# III.4 Everything else... +# ------------------------ + +Conjugated_double_bond: *=*[*]=,#,:[*] + +Conjugated_tripple_bond: *#*[*]=,#,:[*] + +Cis_double_bond: */[D2]=[D2]\* +# only one single-bonded substituent on each DB-atom. no aromats. +# only found when character of DB is explicitely stated. + +Trans_double_bond: */[D2]=[D2]/* +# analog + +Mixed_anhydrides: [$(*=O),$([#16,#14,#5]),$([#7]([#6]=[OX1]))][#8X2][$(*=O),$([#16,#14,#5]),$([#7]([#6]=[OX1]))] +# should hits all combinations of two acids + +Halogen_on_hetero: [FX1,ClX1,BrX1,IX1][!#6] + +Halogen_multi_subst: [F,Cl,Br,I;!$([X1]);!$([X0-])] +# Halogen which is not mono-substituted nor an anion, e.g. chlorate. +# Most of these cases should be also filtered by Halogen_on_hetero. + +Trifluoromethyl: [FX1][CX4;!$([H0][Cl,Br,I]);!$([F][C]([F])([F])[F])]([FX1])([FX1]) +# C with three F attached, connected to anything which is not another halogen + +C_ONS_bond: [#6]~[#7,#8,#16] +# probably all drug-like molecules have at least one O, N, or S connected to a C -> nice filter + +## Mixture: (*).(*) +# two or more seperate parts, may also be salt +# component-level grouping is not yet supported in Open Babel Version 2.0 + + +Charged: [!+0] + +Anion: [-1,-2,-3,-4,-5,-6,-7] + +Kation: [+1,+2,+3,+4,+5,+6,+7] + +Salt: ([-1,-2,-3,-4,-5,-6,-7]).([+1,+2,+3,+4,+5,+6,+7]) +# two or more seperate components with opposite charges + +##Zwitterion: ([-1,-2,-3,-4,-5,-6,-7].[+1,+2,+3,+4,+5,+6,+7]) +# both negative and positive charges somewhere within the same molecule. + +1,3-Tautomerizable: [$([#7X2,OX1,SX1]=*[!H0;!$([a;!n])]),$([#7X3,OX2,SX2;!H0]*=*),$([#7X3,OX2,SX2;!H0]*:n)] +# 1,3 migration of H allowed. Includes keto/enol and amide/enamide. +# Aromatic rings must stay aromatic - no keto form of phenol + +1,5-Tautomerizable: [$([#7X2,OX1,SX1]=,:**=,:*[!H0;!$([a;!n])]),$([#7X3,OX2,SX2;!H0]*=**=*),$([#7X3,OX2,SX2;!H0]*=,:**:n)] + +Rotatable_bond: [!$(*#*)&!D1]-!@[!$(*#*)&!D1] +# taken from http://www.daylight.com/support/contrib/smarts/content.html + +Michael_acceptor: [CX3]=[CX3][$([CX3]=[O,N,S]),$(C#[N]),$([S,P]=[OX1]),$([NX3]=O),$([NX3+](=O)[O-])] +# the classical case: C=C near carbonyl, nitrile, nitro, or similar +# Oxo-heteroaromats and similar are not included. + +Dicarbodiazene: [CX3](=[OX1])[NX2]=[NX2][CX3](=[OX1]) +# Michael-like acceptor, see Mitsunobu reaction + +# H-Bond_donor: + +# H-Bond_acceptor: + +# Pos_ionizable: + +# Neg_ionizable: + +# Unlikely_ions: +# O+,N-,C+,C-, ... + +CH-acidic: [$([CX4;!$([H0]);!$(C[!#6;!$([P,S]=O);!$(N(~O)~O)])][$([CX3]=[O,N,S]),$(C#[N]),$([S,P]=[OX1]),$([NX3]=O),$([NX3+](=O)[O-]);!$(*[S,O,N;H1,H2]);!$([*+0][S,O;X1-])]),$([CX4;!$([H0])]1[CX3]=[CX3][CX3]=[CX3]1)] +# C-H alpha to carbony, nitro or similar, C is not double-bonded, only C, H, S,P=O and nitro substituents allowed. +# pentadiene is included. acids, their salts, prim./sec. amides, and imides are excluded. +# hits also CH-acidic_strong + +CH-acidic_strong: [CX4;!$([H0]);!$(C[!#6;!$([P,S]=O);!$(N(~O)~O)])]([$([CX3]=[O,N,S]),$(C#[N]),$([S,P]=[OX1]),$([NX3]=O),$([NX3+](=O)[O-]);!$(*[S,O,N;H1,H2]);!$([*+0][S,O;X1-])])[$([CX3]=[O,N,S]),$(C#[N]),$([S,P]=[OX1]),$([NX3]=O),$([NX3+](=O)[O-]);!$(*[S,O,N;H1,H2]);!$([*+0][S,O;X1-])] +# same as above (without pentadiene), but carbonyl or similar on two or three sides + +Chiral_center_specified: [$([*@](~*)(~*)(*)*),$([*@H](*)(*)*),$([*@](~*)(*)*),$([*@H](~*)~*)] +# Hits atoms with tetrahedral chirality, if chiral center is specified in the SMILES string +# depictmach does not find oxonium, sulfonium, or sulfoxides! + +# Chiral_center_unspecified: [$([*@?](~*)(~*)(*)*),$([*@?H](*)(*)*),$([*@?](~*)(*)*),$([*@?H](~*)~*)] +# Hits atoms with tetrahedral chirality, if chiral center is not specified in the SMILES string +# "@?" (unspecified chirality) is not yet supported in Open Babel Version 2.0 + \ No newline at end of file -- cgit v1.2.3 From ef76c077fd39d31fc795b842c32575f6afb9fdb2 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 9 Aug 2015 13:42:54 +0200 Subject: customized prediction algorithms implemented --- lib/compound.rb | 59 ++++++++++++++++++++++++++------------------------- lib/dataset.rb | 3 +-- lib/opentox-client.rb | 11 +++++----- 3 files changed, 36 insertions(+), 37 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 4d292f1..4e29938 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -11,32 +11,31 @@ module OpenTox class Compound include OpenTox -# OpenBabel FP4 fingerprints -# OpenBabel http://open-babel.readthedocs.org/en/latest/Fingerprints/intro.html -# TODO store in DB -fp4 = FingerprintSmarts.find -unless fp4 - fp4 = [] - File.open(File.join(File.dirname(__FILE__),"SMARTS_InteLigand.txt")).each do |l| - l.strip! - unless l.empty? or l.match /^#/ - name,smarts = l.split(': ') - fp4 << OpenTox::FingerprintSmarts.find_or_create_by(:name => name, :smarts => smarts) unless smarts.nil? + # OpenBabel FP4 fingerprints + # OpenBabel http://open-babel.readthedocs.org/en/latest/Fingerprints/intro.html + fp4 = FingerprintSmarts.all + unless fp4 + fp4 = [] + File.open(File.join(File.dirname(__FILE__),"SMARTS_InteLigand.txt")).each do |l| + l.strip! + unless l.empty? or l.match /^#/ + name,smarts = l.split(': ') + fp4 << OpenTox::FingerprintSmarts.find_or_create_by(:name => name, :smarts => smarts) unless smarts.nil? + end + end end - end -end -FP4 = fp4 - -# TODO investigate other types of fingerprints (MACCS) -# OpenBabel http://open-babel.readthedocs.org/en/latest/Fingerprints/intro.html -# http://www.dalkescientific.com/writings/diary/archive/2008/06/26/fingerprint_background.html -# OpenBabel MNA http://openbabel.org/docs/dev/FileFormats/Multilevel_Neighborhoods_of_Atoms_(MNA).html#multilevel-neighborhoods-of-atoms-mna -# Morgan ECFP, FCFP -# http://cdk.github.io/cdk/1.5/docs/api/org/openscience/cdk/fingerprint/CircularFingerprinter.html -# http://www.rdkit.org/docs/GettingStartedInPython.html -# Chemfp -# https://chemfp.readthedocs.org/en/latest/using-tools.html -# CACTVS/PubChem + FP4 = fp4 + + # TODO investigate other types of fingerprints (MACCS) + # OpenBabel http://open-babel.readthedocs.org/en/latest/Fingerprints/intro.html + # http://www.dalkescientific.com/writings/diary/archive/2008/06/26/fingerprint_background.html + # OpenBabel MNA http://openbabel.org/docs/dev/FileFormats/Multilevel_Neighborhoods_of_Atoms_(MNA).html#multilevel-neighborhoods-of-atoms-mna + # Morgan ECFP, FCFP + # http://cdk.github.io/cdk/1.5/docs/api/org/openscience/cdk/fingerprint/CircularFingerprinter.html + # http://www.rdkit.org/docs/GettingStartedInPython.html + # Chemfp + # https://chemfp.readthedocs.org/en/latest/using-tools.html + # CACTVS/PubChem field :inchi, type: String attr_readonly :inchi @@ -170,15 +169,16 @@ FP4 = fp4 self["chemblid"] end - def neighbors threshold=0.3 + def neighbors threshold=0.7 # from http://blog.matt-swain.com/post/87093745652/chemical-similarity-search-in-mongodb qn = fp4.size - qmin = qn * threshold - qmax = qn / threshold + #qmin = qn * threshold + #qmax = qn / threshold #not sure if it is worth the effort of keeping feature counts up to date (compound deletions, additions, ...) #reqbits = [count['_id'] for count in db.mfp_counts.find({'_id': {'$in': qfp}}).sort('count', 1).limit(qn - qmin + 1)] aggregate = [ #{'$match': {'mfp.count': {'$gte': qmin, '$lte': qmax}, 'mfp.bits': {'$in': reqbits}}}, + {'$match': {'_id': {'$ne': self.id}}}, # remove self {'$project': { 'tanimoto': {'$let': { 'vars': {'common': {'$size': {'$setIntersection': ['$fp4', fp4]}}}, @@ -190,7 +190,8 @@ FP4 = fp4 {'$sort': {'tanimoto': -1}} ] - $mongo["compounds"].aggregate(aggregate).collect { |r| [Compound.find(r["_id"]), r["tanimoto"]]} + $mongo["compounds"].aggregate(aggregate).collect{ |r| [r["_id"], r["tanimoto"]] } + end private diff --git a/lib/dataset.rb b/lib/dataset.rb index 0447bb0..509e897 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -123,8 +123,7 @@ module OpenTox # @param feature [OpenTox::Feature] OpenTox Feature object # @return [Array] Data entry values def values(compound, feature) - #data_entries.where(:compound_id => compound.id, :feature_id => feature.id).distinct(:value) - rows = (0 ... compound_ids.length).select { |r| compound_ids[r] == compound.id } + rows = compound_ids.each_index.select{|r| compound_ids[r] == compound.id } col = feature_ids.index feature.id rows.collect{|row| data_entries[row][col]} end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 092b84e..e1e27c9 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -8,16 +8,16 @@ require 'mongoid' require 'rserve' # TODO store development/test, validation, production in separate databases -ENV["MONGOID_ENV"] = "development" +ENV["MONGOID_ENV"] ||= "development" Mongoid.load!("#{ENV['HOME']}/.opentox/config/mongoid.yml") R = Rserve::Connection.new -CLASSES = ["Feature","Compound", "Dataset"]#, "Validation", "Task", "Investigation"] +CLASSES = ["Feature","Compound", "Dataset", "Validation", "CrossValidation"]#, "Task", "Investigation"] #CLASSES = ["Feature", "Dataset", "Validation", "Task", "Investigation"] # Regular expressions for parsing classification data -TRUE_REGEXP = /^(true|active|1|1.0|tox|activating|carcinogen|mutagenic)$/i -FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-mutagenic)$/i +#TRUE_REGEXP = /^(true|active|1|1.0|tox|activating|carcinogen|mutagenic)$/i +#FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-mutagenic)$/i [ "overwrite.rb", @@ -49,5 +49,4 @@ $logger.level = Logger::DEBUG Mongo::Logger.level = Logger::WARN $mongo = Mongo::Client.new('mongodb://127.0.0.1:27017/opentox') $gridfs = $mongo.database.fs -Mongoid.logger.level = Logger::WARN -Mongoid.logger = $logger +#Mongoid.logger = $logger -- cgit v1.2.3 From 23ecfc6fa5ae4913e5cd17b7d58432d1f88d780c Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 10 Aug 2015 09:48:57 +0200 Subject: transfer to new git project started --- VERSION | 2 +- bin/opentox-client-install | 63 - doc/dsspeed.md | 181 - lib/authorization.rb | 378 - lib/compound.rb | 40 +- lib/dataset.rb | 247 +- lib/descriptor.rb | 253 + lib/error.rb | 79 +- lib/feature.rb | 70 +- lib/format-conversion.rb | 406 - lib/lazar.rb | 46 + lib/model.rb | 56 - lib/opentox-client.rb | 52 - lib/otlogger.rb | 47 - lib/policy.rb | 354 - lib/task.rb | 142 - lib/templates/default_guest_policy.xml | 53 - lib/templates/default_policy.xml | 53 - lib/unique_descriptors.rb | 120 + lib/validation.rb | 348 - opentox-client.gemspec | 34 - test/compound.rb | 93 + test/data/CPDBAS_v5c_1547_29Apr2008part.sdf | 13553 +++++++++++++++++++ .../CPDBAS_v5d_20Nov2008_mouse_TD50.csv | 436 + .../CPDBAS_v5d_20Nov2008_rat_TD50.csv | 568 + .../DSSTox_Carcinogenic_Potency_DBS_Hamster.csv | 87 + .../DSSTox_Carcinogenic_Potency_DBS_Mouse.csv | 978 ++ ...STox_Carcinogenic_Potency_DBS_MultiCellCall.csv | 1120 ++ ...nic_Potency_DBS_MultiCellCall_no_duplicates.csv | 1113 ++ ...SSTox_Carcinogenic_Potency_DBS_Mutagenicity.csv | 850 ++ ...enic_Potency_DBS_Mutagenicity_no_duplicates.csv | 829 ++ .../DSSTox_Carcinogenic_Potency_DBS_Rat.csv | 1198 ++ ...Tox_Carcinogenic_Potency_DBS_SingleCellCall.csv | 1505 ++ test/data/EPAFHM.csv | 618 + test/data/EPAFHM.medi.csv | 100 + test/data/EPAFHM.mini.csv | 22 + ...v4b_Fathead_Minnow_Acute_Toxicity_LC50_mmol.csv | 581 + ...FDA_v3b_Maximum_Recommended_Daily_Dose_mmol.csv | 1217 ++ test/data/ISSCAN-multi.csv | 59 + test/data/LOAEL_log_mg_corrected_smiles.csv | 568 + test/data/LOAEL_log_mmol_corrected_smiles.csv | 568 + test/data/acetaldehyde.sdf | 14 + test/data/boiling_points.ext.sdf | 11460 ++++++++++++++++ test/data/cpdb_100.csv | 101 + test/data/hamster_carcinogenicity.csv | 86 + .../hamster_carcinogenicity.mini.bool_float.csv | 11 + .../data/hamster_carcinogenicity.mini.bool_int.csv | 11 + .../hamster_carcinogenicity.mini.bool_string.csv | 11 + test/data/hamster_carcinogenicity.mini.csv | 11 + test/data/hamster_carcinogenicity.ntriples | 618 + test/data/hamster_carcinogenicity.sdf | 2805 ++++ test/data/hamster_carcinogenicity.xls | Bin 0 -> 12288 bytes test/data/hamster_carcinogenicity.yaml | 352 + test/data/hamster_carcinogenicity_with_errors.csv | 88 + test/data/kazius.csv | 4070 ++++++ test/data/multi_cell_call.csv | 1067 ++ test/data/multi_cell_call_no_dup.csv | 1057 ++ test/data/multicolumn.csv | 8 + test/data/rat_feature_dataset.csv | 1179 ++ test/data/wrong_dataset.csv | 8 + test/dataset-long.rb | 116 + test/dataset.rb | 199 + test/error.rb | 24 + test/feature.rb | 65 + test/setup.rb | 6 + 65 files changed, 50043 insertions(+), 2411 deletions(-) delete mode 100755 bin/opentox-client-install delete mode 100644 doc/dsspeed.md delete mode 100644 lib/authorization.rb create mode 100644 lib/descriptor.rb delete mode 100644 lib/format-conversion.rb create mode 100644 lib/lazar.rb delete mode 100644 lib/model.rb delete mode 100644 lib/opentox-client.rb delete mode 100644 lib/otlogger.rb delete mode 100644 lib/policy.rb delete mode 100644 lib/task.rb delete mode 100644 lib/templates/default_guest_policy.xml delete mode 100644 lib/templates/default_policy.xml create mode 100644 lib/unique_descriptors.rb delete mode 100644 lib/validation.rb delete mode 100644 opentox-client.gemspec create mode 100644 test/compound.rb create mode 100644 test/data/CPDBAS_v5c_1547_29Apr2008part.sdf create mode 100644 test/data/CPDBAS_v5d_cleaned/CPDBAS_v5d_20Nov2008_mouse_TD50.csv create mode 100644 test/data/CPDBAS_v5d_cleaned/CPDBAS_v5d_20Nov2008_rat_TD50.csv create mode 100644 test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Hamster.csv create mode 100644 test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mouse.csv create mode 100644 test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_MultiCellCall.csv create mode 100644 test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_MultiCellCall_no_duplicates.csv create mode 100644 test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mutagenicity.csv create mode 100644 test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mutagenicity_no_duplicates.csv create mode 100644 test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Rat.csv create mode 100644 test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_SingleCellCall.csv create mode 100644 test/data/EPAFHM.csv create mode 100644 test/data/EPAFHM.medi.csv create mode 100644 test/data/EPAFHM.mini.csv create mode 100644 test/data/EPA_v4b_Fathead_Minnow_Acute_Toxicity_LC50_mmol.csv create mode 100644 test/data/FDA_v3b_Maximum_Recommended_Daily_Dose_mmol.csv create mode 100644 test/data/ISSCAN-multi.csv create mode 100644 test/data/LOAEL_log_mg_corrected_smiles.csv create mode 100644 test/data/LOAEL_log_mmol_corrected_smiles.csv create mode 100644 test/data/acetaldehyde.sdf create mode 100644 test/data/boiling_points.ext.sdf create mode 100644 test/data/cpdb_100.csv create mode 100644 test/data/hamster_carcinogenicity.csv create mode 100644 test/data/hamster_carcinogenicity.mini.bool_float.csv create mode 100644 test/data/hamster_carcinogenicity.mini.bool_int.csv create mode 100644 test/data/hamster_carcinogenicity.mini.bool_string.csv create mode 100644 test/data/hamster_carcinogenicity.mini.csv create mode 100644 test/data/hamster_carcinogenicity.ntriples create mode 100644 test/data/hamster_carcinogenicity.sdf create mode 100644 test/data/hamster_carcinogenicity.xls create mode 100644 test/data/hamster_carcinogenicity.yaml create mode 100644 test/data/hamster_carcinogenicity_with_errors.csv create mode 100644 test/data/kazius.csv create mode 100644 test/data/multi_cell_call.csv create mode 100644 test/data/multi_cell_call_no_dup.csv create mode 100644 test/data/multicolumn.csv create mode 100644 test/data/rat_feature_dataset.csv create mode 100644 test/data/wrong_dataset.csv create mode 100644 test/dataset-long.rb create mode 100644 test/dataset.rb create mode 100644 test/error.rb create mode 100644 test/feature.rb create mode 100644 test/setup.rb diff --git a/VERSION b/VERSION index 274edc4..9ae0833 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0pre1 +1.0.0beta1 diff --git a/bin/opentox-client-install b/bin/opentox-client-install deleted file mode 100755 index 125db43..0000000 --- a/bin/opentox-client-install +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/sh - -# Installs Opentox Webservice. -# Author: Christoph Helma, Andreas Maunz. - -SELF=$(basename $0 -install) -[ "`id -u`" = "0" ] && echo "This script must be run as non-root." 1>&2 && exit 1 - -SILENT=false -if [ -n "$1" ] -then - if [ "$1" = "silent" ] - then - SILENT=true - fi -fi - -if [ $SILENT = false ]; then - echo - echo "Welcome to service installation ( to continue)." - read delete_me -fi - -# check wd is root of service -DIR=`pwd` -if echo $DIR | grep "$SELF/bin" >/dev/null 2>&1 ; then cd ..; fi - -# # # Boot the script - -# load base config, helper funs, environment -OT_CONFIG_DIR="$HOME/.opentox" -! [ -f "$OT_CONFIG_DIR/config/install/config.sh" ] && echo "config.sh not found." 1>&2 && exit 1 || . $OT_CONFIG_DIR/config/install/config.sh -! [ -f "$OT_PREFIX/install/utils.sh" ] && echo "utils.sh not found." 1>&2 && exit 1 || . $OT_PREFIX/install/utils.sh -[ -f $OT_CONFIG_DIR/opentox-ui.sh ] && . $OT_CONFIG_DIR/opentox-ui.sh # should have been done by user already -RUBY_DIR="$HOME/.rbenv/versions/$RUBY_NUM_VER" - - -# config -[ -f $OT_CONFIG_DIR/config/$SELF.rb ] || touch $OT_CONFIG_DIR/config/$SELF.rb -if ! cat "$OT_CONFIG_DIR/config/$SELF.rb" | grep "default.rb">/dev/null 2>&1; then echo 'require_relative "default.rb"' >> $OT_CONFIG_DIR/config/$SELF.rb; fi - - -# # # Install - -check_utils "rbenv find" -check_log $SELF - -# Adjust ruby version here! -RUBY_NUM_VER="2.0.0-p481" - -# ruby -install_ruby - -# self -echo -install_with_bundler - -if [ $SILENT = false ]; then - notify -fi - -# return to wd -cd "$DIR" diff --git a/doc/dsspeed.md b/doc/dsspeed.md deleted file mode 100644 index 9f04efd..0000000 --- a/doc/dsspeed.md +++ /dev/null @@ -1,181 +0,0 @@ -Filename: `dsspeed.pdf` -Description: A benchmark comparison of different dataset implementations. -Author: Andreas Maunz `` -Date: 10/2012 - -Some experiments made on branch `development`, using a VirtualBox VM (2 CPU, 2G of RAM), Debian 6.0.5, 64bit. - -# Dataset Creation - -Storing a dataset at the 4store backend. - -## Generating and Storing Triples. - -Implementation with querying the `/compound` service for compound URIs. - - date - task=`curl -X POST \ - -F "file=@/home/am/opentox-ruby/opentox-test/test/data/kazius.csv;type=text/csv" - http://localhost:8083/dataset 2>/dev/null` - get_result $task - date - -Timings for uploading the Kazius dataset (>4000 compounds. Repeated three times, median reported): - - Sat Nov 3 11:10:04 CET 2012 - http://localhost:8083/dataset/6a92fbf1-9c46-4c72-a487-365589c1210d - Sat Nov 3 11:10:41 CET 2012 - -Uploading takes 37s. This time is consumed by the workflow as follows: - -- Compound Triples: 33.236s (89.8 %) -- Value Triples: 1.052s (0.03 %) -- Other Triples: <1s (<0.03 %) -- 4store upload: <3s (<0.1 %) - -Based on these results I suggest to avoid querying the compound service. - - - -# Dataset Read-In - -Populating an `OpenTox::Dataset` object in memory, by reading from the 4store backend. - -## Request per row - -Implementation with one query for data entries **per compound**. - - @compounds.each_with_index do |compound,i| - query = RDF::Query.new do - pattern [:data_entry, RDF::OLO.index, i] - pattern [:data_entry, RDF::OT.values, :values] - pattern [:values, RDF::OT.feature, :feature] - pattern [:feature, RDF::OLO.index, :feature_idx] - pattern [:values, RDF::OT.value, :value] - end - values = query.execute(@rdf).sort_by{|s| s.feature_idx}.collect do |s| - (numeric_features[s.feature_idx] and s.value.to_s != "") ? \ - s.value.to_s.to_f : s.value.to_s - end - @data_entries << values.collect{|v| v == "" ? nil : v} - end - -Timings for reading a BBRC feature dataset (85 compounds, 53 features. Repeated three times, median reported): - - user system total real - ds reading 6.640000 0.090000 6.730000 ( 7.429505) - - -## Single Table - -Now some optimized versions that retrieve entries all at once. A few variables have been renamed for clarity in the query: - - query = RDF::Query.new do - # compound index: now a free variable - pattern [:data_entry, RDF::OLO.index, :cidx] - pattern [:data_entry, RDF::OT.values, :vals] - pattern [:vals, RDF::OT.feature, :f] - pattern [:f, RDF::OLO.index, :fidx] - pattern [:vals, RDF::OT.value, :val] - end - -Also `RDF::Query::Solutions#order_by` is used instead of the generic `Enumerable#sort_by`, which may have advantages (not tested seperately). - -### 'Row Slicing' Version - -Results are sorted by compound, then by feature. The long array is sliced into rows. - - @data_entries = query.execute(@rdf).order_by(:cidx, :fidx).collect { |entry| - entry.val.to_s.blank? ? nil : \ - (numeric_features[entry.fidx] ? entry.val.to_s.to_f : entry.val.to_s) - }.each_slice(@features.size).to_a - -Timings: - - user system total real - ds reading 3.850000 0.090000 3.940000 ( 4.643435) - -### 'Fill Table' Version - -Modification of 'Row Slicing' that avoids lookup operations where possible. Also pre-allocates `@data_entries`. - - clim=(@compounds.size-1) - cidx=0 - fidx=0 - num=numeric_features[fidx] - @data_entries = \ - (Array.new(@compounds.size*@features.size)).each_slice(@features.size).to_a - # order by feature index as to compute numeric status less frequently - query.execute(@rdf).order_by(:fidx, :cidx).each { |entry| - val = entry.val.to_s - unless val.blank? - @data_entries[cidx][fidx] = (num ? val.to_f : val) - end - if (cidx < clim) - cidx+=1 - else - cidx=0 - fidx+=1 - num=numeric_features[fidx] - end - } - -Timings: - - user system total real - ds reading 3.820000 0.040000 3.860000 ( 4.540800) - -### 'SPARQL' Version - -Modification of 'Fill Table' that loads data entries via SPARQL, not RDF query. - - sparql = "SELECT ?value FROM <#{uri}> WHERE { - ?data_entry <#{RDF::OLO.index}> ?cidx ; - <#{RDF::OT.values}> ?v . - ?v <#{RDF::OT.feature}> ?f; - <#{RDF::OT.value}> ?value . - ?f <#{RDF::OLO.index}> ?fidx. - } ORDER BY ?fidx ?cidx" - -Timings: - - user system total real -ds reading 1.690000 0.050000 1.740000 ( 2.362236) - - -## Dataset Tests - -Test runtimes changed as follows: - -Test old 'Row Slicing' 'SPARQL' ----------------- ------- ------------- -------- -dataset.rb 6.998s 7.406s 6.341s -dataset_large.rb 64.230s 25.231s 25.071 - -Table: Runtimes - - -### Conclusions - -In view of the results I implemented the 'SPARQL' version. - - -### Note - -A further modification that avoids querying compounds separately made runtimes much worse again. -The idea was to get the compound together with each data entry: - - ######## - -One would add compounds to `@compounds` only for the first run through column no '1'. - diff --git a/lib/authorization.rb b/lib/authorization.rb deleted file mode 100644 index b530815..0000000 --- a/lib/authorization.rb +++ /dev/null @@ -1,378 +0,0 @@ -module OpenTox - - if defined?($aa) and $aa.has_key?(:uri) and !$aa[:uri].nil? - AA = $aa[:uri] - else - AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb - end - - #Module for Authorization and Authentication - #@example Authentication - # require "opentox-client" - # OpenTox::Authorization::AA = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[SERVICE].rb - # OpenTox::Authorization.authenticate("username", "password") - # puts OpenTox::Authorization.authorize("http://example.uri/testpath/", "GET") - #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification - - module Authorization - - #Helper Class to create and send default policies out of xml templates - #@example Creating a default policy to a URI - # aa=OpenTox::Authorization::Helper.new - # xml=aa.get_xml('http://uri....') - # OpenTox::Authorization.create_policy(xml) - - class Helper - attr_accessor :user, :policy - - #Generates an AuthorizationHelper object - requires subjectid - # @param [String] subjectid - def initialize - @user = Authorization.get_user - @policy = Policies.new() - end - - #Cleans Policies of AuthorizationHelper object and loads default xml file into policy attribute - #set uri and user, returns Policyfile(XML) for open-sso - # @param uri [String] URI to create a policy for - def get_xml(uri) - @policy.drop_policies - @policy.load_default_policy(@user, uri) - return @policy.to_xml - end - - #Loads and sends Policyfile(XML) to open-sso server - # @param uri [String] URI to create a policy for - def send(uri) - xml = get_xml(uri) - ret = false - ret = Authorization.create_policy(xml) - $logger.warn "Create policy on openSSO failed for URI: #{uri} subjectid: #{RestClientWrapper.subjectid}. Will try again." if !ret - ret = Authorization.create_policy(xml) if !ret - $logger.debug "Policy send with subjectid: #{RestClientWrapper.subjectid}" - $logger.error "Not created Policy is: #{xml}" if !ret - ret - end - end - - #Returns the open-sso server set in the config file .opentox/config/[environment].yaml - # @return [String, nil] the openSSO server URI or nil - def self.server - return AA - end - - #Authentication against OpenSSO. Returns token. Requires Username and Password. - # @param user [String] Username - # @param pw [String] Password - # @return [Boolean] true if successful - def self.authenticate(user, pw) - begin - res = RestClientWrapper.post("#{AA}/auth/authenticate",{:username=>user, :password => pw},{:subjectid => ""}).sub("token.id=","").sub("\n","") - if is_token_valid(res) - RestClientWrapper.subjectid = res - return true - else - bad_request_error "Authentication failed #{res.inspect}" - end - rescue - bad_request_error "Authentication failed #{res.inspect}" - end - end - - #Logout on opensso. Make token invalid. Requires token - # @param [String] subjectid the subjectid - # @return [Boolean] true if logout is OK - def self.logout(subjectid=RestClientWrapper.subjectid) - begin - out = RestClientWrapper.post("#{AA}/auth/logout", :subjectid => subjectid) - return true unless is_token_valid(subjectid) - rescue - return false - end - return false - end - - #Authorization against OpenSSO for a URI with request-method (action) [GET/POST/PUT/DELETE] - # @param [String] uri URI to request - # @param [String] action request method - # @param [String] subjectid - # @return [Boolean, nil] returns true, false or nil (if authorization-request fails). - def self.authorize(uri, action, subjectid=RestClientWrapper.subjectid) - return true if RestClientWrapper.post("#{AA}/auth/authorize",{:subjectid => subjectid, :uri => uri, :action => action})== "boolean=true\n" - return false - end - - #Checks if a token is a valid token - # @param [String]subjectid subjectid from openSSO session - # @return [Boolean] subjectid is valid or not. - def self.is_token_valid(subjectid=RestClientWrapper.subjectid) - begin - return true if RestClientWrapper.post("#{AA}/auth/isTokenValid",:tokenid => subjectid) == "boolean=true\n" - rescue #do rescue because openSSO throws 401 - return false - end - return false - end - - #Returns array with all policies of the token owner - # @param [String]subjectid requires subjectid - # @return [Array, nil] returns an Array of policy names or nil if request fails - def self.list_policies - begin - out = RestClientWrapper.get("#{AA}/pol",nil) - return out.split("\n") - rescue - return nil - end - end - - #Returns a policy in xml-format - # @param policy [String] policyname - # @param subjectid [String] - # @return [String] XML of the policy - def self.list_policy(policy) - begin - return RestClientWrapper.get("#{AA}/pol",nil,{:id => policy}) - rescue - return nil - end - end - - # Lists policies alongside with affected uris - # @param [String] subjectid - # @return [Hash] keys: all policies of the subjectid owner, values: uris affected by those policies - def self.list_policies_uris - names = list_policies - policies = {} - names.each do |n| - policies[n] = list_policy_uris n - end - policies - end - - # Lists policies alongside with affected uris - # @param [String] subjectid - # @return [Hash] keys: all policies of the subjectid owner, values: uris affected by those policies - def self.list_policy_uris( policy ) - p = OpenTox::Policies.new - p.load_xml( list_policy(policy) ) - p.uris - end - - #Returns the owner (who created the first policy) of an URI - # @param uri [String] URI - # @param subjectid [String] subjectid - # return [String, nil]owner,nil returns owner of the URI - def self.get_uri_owner(uri) - begin - return RestClientWrapper.get("#{AA}/pol",nil,{:uri => uri}).sub("\n","") - rescue - return nil - end - end - - #Returns true or false if owner (who created the first policy) of an URI - # @param uri [String] URI - # @param subjectid [String] - # return [Boolean]true,false status of ownership of the URI - def self.uri_owner?(uri) - get_uri_owner(uri) == get_user - end - - #Checks if a policy exists to a URI. Requires URI and token. - # @param uri [String] URI - # @param subjectid [String] - # return [Boolean] - def self.uri_has_policy(uri) - owner = get_uri_owner(uri) - return true if owner and owner != "null" - false - end - - #List all policynames for a URI. Requires URI and token. - # @param uri [String] URI - # @param subjectid [String] - # return [Array, nil] returns an Array of policy names or nil if request fails - def self.list_uri_policies(uri) - begin - out = RestClientWrapper.get("#{AA}/pol",nil,{:uri => uri, :polnames => true}) - policies = []; notfirstline = false - out.split("\n").each do |line| - policies << line if notfirstline - notfirstline = true - end - return policies - rescue - return nil - end - end - - #Sends a policy in xml-format to opensso server. Requires policy-xml and token. - # @param policy [String] XML string of a policy - # @param subjectid [String] - # return [Boolean] returns true if policy is created - def self.create_policy(policy) - begin - $logger.debug "OpenTox::Authorization.create_policy policy: #{policy[168,43]} with token: #{RestClientWrapper.subjectid} ." - return true if RestClientWrapper.post("#{AA}/Pol/opensso-pol",policy, {:content_type => "application/xml"}) - rescue - return false - end - end - - #Deletes a policy - # @param policy [String] policyname - # @param subjectid [String] - # @return [Boolean,nil] - def self.delete_policy(policy) - begin - $logger.debug "OpenTox::Authorization.delete_policy policy: #{policy} with token: #{RestClientWrapper.subjectid}" - return true if RestClientWrapper.delete("#{AA}/pol",nil, {:id => policy}) - rescue - return nil - end - end - - #Returns array of the LDAP-Groups of an user - # @param [String]subjectid - # @return [Array] gives array of LDAP groups of a user - def self.list_user_groups(user) - begin - out = RestClientWrapper.post("#{AA}/opensso/identity/read", {:name => user, :admin => RestClientWrapper.subjectid, :attributes_names => "group"}) - grps = [] - out.split("\n").each do |line| - grps << line.sub("identitydetails.group=","") if line.include?("identitydetails.group=") - end - return grps - rescue - [] - end - end - - #Returns the owner (user id) of a token - # @param [String]subjectid optional (normally only used for testing) - # @return [String]user - def self.get_user subjectid=RestClientWrapper.subjectid - begin - out = RestClientWrapper.post("#{AA}/opensso/identity/attributes", {:subjectid => subjectid, :attributes_names => "uid"}) - user = ""; check = false - out.split("\n").each do |line| - if check - user = line.sub("userdetails.attribute.value=","") if line.include?("userdetails.attribute.value=") - check = false - end - check = true if line.include?("userdetails.attribute.name=uid") - end - return user - rescue - nil - end - end - - #Send default policy with Authorization::Helper class - # @param uri [String] URI - # @param subjectid [String] - def self.send_policy(uri) - aa = Authorization::Helper.new - ret = aa.send(uri) - $logger.debug "OpenTox::Authorization send policy for URI: #{uri} | subjectid: #{RestClientWrapper.subjectid} - policy created: #{ret}" - ret - end - - #Deletes all policies of an URI - # @param uri [String] URI - # @param subjectid [String] - # @return [Boolean] - def self.delete_policies_from_uri(uri) - policies = list_uri_policies(uri) - if policies - policies.each do |policy| - ret = delete_policy(policy) - $logger.debug "OpenTox::Authorization delete policy: #{policy} - with result: #{ret}" - end - end - return true - end - - # Checks (if subjectid is valid) if a policy exist and create default policy if not - # @param [String] uri - # @param [String] subjectid - # @return [Boolean] true if policy checked/created successfully (or no uri/subjectid given), false else - def self.check_policy(uri) - return true unless uri and RestClientWrapper.subjectid - unless OpenTox::Authorization.is_token_valid(RestClientWrapper.subjectid) - $logger.error "OpenTox::Authorization.check_policy, subjectid NOT valid: #{RestClientWrapper.subjectid}" - return false - end - - if !uri_has_policy(uri) - # if no policy exists, create a policy, return result of send policy - send_policy(uri) - else - # if policy exists check for POST rights - if authorize(uri, "POST") - true - else - $logger.error "OpenTox::Authorization.check_policy, already exists, but no POST-authorization with subjectid: #{RestClientWrapper.subjectid}" - false - end - end - true - end - - class << self - alias :token_valid? :is_token_valid - end - - # Check Authorization for a resource (identified via URI) with method and subjectid. - # @param uri [String] URI - # @param request_method [String] GET, POST, PUT, DELETE - # @param subjectid [String] - # @return [Boolean] true if access granted, else otherwise - def self.authorized?(uri, request_method) - return true unless $aa[:uri] - request_method = request_method.to_sym if request_method - if $aa[:free_request].include?(request_method) - true - elsif OpenTox::Authorization.free_uri?(uri, request_method) - true - elsif $aa[:authenticate_request].include?(request_method) - ret = OpenTox::Authorization.is_token_valid(RestClientWrapper.subjectid) - $logger.debug "authorized? >>#{ret}<< (token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{RestClientWrapper.subjectid}" unless ret - ret - elsif OpenTox::Authorization.authorize_exception?(uri, request_method) - ret = OpenTox::Authorization.is_token_valid(RestClientWrapper.subjectid) - $logger.debug "authorized? >>#{ret}<< (uris is authorize exception, token is in/valid), method: #{request_method}, URI: #{uri}, subjectid: #{RestClientWrapper.subjectid}" unless ret - ret - elsif $aa[:authorize_request].include?(request_method) - ret = OpenTox::Authorization.authorize(uri, request_method) - $logger.debug "authorized? >>#{ret}<< (uri (not) authorized), method: #{request_method}, URI: #{uri}, subjectid: #{RestClientWrapper.subjectid}" unless ret - ret - else - $logger.error "invalid request/uri method: #{request_method}, URI: #{uri}, subjectid: #{RestClientWrapper.subjectid}" - false - end - end - - private - # extend class methods - class << self - # methods: free_uri and authorize_exception - # @return [Boolean] checks if uri-method pair is included in $aa[:free_uri] or $aa[:authorize_exception] - [:free_uri, :authorize_exception].each do |method| - define_method "#{method}?".to_sym do |uri, request_method| - if $aa["#{method}s".to_sym] - $aa["#{method}s".to_sym].each do |request_methods, uris| - if request_methods and uris and request_methods.include?(request_method.to_sym) - uris.each do |u| - return true if u.match uri - end - end - end - end - return false - end - end - end - end -end diff --git a/lib/compound.rb b/lib/compound.rb index 4e29938..3ba1670 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -11,32 +11,6 @@ module OpenTox class Compound include OpenTox - # OpenBabel FP4 fingerprints - # OpenBabel http://open-babel.readthedocs.org/en/latest/Fingerprints/intro.html - fp4 = FingerprintSmarts.all - unless fp4 - fp4 = [] - File.open(File.join(File.dirname(__FILE__),"SMARTS_InteLigand.txt")).each do |l| - l.strip! - unless l.empty? or l.match /^#/ - name,smarts = l.split(': ') - fp4 << OpenTox::FingerprintSmarts.find_or_create_by(:name => name, :smarts => smarts) unless smarts.nil? - end - end - end - FP4 = fp4 - - # TODO investigate other types of fingerprints (MACCS) - # OpenBabel http://open-babel.readthedocs.org/en/latest/Fingerprints/intro.html - # http://www.dalkescientific.com/writings/diary/archive/2008/06/26/fingerprint_background.html - # OpenBabel MNA http://openbabel.org/docs/dev/FileFormats/Multilevel_Neighborhoods_of_Atoms_(MNA).html#multilevel-neighborhoods-of-atoms-mna - # Morgan ECFP, FCFP - # http://cdk.github.io/cdk/1.5/docs/api/org/openscience/cdk/fingerprint/CircularFingerprinter.html - # http://www.rdkit.org/docs/GettingStartedInPython.html - # Chemfp - # https://chemfp.readthedocs.org/en/latest/using-tools.html - # CACTVS/PubChem - field :inchi, type: String attr_readonly :inchi field :smiles, type: String @@ -48,21 +22,17 @@ module OpenTox field :sdf_id, type: BSON::ObjectId field :fp4, type: Array field :fp4_size, type: Integer - #belongs_to :dataset - #belongs_to :data_entry - - #def == compound - #self.inchi == compound.inchi - #end + # Overwrites standard Mongoid method to create fingerprints before database insertion def self.find_or_create_by params compound = self.find_or_initialize_by params - unless compound.fp4 + unless compound.fp4 and !compound.fp4.empty? compound.fp4_size = 0 compound.fp4 = [] - Algorithm::Descriptor.smarts_match(compound, FP4.collect{|f| f.smarts}).each_with_index do |m,i| + fingerprint = FingerprintSmarts.fingerprint + Algorithm::Descriptor.smarts_match(compound, fingerprint).each_with_index do |m,i| if m > 0 - compound.fp4 << FP4[i].id + compound.fp4 << fingerprint[i].id compound.fp4_size += 1 end end diff --git a/lib/dataset.rb b/lib/dataset.rb index 509e897..0237adf 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -3,39 +3,19 @@ require 'tempfile' module OpenTox - class LazarPrediction < Dataset - field :creator, type: String - field :prediction_feature_id, type: String - - def prediction_feature - Feature.find prediction_feature_id - end - - end - - class DescriptorDataset < Dataset - field :feature_calculation_algorithm, type: String - end - - class FminerDataset < DescriptorDataset - field :training_algorithm, type: String - field :training_dataset_id, type: BSON::ObjectId - field :training_feature_id, type: BSON::ObjectId - field :training_parameters, type: Hash - end - class Dataset - include Mongoid::Document attr_writer :data_entries # associations like has_many, belongs_to deteriorate performance field :feature_ids, type: Array, default: [] field :compound_ids, type: Array, default: [] - field :data_entries_id, type: BSON::ObjectId + field :data_entries_id, type: BSON::ObjectId, default: [] field :source, type: String field :warnings, type: Array, default: [] + # Save all data including data_entries + # Should be used instead of save def save_all dump = Marshal.dump(@data_entries) file = Mongo::Grid::File.new(dump, :filename => "#{self.id.to_s}.data_entries") @@ -46,74 +26,32 @@ module OpenTox # Readers + # Get all compounds def compounds @compounds ||= self.compound_ids.collect{|id| OpenTox::Compound.find id} @compounds end + # Get all features def features @features ||= self.feature_ids.collect{|id| OpenTox::Feature.find(id)} @features end - def fill_nil_with n - (0 .. compound_ids.size-1).each do |i| - @data_entries[i] ||= [] - (0 .. feature_ids.size-1).each do |j| - @data_entries[i][j] ||= n - end - end - end - - def [](row,col) - @data_entries[row,col] - end - - def []=(row,col,v) - @data_entries ||= [] - @data_entries[row] ||= [] - @data_entries[row][col] = v - end - - def correlation_plot training_dataset - R.assign "features", data_entries - R.assign "activities", training_dataset.data_entries.collect{|de| de.first} - R.eval "featurePlot(features,activities)" - end - - def density_plot - R.assign "acts", data_entries.collect{|r| r.first }#.compact - R.eval "plot(density(log(acts),na.rm= TRUE), main='log(#{features.first.name})')" - # TODO kill Rserve plots - end - - # merge dataset (i.e. append features) - def +(dataset) - bad_request_error "Dataset merge failed because the argument is not a OpenTox::Dataset but a #{dataset.class}" unless dataset.is_a? Dataset - bad_request_error "Dataset merge failed because compounds are unequal in datasets #{self.id} and #{dataset.id}" unless compound_ids == dataset.compound_ids - self.feature_ids ||= [] - self.feature_ids = self.feature_ids + dataset.feature_ids - @data_entries ||= Array.new(compound_ids.size){[]} - @data_entries.each_with_index do |row,i| - @data_entries[i] = row + dataset.fingerprint(compounds[i]) - end - self - - end - - def fingerprint(compound) - i = compound_ids.index(compound.id) - i.nil? ? nil : data_entries[i] - end - + # Get all data_entries def data_entries unless @data_entries t = Time.now - @data_entries = Marshal.load($gridfs.find_one(_id: data_entries_id).data) - bad_request_error "Data entries (#{data_entries_id}) are not a 2D-Array" unless @data_entries.is_a? Array and @data_entries.first.is_a? Array - bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries.size} rows, but dataset (#{id}) has #{compound_ids.size} compounds" unless @data_entries.size == compound_ids.size - bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries..first.size} columns, but dataset (#{id}) has #{feature_ids.size} features" unless @data_entries.first.size == feature_ids.size - $logger.debug "Retrieving data: #{Time.now-t}" + data_entry_file = $gridfs.find_one(_id: data_entries_id) + if data_entry_file.nil? + @data_entries = [] + else + @data_entries = Marshal.load(data_entry_file.data) + bad_request_error "Data entries (#{data_entries_id}) are not a 2D-Array" unless @data_entries.is_a? Array and @data_entries.first.is_a? Array + bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries.size} rows, but dataset (#{id}) has #{compound_ids.size} compounds" unless @data_entries.size == compound_ids.size + bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries..first.size} columns, but dataset (#{id}) has #{feature_ids.size} features" unless @data_entries.first.size == feature_ids.size + $logger.debug "Retrieving data: #{Time.now-t}" + end end @data_entries end @@ -130,50 +68,21 @@ module OpenTox # Writers + # Set compounds def compounds=(compounds) self.compound_ids = compounds.collect{|c| c.id} end - def add_compound compound - self.compound_ids << compound.id - end - + # Set features def features=(features) self.feature_ids = features.collect{|f| f.id} end - def add_feature feature - self.feature_ids << feature.id - end - - def self.create compounds, features, warnings=[], source=nil - dataset = Dataset.new(:warnings => warnings) - dataset.compounds = compounds - dataset.features = features - dataset - end - - # for prediction result datasets - # assumes that there are feature_ids with title prediction and confidence - # @return [Array] of Hashes with keys { :compound, :value ,:confidence } (compound value is object not uri) - # TODO - #def predictions - #end - - # Serialisation - - # converts dataset to csv format including compound smiles as first column, other column headers are feature titles - # @return [String] - def to_csv(inchi=false) - CSV.generate() do |csv| #{:force_quotes=>true} - csv << [inchi ? "InChI" : "SMILES"] + features.collect{|f| f.title} - compounds.each_with_index do |c,i| - csv << [inchi ? c.inchi : c.smiles] + data_entries[i] - end - end - end + # Dataset operations - # split dataset into n folds + # Split a dataset into n folds + # @param [Integer] number of folds + # @return [Array] Array with folds [training_dataset,test_dataset] def folds n len = self.compound_ids.size indices = (0..len-1).to_a.shuffle @@ -199,9 +108,36 @@ module OpenTox chunks end + # Diagnostics + + def correlation_plot training_dataset + # TODO: create/store svg + R.assign "features", data_entries + R.assign "activities", training_dataset.data_entries.collect{|de| de.first} + R.eval "featurePlot(features,activities)" + end + + def density_plot + # TODO: create/store svg + R.assign "acts", data_entries.collect{|r| r.first }#.compact + R.eval "plot(density(log(acts),na.rm= TRUE), main='log(#{features.first.name})')" + end + + # Serialisation + + # converts dataset to csv format including compound smiles as first column, other column headers are feature titles + # @return [String] + def to_csv(inchi=false) + CSV.generate() do |csv| #{:force_quotes=>true} + csv << [inchi ? "InChI" : "SMILES"] + features.collect{|f| f.title} + compounds.each_with_index do |c,i| + csv << [inchi ? c.inchi : c.smiles] + data_entries[i] + end + end + end + - # Adding data methods - # (Alternatively, you can directly change @data["feature_ids"] and @data["compounds"]) + # Parsers # Create a dataset from file (csv,sdf,...) # @param filename [String] @@ -210,6 +146,8 @@ module OpenTox #def self.from_sdf_file #end + # Create a dataset from CSV file + # TODO: document structure def self.from_csv_file file, source=nil, bioassay=true source ||= file table = CSV.read file, :skip_blanks => true @@ -222,8 +160,6 @@ module OpenTox # does a lot of guesswork in order to determine feature types def parse_table table, bioassay=true - # TODO: remove empty entries + write tests - time = Time.now # features @@ -277,24 +213,21 @@ module OpenTox table.each_with_index do |vals,i| ct = Time.now identifier = vals.shift - #if vals.compact.empty? - #warnings << "No values for compound at position #{i+2}, all entries are ignored." - #@data_entries.pop - #next - #end + warnings << "No feature values for compound at position #{i+2}." if vals.compact.empty? begin + # TODO parse inchi and catch openbabel errors (and segfaults) in compound.rb case compound_format when /SMILES/i compound = OpenTox::Compound.from_smiles(identifier) if compound.inchi.empty? - warnings << "Cannot parse #{compound_format} compound '#{compound.strip}' at position #{i+2}, all entries are ignored." + warnings << "Cannot parse #{compound_format} compound '#{identifier}' at position #{i+2}, all entries are ignored." next end when /InChI/i compound = OpenTox::Compound.from_inchi(identifier) end rescue - warnings << "Cannot parse #{compound_format} compound '#{compound}' at position #{i+2}, all entries are ignored." + warnings << "Cannot parse #{compound_format} compound '#{identifier}' at position #{i+2}, all entries are ignored." next end compound_time += Time.now-ct @@ -330,5 +263,71 @@ module OpenTox $logger.debug "Saving: #{Time.now-time}" end + +=begin + # TODO remove + + # Create a dataset with compounds and features + def self.create compounds, features, warnings=[], source=nil + dataset = Dataset.new(:warnings => warnings) + dataset.compounds = compounds + dataset.features = features + dataset + end + # merge dataset (i.e. append features) + def +(dataset) + bad_request_error "Dataset merge failed because the argument is not a OpenTox::Dataset but a #{dataset.class}" unless dataset.is_a? Dataset + bad_request_error "Dataset merge failed because compounds are unequal in datasets #{self.id} and #{dataset.id}" unless compound_ids == dataset.compound_ids + self.feature_ids ||= [] + self.feature_ids = self.feature_ids + dataset.feature_ids + @data_entries ||= Array.new(compound_ids.size){[]} + @data_entries.each_with_index do |row,i| + @data_entries[i] = row + dataset.fingerprint(compounds[i]) + end + self + + end + + def fingerprint(compound) + i = compound_ids.index(compound.id) + i.nil? ? nil : data_entries[i] + end +=end + + private + + def fill_nil_with n + (0 .. compound_ids.size-1).each do |i| + @data_entries[i] ||= [] + (0 .. feature_ids.size-1).each do |j| + @data_entries[i][j] ||= n + end + end + end + end + + # Dataset for lazar predictions + class LazarPrediction < Dataset + field :creator, type: String + field :prediction_feature_id, type: String + + def prediction_feature + Feature.find prediction_feature_id + end + + end + + # Dataset for descriptors (physchem) + class DescriptorDataset < Dataset + field :feature_calculation_algorithm, type: String end + + # Dataset for fminer descriptors + class FminerDataset < DescriptorDataset + field :training_algorithm, type: String + field :training_dataset_id, type: BSON::ObjectId + field :training_feature_id, type: BSON::ObjectId + field :training_parameters, type: Hash + end + end diff --git a/lib/descriptor.rb b/lib/descriptor.rb new file mode 100644 index 0000000..68bc7a2 --- /dev/null +++ b/lib/descriptor.rb @@ -0,0 +1,253 @@ +require 'digest/md5' +ENV["JAVA_HOME"] ||= "/usr/lib/jvm/java-7-openjdk" +BABEL_3D_CACHE_DIR = File.join(File.dirname(__FILE__),"..",'/babel_3d_cache') +# TODO store descriptors in mongodb + +module OpenTox + + module Algorithm + class Descriptor + include OpenTox + + JAVA_DIR = File.join(File.dirname(__FILE__),"..","java") + CDK_JAR = Dir[File.join(JAVA_DIR,"cdk-*jar")].last + JOELIB_JAR = File.join(JAVA_DIR,"joelib2.jar") + LOG4J_JAR = File.join(JAVA_DIR,"log4j.jar") + JMOL_JAR = File.join(JAVA_DIR,"Jmol.jar") + + obexclude = ["cansmi","cansmiNS","formula","InChI","InChIKey","s","smarts","title"] + OBDESCRIPTORS = Hash[OpenBabel::OBDescriptor.list_as_string("descriptors").split("\n").collect do |d| + name,description = d.split(/\s+/,2) + ["Openbabel."+name,description] unless obexclude.include? name + end.compact.sort{|a,b| a[0] <=> b[0]}] + + cdk_desc = YAML.load(`java -classpath #{CDK_JAR}:#{JAVA_DIR} CdkDescriptorInfo`) + CDKDESCRIPTORS = Hash[cdk_desc.collect { |d| ["Cdk."+d[:java_class].split('.').last.sub(/Descriptor/,''), d[:description]] }.sort{|a,b| a[0] <=> b[0]}] + CDKDESCRIPTOR_VALUES = cdk_desc.collect { |d| prefix="Cdk."+d[:java_class].split('.').last.sub(/Descriptor/,''); d[:names].collect{ |name| prefix+"."+name } }.flatten + + # exclude Hashcode (not a physchem property) and GlobalTopologicalChargeIndex (Joelib bug) + joelibexclude = ["MoleculeHashcode","GlobalTopologicalChargeIndex"] + # strip Joelib messages from stdout + JOELIBDESCRIPTORS = Hash[YAML.load(`java -classpath #{JOELIB_JAR}:#{LOG4J_JAR}:#{JAVA_DIR} JoelibDescriptorInfo | sed '0,/---/d'`).collect do |d| + name = d[:java_class].sub(/^joelib2.feature.types./,'') + # impossible to obtain meaningful descriptions from JOELIb, see java/JoelibDescriptors.java + ["Joelib."+name, "no description available"] unless joelibexclude.include? name + end.compact.sort{|a,b| a[0] <=> b[0]}] + + DESCRIPTORS = OBDESCRIPTORS.merge(CDKDESCRIPTORS.merge(JOELIBDESCRIPTORS)) + DESCRIPTOR_VALUES = OBDESCRIPTORS.keys + CDKDESCRIPTOR_VALUES + JOELIBDESCRIPTORS.keys + + require_relative "unique_descriptors.rb" + + def self.description descriptor + lib = descriptor.split('.').first + case lib + when "Openbabel" + OBDESCRIPTORS[descriptor] + when "Cdk" + name = descriptor.split('.')[0..-2].join('.') + CDKDESCRIPTORS[name] + when "Joelib" + JOELIBDESCRIPTORS[descriptor] + when "lookup" + "Read feature values from a dataset" + end + end + + def self.smarts_match compounds, smarts_features, count=false + bad_request_error "Compounds for smarts_match are empty" unless compounds + bad_request_error "Smarts features for smarts_match are empty" unless smarts_features + parse compounds + @count = count + obconversion = OpenBabel::OBConversion.new + obmol = OpenBabel::OBMol.new + obconversion.set_in_format('inchi') + smarts_pattern = OpenBabel::OBSmartsPattern.new + smarts_features = [smarts_features] if smarts_features.is_a?(Feature) + @smarts = smarts_features.collect{|f| f.smarts} + @physchem_descriptors = nil + @data_entries = Array.new(@compounds.size){Array.new(@smarts.size,false)} + @compounds.each_with_index do |compound,c| + # TODO OpenBabel may segfault here + # catch inchi errors in compound.rb + # eg. at line 249 of rat_feature_dataset + # which worked with opentox-client + # (but no smarts_match) + p "'#{compound.inchi}'" + obconversion.read_string(obmol,compound.inchi) + @smarts.each_with_index do |smart,s| + smarts_pattern.init(smart) + if smarts_pattern.match(obmol) + count ? value = smarts_pattern.get_map_list.to_a.size : value = 1 + else + value = 0 + end + @data_entries[c][s] = value + end + end + serialize + end + + def self.smarts_count compounds, smarts + smarts_match compounds,smarts,true + end + + def self.serialize + case @input_class + when "OpenTox::Compound" + if @with_names and @physchem_descriptors + [@physchem_descriptors,@data_entries.first] + else + @data_entries.first + end + when "Array" + if @with_names and @physchem_descriptors + [@physchem_descriptors,@data_entries.first] + else + @data_entries + end + when "OpenTox::Dataset" + dataset = OpenTox::DescriptorDataset.new(:compound_ids => @compounds.collect{|c| c.id}) + if @smarts + dataset.feature_ids = @smarts.collect{|smart| Smarts.find_or_create_by(:smarts => smart).id} + @count ? algo = "count" : algo = "match" + dataset.feature_calculation_algorithm = "#{self}.smarts_#{algo}" + + elsif @physchem_descriptors + dataset.feature_ids = @physchem_descriptors.collect{|d| PhysChemDescriptor.find_or_create_by(:name => d, :creator => __FILE__).id} + dataset.data_entries = @data_entries + dataset.feature_calculation_algorithm = "#{self}.physchem" + #TODO params? + end + dataset.save_all + dataset + end + end + + def self.physchem compounds, descriptors=UNIQUEDESCRIPTORS, with_names=false + parse compounds + @data_entries = Array.new(@compounds.size){[]} + @descriptors = descriptors + @smarts = nil + @physchem_descriptors = [] # CDK may return more than one result per descriptor, they are stored as separate features + @with_names = with_names + des = {} + @descriptors.each do |d| + lib, descriptor = d.split(".",2) + lib = lib.downcase.to_sym + des[lib] ||= [] + des[lib] << descriptor + end + des.each do |lib,descriptors| + send(lib, descriptors) + end + serialize + end + + def self.openbabel descriptors + $logger.debug "compute #{descriptors.size} openbabel descriptors for #{@compounds.size} compounds" + obdescriptors = descriptors.collect{|d| OpenBabel::OBDescriptor.find_type d} + obmol = OpenBabel::OBMol.new + obconversion = OpenBabel::OBConversion.new + obconversion.set_in_format 'inchi' + last_feature_idx = @physchem_descriptors.size + @compounds.each_with_index do |compound,c| + obconversion.read_string obmol, compound.inchi + obdescriptors.each_with_index do |descriptor,d| + @data_entries[c][d+last_feature_idx] = fix_value(descriptor.predict(obmol)) + end + end + @physchem_descriptors += descriptors.collect{|d| "Openbabel.#{d}"} + end + + def self.java_descriptors descriptors, lib + $logger.debug "compute #{descriptors.size} cdk descriptors for #{@compounds.size} compounds" + sdf = sdf_3d + # use java system call (rjb blocks within tasks) + # use Tempfiles to avoid "Argument list too long" error + case lib + when "cdk" + run_cmd "java -classpath #{CDK_JAR}:#{JAVA_DIR} CdkDescriptors #{sdf} #{descriptors.join(" ")}" + when "joelib" + run_cmd "java -classpath #{JOELIB_JAR}:#{JMOL_JAR}:#{LOG4J_JAR}:#{JAVA_DIR} JoelibDescriptors #{sdf} #{descriptors.join(' ')}" + end + last_feature_idx = @physchem_descriptors.size + YAML.load_file("#{sdf}#{lib}.yaml").each_with_index do |calculation,i| + $logger.error "Descriptor calculation failed for compound #{compounds[i].inchi}." if calculation.empty? + # CDK Descriptors may calculate multiple values, they are stored in separate features + @physchem_descriptors += calculation.keys if i == 0 + calculation.keys.each_with_index do |name,j| + @data_entries[i][j+last_feature_idx] = fix_value(calculation[name]) + end + end + FileUtils.rm "#{sdf}#{lib}.yaml" + end + + def self.cdk descriptors + java_descriptors descriptors, "cdk" + end + + def self.joelib descriptors + java_descriptors descriptors, "joelib" + end + + def self.lookup compounds, features, dataset + parse compounds + fingerprint = [] + compounds.each do |compound| + fingerprint << [] + features.each do |feature| + end + end + end + + def self.run_cmd cmd + cmd = "#{cmd} 2>&1" + $logger.debug "running external cmd: '#{cmd}'" + p = IO.popen(cmd) do |io| + while line = io.gets + $logger.debug "> #{line.chomp}" + end + io.close + raise "external cmd failed '#{cmd}' (see log file for error msg)" unless $?.to_i == 0 + end + end + + def self.sdf_3d + # TODO check if 3d sdfs are stored in GridFS + sdf = "" + @compounds.each do |compound| + sdf << compound.sdf + end + sdf_file = "/tmp/#{SecureRandom.uuid}.sdf" + File.open(sdf_file,"w+"){|f| f.print sdf} + sdf_file + end + + def self.parse compounds + @input_class = compounds.class.to_s + case @input_class + when "OpenTox::Compound" + @compounds = [compounds] + when "Array" + @compounds = compounds + when "OpenTox::Dataset" + @compounds = compounds.compounds + else + bad_request_error "Cannot calculate descriptors for #{compounds.class} objects." + end + end + + def self.fix_value val + val = val.first if val.is_a? Array and val.size == 1 + val = nil if val == "NaN" + if val.numeric? + val = Float(val) + val = nil if val.nan? or val.infinite? + end + val + end + private_class_method :sdf_3d, :fix_value, :parse, :run_cmd, :serialize + end + end +end diff --git a/lib/error.rb b/lib/error.rb index 12e22ff..8fe8a1e 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -1,36 +1,19 @@ -require 'open4' - -# add additional fields to Exception class to format errors according to OT-API module OpenToxError - attr_accessor :http_code, :uri, :error_cause, :metadata - def initialize(message=nil, uri=nil, cause=nil) + attr_accessor :http_code, :message, :cause + def initialize message=nil message = message.to_s.gsub(/\A"|"\Z/, '') if message # remove quotes - @error_cause = cause ? OpenToxError::cut_backtrace(cause) : short_backtrace - super message - @uri = uri.to_s.sub(%r{//.*:.*@},'//') # remove credentials from uri - @http_code ||= 500 - @metadata = { - :type => "ErrorReport", - :actor => @uri, - :message => message.to_s, - :statusCode => @http_code, - :errorCode => self.class.to_s, - :errorCause => @error_cause, - } - $logger.error("\n"+JSON.pretty_generate(@metadata)) - end - -=begin - # this method defines what is used for to_yaml (override to skip large @rdf graph) - def encode_with coder - @rdf.each do |statement| - coder[statement.predicate.fragment.to_s] = statement.object.to_s - end + @http_code ||= 500 + @message = message.to_s + @cause = cut_backtrace(caller) + $logger.error("\n"+JSON.pretty_generate({ + :http_code => @http_code, + :message => @message, + :cause => @cause + })) end -=end - def self.cut_backtrace(trace) + def cut_backtrace(trace) if trace.is_a?(Array) cut_index = trace.find_index{|line| line.match(/sinatra|minitest/)} cut_index ||= trace.size @@ -41,34 +24,6 @@ module OpenToxError trace end end - - def short_backtrace - backtrace = caller.collect{|line| line unless line =~ /#{File.dirname(__FILE__)}/}.compact - OpenToxError::cut_backtrace(backtrace) - end - -=begin - RDF_FORMATS.each do |format| - # rdf serialization methods for all formats e.g. to_rdfxml - send :define_method, "to_#{format}".to_sym do - RDF::Writer.for(format).buffer do |writer| - @rdf.each{|statement| writer << statement} if @rdf - end - end - end - - def to_turtle # redefine to use prefixes (not supported by RDF::Writer) - prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} - ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } - RDF::Turtle::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| - @rdf.each{|statement| writer << statement} if @rdf - end - end -=end - - def to_json - @metadata.to_json - end end @@ -76,7 +31,7 @@ class RuntimeError include OpenToxError end -# clutters log file with library errors +# clutters log file with library errors #class NoMethodError #include OpenToxError #end @@ -86,9 +41,9 @@ module OpenTox class Error < RuntimeError include OpenToxError - def initialize(code, message=nil, uri=nil, cause=nil) + def initialize(code, message=nil) @http_code = code - super message, uri, cause + super message end end @@ -96,15 +51,15 @@ module OpenTox RestClientWrapper.known_errors.each do |error| # create error classes c = Class.new Error do - define_method :initialize do |message=nil, uri=nil, cause=nil| - super error[:code], message, uri, cause + define_method :initialize do |message=nil| + super error[:code], message end end OpenTox.const_set error[:class],c # define global methods for raising errors, eg. bad_request_error Object.send(:define_method, error[:method]) do |message,uri=nil,cause=nil| - raise c.new(message, uri, cause) + raise c.new(message) end end diff --git a/lib/feature.rb b/lib/feature.rb index 005d78f..9deb199 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -1,17 +1,16 @@ module OpenTox + # Basic feature class class Feature field :name, as: :title, type: String field :nominal, type: Boolean field :numeric, type: Boolean field :measured, type: Boolean - field :calculated, type: Boolean - field :supervised, type: Boolean - field :source, as: :title, type: String - #belongs_to :dataset end + # Feature for categorical variables class NominalFeature < Feature + # TODO check if accept_values are still needed field :accept_values, type: Array def initialize params super params @@ -19,6 +18,7 @@ module OpenTox end end + # Feature for quantitative variables class NumericFeature < Feature def initialize params super params @@ -26,43 +26,69 @@ module OpenTox end end + # Feature for SMARTS fragments class Smarts < NominalFeature field :smarts, type: String - #field :name, as: :smarts, type: String # causes warnings - field :algorithm, type: String, default: "OpenTox::Algorithm::Descriptors.smarts_match" - field :parameters, type: Hash, default: {:count => false} - def initialize params - super params - nominal = true - end end + # Feature for supervised fragments from Fminer algorithm class FminerSmarts < Smarts - field :pValue, type: Float + field :p_value, type: Float + # TODO check if effect is used field :effect, type: String field :dataset_id - def initialize params - super params - supervised = true - end end + # Feature for database fingerprints + # needs count for efficient retrieval (see compound.rb) class FingerprintSmarts < Smarts field :count, type: Integer + def self.fingerprint + @@fp4 ||= OpenTox::FingerprintSmarts.all + unless @@fp4.size == 306 + @@fp4 = [] + # OpenBabel FP4 fingerprints + # OpenBabel http://open-babel.readthedocs.org/en/latest/Fingerprints/intro.html + # TODO investigate other types of fingerprints (MACCS) + # OpenBabel http://open-babel.readthedocs.org/en/latest/Fingerprints/intro.html + # http://www.dalkescientific.com/writings/diary/archive/2008/06/26/fingerprint_background.html + # OpenBabel MNA http://openbabel.org/docs/dev/FileFormats/Multilevel_Neighborhoods_of_Atoms_(MNA).html#multilevel-neighborhoods-of-atoms-mna + # Morgan ECFP, FCFP + # http://cdk.github.io/cdk/1.5/docs/api/org/openscience/cdk/fingerprint/CircularFingerprinter.html + # http://www.rdkit.org/docs/GettingStartedInPython.html + # Chemfp + # https://chemfp.readthedocs.org/en/latest/using-tools.html + # CACTVS/PubChem + + File.open(File.join(File.dirname(__FILE__),"SMARTS_InteLigand.txt")).each do |l| + l.strip! + unless l.empty? or l.match /^#/ + name,smarts = l.split(': ') + @@fp4 << OpenTox::FingerprintSmarts.find_or_create_by(:name => name, :smarts => smarts) unless smarts.nil? + end + end + end + @@fp4 + end end + # Feature for physico-chemical descriptors + class PhysChemDescriptor < NumericFeature + field :algorithm, type: String, default: "OpenTox::Algorithm::Descriptor.physchem" + field :parameters, type: Hash + field :creator, type: String + end + + # Feature for categorical bioassay results class NominalBioAssay < NominalFeature + # TODO: needed? move to dataset? field :description, type: String end + # Feature for quantitative bioassay results class NumericBioAssay < NumericFeature + # TODO: needed? move to dataset? field :description, type: String end - class PhysChemDescriptor < NumericFeature - field :algorithm, type: String, default: "OpenTox::Algorithm::Descriptor.physchem" - field :parameters, type: Hash - field :creator, type: String - end - end diff --git a/lib/format-conversion.rb b/lib/format-conversion.rb deleted file mode 100644 index 7563b94..0000000 --- a/lib/format-conversion.rb +++ /dev/null @@ -1,406 +0,0 @@ -# defaults to stderr, may be changed to file output (e.g in opentox-service) -$logger = OTLogger.new(STDERR) -$logger.level = Logger::DEBUG - -module OpenTox - - # Ruby interface - - attr_accessor :data - - # Create a new OpenTox object - # @param uri [optional,String] URI - # @return [OpenTox] OpenTox object - def initialize uri=nil - @data = {} - if uri - @data[:uri] = uri.to_s.chomp - get - else - @data[:uuid] = SecureRandom.uuid - @data[:uri] = File.join(service_uri, @data[:uuid]) - end - end - - # Object metadata (lazy loading) - # @return [Hash] Object metadata - def metadata force_update=false - get #if (@metadata.nil? or @metadata.empty? or force_update) and URI.accessible? @uri - @data - end - - # Metadata values - # @param predicate [String] Predicate URI - # @return [Array, String] Predicate value(s) - def [](predicate) - predicate = predicate.to_s - return nil if metadata[predicate].nil? - metadata[predicate].size == 1 ? metadata[predicate].first : metadata[predicate] - end - - # Set a metadata entry - # @param predicate [String] Predicate URI - # @param values [Array, String] Predicate value(s) - def []=(predicate,values) - predicate = predicate.to_s - @data[predicate] = [values].flatten - end - -=begin - # Object parameters (lazy loading) - # {http://opentox.org/dev/apis/api-1.2/interfaces OpenTox API} - # @return [Hash] Object parameters - def parameters force_update=false - if (@parameters.empty? or force_update) and URI.accessible? @uri - get #if @rdf.empty? or force_update - params = {} - query = RDF::Query.new({ - :parameter => { - RDF.type => RDF::OT.Parameter, - :property => :value, - } - }) - query.execute(@rdf).each do |solution| - params[solution.parameter] = {} unless params[solution.parameter] - params[solution.parameter][solution.property] = solution.value - end - @parameters = params.values - end - @parameters - end - - # Parameter value - # @param [String] title - # @return [String] value - def parameter_value title - @parameters.collect{|p| p[RDF::OT.paramValue] if p[RDF::DC.title] == title}.compact.first - end -=end - - # Get object from webservice - # @param [String,optional] mime_type - def get mime_type="application/json" - bad_request_error "Mime type #{mime_type} is not supported. Please use 'application/json' (default), 'text/plain' (ntriples) or mime_type == 'application/rdf+xml'." unless mime_type == "application/json" or mime_type == "text/plain" or mime_type == "application/rdf+xml" - p @data[:uri] - response = RestClientWrapper.get(@data[:uri],{},{:accept => mime_type}) - if URI.task?(response) - uri = wait_for_task response - response = RestClientWrapper.get(uri,{},{:accept => mime_type}) - p uri - end - case mime_type - when 'application/json' - p response - @data = JSON.parse(response) if response - when "text/plain" - parse_ntriples response - when "application/rdf+xml" - parse_rdfxml response - end - end - -=begin - # Post object to webservice (append to object), rarely useful and deprecated - # @deprecated - def post wait=true, mime_type="text/plain" - bad_request_error "Mime type #{mime_type} is not supported. Please use 'text/plain' (default) or 'application/rdf+xml'." unless mime_type == "text/plain" or mime_type == "application/rdf+xml" - case mime_type - when 'text/plain' - body = self.to_ntriples - when 'application/rdf+xml' - body = self.to_rdfxml - end - #Authorization.check_policy(@uri) if $aa[:uri] - uri = RestClientWrapper.post @uri.to_s, body, { :content_type => mime_type} - wait ? wait_for_task(uri) : uri - end -=end - - # Save object at webservice (replace or create object) - def put wait=true, mime_type="application/json" - bad_request_error "Mime type #{mime_type} is not supported. Please use 'application/json' (default)." unless mime_type == "application/json" or mime_type == "text/plain" or mime_type == "application/rdf+xml" - @data[:created_at] = DateTime.now unless URI.accessible? @data[:uri] - #@metadata[RDF::DC.modified] = DateTime.now - @data[:uri] ? @data[:uri] = uri.to_s.chomp : @data[:uri] = File.join(service_uri, SecureRandom.uuid) - case mime_type - when 'text/plain' - body = self.to_ntriples - when 'application/rdf+xml' - body = self.to_rdfxml - when 'application/json' - body = self.to_json - end - uri = RestClientWrapper.put @data[:uri], body, { :content_type => mime_type} - wait ? wait_for_task(uri) : uri - end - - # Delete object at webservice - def delete - RestClientWrapper.delete(@data[:uri]) - #Authorization.delete_policies_from_uri(@data[:uri]) if $aa[:uri] - end - - def service_uri - self.class.service_uri - end - - def create_rdf - #$logger.debug "#{eval("RDF::OT."+self.class.to_s.split('::').last)}\n" - @rdf = RDF::Graph.new - # DG: since model is no self.class anymore - @metadata[RDF.type] ||= (eval("RDF::OT."+self.class.to_s.split('::').last) =~ /Lazar|Generic/) ? RDF::URI.new(RDF::OT.Model) : RDF::URI.new(eval("RDF::OT."+self.class.to_s.split('::').last)) - #@metadata[RDF.type] ||= RDF::URI.new(eval("RDF::OT."+self.class.to_s.split('::').last)) - @metadata[RDF::DC.date] ||= DateTime.now - # DG: uri in object should be in brackets, otherwise query for uri-list ignores the object. - # see: http://www.w3.org/TR/rdf-testcases/#sec-uri-encoding - @metadata.each do |predicate,values| - [values].flatten.each{ |value| @rdf << [RDF::URI.new(@data[:uri]), predicate, (URI.valid?(value) ? RDF::URI.new(value) : value)] unless value.nil? } - end - @parameters.each do |parameter| - p_node = RDF::Node.new - @rdf << [RDF::URI.new(@data[:uri]), RDF::OT.parameters, p_node] - @rdf << [p_node, RDF.type, RDF::OT.Parameter] - parameter.each { |k,v| @rdf << [p_node, k, v] unless v.nil?} - end - end - - # as defined in opentox-client.rb - RDF_FORMATS.each do |format| - - # rdf parse methods for all formats e.g. parse_rdfxml - send :define_method, "parse_#{format}".to_sym do |rdf| - @rdf = RDF::Graph.new - RDF::Reader.for(format).new(rdf) do |reader| - reader.each_statement{ |statement| @rdf << statement } - end - # return values as plain strings instead of RDF objects - @metadata = @rdf.to_hash[RDF::URI.new(@data[:uri])].inject({}) { |h, (predicate, values)| h[predicate] = values.collect{|v| v.to_s}; h } - end - -=begin - # rdf serialization methods for all formats e.g. to_rdfxml - send :define_method, "to_#{format}".to_sym do - create_rdf - # if encoding is used iteration is necessary - # see: http://rubydoc.info/github/ruby-rdf/rdf/RDF/NTriples/Writer - RDF::Writer.for(format).buffer(:encoding => Encoding::ASCII) do |writer| - @rdf.each_statement do |statement| - writer << statement - end - end - end -=end - end - - # @return [String] converts object to turtle-string - def to_turtle # redefined to use prefixes (not supported by RDF::Writer) - prefixes = {:rdf => "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} - ['OT', 'DC', 'XSD', 'OLO'].each{|p| prefixes[p.downcase.to_sym] = eval("RDF::#{p}.to_s") } - create_rdf - RDF::Turtle::Writer.for(:turtle).buffer(:prefixes => prefixes) do |writer| - writer << @rdf - end - end - - def to_json - @data.to_json - end - - # @return [String] converts OpenTox object into html document (by first converting it to a string) - def to_html - to_turtle.to_html - end - - # short access for metadata keys title, description and type - [ :title , :description , :type , :uri, :uuid ].each do |method| - send :define_method, method do - self.data[method] - end - send :define_method, "#{method}=" do |value| - self.data[method] = value - end - end - - # define class methods within module - def self.included(base) - base.extend(ClassMethods) - end - - module ClassMethods - def service_uri - service = self.to_s.split('::')[1].downcase - eval("$#{service}[:uri]") - rescue - bad_request_error "$#{service}[:uri] variable not set. Please set $#{service}[:uri] or use an explicit uri as first constructor argument " - end - def subjectid - RestClientWrapper.subjectid - end - def subjectid=(subjectid) - RestClientWrapper.subjectid = subjectid - end - end - - # create default OpenTox classes with class methods - # (defined in opentox-client.rb) - CLASSES.each do |klass| - c = Class.new do - include OpenTox - - def self.all - uris = RestClientWrapper.get(service_uri, {},{:accept => 'text/uri-list'}).split("\n").compact - uris.collect{|uri| self.new(uri)} - end - - #@example fetching a model - # OpenTox::Model.find() -> model-object - def self.find uri - URI.accessible?(uri) ? self.new(uri) : nil - end - - def self.create metadata - object = self.new - object.data = metadata - object.put - object - end - - def self.find_or_create metadata - uris = RestClientWrapper.get(service_uri,{:query => @data},{:accept => "text/uri-list"}).split("\n") - uris.empty? ? self.create(@data) : self.new(uris.first) - end - end - OpenTox.const_set klass,c - end - -end - -# from overwrite.rb -class String - - # encloses URI in text with with link tag - # @return [String] new text with marked links - def link_urls - self.gsub(/(?i)http(s?):\/\/[^\r\n\s']*/, '\0') - end - - # produces a html page for making web services browser friendly - # format of text (=string params) is preserved (e.g. line breaks) - # urls are marked as links - # - # @param related_links [optional,String] uri on related resources - # @param description [optional,String] general info - # @param png_image [optional,String] imagename - # @return [String] html page - def to_html(related_links=nil, description=nil, png_image=nil ) - - # TODO add title as parameter - title = nil #$sinatra.to($sinatra.request.env['PATH_INFO'], :full) if $sinatra - html = "" - html << ""+title+"" if title - #html += "<\/img>" - - html << "

Description

"+description.link_urls+"

" if description - html << "

Related links

"+related_links.link_urls+"

" if related_links - html << "

Content

" if description || related_links - html << "

" - html << "\n" if png_image - html << self.link_urls - html << "

" - html - end - - def uri? - URI.valid?(self) - end -end - -module Kernel - -=begin - # overwrite backtick operator to catch system errors - # Override raises an error if _cmd_ returns a non-zero exit status. CH: I do not understand this comment - # Returns stdout if _cmd_ succeeds. Note that these are simply concatenated; STDERR is not inline. CH: I do not understand this comment - def ` cmd - stdout, stderr = '' - status = Open4::popen4(cmd) do |pid, stdin_stream, stdout_stream, stderr_stream| - stdout = stdout_stream.read - stderr = stderr_stream.read - end - internal_server_error "`" + cmd + "` failed.\n" + stdout + stderr unless status.success? - return stdout - rescue - internal_server_error $!.message - end -=end - - # @return [String] uri of task result, if task fails, an error according to task is raised - def wait_for_task uri - if URI.task?(uri) - t = OpenTox::Task.new uri - t.wait - unless t.completed? - error = OpenTox::RestClientWrapper.known_errors.select{|error| error[:code] == t.code}.first - error_method = error ? error[:method] : :internal_server_error - report = t.error_report - error_message = report ? report[:message] : $!.message - error_cause = report ? report[:errorCause] : nil - Object.send(error_method,error_message,t.uri,error_cause) - end - uri = t.resultURI - end - uri - end - - -end -module URI - - def self.compound? uri - uri =~ /compound/ and URI.valid? uri - end - - def self.task? uri - uri =~ /task/ and URI.valid? uri - end - - def self.dataset? uri - uri =~ /dataset/ and URI.accessible? uri - end - - def self.model? uri - uri =~ /model/ and URI.accessible? uri - end - - def self.ssl? uri - URI.parse(uri).instance_of? URI::HTTPS - end - - # @return [Boolean] checks if resource exists by making a HEAD-request - def self.accessible?(uri) - parsed_uri = URI.parse(uri + (OpenTox::RestClientWrapper.subjectid ? "?subjectid=#{CGI.escape OpenTox::RestClientWrapper.subjectid}" : "")) - http_code = URI.task?(uri) ? 600 : 400 - http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) - unless (URI.ssl? uri) == true - http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) - request = Net::HTTP::Head.new(parsed_uri.request_uri) - http.request(request).code.to_i < http_code - else - http = Net::HTTP.new(parsed_uri.host, parsed_uri.port) - http.use_ssl = true - http.verify_mode = OpenSSL::SSL::VERIFY_NONE - request = Net::HTTP::Head.new(parsed_uri.request_uri) - http.request(request).code.to_i < http_code - end - rescue - false - end - - def self.valid? uri - u = URI.parse(uri) - u.scheme!=nil and u.host!=nil - rescue URI::InvalidURIError - false - end - -end diff --git a/lib/lazar.rb b/lib/lazar.rb new file mode 100644 index 0000000..8831ba2 --- /dev/null +++ b/lib/lazar.rb @@ -0,0 +1,46 @@ +require 'rubygems' +require "bundler/setup" +require "rest-client" +require 'yaml' +require 'json' +require 'logger' +require 'mongoid' +require 'rserve' + +# Mongo setup +# TODO retrieve correct environment from Rack/Sinatra +ENV["MONGOID_ENV"] ||= "development" +# TODO remove config files, change default via ENV or directly in Mongoid class +Mongoid.load!("#{ENV['HOME']}/.opentox/config/mongoid.yml") +# TODO get Mongo::Client from Mongoid +$mongo = Mongo::Client.new('mongodb://127.0.0.1:27017/opentox') +# TODO same for GridFS +$gridfs = $mongo.database.fs + +# R setup +R = Rserve::Connection.new + +# Logger setup +$logger = Logger.new STDOUT # STDERR did not work on my development machine (CH) +$logger.level = Logger::DEBUG +Mongo::Logger.logger = $logger +Mongo::Logger.level = Logger::WARN +#Mongoid.logger = $logger + +# OpenTox classes and includes +CLASSES = ["Feature","Compound", "Dataset", "Validation", "CrossValidation"]# Algorithm and Models are modules + +[ # be aware of the require sequence as it affects class/method overwrites + "overwrite.rb", + "rest-client-wrapper.rb", + "error.rb", + "opentox.rb", + "feature.rb", + "compound.rb", + "dataset.rb", + "descriptor.rb", + #"algorithm.rb", + #"model.rb", + #"validation.rb" +].each{ |f| require_relative f } + diff --git a/lib/model.rb b/lib/model.rb deleted file mode 100644 index 2b90a46..0000000 --- a/lib/model.rb +++ /dev/null @@ -1,56 +0,0 @@ -module OpenTox - - module Model - - def feature_type - unless @feature_type - bad_request_error "Cannot determine feature type, dependent variable missing in model #{@uri}" unless metadata[RDF::OT.dependentVariables] - @feature_type = OpenTox::Feature.new( metadata[RDF::OT.dependentVariables][0]).feature_type - end - @feature_type - end - - def predicted_variable - load_predicted_variables unless defined? @predicted_variable - @predicted_variable - end - - def predicted_confidence - load_predicted_variables unless defined? @predicted_confidence - @predicted_confidence - end - - private - def load_predicted_variables - metadata[RDF::OT.predictedVariables].each do |f| - feat = OpenTox::Feature.new( f) - if feat.title =~ /confidence/ - @predicted_confidence = f - else - @predicted_variable = f unless @predicted_variable - end - end - end - - class Generic - include OpenTox - include OpenTox::Algorithm - include Model - - def self.find uri - URI.accessible?(uri) ? self.new(uri) : nil - end - - def predict params - run params - end - end - - class Lazar < Generic - - def self.create params - Lazar.new(File.join($algorithm[:uri], "lazar")).run params - end - end - end -end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb deleted file mode 100644 index e1e27c9..0000000 --- a/lib/opentox-client.rb +++ /dev/null @@ -1,52 +0,0 @@ -require 'rubygems' -require "bundler/setup" -require "rest-client" -require 'yaml' -require 'json' -require 'logger' -require 'mongoid' -require 'rserve' - -# TODO store development/test, validation, production in separate databases -ENV["MONGOID_ENV"] ||= "development" -Mongoid.load!("#{ENV['HOME']}/.opentox/config/mongoid.yml") -R = Rserve::Connection.new - -CLASSES = ["Feature","Compound", "Dataset", "Validation", "CrossValidation"]#, "Task", "Investigation"] -#CLASSES = ["Feature", "Dataset", "Validation", "Task", "Investigation"] - -# Regular expressions for parsing classification data -#TRUE_REGEXP = /^(true|active|1|1.0|tox|activating|carcinogen|mutagenic)$/i -#FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-mutagenic)$/i - -[ - "overwrite.rb", - "rest-client-wrapper.rb", - "error.rb", - #"authorization.rb", - #"policy.rb", - #"otlogger.rb", - "opentox.rb", - #"task.rb", - "feature.rb", - "compound.rb", - #"data_entry.rb", - "dataset.rb", - #"algorithm.rb", - #"model.rb", - #"validation.rb" -].each{ |f| require_relative f } - -#if defined?($aa) and $aa[:uri] -# OpenTox::Authorization.authenticate($aa[:user],$aa[:password]) -# unauthorized_error "Failed to authenticate user \"#{$aa[:user]}\"." unless OpenTox::Authorization.is_token_valid(OpenTox::RestClientWrapper.subjectid) -#end - -# defaults to stderr, may be changed to file output (e.g in opentox-service) -$logger = Logger.new STDOUT #OTLogger.new(STDOUT) # STDERR did not work on my development machine (CH) -$logger.level = Logger::DEBUG -#Mongo::Logger.logger = $logger -Mongo::Logger.level = Logger::WARN -$mongo = Mongo::Client.new('mongodb://127.0.0.1:27017/opentox') -$gridfs = $mongo.database.fs -#Mongoid.logger = $logger diff --git a/lib/otlogger.rb b/lib/otlogger.rb deleted file mode 100644 index 0f0caa4..0000000 --- a/lib/otlogger.rb +++ /dev/null @@ -1,47 +0,0 @@ - -# extend logger to add current source file, line-number and source location where the log command is called -class OTLogger < Logger - - def pwd - path = Dir.pwd.to_s - index = path.rindex(/\//) - return path if index==nil - path[(index+1)..-1] - end - - def trace() - lines = caller(0) - n = 2 - line = lines[n] - - while (line =~ /error.rb/ or line =~ /create/ or line =~ /#{File.basename(__FILE__)}/) - n += 1 - line = lines[n] - end - - index = line.rindex(/\/.*\.rb/) - return line if index==nil - line[index..-1] - end - - def format(msg) - pwd.ljust(18)+" :: "+msg.to_s+" :: "+trace - end - - def debug(msg) - super format(msg) - end - - def info(msg) - super format(msg) - end - - def warn(msg) - super format(msg) - end - - def error(msg) - super format(msg) - end - -end diff --git a/lib/policy.rb b/lib/policy.rb deleted file mode 100644 index e5676ba..0000000 --- a/lib/policy.rb +++ /dev/null @@ -1,354 +0,0 @@ -module OpenTox - require "rexml/document" - - #Module for policy-processing - # @see also http://www.opentox.org/dev/apis/api-1.2/AA for opentox API specs - # Class Policies corresponds to container of an xml-policy-file - class Policies - - #Hash for policy objects see {Policy Policy} - attr_accessor :policies, :name - - def initialize() - @policies = {} - end - - #create new policy instance with name - # @param [String]name of the policy - def new_policy(name) - @policies[name] = Policy.new(name) - end - - #drop a specific policy in a policies instance - # @param [String]name of the policy - # @return [Boolean] - def drop_policy(name) - return true if @policies.delete(name) - end - - #drop all policies in a policies instance - def drop_policies - @policies.each do |name, policy| - drop_policy(name) - end - return true - end - - # @return [Array] set of arrays affected by policies - def uris - @policies.collect{ |k,v| v.uri }.flatten.uniq - end - - #list all policy names in a policies instance - # @return [Array] - def names - out = [] - @policies.each do |name, policy| - out << name - end - return out - end - - # Loads a default policy template in a policies instance - # @param [String]user username in LDAP string of user policy: 'uid=,ou=people,dc=opentox,dc=org' - # @param [String]uri URI - # @param [String]group groupname in LDAP string of group policy: 'cn=,ou=groups,dc=opentox,dc=org' - def load_default_policy(user, uri, group="member") - template = case user - when "guest", "anonymous" then "default_guest_policy" - else "default_policy" - end - xml = get_xml_template(template) - self.load_xml(xml) - datestring = Time.now.strftime("%Y-%m-%d-%H-%M-%S-x") + rand(1000).to_s - - @policies["policy_user"].name = "policy_user_#{user}_#{datestring}" - @policies["policy_user"].rule.uri = uri - @policies["policy_user"].rule.name = "rule_user_#{user}_#{datestring}" - @policies["policy_user"].subject.name = "subject_user_#{user}_#{datestring}" - @policies["policy_user"].subject.value = "uid=#{user},ou=people,dc=opentox,dc=org" - @policies["policy_user"].subject_group = "subjects_user_#{user}_#{datestring}" - - @policies["policy_group"].name = "policy_group_#{group}_#{datestring}" - @policies["policy_group"].rule.uri = uri - @policies["policy_group"].rule.name = "rule_group_#{group}_#{datestring}" - @policies["policy_group"].subject.name = "subject_group_#{group}_#{datestring}" - @policies["policy_group"].subject.value = "cn=#{group},ou=groups,dc=opentox,dc=org" - @policies["policy_group"].subject_group = "subjects_#{group}_#{datestring}" - return true - end - - def get_xml_template(template) - File.read(File.join(File.dirname(__FILE__), "templates/#{template}.xml")) - end - - #loads a xml template - def load_xml(xml) - rexml = REXML::Document.new(xml) - rexml.elements.each("Policies/Policy") do |pol| #Policies - policy_name = pol.attributes["name"] - new_policy(policy_name) - #@policies[policy_name] = Policy.new(policy_name) - rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Rule") do |r| #Rules - rule_name = r.attributes["name"] - uri = rexml.elements["Policies/Policy[@name='#{policy_name}']/Rule[@name='#{rule_name}']/ResourceName"].attributes["name"] - @policies[policy_name].rule.name = rule_name - @policies[policy_name].uri = uri - rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Rule[@name='#{rule_name}']/AttributeValuePair") do |attribute_pairs| - action=nil; value=nil; - attribute_pairs.each_element do |elem| - action = elem.attributes["name"] if elem.attributes["name"] - value = elem.text if elem.text - end - if action and value - case action - when "GET" - @policies[policy_name].rule.get = value - when "POST" - @policies[policy_name].rule.post = value - when "PUT" - @policies[policy_name].rule.put = value - when "DELETE" - @policies[policy_name].rule.delete = value - end - end - end - end - rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Subjects") do |subjects| #Subjects - @policies[policy_name].subject_group = subjects.attributes["name"] - rexml.elements.each("Policies/Policy[@name='#{policy_name}']/Subjects[@name='#{@policies[policy_name].subject_group}']/Subject") do |s| #Subject - subject_name = s.attributes["name"] - subject_type = s.attributes["type"] - subject_value = rexml.elements["Policies/Policy[@name='#{policy_name}']/Subjects[@name='#{@policies[policy_name].subject_group}']/Subject[@name='#{subject_name}']/AttributeValuePair/Value"].text - if subject_name and subject_type and subject_value - @policies[policy_name].subject.name = subject_name - @policies[policy_name].type = subject_type - @policies[policy_name].value = subject_value - end - end - end - end - end - - #generates xml from policies instance - def to_xml - doc = REXML::Document.new() - doc << REXML::DocType.new("Policies", "PUBLIC \"-//Sun Java System Access Manager7.1 2006Q3\n Admin CLI DTD//EN\" \"jar://com/sun/identity/policy/policyAdmin.dtd\"") - doc.add_element(REXML::Element.new("Policies")) - - @policies.each do |name, pol| - policy = REXML::Element.new("Policy") - policy.attributes["name"] = pol.name - policy.attributes["referralPolicy"] = false - policy.attributes["active"] = true - rule = @policies[name].rule - out_rule = REXML::Element.new("Rule") - out_rule.attributes["name"] = rule.name - servicename = REXML::Element.new("ServiceName") - servicename.attributes["name"]="iPlanetAMWebAgentService" - out_rule.add_element(servicename) - rescourcename = REXML::Element.new("ResourceName") - rescourcename.attributes["name"] = rule.uri - out_rule.add_element(rescourcename) - - ["get","post","delete","put"].each do |act| - if rule.method(act).call - attribute = REXML::Element.new("Attribute") - attribute.attributes["name"] = act.upcase - attributevaluepair = REXML::Element.new("AttributeValuePair") - attributevaluepair.add_element(attribute) - attributevalue = REXML::Element.new("Value") - attributevaluepair.add_element(attributevalue) - attributevalue.add_text REXML::Text.new(rule.method(act).call) - out_rule.add_element(attributevaluepair) - end - end - policy.add_element(out_rule) - - subjects = REXML::Element.new("Subjects") - subjects.attributes["name"] = pol.subject_group - subjects.attributes["description"] = "" - subj = @policies[name].subject.name - subject = REXML::Element.new("Subject") - subject.attributes["name"] = pol.subject.name - subject.attributes["type"] = pol.subject.type - subject.attributes["includeType"] = "inclusive" - attributevaluepair = REXML::Element.new("AttributeValuePair") - attribute = REXML::Element.new("Attribute") - attribute.attributes["name"] = "Values" - attributevaluepair.add_element(attribute) - attributevalue = REXML::Element.new("Value") - attributevalue.add_text REXML::Text.new(pol.subject.value) - attributevaluepair.add_element(attributevalue) - subject.add_element(attributevaluepair) - subjects.add_element(subject) - policy.add_element(subjects) - doc.root.add_element(policy) - end - out = "" - doc.write(out, 2) - return out - end - - end - - #single policy in a {Policies Policies} instance - class Policy - - attr_accessor :name, :rule, :subject_group, :subject, :value, :type, :uri, :group, :user - - def initialize(name) - @name = name - @rule = Rule.new("#{name}_rule", nil) - @subject_group = "#{name}_subjects" - @subject = Subject.new("#{name}_subject", nil, nil) - end - - # Subject type LDAPUsers or LDAPGroups - # @return [String] - def type - @subject.type - end - - # Set subject type - # @param type [String] the subjecttype - def type=(type) - @subject.type = type - end - - # returns LDAP Distinguished Name (DN) e.g. uid=username,ou=people,dc=opentox,dc=org or cn=membergroup,ou=groups,dc=opentox,dc=org - def value - @subject.value - end - - # sets LDAP Distinguished Name (DN) for policy e.g. - # @param value [String] LDAPString - def value=(value) - @subject.value = value - end - - # uri affected by policy - # @return [String] uri affected by policy - def uri - @rule.uri - end - - # sets uri affected by policy - # @param uri [String] set URI - def uri=(uri) - @rule.uri = uri - end - - # Get the groupname from within the LDAP Distinguished Name (DN) - def group - return false if !value && type != "LDAPGroups" - value.split(",").each{|part| return part.gsub("cn=","") if part.match("cn=")} - end - - # Get the username from within the LDAP Distinguished Name (DN) - def user - return false if !value && type != "LDAPUsers" - value.split(",").each{|part| return part.gsub("uid=","") if part.match("uid=")} - end - - # helper method sets value and type to opentox LDAP Distinguished Name (DN) of a user - # @param username [String] set a username into LDAP DN - def set_ot_user(username) - self.value = "uid=#{username},ou=people,dc=opentox,dc=org" - self.type = "LDAPUsers" - true - end - - # @param groupname [String] Username set a groupname into LDAP DN - def set_ot_group(groupname) - self.value = "cn=#{groupname},ou=groups,dc=opentox,dc=org" - self.type = "LDAPGroups" - true - end - - # policyrule - # sets the permission for REST actions (GET, POST, PUT, DELETE) of a specific URI to allow/deny/nil - class Rule - - attr_accessor :name, :uri, :get, :post, :put, :delete, :read, :readwrite - - def initialize(name, uri) - @name = name - @uri = uri - end - - #Set Rule attribute for request-method GET - # @param value [String] (allow,deny,nil) - def get=(value) - @get = check_value(value, @get) - end - - #Set Rule attribute for request-method POST - # @param [String]value (allow,deny,nil) - def post=(value) - @post = check_value(value, @post) - end - - #Set Rule attribute for request-method DELETE - # @param [String]value (allow,deny,nil) - def delete=(value) - @delete = check_value(value, @delete) - end - - #Set Rule attribute for request-method PUT - # @param [String]value (allow,deny,nil) - def put=(value) - @put = check_value(value, @put) - end - - # read getter method - def read - return true if @get == "allow" && (@put == "deny" || !@put) && (@post == "deny" || !@post) - end - - # readwrite getter method - def readwrite - return true if @get == "allow" && @put == "allow" && @post == "allow" - end - - # Set(true case) or remove read(GET=allow) permissions. - # @param [Boolean]value (true,false) - def read=(value) - if value - @get = "allow"; @put = nil; @post = nil - else - @get = nil; @put = nil; @post = nil - end - end - - # Set(true case) or remove readwrite(GET=allow,POST=allow,PUT=allow) permissions. - # @param [Boolean]value (true,false) - def readwrite=(value) - if value - @get = "allow"; @put = "allow"; @post = "allow" - else - @get = nil; @put = nil; @post = nil - end - end - - private - #checks if value is allow, deny or nil. returns old value if not valid. - def check_value(new_value, old_value) - return (new_value=="allow" || new_value=="deny" || new_value==nil) ? new_value : old_value - end - end - - # Subject of a policy - # name(subjectname), type('LDAPUsers' or 'LDAPGroups'), value(LDAP DN e.G.:'uid=guest,ou=people,dc=opentox,dc=org') - class Subject - - attr_accessor :name, :type, :value - - def initialize(name, type, value) - @name = name - @type = type - @value = value - end - end - end -end diff --git a/lib/task.rb b/lib/task.rb deleted file mode 100644 index cd2dd92..0000000 --- a/lib/task.rb +++ /dev/null @@ -1,142 +0,0 @@ -# TODO: task seems to run twice, see fminser tests -# TODO: do we need tasks for internal use -DEFAULT_TASK_MAX_DURATION = 36000 -module OpenTox - # TODO: fix error reports - # TODO: fix field names and overwrite accessors - - # Class for handling asynchronous tasks - class Task - include Mongoid::Document - include Mongoid::Timestamps - - field :creator, type: String - field :percentageCompleted, type: Float - field :error_code, type: Integer # workaround name, cannot overwrite accessors in current mongoid version - field :finished, type: Time # workaround name, cannot overwrite accessors in current mongoid version - # TODO - field :result_type, type: String - field :result_id, type: BSON::ObjectId - field :report, type: String - field :pid, type: Integer - field :observer_pid, type: Integer - - def self.run(description, creator=nil) - - task = Task.new - task[:description] = description.to_s - task[:creator] = creator.to_s - task[:percentageCompleted] = 0 - task[:error_code] = 202 - task.save - - pid = fork do - begin - task.completed yield - rescue => e - # wrap non-opentox-errors first - e = OpenTox::Error.new(500,e.message,nil,e.backtrace) unless e.is_a?(OpenTox::Error) - $logger.error "error in task #{task.id} created by #{creator}" # creator is not logged because error is logged when thrown - task.update(:report => e.metadata, :error_code => e.http_code, :finished => Time.now) - task.kill - end - end - Process.detach(pid) - task[:pid] = pid - - # watch if task has been cancelled - observer_pid = fork do - task.wait - begin - Process.kill(9,task[:pid]) if task.cancelled? - rescue - $logger.warn "Could not kill process of task #{task.id}, pid: #{task[:pid]}" - end - end - Process.detach(observer_pid) - task[:observer_pid] = observer_pid - task - - end - - def kill - Process.kill(9,task[:pid]) - Process.kill(9,task[:observer_pid]) - rescue # no need to raise an exception if processes are not running - end - - def cancel - kill - update_attributes(:error_code => 503, :finished => Time.now) - end - - def completed(result) - update_attributes(:error_code => 200, :finished => Time.now, :percentageCompleted => 100, :result_type => result.type, :result_id => result.id) - end - - # waits for a task, unless time exceeds or state is no longer running - def wait - start_time = Time.new - due_to_time = start_time + DEFAULT_TASK_MAX_DURATION - dur = 0.2 - while running? - sleep dur - dur = [[(Time.new - start_time)/20.0,0.3].max,300.0].min - request_timeout_error "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+id.to_s+"'" if (Time.new > due_to_time) - end - end - - end - - def error_report - OpenTox::Task.find(id).report - end - - def code - OpenTox::Task.find(id).error_code - end - - def result - c = OpenTox::Task.find(id).result_type.downcase.to_sym - rid = OpenTox::Task.find(id).result_id - p c, rid - p $mongo[collection].all - $mongo[collection].find(rid).first - end - - def finished_at - OpenTox::Task.find(id).finished - end - - def running? - code == 202 - end - - def cancelled? - code == 503 - end - - def completed? - code == 200 - end - - def error? - code >= 400 and code != 503 - end - - # Check status of a task - # @return [String] Status - def status - case code - when 202 - "Running" - when 200 - "Completed" - when 503 - "Cancelled" - else - "Error" - end - end - -end diff --git a/lib/templates/default_guest_policy.xml b/lib/templates/default_guest_policy.xml deleted file mode 100644 index a778070..0000000 --- a/lib/templates/default_guest_policy.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - allow - - - - allow - - - - allow - - - - allow - - - - - - - uid=guest,ou=people,dc=opentox,dc=org - - - - - - - - - - - allow - - - - - - - cn=member,ou=groups,dc=opentox,dc=org - - - - - diff --git a/lib/templates/default_policy.xml b/lib/templates/default_policy.xml deleted file mode 100644 index a778070..0000000 --- a/lib/templates/default_policy.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - allow - - - - allow - - - - allow - - - - allow - - - - - - - uid=guest,ou=people,dc=opentox,dc=org - - - - - - - - - - - allow - - - - - - - cn=member,ou=groups,dc=opentox,dc=org - - - - - diff --git a/lib/unique_descriptors.rb b/lib/unique_descriptors.rb new file mode 100644 index 0000000..676f34a --- /dev/null +++ b/lib/unique_descriptors.rb @@ -0,0 +1,120 @@ +# set of non redundant descriptors, faster algorithms are preferred +# TODO: +# select logP algorithm +# select l5 algorithm +# use smarts matcher for atom counts +# check correlations +UNIQUEDESCRIPTORS = [ + "Openbabel.abonds", #Number of aromatic bonds + "Openbabel.atoms", #Number of atoms + "Openbabel.bonds", #Number of bonds + "Openbabel.dbonds", #Number of double bonds + "Openbabel.HBA1", #Number of Hydrogen Bond Acceptors 1 (JoelLib) + "Openbabel.HBA2", #Number of Hydrogen Bond Acceptors 2 (JoelLib) + "Openbabel.HBD", #Number of Hydrogen Bond Donors (JoelLib) + "Openbabel.L5", #Lipinski Rule of Five + "Openbabel.logP", #octanol/water partition coefficient + "Openbabel.MP", #Melting point + "Openbabel.MR", #molar refractivity + "Openbabel.MW", #Molecular Weight filter + "Openbabel.nF", #Number of Fluorine Atoms + "Openbabel.sbonds", #Number of single bonds + "Openbabel.tbonds", #Number of triple bonds + "Openbabel.TPSA", #topological polar surface area + "Cdk.ALOGP", #Calculates atom additive logP and molar refractivity values as described by Ghose and Crippen and + "Cdk.APol", #Descriptor that calculates the sum of the atomic polarizabilities (including implicit hydrogens). + "Cdk.AcidicGroupCount", #Returns the number of acidic groups. + "Cdk.AminoAcidCount", #Returns the number of amino acids found in the system + #"Cdk.AromaticAtomsCount", #Descriptor based on the number of aromatic atoms of a molecule. + #"Cdk.AromaticBondsCount", #Descriptor based on the number of aromatic bonds of a molecule. + #"Cdk.AtomCount", #Descriptor based on the number of atoms of a certain element type. + "Cdk.AutocorrelationCharge", #The Moreau-Broto autocorrelation descriptors using partial charges + "Cdk.AutocorrelationMass", #The Moreau-Broto autocorrelation descriptors using atomic weight + "Cdk.AutocorrelationPolarizability", #The Moreau-Broto autocorrelation descriptors using polarizability + "Cdk.BCUT", #Eigenvalue based descriptor noted for its utility in chemical diversity described by Pearlman et al. . + "Cdk.BPol", #Descriptor that calculates the sum of the absolute value of the difference between atomic polarizabilities of all bonded atoms in the molecule (including implicit hydrogens). + "Cdk.BasicGroupCount", #Returns the number of basic groups. + #"Cdk.BondCount", #Descriptor based on the number of bonds of a certain bond order. + "Cdk.CPSA", #A variety of descriptors combining surface area and partial charge information + "Cdk.CarbonTypes", #Characterizes the carbon connectivity in terms of hybridization + "Cdk.ChiChain", #Evaluates the Kier & Hall Chi chain indices of orders 3,4,5 and 6 + "Cdk.ChiCluster", #Evaluates the Kier & Hall Chi cluster indices of orders 3,4,5,6 and 7 + "Cdk.ChiPathCluster", #Evaluates the Kier & Hall Chi path cluster indices of orders 4,5 and 6 + "Cdk.ChiPath", #Evaluates the Kier & Hall Chi path indices of orders 0,1,2,3,4,5,6 and 7 + "Cdk.EccentricConnectivityIndex", #A topological descriptor combining distance and adjacency information. + "Cdk.FMF", #Descriptor characterizing molecular complexity in terms of its Murcko framework + "Cdk.FragmentComplexity", #Class that returns the complexity of a system. The complexity is defined as @cdk.cite{Nilakantan06} + "Cdk.GravitationalIndex", #Descriptor characterizing the mass distribution of the molecule. + #"Cdk.HBondAcceptorCount", #Descriptor that calculates the number of hydrogen bond acceptors. + #"Cdk.HBondDonorCount", #Descriptor that calculates the number of hydrogen bond donors. + "Cdk.HybridizationRatio", #Characterizes molecular complexity in terms of carbon hybridization states. + "Cdk.IPMolecularLearning", #Descriptor that evaluates the ionization potential. + "Cdk.KappaShapeIndices", #Descriptor that calculates Kier and Hall kappa molecular shape indices. + "Cdk.KierHallSmarts", #Counts the number of occurrences of the E-state fragments + "Cdk.LargestChain", #Returns the number of atoms in the largest chain + "Cdk.LargestPiSystem", #Returns the number of atoms in the largest pi chain + "Cdk.LengthOverBreadth", #Calculates the ratio of length to breadth. + "Cdk.LongestAliphaticChain", #Returns the number of atoms in the longest aliphatic chain + "Cdk.MDE", #Evaluate molecular distance edge descriptors for C, N and O + "Cdk.MannholdLogP", #Descriptor that calculates the LogP based on a simple equation using the number of carbons and hetero atoms . + "Cdk.MomentOfInertia", #Descriptor that calculates the principal moments of inertia and ratios of the principal moments. Als calculates the radius of gyration. + "Cdk.PetitjeanNumber", #Descriptor that calculates the Petitjean Number of a molecule. + "Cdk.PetitjeanShapeIndex", #The topological and geometric shape indices described Petitjean and Bath et al. respectively. Both measure the anisotropy in a molecule. + "Cdk.RotatableBondsCount", #Descriptor that calculates the number of nonrotatable bonds on a molecule. + #"Cdk.RuleOfFive", #This Class contains a method that returns the number failures of the Lipinski's Rule Of Five. + #"Cdk.TPSA", #Calculation of topological polar surface area based on fragment contributions . + "Cdk.VABC", #Describes the volume of a molecule. + "Cdk.VAdjMa", #Descriptor that calculates the vertex adjacency information of a molecule. + "Cdk.WHIM", #Holistic descriptors described by Todeschini et al . + #"Cdk.Weight", #Descriptor based on the weight of atoms of a certain element type. If no element is specified, the returned value is the Molecular Weight + "Cdk.WeightedPath", #The weighted path (molecular ID) descriptors described by Randic. They characterize molecular branching. + "Cdk.WienerNumbers", #This class calculates Wiener path number and Wiener polarity number. + "Cdk.XLogP", #Prediction of logP based on the atom-type method called XLogP. + "Cdk.ZagrebIndex", #The sum of the squared atom degrees of all heavy atoms. + "Joelib.count.NumberOfS", #no description available + "Joelib.count.NumberOfP", #no description available + "Joelib.count.NumberOfO", #no description available + "Joelib.count.NumberOfN", #no description available + #"Joelib.count.AromaticBonds", #no description available + "Joelib.count.NumberOfI", #no description available + "Joelib.count.NumberOfF", #no description available + "Joelib.count.NumberOfC", #no description available + "Joelib.count.NumberOfB", #no description available + "Joelib.count.HydrophobicGroups", #no description available + #"Joelib.KierShape3", #no description available + #"Joelib.KierShape2", #no description available + #"Joelib.KierShape1", #no description available + #"Joelib.count.AcidicGroups", #no description available + "Joelib.count.AliphaticOHGroups", #no description available + #"Joelib.count.NumberOfAtoms", #no description available + "Joelib.TopologicalRadius", #no description available + "Joelib.GeometricalShapeCoefficient", #no description available + #"Joelib.MolecularWeight", #no description available + "Joelib.FractionRotatableBonds", #no description available + #"Joelib.count.HBD2", #no description available + #"Joelib.count.HBD1", #no description available + "Joelib.LogP", #no description available + "Joelib.GraphShapeCoefficient", #no description available + "Joelib.count.BasicGroups", #no description available + #"Joelib.count.RotatableBonds", #no description available + "Joelib.count.HeavyBonds", #no description available + "Joelib.PolarSurfaceArea", #no description available + #"Joelib.ZagrebIndex1", #no description available + "Joelib.GeometricalRadius", #no description available + "Joelib.count.SO2Groups", #no description available + "Joelib.count.AromaticOHGroups", #no description available + "Joelib.GeometricalDiameter", #no description available + #"Joelib.MolarRefractivity", #no description available + "Joelib.count.NumberOfCl", #no description available + "Joelib.count.OSOGroups", #no description available + "Joelib.count.NumberOfBr", #no description available + "Joelib.count.NO2Groups", #no description available + "Joelib.count.HeteroCycles", #no description available + #"Joelib.count.HBA2", #no description available + #"Joelib.count.HBA1", #no description available + #"Joelib.count.NumberOfBonds", #no description available + "Joelib.count.SOGroups", #no description available + "Joelib.TopologicalDiameter", #no description available + "Joelib.count.NumberOfHal", #no description available + +].sort diff --git a/lib/validation.rb b/lib/validation.rb deleted file mode 100644 index deba1e3..0000000 --- a/lib/validation.rb +++ /dev/null @@ -1,348 +0,0 @@ -require "yaml" - -module OldOpenTox - attr_accessor :metadata, :uri - - def initialize(uri=nil) - @metadata = {} - self.uri = uri if uri - end - - # loads metadata via yaml - def load_metadata - yaml = OpenTox::RestClientWrapper.get(uri,nil,{:accept => "application/x-yaml"}) - @metadata = YAML.load(yaml) - end - - def delete - OpenTox::RestClientWrapper.delete @uri.to_s - end -end - -module OpenTox - - class Validation - include OldOpenTox - - # find validation, raises error if not found - # @param [String] uri - # @return [OpenTox::Validation] - def self.find( uri ) - val = Validation.new(uri) - val.load_metadata - val - end - - # returns a filtered list of validation uris - # @param params [Hash,optional] validation-params to filter the uris (could be model, training_dataset, ..) - # @return [Array] - def self.list( params={} ) - filter_string = "" - params.each do |k,v| - filter_string += (filter_string.length==0 ? "?" : "&") - v = v.to_s.gsub(/;/, "%3b") if v.to_s =~ /;/ - filter_string += k.to_s+"="+v.to_s - end - (OpenTox::RestClientWrapper.get($validation[:uri]+filter_string).split("\n")) - end - - # creates a training test split validation, waits until it finishes, may take some time - # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,split_ratio(0.67),random_seed(1)) - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::Validation] - def self.create_training_test_split( params, waiting_task=nil ) - uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"training_test_split"), - params,{:content_type => "text/uri-list"},waiting_task ) - Validation.new(wait_for_task(uri)) - end - - # creates a training test validation, waits until it finishes, may take some time - # @param [Hash] params (required:algorithm_uri,training_dataset_uri,prediction_feature,test_dataset_uri,optional:algorithm_params) - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::Validation] - def self.create_training_test_validation( params, waiting_task=nil ) - uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"training_test_validation"), - params,{:content_type => "text/uri-list"},waiting_task ) - Validation.new(wait_for_task(uri)) - end - - # creates a bootstrapping validation, waits until it finishes, may take some time - # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,random_seed(1)) - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::Validation] - def self.create_bootstrapping_validation( params, waiting_task=nil ) - uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"bootstrapping"), - params,{:content_type => "text/uri-list"},waiting_task ) - Validation.new(wait_for_task(uri)) - end - - # looks for report for this validation, creates a report if no report is found - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [String] report uri - def find_or_create_report( waiting_task=nil ) - @report = ValidationReport.find_for_validation(@uri) unless @report - @report = ValidationReport.create(@uri, waiting_task) unless @report - @report.uri - end - - # creates a validation object from crossvaldiation statistics, raise error if not found - # (as crossvaldiation statistics are returned as an average valdidation over all folds) - # @param crossvalidation_uri [String] crossvalidation uri - # @return [OpenTox::Validation] - def self.from_cv_statistics( crossvalidation_uri ) - find( File.join(crossvalidation_uri, 'statistics') ) - end - - # returns confusion matrix as array, predicted values are in rows - # @example - # [[nil,"active","moderate","inactive"],["active",1,3,99],["moderate",4,2,8],["inactive",3,8,6]] - # -> 99 inactive compounds have been predicted as active - def confusion_matrix - raise "no classification statistics, probably a regression valdiation" unless @metadata[RDF::OT.classificationStatistics] - matrix = @metadata[RDF::OT.classificationStatistics][RDF::OT.confusionMatrix][RDF::OT.confusionMatrixCell] - values = matrix.collect{|cell| cell[RDF::OT.confusionMatrixPredicted]}.uniq - table = [[nil]+values] - values.each do |c| - table << [c] - values.each do |r| - matrix.each do |cell| - if cell[RDF::OT.confusionMatrixPredicted]==c and cell[RDF::OT.confusionMatrixActual]==r - table[-1] << cell[RDF::OT.confusionMatrixValue].to_f - break - end - end - end - end - table - end - - # filters the validation-predictions and returns validation-metadata with filtered statistics - # @param min_confidence [Float] predictions with confidence < min_confidence are filtered out - # @param min_num_predictions [Integer] optional, additional param to min_confidence, the top min_num_predictions are selected, even if confidence to low - # @param max_num_predictions [Integer] returns the top max_num_predictions (with the highest confidence), not compatible to min_confidence - # return [Hash] metadata - def filter_metadata( min_confidence, min_num_predictions=nil, max_num_predictions=nil ) - conf = min_confidence ? "min_confidence=#{min_confidence}" : nil - min = min_num_predictions ? "min_num_predictions=#{min_num_predictions}" : nil - max = max_num_predictions ? "max_num_predictions=#{max_num_predictions}" : nil - YAML.load(OpenTox::RestClientWrapper.get("#{@uri}?#{[conf,min,max].compact.join("&")}",nil,{:accept => "application/x-yaml"})) - end - - # returns probability-distribution for a given prediction - # it takes all predictions into account that have a confidence value that is >= confidence and that have the same predicted value - # (minimum 12 predictions with the hightest confidence are selected (even if the confidence is lower than the given param) - # - # @param confidence [Float] confidence value (between 0 and 1) - # @param prediction [String] predicted value - # @return [Hash] see example - # @example - # Example 1: - # validation.probabilities(0.3,"active") - # -> { :min_confidence=>0.32, :num_predictions=>20, :probs=>{"active"=>0.7, "moderate"=>0.25 "inactive"=>0.05 } } - # there have been 20 "active" predictions with confidence >= 0.3, 70 percent of them beeing correct - # - # Example 2: - # validation.probabilities(0.8,"active") - # -> { :min_confidence=>0.45, :num_predictions=>12, :probs=>{"active"=>0.9, "moderate"=>0.1 "inactive"=>0 } } - # the given confidence value was to high (i.e. <12 predictions with confidence value >= 0.8) - # the top 12 "active" predictions have a min_confidence of 0.45, 90 percent of them beeing correct - # - def probabilities( confidence, prediction ) - YAML.load(OpenTox::RestClientWrapper.get(@uri+"/probabilities?prediction="+prediction.to_s+"&confidence="+confidence.to_s,nil, - {:accept => "application/x-yaml"})) - end - end - - class Crossvalidation - include OldOpenTox - - attr_reader :report - - # find crossvalidation, raises error if not found - # @param [String] uri - # @return [OpenTox::Crossvalidation] - def self.find( uri ) - cv = Crossvalidation.new(uri) - cv.load_metadata - cv - end - - # returns a filtered list of crossvalidation uris - # @param params [Hash,optional] crossvalidation-params to filter the uris (could be algorithm, dataset, ..) - # @return [Array] - def self.list( params={} ) - filter_string = "" - params.each do |k,v| - filter_string += (filter_string.length==0 ? "?" : "&") - v = v.to_s.gsub(/;/, "%3b") if v.to_s =~ /;/ - filter_string += k.to_s+"="+v.to_s - end - (OpenTox::RestClientWrapper.get(File.join($validation[:uri],"crossvalidation")+filter_string).split("\n")) - end - - # creates a crossvalidations, waits until it finishes, may take some time - # @param [Hash] params (required:algorithm_uri,dataset_uri,prediction_feature, optional:algorithm_params,num_folds(10),random_seed(1),stratified(false)) - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::Crossvalidation] - def self.create( params, waiting_task=nil ) - uri = OpenTox::RestClientWrapper.post( File.join($validation[:uri],"crossvalidation"), - params,{:content_type => "text/uri-list"},waiting_task ) - uri = wait_for_task(uri) - Crossvalidation.new(uri) - end - - # looks for report for this crossvalidation, creates a report if no report is found - # @param [OpenTox::Task,optional] waiting_task (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [String] report uri - def find_or_create_report( waiting_task=nil ) - @report = CrossvalidationReport.find_for_crossvalidation(@uri) unless @report - @report = CrossvalidationReport.create(@uri, waiting_task) unless @report - @report.uri - end - - # loads metadata via yaml from crossvalidation object - # fields (like for example the validations) can be acces via validation.metadata[RDF::OT.validation] - def load_metadata - @metadata = YAML.load(OpenTox::RestClientWrapper.get(uri,nil,{:accept => "application/x-yaml"})) - end - - # returns a Validation object containing the statistics of the crossavlidation - def statistics - Validation.from_cv_statistics( @uri ) - end - - # documentation see OpenTox::Validation.probabilities - def probabilities( confidence, prediction ) - YAML.load(OpenTox::RestClientWrapper.get(@uri+"/statistics/probabilities?prediction="+prediction.to_s+"&confidence="+confidence.to_s,nil, - {:accept => "application/x-yaml"})) - end - - end - - class ValidationReport - include OldOpenTox - - # finds ValidationReport via uri, raises error if not found - # @param [String] uri - # @return [OpenTox::ValidationReport] - def self.find( uri ) - OpenTox::RestClientWrapper.get(uri) - rep = ValidationReport.new(uri) - rep.load_metadata - rep - end - - # finds ValidationReport for a particular validation - # @param validation_uri [String] crossvalidation uri - # @return [OpenTox::ValidationReport] nil if no report found - def self.find_for_validation( validation_uri ) - uris = RestClientWrapper.get(File.join($validation[:uri], - "/report/validation?validation="+validation_uri)).chomp.split("\n") - uris.size==0 ? nil : ValidationReport.new(uris[-1]) - end - - # creates a validation report via validation - # @param validation_uri [String] validation uri - # @param params [Hash] params addiditonal possible - # (min_confidence, params={}, min_num_predictions, max_num_predictions) - # @param waiting_task [OpenTox::Task,optional] (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::ValidationReport] - def self.create( validation_uri, params={}, waiting_task=nil ) - params = {} if params==nil - bad_request_error "params is no hash" unless params.is_a?(Hash) - params[:validation_uris] = validation_uri - uri = RestClientWrapper.post(File.join($validation[:uri],"/report/validation"), - params, {}, waiting_task ) - uri = wait_for_task(uri) - ValidationReport.new(uri) - end - - end - - class CrossvalidationReport - include OldOpenTox - - # finds CrossvalidationReport via uri, raises error if not found - # @param [String] uri - # @return [OpenTox::CrossvalidationReport] - def self.find( uri ) - OpenTox::RestClientWrapper.get(uri) - rep = CrossvalidationReport.new(uri) - rep.load_metadata - rep - end - - # finds CrossvalidationReport for a particular crossvalidation - # @param crossvalidation_uri [String] crossvalidation uri - # @return [OpenTox::CrossvalidationReport] nil if no report found - def self.find_for_crossvalidation( crossvalidation_uri ) - uris = RestClientWrapper.get(File.join($validation[:uri], - "/report/crossvalidation?crossvalidation="+crossvalidation_uri)).chomp.split("\n") - uris.size==0 ? nil : CrossvalidationReport.new(uris[-1]) - end - - # creates a crossvalidation report via crossvalidation - # @param crossvalidation_uri [String] crossvalidation uri - # @param waiting_task [OpenTox::Task,optional] (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::CrossvalidationReport] - def self.create( crossvalidation_uri, waiting_task=nil ) - uri = RestClientWrapper.post(File.join($validation[:uri],"/report/crossvalidation"), - { :validation_uris => crossvalidation_uri }, {}, waiting_task ) - uri = wait_for_task(uri) - CrossvalidationReport.new(uri) - end - end - - - class AlgorithmComparisonReport - include OldOpenTox - - # finds AlgorithmComparisonReport via uri, raises error if not found - # @param [String] uri - # @return [OpenTox::CrossvalidationReport] - def self.find( uri ) - OpenTox::RestClientWrapper.get(uri) - rep = AlgorithmComparisonReport.new(uri) - rep.load_metadata - rep - end - - # finds AlgorithmComparisonReport for a particular crossvalidation - # @param crossvalidation_uri [String] crossvalidation uri - # @return [OpenTox::AlgorithmComparisonReport] nil if no report found - def self.find_for_crossvalidation( crossvalidation_uri ) - uris = RestClientWrapper.get(File.join($validation[:uri], - "/report/algorithm_comparison?crossvalidation="+crossvalidation_uri)).chomp.split("\n") - uris.size==0 ? nil : AlgorithmComparisonReport.new(uris[-1]) - end - - # creates a algorithm comparison report via crossvalidation uris - # @param crossvalidation_uri_hash [Hash] crossvalidation uri_hash, see example - # @param params [Hash] params addiditonal possible - # (ttest_significance, ttest_attributes, min_confidence, min_num_predictions, max_num_predictions) - # @param waiting_task [OpenTox::Task,optional] (can be a OpenTox::Subtask as well), progress is updated accordingly - # @return [OpenTox::AlgorithmComparisonReport] - # example for hash: - # { :lazar-bbrc => [ http://host/validation/crossvalidation/x1, http://host/validation/crossvalidation/x2 ], - # :lazar-last => [ http://host/validation/crossvalidation/xy, http://host/validation/crossvalidation/xy ] } - def self.create( crossvalidation_uri_hash, params={}, waiting_task=nil ) - identifier = [] - validation_uris = [] - crossvalidation_uri_hash.each do |id, uris| - uris.each do |uri| - identifier << id - validation_uris << uri - end - end - params = {} if params==nil - raise OpenTox::BadRequestError.new "params is no hash" unless params.is_a?(Hash) - params[:validation_uris] = validation_uris.join(",") - params[:identifier] = identifier.join(",") - uri = RestClientWrapper.post(File.join($validation[:uri],"/report/algorithm_comparison"), params, {}, waiting_task ) - uri = wait_for_task(uri) - AlgorithmComparisonReport.new(uri) - end - end - -end - diff --git a/opentox-client.gemspec b/opentox-client.gemspec deleted file mode 100644 index 3bba11c..0000000 --- a/opentox-client.gemspec +++ /dev/null @@ -1,34 +0,0 @@ -# -*- encoding: utf-8 -*- -$:.push File.expand_path("../lib", __FILE__) - -Gem::Specification.new do |s| - s.name = "opentox-client" - s.version = File.read("./VERSION").strip - s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler"] - s.email = ["helma@in-silico.ch"] - s.homepage = "http://github.com/opentox/opentox-client" - s.summary = %q{Ruby wrapper for the OpenTox REST API} - s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} - s.license = 'GPL-3' - - s.rubyforge_project = "opentox-client" - - s.files = `git ls-files`.split("\n") - s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") - s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } - s.require_paths = ["lib"] - - # specify any dependencies here; for example: - s.add_runtime_dependency "bundler" - s.add_runtime_dependency "rest-client" - #s.add_runtime_dependency "rdf" - #s.add_runtime_dependency "rdf-raptor" - #s.add_runtime_dependency 'rdf-turtle' - s.add_runtime_dependency "open4" - s.add_runtime_dependency "openbabel" - s.add_runtime_dependency "mongoid", '~> 5.0beta' - - # external requirements - #["libraptor-dev"].each{|r| s.requirements << r} - #s.post_install_message = "Please check the version of your libraptor library, if installation of rdf.rb fails" -end diff --git a/test/compound.rb b/test/compound.rb new file mode 100644 index 0000000..7bbba58 --- /dev/null +++ b/test/compound.rb @@ -0,0 +1,93 @@ +require_relative "setup.rb" + +class CompoundTest < MiniTest::Test + + def test_0_compound_from_smiles + c = OpenTox::Compound.from_smiles "F[B-](F)(F)F.[Na+]" + assert_equal "InChI=1S/BF4.Na/c2-1(3,4)5;/q-1;+1", c.inchi + assert_equal "[B-](F)(F)(F)F.[Na+]", c.smiles, "A failure here might be caused by a compound webservice running on 64bit architectures using an outdated version of OpenBabel. Please install OpenBabel version 2.3.2 or higher." # seems to be fixed in 2.3.2 + end + + def test_1_compound_from_smiles + c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" + assert_equal "InChI=1S/C6H9NO/c1-5(4-7)3-6(2)8/h5H,3H2,1-2H3", c.inchi + assert_equal "CC(CC(=O)C)C#N", c.smiles + end + + def test_2_compound_from_smiles + c = OpenTox::Compound.from_smiles "N#[N+]C1=CC=CC=C1.F[B-](F)(F)F" + assert_equal "InChI=1S/C6H5N2.BF4/c7-8-6-4-2-1-3-5-6;2-1(3,4)5/h1-5H;/q+1;-1", c.inchi + assert_equal "c1ccc(cc1)[N+]#N.[B-](F)(F)(F)F", c.smiles + end + + def test_compound_from_name + c = OpenTox::Compound.from_name "Benzene" + assert_equal "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H", c.inchi + assert_equal "c1ccccc1", c.smiles + end + + def test_compound_from_inchi + c = OpenTox::Compound.from_inchi "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H" + assert_equal "c1ccccc1", c.smiles + end + + def test_sdf_import + c = OpenTox::Compound.from_sdf File.read(File.join DATA_DIR, "acetaldehyde.sdf") + assert_equal "InChI=1S/C2H4O/c1-2-3/h2H,1H3", c.inchi + assert_equal "CC=O", c.smiles + assert c.names.include? "Acetylaldehyde" + end + + def test_sdf_export + c = OpenTox::Compound.from_smiles "CC=O" + assert_match /7 6 0 0 0 0 0 0 0 0999 V2000/, c.sdf + end + + def test_compound_image + c = OpenTox::Compound.from_inchi "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H" + testbild = "/tmp/testbild.png" + File.open(testbild, "w"){|f| f.puts c.png} + assert_match "image/png", `file -b --mime-type /tmp/testbild.png` + File.unlink(testbild) + end + + # OpenBabel segfaults randomly during inchikey calculation + def test_inchikey + c = OpenTox::Compound.from_inchi "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H" + assert_equal "UHOVQNZJYSORNB-UHFFFAOYSA-N", c.inchikey + end + + def test_cid + c = OpenTox::Compound.from_inchi "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H" + assert_equal "241", c.cid + end + + def test_chemblid + c = OpenTox::Compound.from_inchi "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H" + #assert_equal "CHEMBL277500", c.chemblid + assert_equal "CHEMBL581676", c.chemblid + end + + def test_sdf_storage + c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" + c.sdf + assert !c.sdf_id.nil? + end + + def test_fingerprint + c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" + + assert c.fp4.collect{|fid| Feature.find(fid).name}.include? ("1,3-Tautomerizable") + assert_equal c.fp4.size, c.fp4_size + end + + def test_neighbors + d = Dataset.from_csv_file "data/EPAFHM.csv" + d.compounds.each do |c| + refute_nil c.fp4 + end + c = d.compounds[371] + assert_equal 19, c.neighbors.size + end + +end diff --git a/test/data/CPDBAS_v5c_1547_29Apr2008part.sdf b/test/data/CPDBAS_v5c_1547_29Apr2008part.sdf new file mode 100644 index 0000000..d7eb740 --- /dev/null +++ b/test/data/CPDBAS_v5c_1547_29Apr2008part.sdf @@ -0,0 +1,13553 @@ + + + + 14 16 0 0 0 0 0 0 0 0 1 V2000 + 7.3615 -3.7543 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2131 -3.0918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2131 -1.7594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0573 -1.0969 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9089 -1.7594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9089 -3.0918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0573 -3.7543 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6428 -3.5041 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8624 -2.4219 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5374 -2.2894 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.0748 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7803 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1054 -0.1325 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6428 -1.3471 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 2 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 14 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 +M END +> +20001 + +> +1 + +> +20001 + +> +1_CPDBAS_v5c + +> +C11H9N3 + +> +183.2122 + +> +defined organic + +> +parent + +> +tested chemical + +> +A-alpha-C + +> +26148-68-5 + +> +single chemical compound + +> +blank + +> +9H-pyrido[2,3-b]indol-2-amine + +> +NC1C=CC2=C(N=1)NC3=CC=CC=C23 + +> +NC1C=CC2=C(N=1)NC3=CC=CC=C23 + +> +InChI=1/C11H9N3/c12-10-6-5-8-7-3-1-2-4-9(7)13-11(8)14-10/h1-6H,(H3,12,13,14)/f/h13H,12H2 + +> +FJTNLJLPLJDTRM-DXMPFREMCP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +active + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +49.8 + +> +0.271815959854202 + +> +35 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; vascular system + +> +liver; vascular system + +> +blank + +> +active + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +blank + +> +active + +> +active + +> +multisite active; multisex active + +> +blank + +> +blank + +> +http://potency.berkeley.edu/chempages/A-alpha-C.html + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 2 V2000 + 3.4800 -1.1526 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4800 -2.4613 0.0000 N 0 5 0 0 0 0 0 0 0 0 0 0 + 2.3349 -3.1008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3349 -0.4610 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1749 -2.4613 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1749 -1.1526 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1344 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8110 -1.1526 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3349 -4.4392 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4359 -2.2159 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 7 2 0 0 0 0 + 1 8 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 9 2 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 10 1 0 0 0 0 +M CHG 2 2 -1 11 1 +M END +> +40770 + +> +10606 + +> +30606 + +> +2_CPDBAS_v5c + +> +C4H4KNO4S + +> +201.2422 + +> +defined organic + +> +salt K + +> +tested chemical + +> +Acesulfame-K + +> +55589-62-3 + +> +single chemical compound + +> +parent [33665-90-6] + +> +potassium 6-methyl-4-oxo-4H-1,2,3-oxathiazin-3-ide 2,2-dioxide + +> +O=S([N-]C1=O)(OC(C)=C1)=O.[K+] + +> +O=S(NC1=O)(OC(C)=C1)=O + +> +InChI=1/C4H5NO4S.K/c1-3-2-4(6)5-10(7,8)9-3;/h2H,1H3,(H,5,6);/q;+1/p-1/fC4H4NO4S.K/q-1;m + +> +WBZFUFAFFUEMEI-COHKJUPYCC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +Mouse added v5a; chemical added v5a + +> +http://potency.berkeley.edu/chempages/ACESULFAME-K.html + +$$$$ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 +M END +> +20002 + +> +2 + +> +39224 + +> +3_CPDBAS_v5c + +> +C2H4O + +> +44.0526 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetaldehyde + +> +75-07-0 + +> +single chemical compound + +> +acetaldehyde + +> +CC=O + +> +CC=O + +> +InChI=1/C2H4O/c1-2-3/h2H,1H3 + +> +IKHGUXGNUITLKF-UHFFFAOYAB + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; hamster + +> +inactive + +> +153 + +> +3.4731207692622 + +> +20 + +> +TD50 is harmonic mean of more than one positive test + +> +nasal cavity + +> +nasal cavity + +> +active + +> +565 + +> +12.8255766969486 + +> +1 + +> +TD50 is harmonic mean of more than one positive test + +> +nasal cavity; oral cavity + +> +oral cavity + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +http://potency.berkeley.edu/chempages/ACETALDEHYDE.html + +$$$$ + + + + 7 6 0 0 0 0 0 0 0 0 1 V2000 + 5.7637 -1.9942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6110 -1.3314 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4582 -1.9942 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3055 -1.3314 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3055 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1527 -1.9942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3314 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 2 0 0 0 0 +M END +> +20003 + +> +3 + +> +39225 + +> +4_CPDBAS_v5c + +> +C4H8N2O + +> +100.12 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetaldehyde methylformylhydrazone + +> +16568-02-8 + +> +single chemical compound + +> +N'-[(1E)-ethylidene]-N-methylformic hydrazide + +> +CC=NN(C)C=O + +> +CC=NN(C)C=O + +> +InChI=1/C4H8N2O/c1-3-5-6(2)4-7/h3-4H,1-2H3/b5-3+ + +> +IMAGWKUTFZRWSB-HWKANZROBR + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +inactive + +> +2.51 + +> +2.50699161006792E-02 + +> +46 + +> +TD50 is harmonic mean of more than one positive test + +> +lung; preputial gland + +> +clitoral gland; lung; stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/ACETALDEHYDE%20METHYLFORMYLHYDRAZONE.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3061 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +20004 + +> +4 + +> +20004 + +> +5_CPDBAS_v5c + +> +C2H5NO + +> +59.0672 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetaldoxime + +> +107-29-9 + +> +single chemical compound + +> +(1E)-acetaldehyde oxime + +> +CC=NO + +> +CC=NO + +> +InChI=1/C2H5NO/c1-2-3-4/h2,4H,1H3/b3-2+ + +> +FZENGILVLUJGJX-NSCUHMNNBP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/ACETALDOXIME.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 1.9950 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3292 -1.1518 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1518 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 +M END +> +20005 + +> +5 + +> +20005 + +> +6_CPDBAS_v5c + +> +C2H5NO + +> +59.0672 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetamide + +> +60-35-5 + +> +single chemical compound + +> +acetamide + +> +CC(=O)N + +> +CC(=O)N + +> +InChI=1/C2H5NO/c1-2(3)4/h1H3,(H2,3,4)/f/h3H2 + +> +DLFVBJFMPXGRIB-ZZOWFUDICC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +180 + +> +3.04737654739009 + +> +21 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +3010 + +> +50.9589078202454 + +> +9 + +> +hematopoietic system + +> +no positive results + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +http://potency.berkeley.edu/chempages/ACETAMIDE.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 3.8512 -1.8702 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9346 -2.8163 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5407 -0.5987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1522 -2.2102 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6410 -2.4689 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2397 -0.2587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0983 -1.2862 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2936 -1.2049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7583 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3919 -1.6114 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.8575 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 3 6 2 0 0 0 0 + 4 7 1 0 0 0 0 + 5 8 2 0 0 0 0 + 6 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 10 2 0 0 0 0 + 8 11 1 0 0 0 0 +M END +> +20006 + +> +6 + +> +20006 + +> +7_CPDBAS_v5c + +> +C8H9NO2 + +> +151.1626 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetaminophen + +> +103-90-2 + +> +single chemical compound + +> +N-(4-hydroxyphenyl)acetamide + +> +C1(=CC=C(C=C1)O)NC(C)=O + +> +C1(=CC=C(C=C1)O)NC(C)=O + +> +InChI=1/C8H9NO2/c1-6(10)9-7-2-4-8(11)5-3-7/h2-5,11H,1H3,(H,9,10)/f/h9H + +> +RZVAJINKPMORJF-BGGKNDAXCW + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +495 + +> +3.27461951567385 + +> +20 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; urinary bladder + +> +liver; urinary bladder + +> +active + +> +1620 + +> +10.7169365967508 + +> +17 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 394; final call in CPDB differs due to additional data + +> +http://potency.berkeley.edu/chempages/ACETAMINOPHEN.html + +$$$$ + + + + 22 23 0 0 0 0 0 0 0 0 1 V2000 + 5.1434 -4.1211 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9933 -3.4609 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8432 -2.7900 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3224 -4.6110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9913 -4.6110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3311 -5.7610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9913 -6.9111 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3224 -6.9111 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9933 -5.7610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3311 -8.0718 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9913 -9.2219 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -8.0718 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6642 -2.3002 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9953 -2.3002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6555 -3.4609 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6555 -1.1501 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9866 -1.1501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6575 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9780 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6489 -1.1501 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9780 -2.3002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6575 -2.3002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 2 13 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 14 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 22 1 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 1 0 0 0 0 + 21 22 1 0 0 0 0 +M END +> +20007 + +> +7 + +> +20007 + +> +8_CPDBAS_v5c + +> +C15H20N2O4S + +> +324.3953 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetohexamide + +> +968-81-0 + +> +single chemical compound + +> +4-acetyl-N-[(cyclohexylamino)carbonyl]benzenesulfonamide + +> +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2 + +> +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2 + +> +InChI=1/C15H20N2O4S/c1-11(18)12-7-9-14(10-8-12)22(20,21)17-15(19)16-13-5-3-2-4-6-13/h7-10,13H,2-6H2,1H3,(H2,16,17,19)/f/h16-17H + +> +VGZSUPCWNCWDAN-XQMQJMAZCC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 050 + +> +http://potency.berkeley.edu/chempages/ACETOHEXAMIDE.html + +$$$$ + + + + 18 19 0 0 0 0 0 0 0 0 2 V2000 + 11.1272 -2.0879 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1272 -0.7492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.2816 -2.7511 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9727 -2.7511 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8182 -2.0879 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6760 -2.7511 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5286 -4.0652 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2268 -4.3477 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5636 -3.1932 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4601 -2.2107 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2372 -3.0581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3529 -4.0407 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1370 -3.5003 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2721 -2.1861 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5740 -1.9037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2896 -1.2896 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.6335 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6335 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 10 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 15 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 16 18 1 0 0 0 0 +M CHG 2 16 1 18 -1 +M END +> +20008 + +> +8 + +> +20008 + +> +9_CPDBAS_v5c + +> +C10H10N4O3S + +> +266.274 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetone[4-(5-nitro-2-furyl)-2-thiazolyl] hydrazone + +> +18523-69-8 + +> +single chemical compound + +> +propan-2-one [5-(5-nitrofuran-2-yl)-1,3-thiazol-2-yl]hydrazone + +> +C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-] + +> +C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-] + +> +InChI=1/C10H10N4O3S/c1-6(2)12-13-10-11-5-8(18-10)7-3-4-9(17-7)14(15)16/h3-5H,1-2H3,(H,11,13)/f/h13H + +> +CUWVNOSSZYUJAE-NDKGDYFDCK + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +6.05 + +> +2.27209566086062E-02 + +> +43 + +> +stomach + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/ACETONE[4-(5-NITRO-2-FURYL)-2-THIAZOLYL]HYDRAZONE.html + +$$$$ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.6600 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 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 + 1 2 1 0 0 0 0 + 2 3 3 0 0 0 0 +M END +> +20009 + +> +9 + +> +20009 + +> +10_CPDBAS_v5c + +> +C2H3N + +> +41.0519 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetonitrile + +> +75-05-8 + +> +single chemical compound + +> +acetonitrile + +> +CC#N + +> +CC#N + +> +InChI=1/C2H3N/c1-2-3/h1H3 + +> +WEVYAHXRMPXWCK-UHFFFAOYAJ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 447 + +> +http://potency.berkeley.edu/chempages/ACETONITRILE.html + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 3.4567 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -1.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3308 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 5 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +20010 + +> +10 + +> +20010 + +> +11_CPDBAS_v5c + +> +C3H7NO + +> +73.0938 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acetoxime + +> +127-06-0 + +> +single chemical compound + +> +propan-2-one oxime + +> +CC(=NO)C + +> +CC(=NO)C + +> +InChI=1/C3H7NO/c1-3(2)4-5/h5H,1-2H3 + +> +PXAJQJMDEXJWFB-UHFFFAOYAK + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +12.1 + +> +0.165540716175654 + +> +34 + +> +liver + +> +no positive results + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/ACETOXIME.html + +$$$$ + + + + 16 17 0 0 0 0 0 0 0 0 1 V2000 + 1.1551 -0.6716 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9126 -2.6594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9126 -3.9935 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1751 -2.2475 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1751 -4.4054 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9541 -3.3309 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7575 -1.9968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7575 -4.6561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 -0.6716 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6024 -2.6594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6024 -3.9935 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 -1.9968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 -2.6594 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1551 -1.9968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 15 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 11 2 0 0 0 0 + 8 12 2 0 0 0 0 + 9 13 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 +M END +> +20011 + +> +11 + +> +39226 + +> +12_CPDBAS_v5c + +> +C12H12O4 + +> +220.2213 + +> +defined organic + +> +parent + +> +tested chemical + +> +1'-Acetoxysafrole + +> +34627-78-6 + +> +single chemical compound + +> +1-(1,3-benzodioxol-5-yl)prop-2-en-1-yl acetate + +> +O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C + +> +O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C + +> +InChI=1/C12H12O4/c1-3-10(16-8(2)13)9-4-5-11-12(6-9)15-7-14-11/h3-6,10H,1,7H2,2H3 + +> +TXUCQVJZBXYDKH-UHFFFAOYAY + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +25 + +> +0.113522170652884 + +> +35 + +> +TD50 is harmonic mean of more than one positive test + +> +stomach + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +http://potency.berkeley.edu/chempages/1'-ACETOXYSAFROLE.html + +$$$$ + + + + 13 13 0 0 0 0 0 0 0 0 1 V2000 + 2.6636 -2.3090 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9977 -1.1588 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6659 -1.1588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9953 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6526 -1.1588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9844 -1.1588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6503 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9844 -3.4592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6526 -3.4592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9820 -2.3090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6479 -3.4592 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 12 1 0 0 0 0 + 10 11 2 0 0 0 0 + 12 13 1 0 0 0 0 +M END +> +20012 + +> +12 + +> +20012 + +> +13_CPDBAS_v5c + +> +C9H12N2O2 + +> +180.206 + +> +defined organic + +> +parent + +> +tested chemical + +> +N'-Acetyl-4-(hydroxymethyl) phenylhydrazine + +> +65734-38-5 + +> +single chemical compound + +> +N'-[4-(hydroxymethyl)phenyl]acetohydrazide + +> +N(NC(C)=O)C1=CC=C(C=C1)CO + +> +N(NC(C)=O)C1=CC=C(C=C1)CO + +> +InChI=1/C9H12N2O2/c1-7(13)10-11-9-4-2-8(6-12)3-5-9/h2-5,11-12H,6H2,1H3,(H,10,13)/f/h10H + +> +UFFJUAYKLIGSJF-KZFATGLACR + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +241 + +> +1.33735835654751 + +> +27 + +> +TD50 is harmonic mean of more than one positive test + +> +lung; vascular system + +> +lung; vascular system + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/N'-ACETYL-4-(HYDROXYMETHYL)PHENYLHYDRAZINE.html + +$$$$ + + + + 13 13 0 0 0 0 0 0 0 0 1 V2000 + 3.4560 -1.9979 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3040 -1.3292 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 -1.9979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3292 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 -3.3271 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6000 -1.3292 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7520 -1.9979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9040 -1.3292 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0560 -1.9979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0560 -3.3271 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9040 -3.9877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7520 -3.3271 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 6 13 2 0 0 0 0 + 7 8 2 0 0 0 0 + 7 12 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +20013 + +> +13 + +> +20013 + +> +14_CPDBAS_v5c + +> +C8H9N3O2 + +> +179.178 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Acetyl-2-isonicotinoylhydrazine + +> +1078-38-2 + +> +single chemical compound + +> +N'-acetylpyridine-4-carbohydrazide + +> +N(NC(C)=O)C(C1=CC=NC=C1)=O + +> +N(NC(C)=O)C(C1=CC=NC=C1)=O + +> +InChI=1/C8H9N3O2/c1-6(12)10-11-8(13)7-2-4-9-5-3-7/h2-5H,1H3,(H,10,12)(H,11,13)/f/h10-11H + +> +CVBGNAKQQUWBQV-PZWAIHAUCF + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +330 + +> +1.84174396410274 + +> +25 + +> +TD50 is harmonic mean of more than one positive test + +> +lung + +> +lung + +> +active + +> +active + +> +active + +> +multisex active + +> +http://potency.berkeley.edu/chempages/1-ACETYL-2-ISONICOTINOYLHYDRAZINE.html + +$$$$ + + + + 12 12 0 0 0 0 0 0 0 0 1 V2000 + 1.9922 -4.6067 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6563 -3.4580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9922 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6563 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9922 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9905 -1.1547 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6546 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9905 -3.4580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9827 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6641 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4580 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 +M END +> +20014 + +> +14 + +> +20014 + +> +15_CPDBAS_v5c + +> +C8H8O4 + +> +168.1488 + +> +defined organic + +> +parent + +> +tested chemical + +> +3-Acetyl-6-methyl-2,4-pyrandione + +> +520-45-6 + +> +single chemical compound + +> +tautomers + +> +3-acetyl-6-methyl-2H-pyran-2,4(3H)-dione + +> +O=C1C(C(=O)OC(=C1)C)C(=O)C + +> +O=C1C(C(=O)OC(=C1)C)C(=O)C + +> +InChI=1/C8H8O4/c1-4-3-6(10)7(5(2)9)8(11)12-4/h3,7H,1-2H3 + +> +PGRHXDWITVMQBC-UHFFFAOYAH + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/3-ACETYL-6-METHYL-2,4-PYRANDIONE.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 3.9907 -2.3079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6605 -2.3079 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9953 -1.1573 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6651 -1.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6558 -1.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9860 -1.1573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6511 -2.3079 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9860 -3.4586 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6558 -3.4586 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 2 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 +M END +> +20015 + +> +15 + +> +20015 + +> +16_CPDBAS_v5c + +> +C8H10N2O + +> +150.1778 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Acetyl-2-phenylhydrazine + +> +114-83-0 + +> +single chemical compound + +> +N'-phenylacetohydrazide + +> +C1(NNC(C)=O)=CC=CC=C1 + +> +C1(NNC(C)=O)=CC=CC=C1 + +> +InChI=1/C8H10N2O/c1-7(11)9-10-8-5-3-2-4-6-8/h2-6,10H,1H3,(H,9,11)/f/h9H + +> +UICBCXONCUFSOI-BGGKNDAXCP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +active + +> +51.2 + +> +0.34092921856626 + +> +34 + +> +TD50 is harmonic mean of more than one positive test + +> +vascular system + +> +vascular system + +> +active + +> +active + +> +active + +> +multisex active + +> +http://potency.berkeley.edu/chempages/1-ACETYL-2-PHENYLHYDRAZINE.html + +$$$$ + + + + 16 17 0 0 0 0 0 0 0 0 1 V2000 + 1.9954 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3269 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1473 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9954 -2.3046 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3223 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9907 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3176 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9861 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3176 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9907 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3130 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9814 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3083 -1.1473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9768 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3083 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9814 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 8 11 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +20016 + +> +16 + +> +39243 + +> +17_CPDBAS_v5c + +> +C14H13NO + +> +211.2628 + +> +defined organic + +> +parent + +> +tested chemical + +> +4-Acetylaminobiphenyl + +> +4075-79-0 + +> +single chemical compound + +> +N-biphenyl-4-ylacetamide + +> +CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2 + +> +CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2 + +> +InChI=1/C14H13NO/c1-11(16)15-14-9-7-13(8-10-14)12-5-3-2-4-6-12/h2-10H,1H3,(H,15,16)/f/h15H + +> +SVLDILRDQOVJED-YAQRNVERCM + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +1.18 + +> +5.58546038393887E-03 + +> +49 + +> +mammary gland + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/4-ACETYLAMINOBIPHENYL.html + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 8.3884 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7257 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3884 -4.6052 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3920 -3.4560 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7293 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3955 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5064 -3.2883 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2900 -2.7514 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0737 -3.2883 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.5081 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1426 -1.1828 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3505 -0.6459 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4326 -1.4260 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7328 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3955 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7293 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3920 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 17 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 14 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 13 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 +M END +> +20017 + +> +17 + +> +20017 + +> +18_CPDBAS_v5c + +> +C15H13NO + +> +223.2738 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Acetylaminofluorene + +> +28314-03-6 + +> +single chemical compound + +> +N-9H-fluoren-1-ylacetamide + +> +CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1 + +> +CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1 + +> +InChI=1/C15H13NO/c1-10(17)16-15-8-4-7-13-12-6-3-2-5-11(12)9-14(13)15/h2-8H,9H2,1H3,(H,16,17)/f/h16H + +> +POECHIXSIXBYKI-WYUMXYHSCQ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/1-ACETYLAMINOFLUORENE.html + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 5.7640 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0213 -1.3540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8046 -2.4275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1296 -2.2921 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6712 -1.0735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8878 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5629 -0.1451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0213 -3.5106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7640 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6035 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4526 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4526 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6035 -1.1025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3017 -3.7621 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 -1.7698 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 13 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 14 1 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 17 2 0 0 0 0 +M END +> +20018 + +> +18 + +> +39227 + +> +19_CPDBAS_v5c + +> +C15H13NO + +> +223.2698 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Acetylaminofluorene + +> +53-96-3 + +> +single chemical compound + +> +N-9H-fluoren-2-ylacetamide + +> +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O + +> +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O + +> +InChI=1/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17)/f/h16H + +> +CZIHNRWJTSTCEX-WYUMXYHSCF + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse; hamster; rhesus + +> +active + +> +1.22 + +> +5.46424102140101E-03 + +> +49 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; mammary gland; skin + +> +liver; mammary gland; skin + +> +active + +> +7.59 + +> +3.39947453708473E-02 + +> +45 + +> +TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results + +> +liver; urinary bladder + +> +liver; urinary bladder + +> +active + +> +17.4 + +> +7.79326178462112E-02 + +> +53 + +> +liver + +> +no positive results + +> +active + +> +no positive results + +> +no positive results for Rhesus + +> +inactive + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +http://potency.berkeley.edu/chempages/2-ACETYLAMINOFLUORENE.html + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 2.3012 -3.9858 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2905 -4.8819 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7528 -6.0934 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5342 -7.1688 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8533 -7.0326 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3981 -5.8139 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6167 -4.7385 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4266 -5.9572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1542 -4.6525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9858 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1542 -1.9929 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 -2.6596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4553 -1.9929 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4553 -0.6667 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6023 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 13 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 17 2 0 0 0 0 +M END +> +20019 + +> +19 + +> +20019 + +> +20_CPDBAS_v5c + +> +C15H13NO + +> +223.2698 + +> +defined organic + +> +parent + +> +tested chemical + +> +4-Acetylaminofluorene + +> +28322-02-3 + +> +single chemical compound + +> +N-9H-fluoren-4-ylacetamide + +> +C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O + +> +C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O + +> +InChI=1/C15H13NO/c1-10(17)16-14-8-4-6-12-9-11-5-2-3-7-13(11)15(12)14/h2-8H,9H2,1H3,(H,16,17)/f/h16H + +> +PHPWISAFHNEMSR-WYUMXYHSCU + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/4-ACETYLAMINOFLUORENE.html + +$$$$ + + + + 14 14 0 0 0 0 0 0 0 0 1 V2000 + 5.7595 -0.6749 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7595 -1.9876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6224 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6224 -2.6625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4853 -0.6749 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4853 -1.9876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9335 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0891 -0.6564 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2447 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0891 -1.9876 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3112 -2.6625 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1556 -1.9876 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6625 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1556 -0.6564 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 1 7 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 14 2 0 0 0 0 +M END +> +20020 + +> +20 + +> +20020 + +> +21_CPDBAS_v5c + +> +C10H11NO3 + +> +193.1992 + +> +defined organic + +> +parent + +> +tested chemical + +> +4-Acetylaminophenylacetic acid + +> +18699-02-0 + +> +single chemical compound + +> +[4-(acetylamino)phenyl]acetic acid + +> +O=C(O)Cc1ccc(cc1)NC(C)=O + +> +O=C(O)Cc1ccc(cc1)NC(C)=O + +> +InChI=1/C10H11NO3/c1-7(12)11-9-4-2-8(3-5-9)6-10(13)14/h2-5H,6H2,1H3,(H,11,12)(H,13,14)/f/h11,13H + +> +MROJXXOCABQVEF-KZZMUEETCP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +Rat added v2a; Mouse added v2a + +> +http://potency.berkeley.edu/chempages/4-ACETYLAMINOPHENYLACETIC%20ACID.html + +$$$$ + + + + 10 9 0 0 1 0 0 0 0 0 1 V2000 + 2.3100 -1.9854 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4651 -1.3307 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3100 -3.3213 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4651 -3.9920 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4651 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4651 -5.3227 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6148 -1.9854 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9854 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1710 -1.3307 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6148 -3.3213 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 1 0 0 0 + 1 9 1 0 0 0 0 + 2 5 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 6 2 0 0 0 0 + 4 10 1 0 0 0 0 + 8 9 1 0 0 0 0 +M END +> +20021 + +> +21 + +> +20021 + +> +22_CPDBAS_v5c + +> +C5H9NO3S + +> +163.1949 + +> +defined organic + +> +parent + +> +tested chemical + +> +N-acetylcysteine + +> +616-91-1 + +> +single chemical compound + +> +stereochem + +> +N-acetyl-L-cysteine + +> +CC(=O)N[C@@H](CS)C(=O)O + +> +CC(=O)N[C@@H](CS)C(=O)O + +> +InChI=1/C5H9NO3S/c1-3(7)6-4(2-10)5(8)9/h4,10H,2H2,1H3,(H,6,7)(H,8,9)/t4-/m0/s1/f/h6,8H + +> +PWKSKIMOESPYIA-JVBVHTJODB + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +Rat added v2a + +> +http://potency.berkeley.edu/chempages/N-ACETYLCYSTEINE.html + +$$$$ + + + + 24 25 0 0 0 0 0 0 0 0 2 V2000 + 11.5157 -1.9922 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3641 -1.3358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3641 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2126 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2126 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0610 -3.9959 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9094 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9094 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0610 -1.3358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7578 -1.3358 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6063 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6063 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4547 -3.9959 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3031 -3.3280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3031 -1.9922 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4547 -1.3358 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4547 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1516 -3.9959 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4837 -2.8444 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8195 -5.1475 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.6523 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3641 -3.9959 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 10.3641 -5.3203 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5157 -3.3280 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 22 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 18 1 0 0 0 0 + 15 16 2 0 0 0 0 + 16 17 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 20 1 0 0 0 0 + 18 21 1 0 0 0 0 + 22 23 2 0 0 0 0 + 22 24 1 0 0 0 0 +M CHG 2 22 1 24 -1 +M END +> +20022 + +> +22 + +> +20022 + +> +23_CPDBAS_v5c + +> +C14H7ClF3NO5 + +> +361.6573 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acifluorfen + +> +50594-66-6 + +> +single chemical compound + +> +5-{[2-chloro-4-(trifluoromethyl)phenyl]oxy}-2-nitrobenzoic acid + +> +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-] + +> +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-] + +> +InChI=1/C14H7ClF3NO5/c15-10-5-7(14(16,17)18)1-4-12(10)24-8-2-3-11(19(22)23)9(6-8)13(20)21/h1-6H,(H,20,21)/f/h20H + +> +NUFNQYOELLVIPL-UYBDAZJACV + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +141 + +> +0.389871848293951 + +> +33 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; stomach + +> +liver; stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/ACIFLUORFEN.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3061 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 +M END +> +20023 + +> +23 + +> +20023 + +> +24_CPDBAS_v5c + +> +C3H4O + +> +56.0633 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrolein + +> +107-02-8 + +> +single chemical compound + +> +acrylaldehyde + +> +C=CC=O + +> +C=CC=O + +> +InChI=1/C3H4O/c1-2-3-4/h2-3H,1H2 + +> +HGINCPLSRVDWNT-UHFFFAOYAQ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +http://potency.berkeley.edu/chempages/ACROLEIN.html + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 -2.6588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3040 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3040 -0.6635 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4560 -2.6588 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6080 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6080 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 +M END +> +20024 + +> +24 + +> +20024 + +> +25_CPDBAS_v5c + +> +C7H14O2 + +> +130.1864 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrolein diethylacetal + +> +3054-95-3 + +> +single chemical compound + +> +3,3-bis(ethyloxy)prop-1-ene + +> +C=CC(OCC)OCC + +> +C=CC(OCC)OCC + +> +InChI=1/C7H14O2/c1-4-7(8-5-2)9-6-3/h4,7H,1,5-6H2,2-3H3 + +> +MCIPQLOKVXSHTD-UHFFFAOYAI + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/ACROLEIN%20DIETHYLACETAL.html + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 4.6099 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1525 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 +M END +> +20025 + +> +25 + +> +20025 + +> +26_CPDBAS_v5c + +> +C3H5NO + +> +71.0786 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrolein oxime + +> +5314-33-0 + +> +single chemical compound + +> +(1E)-prop-2-enal oxime + +> +C=C/C=N/O + +> +C=C/C=N/O + +> +InChI=1/C3H5NO/c1-2-3-4-5/h2-3,5H,1H2/b4-3+ + +> +KMNIXISXZFPRDC-ONEGZZNKBI + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/ACROLEIN%20OXIME.html + +$$$$ + + + + 24 27 0 0 0 0 0 0 0 0 1 V2000 + 6.9100 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7600 -5.6730 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4598 -5.6730 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3001 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1501 -5.6730 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -5.0061 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3001 -3.6821 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4598 -3.0153 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -3.6821 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7600 -3.0153 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7600 -1.6816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -1.0148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4598 -1.6816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7498 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4604 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4598 -7.0067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -7.6735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7600 -7.0067 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9100 -7.6735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9100 -8.9975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7600 -9.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -8.9975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3001 -7.6735 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 19 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 8 2 0 0 0 0 + 6 7 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 13 15 1 0 0 0 0 + 13 16 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 24 2 0 0 0 0 + 18 19 2 0 0 0 0 + 18 23 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 2 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 2 0 0 0 0 +M END +> +20026 + +> +26 + +> +20026 + +> +27_CPDBAS_v5c + +> +C20H19NO3 + +> +321.3698 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acronycine + +> +7008-42-6 + +> +single chemical compound + +> +3,3,12-trimethyl-6-(methyloxy)-3,12-dihydro-7H-pyrano[2,3-c]acridin-7-one + +> +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O + +> +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O + +> +InChI=1/C20H19NO3/c1-20(2)10-9-13-15(24-20)11-16(23-4)17-18(13)21(3)14-8-6-5-7-12(14)19(17)22/h5-11H,1-4H3 + +> +SMPZPKRDRQOOHT-UHFFFAOYAD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +0.505 + +> +1.57139843258452E-03 + +> +55 + +> +positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test + +> +bone; peritoneal cavity + +> +mammary gland; peritoneal cavity + +> +active + +> +0 + +> +NTP bioassay inadequate + +> +NTP bioassay inadequate + +> +NTP bioassay inadequate + +> +inconclusive + +> +active + +> +active + +> +multisite active; multisex active + +> +TR 49 + +> +http://potency.berkeley.edu/chempages/ACRONYCINE.html + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 3.4567 -1.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 +M END +> +20027 + +> +27 + +> +20027 + +> +28_CPDBAS_v5c + +> +C3H5NO + +> +71.0779 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrylamide + +> +79-06-1 + +> +single chemical compound + +> +acrylamide + +> +NC(=O)C=C + +> +NC(=O)C=C + +> +InChI=1/C3H5NO/c1-2-3(4)5/h2H,1H2,(H2,4,5)/f/h4H2 + +> +HRPVXLWXLXDGHG-LGEMBHMGCJ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +3.75 + +> +0.052759015108775 + +> +39 + +> +TD50 is harmonic mean of more than one positive test + +> +nervous system; peritoneal cavity; thyroid gland + +> +clitoral gland; mammary gland; nervous system; oral cavity; thyroid gland; uterus + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +TD50_Rat modified v3a + +> +http://potency.berkeley.edu/chempages/ACRYLAMIDE.html + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 3.4567 -1.9945 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 +M END +> +20028 + +> +28 + +> +39229 + +> +29_CPDBAS_v5c + +> +C3H4O2 + +> +72.0627 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrylic acid + +> +79-10-7 + +> +single chemical compound + +> +acrylic acid + +> +OC(=O)C=C + +> +OC(=O)C=C + +> +InChI=1/C3H4O2/c1-2-3(4)5/h2H,1H2,(H,4,5)/f/h4H + +> +NIXOWILDQLNWCW-JLSKMEETCA + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/ACRYLIC%20ACID.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6652 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9956 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3260 -1.1508 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 3 0 0 0 0 +M END +> +20029 + +> +29 + +> +20029 + +> +30_CPDBAS_v5c + +> +C3H3N + +> +53.0626 + +> +defined organic + +> +parent + +> +tested chemical + +> +Acrylonitrile + +> +107-13-1 + +> +single chemical compound + +> +acrylonitrile + +> +C=CC#N + +> +C=CC#N + +> +InChI=1/C3H3N/c1-2-3-4/h2H,1H2 + +> +NLHHRLWOUZZQLW-UHFFFAOYAG + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +16.9 + +> +0.318491743714028 + +> +31 + +> +TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results + +> +ear Zymbals gland; nervous system; oral cavity; small intestine; stomach + +> +ear Zymbals gland; mammary gland; nasal cavity; nervous system; oral cavity; small intestine; stomach + +> +active + +> +6.32 + +> +0.119104604749861 + +> +39 + +> +TD50 is harmonic mean of more than one positive test + +> +harderian gland; stomach + +> +harderian gland; stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +Mouse added v5a + +> +http://potency.berkeley.edu/chempages/ACRYLONITRILE.html + +$$$$ + + + + 93 99 0 0 1 0 0 0 0 0 1 V2000 + 11.4975 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4975 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5218 -12.3337 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4523 -12.3337 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4523 -14.7168 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5218 -14.7168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5218 -11.1421 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5670 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4279 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4279 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5670 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5218 -15.9083 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5670 -10.5359 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4975 -10.5359 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5914 -12.3337 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3827 -12.3337 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3827 -14.7168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5914 -14.7168 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3827 -11.1421 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3584 -12.9190 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3584 -14.1106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3827 -15.9083 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3584 -10.5359 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4279 -10.5359 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5670 -9.2816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4800 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6332 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4800 -3.8046 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4139 -9.2816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6332 -7.4211 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.7411 -9.2607 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 16.7654 -8.6754 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.7654 -7.4838 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8734 -2.9893 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 18.2496 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8350 -3.7001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4412 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8175 -2.9893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8593 -4.2854 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8350 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8316 -5.6860 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8802 -5.6860 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8802 -6.8776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.9045 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8350 -7.4838 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8316 -6.8776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8350 -8.6754 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8802 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8316 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.8316 -10.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.8350 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.7654 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3584 -9.2816 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4454 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2923 -8.6545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4454 -3.8046 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5116 -9.2816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2923 -7.4211 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1634 -9.2607 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1391 -8.6754 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1391 -7.4838 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0312 -2.9893 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6549 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0695 -3.7001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4633 -1.8396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1079 -2.9893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0661 -4.2854 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0695 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0939 -5.6860 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0243 -5.6860 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0243 -6.8776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -5.0798 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0695 -7.4838 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0939 -6.8776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0695 -8.6754 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0243 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0939 -9.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0939 -10.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0695 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1391 -11.0585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6750 -3.8046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5879 -3.1566 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6750 -5.0589 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5879 -1.9023 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4800 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6750 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4800 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2505 -3.8046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3375 -3.1566 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2505 -5.0589 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3375 -1.9023 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2505 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4454 -1.2752 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 2 0 0 0 0 + 2 5 1 0 0 0 0 + 2 6 2 0 0 0 0 + 3 7 1 0 0 0 0 + 3 8 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 10 1 0 0 0 0 + 6 11 1 0 0 0 0 + 6 12 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 2 0 0 0 0 + 8 15 1 0 0 0 0 + 8 11 1 0 0 0 0 + 9 16 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 17 2 0 0 0 0 + 11 18 2 0 0 0 0 + 25 13 1 6 0 0 0 + 16 19 1 0 0 0 0 + 16 20 1 0 0 0 0 + 17 21 1 0 0 0 0 + 17 22 1 0 0 0 0 + 19 23 1 0 0 0 0 + 19 24 2 0 0 0 0 + 20 21 2 0 0 0 0 + 53 23 1 1 0 0 0 + 25 26 1 0 0 0 0 + 25 27 1 0 0 0 0 + 26 28 1 0 0 0 0 + 26 29 2 0 0 0 0 + 27 30 1 1 0 0 0 + 27 31 1 0 0 0 0 + 82 28 1 6 0 0 0 + 31 32 1 0 0 0 0 + 32 33 2 0 0 0 0 + 32 49 1 0 0 0 0 + 34 35 1 0 0 0 0 + 34 36 1 0 0 0 0 + 34 81 1 0 0 0 0 + 35 37 1 0 0 0 0 + 36 38 1 0 0 0 0 + 36 39 1 6 0 0 0 + 36 40 1 0 0 0 0 + 37 38 1 0 0 0 0 + 40 41 2 0 0 0 0 + 40 42 1 0 0 0 0 + 42 43 1 0 0 0 0 + 42 44 1 0 0 0 0 + 43 45 1 0 0 0 0 + 45 46 2 0 0 0 0 + 45 47 1 0 0 0 0 + 47 48 1 0 0 0 0 + 47 49 1 0 0 0 0 + 49 50 1 1 0 0 0 + 50 51 1 0 0 0 0 + 50 52 1 0 0 0 0 + 53 54 1 0 0 0 0 + 53 55 1 0 0 0 0 + 54 56 1 0 0 0 0 + 54 57 2 0 0 0 0 + 55 58 1 6 0 0 0 + 55 59 1 0 0 0 0 + 89 56 1 1 0 0 0 + 59 60 1 0 0 0 0 + 60 61 2 0 0 0 0 + 60 77 1 0 0 0 0 + 62 63 1 0 0 0 0 + 62 64 1 0 0 0 0 + 62 88 1 0 0 0 0 + 63 65 1 0 0 0 0 + 64 66 1 0 0 0 0 + 64 67 1 1 0 0 0 + 64 68 1 0 0 0 0 + 65 66 1 0 0 0 0 + 68 69 2 0 0 0 0 + 68 70 1 0 0 0 0 + 70 71 1 0 0 0 0 + 70 72 1 0 0 0 0 + 71 73 1 0 0 0 0 + 73 74 2 0 0 0 0 + 73 75 1 0 0 0 0 + 75 76 1 0 0 0 0 + 75 77 1 0 0 0 0 + 77 78 1 6 0 0 0 + 78 79 1 0 0 0 0 + 78 80 1 0 0 0 0 + 81 82 1 0 0 0 0 + 81 83 2 0 0 0 0 + 82 84 1 0 0 0 0 + 84 85 1 0 0 0 0 + 84 86 1 6 0 0 0 + 85 87 1 0 0 0 0 + 88 89 1 0 0 0 0 + 88 90 2 0 0 0 0 + 89 91 1 0 0 0 0 + 91 92 1 0 0 0 0 + 91 93 1 0 0 0 0 +M END +> +20030 + +> +30 + +> +20030 + +> +31_CPDBAS_v5c + +> +C63H88N12O16 + +> +1269.4436 + +> +defined organic + +> +parent + +> +representative component in mixture + +> +Actinomycin C + +> +8052-16-2 + +> +mixture or formulation + +> +mixture of actinomycin C1 [50-76-0] (10%), actinomycin C2 [2612-14-8] (45%), and actinomycin C3 [6156-47-4] (45%), structure shown C2, stereochem + +> +2-amino-4,6-dimethyl-3-oxo-N~9~-[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-N~1~-{(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6-(1-methylethyl) + +> +O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N + +> +O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N + +> +InChI=1/C63H88N12O16/c1-17-31(8)44-61(86)75-25-19-21-38(75)59(84)71(14)27-40(77)73(16)50(30(6)7)63(88)90-35(12)46(57(82)67-44)69-55(80)41-42(64)51(78)33(10)53-48(41)65-47-36(23-22-32(9)52(47)91-53)54(79)68-45-34(11)89-62(87)49(29(4)5)72(15)39(76)26-70(13)58(83)37-20-18-24-74(37)60(85)43(28(2)3)66-56(45)81/h22-23,28-31,34-35,37-38,43-46,49-50H,17-21,24-27,64H2,1-16H3,(H,66,81)(H,67,82)(H,68,79)(H,69,80)/t31-,34+,35+,37-,38-,43+,44+,45-,46-,49-,50-/m0/s1/f/h66-69H + +> +QCXJFISCRQIYID-IFORFJDKDU + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/ACTINOMYCIN%20C.html + +$$$$ + + + + 92 98 0 0 1 0 0 0 0 0 1 V2000 + 11.5534 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5534 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5827 -10.8602 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5031 -10.8602 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5031 -13.2549 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5827 -13.2549 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5827 -9.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6330 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4738 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4738 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6330 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5827 -14.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6330 -9.0537 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5534 -9.0537 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6623 -10.8602 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4235 -10.8602 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4235 -13.2549 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6623 -13.2549 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4235 -9.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3942 -11.4484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3942 -12.6457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4235 -14.4523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3942 -9.0537 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4738 -9.0537 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6330 -7.7933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5407 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7043 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5407 -2.2897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4694 -7.7933 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7043 -5.9238 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.8177 -7.7723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 16.8470 -7.1841 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.8470 -5.9868 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5280 -1.8065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5280 -0.6092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6706 -2.3947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9603 -1.4704 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 15.6706 -3.5921 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 18.3384 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9266 -2.1846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.5358 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9139 -1.4704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4777 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5573 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9559 -2.7728 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9266 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9183 -4.1802 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9769 -4.1802 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9769 -5.3776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.0062 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9266 -5.9868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9183 -5.3776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9266 -7.1841 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.9769 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9183 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9183 -8.9697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9266 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 16.8470 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3942 -7.7933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4865 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3229 -7.1631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4865 -2.2897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5578 -7.7933 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3229 -5.9238 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1885 -7.7723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1592 -7.1841 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1592 -5.9868 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4992 -1.8065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4992 -0.6092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3566 -2.3947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0459 -1.4704 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3566 -3.5921 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6678 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0796 -2.1846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4704 -0.3151 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1133 -1.4704 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5285 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4489 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0713 -2.7728 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0796 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1089 -4.1802 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0293 -4.1802 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0293 -5.3776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.5711 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0796 -5.9868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1089 -5.3776 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0796 -7.1841 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0293 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1089 -7.7723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1089 -8.9697 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0796 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1592 -9.5788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 2 0 0 0 0 + 2 5 1 0 0 0 0 + 2 6 2 0 0 0 0 + 3 7 1 0 0 0 0 + 3 8 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 10 1 0 0 0 0 + 6 11 1 0 0 0 0 + 6 12 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 2 0 0 0 0 + 8 15 1 0 0 0 0 + 8 11 1 0 0 0 0 + 9 16 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 17 2 0 0 0 0 + 11 18 2 0 0 0 0 + 25 13 1 6 0 0 0 + 16 19 1 0 0 0 0 + 16 20 1 0 0 0 0 + 17 21 1 0 0 0 0 + 17 22 1 0 0 0 0 + 19 23 1 0 0 0 0 + 19 24 2 0 0 0 0 + 20 21 2 0 0 0 0 + 59 23 1 1 0 0 0 + 25 26 1 0 0 0 0 + 25 27 1 0 0 0 0 + 26 28 1 0 0 0 0 + 26 29 2 0 0 0 0 + 27 30 1 1 0 0 0 + 27 31 1 0 0 0 0 + 28 34 1 0 0 0 0 + 31 32 1 0 0 0 0 + 32 33 2 0 0 0 0 + 32 55 1 0 0 0 0 + 34 35 1 6 0 0 0 + 34 36 1 0 0 0 0 + 35 43 1 0 0 0 0 + 35 44 1 0 0 0 0 + 36 37 1 0 0 0 0 + 36 38 2 0 0 0 0 + 37 39 1 0 0 0 0 + 37 40 1 0 0 0 0 + 39 41 1 0 0 0 0 + 40 42 1 0 0 0 0 + 40 45 1 6 0 0 0 + 40 46 1 0 0 0 0 + 41 42 1 0 0 0 0 + 46 47 2 0 0 0 0 + 46 48 1 0 0 0 0 + 48 49 1 0 0 0 0 + 48 50 1 0 0 0 0 + 49 51 1 0 0 0 0 + 51 52 2 0 0 0 0 + 51 53 1 0 0 0 0 + 53 54 1 0 0 0 0 + 53 55 1 0 0 0 0 + 55 56 1 1 0 0 0 + 56 57 1 0 0 0 0 + 56 58 1 0 0 0 0 + 59 60 1 0 0 0 0 + 59 61 1 0 0 0 0 + 60 62 1 0 0 0 0 + 60 63 2 0 0 0 0 + 61 64 1 6 0 0 0 + 61 65 1 0 0 0 0 + 62 68 1 0 0 0 0 + 65 66 1 0 0 0 0 + 66 67 2 0 0 0 0 + 66 89 1 0 0 0 0 + 68 69 1 1 0 0 0 + 68 70 1 0 0 0 0 + 69 77 1 0 0 0 0 + 69 78 1 0 0 0 0 + 70 71 1 0 0 0 0 + 70 72 2 0 0 0 0 + 71 73 1 0 0 0 0 + 71 74 1 0 0 0 0 + 73 75 1 0 0 0 0 + 74 76 1 0 0 0 0 + 74 79 1 1 0 0 0 + 74 80 1 0 0 0 0 + 75 76 1 0 0 0 0 + 80 81 2 0 0 0 0 + 80 82 1 0 0 0 0 + 82 83 1 0 0 0 0 + 82 84 1 0 0 0 0 + 83 85 1 0 0 0 0 + 85 86 2 0 0 0 0 + 85 87 1 0 0 0 0 + 87 88 1 0 0 0 0 + 87 89 1 0 0 0 0 + 89 90 1 6 0 0 0 + 90 91 1 0 0 0 0 + 90 92 1 0 0 0 0 +M END +> +20031 + +> +31 + +> +20031 + +> +32_CPDBAS_v5c + +> +C62H86N12O16 + +> +1255.417 + +> +defined organic + +> +parent + +> +tested chemical + +> +Actinomycin D + +> +50-76-0 + +> +single chemical compound + +> +stereochem + +> +2-amino-4,6-dimethyl-3-oxo-N,N'-bis[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-3H-phenoxazine-1,9-dicarboxamide + +> +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C + +> +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C + +> +InChI=1/C62H86N12O16/c1-27(2)42-59(84)73-23-17-19-36(73)57(82)69(13)25-38(75)71(15)48(29(5)6)61(86)88-33(11)44(55(80)65-42)67-53(78)35-22-21-31(9)51-46(35)64-47-40(41(63)50(77)32(10)52(47)90-51)54(79)68-45-34(12)89-62(87)49(30(7)8)72(16)39(76)26-70(14)58(83)37-20-18-24-74(37)60(85)43(28(3)4)66-56(45)81/h21-22,27-30,33-34,36-37,42-45,48-49H,17-20,23-26,63H2,1-16H3,(H,65,80)(H,66,81)(H,67,78)(H,68,79)/t33-,34-,36+,37+,42-,43-,44+,45+,48+,49+/m1/s1/f/h65-68H + +> +RJURFGZVJUQBHK-HQANWYOLDQ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +0.00111 + +> +8.84168367960606E-07 + +> +88 + +> +positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test + +> +peritoneal cavity + +> +peritoneal cavity + +> +active + +> +active + +> +active + +> +multisex active + +> +TD50_Rat_Note modified v5a + +> +http://potency.berkeley.edu/chempages/ACTINOMYCIN%20D.html + +$$$$ + + + + 10 9 0 0 0 0 0 0 0 0 1 V2000 + 8.0713 -1.9936 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9171 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9171 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7629 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6087 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4626 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3084 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1542 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1542 -3.3254 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3318 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 +M END +> +20032 + +> +32 + +> +20032 + +> +33_CPDBAS_v5c + +> +C6H12N2O2 + +> +144.1717 + +> +defined organic + +> +parent + +> +tested chemical + +> +Adipamide + +> +628-94-4 + +> +single chemical compound + +> +hexanediamide + +> +NC(=O)CCCCC(=O)N + +> +NC(=O)CCCCC(=O)N + +> +InChI=1/C6H12N2O2/c7-5(9)3-1-2-4-6(8)10/h1-4H2,(H2,7,9)(H2,8,10)/f/h7-8H2 + +> +GVNWZKBFMFUVNX-UNXFWZPKCL + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +http://potency.berkeley.edu/chempages/ADIPAMIDE.html + +$$$$ + + + + 18 19 0 0 0 0 0 0 0 0 2 V2000 + 3.2537 -3.5906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2537 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4062 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4062 -4.2555 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1011 -4.2555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9682 -0.2748 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6649 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1011 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8866 -2.1366 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7006 -3.5817 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0038 -3.8654 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5587 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6687 -2.7129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7733 -1.7199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5446 -5.0800 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 6.7644 -6.1527 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 8.8656 -5.2130 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 4 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 8 1 0 0 0 0 + 3 13 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 9 2 0 0 0 0 + 8 10 2 0 0 0 0 + 9 10 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 12 14 2 0 0 0 0 + 12 16 1 0 0 0 0 + 13 15 2 0 0 0 0 + 14 15 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 18 2 0 0 0 0 +M CHG 2 16 1 17 -1 +M END +> +20033 + +> +33 + +> +20033 + +> +34_CPDBAS_v5c + +> +C11H8N2O5 + +> +248.1916 + +> +defined organic + +> +parent + +> +tested chemical + +> +AF-2 + +> +3688-53-7 + +> +single chemical compound + +> +stereochem + +> +(2Z)-2-(furan-2-yl)-3-(5-nitrofuran-2-yl)prop-2-enamide + +> +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1 + +> +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1 + +> +InChI=1/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14)/b8-6-/f/h12H2 + +> +LYAHJFZLDZDIOH-SDXKRDFODJ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse; hamster + +> +active + +> +29.4 + +> +0.118456869612026 + +> +35 + +> +TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results + +> +mammary gland + +> +mammary gland + +> +active + +> +131 + +> +0.527818024461747 + +> +31 + +> +TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results + +> +stomach + +> +stomach + +> +active + +> +164 + +> +0.660779816883408 + +> +30 + +> +TD50 is harmonic mean of more than one positive test + +> +esophagus; stomach + +> +stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +structure modified v5b + +> +http://potency.berkeley.edu/chempages/AF-2.html + +$$$$ + + + + 25 29 0 0 1 0 0 0 0 0 1 V2000 + 5.7454 -4.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5929 -3.9863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5929 -2.6604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4403 -1.9931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2878 -2.6604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2878 -3.9863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4403 -4.6535 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1352 -4.6535 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2999 -1.7678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.0451 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8458 -0.5546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1630 -0.6933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7454 -1.9931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8980 -2.6604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8980 -3.9863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8859 -4.8788 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3399 -6.0921 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0227 -5.9534 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4768 -7.1666 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4647 -8.0592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6172 -7.3919 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6969 -5.8148 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6658 -6.2307 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7454 -0.6673 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8980 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 15 2 0 0 0 0 + 1 18 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 9 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 9 10 1 6 0 0 0 + 9 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 24 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 21 1 0 0 0 0 + 17 23 1 1 0 0 0 + 18 19 1 0 0 0 0 + 18 22 1 6 0 0 0 + 19 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 24 25 1 0 0 0 0 +M END +> +20034 + +> +34 + +> +20034 + +> +35_CPDBAS_v5c + +> +C17H14O6 + +> +314.294 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aflatoxicol + +> +29611-03-8 + +> +single chemical compound + +> +stereochem + +> +(1R,6aS,9aS)-1-hydroxy-4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromen-11(1H)-one + +> +O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC + +> +O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC + +> +InChI=1/C17H14O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8-9,17-18H,2-3H2,1H3/t8-,9+,17-/m0/s1 + +> +WYIWLDSPNDMZIT-BTKFHORUBM + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +active + +> +0.00247 + +> +7.85888372033828E-06 + +> +78 + +> +liver + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/AFLATOXICOL.html + +$$$$ + + + + 23 27 0 0 0 0 0 0 0 0 1 V2000 + 5.4986 -3.3221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3531 -3.9918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1987 -3.3221 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0444 -3.9918 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0444 -5.3224 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1987 -5.9833 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3531 -5.3224 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1987 -7.3139 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7843 -5.7277 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3701 -6.9966 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7843 -3.5776 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1987 -1.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3531 -1.3306 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4986 -1.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7675 -1.5861 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5430 -2.6612 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7675 -3.7362 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5430 -4.8113 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8119 -4.3971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8119 -3.0665 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0444 -1.3306 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0444 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 15 1 0 0 0 0 + 1 18 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 2 0 0 0 0 + 4 5 2 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 9 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 2 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 13 22 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 21 1 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 22 23 1 0 0 0 0 +M END +> +20035 + +> +35 + +> +20035 + +> +36_CPDBAS_v5c + +> +C17H12O6 + +> +312.2736 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aflatoxin B1 + +> +1162-65-8 + +> +single chemical compound + +> +4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromene-1,11-dione + +> +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC + +> +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC + +> +InChI=1/C17H12O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8,17H,2-3H2,1H3 + +> +OQIQSTLJSLGHID-UHFFFAOYAB + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse; rhesus; cynomolgus; tree shrew + +> +active + +> +0.0032 + +> +1.02474240537785E-05 + +> +77 + +> +TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable; greater than ten-fold variation among TD50 values for positive results + +> +kidney; large intestine; liver + +> +large intestine; liver + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0.0082 + +> +gall bladder; liver; vascular system + +> +0.0201 + +> +gall bladder; liver; vascular system + +> +Tree Shrew (TD50=0.0269; Target Sites=liver) + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TD50_Rat_Note modified v5a + +> +http://potency.berkeley.edu/chempages/AFLATOXIN%20B1.html + +$$$$ + + + + 24 28 0 0 0 0 0 0 0 0 1 V2000 + 6.7674 -1.9958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7674 -3.3293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6244 -1.3335 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4723 -3.3202 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6244 -3.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4723 -2.0048 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3202 -3.9824 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3202 -5.3251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0593 -5.7333 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2791 -4.6537 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6244 -5.3251 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9195 -1.3335 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0593 -3.5742 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4814 -5.9873 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0181 -4.2546 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6244 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0716 -2.0048 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.9392 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2610 -2.5038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9195 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9195 -3.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7947 -6.0054 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0716 -3.3202 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9558 -5.3432 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 3 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 21 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 16 2 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 11 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 14 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 13 1 0 0 0 0 + 10 15 1 0 0 0 0 + 11 14 2 0 0 0 0 + 11 22 1 0 0 0 0 + 12 17 1 0 0 0 0 + 12 20 2 0 0 0 0 + 13 19 1 0 0 0 0 + 15 18 1 0 0 0 0 + 17 23 1 0 0 0 0 + 18 19 2 0 0 0 0 + 21 23 1 0 0 0 0 + 22 24 1 0 0 0 0 +M END +> +20036 + +> +36 + +> +20036 + +> +37_CPDBAS_v5c + +> +C17H12O7 + +> +328.273 + +> +defined organic + +> +parent + +> +representative component in mixture + +> +Aflatoxin, crude + +> +1402-68-2 + +> +mixture or formulation + +> +mixture of aflatoxins, structure shown G1 [1165-39-5] + +> +5-(methyloxy)-3,4,7a,10a-tetrahydro-1H,12H-furo[3',2':4,5]furo[2,3-h]pyrano[3,4-c]chromene-1,12-dione + +> +O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1 + +> +O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1 + +> +InChI=1/C17H12O7/c1-20-9-6-10-12(8-3-5-22-17(8)23-10)14-11(9)7-2-4-21-15(18)13(7)16(19)24-14/h3,5-6,8,17H,2,4H2,1H3 + +> +XWIYFDMXXLINPU-UHFFFAOYAD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +0.00299 + +> +50 + +> +TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active + +> +liver + +> +active + +> +0.343 + +> +50 + +> +hematopoietic system + +> +active + +> +active + +> +active + +> +multisite active; multispecies active + +> +TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture + +> +http://potency.berkeley.edu/chempages/AFLATOXIN,%20CRUDE.html + +$$$$ + + + + 0 0 0 0 0 0 0 0 0 0 1 V2000 +M END +> +20037 + +> +20037 + +> +38_CPDBAS_v5c + +> +no structure + +> +no structure + +> +Agar + +> +9002-18-0 + +> +mixture or formulation + +> +InChI=1// + +> +MOSFIJXAXDLOML-UHFFFAOYAM + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 230 + +> +http://potency.berkeley.edu/chempages/AGAR.html + +$$$$ + + + + 15 15 0 0 0 0 0 0 0 0 1 V2000 + 5.7597 -2.0304 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1706 -2.0304 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7597 -0.7148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6306 -2.7038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4807 -2.0304 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.7038 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3101 -2.7038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6306 -0.0414 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2094 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3592 -0.6526 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9096 -2.7245 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4807 -0.7148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1706 -0.7148 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9096 -0.0104 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0802 -0.6837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 2 0 0 0 0 + 1 11 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 6 2 0 0 0 0 + 2 13 1 0 0 0 0 + 3 8 2 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 12 2 0 0 0 0 + 8 12 1 0 0 0 0 + 9 15 1 0 0 0 0 + 9 10 2 0 0 0 0 + 14 15 1 0 0 0 0 +M END +> +20038 + +> +38 + +> +20038 + +> +39_CPDBAS_v5c + +> +C11H11ClO3 + +> +226.6562 + +> +defined organic + +> +parent + +> +tested chemical + +> +Alclofenac + +> +22131-79-9 + +> +single chemical compound + +> +[3-chloro-4-(prop-2-en-1-yloxy)phenyl]acetic acid + +> +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl + +> +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl + +> +InChI=1/C11H11ClO3/c1-2-5-15-10-4-3-8(6-9(10)12)7-11(13)14/h2-4,6H,1,5,7H2,(H,13,14)/f/h13H + +> +ARHWPKZXBHOEEE-NDKGDYFDCL + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +Rat added v2a + +> +http://potency.berkeley.edu/chempages/ALCLOFENAC.html + +$$$$ + + + + 12 11 0 0 0 0 0 0 0 0 1 V2000 + 0.8456 -0.6672 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9938 -1.3343 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1497 -1.9938 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2978 -1.3343 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4537 -1.9938 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6019 -1.3343 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6019 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7578 -1.9938 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7578 -3.3281 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3343 -2.4825 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.4825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6609 -0.1784 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +20039 + +> +39 + +> +39223 + +> +40_CPDBAS_v5c + +> +C7H14N2O2S + +> +190.2633 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aldicarb + +> +116-06-3 + +> +single chemical compound + +> +(1E)-2-methyl-2-(methylthio)propanal O-[(methylamino)carbonyl]oxime + +> +CC(C=NOC(=O)NC)(SC)C + +> +CC(C=NOC(=O)NC)(SC)C + +> +InChI=1/C7H14N2O2S/c1-7(2,12-4)5-9-11-6(10)8-3/h5H,1-4H3,(H,8,10)/b9-5+/f/h8H + +> +QGLZXHRNAYXIBU-RVKZGWQMDN + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 136 + +> +http://potency.berkeley.edu/chempages/ALDICARB.html + +$$$$ + + + + 18 21 0 0 0 0 0 0 0 0 1 V2000 + 4.3850 -2.1587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2104 -2.1095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1821 -0.9164 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1845 -3.0750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3567 -1.7958 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5400 -3.2473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9188 -2.6568 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8869 -3.2473 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3887 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0615 -0.3260 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6126 -4.2128 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1501 -2.7798 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3653 -3.6962 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6052 -4.8340 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7073 -2.0726 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2657 -4.4404 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5449 -5.2337 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.0750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 11 2 0 0 0 0 + 4 12 1 0 0 0 0 + 6 13 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 + 8 11 1 0 0 0 0 + 11 17 1 0 0 0 0 + 13 18 1 0 0 0 0 + 13 14 1 0 0 0 0 + 15 18 2 0 0 0 0 +M END +> +20040 + +> +40 + +> +20040 + +> +41_CPDBAS_v5c + +> +C12H8Cl6 + +> +364.9099 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aldrin + +> +309-00-2 + +> +single chemical compound + +> +stereochem + +> +1,2,3,4,10,10-hexachloro-1,4,4a,5,8,8a-hexahydro-1,4:5,8-dimethanonaphthalene + +> +ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2 + +> +ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2 + +> +InChI=1/C12H8Cl6/c13-8-9(14)11(16)7-5-2-1-4(3-5)6(7)10(8,15)12(11,17)18/h1-2,4-7H,3H2 + +> +QBYJBZPUGVGKQQ-UHFFFAOYAT + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +1.27 + +> +3.48031116722237E-03 + +> +56 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +active + +> +TR 21; final call in CPDB differs due to additional data + +> +http://potency.berkeley.edu/chempages/ALDRIN.html + +$$$$ + + + + 23 22 0 0 0 0 0 0 0 0 2 V2000 + 13.2448 -7.3111 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 + 12.6753 -2.6490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6753 -3.9867 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5230 -1.9867 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5230 -4.6489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3707 -2.6490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3707 -3.9867 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5230 -5.9867 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8475 -5.9867 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1853 -5.9867 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5230 -7.3111 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 6.9138 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7615 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1523 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3046 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6092 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0661 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2184 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3707 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5230 -0.6622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6753 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 4 22 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 2 0 0 0 0 + 8 11 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 19 1 0 0 0 0 + 13 18 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 +M CHG 2 1 1 11 -1 +M END +> +20041 + +> +41 + +> +20041 + +> +42_CPDBAS_v5c + +> +C18H29NaO3S + +> +348.4758 + +> +defined organic + +> +salt Na + +> +representative isomer in mixture + +> +Alkylbenzenesulfonate, linear + +> +42615-29-2 + +> +mixture or formulation + +> +mixture of C10-13 alkylbenzenesulfonates average 11.6; with phenyl attachment varying in apprpx equal amounts between C-2,3,4,5 or 6; structure shown C12 attached at C2 + +> +sodium 4-(dodecan-2-yl)benzenesulfonate + +> +O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)([O-])=O.[Na+] + +> +O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)(O)=O + +> +InChI=1/C18H30O3S.Na/c1-3-4-5-6-7-8-9-10-11-16(2)17-12-14-18(15-13-17)22(19,20)21;/h12-16H,3-11H2,1-2H3,(H,19,20,21);/q;+1/p-1/fC18H29O3S.Na/q-1;m + +> +GHRHULTYHYEOQB-MFZBKVKLCJ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +structure modified v5b + +> +http://potency.berkeley.edu/chempages/ALKYLBENZENESULFONATE,%20LINEAR.html + +$$$$ + + + + 14 13 0 0 0 0 0 0 0 0 2 V2000 + 0.0000 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1547 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3093 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4640 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6186 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7733 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9152 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0699 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2245 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3792 -0.4949 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5338 -1.1547 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 12.2063 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8740 -2.3093 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6885 -1.8271 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 11 14 1 0 0 0 0 +M CHG 2 11 1 14 -1 +M END +> +20042 + +> +42 + +> +20042 + +> +43_CPDBAS_v5c + +> +C12H27NO + +> +201.3489 + +> +defined organic + +> +parent + +> +representative isomer in mixture + +> +Alkyldimethylamine oxides, commercial grade + +> +NOCAS + +> +mixture or formulation + +> +mixture, C10-16 [70592-80-2], C12-18 [68955-55-5], C12-16 [68439-70-3], C14-18 [68390-99-8], structure shown C-12 + +> +decyl(dimethyl)amine oxide + +> +[O-][N+](C)(C)CCCCCCCCCC + +> +[O-][N+](C)(C)CCCCCCCCCC + +> +InChI=1/C12H27NO/c1-4-5-6-7-8-9-10-11-12-13(2,3)14/h4-12H2,1-3H3 + +> +ZRKZFNZPJKEWPC-UHFFFAOYAU + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/ALKYLDIMETHYLAMINE%20OXIDES,%20COMMERCIAL%20GRADE.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 4.2744 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2901 -0.8879 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4278 -2.2095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2095 -2.7532 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3216 -1.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9066 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9892 -0.6126 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5773 -2.8771 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7336 -2.2095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7336 -0.8810 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8831 -2.8771 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 +M END +> +20043 + +> +43 + +> +20043 + +> +44_CPDBAS_v5c + +> +C4H6N4O3 + +> +158.1164 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allantoin + +> +97-59-6 + +> +single chemical compound + +> +1-(2,5-dioxoimidazolidin-4-yl)urea + +> +O=C1C(NC(=O)N1)NC(=O)N + +> +O=C1C(NC(=O)N1)NC(=O)N + +> +InChI=1/C4H6N4O3/c5-3(10)6-1-2(9)8-4(11)7-1/h1H,(H3,5,6,10)(H2,7,8,9,11)/f/h6-8H,5H2 + +> +POJWUDADGALRAB-BANUENCFCI + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/ALLANTOIN.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3061 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +20044 + +> +44 + +> +20044 + +> +45_CPDBAS_v5c + +> +C3H6O + +> +58.0791 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allyl alcohol + +> +107-18-6 + +> +single chemical compound + +> +prop-2-en-1-ol + +> +C=CCO + +> +C=CCO + +> +InChI=1/C3H6O/c1-2-3-4/h2,4H,1,3H2 + +> +XXROGKLTLUQVRX-UHFFFAOYAC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +Mutagenicity_SAL_CPDB added v3a + +> +http://potency.berkeley.edu/chempages/ALLYL%20ALCOHOL.html + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3061 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 -0.6638 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +20045 + +> +45 + +> +39231 + +> +46_CPDBAS_v5c + +> +C3H5Cl + +> +76.5248 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allyl chloride + +> +107-05-1 + +> +single chemical compound + +> +3-chloroprop-1-ene + +> +C=CCCl + +> +C=CCCl + +> +InChI=1/C3H5Cl/c1-2-3-4/h2H,1,3H2 + +> +OSDWBNJEKMUWAV-UHFFFAOYAQ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +0 + +> +NTP bioassay inadequate + +> +NTP bioassay inadequate + +> +NTP bioassay inadequate + +> +inconclusive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +TR 73 + +> +http://potency.berkeley.edu/chempages/ALLYL%20CHLORIDE.html + +$$$$ + + + + 8 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.8149 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1485 -1.1485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3041 -1.8149 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4526 -1.1485 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6082 -1.8149 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7567 -1.1485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4231 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0895 -1.1485 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 8 1 0 0 0 0 +M END +> +20046 + +> +46 + +> +39232 + +> +47_CPDBAS_v5c + +> +C6H10O2 + +> +114.1424 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allyl glycidyl ether + +> +106-92-3 + +> +single chemical compound + +> +2-[(allyloxy)methyl]oxirane + +> +C=CCOCC1CO1 + +> +C=CCOCC1CO1 + +> +InChI=1/C6H10O2/c1-2-3-7-4-6-5-8-6/h2,6H,1,3-5H2 + +> +LSWYGACWGAICNM-UHFFFAOYAR + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +182 + +> +1.59449950237598 + +> +26 + +> +nasal cavity + +> +no positive results + +> +active + +> +active + +> +TR 376 + +> +http://potency.berkeley.edu/chempages/ALLYL%20GLYCIDYL%20ETHER.html + +$$$$ + + + + 6 5 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -0.6684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1525 -1.3311 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -0.6684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 -1.3311 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -0.6684 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7624 0.0000 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 2 0 0 0 0 +M END +> +20047 + +> +47 + +> +20047 + +> +48_CPDBAS_v5c + +> +C4H5NS + +> +99.1542 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allyl isothiocyanate + +> +57-06-7 + +> +single chemical compound + +> +3-isothiocyanatoprop-1-ene + +> +C=CCN=C=S + +> +C=CCN=C=S + +> +InChI=1/C4H5NS/c1-2-3-5-4-6/h2H,1,3H2 + +> +ZOJBYZNEUISWFT-UHFFFAOYAS + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +96 + +> +0.968188942072045 + +> +26 + +> +urinary bladder + +> +no positive results + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +TR 234 + +> +http://potency.berkeley.edu/chempages/ALLYL%20ISOTHIOCYANATE.html + +$$$$ + + + + 10 9 0 0 0 0 0 0 0 0 1 V2000 + 4.6087 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6087 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7629 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9171 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9171 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0713 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4626 -1.9936 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3084 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1542 -1.9936 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 +M END +> +20048 + +> +48 + +> +39233 + +> +49_CPDBAS_v5c + +> +C8H14O2 + +> +142.1956 + +> +defined organic + +> +parent + +> +tested chemical + +> +Allyl isovalerate + +> +2835-39-4 + +> +single chemical compound + +> +allyl 3-methylbutanoate + +> +O=C(CC(C)C)OCC=C + +> +O=C(CC(C)C)OCC=C + +> +InChI=1/C8H14O2/c1-4-5-10-8(9)6-7(2)3/h4,7H,1,5-6H2,2-3H3 + +> +HOMAGVUCNZNWBC-UHFFFAOYAF + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +123 + +> +0.865005668248525 + +> +26 + +> +hematopoietic system + +> +no positive results + +> +active + +> +62.8 + +> +0.441645170455345 + +> +32 + +> +no positive results + +> +hematopoietic system + +> +active + +> +active + +> +active + +> +multisex active; multispecies active + +> +TR 253 + +> +http://potency.berkeley.edu/chempages/ALLYL%20ISOVALERATE.html + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 4.6080 -1.9953 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4560 -2.6588 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3040 -1.9953 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3040 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4560 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1520 -2.6588 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9953 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6080 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 2 0 0 0 0 + 7 8 2 0 0 0 0 +M END +> +20049 + +> +49 + +> +20049 + +> +50_CPDBAS_v5c + +> +C4H7N3O2 + +> +129.1182 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Allyl-1-nitrosourea + +> +760-56-5 + +> +single chemical compound + +> +1-nitroso-1-prop-2-en-1-ylurea + +> +NC(=O)N(CC=C)N=O + +> +NC(=O)N(CC=C)N=O + +> +InChI=1/C4H7N3O2/c1-2-3-7(6-9)4(5)8/h2H,1,3H2,(H2,5,8)/f/h5H2 + +> +WBBDVRPSJSJSPC-GLFQYTTQCA + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0.341 + +> +2.64099096796579E-03 + +> +52 + +> +TD50 is harmonic mean of more than one positive test + +> +large intestine; lung; stomach + +> +mammary gland; stomach; uterus + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/1-ALLYL-1-NITROSOUREA.html + +$$$$ + + + + 7 5 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -0.6636 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1521 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3042 -0.6636 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6084 -0.6636 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5945 -1.9954 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9263 -1.9954 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 1 0 0 0 0 +M END +> +20050 + +> +50 + +> +20050 + +> +51_CPDBAS_v5c + +> +C3H9ClN2 + +> +108.5705 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +Allylhydrazine.HCl + +> +52207-83-7 + +> +single chemical compound + +> +parent [7422-78-8] + +> +prop-2-en-1-ylhydrazine hydrochloride + +> +C=CCNN.HCl + +> +C=CCNN + +> +InChI=1/C3H8N2.ClH/c1-2-3-5-4;/h2,5H,1,3-4H2;1H + +> +PWGPATVPEGLIAN-UHFFFAOYAO + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +34.2 + +> +0.315002694101989 + +> +34 + +> +TD50 is harmonic mean of more than one positive test + +> +lung + +> +lung; vascular system + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/ALLYLHYDRAZINE.HCl.html + +$$$$ + + + + 12 8 0 0 0 0 0 0 0 0 2 V2000 + 5.3200 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3200 -1.3300 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3200 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9900 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 6.6500 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.3300 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 -1.3300 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2.6600 -1.3300 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 3.3250 -3.9900 0.0000 Al 0 1 0 0 0 0 0 0 0 0 0 0 + 1.9950 -3.9900 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 7 10 1 0 0 0 0 +M CHG 6 4 -1 5 -1 9 -1 10 -1 11 3 12 1 +M END +> +20051 + +> +51 + +> +39234 + +> +52_CPDBAS_v5c + +> +AlKO8S2 + +> +258.18674 + +> +inorganic + +> +tested chemical + +> +Aluminum potassium sulfate + +> +10043-67-1 + +> +single chemical compound + +> +aluminum potassium sulfate + +> +O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+] + +> +InChI=1/Al.K.2H2O4S/c;;2*1-5(2,3)4/h;;2*(H2,1,2,3,4)/q+3;+1;;/p-4/fAl.K.2O4S/q2m;2*-2 + +> +GRLPQNLYRHEGIJ-MHPHYJPNCZ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +http://potency.berkeley.edu/chempages/ALUMINUM%20POTASSIUM%20SULFATE.html + +$$$$ + + + + 19 21 0 0 0 0 0 0 0 0 1 V2000 + 3.4588 -5.3212 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4588 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6036 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7566 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9095 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9095 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7566 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6036 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4588 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4588 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3059 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3059 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.3298 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7566 0.0000 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0624 -3.9909 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7566 -5.3212 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 18 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 17 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +20052 + +> +52 + +> +39235 + +> +53_CPDBAS_v5c + +> +C14H7Br2NO2 + +> +381.0189 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Amino-2,4-dibromoanthraquinone + +> +81-49-2 + +> +single chemical compound + +> +1-amino-2,4-dibromo-9,10-anthraquinone + +> +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N + +> +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N + +> +InChI=1/C14H7Br2NO2/c15-8-5-9(16)12(17)11-10(8)13(18)6-3-1-2-4-7(6)14(11)19/h1-5H,17H2 + +> +ZINRVIQBCHAZMM-UHFFFAOYAC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +46 + +> +0.120728919221592 + +> +35 + +> +TD50 is harmonic mean of more than one positive test + +> +kidney; large intestine; liver; urinary bladder + +> +kidney; large intestine; liver; urinary bladder + +> +active + +> +477 + +> +1.25190640149347 + +> +27 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; lung; stomach + +> +liver; lung; stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 383 + +> +http://potency.berkeley.edu/chempages/1-AMINO-2,4-DIBROMOANTHRAQUINONE.html + +$$$$ + + + + 14 14 0 0 0 0 0 0 0 0 1 V2000 + 5.9919 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3210 -1.1555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9919 -2.3110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3210 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9977 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3268 -2.3110 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9977 -1.1555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9942 -2.3110 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3326 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9942 -4.6127 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3245 -2.3110 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9861 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3187 -3.4572 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 +M END +> +20053 + +> +53 + +> +20053 + +> +54_CPDBAS_v5c + +> +C10H14N2O2 + +> +194.2304 + +> +defined organic + +> +parent + +> +tested chemical + +> +3-Amino-4-ethoxyacetanilide + +> +17026-81-2 + +> +single chemical compound + +> +N-[3-amino-4-(ethyloxy)phenyl]acetamide + +> +NC1=C(C=CC(=C1)NC(=O)C)OCC + +> +NC1=C(C=CC(=C1)NC(=O)C)OCC + +> +InChI=1/C10H14N2O2/c1-3-14-10-5-4-8(6-9(10)11)12-7(2)13/h4-6H,3,11H2,1-2H3,(H,12,13)/f/h12H + +> +XTXFAVHDQCHWCS-XWKXFZRBCV + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +2070 + +> +10.6574460022736 + +> +17 + +> +thyroid gland + +> +no positive results + +> +active + +> +active + +> +TR 112 + +> +http://potency.berkeley.edu/chempages/3-AMINO-4-ETHOXYACETANILIDE.html + +$$$$ + + + + 18 19 0 0 0 0 0 0 0 0 1 V2000 + 3.6099 -7.5422 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1990 -6.2771 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0854 -5.2860 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4149 -5.4310 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9548 -4.2143 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2763 -4.0773 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0579 -5.1490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5180 -6.3658 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1965 -6.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9637 -3.3199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8114 -3.9887 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6591 -3.3199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6591 -1.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8114 -1.3296 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9637 -1.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8114 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.8195 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3296 -3.8195 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 15 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 14 16 1 0 0 0 0 + 17 18 1 0 0 0 0 +M END +> +20054 + +> +54 + +> +20054 + +> +55_CPDBAS_v5c + +> +C14H15ClN2 + +> +246.7353 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +3-Amino-9-ethylcarbazole.HCl + +> +6109-97-3 + +> +single chemical compound + +> +parent [132-32-1] + +> +9-ethyl-9H-carbazol-3-amine hydrochloride + +> +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl + +> +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N) + +> +InChI=1/C14H14N2.ClH/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16;/h3-9H,2,15H2,1H3;1H + +> +UUYSTZWIFZYHRM-UHFFFAOYAB + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +57.2 + +> +0.231827387487725 + +> +32 + +> +TD50 is harmonic mean of more than one positive test + +> +ear Zymbals gland; liver; skin + +> +ear Zymbals gland; liver; uterus + +> +active + +> +38.6 + +> +0.156442957290667 + +> +37 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 93 + +> +http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE.HCl.html + +$$$$ + + + + 16 18 0 0 0 0 0 0 0 0 1 V2000 + 2.8854 -1.7137 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0066 -2.7097 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1011 -2.2629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 -3.8595 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9547 -3.5738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0066 -5.0166 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0312 -4.3575 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3168 -1.7137 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6738 -2.7097 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6738 -5.0166 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2469 -3.8155 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.8595 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3934 -2.4973 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3235 -4.5991 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6145 -0.4174 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3475 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 15 1 0 0 0 0 + 2 4 2 0 0 0 0 + 2 9 1 0 0 0 0 + 3 5 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 10 2 0 0 0 0 + 7 11 2 0 0 0 0 + 8 13 2 0 0 0 0 + 9 12 2 0 0 0 0 + 10 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 11 14 1 0 0 0 0 + 15 16 1 0 0 0 0 +M END +> +20055 + +> +55 + +> +20055 + +> +56_CPDBAS_v5c + +> +C14H15N2 + +> +210.2744 + +> +defined organic + +> +parent + +> +representative component in mixture + +> +3-Amino-9-ethylcarbazole mixture + +> +NOCAS + +> +mixture or formulation + +> +mixture, structure shown 3-Amino-9-ethylcarbazole [132-32-1] + +> +9-ethyl-9H-carbazol-3-amine + +> +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N) + +> +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N) + +> +InChI=1/C14H14N2/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16/h3-9H,2,15H2,1H3 + +> +OXEUETBFKVCRNP-UHFFFAOYAV + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +26.4 + +> +50 + +> +TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active + +> +ear Zymbals gland; liver; skin + +> +ear Zymbals gland + +> +active + +> +38 + +> +50 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture + +> +TR 93 + +> +http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE%20MIXTURE.html + +$$$$ + + + + 20 21 0 0 0 0 0 0 0 0 1 V2000 + 14.3944 -3.3539 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 13.1277 -2.9365 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8542 -1.6410 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 12.1345 -3.8289 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8822 -3.4259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8026 -4.2032 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7230 -3.4259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4563 -3.8289 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4775 -2.9365 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2108 -3.3539 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2176 -2.4615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9509 -2.8789 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9720 -1.9864 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6621 -2.2599 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1084 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8925 -0.1152 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1016 -0.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2531 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1405 -2.1592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4648 -2.1592 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 20 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 19 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 17 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 17 18 1 0 0 0 0 + 19 20 1 0 0 0 0 +M END +> +20056 + +> +56 + +> +39236 + +> +57_CPDBAS_v5c + +> +C9H14N8S3 + +> +330.4561 + +> +defined organic + +> +parent + +> +tested chemical + +> +3-Amino-4-[2-[(2-guanidinothiazol-4-yl)methylthio], ethylamino]-1,2,5-thiadiazole + +> +78441-84-6 + +> +single chemical compound + +> +BL-6341 + +> +1-{4-[({2-[(4-amino-1,2,5-thiadiazol-3-yl)amino]ethyl}sulfanyl)methyl]-1,3-thiazol-2-yl}guanidine + +> +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1 + +> +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1 + +> +InChI=1/C9H14N8S3/c10-6-7(17-20-16-6)13-1-2-18-3-5-4-19-9(14-5)15-8(11)12/h4H,1-3H2,(H2,10,16)(H,13,17)(H4,11,12,14,15)/f/h11,13,15H,10,12H2 + +> +MOMKQYRYLQUFMV-GVMYFUFNCD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +4990 + +> +15.1003416187506 + +> +14 + +> +TD50 is harmonic mean of more than one positive test + +> +stomach + +> +stomach + +> +active + +> +active + +> +active + +> +multisex active + +> +Rat added v2a; CPDB lists HCl complex in some instances in tables but referenced study for this chemical does not specify HCl complex - parent is assumed correct + +> +http://potency.berkeley.edu/chempages/3-AMINO-4-[2-[(2-GUANIDINOTHIAZOL-4-YL)METHYLTHIO].html + +$$$$ + + + + 18 20 0 0 0 0 0 0 0 0 1 V2000 + 4.6526 -4.6047 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9902 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6526 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9853 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6477 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9853 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6526 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9902 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6575 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9951 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9951 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6575 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9951 -4.6047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6624 -4.6047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6624 -2.2984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9804 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6477 -3.4555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 17 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +20057 + +> +57 + +> +20057 + +> +58_CPDBAS_v5c + +> +C15H11NO2 + +> +237.2533 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Amino-2-methylanthraquinone + +> +82-28-0 + +> +single chemical compound + +> +C.I. 60700 + +> +1-amino-2-methylanthracene-9,10-dione + +> +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N + +> +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N + +> +InChI=1/C15H11NO2/c1-8-6-7-11-12(13(8)16)15(18)10-5-3-2-4-9(10)14(11)17/h2-7H,16H2,1H3 + +> +ZLCUIOWQYBYEBG-UHFFFAOYAP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +59.2 + +> +0.249522345948402 + +> +32 + +> +TD50 is harmonic mean of more than one positive test + +> +kidney; liver + +> +liver + +> +active + +> +174 + +> +0.733393381672668 + +> +30 + +> +no positive results + +> +liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 111 + +> +http://potency.berkeley.edu/chempages/1-AMINO-2-METHYLANTHRAQUINONE.html + +$$$$ + + + + 14 15 0 0 0 0 0 0 0 0 2 V2000 + 2.3652 -3.2915 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -2.7519 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2950 -1.4299 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5900 -1.1511 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2555 -2.3022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5865 -2.4461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4768 -1.4569 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6908 -1.9965 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5469 -3.3184 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2430 -3.5972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8419 -1.3310 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 7.8419 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9931 -1.9965 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4174 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 10 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 11 1 0 0 0 0 + 9 10 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 13 1 0 0 0 0 +M CHG 2 11 1 13 -1 +M END +> +20058 + +> +58 + +> +20058 + +> +59_CPDBAS_v5c + +> +C6H4N4O4 + +> +196.122 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-5-(5-nitro-2-furyl)-1,3,4-oxadiazole + +> +3775-55-1 + +> +single chemical compound + +> +5-(5-nitrofuran-2-yl)-1,3,4-oxadiazol-2-amine + +> +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N + +> +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N + +> +InChI=1/C6H4N4O4/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2 + +> +VTWQUFUBSCXPOW-IAUQMDSZCD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +3.67 + +> +1.87128420065062E-02 + +> +44 + +> +kidney; lung; mammary gland; stomach + +> +active + +> +active + +> +active + +> +multisite active + +> +http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-OXADIAZOLE.html + +$$$$ + + + + 14 15 0 0 0 0 0 0 0 0 2 V2000 + 8.4233 -3.5294 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5389 -2.5523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2248 -2.6870 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6857 -1.4825 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3970 -1.2045 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4957 -2.1985 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2743 -1.4320 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0698 -1.9626 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1877 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 0.9266 -3.2767 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5523 -0.1348 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8579 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6713 -0.5981 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8168 -1.2551 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 12 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 11 2 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 13 14 1 0 0 0 0 +M CHG 2 8 1 9 -1 +M END +> +20059 + +> +59 + +> +20059 + +> +60_CPDBAS_v5c + +> +C6H4N4O3S + +> +212.1826 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-5-(5-nitro-2-furyl)-1,3,4-thiadiazole + +> +712-68-5 + +> +single chemical compound + +> +5-(5-nitrofuran-2-yl)-1,3,4-thiadiazol-2-amine + +> +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1 + +> +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1 + +> +InChI=1/C6H4N4O3S/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2 + +> +SXZZHGJWUBJKHH-IAUQMDSZCG + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0.662 + +> +3.11995422810353E-03 + +> +52 + +> +kidney; lung; mammary gland; stomach + +> +active + +> +active + +> +active + +> +multisite active + +> +http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-THIADIAZOLE.html + +$$$$ + + + + 14 15 0 0 0 0 0 0 0 0 2 V2000 + 5.7002 -2.7618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4855 -1.6853 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7473 -2.1001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7473 -3.4236 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4855 -3.8383 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8238 -1.3147 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3678 -2.7618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5825 -3.8383 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3207 -3.4236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3207 -2.1001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5825 -1.6853 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2442 -1.3147 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.7912 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.4471 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 2 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 11 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 10 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 14 2 0 0 0 0 +M CHG 2 12 1 13 -1 +M END +> +20060 + +> +60 + +> +39237 + +> +61_CPDBAS_v5c + +> +C7H5N3O3S + +> +211.1948 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-4-(5-nitro-2-furyl)thiazole + +> +38514-71-5 + +> +single chemical compound + +> +4-(5-nitrofuran-2-yl)-1,3-thiazol-2-amine + +> +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1 + +> +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1 + +> +InChI=1/C7H5N3O3S/c8-7-9-4(3-14-7)5-1-2-6(13-5)10(11)12/h1-3H,(H2,8,9)/f/h8H2 + +> +ZAVLMIGIVYJYMU-FSHFIPFOCT + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +5.85 + +> +2.76995456327523E-02 + +> +42 + +> +stomach; urinary bladder + +> +active + +> +7.87 + +> +3.72641750649164E-02 + +> +44 + +> +stomach + +> +active + +> +active + +> +active + +> +multisite active; multispecies active + +> +http://potency.berkeley.edu/chempages/2-AMINO-4-(5-NITRO-2-FURYL)THIAZOLE.html + +$$$$ + + + + 16 17 0 0 0 0 0 0 0 0 2 V2000 + 0.0000 -7.5449 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4042 -6.3035 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7130 -6.3035 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1172 -7.5449 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0586 -8.3148 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0586 -9.6236 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4829 -5.2449 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8109 -5.2545 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8310 -3.9649 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7637 -2.6561 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9859 -2.1846 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8135 -3.2047 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1014 -4.3017 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3227 -0.9239 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 7.5930 -0.5870 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3988 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 13 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 14 1 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 2 0 0 0 0 + 14 16 1 0 0 0 0 +M CHG 2 14 1 16 -1 +M END +> +20061 + +> +61 + +> +20061 + +> +62_CPDBAS_v5c + +> +C8H6N4O4 + +> +222.1598 + +> +defined organic + +> +parent + +> +tested chemical + +> +trans-5-Amino-3[2-(5-nitro-2-furyl)vinyl]-1,2,4-oxadiazole + +> +28754-68-9 + +> +single chemical compound + +> +stereochem + +> +3-[(E)-2-(5-nitrofuran-2-yl)ethenyl]-1,2,4-oxadiazol-5-amine + +> +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1 + +> +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1 + +> +InChI=1/C8H6N4O4/c9-8-10-6(11-16-8)3-1-5-2-4-7(15-5)12(13)14/h1-4H,(H2,9,10,11)/b3-1+/f/h9H2 + +> +RMZNNIOKNRDECR-OYGOROAMDP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +112 + +> +0.504141613379198 + +> +32 + +> +TD50 is harmonic mean of more than one positive test + +> +hematopoietic system; stomach + +> +hematopoietic system; stomach + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/trans-5-AMINO-3[2-(5-NITRO-2-FURYL)VINYL]-1,2,4-OX.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 2 V2000 + 0.0000 -3.4525 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6642 -2.3037 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1.9925 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9835 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1488 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 9 1 0 0 0 0 + 7 8 2 0 0 0 0 +M CHG 2 2 1 11 -1 +M END +> +20062 + +> +62 + +> +20062 + +> +63_CPDBAS_v5c + +> +C6H6N2O3 + +> +154.1234 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-4-nitrophenol + +> +99-57-0 + +> +single chemical compound + +> +2-amino-4-nitrophenol + +> +O=[N+](C1=CC(=C(C=C1)O)N)[O-] + +> +O=[N+](C1=CC(=C(C=C1)O)N)[O-] + +> +InChI=1/C6H6N2O3/c7-5-3-4(8(10)11)1-2-6(5)9/h1-3,9H,7H2 + +> +VLZVIIYRNMWPSN-UHFFFAOYAN + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +839 + +> +5.44368992638366 + +> +18 + +> +kidney + +> +no positive results + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +TR 339 + +> +http://potency.berkeley.edu/chempages/2-AMINO-4-NITROPHENOL.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 2 V2000 + 0.0000 -3.4525 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6642 -2.3037 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1.9925 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9835 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1488 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 9 1 0 0 0 0 + 7 8 2 0 0 0 0 +M CHG 2 2 1 11 -1 +M END +> +20063 + +> +63 + +> +20063 + +> +64_CPDBAS_v5c + +> +C6H6N2O3 + +> +154.1234 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-5-nitrophenol + +> +121-88-0 + +> +single chemical compound + +> +2-amino-5-nitrophenol + +> +O=[N+](C1=CC(=C(C=C1)N)O)[O-] + +> +O=[N+](C1=CC(=C(C=C1)N)O)[O-] + +> +InChI=1/C6H6N2O3/c7-5-2-1-4(8(10)11)3-6(5)9/h1-3,9H,7H2 + +> +DOPJTDJKZNWLRB-UHFFFAOYAU + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +111 + +> +0.720202123752785 + +> +27 + +> +pancreas + +> +no positive results + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +TR 334 + +> +http://potency.berkeley.edu/chempages/2-AMINO-5-NITROPHENOL.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 2 V2000 + 1.9968 -4.6079 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6577 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9968 -2.3039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6577 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9889 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6544 -2.3039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9889 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6544 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6656 -2.3039 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4583 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1543 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 +M CHG 2 9 1 11 -1 +M END +> +20064 + +> +64 + +> +20064 + +> +65_CPDBAS_v5c + +> +C6H6N2O3 + +> +154.1234 + +> +defined organic + +> +parent + +> +tested chemical + +> +4-Amino-2-nitrophenol + +> +119-34-6 + +> +single chemical compound + +> +4-amino-2-nitrophenol + +> +OC1=C(C=C(C=C1)N)[N+](=O)[O-] + +> +OC1=C(C=C(C=C1)N)[N+](=O)[O-] + +> +InChI=1/C6H6N2O3/c7-4-1-2-6(9)5(3-4)8(10)11/h1-3,9H,7H2 + +> +WHODQVWERNSQEO-UHFFFAOYAM + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +309 + +> +2.00488699314965 + +> +23 + +> +urinary bladder + +> +no positive results + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +TR 94 + +> +http://potency.berkeley.edu/chempages/4-AMINO-2-NITROPHENOL.html + +$$$$ + + + + 15 16 0 0 0 0 0 0 0 0 2 V2000 + 3.1238 -1.1475 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3406 -2.2222 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0747 -1.8124 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0747 -0.4827 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3406 -0.0729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.5956 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4535 -1.1475 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1184 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4480 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1129 -1.1475 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4480 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1184 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4426 -1.1475 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 9.1074 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 9.1074 -2.3042 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 2 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 12 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 10 13 1 0 0 0 0 + 11 12 2 0 0 0 0 + 13 14 1 0 0 0 0 + 13 15 2 0 0 0 0 +M CHG 2 13 1 14 -1 +M END +> +20065 + +> +65 + +> +39238 + +> +66_CPDBAS_v5c + +> +C9H7N3O2S + +> +221.2332 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-4-(p-nitrophenyl)thiazole + +> +2104-09-8 + +> +single chemical compound + +> +4-(4-nitrophenyl)-1,3-thiazol-2-amine + +> +NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1 + +> +NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1 + +> +InChI=1/C9H7N3O2S/c10-9-11-8(5-15-9)6-1-3-7(4-2-6)12(13)14/h1-5H,(H2,10,11)/f/h10H2 + +> +RIKJWJIWXCUKQV-GIMVELNWCN + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +9.95 + +> +4.49751664759177E-02 + +> +43 + +> +hematopoietic system + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/2-AMINO-4-(p-NITROPHENYL)THIAZOLE.html + +$$$$ + + + + 9 9 0 0 0 0 0 0 0 0 2 V2000 + 5.1188 -0.2969 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4533 -1.4486 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 3.1225 -1.4486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3393 -2.5236 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0749 -2.1141 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0749 -0.7832 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3393 -0.3737 0.0000 S 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 + 5.1188 -2.6003 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 +M CHG 2 2 1 9 -1 +M END +> +20066 + +> +66 + +> +20066 + +> +67_CPDBAS_v5c + +> +C3H3N3O2S + +> +145.1398 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Amino-5-nitrothiazole + +> +121-66-4 + +> +single chemical compound + +> +5-nitro-1,3-thiazol-2-amine + +> +O=[N+](C1=CN=C(S1)N)[O-] + +> +O=[N+](C1=CN=C(S1)N)[O-] + +> +InChI=1/C3H3N3O2S/c4-3-5-1-2(9-3)6(7)8/h1H,(H2,4,5)/f/h4H2 + +> +MIHADVKEHAFNPG-LGEMBHMGCP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +44.6 + +> +0.307289937012453 + +> +31 + +> +no positive results; NTP assigned level of evidence positive + +> +kidney; lung; mammary gland + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +active + +> +multisite active + +> +TargetSites_Rat_Male modified v3a + +> +TR 53; final call in CPDB differs due to additional data; NTP-assigned level of evidence of carcinogenicity is "positive" in male rat; noting that "these experiments were particularly difficult to evaluate". + +> +http://potency.berkeley.edu/chempages/2-AMINO-5-NITROTHIAZOLE.html + +$$$$ + + + + 16 16 0 0 0 0 0 0 0 0 1 V2000 + 3.1225 -2.3401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3401 -3.4212 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0740 -3.0087 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.7911 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0740 -1.6786 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3401 -1.2661 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7526 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4526 -2.3401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1212 -1.1878 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4513 -1.1878 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1128 -2.3401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4513 -3.4924 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1212 -3.4924 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5493 -5.2563 0.0000 Mg 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6944 -5.9178 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3970 -5.9178 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 8 13 2 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 +M END +> +20067 + +> +67 + +> +20067 + +> +68_CPDBAS_v5c + +> +C9H10MgN2O4 + +> +234.494 + +> +defined organic + +> +complex Mg(OH)2 + +> +tested chemical + +> +2-Amino-5-phenyl-2-oxazolin-4-one + Mg(OH)2 + +> +18968-99-5 + +> +single chemical compound + +> +parent [2152-34-3] + +> +2-amino-5-phenyl-1,3-oxazol-4(5H)-one - dihydroxymagnesium (1:1) + +> +NC1=NC(C(C2=CC=CC=C2)O1)=O.O[Mg]O + +> +NC1=NC(C(C2=CC=CC=C2)O1)=O + +> +InChI=1/C9H8N2O2.Mg.2H2O/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;;;/h1-5,7H,(H2,10,11,12);;2*1H2/q;+2;;/p-2/fC9H8N2O2.Mg.2HO/h10H2;;2*1h/q;m;2*-1/rC9H8N2O2.H2MgO2/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;2-1-3/h1-5,7H,(H2,10,11,12);2-3H/f/h10H2; + +> +JOPOQPCBCUIPFX-VWMXNRJTCY + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/2-AMINO-5-PHENYL-2-OXAZOLIN-4-ONE%20+%20Mg(OH)2.html + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 3.3283 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9907 -1.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3283 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9954 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3329 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9954 -4.6053 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3283 -4.6053 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9907 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3236 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9861 -4.6053 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9861 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3236 -1.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9861 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3190 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9814 -1.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3190 -2.2987 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4560 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 17 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +20068 + +> +68 + +> +20068 + +> +69_CPDBAS_v5c + +> +C14H9NO2 + +> +223.2268 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Aminoanthraquinone + +> +117-79-3 + +> +single chemical compound + +> +2-amino-9,10-anthraquinone + +> +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N + +> +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N + +> +InChI=1/C14H9NO2/c15-8-5-6-11-12(7-8)14(17)10-4-2-1-3-9(10)13(11)16/h1-7H,15H2 + +> +XOGPDSATLSAZEK-UHFFFAOYAH + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +101 + +> +0.452454633583423 + +> +29 + +> +liver + +> +no positive results + +> +active + +> +1190 + +> +5.33090112835914 + +> +20 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +hematopoietic system; liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 144 + +> +http://potency.berkeley.edu/chempages/2-AMINOANTHRAQUINONE.html + +$$$$ + + + + 17 18 0 0 0 0 0 0 0 0 1 V2000 + 2.6631 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9948 -1.1570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6631 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9948 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6683 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6683 -1.1570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9896 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6579 -3.4610 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9844 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6527 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9793 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6475 -3.4610 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9793 -4.6080 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6527 -4.6080 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9741 -3.4610 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6475 -1.1570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 15 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 17 1 0 0 0 0 + 13 14 1 0 0 0 0 + 13 16 1 0 0 0 0 + 14 15 2 0 0 0 0 +M END +> +20069 + +> +69 + +> +20069 + +> +70_CPDBAS_v5c + +> +C14H15N3 + +> +225.289 + +> +defined organic + +> +parent + +> +tested chemical + +> +o-Aminoazotoluene + +> +97-56-3 + +> +single chemical compound + +> +2-methyl-4-[(E)-(2-methylphenyl)diazenyl]aniline + +> +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C + +> +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C + +> +InChI=1/C14H15N3/c1-10-5-3-4-6-14(10)17-16-12-7-8-13(15)11(2)9-12/h3-9H,15H2,1-2H3/b17-16+ + +> +PFRYFZZSECNQOL-WUKNDPDIBU + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +4.04 + +> +1.79325222270062E-02 + +> +44 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +active + +> +multisex active + +> +http://potency.berkeley.edu/chempages/o-AMINOAZOTOLUENE.html + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1544 -0.6620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1544 -1.9939 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4632 -0.6620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6095 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7639 -0.6620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9183 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0727 -0.6620 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 +M END +> +20070 + +> +70 + +> +20070 + +> +71_CPDBAS_v5c + +> +C6H13NO2 + +> +131.1742 + +> +defined organic + +> +parent + +> +tested chemical + +> +6-Aminocaproic acid + +> +60-32-2 + +> +single chemical compound + +> +6-aminohexanoic acid + +> +OC(=O)CCCCCN + +> +OC(=O)CCCCCN + +> +InChI=1/C6H13NO2/c7-5-3-1-2-4-6(8)9/h1-5,7H2,(H,8,9)/f/h8H + +> +SLXKOJJOQWFEFD-FZOZFQFYCD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/6-AMINOCAPROIC%20ACID.html + +$$$$ + + + + 13 14 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1562 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3316 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9935 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3251 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9869 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3251 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9935 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3186 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9804 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3120 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9739 -1.1562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3120 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9804 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 13 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 +M END +> +20071 + +> +71 + +> +20071 + +> +72_CPDBAS_v5c + +> +C12H11N + +> +169.2224 + +> +defined organic + +> +parent + +> +tested chemical + +> +4-Aminodiphenyl + +> +92-67-1 + +> +single chemical compound + +> +biphenyl-4-amine + +> +NC1=CC=C(C=C1)C2=CC=CC=C2 + +> +NC1=CC=C(C=C1)C2=CC=CC=C2 + +> +InChI=1/C12H11N/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10/h1-9H,13H2 + +> +DMVOXQPQNTYEKQ-UHFFFAOYAX + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +active + +> +2.1 + +> +1.24097046253924E-02 + +> +50 + +> +TD50 is harmonic mean of more than one positive test + +> +liver; urinary bladder + +> +liver; urinary bladder + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.html + +$$$$ + + + + 15 15 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1502 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3339 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9969 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3308 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9937 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3308 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9969 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3276 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9906 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3245 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9875 -1.1502 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3245 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9906 -2.3004 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3308 -3.6343 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6567 -3.6343 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 13 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 14 15 1 0 0 0 0 +M END +> +20072 + +> +72 + +> +20072 + +> +73_CPDBAS_v5c + +> +C12H12ClN + +> +205.6865 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +4-Aminodiphenyl.HCl + +> +2113-61-3 + +> +single chemical compound + +> +parent [92-67-1] + +> +biphenyl-4-amine hydrochloride + +> +NC1(=CC=C(C=C1)C2=CC=CC=C2).[H]Cl + +> +NC1(=CC=C(C=C1)C2=CC=CC=C2) + +> +InChI=1/C12H11N.ClH/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10;/h1-9H,13H2;1H + +> +GUHXYHYUBFCYGJ-UHFFFAOYAT + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +active + +> +0.98 + +> +4.76453243163747E-03 + +> +50 + +> +mammary gland + +> +active + +> +active + +> +http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.HCl.html + +$$$$ + + + + 14 16 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.8880 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0775 -2.1037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2943 -2.6461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3645 -1.8618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6692 -2.1404 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3363 -0.9896 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6630 -0.9896 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3301 -2.1404 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6630 -3.2912 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3363 -3.2912 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4420 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2326 -0.5424 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0158 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9382 -0.7770 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 +M END +> +20073 + +> +73 + +> +39239 + +> +74_CPDBAS_v5c + +> +C12H9NO + +> +183.2092 + +> +defined organic + +> +parent + +> +tested chemical + +> +2-Aminodiphenylene oxide + +> +3693-22-9 + +> +single chemical compound + +> +dibenzo[b,d]furan-2-amine + +> +NC3=CC1=C(C=C3)OC2=C1C=CC=C2 + +> +NC3=CC1=C(C=C3)OC2=C1C=CC=C2 + +> +InChI=1/C12H9NO/c13-8-5-6-12-10(7-8)9-3-1-2-4-11(9)14-12/h1-7H,13H2 + +> +FFYZMBQLAYDJIG-UHFFFAOYAK + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +4.24 + +> +0.023142942603319 + +> +47 + +> +TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable + +> +liver; urinary bladder + +> +liver + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/2-AMINODIPHENYLENE%20OXIDE.html + +$$$$ + + + + 12 12 0 0 0 0 0 0 0 0 1 V2000 + 4.0663 -4.2139 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6134 -2.9635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3039 -2.7322 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7568 -1.4818 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0663 -1.2504 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9228 -2.2694 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5241 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3039 -4.0613 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1519 -4.7259 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.0613 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.7322 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1519 -2.0676 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 +M END +> +20074 + +> +74 + +> +20074 + +> +75_CPDBAS_v5c + +> +C9H17NO2 + +> +171.2388 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-(Aminomethyl)cyclohexaneacetic acid + +> +60142-96-3 + +> +single chemical compound + +> +[1-(aminomethyl)cyclohexyl]acetic acid + +> +NCC1(CC(=O)O)CCCCC1 + +> +NCC1(CC(=O)O)CCCCC1 + +> +InChI=1/C9H17NO2/c10-7-9(6-8(11)12)4-2-1-3-5-9/h1-7,10H2,(H,11,12)/f/h11H + +> +UGJMXCAKCUNAIE-WXRBYKJCCG + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +5850 + +> +34.1628182397914 + +> +10 + +> +pancreas + +> +no positive results + +> +active + +> +active + +> +Rat added v3a + +> +http://potency.berkeley.edu/chempages/1-(AMINOMETHYL)CYCLOHEXANEACETIC%20ACID.html + +$$$$ + + + + 19 18 0 0 0 0 0 0 0 0 1 V2000 + 1.3251 -5.7158 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3129 -4.5673 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9543 -2.2881 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2829 -3.4365 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2829 -1.1396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9666 -3.4365 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9666 -1.1396 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3129 -2.2881 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9543 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3129 -6.8554 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9666 -5.7158 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9877 -4.5673 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9666 -8.0039 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -5.7158 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4827 -6.6964 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1133 -5.3448 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4827 -5.3448 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8343 -5.3448 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4827 -3.9754 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 12 1 0 0 0 0 + 1 14 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 4 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 5 9 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 8 2 0 0 0 0 + 10 11 1 0 0 0 0 + 10 13 1 0 0 0 0 + 15 17 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 17 19 2 0 0 0 0 +M END +> +20075 + +> +75 + +> +20075 + +> +76_CPDBAS_v5c + +> +C10H18N2O6S + +> +294.3247 + +> +defined organic + +> +complex H2SO4 + +> +tested chemical + +> +2,2'-[(4-Aminophenyl)imino]bisethanol sulfate + +> +54381-16-7 + +> +single chemical compound + +> +parent [7575-35-1] + +> +2,2'-[(4-aminophenyl)imino]diethanol sulfate (salt) + +> +OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1 + +> +OCCN(CCO)c1ccc(N)cc1 + +> +InChI=1/C10H16N2O2.H2O4S/c11-9-1-3-10(4-2-9)12(5-7-13)6-8-14;1-5(2,3)4/h1-4,13-14H,5-8,11H2;(H2,1,2,3,4)/f/h;1-2H + +> +KMCFMEHSEWDYKG-ATDHBCBACR + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +Rat added v2a + +> +http://potency.berkeley.edu/chempages/2,2'-[(4-AMINOPHENYL)IMINO]BISETHANOL%20SULFATE.html + +$$$$ + + + + 6 6 0 0 0 0 0 0 0 0 1 V2000 + 1.3304 -1.0738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1104 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3767 -0.4086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3767 -1.7390 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1104 -2.1509 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.0738 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 2 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END +> +20076 + +> +76 + +> +20076 + +> +77_CPDBAS_v5c + +> +C2H4N4 + +> +84.08 + +> +defined organic + +> +parent + +> +tested chemical + +> +3-Aminotriazole + +> +61-82-5 + +> +single chemical compound + +> +tautomers + +> +1H-1,2,4-triazol-3-amine + +> +C1(N=CNN=1)N + +> +C1(N=CNN=1)N + +> +InChI=1/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6)/f/h5H,3H2 + +> +KLSJWNVTNUYHDU-YPUDGCQOCD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse; hamster + +> +inactive + +> +9.94 + +> +0.118220742150333 + +> +35 + +> +TD50 is harmonic mean of more than one positive test + +> +thyroid gland + +> +pituitary gland; thyroid gland + +> +active + +> +25.3 + +> +0.300903901046622 + +> +34 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +liver + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +http://potency.berkeley.edu/chempages/3-AMINOTRIAZOLE.html + +$$$$ + + + + 14 13 0 0 0 0 0 0 0 0 1 V2000 + 1.1352 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2703 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4055 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5680 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7032 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8383 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9735 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1086 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2712 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4063 -2.0241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5415 -1.3403 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1352 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.0241 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6766 -2.0241 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 12 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 14 1 0 0 0 0 +M END +> +20077 + +> +77 + +> +20077 + +> +78_CPDBAS_v5c + +> +C11H23NO2 + +> +201.3058 + +> +defined organic + +> +parent + +> +tested chemical + +> +11-Aminoundecanoic acid + +> +2432-99-7 + +> +single chemical compound + +> +11-aminoundecanoic acid + +> +OC(=O)CCCCCCCCCCN + +> +OC(=O)CCCCCCCCCCN + +> +InChI=1/C11H23NO2/c12-10-8-6-4-2-1-3-5-7-9-11(13)14/h1-10,12H2,(H,13,14)/f/h13H + +> +GUOSQNAUYHMCRU-NDKGDYFDCZ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +1100 + +> +5.46432343231044 + +> +18 + +> +liver; urinary bladder + +> +no positive results + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +active + +> +multisite active + +> +TR 216 + +> +http://potency.berkeley.edu/chempages/11-AMINOUNDECANOIC%20ACID.html + +$$$$ + + + + 6 4 0 0 0 0 0 0 0 0 2 V2000 + 2.6600 -2.6600 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 -1.3320 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1.3280 -1.3320 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 0.0000 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9880 -1.3320 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3320 0.0000 Cl 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M CHG 2 2 1 6 -1 +M END +> +20078 + +> +78 + +> +20078 + +> +79_CPDBAS_v5c + +> +H4ClN + +> +53.4915 + +> +inorganic + +> +tested chemical + +> +Ammonium chloride + +> +12125-02-9 + +> +single chemical compound + +> +ammonium chloride + +> +[H][N+]([H])([H])[H].[Cl-] + +> +InChI=1/ClH.H3N/h1H;1H3/fCl.H4N/h1h;1H/q-1;+1 + +> +NLXLAEXVIDQMFP-DWOZJLMICO + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/AMMONIUM%20CHLORIDE.html + +$$$$ + + + + 15 12 0 0 0 0 0 0 0 0 2 V2000 + 2.3011 -1.9952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3011 -3.3253 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1505 -3.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.3253 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.1505 -5.3204 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6312 -1.9952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2963 -3.1457 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6312 -4.2963 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6264 -3.1457 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3011 -0.6651 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4583 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.1505 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9710 -1.9952 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7932 -6.6506 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1.4631 -6.6506 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 2 0 0 0 0 + 10 11 1 0 0 0 0 + 10 12 2 0 0 0 0 +M CHG 4 4 -1 11 -1 14 1 15 1 +M END +> +20079 + +> +79 + +> +20079 + +> +80_CPDBAS_v5c + +> +C6H14N2O7 + +> +226.1858 + +> +defined organic + +> +complex 2NH4 + +> +tested chemical + +> +Ammonium citrate + +> +3012-65-5 + +> +single chemical compound + +> +parent [77-92-9] + +> +diammonium 2-(carboxymethyl)-2-hydroxybutanedioate + +> +C(CC([O-])=O)(CC(O)=O)(C([O-])=O)O.[N+].[N+] + +> +C(CC(O)=O)(CC(O)=O)(C(O)=O)O + +> +InChI=1/C6H8O7.2H3N/c7-3(8)1-6(13,5(11)12)2-4(9)10;;/h13H,1-2H2,(H,7,8)(H,9,10)(H,11,12);2*1H3/fC6H6O7.2H4N/h7H;2*1H/q-2;2*+1 + +> +YXVFQADLFFNVDS-JYGIMERMCP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/AMMONIUM%20CITRATE.html + +$$$$ + + + + 2 0 0 0 0 0 0 0 0 0 2 V2000 + 10.0000 0.0000 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.3600 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 +M CHG 2 1 1 2 -1 +M END +> +20080 + +> +80 + +> +20080 + +> +81_CPDBAS_v5c + +> +H5NO + +> +35.0458 + +> +inorganic + +> +tested chemical + +> +Ammonium hydroxide + +> +1336-21-6 + +> +single chemical compound + +> +ammonium hydroxide + +> +[N+].[O-] + +> +InChI=1/H3N.H2O/h1H3;1H2/fH4N.HO/h1H;1h/q+1;-1 + +> +VHUUQVKOLVNVRT-QBBVKLOVCT + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/AMMONIUM%20HYDROXIDE.html + +$$$$ + + + + 16 16 0 0 0 0 0 0 0 0 1 V2000 + 3.1752 -3.9923 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3269 -3.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3269 -2.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4787 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4787 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6305 -2.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6305 -3.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7823 -3.9923 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4787 -3.9923 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0195 -2.2257 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1635 -1.2140 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8560 -1.4397 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3969 -2.6927 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.4202 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8756 -0.7471 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5604 -0.5214 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 14 1 0 0 0 0 + 15 16 1 0 0 0 0 +M END +> +20081 + +> +81 + +> +20081 + +> +82_CPDBAS_v5c + +> +C11H18N2O3 + +> +226.2748 + +> +defined organic + +> +parent + +> +tested chemical + +> +Amobarbital + +> +57-43-2 + +> +single chemical compound + +> +5-ethyl-5-(3-methylbutyl)pyrimidine-2,4,6(1H,3H,5H)-trione + +> +N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O + +> +N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O + +> +InChI=1/C11H18N2O3/c1-4-11(6-5-7(2)3)8(14)12-10(16)13-9(11)15/h7H,4-6H2,1-3H3,(H2,12,13,14,15,16)/f/h12-13H + +> +VIROVYVQCGLCII-BAINRFMOCW + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/AMOBARBITAL.html + +$$$$ + + + + 25 24 0 0 0 0 0 0 0 0 1 V2000 + 1.3247 -4.6461 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3247 -3.3214 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.3214 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6591 -3.3214 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3247 -1.9967 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1331 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9837 -1.9967 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9837 -0.6623 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1331 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2922 -0.6623 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2922 -1.9967 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4415 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5908 -1.9967 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5908 -0.6623 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7402 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1331 -6.6428 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9837 -5.9805 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9837 -4.6461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1331 -3.9837 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2922 -4.6461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2922 -5.9805 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4415 -6.6428 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5908 -5.9805 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5908 -4.6461 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7402 -6.6428 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 2 0 0 0 0 + 6 7 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 13 15 1 0 0 0 0 + 16 17 2 0 0 0 0 + 16 21 1 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 2 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 2 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 23 24 1 0 0 0 0 + 23 25 1 0 0 0 0 +M END +> +20082 + +> +82 + +> +20082 + +> +83_CPDBAS_v5c + +> +C18H28N2O4S + +> +368.4909 + +> +defined organic + +> +complex bis H2SO4 + +> +tested chemical + +> +dl-Amphetamine sulfate + +> +60-13-9 + +> +single chemical compound + +> +racemic mixture of L- [51-62-7] and D- [51-63-8], parent [300-62-9], structure shown without stereochem + +> +1-phenylpropan-2-amine sulfate (2:1) + +> +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C + +> +C1=CC=CC=C1CC(N)C + +> +InChI=1/2C9H13N.H2O4S/c2*1-8(10)7-9-5-3-2-4-6-9;1-5(2,3)4/h2*2-6,8H,7,10H2,1H3;(H2,1,2,3,4)/f/h;;1-2H + +> +PYHRZPFZZDCOPH-IPLSSONACD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 387 + +> +http://potency.berkeley.edu/chempages/dl-AMPHETAMINE%20SULFATE.html + +$$$$ + + + + 29 28 0 0 1 0 0 0 0 0 1 V2000 + 7.0899 -2.6689 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4012 -3.9801 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4012 -2.6689 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0899 -3.9801 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6776 -4.3979 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4667 -3.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6776 -2.2627 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4244 -1.3228 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0783 -1.3228 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7439 -2.6573 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6038 -2.6573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6038 -4.0033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0837 -5.6743 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3834 -5.9528 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1902 -6.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1384 -4.9432 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2976 -0.6498 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2976 -1.9843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1372 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1372 -2.6573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6498 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4463 -2.6573 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4463 -3.9801 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6067 -1.9843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6067 -0.6498 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0232 -7.1248 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9727 -7.0783 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7132 -7.1712 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 9 1 6 0 0 0 + 1 10 1 1 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 7 1 0 0 0 0 + 3 8 1 6 0 0 0 + 4 16 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 13 1 6 0 0 0 + 6 7 1 0 0 0 0 + 6 11 1 0 0 0 0 + 6 12 1 0 0 0 0 + 10 25 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 15 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 19 2 0 0 0 0 + 18 20 2 0 0 0 0 + 18 23 1 0 0 0 0 + 19 21 1 0 0 0 0 + 20 22 1 0 0 0 0 + 21 22 2 0 0 0 0 + 23 24 1 6 0 0 0 + 23 25 1 0 0 0 0 + 25 26 2 0 0 0 0 +M END +> +20083 + +> +83 + +> +20083 + +> +84_CPDBAS_v5c + +> +C16H25N3O7S + +> +403.4506 + +> +defined organic + +> +complex 3H2O + +> +tested chemical + +> +Ampicillin trihydrate + +> +7177-48-2 + +> +single chemical compound + +> +stereochem; parent [69-53-4] + +> +(2S,5R,6R)-6-{[(2R)-2-amino-2-phenylacetyl]amino}-3,3-dimethyl-7-oxo-4-thia-1-azabicyclo[3.2.0]heptane-2-carboxylic acid trihydrate + +> +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O + +> +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O + +> +InChI=1/C16H19N3O4S.3H2O/c1-16(2)11(15(22)23)19-13(21)10(14(19)24-16)18-12(20)9(17)8-6-4-3-5-7-8;;;/h3-7,9-11,14H,17H2,1-2H3,(H,18,20)(H,22,23);3*1H2/t9-,10-,11+,14-;;;/m1.../s1/f/h18,22H;;; + +> +RXDALBZNGVATNY-FQLIROBNDT + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +structure modified v5b + +> +TR 318 + +> +http://potency.berkeley.edu/chempages/AMPICILLIN%20TRIHYDRATE.html + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 1 V2000 + 1.1536 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3071 -0.6696 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3071 -2.0006 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4607 -2.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6062 -2.0006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7598 -2.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9133 -2.0006 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0669 -2.6621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1536 -2.6621 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.0006 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4607 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 10 2 0 0 0 0 +M END +> +20084 + +> +84 + +> +20084 + +> +85_CPDBAS_v5c + +> +C6H13N3O2 + +> +159.1876 + +> +defined organic + +> +parent + +> +tested chemical + +> +1-Amyl-1-nitrosourea + +> +10589-74-9 + +> +single chemical compound + +> +1-nitroso-1-pentylurea + +> +O=C(N(CCCCC)N=O)N + +> +O=C(N(CCCCC)N=O)N + +> +InChI=1/C6H13N3O2/c1-2-3-4-5-9(8-11)6(7)10/h2-5H2,1H3,(H2,7,10)/f/h7H2 + +> +YYTNAQDGJQPZFU-IAUQMDSZCI + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0.555 + +> +3.48645246237772E-03 + +> +51 + +> +TD50 is harmonic mean of more than one positive test + +> +hematopoietic system; lung; stomach + +> +hematopoietic system; lung; mammary gland; stomach; uterus + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +TD50_Rat modified v5a + +> +http://potency.berkeley.edu/chempages/1-AMYL-1-NITROSOUREA.html + +$$$$ + + + + 0 0 0 0 0 0 0 0 0 0 1 V2000 +M END +> +20085 + +> +20085 + +> +86_CPDBAS_v5c + +> +no structure + +> +no structure + +> +Amylopectin sulfate + +> +9047-13-6 + +> +macromolecule + +> +non-linear polymer of glucose (Merck - amylopectic) + +> +InChI=1// + +> +MOSFIJXAXDLOML-UHFFFAOYAM + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +283 + +> +50 + +> +TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active + +> +large intestine + +> +active + +> +active + +> +TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture + +> +http://potency.berkeley.edu/chempages/AMYLOPECTIN%20SULFATE.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 0.6773 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1753 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6640 -2.3241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9921 -2.3241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6561 -1.1753 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9842 -1.1753 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6482 -2.3241 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9842 -3.4729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6561 -3.4729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9763 -2.3241 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6403 -3.4729 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +20086 + +> +86 + +> +20086 + +> +87_CPDBAS_v5c + +> +C10H12O + +> +148.2017 + +> +defined organic + +> +parent + +> +representative isomer in mixture + +> +Anethole + +> +104-46-1 + +> +mixture or formulation + +> +mixture of Z [25679-28-1], E [4180-23-8] isomers, structure shown Z, stereochem + +> +1-(methyloxy)-4-[(1Z)-prop-1-en-1-yl]benzene + +> +CC=CC1=CC=C(C=C1)OC + +> +CC=CC1=CC=C(C=C1)OC + +> +InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3- + +> +RUVINXPYWBROJD-ARJAWSKDBC + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/ANETHOLE.html + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3316 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9934 -1.1561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3249 -1.1561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9867 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3183 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9801 -1.1561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3183 -2.3043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9867 -2.3043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3116 -1.1561 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9734 -2.3043 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +20087 + +> +87 + +> +20087 + +> +88_CPDBAS_v5c + +> +C10H12O + +> +148.2017 + +> +defined organic + +> +parent + +> +tested chemical + +> +trans-Anethole + +> +4180-23-8 + +> +single chemical compound + +> +stereochem + +> +1-(methyloxy)-4-[(1E)-prop-1-en-1-yl]benzene + +> +C/C=C/C1=CC=C(C=C1)OC + +> +C/C=C/C1=CC=C(C=C1)OC + +> +InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3+ + +> +RUVINXPYWBROJD-ONEGZZNKBR + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/trans-ANETHOLE.html + +$$$$ + + + + 17 18 0 0 1 0 0 0 0 0 1 V2000 + 3.5180 -1.6894 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5813 -0.9143 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9254 -2.9615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6745 -1.6894 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2571 -2.9615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9962 -1.6894 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3403 -3.7465 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1403 -4.0347 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2559 -1.2820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2522 -2.1863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9776 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.7689 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3937 -2.9615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6658 -3.3788 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9378 -3.7962 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0732 -2.1068 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2484 -4.6310 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 1 0 0 0 + 1 3 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 8 1 1 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 6 0 0 0 + 5 7 1 6 0 0 0 + 6 13 1 0 0 0 0 + 7 13 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 11 1 1 0 0 0 + 10 12 1 0 0 0 0 + 13 14 1 6 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 + 14 17 1 0 0 0 0 +M END +> +20088 + +> +88 + +> +20088 + +> +89_CPDBAS_v5c + +> +C8H11Cl3O6 + +> +309.52834 + +> +defined organic + +> +parent + +> +tested chemical + +> +Anhydroglucochloral + +> +15879-93-3 + +> +single chemical compound + +> +Chlorlose-alpha, stereochem + +> +1,2-O-[(1R)-2,2,2-trichloroethylidene]-alpha-D-glucofuranose + +> +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2 + +> +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2 + +> +InChI=1/C8H11Cl3O6/c9-8(10,11)7-16-5-3(14)4(2(13)1-12)15-6(5)17-7/h2-7,12-14H,1H2/t2-,3+,4-,5-,6-,7-/m1/s1 + +> +OJYGBLRPYBAHRT-IPQSZEQABF + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +structure modified v5b + +> +http://potency.berkeley.edu/chempages/ANHYDROGLUCOCHLORAL.html + +$$$$ + + + + 16 17 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -3.9909 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -1.9995 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3058 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4587 -1.9995 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4587 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3058 -3.9909 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6036 -3.9909 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7565 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7565 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9094 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0623 -1.9995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0623 -3.3297 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9094 -3.9909 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9094 -5.3211 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3058 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 +M END +> +20089 + +> +89 + +> +20089 + +> +90_CPDBAS_v5c + +> +C9H5Cl3N4 + +> +275.5218 + +> +defined organic + +> +parent + +> +tested chemical + +> +Anilazine + +> +101-05-3 + +> +single chemical compound + +> +4,6-dichloro-N-(2-chlorophenyl)-1,3,5-triazin-2-amine + +> +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl + +> +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl + +> +InChI=1/C9H5Cl3N4/c10-5-3-1-2-4-6(5)13-9-15-7(11)14-8(12)16-9/h1-4H,(H,13,14,15,16)/f/h13H + +> +IMHBYKMAHXWHRP-NDKGDYFDCD + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 104 + +> +http://potency.berkeley.edu/chempages/ANILAZINE.html + +$$$$ + + + + 7 7 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1496 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3292 -1.1496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9958 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3250 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9916 -1.1496 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3250 -2.3032 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9958 -2.3032 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 +M END +> +20090 + +> +90 + +> +20090 + +> +91_CPDBAS_v5c + +> +C6H7N + +> +93.1265 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aniline + +> +62-53-3 + +> +single chemical compound + +> +aniline + +> +NC1=CC=CC=C1 + +> +NC1=CC=CC=C1 + +> +InChI=1/C6H7N/c7-6-4-2-1-3-5-6/h1-5H,7H2 + +> +PAYRUJLWNCNPSJ-UHFFFAOYAP + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/ANILINE.html + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1525 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3279 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9939 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3219 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9878 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3219 -2.3050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9939 -2.3050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3279 -3.6329 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6599 -3.6329 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 +M END +> +20091 + +> +91 + +> +20091 + +> +92_CPDBAS_v5c + +> +C6H8ClN + +> +129.5874 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +Aniline.HCl + +> +142-04-1 + +> +single chemical compound + +> +parent [62-53-3] + +> +aniline hydrochloride + +> +NC1=CC=CC=C1[H]Cl + +> +NC1=CC=CC=C1 + +> +InChI=1/C6H7N.ClH/c7-6-4-2-1-3-5-6;/h1-5H,7H2;1H + +> +MMCPOSDMTGQNKG-UHFFFAOYAJ + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +269 + +> +2.07581909969642 + +> +22 + +> +TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results + +> +peritoneal cavity; spleen; vascular system + +> +peritoneal cavity + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +active + +> +active + +> +multisite active; multisex active + +> +TR 130 + +> +http://potency.berkeley.edu/chempages/ANILINE.HCl.html + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 1 V2000 + 1.9960 -2.3024 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6614 -1.1536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9921 -1.1536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6574 -2.3024 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9921 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6614 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9960 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6653 -2.3024 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5988 -4.7867 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9247 -4.7867 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 8 9 1 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +20092 + +> +92 + +> +20092 + +> +93_CPDBAS_v5c + +> +C7H10ClNO + +> +159.6134 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +o-Anisidine.HCl + +> +134-29-2 + +> +single chemical compound + +> +parent [90-04-0] + +> +2-methoxyaniline hydrochloride + +> +C1(=C(C=CC=C1)N)OC.[H]Cl + +> +C1(=C(C=CC=C1)N)OC + +> +InChI=1/C7H9NO.ClH/c1-9-7-5-3-2-4-6(7)8;/h2-5H,8H2,1H3;1H + +> +XCZCWGVXRBJCCD-UHFFFAOYAX + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +29.7 + +> +0.186074602758916 + +> +33 + +> +TD50 is harmonic mean of more than one positive test + +> +kidney; thyroid gland; urinary bladder + +> +urinary bladder + +> +active + +> +966 + +> +6.0521234432698 + +> +19 + +> +TD50 is harmonic mean of more than one positive test + +> +urinary bladder + +> +urinary bladder + +> +active + +> +active + +> +active + +> +multisite active; multisex active; multispecies active + +> +TR 89 + +> +http://potency.berkeley.edu/chempages/o-ANISIDINE.HCl.html + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 1 V2000 + 1.9927 -1.1489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9913 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6555 -1.1489 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9839 -1.1489 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9913 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6642 -1.1489 0.0000 O 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 + 2.3936 -3.6322 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7220 -3.6322 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +20093 + +> +93 + +> +20093 + +> +94_CPDBAS_v5c + +> +C7H10ClNO + +> +159.6134 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +p-Anisidine.HCl + +> +20265-97-8 + +> +single chemical compound + +> +parent [104-94-9] + +> +4-(methyloxy)aniline hydrochloride + +> +C1(=CC=C(N)C=C1)OC.[H]Cl + +> +C1(=CC=C(N)C=C1)OC + +> +InChI=1/C7H9NO.ClH/c1-9-7-4-2-6(8)3-5-7;/h2-5H,8H2,1H3;1H + +> +VQYJLACQFYZHCO-UHFFFAOYAH + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 116 + +> +http://potency.berkeley.edu/chempages/p-ANISIDINE.HCl.html + +$$$$ + + + + 10 10 0 0 0 0 0 0 0 0 1 V2000 + 2.6582 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9971 -1.1499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6582 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9971 -3.4542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6657 -3.4542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6657 -1.1499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9896 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6553 -1.1499 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6553 -3.4542 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 +M END +> +20094 + +> +94 + +> +20094 + +> +95_CPDBAS_v5c + +> +C7H7NO2 + +> +137.136 + +> +defined organic + +> +parent + +> +tested chemical + +> +Anthranilic acid + +> +118-92-3 + +> +single chemical compound + +> +2-aminobenzoic acid + +> +NC1=C(C=CC=C1)C(=O)O + +> +NC1=C(C=CC=C1)C(=O)O + +> +InChI=1/C7H7NO2/c8-6-4-2-1-3-5(6)7(9)10/h1-4H,8H2,(H,9,10)/f/h9H + +> +RWZYAGGXGHYGMB-BGGKNDAXCO + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive; multispecies inactive + +> +TR 36 + +> +http://potency.berkeley.edu/chempages/ANTHRANILIC%20ACID.html + +$$$$ + + + + 16 18 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -4.6544 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -3.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3006 -4.6544 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4576 -3.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6079 -4.6544 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6079 -5.9842 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4576 -6.6491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3006 -5.9842 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4576 -2.6597 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6079 -1.9947 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3006 -1.9947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -2.6597 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9947 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6649 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3006 -0.6649 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +20095 + +> +95 + +> +20095 + +> +96_CPDBAS_v5c + +> +C14H8O2 + +> +208.2121 + +> +defined organic + +> +parent + +> +tested chemical + +> +9,10-Anthraquinone + +> +84-65-1 + +> +single chemical compound + +> +9,10-anthraquinone + +> +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3 + +> +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3 + +> +InChI=1/C14H8O2/c15-13-9-5-1-2-6-10(9)14(16)12-8-4-3-7-11(12)13/h1-8H + +> +RZVHIXYEVGDQDX-UHFFFAOYAA + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +active + +> +0 + +> +no positive results + +> +no positive results + +> +no positive results + +> +inactive + +> +inactive + +> +inactive + +> +multisex inactive + +> +http://potency.berkeley.edu/chempages/9,10-ANTHRAQUINONE.html + +$$$$ + + + + 33 30 0 0 0 0 0 0 0 0 2 V2000 + 12.0104 -4.5373 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 + 2.4492 -4.9297 0.0000 K 0 3 0 0 0 0 0 0 0 0 0 0 + 15.6998 -6.7352 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 14.6637 -7.5987 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.3920 -6.7352 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4779 -0.6908 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3004 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1543 -0.6908 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3079 -7.7086 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1461 -7.0178 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -7.7086 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8281 -7.8813 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7994 -7.7086 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0287 -3.2342 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4055 -4.4902 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7414 -3.2185 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3379 -5.2123 0.0000 Sb 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3175 -4.4431 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3018 -5.9816 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 4.7100 -7.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3898 -5.9816 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9973 -7.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9598 -3.2813 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2472 -3.2342 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5987 -4.5373 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6868 -4.4588 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 8.5250 -5.1966 0.0000 Sb 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4574 -5.9659 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8656 -7.1905 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5612 -5.9659 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1530 -7.1905 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1107 -2.4649 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6738 -2.1352 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 12 31 2 0 0 0 0 + 13 20 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 + 14 23 1 0 0 0 0 + 15 17 1 0 0 0 0 + 16 18 1 0 0 0 0 + 16 33 2 0 0 0 0 + 17 18 1 0 0 0 0 + 17 21 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 22 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 29 1 0 0 0 0 + 23 24 1 0 0 0 0 + 23 25 1 0 0 0 0 + 24 26 1 0 0 0 0 + 24 32 2 0 0 0 0 + 25 27 1 0 0 0 0 + 27 28 1 0 0 0 0 + 27 30 1 0 0 0 0 + 28 29 1 0 0 0 0 + 29 31 1 0 0 0 0 + 30 31 1 0 0 0 0 +M CHG 4 1 1 2 1 19 -1 26 -1 +M END +> +20096 + +> +96 + +> +39240 + +> +97_CPDBAS_v5c + +> +C8H10K2O15Sb2 + +> +667.8726 + +> +organometallic + +> +tested chemical + +> +Antimony potassium tartrate + +> +28300-74-5 + +> +single chemical compound + +> +dipotassium 5,11-dioxo-2,6,8,12,13,14-hexaoxa-1,7-distibatricyclo[8.2.1.1~4,7~]tetradecane-3,9-dicarboxylate trihydrate + +> +[K+].[K+].[O-]C(=O)C2O[Sb]3OC(C(O[Sb]1OC(=O)C2O1)C([O-])=O)C(=O)O3.O.O.O + +> +InChI=1/2C4H4O6.2K.3H2O.2Sb/c2*5-1(3(7)8)2(6)4(9)10;;;;;;;/h2*1-2H,(H,7,8)(H,9,10);;;3*1H2;;/q2*-2;2*+1;;;;2*+3/p-4/f2C4H2O6.2K.3H2O.2Sb/q2*-4;2m;;;;2m/rC8H6O12Sb2.2K.3H2O/c9-5(10)1-3-7(13)19-22(17-3)16-2(6(11)12)4-8(14)20-21(15-1)18-4;;;;;/h1-4H,(H,9,10)(H,11,12);;;3*1H2/q;2*+1;;;/p-2/fC8H4O12Sb2.2K.3H2O/q-2;2m;;; + +> +WBTCZEPSIIFINA-DYFLWLNICK + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +inactive + +> +0 + +> +no positive results + +> +inactive + +> +inactive + +> +http://potency.berkeley.edu/chempages/ANTIMONY%20POTASSIUM%20TARTRATE.html + +$$$$ + + + + 21 21 0 0 0 0 0 0 0 0 1 V2000 + 8.0682 -5.1439 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0682 -3.8092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9285 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7737 -3.8092 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6190 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4642 -3.8092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3095 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3095 -1.8146 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4642 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6190 -1.8146 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1547 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.4799 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8146 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4949 -2.2945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2230 -3.1493 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3777 -3.8092 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3777 -5.1439 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5325 -3.1493 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6872 -3.8092 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.8420 -3.1493 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.9967 -3.8092 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 8 11 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 11 14 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 16 18 1 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 1 0 0 0 0 +M END +> +20097 + +> +97 + +> +20097 + +> +98_CPDBAS_v5c + +> +C15H23ClO4S + +> +334.8587 + +> +defined organic + +> +parent + +> +tested chemical + +> +Aramite + +> +140-57-8 + +> +single chemical compound + +> +2-chloroethyl 2-{[4-(1,1-dimethylethyl)phenyl]oxy}-1-methylethyl sulfite + +> +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl + +> +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl + +> +InChI=1/C15H23ClO4S/c1-12(20-21(17)19-10-9-16)11-18-14-7-5-13(6-8-14)15(2,3)4/h5-8,12H,9-11H2,1-4H3 + +> +YKFRAOGHWKADFJ-UHFFFAOYAL + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat; mouse + +> +96.7 + +> +0.288778520611828 + +> +31 + +> +TD50 is harmonic mean of more than one positive test + +> +liver + +> +active + +> +158 + +> +0.471840809272687 + +> +32 + +> +liver + +> +no positive results + +> +active + +> +active + +> +active + +> +multispecies active + +> +http://potency.berkeley.edu/chempages/ARAMITE.html + +$$$$ + + + + 13 12 0 0 0 0 0 0 0 0 1 V2000 + 4.6515 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3171 -1.1556 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6482 -1.1556 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3137 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6482 -3.4594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3171 -3.4594 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3137 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3278 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6622 -3.4594 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3278 -4.6077 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6622 -1.1556 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3477 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3311 -2.3477 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 2 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 11 2 0 0 0 0 + 9 10 1 0 0 0 0 + 12 13 1 0 0 0 0 +M END +> +20098 + +> +98 + +> +20098 + +> +99_CPDBAS_v5c + +> +C8H14ClNO2 + +> +191.6571 + +> +defined organic + +> +complex HCl + +> +tested chemical + +> +Arecoline.HCl + +> +61-94-9 + +> +single chemical compound + +> +parent [63-75-2] + +> +methyl 1-methyl-1,2,5,6-tetrahydropyridine-3-carboxylate hydrochloride + +> +O=C(OC)C1=CCCN(C)C1.[H]Cl + +> +O=C(OC)C1=CCCN(C)C1 + +> +InChI=1/C8H13NO2.ClH/c1-9-5-3-4-7(6-9)8(10)11-2;/h4H,3,5-6H2,1-2H3;1H + +> +LQSWCSYIDIBGRR-UHFFFAOYAO + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +mouse + +> +39.5 + +> +0.206097243462413 + +> +36 + +> +TD50 is harmonic mean of more than one positive test + +> +lung; stomach; vascular system + +> +lung; vascular system + +> +active + +> +active + +> +active + +> +multisite active; multisex active + +> +http://potency.berkeley.edu/chempages/ARECOLINE.HCl.html + +$$$$ + + + + 26 28 0 0 0 0 0 0 0 0 2 V2000 + 4.6012 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9551 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4264 -7.5675 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 4.6012 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6530 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9032 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5493 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9551 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9032 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0069 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6530 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0069 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3564 -0.7636 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1244 -7.5675 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 2.2516 -0.7636 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0725 -8.6933 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3089 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8416 -4.2488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7147 -5.3648 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5258 -6.2361 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 6.5493 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4975 -5.3648 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8416 -1.9971 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4975 -3.1229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7897 -5.3648 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4949 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 9 2 0 0 0 0 + 2 4 2 0 0 0 0 + 2 5 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 16 2 0 0 0 0 + 4 8 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 10 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 21 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 18 1 0 0 0 0 + 8 13 1 0 0 0 0 + 8 11 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 15 1 0 0 0 0 + 12 19 2 0 0 0 0 + 12 20 1 0 0 0 0 + 13 17 1 0 0 0 0 + 15 17 1 0 0 0 0 + 18 22 1 0 0 0 0 + 18 24 2 0 0 0 0 + 21 23 2 0 0 0 0 + 22 25 1 0 0 0 0 + 23 24 1 0 0 0 0 +M CHG 4 3 1 14 -1 20 -1 26 1 +M END +> +20099 + +> +99 + +> +20099 + +> +100_CPDBAS_v5c + +> +C17H10NNaO7 + +> +363.2536 + +> +defined organic + +> +salt Na + +> +representative component in mixture + +> +Aristolochic acid, sodium salt (77% AA I, 21% AA II) + +> +10190-99-5 + +> +mixture or formulation + +> +structure shown AA I, parent [313-67-7]; AA II 6-Nitrophenanthro(3,4-d)-1,3-dioxole-5-carboxylic acid, sodium salt, AA II parent [475-80-9] + +> +sodium 8-(methyloxy)-6-nitrophenanthro[3,4-d][1,3]dioxole-5-carboxylate + +> +[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+] + +> +[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C(O)=O)=CC3=C2OCO3)=O + +> +InChI=1/C17H11NO7.Na/c1-23-12-4-2-3-8-9(12)5-11(18(21)22)14-10(17(19)20)6-13-16(15(8)14)25-7-24-13;/h2-6H,7H2,1H3,(H,19,20);/q;+1/p-1/fC17H10NO7.Na/q-1;m + +> +BQVOPWJSBBMGBR-KEMNOBITCY + +> +Carcinogenicity + +> +TD50; Tumor Target Sites + +> +rat + +> +active + +> +0.0141 + +> +50 + +> +TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active + +> +stomach + +> +stomach + +> +active + +> +active + +> +active + +> +multisex active + +> +kidney and urinary bladder were additional target sites but experiments too short to meet the inclusion rules of the CPDB; Rat added v2a; Mutagenicity_SAL_CPDB added v3a; TD50_Rat_mmol conversion from mg value not provided due to substance being a mixture + +> +http://potency.berkeley.edu/chempages/ARISTOLOCHIC%20ACID,%20SODIUM%20SALT%20(77%25%20AA%20I,%2021%25%20AA%20I.html + +$$$$ diff --git a/test/data/CPDBAS_v5d_cleaned/CPDBAS_v5d_20Nov2008_mouse_TD50.csv b/test/data/CPDBAS_v5d_cleaned/CPDBAS_v5d_20Nov2008_mouse_TD50.csv new file mode 100644 index 0000000..a726ad8 --- /dev/null +++ b/test/data/CPDBAS_v5d_cleaned/CPDBAS_v5d_20Nov2008_mouse_TD50.csv @@ -0,0 +1,436 @@ +STRUCTURE_SMILES,TD50_Mouse_mmol +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2,0.000000485 +ClC1=C(Cl)C(Cl)=CC2=C1OC3=C(C=C(Cl)C(Cl)=C3Cl)O2,0.00000366 +CC(C)(O)CC[C@@H](O)[C@@H](C)[C@H]2CC[C@@]1(O)C/3=C/C(=O)[C@@H]4C[C@@H](O)[C@@H](O)C[C@]4(C)[C@H]\3CC[C@@]12C,0.000077 +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1,0.000146 +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O,0.000317 +CC1=C2C=CC=CC2=C(C3=CC=C4C(=C13)C=CC=C4)C,0.000328 +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl,0.000437 +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O,0.000491 +BrC2=C(C=C(Br)C(Br)=C2)C1=C(Br)C=C(Br)C(Br)=C1,0.000529 +N(NC)C.[H]Cl.[H]Cl,0.000857 +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1,0.000955 +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O,0.00103 +S=P(N1CC1)(N1CC1)N1CC1,0.00118 +NC(=O)OC=C,0.00142 +ClCOCCl,0.00158 +ClCCN(CCCl)C1=CC=C(CC(OC3=CC=C(C4=C3)[C@]2([H])[C@](CC4)([H])[C@@](CC[C@@H]5OC(CC6=CC=C(N(CCCl)CCCl)C=C6)=O)([H])[C@]5(C)CC2)=O)C=C1,0.00184 +CC(C)CC(=O)O[C@H]1C[C@]2(COC(C)=O)[C@@]4(C)[C@H](OC(C)=O)[C@@H](O)[C@@H](O[C@@H]2/C=C1/C)[C@]34CO3,0.00189 +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl,0.002 +ClC(C1=CC=CC=C1)(Cl)Cl,0.00203 +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl,0.00216 +[S-]C(N(CC)CC)=S.[S-]C(N(CC)CC)=S.[S-]C(N(CC)CC)=S.[S-]C(N(CC)CC)=S.[Se+4],0.00222 +Cl[C@@]1(C(C)2C)C(Cl)(Cl)C(Cl)([C@](Cl)(C2=C)C1Cl)Cl,0.00234 +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,0.00239 +CN(N=O)C,0.00255 +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl,0.00266 +CC/C(=C/CC)[N+](=O)[O-],0.00268 +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O,0.00269 +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC,0.0028 +ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl,0.00324 +ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12,0.00334 +ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2,0.00348 +O=NN1CCCCCC1,0.00412 +Brc1c(c(Br)c(Br)c(Br)c1Br)c2c(Br)cc(Br)c(Br)c2Br,0.00418 +OCCNN,0.00522 +O=C(N)C1=C(N=CN1)/N=N/N(C)C,0.0053 +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O,0.00564 +C[Hg]Cl,0.00578 +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-],0.00584 +ClCC(Cl)CCl,0.00593 +ClC#CCl,0.00605 +O[C@]1(C(C)2C)[C@]2([H])[C@@](C=C(CO)C4)([H])[C@]([C@@](C=C3C)([H])[C@@]4(O)C3=O)(O)[C@H](C)[C@H]1O,0.00606 +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-],0.00607 +NC1=CC=C(C=C1)C2=CC=C(C=C2)F,0.00609 +O=C(N(CCO)N=O)N,0.00615 +O=NN1CCCC1,0.00678 +O=NN(CCCC)CCCC,0.00689 +CC/C(C2=CC=CC=C2)=C(C1=CC=CC=C1)/C(C=C3)=CC=C3OCCN(C)C.OC(C(CC(O)=O)(O)CC(O)=O)=O,0.00779 +O=C(C(C)(OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl)C)OC,0.00824 +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,0.00825 +C1CN1,0.00875 +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O,0.00941 +O=NN1CCCCC1,0.0114 +BrC(CCl)CBr,0.0115 +CN(C(=O)N)N=O,0.0119 +ClC/C=C/CCl,0.0122 +NC1=CC=C(C=C1)C2=CC=CC=C2,0.0124 +C1=CC(=CC=C1COCCl)COCCl,0.0132 +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5,0.0138 +N=C(N(N=O)C)N[N+](=O)[O-],0.0138 +C(C(COCCl)OCCl)OCCl,0.0145 +CCCCC/C=N/N(C=O)C,0.0149 +CC(C/C=N/N(C=O)C)C,0.0157 +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl,0.0158 +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O,0.0159 +O=C1CCO1,0.0172 +N=C(N(CC)N=O)N[N+]([O-])=O,0.0176 +CN(N)C=O,0.0185 +N(C)[N+].S(=O)(=O)([O-])O,0.0189 +ClCCN[P]1(=O)OCCCN1CCCl,0.0194 +S=P(SCN1C(=O)SC(=N1)OC)(OC)OC,0.02 +C1=C2C=CC3=CC=CC=C3C2=CC4=CC=C5C(=C14)C=CC=C5,0.0211 +[K+].C1(=CC=C2C(=N1)N(C=C(C2=O)C([O-])=O)C)/C=C/C3=CC=C(O3)[N+]([O-])=O,0.0212 +ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl,0.0214 +ClCCN(CCCl)[P]1(=O)NCCCO1,0.0228 +O=C1C(=CNC(=O)N1)F,0.0228 +Cl[C@@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl,0.0228 +NC3=CC1=C(C=C3)OC2=C1C=CC=C2,0.0231 +CCCC/C=N/N(C=O)C,0.0241 +O=NN1CCN(N=O)CC1,0.025 +CC=NN(C)C=O,0.0251 +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,0.026 +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O,0.0265 +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N,0.0272 +C(COCCl)OCCl,0.0291 +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,0.0317 +N(N)(CC)C=O,0.0318 +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O,0.0322 +O=C1C23C4C5C6(C(=O)C7=C(O)C(C)=CC(=C7C(C6=C(C2C5O)O)=O)O)C(C4O)C(=C3C(=O)C8=C1C(O)=C(C)C=C8O)O,0.0324 +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O,0.0325 +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,0.0334 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,0.034 +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr,0.0357 +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,0.0361 +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1,0.0373 +ClC1=CC(C2=CC(Cl)=C(N)C=C2)=CC=C1N.Cl.Cl,0.0377 +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,0.0391 +O=[O+1][O-1],0.0392 +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,0.0393 +BrCCBr,0.0397 +C1=COC=C1,0.04 +O=C1C(C2=C(C(O)=C3C)C(O)=C(NC(\C(C)=C/C=C/[C@@H]5C)=O)C(/C=N/N4CCN(C)CC4)=C2O)=C3O[C@@](C)1O/C=C/[C@H](OC)[C@@H](C)[C@@H](OC(C)=O)[C@H](C)[C@H](O)[C@H](C)[C@H]5O,0.0408 +O=C2C(CO)NC(=O)CC(NC(=O)C(CO)NC(=O)C(NC(=O)C1C(Cl)C(Cl)CN12)CC)c3ccccc3,0.0412 +CCCCCNN.[H]Cl,0.0423 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,0.0425 +O=[Mo](=O)=O,0.0426 +NC(=O)Cc2c([O-])on[n+]2Cc1ccccc1,0.0437 +NNC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1,0.0449 +NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1,0.045 +CC1=CC(=C(C=C1C)N)C,0.0453 +O=C1C=CC(=O)C=C1,0.0469 +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr,0.0484 +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O,0.049 +O=C(N(C)C)Cl,0.0499 +ClC1C(C(C(Cl)C(C1Cl)Cl)Cl)Cl,0.0509 +O=C1[C@H]3[C@H](C3)[C@@]([C@]4([H])[C@@]([C@@]5([H])[C@]([C@@](CC5)(OC(C)=O)[C@@](C)=O)(C)CC4)([H])C=C2Cl)(C)C2=C1,0.0525 +C1(N=C(SC=1)NN)C2=CC=C(C=C2)N,0.0548 +OS(=O)(=O)O.NN,0.0583 +O=NN(C)C1=NC=NC2=C1N=CN2[C@@H]3O[C@H](CO)[C@@H](O)[C@H]3O,0.059 +NC1=CC=C(OC2=CC=C(N)C=C2)C=C1N,0.0618 +C1(=CC=CC=C1)CCNN.S(O)(O)(=O)=O,0.0623 +CN(C)N,0.0659 +CC=CCl,0.066 +CCNN.[H]Cl,0.0679 +O=C(C1=CC=CC=C1)NN,0.0704 +S(CC)(=O)(=O)C1C2=C(C(=CC=1)S(N)(=O)=O)C=CC=C2,0.0705 +N#[N+]C1=CC=CC=C1.O=S([O-])(O)=O,0.0712 +NNC1=NC(=CS1)C2=CC=C(O2)[N+]([O-])=O,0.0725 +NC(N3C)=NC2=C3C(C)=CC1=NC=CC=C12,0.073 +C1(C2=CC=C(C=C2)N)=CC=C(C=C1)N.[H]Cl.[H]Cl,0.0766 +C1(C(=CC=C(C=1)C)N)C.[H]Cl,0.0787 +ClCCOCCCl,0.0818 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,0.0824 +NN(C=O)CCC,0.0861 +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C,0.0863 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0.0864 +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2,0.0869 +C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1,0.0883 +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl,0.0888 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0.0901 +NN,0.0914 +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+],0.0916 +C=C(Cl)C=C,0.0923 +Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,0.0956 +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,0.0959 +Cl.CCCCNN,0.0971 +CC(C)N(C(=O)SCC(\Cl)=C\Cl)C(C)C,0.0988 +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C,0.0989 +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl,0.1 +COC1=C(O)C=CC(=C1)C=NNC(=O)C2=CC=NC=C2,0.101 +O=NN(C)C1=NC=NC2=C1N=CN2,0.101 +Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,0.106 +NC1=CC=C(C2=CC=C(N)C=C2)C=C1,0.108 +O(C)c1cc(CC=C)ccc1OC,0.108 +C1=C(C=CC=C1OCC2CO2)OCC3CO3,0.109 +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N,0.114 +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+],0.117 +CC(=S)N,0.117 +[O-][N+](C3=CC=C(O3)C1=CN=C2N1C=CC=C2)=O,0.118 +C=CC#N,0.119 +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl,0.119 +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2,0.12 +ClC1=NC(SCC(NCCO)=O)=NC(NC2=CC=CC(C)=C2C)=C1,0.122 +OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O,0.123 +OC(=O)C(C)(C)CCCOc1ccc(OCCCC(C)(C)C(O)=O)c(c1)c2ccccc2,0.125 +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3,0.125 +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl,0.127 +N=C(N)NCCC[C@H](NC([C@@H](NC([C@@H](NC(C)=O)CC(C)C)=O)CC(C)C)=O)C=O,0.131 +CC(=O)NN,0.133 +CC(C=O)Cl,0.139 +N(C1=CC=CC=C1)NC2=CC=CC=C2,0.141 +C1(=CC(=CC(=C1N)C)C)C.[H]Cl,0.144 +C1(=C(C=CC(=C1)Cl)N)C.[H]Cl,0.145 +C(=C/C=O)\[O-].[Na+],0.15 +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O,0.15 +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N,0.153 +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-],0.155 +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl,0.156 +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,0.159 +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],0.161 +CNN,0.164 +C\C(C)=C/Cl,0.165 +N(N)(CCCC)C=O,0.166 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,0.168 +S=C(N(CCO)CCO)[S-].[K+],0.172 +C=CF,0.176 +N(NCC=C)CC=C.[H]Cl.[H]Cl,0.183 +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br,0.183 +S=C(N(CC)CC)SCC(=C)Cl,0.189 +NC(=O)OCC,0.19 +CC(CC1=CC2=C(C=C1)OCO2)S(=O)CCCCCCCC,0.192 +ClC1(=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N).[H]Cl.[H]Cl,0.196 +O=C(C1=CC=NC=C1)NN,0.198 +O=C(OC)C1=CCCN(C)C1.[H]Cl,0.206 +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl,0.206 +C1=COC2=C1C=CC=C2,0.212 +N(NCCCC)CCCC.Cl.Cl,0.213 +ClC(Cl)(Cl)Cl,0.218 +NC1=C(C=CC(=C1)N)C,0.219 +[Cl-].C/[N+](C)=C1\C=C/C(C=C1)=C(\c2ccc(cc2)N(C)C)c3ccc(cc3)N(C)C,0.222 +ClC(C(Cl)Cl)Cl,0.228 +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0.229 +S=C1NCCN1,0.23 +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],0.23 +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl,0.233 +O=C1C(C2=CC=CC=C2)(C3=CC=CC=C3)NC(=O)N1,0.234 +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N,0.238 +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)[N+](=O)[O-],0.241 +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl,0.243 +C=CC=C,0.257 +O=C(NCO)C=C,0.263 +N(N)(CC=C)CC=C,0.264 +NC1=CC=C(C=C1OC)/N=N/C2=CC=CC=C2,0.265 +C1=C(C(=CC(=C1N)C)C)C.[H]Cl,0.265 +NC1C=CC2=C(N=1)NC3=CC=CC=C23,0.272 +NC1=CC2=C(C=CC=C2)C=C1,0.275 +ClC(C(Cl)Cl)(Cl)Cl,0.283 +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl,0.285 +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC,0.289 +CS(=O)(=O)OC,0.289 +ClC(Cl)Br,0.291 +C1(N=CNN=1)N,0.301 +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,0.308 +N1=CC=CC=C1,0.308 +NN(CCCC)CCCC,0.313 +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C,0.313 +C=CCNN.HCl,0.315 +C=CCC1=CC=C2C(=C1)OCO2,0.316 +O=P(OC=C(Cl)Cl)(OC)OC,0.319 +Br(=O)(=O)[O-].[K+],0.322 +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,0.338 +C1(NNC(C)=O)=CC=CC=C1,0.341 +C1(=C(C(=C(C(=C1N)F)N)F)F)F.[H]Cl.[H]Cl,0.341 +C=CCl,0.349 +C=CCC1=CC=C(C=C1)OC,0.35 +C1(=C(C(=C(C=C1)C(C)=O)O)CCC)OCCCCC2NN=NN=2,0.352 +C=CC(C1=CC=C(C=C1)OC)O,0.352 +C=C(Cl)Cl,0.357 +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O,0.363 +C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl,0.371 +NC1=CC=C(/C=C/C2=CC(OC)=CC=C2OC)C=C1,0.376 +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-],0.39 +NC1=CC(=CC=C1OC)C,0.396 +OC(C=C)C1=CC=C2OCOC2=C1,0.4 +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-],0.405 +NNCCC.[H]Cl,0.411 +ClC(CCl)Cl,0.412 +NC(=S)C1=CC(=NC=C1)CC,0.417 +O=C(CN=C2C3=CC=CC=C3)NC1=C2N(N=C1C)CC,0.425 +CC(C1=C(C(=C(C(=C1[N+](=O)[O-])C)[N+](=O)[O-])C)[N+](=O)[O-])(C)C,0.427 +O=C1NC(=S)NC=C1,0.429 +C1(=CC=CC=C1)CNN.[H]Cl.[H]Cl,0.437 +NC(CCSCC)C(=O)O,0.437 +O=C(CC(C)C)OCC=C,0.442 +Cl\C=C\CCl,0.447 +O=CCCl,0.46 +OCC1CO1,0.468 +NC1=CC=CC2=C1C=CC=C2,0.47 +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl,0.472 +ClCC1=CC=CC=C1,0.486 +NNC1=CC=CC=C1.[H]Cl,0.493 +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1,0.504 +Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,0.505 +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2,0.51 +OCC(CO)(CBr)CBr,0.523 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,0.528 +C1C(OC(O1)C(C)I)CO,0.535 +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2,0.538 +C1(=CC=C(Cl)C=C1)N.[H]Cl,0.546 +OC1=C(C=C(C=C1)CNC(=O)CCCC/C=C/C(C)C)OC,0.547 +CC(NC(=O)C1=CC(=CC(=C1)Cl)Cl)(C#C)C,0.547 +C1(=CC=C(N)C=C1)C.[H]Cl,0.581 +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],0.584 +ClC(C(O)O)(Cl)Cl,0.604 +O=CNN,0.606 +OCCBr,0.609 +ClC1=CC(Cl)=C(/C(OP(=O)(OC)OC)=C/Cl)C=C1Cl,0.623 +[Se]=S,0.624 +ClC(Br)Br,0.667 +OCCN(CCO)CCO,0.67 +O=C1OC2=C(C=CC=C2)C=C1,0.705 +F/C(F)=C(\F)F,0.719 +C1(C(=CC=C(C=1)N)O)N.[H]Cl.[H]Cl,0.726 +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N,0.733 +CCCC1=CC2=C(C=C1)OCO2,0.761 +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+],0.788 +NC2=CC=C(C=C2N)C1=CC=C(N)C(N)=C1.Cl.Cl.Cl.Cl,0.8 +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1,0.814 +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O,0.837 +CC(=C)CCl,0.858 +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,0.86 +CC(C)(C)NC(=O)[C@H]4CC[C@@H]3[C@]4(C)CC[C@H]1[C@H]3CC[C@H]2NC(=O)\C=C/[C@]12C,0.875 +OC(=O)C(Cl)Cl,0.923 +ClC(Cl)Cl,0.93 +[N+](=O)([O-])c1ccccc1C,0.933 +ClC(=C(Cl)Cl)Cl,0.953 +C=CC1CCC=CC1,0.98 +C12C3=C(C=CC=C3)NC1=CC=CC=2,0.981 +C1C(C2=CC=CC=C2)O1,0.982 +O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-],0.984 +N(NC(CC[C@H](N)C(=O)O)=O)C1C=CC(=CC=1)C(=O)O,0.985 +C1=CC=CC=C1,0.992 +ClC1=C(C=CC=C1)[N+](=O)[O-],0.996 +NC1=C2C(=CC=C1)C(=CC=C2)N,1.02 +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl,1.04 +Cl\C=C\CCl,1.06 +ClC(CCl)(Cl)Cl,1.08 +NC(=O)NNC1=CC=CC=C1,1.09 +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2,1.11 +CC(CCl)OC(C)CCl,1.12 +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC,1.14 +COC1=C(C=CC=C1)[N+](=O)[O-],1.16 +NC2=C(O)C=C(C=C2)C(C=C1O)=CC=C1N.Cl.Cl,1.22 +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N,1.25 +C[C@@H](CC)C(=O)O[C@H]2C[C@@H](C)\C=C3\C=C/[C@H](C)[C@H](CC[C@@H]1C[C@@H](O)CC(=O)O1)[C@@H]23,1.27 +C1=C2C(=CC=C1)C=CC=C2,1.27 +NC1=C(C=C(C=C1Cl)Cl)Cl,1.32 +N(NC(C)=O)C1=CC=C(C=C1)CO,1.34 +NC(=O)NC1=CC=C(C=C1)C,1.37 +NC1=CC(=CC=C1C)Cl,1.38 +ClCCCl,1.39 +C1(=CC=CN=C1)CCl.[H]Cl,1.4 +ClC(C(Cl)(Cl)Cl)(Cl)Cl,1.43 +O=C=NC1=CC(N=C=O)=CC=C1C,1.44 +C1CO1,1.45 +C=O,1.46 +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+],1.49 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)Cl,1.58 +C=CCOCC1CO1,1.59 +O=C(C1=CC=CN=C1)NN,1.66 +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2,1.72 +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC,1.79 +O=[N+](C1=CC(=C(C=C1)C)N)[O-],1.82 +,1.83 +N(NC(C)=O)C(C1=CC=NC=C1)=O,1.84 +FC(F)(F)CNC(=N)Nc1ccn(CCCCC(N)=O)n1,1.84 +N1(C2=CC=CC=C2)C(C(N(CS(=O)(=O)[O-])C)=C(N1C)C)=O.[Na+],1.89 +O=S(=O)(C1=CC=C(C=C1)C(=O)O)N(CCC)CCC,1.89 +C(NN)(N)=O.Cl,2 +C=CC1=CC=CC=C1,2.02 +OC1=CC=C(C=C1)O,2.04 +O=CC1=CC=CO1,2.05 +ClC1=CC=C(C=C1)Cl,2.2 +NS(C1=C(Cl)C=C(NCC2=CC=CO2)C(C(O)=O)=C1)(=O)=O,2.21 +OC1=C(C=CC=C1)O,2.22 +O=[N+](C1=CC2=C(C=C1)NC=N2)[O-],2.28 +C1COCCO1,2.32 +O=P(OC)(OC)OC,2.39 +O=[N+](C1=CC=CC=C1)[O-],2.4 +O=C1C=C(NC(=S)N1)CCC,2.4 +CC(Cl)CCl,2.44 +ClC(=CCl)Cl,2.61 +C1=C(CO)OC=C1,2.68 +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C,2.96 +N1(C(=CN=C1C)[N+](=O)[O-])CCO,2.96 +C1(=CC=C(NN)C=C1)C(O)=O.[H]Cl,2.97 +O=[N+](C1=CC=C(C=C1)Cl)[O-],3 +CC(CON=O)C,3.01 +NC(=O)C1=C(C=CC=C1)OCC,3.11 +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3,3.14 +O=C(OCC)C=C,3.24 +O=C1N2CC3=CC=CC=C3C(=O)N2CC4C=CC=CC1=4,3.27 +C1(NS(=O)(=O)[O-])CCCCC1.[Na+],3.31 +O=P(OCCCl)(OCCCl)OCCCl,3.39 +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O,3.51 +ClC(C(=O)O)(Cl)Cl,3.57 +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O,3.68 +[N+].C1(N(N=O)[O-])=CC=CC=C1,3.77 +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C,3.79 +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O,3.83 +C1(C(=CC=C(C=1)C)C)N.[H]Cl,3.97 +NC1=C(C=C(C=C1)N)[N+](=O)[O-],4.01 +CC(=C)C=C,4.02 +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl,4.06 +CCCCOP(=O)(OCCCC)OCCCC,4.21 +NC1=C(C=C(C=C1Cl)N)Cl,4.54 +O=C1C(O)=COC(CO)=C1,4.63 +O=C1OC2=C(C=CC=C2)CC1,4.88 +CCBr,4.91 +O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl,5.23 +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N,5.33 +OC1=C(C=C(C=C1Cl)Cl)Cl,5.42 +O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C,5.43 +C1(C2=C(C=CC=C2)N)(=CC=CC=C1).[H]Cl,5.45 +NC1=CC=CC(C)=C1.[H]Cl,5.85 +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-],5.88 +O=P(OCC(CCCC)CC)(OCC(CCCC)CC)OCC(CCCC)CC,5.89 +C1(=C(C=CC=C1)N)OC.[H]Cl,6.05 +CCC(C)=NO,6.13 +OC1=C(C=C(C=C1)Cl)CC2=CC=CC=C2,6.17 +O=C(CCC(=O)O)NN(C)C,6.43 +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl,7.02 +O=CNNC=O,7.59 +[O-][N+](C)=O,7.68 +NC1=C(C=CC(=C1)N)Cl,8.63 +OC2=C(C)C1=C(C(C)=C2)OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CC1,8.66 +NC1=C(C=CC(=C1)Cl)N,9.4 +CC1=NC=CN1,9.52 +CC(=O)OCC1=CC=CC=C1,9.59 +C1=C(C=CC=C1N)C.[H]Cl,10 +C1=CC(=CC(=C1OCC)[N+]([O-])=O)NC(=O)C,10.1 +NC1=C(C=CC=C1)C(=O)OC/C=C/C2=CC=CC=C2,10.2 +CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC,10.5 +C1(=CC=C(C=C1)O)NC(C)=O,10.7 +NC1=C(C=CC(=C1)NC(=O)C)OCC,10.7 +CC(=C)CCl,11 +CCCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)C,11.6 +CC(=O)NC1=CC=C(C=C1)OCC,11.9 +ClC(=CCl)Cl,12 +CCC(CCCC)CO,12.9 +ClCCl,13 +OC(=O)CN(CC(=O)O)CC(=O)O,13.9 +O=CC1=CC=CC=C1,14 +OC(COC(C)(C)C)C,14.1 +CCCCOCCO,14.5 +CCC1=CC=CC=C1,15.1 +CC1CO1,15.7 +NC(=O)CCCCC,16.9 +C1CCCO1,18 +O=C1N(CCC1)C,20.7 +O=[N+](C1=CC(=C(C=C1)OC)N)[O-],22.1 +O=C1NC(=O)NC=C1,24.5 +ClC1=C(C=C(C=C1C(=O)O)Cl)N,25.4 +OC1=C(C=CC(=C1)/C=C/C(=O)O)O,27.2 +CCCl,28.1 +OC1=CC=C(C=C1C(C)(C)C)OC,30.7 +C1=CC=CC=C1C(COC(N)=O)COC(N)=O,31.1 +OC1=CC2=C(C=C1)OCO2,32.5 +O=C(C3=CC=C6C2=C34)C1=CC=CC=C1C4=CC=C2C(C5=CC=CC=C56)=O,32.8 +CC(=O)OC=C,45.5 +CC(=O)N,51 +CC(OC)(C)C,74.3 +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2,116 +OO,222 +CC(C)(C)O,295 +CCCCCC,352 diff --git a/test/data/CPDBAS_v5d_cleaned/CPDBAS_v5d_20Nov2008_rat_TD50.csv b/test/data/CPDBAS_v5d_cleaned/CPDBAS_v5d_20Nov2008_rat_TD50.csv new file mode 100644 index 0000000..7c8e38b --- /dev/null +++ b/test/data/CPDBAS_v5d_cleaned/CPDBAS_v5d_20Nov2008_rat_TD50.csv @@ -0,0 +1,568 @@ +STRUCTURE_SMILES,TD50_Rat_mmol +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2,0.000000073 +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C,0.000000884 +ClC1=C(Cl)C(Cl)=CC2=C1OC3=C(C=C(Cl)C(Cl)=C3Cl)O2,0.00000152 +[N+](=N/CCC)(/CCC)[O-],0.00000185 +O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H],0.00000305 +O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC,0.00000786 +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC,0.0000102 +[N+](=N\C(C)C)(/C(C)C)[O-],0.0000206 +C(C1)N1C(=CC(=O)C=2N(C3)C3)C(=O)C=2N(C4)C4,0.0000218 +ClCOCCl,0.0000311 +C1=CC=CC(=C1)CCN(C)N=O,0.0000608 +ClCCN(C)CCCl,0.0000731 +[Cl-].[Cd+2].[Cl-],0.0000742 +O=S(=O)([O-])[O-].[Cd+2],0.000104 +O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O,0.00012 +F[C@@]([C@](C=C4)(C)C3=CC4=O)2[C@@H](O)C[C@]([C@](C5)([H])[C@@]([H])2CC3)(C)[C@@]1([C@](CO)=O)[C@@H]5OC(C)(C)O1,0.000122 +CN(CC(C)=O)N=O,0.000148 +CN(C)P(=O)(N(C)C)N(C)C,0.000192 +N(CC(CO)O)(CC(C)=O)N=O,0.0002 +[O-]\[N+](CC)=N/CC,0.000215 +[O-]\[N+](CC)=N/C,0.000215 +CCN(CC)N=O,0.000259 +O=NN1CCCCCCC1,0.000266 +N(CC(CO)O)(CC(O)C)N=O,0.0003 +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O,0.000307 +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O,0.000337 +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O,0.000341 +O=NN(CCN1N=O)CCC1,0.000389 +CC(O)CN(C)N=O,0.000392 +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC,0.000469 +O=C(C1=CC=CN=C1)CCCN(N=O)C,0.000482 +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O,0.000487 +C(CCCN(N=O)C)(O)C1C=NC=CC=1,0.000492 +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,0.000503 +BrC2=C(C=C(Br)C(Br)=C2)C1=C(Br)C=C(Br)C(Br)=C1,0.000513 +O=NN(CC=C1)CC1,0.000536 +N1C=CC=C(C=1)C2N(N=O)CCC2,0.00054 +CN(CC)N=O,0.000571 +N(C(=O)NCC(C)O)(N=O)C(C)Cl,0.000592 +O=C(N(CC)N=O)OCC,0.000619 +C[N+](=NC)[O-],0.000629 +[H][C@]14[C@@]([C@]3([H])CC[C@@](O)(C#C)[C@](C)3CC4)([H])CCC2=CC(O)=CC=C12,0.000675 +OCC(=O)[C@@]54OC(O[C@@H]5C[C@@H]1[C@]4(C)C[C@H](O)[C@@H]2[C@@]3(C)/C=C\C(=O)\C=C3\CC[C@@H]12)CCC,0.000676 +O=NN1CCC(=O)NC1=O,0.000687 +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O,0.000696 +O=C(N(C)N=O)C1=C(N(N=O)C)N=CN1C,0.000809 +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1,0.000811 +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1,0.000831 +S=P(N1CC1)(N1CC1)N1CC1,0.000867 +CN(C(=O)N)N=O,0.000899 +O=C(N(CCF)N=O)N,0.000925 +O=NN1CCOCC1,0.000939 +[H][C@]12N(CC=C2COC([C@@](O)(C(O)(C)C)[C@H](C)OC)=O)CC[C@@H]1OC(\C(C)=C/C)=O,0.000945 +O=C1C2=C(C3=C(C=C2OC)OC4C3C=CO4)OC5=C1C(=CC(=C5OC)OC)O,0.000947 +C1C(N(C(CN1N=O)C)C)C,0.00096 +CN(C1=CC=CC=C1)N=O,0.00104 +O=C(N(CC)N=O)NCC(=O)C,0.00105 +BrC(CCl)CBr,0.0011 +C1CCN(CN1N=O)N=O,0.00115 +[O-]C12[C@@H](CC[N+](C)1CC=C2COC([C@](OC(C)=O)(C)[C@@H](C)\C=C3C=C)=O)OC/3=O,0.00123 +CN(N=O)C,0.00129 +[O-][N+](=O)c1ccc2c3ccccc3Cc2c1,0.00135 +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl,0.00136 +O=NN(CCC)CCC,0.00143 +CC(C)OC1=CC=CC=C1OC(=O)N(C)N=O,0.00153 +C1=CC=CC(=N1)N(N=O)C,0.00156 +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O,0.00157 +CC1=C(C=CC=C1[N+](=O)[O-])[N+](=O)[O-],0.0016 +[O-][N+](C2=CC=C(O2)C1=CSC(NN(C)C)=N1)=O,0.00161 +C1=CC(=CC=C1N(N=O)C)F,0.00165 +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+],0.00178 +O=C(N(CCO)N=O)NCCCl,0.00182 +O=C(N(CCO)N=O)N,0.00183 +CC1=C2C3=C(C=C4C(=C3CC2)C=CC5=CC=CC=C45)C=C1,0.00183 +O=S(C1=C(/N=N/C2=CC=C(C3=CC=C(\N=N/C4=C(S(=O)([O-])=O)C=C5C(C(N)=CC(S(=O)([O-])=O)=C5)=C4O)C=C3)C=C2)C(O)=C(C(N)=CC(S(=O)([O-])=O)=C6)C6=C1)([O-])=O.[Na+].[Na+].[Na+].[Na+],0.00185 +O=C(O[C@@H]1CC[N+]2([O-])[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C,0.00195 +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O,0.00208 +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O,0.00212 +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl,0.00221 +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-],0.00228 +O=NN(C)CCCCCCCCCCCC,0.00235 +N(CC(C)=O)(CC=C)N=O,0.00236 +ClC/C=C/CCl,0.00238 +CN(N=O)C1=CC=C(C=C1)C=CC2=C3C=CC=CC3=NC=C2,0.00242 +CN1CC[C@H]2OC(=O)C3(C[C@@H](C)[C@@](C)(O)C(=O)OC\C(=C\C1)C2=O)O[C@@H]3C,0.00242 +O=C(O[C@@H]1CCN2[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C,0.00245 +CC1SC(SC(N1N=O)C)C,0.00251 +N(CCCCO)(CCCC)N=O,0.00262 +NC(=O)N(CC=C)N=O,0.00264 +O=C1OC(O)C(C(Cl)Cl)=C1Cl,0.00268 +OC1=C(C([O-])=O)C=C(N=NC2=CC=C(C3=CC=C(N=NC4=C([O-])C(/N=N/C(C=C(S([O-])(=O)=O)C=C5)=C5[O-])=CC=C4O)C=C3)C=C2)C=C1.[Na+].[Na+].[Cu+2],0.00272 +N(CCCC(F)(F)F)(CCCC(F)(F)F)N=O,0.00281 +NC1=CC=C(/C=C/C2=CC(OC)=CC=C2OC)C=C1,0.00282 +ClCCN[P]1(=O)OCCCN1CCCl,0.00283 +ClC13C5(Cl)C2(Cl)C4C(Cl)(C(Cl)(Cl)C12Cl)C3(Cl)C4(Cl)C5(Cl)Cl,0.00286 +O=C1O[C@@H]3CCN2C\C=C(\COC(=O)[C@](C)(O)[C@](C)(O)[C@H]1C)[C@@H]23,0.00289 +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl,0.00295 +O=C(N(CCCCCC)N=O)N,0.00296 +O=NN(CCN(C)C)C(=O)[NH2+]CC.[O-]N=O,0.00299 +O=NN(CC(=O)C)CC(=O)C,0.0031 +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1,0.00312 +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl,0.0032 +CC1=C(C2=C(C=CC(=C2)OC)N1C(=O)C3=CC=C(C=C3)Cl)CC(=O)O,0.00321 +O=C(N(CC)N=O)NCCO,0.00324 +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl,0.00324 +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl,0.00328 +C1N(C(OC1)=O)N=O,0.00332 +O=C(N(CCCCC)N=O)N,0.00349 +O=C(N(CCO)N=O)NCC,0.00349 +O=C(N(CCCC)N=O)N,0.00356 +CN(N=O)C(=O)NCCC[C@H](N)C(O)=O,0.00361 +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O,0.00363 +N(CC=C)(CCO)N=O,0.00377 +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5,0.00379 +O=C(N)C1=C(N=CN1)/N=N/N(C)C,0.0039 +O=C(NC2=C(Cl)C=NC=C2Cl)C1=CC(OC3CCCC3)=C(OC)C=C1,0.00404 +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C,0.0041 +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,0.00413 +O=C(N(CC(C)O)N=O)NCCCl,0.00416 +[C@]13([C@@](C(=O)CO)(CC[C@H]1[C@@H]2CCC=4[C@@]([C@H]2[C@H](C3)O)(\C=C/C(C=4)=O)C)O)C,0.00424 +O=NN(CCCC)CCCC,0.00437 +CC(NC1=CC=C(C2=CC=C(F)C=C2)C=C1)=O,0.00441 +[N+](CCCl)(CCCl)(C)[O-],0.00444 +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,0.00453 +O=C(OC[C@@H](C(=O)O)N)C=[N+]=[N-],0.00458 +O=C1[C@H](OC(\C(C[C@@]([H])(C)[C@](C)2O)=C/C)=O)CCN(C)C/C=C1/COC2=O,0.00465 +CC1=CC(C4=CC(C)=C(/N=N/C5=CC=C(OS(=O)(C6=CC=C(C)C=C6)=O)C=C5)C=C4)=CC=C1/N=N/C2=C(O)C=CC3=CC(S(=O)([O-])=O)=CC(S(=O)([O-])=O)=C23.[Na+].[Na+],0.00468 +NC1(=CC=C(C=C1)C2=CC=CC=C2).[H]Cl,0.00476 +O=C(N(C)N=O)NC1=NC2=C(S1)C=CC=C2,0.00478 +N(CC(CO)O)(C)N=O,0.00482 +C1(N=C(SC=1)NN)C2=CC=C(C=C2)N,0.00499 +CC(C)C(O)(C(C)O)C(=O)OC\C1=C\CN2CC[C@@H](OC(=O)C(\C)=C\C)[C@@H]12,0.00501 +CN(N=O)C1=C(C(NC)=O)N(C)C=N1,0.00507 +N(CC(CO)O)(CC=C)N=O,0.00515 +O=NN(CC(C)O)CC(C)O,0.00522 +O=C(N(CCCCC)N=O)OCC,0.00537 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,0.00546 +N=C(N(N=O)C)N[N+](=O)[O-],0.00546 +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br,0.00549 +C1=CC=C2C(=C1)NC(NC2=O)C3=CC=C(S3)[N+]([O-])=O,0.00556 +CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2,0.00559 +N#CN(C)N=O,0.00564 +C1=COC=C1,0.00582 +O=C(C(F)(F)F)NC1=CC3=C(C2=CC=CC=C2C3)C=C1,0.00584 +OCCNC2=C1C=CC=CC1=NC(C3=CC=C([N+]([O-])=O)S3)=N2,0.00591 +[O-][N+](C=C2)=CC=C2/N=N/C1=CC=C(N(CC)CC)C=C1,0.00603 +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl,0.00603 +[O-][N+](=O)N(C)C,0.00607 +N(CC(C)O)(CC=C)N=O,0.00608 +N(CCCCCCCCCC)(C)N=O,0.00629 +C1(=CC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)C)C,0.00634 +N(CCCCCCCCCCCCCC)(C)N=O,0.00643 +O=C(N(CCCO)N=O)N,0.00665 +O=C(CCCN(C)N=O)O,0.00672 +ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl,0.00681 +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl,0.00683 +N(CC(C)O)(CCO)N=O,0.00688 +CC/C(C2=CC=CC=C2)=C(C1=CC=CC=C1)/C(C=C3)=CC=C3OCCN(C)C.OC(C(CC(O)=O)(O)CC(O)=O)=O,0.00703 +N1/C(=N\C2=C(C1=S)N=CN2[C@]3(C([C@@]([C@](O3)(CO)[H])(O)[H])([H])[H])[H])N,0.00741 +N=C(N(CCC)N=O)N[N+](=O)[O-],0.00748 +NC1=NC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)N,0.0077 +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N,0.00778 +O=C(NC2=C1C=C(C3=NNC(CC3)=O)C=C2)C1(C)C,0.00781 +C1=CC(=CC=C1N(C)N=O)N=O,0.00787 +O=NN1CCCC1,0.00798 +BrCCBr,0.00809 +NC(=O)N(CC)N=O,0.0081 +ClCCN(CCCl)[P]1(=O)NCCCO1,0.00846 +C1=CC=C2C(=C1)N=C(N=C2N(CCO)CCO)C3=CC=C(S3)[N+]([O-])=O,0.00871 +O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+],0.00902 +ClCC(Cl)CCl,0.00916 +NC1=CC=C(C2=CC=C(N)C=C2)C=C1,0.00939 +N/1C(N(\C=C\1)C)=S,0.00999 +CN(CCCCCCCCCCC)N=O,0.0111 +[Hg+2].[Cl-].[Cl-],0.0115 +O=C(C)CN(N=O)CCO,0.0123 +CN(CCO)N=O,0.0124 +O=NN1CCCCC1,0.0125 +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,0.0135 +NC1=CC=C2C3=C(C=CC=C3)OC2=C1,0.0135 +O=[N+](C1=CC=C2C3=C4C(=CC=C13)C=CC=C4C=C2)[O-],0.0135 +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0.0136 +NNC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1,0.0136 +CN(C1=CC=C(C=C1)/N=N/C2=CC(=CC=C2)C)C,0.0137 +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C.[H]Cl,0.014 +NNC1=NC(=CS1)C2=CC=C(O2)[N+]([O-])=O,0.0141 +N(N(CCCO)C)=O,0.0141 +O=S(N1C[C@@H](C)C[C@H](C1)C)(C2=CC(C(O)=O)=C(Cl)C=C2)=O,0.0146 +CN(C1=CC=C(C=C1)/N=N/C2=CC=CC=C2)C,0.0147 +C1=CC=C2C(=C1)N=C(N=C2N3CCOCC3)C4=CC=C(S4)[N+]([O-])=O,0.0147 +CN(C)/N=N/C1=CC=CC=C1,0.0155 +O=C(C(C)(OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl)C)OC,0.0157 +N(CC(F)(F)F)(CC)N=O,0.0161 +C1=C(C=CC=C1OCC2CO2)OCC3CO3,0.017 +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N,0.0172 +O=[N+]([O-])C3=CC=C(O3)/C=N/N1C(O[C@@H](CN2CCOCC2)C1)=O.Cl,0.0175 +ClC1=NC(SCC(NCCO)=O)=NC(NC2=CC=CC(C)=C2C)=C1,0.0177 +O=[Cr](=O)(O[Cr](=O)(=O)[O-])[O-].[Na+].[Na+],0.0177 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,0.0178 +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C,0.0179 +CNNCC1=CC=C(C=C1)C(=O)NC(C)C,0.0181 +NC(=O)Cc2c([O-])on[n+]2Cc1ccccc1,0.0182 +O=NN(C)CCOS(C1=CC=C(C)C=C1)(=O)=O,0.0186 +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N,0.0187 +O=P(OC=C(Cl)Cl)(OC)OC,0.0188 +NN,0.0191 +C(C1C=CC=CC=1)(=O)N(N=O)C,0.0197 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,0.0199 +NC1=C(C=CC(=C1)N)C,0.0202 +CCC(CC)[N+]([O-])=O,0.0202 +O=C1CCO1,0.0203 +O=P(N1C(C1)C)(N1C(C1)C)N1C(C1)C,0.0207 +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C,0.021 +O=C(N(CCCC)N=O)NCCCC,0.0213 +O=NN(CCCCC)CCCCC,0.0216 +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O,0.0221 +C1(NC(CN1/N=C/C2=CC=C(O2)[N+](=O)[O-])C)=O,0.0224 +C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-],0.0227 +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl,0.0227 +[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O,0.0235 +O=NN(CCO)CCO,0.0236 +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N,0.0237 +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O,0.0259 +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C,0.026 +O=C(C)NC3=CC=C(C2=C3)C1=C(C2=O)C=CC=C1,0.026 +Clc1nc(NCC)nc(NC(C)(C)C#N)n1,0.0263 +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr,0.0272 +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1,0.0277 +C12C(=CC(=C(C=1O)/N=N/C3=C(C=C(C=C3)C4=CC(=C(C=C4)/N=N/C5=C(C=C6C(=C5O)C(=CC(=C6)S(=O)(=O)[O-])N)S(=O)(=O)[O-])OC)OC)S(=O)(=O)[O-])C=C(C=C2N)S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],0.0277 +CC(CC)[N+]([O-])=O,0.0277 +O=NN(C(=O)N)CCC,0.0287 +N(C(=O)N)(N=O)CC(=O)O,0.0293 +[C@]24([C@@](C(COC(=O)CCCc1ccc(cc1)N(CCCl)CCCl)=O)(CC[C@H]2[C@@H]3CCC=5[C@@]([C@H]3[C@H](C4)O)(\C=C/C(C=5)=O)C)O)C,0.0297 +CC1=C2C(=CO[C@H]([C@@H]2C)C)C(=C(C1=O)C(=O)O)O,0.0299 +C1(=CC(=CC(=C1N)C)C)C.[H]Cl,0.0301 +N(C1=CC=CC=C1)NC2=CC=CC=C2,0.0303 +N[C@@H](CCSCC)C(=O)O,0.0304 +C(N)(=O)OC(C#C)(C1C=CC=CC=1)C2C=CC(=CC=2)Cl,0.0307 +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,0.0307 +O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.[Mg+2],0.0314 +O=S1(=O)CCCO1,0.0314 +ClCC1CO1,0.032 +CC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)C)N,0.0326 +O=C(N(CC(C)C)N=O)N,0.0326 +N1=C(N=C(N(CO)CO)N=C1N(CO)CO)N(CO)CO,0.0333 +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O,0.0334 +[N+](=O)([O-])c1ccccc1C,0.034 +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],0.0341 +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O,0.0348 +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-],0.0352 +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,0.0354 +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl,0.0362 +N(CC(CO)O)(CCO)N=O,0.0364 +N#CN(CC)N=O,0.0371 +ClC#CCl,0.0377 +Cl[C@@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl,0.0385 +[O-][N+](C2=CC=C(O2)C1=CSC=N1)=O,0.0391 +N1(CC(N(C(C1)C)C(C2C=CC=CC=2)=O)C)N=O,0.0391 +C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1,0.0399 +O=NN1CCSCC1,0.0408 +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],0.0435 +OC2=NN=C(O2)C1=CC=C([N+]([O-])=O)O1,0.0437 +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],0.044 +O=[C@@]([C@@H]1C=C([C@]4([H])N(C)C1)C3=C2C(C4)=C(NC2=CC=C3)Br)N[C@@]5([C@H](C)C)C(N([C@@H](CC(C)C)C(N7CCC[C@@]67[H])=O)[C@@]6(O)O5)=O.O=S(O)(C)=O,0.0449 +C=O,0.045 +C1(=NC(=NC(=N1)NC(C)=O)C2=CC=C(O2)[N+](=O)[O-])NC(C)=O,0.046 +C1(=CC=C(Cl)C=C1)N.[H]Cl,0.0465 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,0.0475 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0.0492 +O=NN(CCCCCC1)CCCCCC1,0.0513 +NC(=O)C=C,0.0528 +[N+].C1(N(N=O)[O-])=CC=CC=C1,0.0538 +O=[N+](C1=CC=CC2=CC=CN=C12)[O-],0.0564 +OCC1CO1,0.0578 +Br(=O)(=O)[O-].[K+],0.0588 +[O-][N+](C3=CC=C(O3)C1=CN=C2N1C=CC=C2)=O,0.0593 +NC(CCSCC)C(=O)O,0.0598 +O=C/C=C/C,0.0599 +N(N1CCCCC1C2=CC=CN=C2)=O,0.0622 +O=[N+]([O-])C1=CC=C(O1)/C=N/N2C(N(CCO)CC2)=O,0.0623 +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1,0.0645 +C1(CCN(C1)N=O)O,0.0659 +CC/C(=C/CC)[N+](=O)[O-],0.067 +ClCOC,0.0683 +O=C(OC1=C2C(=CC=C1)C=CC=C2)NC,0.0701 +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,0.0703 +CC(N(C1=CC=CC2=C1CC3=C2C=CC=C3)C(C)=O)=O,0.0716 +[Se]=S,0.0721 +ClC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N,0.0722 +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl,0.0738 +O=NN(CCN1)CC1,0.0763 +CC(=O)N(CC)CC,0.0768 +S=C1NCCN1,0.0796 +CN(C)CNc2nnc(/C=C/c1ccc(o1)[N+]([O-])=O)o2,0.0802 +O=C1C=C(NC(=S)N1)CCC,0.0805 +C[As](=O)(C)O,0.0826 +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl,0.0885 +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr,0.0896 +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N,0.0902 +C1(C)=CSC(=N1)NNC=O,0.0916 +O=C1NC(=S)NC=C1,0.0929 +C=CCl,0.0978 +C1=C(CO)OC=C1,0.0979 +COC1=C(C=CC=C1)[N+](=O)[O-],0.102 +OC(C=C)C1=CC=C2OCOC2=C1,0.103 +C1CCC[C@@H](N1N=O)C,0.103 +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O,0.105 +O=P(OC(CCl)CCl)(OC(CCl)CCl)OC(CCl)CCl,0.108 +O=C1N(C=C)CCC1,0.108 +ClC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)Cl)N,0.111 +O(C)c1cc(CC=C)ccc1OC,0.111 +O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C,0.114 +S=C(N(CC)CC)SCC(=C)Cl,0.117 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,0.118 +C1(N=CNN=1)N,0.118 +OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2,0.118 +C1(N(C(C)=NC=1)C)[N+](=O)[O-],0.12 +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N,0.121 +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,0.122 +[O-]\[N+](C)=N/CC,0.131 +C1(/N=N/C2=CC=CC=C2)=CC=CC=C1,0.132 +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2],0.133 +NC1=C(C=C2C3=C(C=CC=C3)OC2=C1)OC,0.136 +C=C(Cl)C=C,0.141 +C([O-])(C)=O.[Pb+2].[O-]C(C)=O,0.143 +ClCCCl,0.148 +CC(=O)O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,0.15 +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2,0.15 +CC(=S)N,0.153 +C1CCC[C@H](N1N=O)C,0.159 +CC1CC(=O)O1,0.16 +ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2],0.164 +CC(=NO)C,0.166 +OC(C1=CC=C(C(=C1)CO)O)CNC(C)(C)C,0.167 +CC(=O)NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(NC(C)=O)C=C2,0.167 +ClC1=NC(=NC(=N1)NC(C)C)NCC,0.17 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)Cl,0.171 +C1=C2C(=CC=C1)C=CC=C2,0.172 +C=CBr,0.173 +Cl.CC(=O)O[C@@H](CC)C(C[C@H](C)N(C)C)(c1ccccc1)c2ccccc2,0.174 +C[As](C)(C)=O,0.177 +ClC(Cl)(Cl)Cl,0.181 +S=C(NCC)NCC,0.182 +C1(=C(C=CC=C1)N)OC.[H]Cl,0.186 +C1(/C=C(\C=C/C1=O)CCN)=[N+]=[N-].[H]Cl,0.188 +O=C=NC1=CC(N=C=O)=CC=C1C,0.194 +O=C3C[C@@H]4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](C)(O)CC[C@@H]12)[C@@]4(C)C\C3=C\O,0.201 +O=[N+](C1=CC=CC=C1)[O-],0.207 +C1CCCN(O1)N=O,0.209 +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2,0.21 +S=C(N(C)C)NC,0.218 +C1(C(N\C(=N/C1=O)[O-])=O)(CC)CC.[Na+],0.222 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0.222 +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],0.224 +C=CC1=CC=CC=C1,0.224 +CN[N+](=O)[O-],0.229 +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2,0.23 +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl,0.232 +ClC(C(Cl)(Cl)Cl)(Cl)Cl,0.234 +O=C(C)NCC1=NC(=NO1)C2=CC=C(O2)[N+]([O-])=O,0.236 +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,0.239 +COC1C=C(C=CC=1C2NC3=CN=CC=C3N=2)S(C)=O,0.245 +CC1=CC(=C(C=C1C)N)C,0.249 +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N,0.25 +Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl,0.252 +N1C=NN(C=1)CC(CN2N=CN=C2)(C3=C(C=C(C=C3)F)F)O,0.263 +O=C1OC2=C(C=CC=C2)C=C1,0.268 +C=CCN(CC=C)N=O,0.269 +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl,0.289 +O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,0.29 +O(C1=CC=CC=C1)CC2CO2,0.293 +O=C(C[C@@H](C[C@@H](/C=C/C1=C(C2=C(N1C(C)C)C=CC=C2)C3=CC=C(C=C3)F)O)O)O,0.304 +NC1=CC=CC(C)=C1.[H]Cl,0.304 +O=P(OCCCl)(OCCCl)OCCCl,0.304 +O=[N+](C1=CN=C(S1)N)[O-],0.307 +OS(=O)(=O)O.NN,0.314 +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-],0.317 +C=CC#N,0.318 +O=[N+](C1=CC(=C(C=C1)OC)N)[O-],0.321 +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+],0.338 +C1(NC(CN1N=O)=O)=O,0.339 +O=S(C1=NC2=C(C=CC(=C2)OC)N1)CC3=C(C(=C(C=N3)C)OC)C,0.345 +OC1=C(C=CC=C1OC)O,0.348 +C\C(C)=C/Cl,0.351 +S=C(N1CCOCC1)SN1CCOCC1,0.366 +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)C)C)C)C,0.381 +C1C(OC(O1)C(C)I)CO,0.391 +FCCl,0.402 +O\N=C1\CCCC1,0.413 +O=C1C2=C(C=CC=C2C(=O)C3=C1C=CC=C3)O,0.417 +CC1=C(C=CC=C1)N=O,0.419 +OCC(CO)(CBr)CBr,0.424 +NC1=CC2=C(C=CC=C2)C=C1,0.43 +C=CF,0.434 +NC1=C2C(=CC=C1)C(=CC=C2)N,0.44 +ClC(Cl)Br,0.443 +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N,0.452 +C1C(C2=CC=CC=C2)O1,0.461 +NC(=O)OCC,0.464 +C1CO1,0.484 +C1=CC=CC=C1C(O)C(N(C)N=O)C,0.49 +CC(CON=O)C,0.525 +C1=C(C(=CC(=C1N)C)C)C.[H]Cl,0.574 +O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N,0.582 +[Mn+2].[S-]C(=S)NCCNC(=S)[S-],0.592 +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O,0.606 +O=C1C2=CC3=C(C=C2N(C=C1C(=O)O)CC)OCO3,0.639 +,0.647 +OC1=C(C=CC=C1)O,0.649 +O=C(N(C)C)NC1=CC=C(C=C1)Cl,0.659 +[O-][N+](C)=O,0.662 +CCC1=CC=CC=C1,0.684 +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-],0.684 +CC(OC1=CC=C(C=C1)Cl)(C(=O)OCC)C,0.696 +COC2=CC=C(C=C2)CN(CCN(C)C)C1=NC=CC=C1.OC(\C=C/C(O)=O)=O,0.697 +NC1=CC(=CC=C1OC)C,0.714 +CCCCOP(=O)(OCCCC)OCCCC,0.717 +O=[N+](C1=CC(=C(C=C1)N)O)[O-],0.72 +C(CCl)(F)(F)F,0.737 +OC1=CC=C(C=C1)O,0.752 +NC(=O)OC,0.754 +ON=C1C=CC(=NO)C=C1,0.767 +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O,0.775 +C1/C=C\CN(O1)N=O,0.794 +O=[N+](OC(CO[N+](=O)[O-])CO[N+](=O)[O-])[O-],0.806 +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+],0.834 +O=NN(C1=CC=CC=C1)C2=CC=CC=C2,0.842 +Cl\C=C\CCl,0.847 +N1=CC=CC=C1,0.851 +CCC(C)=NO,0.855 +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+],0.864 +O=C(CC(C)C)OCC=C,0.865 +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC,0.866 +CCCC1=CC2=C(C=C1)OCO2,0.871 +CC(C)(C)O,0.872 +ClC(=C(Cl)Cl)Cl,0.874 +Cl\C=C\CCl,0.901 +S=C([S-])NCCNC([S-])=S.[Zn+2],0.925 +C1(C(=CC=C(C=1)C)C)N.[H]Cl,0.964 +C=CCN=C=S,0.968 +CC1=C(C=C(C=C1)C)OCCCC(C(=O)O)(C)C,0.987 +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2,1.01 +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O,1.02 +CN(C1=CC=CC=C1)C,1.03 +CC1=CC(C)=C(/N=N/C2=C(C(S([O-])(=O)=O)=CC3=C2C=CC(S([O-])(=O)=O)=C3)O)C=C1C.[Na+].[Na+],1.05 +F/C(F)=C(\F)F,1.07 +O=C(C1=CC=NC=C1)NN,1.09 +NC2=CC=C(C=C2N)C1=CC=C(N)C(N)=C1.Cl.Cl.Cl.Cl,1.1 +O=C(OCC)C=C,1.19 +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl,1.21 +CC(=C)CCl,1.25 +OC(=O)C(Cl)Cl,1.25 +O=P(H)(OC)OC,1.26 +CC1CO1,1.28 +NC(=S)N,1.29 +C(=C/C=O)\[O-].[Na+],1.3 +Cn3nc(CO)nc3NCCCOc2cc(CN1CCCCC1)ccc2,1.33 +N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O,1.34 +OC1=C(C=CC=C1)C2=CC=CC=C2,1.36 +CCBr,1.37 +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl,1.37 +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C,1.41 +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+],1.44 +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-],1.48 +NC1=C(C=CC(=C1)Cl)N,1.5 +CC(=C)[C@@H]1CCC(=CC1)C,1.5 +OC1=C(C=CC(=C1)/C=C/C(=O)O)O,1.65 +OC(=O)C1=CC=C(C=C1)[N+](=O)[O-],1.72 +CC(C)(C)NCC(O)C1=CC(O)=CC(=C1)O,1.82 +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC,1.83 +O=N(=O)c1ccc(C)cc1,1.87 +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,1.87 +NC2=NC(C3=CC=CC=C3)=C(CCOCC)C1=NC=NN12,1.93 +OC1=C(C=C(C=C1)N)[N+](=O)[O-],2 +OC1=C(C=CC(=C1)C)O,2 +OC1=C(C=C(C=C1Cl)Cl)Cl,2.05 +SC1=NC2=C(C=CC=C2)S1,2.06 +NC1=CC=CC=C1[H]Cl,2.08 +O(CC1(C)C)C1=O,2.11 +C1=CC=CC=C1,2.16 +ClC1=CC=CC=C1,2.19 +ClC(Cl)Cl,2.19 +NC1=C(C=CC(=C1)N)Cl,2.21 +OC1=CC=C(C=C1C(C)(C)C)OC,2.25 +O=N[O-].[Na+],2.42 +C12(C(=CC(=C(C=1/N=N/C3=C4C(=C(C=C3)S(=O)(=O)[O-])C=CC=C4)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+].[Na+],2.43 +BrC(Br)Br,2.56 +C1(=CC=CN=C1)CCl.[H]Cl,2.64 +[K+].[I-],2.65 +O=C2c1ccccc1C(=O)c3c2c(O)cc(O)c3O,2.65 +C=CCC1=CC=C2C(=C1)OCO2,2.72 +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,2.75 +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O,2.83 +NC(NC1=CC=C(C=C1)OCC)=O,2.98 +C1COCCO1,3.03 +CC(=O)N,3.05 +CCC1CO1,3.05 +P(=O)(OC)(OC)N1CCOCC1,3.15 +N1(C(=CN=C1C)[N+](=O)[O-])CCO,3.17 +C1(=CC=C(C=C1)O)NC(C)=O,3.27 +OC1=C(O)C=C4C(C[C@](COC2=C3C=CC(O)=C2O)([C@@]34[H])O)=C1,3.31 +C1(=C(C=CC=C1)C(OCCCC)=O)C(OCC2=CC=CC=C2)=O,3.33 +COC1=CC(=C(C=C1)N)C,3.43 +CC=O,3.47 +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,3.48 +[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2,3.5 +C1=COC2=C1C=CC=C2,3.59 +C1=CC=C(C(O)C)C=C1,3.75 +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC,3.76 +[Na+].C1(=C(C=C(C=C1)NC2=C(C=C(C=C2)[N+](=O)[O-])[N+](=O)[O-])S(=O)(=O)[O-])NC3=CC=CC=C3,3.78 +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2,3.81 +FC(F)(F)CNC(=N)Nc1ccn(CCCCC(N)=O)n1,3.82 +CC(=O)OC=C,3.96 +C(CCC)(CCC)C(=O)[O-].C(CCC)(CCC)C(=O)[O-].[Ca+2],3.98 +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3,3.99 +CC1CC(OC(O1)C)OC(=O)C,4.11 +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2,4.14 +ClC1=CC=C(C=C1)Cl,4.38 +C1=CC=CC=C1C(COC(N)=O)COC(N)=O,4.58 +CC(=C)C=C,4.6 +C=CC=C,4.83 +ClC(=CCl)Cl,5.08 +COC1=CC=C(C=C1)O,5.3 +O=[N+](C1=CC(=C(C=C1)O)N)[O-],5.44 +OC(=O)CCCCCCCCCCN,5.46 +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O,5.5 +CP(=O)(OC)OC,5.64 +C1CCCO1,5.64 +NC1=NC(=NC(=N1)N)N,5.83 +O=C1NC(=O)NC=C1,5.99 +Cl.Cl.Cl.Cc1ccc(cn1)C\C2=C\N/C(=N\C2=O)NCCSCc3ccc(CN(C)C)o3,6.43 +CN1N(C2=CC=CC=C2)C(=O)C=C1C,6.53 +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl,6.92 +CC(=O)NC1=CC=C(C=C1)OCC,6.97 +O=CC1=CC=CO1,7.11 +O=S(=O)(C1=CC=C(C=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+],7.11 +CC(OC)(C)C,7.96 +ClCCl,8.52 +ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N,8.54 +CC1(CC(=CC(=O)C1)C)C,8.75 +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](\CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=CC=C5.[Na+],8.77 +OC(=O)CN(CC(=O)O)CC(=O)O,9.26 +OC1=CC2=C(C=C1)OCO2,9.77 +[Al+3].[O-]P(=O)OCC.[O-]P(=O)OCC.[O-]P(=O)OCC,10.3 +O=C1[N-]S(=O)(=O)C2=CC=CC=C12.[Na+],10.4 +CC1=NC=CN1,10.6 +O=C(OC(COC(=O)CCCCCCC)COC(=O)CCCCCCC)CCCCCCC,11.7 +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1,15.1 +ClC(Cl)C(F)(F)F,15.5 +O=C(CCC(=O)O)NN(C)C,15.6 +OCCOCCO,15.6 +O=S(C1=C3C(C=CC=C3)=C(O)C(/N=N/C2=CC(S(=O)([O-])=O)=C(C)C=C2C)=C1)([O-])=O.[Na+].[Na+],16.9 +O=C1OC2=C(C=CC=C2)CC1,20 +CC1=C(C=CC=C1)S(=O)(=O)N,23.1 +CC1=CC=CC(C)=C1,29.3 +CC1=CC=CC=C1,33.2 +NCC1(CC(=O)O)CCCCC1,34.2 +CC1=C(C=CC(=C1)C)C,36.2 +C12(C(=CC(=CC=1S(=O)(=O)[O-])S(=O)(=O)[O-])C=CC(=C2/N=N/C3=C4C(=C(C=C3)S(=O)(=O)[O-])C=CC=C4)O).[Na+].[Na+].[Na+],40.5 +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2,43.4 +CC(Cl)(Cl)F,45 +NC1=C(C=CC=C1)C(=O)OC/C=C/C2=CC=CC=C2,47.8 +CC(C)=C,63.3 +C(O)(=O)[O-].[K+],130 +CCO,198 +FCC(F)(F)F,293 +NCC(O)=O,342 diff --git a/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Hamster.csv b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Hamster.csv new file mode 100644 index 0000000..c0e8158 --- /dev/null +++ b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Hamster.csv @@ -0,0 +1,87 @@ +STRUCTURE_SMILES,ActivityOutcome_CPDBAS_Hamster +O=C(N(CC(C)=O)N=O)NCCCl,active +CN(C)N,active +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,active +N(NC)C.[H]Cl.[H]Cl,active +N(CC(CO)O)(CC(C)=O)N=O,active +O=C(N(C)C)Cl,active +N(CC(CO)O)(CC(O)C)N=O,active +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,active +O=C(N(CC)N=O)NCCO,active +O=C(N(CC)N=O)NCC(=O)C,active +N(CC(CO)O)(C)N=O,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,active +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +ClCOC,active +N(C(=O)N)(N=O)CC(C)=O,active +C=CCN(CC=C)N=O,active +C=CCl,active +C1(CN(N=O)CC(O1)C)C,active +N(CC(C)=O)(CC=C)N=O,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,active +NC(=O)OCC,active +O=C(C)CN(N=O)CCO,active +C1C(N(C(CN1N=O)C)C)C,active +O=NN1CCCCC1,active +N1C=CC=C(C=1)C2N(N=O)CCC2,active +C1(CN(CC(N1N=O)C)N=O)C,active +N(CCN(C)C)(C)N=O,active +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,active +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,active +CCOC(=O)N(C)N=O,active +NN,active +O=NN1CCC1,active +O=NN1CCCC1,active +OS(=O)(=O)O.NN,active +O1C(N(CC1C)N=O)=O,active +C1N(COC1)N=O,active +O=NN1CCOCC1,active +OCC1CO1,active +Br(=O)(=O)[O-].[K+],active +CC1=CC(=O)NC(=S)N1,active +CNN,active +CN(N)C=O,active +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,active +O=C(N(CCC1=CC=CC=C1)N=O)N,active +CC=O,active +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,inactive +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,inactive +ClC(=CCl)Cl,inactive +O=C1OC2=C(C=CC=C2)C=C1,inactive +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,inactive +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,inactive +[Cl-].[Cd+2].[Cl-],inactive +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,inactive +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,inactive +OC1=CC=C(C=C1C(C)(C)C)OC,inactive +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,inactive +O=S(=O)([O-])[O-].[Cd+2],inactive +CCO,inactive +O=C(NC1=CC=CC=C1)OC(C)C,inactive +C1(=CC(=C(O)C=C1)O)C(O)=O,inactive +O=CC1=CC=CO1,inactive +O=C(C(=C)C)OC,inactive +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,inactive +O=N[O-].[Na+],inactive +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,inactive +O=C(C1=CC=CN=C1)CCCN(N=O)C,inactive +OC(=O)C1=CC=NC=C1,inactive +O=C(C1=CC=NC=C1)NN,inactive +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,inactive +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,inactive +O=C(NC1=CC=CC(=C1)Cl)OC(C)C,inactive +C=O,inactive +C1(CCN=C=S)=CC=CC=C1,inactive +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],inactive +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,inactive +C=C(Cl)C=C,inactive +Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,inactive +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,inactive +N(CC(CO)O)(CCO)N=O,inactive +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,inactive +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],inactive +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,inactive +F[B-](F)(F)F.[Na+],inactive +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,inactive +C1(N=CNN=1)N,inactive +OCCNN,inactive diff --git a/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mouse.csv b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mouse.csv new file mode 100644 index 0000000..d1583c2 --- /dev/null +++ b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mouse.csv @@ -0,0 +1,978 @@ +STRUCTURE_SMILES,ActivityOutcome_CPDBAS_Mouse +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl,active +ClC(Cl)Cl,active +ClC(Cl)Br,active +ClC#CCl,active +ClC(C(Cl)Cl)(Cl)Cl,active +ClC(CCl)(Cl)Cl,active +CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC,active +ClC(Cl)(Cl)Cl,active +C(COCCl)OCCl,active +ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12,active +O=C1C23C4C5C6(C(=O)C7=C(O)C(C)=CC(=C7C(C6=C(C2C5O)O)=O)O)C(C4O)C(=C3C(=O)C8=C1C(O)=C(C)C=C8O)O,active +O=C1CCO1,active +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N,active +C1=CC(=CC(=C1OCC)[N+]([O-])=O)NC(=O)C,active +CC1=CC(=C(C=C1C)N)C,active +ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl,active +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +NN,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)Cl,active +ClC(=CCl)Cl,active +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC,active +ClC(C(=O)O)(Cl)Cl,active +BrC(CCl)CBr,active +O=NN(C)C1=NC=NC2=C1N=CN2,active +ClC(=C(Cl)Cl)Cl,active +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-],active +ClC(CC(Cl)C(Cl)CCC(Cl)CC)C(Cl)C(Cl)CCl,active +ClC(C(Cl)Cl)Cl,active +ClC/C=C/CCl,active +ClC(C1=CC=CC=C1)(Cl)Cl,active +C(=C/C=O)\[O-].[Na+],active +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,active +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,active +ClC(C(Cl)(Cl)Cl)(Cl)Cl,active +O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl,active +ClC1=NC(SCC(NCCO)=O)=NC(NC2=CC=CC(C)=C2C)=C1,active +NC1C=CC2=C(N=1)NC3=CC=CC=C23,active +ClC1C(C(C(Cl)C(C1Cl)Cl)Cl)Cl,active +O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1,active +O=[N+](C1=CC2=C(C=C1)NC=N2)[O-],active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-],active +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-],active +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,active +ClCCl,active +O=C1C(=CNC(=O)N1)F,active +N=C(N(CC)N=O)N[N+]([O-])=O,active +O=C1[C@H]3[C@H](C3)[C@@]([C@]4([H])[C@@]([C@@]5([H])[C@]([C@@](CC5)(OC(C)=O)[C@@](C)=O)(C)CC4)([H])C=C2Cl)(C)C2=C1,active +ClCC1=CC=CC=C1,active +ClC2(Cl)C1(Cl)C(=C)C(CCl)(CCl)C2(Cl)C(Cl)C1Cl,active +C=CCC1=CC=C2C(=C1)OCO2,active +C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1,active +O=[N+](C1=CC(=C(C=C1)OC)N)[O-],active +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC,active +ClC1=C(C=CC=C1)[N+](=O)[O-],active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N,active +ClC1=C(Cl)C(Cl)=CC2=C1OC3=C(C=C(Cl)C(Cl)=C3Cl)O2,active +ClC1=C(C=C(C=C1C(=O)O)Cl)N,active +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,active +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2,active +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O,active +O=C1C(C2=C(C(O)=C3C)C(O)=C(NC(\C(C)=C/C=C/[C@@H]5C)=O)C(/C=N/N4CCN(C)CC4)=C2O)=C3O[C@@](C)1O/C=C/[C@H](OC)[C@@H](C)[C@@H](OC(C)=O)[C@H](C)[C@H](O)[C@H](C)[C@H]5O,active +NC1=CC=C(C=C1)C2=CC=C(C=C2)F,active +O=C1C=C(NC(=S)N1)CCC,active +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,active +O=C1C(O)=COC(CO)=C1,active +ClC1=CC(Cl)=C(/C(OP(=O)(OC)OC)=C/Cl)C=C1Cl,active +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,active +ClC1=CC=C(C=C1)Cl,active +O=C1C=CC(=O)C=C1,active +O=NN(CCCC)CCCC,active +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2,active +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)[N+](=O)[O-],active +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl,active +O=NN(C)C1=NC=NC2=C1N=CN2[C@@H]3O[C@H](CO)[C@@H](O)[C@H]3O,active +CC/C(=C/CC)[N+](=O)[O-],active +NC1=CC=CC2=C1C=CC=C2,active +O=NN1CCCCC1,active +Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,active +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl,active +C1=C(CO)OC=C1,active +CCC(CCCC)CO,active +CCC(C)=NO,active +O=CNNC=O,active +O=S(=O)(C1=CC=C(C=C1)C(=O)O)N(CCC)CCC,active +NC(=O)NNC1=CC=CC=C1,active +O=CNN,active +CC(OC)(C)C,active +N1(C(=CN=C1C)[N+](=O)[O-])CCO,active +S=C(N(CCO)CCO)[S-].[K+],active +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +CC(=O)NN,active +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br,active +CC(CON=O)C,active +CC(C1=C(C(=C(C(=C1[N+](=O)[O-])C)[N+](=O)[O-])C)[N+](=O)[O-])(C)C,active +COC1=C(C=CC=C1)[N+](=O)[O-],active +O=NN1CCN(N=O)CC1,active +O=C1C(C2=CC=CC=C2)(C3=CC=CC=C3)NC(=O)N1,active +CC=NN(C)C=O,active +O=NN1CCCCCC1,active +OCCNN,active +CC/C(C2=CC=CC=C2)=C(C1=CC=CC=C1)/C(C=C3)=CC=C3OCCN(C)C.OC(C(CC(O)=O)(O)CC(O)=O)=O,active +CC=CCl,active +O=P(OC)(OC)OC,active +OO,active +Cl.CCCCNN,active +Cl[C@@]1(C(C)2C)C(Cl)(Cl)C(Cl)([C@](Cl)(C2=C)C1Cl)Cl,active +O=C1OC2=C(C=CC=C2)C=C1,active +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,active +CCCCC/C=N/N(C=O)C,active +NC1=C(C=CC(=C1)NC(=O)C)OCC,active +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,active +O=C1N2CC3=CC=CC=C3C(=O)N2CC4C=CC=CC1=4,active +O=C1NC(=O)NC=C1,active +ClCCN(CCCl)[P]1(=O)NCCCO1,active +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O,active +O=C(C(C)(OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl)C)OC,active +O=C1NC(=S)NC=C1,active +C=CCOCC1CO1,active +CCCC1=CC2=C(C=C1)OCO2,active +CCCC/C=N/N(C=O)C,active +NNCCC.[H]Cl,active +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,active +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O,active +O=CCCl,active +OC2=C(C)C1=C(C(C)=C2)OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CC1,active +CCC1=CC=CC=C1,active +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N),active +O=C4C=C2[C@@](CC4)([H])[C@]1([H])[C@](CC2)([H])[C@@](CC3)([H])[C@@](CC1)(C)[C@]3(OC(C)=O)C#C,active +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl,active +O=CC1=CC=CC=C1,active +N(N)(CCCC)C=O,active +CCCl,active +CCCCOP(=O)(OCCCC)OCCCC,active +NC1=CC(=CC=C1OC)C,active +NC1=C(C=CC=C1)C(=O)OC/C=C/C2=CC=CC=C2,active +NC1=C(C=CC(=C1)N)Cl,active +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+],active +NC1=C2C(=CC=C1)C(=CC=C2)N,active +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O,active +OC1=CC=C(C=C1C(C)(C)C)OC,active +NC1=C(C=CC(=C1)N)C,active +NC1=C(C=CC(=C1)Cl)N,active +O[C@]1(C(C)2C)[C@]2([H])[C@@](C=C(CO)C4)([H])[C@]([C@@](C=C3C)([H])[C@@]4(O)C3=O)(O)[C@H](C)[C@H]1O,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,active +ClC(Br)Br,active +NC1=CC=C(C2=CC=C(N)C=C2)C=C1,active +NC1=CC=C(C=C1OC)/N=N/C2=CC=CC=C2,active +NC1=CC=C(/C=C/C2=CC(OC)=CC=C2OC)C=C1,active +CC(=O)OC=C,active +NC1=CC=C(C=C1)C2=CC=CC=C2,active +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O,active +NC(=O)CCCCC,active +NC(=O)OC=C,active +O=C(C1=CC=CC=C1)NN,active +FC(F)(F)CNC(=N)Nc1ccn(CCCCC(N)=O)n1,active +NC(=O)OCC,active +NNC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1,active +O=C(C1=CC=NC=C1)NN,active +NC(=O)NC1=CC=C(C=C1)C,active +NC1=C(C=C(C=C1Cl)Cl)Cl,active +ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl,active +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl,active +NC1=C(C=C(C=C1)N)[N+](=O)[O-],active +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC,active +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O,active +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C,active +NC(N3C)=NC2=C3C(C)=CC1=NC=CC=C12,active +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl,active +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-],active +O(C)c1cc(CC=C)ccc1OC,active +O=[N+](C1=CC=C(C=C1)Cl)[O-],active +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N,active +C\C(C)=C/Cl,active +CC(CC1=CC2=C(C=C1)OCO2)S(=O)CCCCCCCC,active +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],active +O=[N+](C1=CC=CC=C1)[O-],active +O=[Mo](=O)=O,active +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2,active +O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-],active +C=CC(C1=CC=C(C=C1)OC)O,active +CC(=O)NC1=CC=C(C=C1)OCC,active +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl,active +ClC2=C(C=CC(Cl)=C2Cl)C1=C(Cl)C(Cl)=CC=C1,active +C1(C(=CC=C(C=1)C)C)N.[H]Cl,active +O=[N+](C1=CC(=C(C=C1)C)N)[O-],active +CNN,active +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1,active +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1,active +NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1,active +NC1=CC=CC(C)=C1.[H]Cl,active +NC1=CC=C(OC2=CC=C(N)C=C2)C=C1N,active +NC1=CC2=C(C=CC=C2)C=C1,active +C1CCCO1,active +NS(C1=C(Cl)C=C(NCC2=CC=CO2)C(C(O)=O)=C1)(=O)=O,active +O=[O+1][O-1],active +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+],active +CCCCOCCO,active +NNC1=CC=CC=C1.[H]Cl,active +NC2=CC=C(C=C2N)C1=CC=C(N)C(N)=C1.Cl.Cl.Cl.Cl,active +NC2=C(O)C=C(C=C2)C(C=C1O)=CC=C1N.Cl.Cl,active +O=C=NC1=CC(N=C=O)=CC=C1C,active +NC3=CC1=C(C=C3)OC2=C1C=CC=C2,active +Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,active +CS(=O)(=O)OC,active +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,active +F/C(F)=C(\F)F,active +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl,active +CCCCCNN.[H]Cl,active +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1,active +COC1=C(O)C=CC(=C1)C=NNC(=O)C2=CC=NC=C2,active +O=C(CCC(=O)O)NN(C)C,active +O=C(N)C1=C(N=CN1)/N=N/N(C)C,active +N(C1=CC=CC=C1)NC2=CC=CC=C2,active +N(N)(CC)C=O,active +CCCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)C,active +OC1=C(C=C(C=C1Cl)Cl)Cl,active +CN(N=O)C,active +N(C)[N+].S(=O)(=O)([O-])O,active +[K+].C1(=CC=C2C(=N1)N(C=C(C2=O)C([O-])=O)C)/C=C/C3=CC=C(O3)[N+]([O-])=O,active +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,active +ClCCN[P]1(=O)OCCCN1CCCl,active +CN(C(=O)N)N=O,active +ClCOCCl,active +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl,active +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl,active +ClCCN(CCCl)C1=CC=C(CC(OC3=CC=C(C4=C3)[C@]2([H])[C@](CC4)([H])[C@@](CC[C@@H]5OC(CC6=CC=C(N(CCCl)CCCl)C=C6)=O)([H])[C@]5(C)CC2)=O)C=C1,active +NNC1=NC(=CS1)C2=CC=C(O2)[N+]([O-])=O,active +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N,active +CN(N)C=O,active +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N,active +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N,active +NC(=S)C1=CC(=NC=C1)CC,active +CN(C)N,active +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl,active +O=C(OCC)C=C,active +CC(=S)N,active +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2,active +O=C(CN=C2C3=CC=CC=C3)NC1=C2N(N=C1C)CC,active +ClCCCl,active +ClC(=CCl)Cl,active +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+],active +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O,active +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,active +N1=CC=CC=C1,active +NC(=O)Cc2c([O-])on[n+]2Cc1ccccc1,active +NC(=O)C1=C(C=CC=C1)OCC,active +O=C(CC(C)C)OCC=C,active +O=C(C3=CC=C6C2=C34)C1=CC=CC=C1C4=CC=C2C(C5=CC=CC=C56)=O,active +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O,active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O,active +CC(C)(C)NC(=O)[C@H]4CC[C@@H]3[C@]4(C)CC[C@H]1[C@H]3CC[C@H]2NC(=O)\C=C/[C@]12C,active +CC(Cl)CCl,active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O,active +O=C(N(CCO)N=O)N,active +N(NC(CC[C@H](N)C(=O)O)=O)C1C=CC(=CC=1)C(=O)O,active +N(NCCCC)CCCC.Cl.Cl,active +N(NCC=C)CC=C.[H]Cl.[H]Cl,active +CCCCCC,active +N(N)(CC=C)CC=C,active +N(NC(C)=O)C1=CC=C(C=C1)CO,active +N(NC(C)=O)C(C1=CC=NC=C1)=O,active +C1(C2=C(C=CC=C2)N)(=CC=CC=C1).[H]Cl,active +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl,active +N=C(N)NCCC[C@H](NC([C@@H](NC([C@@H](NC(C)=O)CC(C)C)=O)CC(C)C)=O)C=O,active +N1(C2=CC=CC=C2)C(C(N(CS(=O)(=O)[O-])C)=C(N1C)C)=O.[Na+],active +CC(NC(=O)C1=CC(=CC(=C1)Cl)Cl)(C#C)C,active +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl,active +N#[N+]C1=CC=CC=C1.O=S([O-])(O)=O,active +N=C(N(N=O)C)N[N+](=O)[O-],active +NC1=CC(=CC=C1C)Cl,active +C1(=C(C=CC(=C1)Cl)N)C.[H]Cl,active +OC1=C(C=C(C=C1)Cl)CC2=CC=CC=C2,active +C1(=C(C=CC=C1)N)OC.[H]Cl,active +O=C1OC2=C(C=CC=C2)CC1,active +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C,active +C1(=C(C(=C(C(=C1N)F)N)F)F)F.[H]Cl.[H]Cl,active +C1(=C(C(OCCCCCCC(C)C)=O)C=CC=C1)C(OCCCCCCC(C)C)=O,active +O=C(OC)C1=CCCN(C)C1.[H]Cl,active +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC,active +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,active +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C,active +C=CCC1=CC=C(C=C1)OC,active +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl,active +C=CC#N,active +C=CC=C,active +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O,active +OC1=CC=C(C=C1)O,active +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2,active +C=C(Cl)C=C,active +C=C(Cl)Cl,active +C=CCl,active +OC1=C(C=CC(=C1)/C=C/C(=O)O)O,active +C=O,active +OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O,active +C=CC1=CC=CC=C1,active +C=CC1CCC=CC1,active +OC1=C(C=CC=C1)O,active +OC(C=C)C1=CC=C2OCOC2=C1,active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +C1=C(C(=CC(=C1N)C)C)C.[H]Cl,active +C1(=CC=C(Cl)C=C1)N.[H]Cl,active +C[C@@H](CC)C(=O)O[C@H]2C[C@@H](C)\C=C3\C=C/[C@H](C)[C@H](CC[C@@H]1C[C@@H](O)CC(=O)O1)[C@@H]23,active +C1(C2=CC=C(C=C2)N)=CC=C(C=C1)N.[H]Cl.[H]Cl,active +NN(C=O)CCC,active +C1COCCO1,active +C1=C(C=CC=C1OCC2CO2)OCC3CO3,active +S=C1NCCN1,active +OC(=O)CN(CC(=O)O)CC(=O)O,active +C1(N=CNN=1)N,active +C1(NNC(C)=O)=CC=CC=C1,active +C1(NS(=O)(=O)[O-])CCCCC1.[Na+],active +C1(=CC=C(N)C=C1)C.[H]Cl,active +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O,active +OC(COC(C)(C)C)C,active +C1(=CC(=CC(=C1N)C)C)C.[H]Cl,active +O=C(NCO)C=C,active +C1(=CC=C(C=C1)O)NC(C)=O,active +ClC(C(O)O)(Cl)Cl,active +NC1=C(C=C(C=C1Cl)N)Cl,active +N(NC)C.[H]Cl.[H]Cl,active +CC1=C2C=CC=CC2=C(C3=CC=C4C(=C13)C=CC=C4)C,active +C1(=CC=CC=C1)CCNN.S(O)(O)(=O)=O,active +C1(=CC=CN=C1)CCl.[H]Cl,active +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr,active +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O,active +[O-][N+](C3=CC=C(O3)C1=CN=C2N1C=CC=C2)=O,active +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1,active +[Se]=S,active +S=P(N1CC1)(N1CC1)N1CC1,active +[O-][N+](C)=O,active +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl,active +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr,active +OS(=O)(=O)O.NN,active +Br(=O)(=O)[O-].[K+],active +O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C,active +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],active +CC(=O)N,active +OC1=C(C=C(C=C1)CNC(=O)CCCC/C=C/C(C)C)OC,active +O=P(OC=C(Cl)Cl)(OC)OC,active +O=C(NC1=CC=C(C=C1)OCC)CC(C)O,active +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-],active +C1C(OC(O1)C(C)I)CO,active +S=P(SCN1C(=O)SC(=N1)OC)(OC)OC,active +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O,active +C1=CC=CC=C1C(COC(N)=O)COC(N)=O,active +[Cl-].C/[N+](C)=C1\C=C/C(C=C1)=C(\c2ccc(cc2)N(C)C)c3ccc(cc3)N(C)C,active +ClCCOCCCl,active +CC(=O)OCC1=CC=CC=C1,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,active +[N+](=O)([O-])c1ccccc1C,active +C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl,active +CC(CCl)OC(C)CCl,active +C1(C(=CC=C(C=1)N)O)N.[H]Cl.[H]Cl,active +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C,active +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3,active +C1(=C(C(=C(C=C1)C(C)=O)O)CCC)OCCCCC2NN=NN=2,active +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1,active +O=CC1=CC=CO1,active +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2,active +OC1=CC2=C(C=C1)OCO2,active +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl,active +C[Hg]Cl,active +C1(C(=CC=C(C=1)C)N)C.[H]Cl,active +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,active +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2,active +C(NN)(N)=O.Cl,active +BrC2=C(C=C(Br)C(Br)=C2)C1=C(Br)C=C(Br)C(Br)=C1,active +BrCCBr,active +C=CF,active +OCCN(CCO)CCO,active +S=C(N(CC)CC)SCC(=C)Cl,active +O=C2C(CO)NC(=O)CC(NC(=O)C(CO)NC(=O)C(NC(=O)C1C(Cl)C(Cl)CN12)CC)c3ccccc3,active +O=C1N(CCC1)C,active +C(C(COCCl)OCCl)OCCl,active +CC1CO1,active +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl,active +ClC1(=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N).[H]Cl.[H]Cl,active +Brc1c(c(Br)c(Br)c(Br)c1Br)c2c(Br)cc(Br)c(Br)c2Br,active +C1CO1,active +OCC(CO)(CBr)CBr,active +OCCBr,active +CC(C)N(C(=O)SCC(\Cl)=C\Cl)C(C)C,active +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O,active +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,active +CCNN.[H]Cl,active +CC(C)CC(=O)O[C@H]1C[C@]2(COC(C)=O)[C@@]4(C)[C@H](OC(C)=O)[C@@H](O)[C@@H](O[C@@H]2/C=C1/C)[C@]34CO3,active +C12C3=C(C=CC=C3)NC1=CC=CC=2,active +C1(N=C(SC=1)NN)C2=CC=C(C=C2)N,active +[S-]C(N(CC)CC)=S.[S-]C(N(CC)CC)=S.[S-]C(N(CC)CC)=S.[S-]C(N(CC)CC)=S.[Se+4],active +ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2,active +C1=C2C=CC3=CC=CC=C3C2=CC4=CC=C5C(=C14)C=CC=C5,active +C1=COC=C1,active +CC(C=O)Cl,active +S(CC)(=O)(=O)C1C2=C(C(=CC=1)S(N)(=O)=O)C=CC=C2,active +C1=COC2=C1C=CC=C2,active +[N+].C1(N(N=O)[O-])=CC=CC=C1,active +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+],active +NN(CCCC)CCCC,active +O=C(N(C)C)Cl,active +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O,active +CC(C/C=N/N(C=O)C)C,active +NC(CCSCC)C(=O)O,active +CC(=C)CCl,active +CC(=C)CCl,active +CC(=C)C=C,active +C=CCNN.HCl,active +C1=C2C(=CC=C1)C=CC=C2,active +Cl[C@@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl,active +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,active +CC1=NC=CN1,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,active +CC(C)(O)CC[C@@H](O)[C@@H](C)[C@H]2CC[C@@]1(O)C/3=C/C(=O)[C@@H]4C[C@@H](O)[C@@H](O)C[C@]4(C)[C@H]\3CC[C@@]12C,active +C1CN1,active +C1=C(C=CC=C1N)C.[H]Cl,active +CC(C)(C)O,active +Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,active +C1(=CC=CC=C1)CNN.[H]Cl.[H]Cl,active +ClC1=CC(C2=CC(Cl)=C(N)C=C2)=CC=C1N.Cl.Cl,active +O=NN1CCCC1,active +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3,active +O=P(OCCCl)(OCCCl)OCCCl,active +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5,active +O=C(C1=CC=CN=C1)NN,active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C,active +C1C(C2=CC=CC=C2)O1,active +O=P(OCC(CCCC)CC)(OCC(CCCC)CC)OCC(CCCC)CC,active +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O,active +C1(=CC=C(NN)C=C1)C(O)=O.[H]Cl,active +OCC1CO1,active +OC(=O)C(Cl)Cl,active +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-],active +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl,active +OC(=O)C(C)(C)CCCOc1ccc(OCCCC(C)(C)C(O)=O)c(c1)c2ccccc2,active +CCBr,active +C1=CC(=CC=C1COCCl)COCCl,active +ClCC(Cl)CCl,active +ClC(CCl)Cl,active +C1=CC=CC=C1,active +C1([C@H](CNC)O)(=CC(=CC=C1)O).[H]Cl,inactive +O=C(C1=CC(=CC=C1O)/N=N/C2=CC=C(C=C2)C(=O)O)O,inactive +O=[N+](C1=CC(=C(C(=C1)Cl)N)Cl)[O-],inactive +O=[N+](C1=CC(=C(C=C1)C(=O)O)N)[O-],inactive +O=C(C1=CC=CC=C1)CCl,inactive +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +OCCOCCOC1=CC=C(CCCCCCCCC)C=C1,inactive +CC(=O)O[C@H]1[C@@H]([C@H](O[C@H]([C@@H]1OC(=O)C)COC(=O)C)S[Au]=P(CC)(CC)CC)OC(=O)C,inactive +S(=O)(=O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2,inactive +P(=O)(OC)(OC)N1CCOCC1,inactive +S=C(NCC)NCC,inactive +S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC,inactive +O=S(=O)([O-])[O-].O.O.O.O.O.O.[Ni+2],inactive +O=S(=O)(C1=CC=C(C=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+],inactive +O=NN(C1=CC=CC=C1)C2=CC=CC=C2,inactive +O=NN(C)C2=NC1=CC=C(Cl)C=C1C(C3=CC=CC=C3)=[N+]([O-])C2,inactive +O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC,inactive +O=S(=O)(C1=CC(=C(C=C1Cl)Cl)Cl)C2=CC=C(C=C2)Cl,inactive +O=C(C1=C(C=CC=C1)C(=O)OCC=C)OCC=C,inactive +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,inactive +O=C(C1=CC(=C(C(=C1)O)O)O)OCCC,inactive +NNC1=CC=CC=C1,inactive +S=P(SCC(=O)NC)(OC)OC,inactive +SC1=NC2=C(C=CC=C2)S1,inactive +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2,inactive +C1(=C(/C=C/C2=C(S(=O)(=O)[O-])C=C(C=C2)N)C=CC(=C1)N)S(=O)(=O)[O-].[Na+].[Na+],inactive +Se(=O)=O,inactive +O=C(CC(/C=C/C2=CC=C(O)C(OC)=C2)=O)/C=C/C1=CC=C(O)C(OC)=C1,inactive +OCC1=CC=CC=C1,inactive +OCC1=C(C(=C(C(=C1)/N=N/C2=C3C=CC=CC3=C(C=C2)S(=O)(=O)[O-])O)/N=N/C4=C5C=CC=CC5=C(C=C4)S(=O)(=O)[O-])O.[Na+].[Na+],inactive +CC(=O)[C@]2(CC[C@H]3[C@@H]4/C=C(/Cl)\C1=C\C(=O)CC[C@]1(C)[C@H]4CC[C@]23C)OC(C)=O,inactive +O=C(C1=CC=CC=C1)OOC(=O)C2=CC=CC=C2,inactive +CCC1CO1,inactive +O=C(C1=CC=C(C=C1)C(=O)OC)OC,inactive +O=NN(/C(=N\C#N)NCCSCC1=C(N=CN1)C)C,inactive +S=P(SC1C(SP(=S)(OCC)OCC)OCCO1)(OCC)OCC,inactive +O=C(C3)C(C(O)=CC(O[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]5[C@H](O)[C@H](O)[C@@H](O)[C@H](C)O5)O4)=C2)=C2O[C@@H]3[C@@]1=CC(OC)=C(OC)C=C1,inactive +OCCN.O=C(C1=C(C=CC(=C1)Cl)O)NC2=CC=C(C=C2Cl)[N+](=O)[O-],inactive +O=[N+](C1=C2C(=CC=C1)C=CC=C2)[O-],inactive +[Na+].[F-],inactive +O=N[O-].[Na+],inactive +OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)/C=C\[C@]1(C)[C@H]4C(=O)C[C@@]23C,inactive +OC1=CC=C(C=C1)C2=CC=CC=C2,inactive +S=C(N(C)C)SSC(=S)N(C)C,inactive +S=C(N(CC)CC)SSC(=S)N(CC)CC,inactive +S=C=NC1=CC=CC=C1,inactive +OC(=O)CC1=C2C(=CC=C1)C=CC=C2,inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OC)OC,inactive +S=C(N(C)C)S[Bi](SC(=S)N(C)C)SC(=S)N(C)C,inactive +O=P(OC(=C(C(=O)N(CC)CC)Cl)C)(OC)OC,inactive +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,inactive +S=P(OC1=CC(=C(C=C1)SC)C)(OC)OC,inactive +C(CCCCCCCC)CCCNC(N)=N.CC(=O)O,inactive +O=C(OCC)C4=C(C=CC=C4)C(C(C=C(C)C(NCC)=C3)=C3O1)=C(C=C2C)C1=C/C2=N/CC.Cl,inactive +O=S([N-]C1=O)(OC(C)=C1)=O.[K+],inactive +O=[N+](C1=CC(=C(C=C1)N)O)[O-],inactive +O=[Nb](=O)[O-].[Na+],inactive +C[C@H](C\C=C\C)[C@@H](O)[C@@H]1N(C)C(=O)[C@H](C(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](NC(=O)[C@H](CC(C)C)N(C)C(=O)CN(C)C(=O)[C@H](CC)NC1=O)C(C)C,inactive +O=[N+](C1=CN=C(S1)N)[O-],inactive +S=C(S[Te](SC(=S)N(CC)CC)(SC(=S)N(CC)CC)SC(=S)N(CC)CC)N(CC)CC,inactive +O=C([C@H](CO)[C@]2=CC=CC=C2)O[C@@H]1C[C@H](N4C)[C@@H](O3)[C@@H]3[C@@H]4C1.Br.O.O.O,inactive +C1(=CC(=CC=C1[O-])[N+](=O)[O-])[N+](=O)[O-].[Na+],inactive +C12(C(=C(/N=N/C3=C(C4=C(C(=C3)S(=O)(=O)[O-])C=CC=C4)O)C=CC=1S(=O)(=O)[O-])C=CC=C2).[Na+].[Na+],inactive +N1C=NN(C=1)CC(CN2N=CN=C2)(C3=C(C=C(C=C3)F)F)O,inactive +CCCOC(=O)[CH]1[CH](C)CC2=C(C=C3OCOC3=C2)[CH]1C(=O)OCCC,inactive +O=P(OC2=CC=C(C)C=C2)(OC3=CC=C(C)C=C3)OC1=CC=C(C)C=C1,inactive +O=S(=O)([O-])[O-].[Na+].[Na+],inactive +O=C(C(SP(=O)(OC)OC)CC(=O)OCC)OCC,inactive +O=S(=O)(C1=C(C=CC=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+],inactive +O=[N+](C1=CC(=C(C=C1)N)N)[O-],inactive +O=C(C(CCC([O-])=O)N)O.[Na+],inactive +O=S(O)(O)=O.O[C@@H]([C@H](C)NC)[C@@]1=CC=CC=C1.O[C@@H]([C@H](C)NC)[C@@]2=CC=CC=C2,inactive +C(C1=CC=CC=C1)(C2=CC=CC=C2)OCCN(C)C.[H]Cl,inactive +O=S(=O)([O-])[O-].O.[Mn+2],inactive +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Cu+2],inactive +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2],inactive +NC(=O)C1=CC=CN=C1,inactive +O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C,inactive +S=C([S-])NCCNC([S-])=S.[Zn+2],inactive +S=C([S-])NCCNC([S-])=S.[Zn+2],inactive +O(CC1(C)C)C1=O,inactive +ClC1=CC=CC=C1C=C(C#N)C#N,inactive +O=[N+](C1=CC(=C(C=C1)O)N)[O-],inactive +ClC1=C(C=CC=C1)Cl,inactive +O=C(C(C1=CC=CC=C1)(C2=CC=CC=C2)CC(N(C)C)C)CC.[H]Cl,inactive +O=S(=O)([O-])[O-].[Cd+2],inactive +O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1,inactive +O=C(C(=NOC(=O)NC)SC)N(C)C,inactive +O=P(H)(OC)OC,inactive +O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC,inactive +O=C1C2=C(C=CC=C2)C(=O)O1,inactive +O=C(C1=CC=C(C=C1)N)NC2=CC=C(C=C2)N,inactive +O=C1C(C(=O)OC(=C1)C)C(=O)C,inactive +OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO,inactive +O1C2=C(C=CC=C2)OC3=CC=CC=C13,inactive +O=C(N(CCCC)CC)SCCC,inactive +OC1(=C(O)C(=O)O[C@H]1[C@@H](C[O-])O).[Na+],inactive +OC[P+](CO)(CO)CO.[O-]S([O-])(=O)=O.OC[P+](CO)(CO)CO,inactive +S=C([S-])N(CC)CC.[S-]C(N(CC)CC)=S.[Zn+2],inactive +OC(COC1=CC=CC2=C1C=CC=C2)CNC(C)C.[H]Cl,inactive +O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC,inactive +O=C1N(C2=CC=C(C=C2C(=NC1)C3=CC=CC=C3)Cl)CC4CC4,inactive +OC(=O)[C@@H]3[C@]51C[C@@](O)(CC[C@H]1[C@@]24\C=C/[C@H](O)[C@@](C)(C(=O)O2)[C@@H]34)C(=C)C5,inactive +OC(OC(O)CC)CC,inactive +[Se],inactive +CC(=C)C#N,inactive +OC1=C(C=C(C=C1)CC=C)OC,inactive +O=C/C=C/C1=CC=CC=C1,inactive +S=C(N1CCCCC1)SSSSSSC(=S)N1CCCCC1,inactive +O=C2[C@@H](O)[C@]1(CO)[C@]([C@@H]4O)(C)[C@]3(OC3)[C@]([C@@H]4O)([H])O[C@@]([H])1C=C2C,inactive +O=C(OCC)CBr,inactive +O=C1OC(=O)CC1,inactive +NC2=CC=C(C(OC)=C2)\N=N/C1=CC=CC=C1,inactive +O=S1OCCO1,inactive +O=C1[N-]S(=O)(=O)C2=CC=CC=C12.[Na+],inactive +C1(=C(C=C(N)C=C1)[N+](=O)[O-])NCCO,inactive +CN(CCO)C,inactive +OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl,inactive +OC(=O)C1=CC=CN=C1,inactive +OC(=O)C1=CC=NC=C1,inactive +OC(=O)CCl,inactive +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC,inactive +IC(I)I,inactive +OC(C)CCl,inactive +OC(=O)CCCCCCCCCCN,inactive +O=C1CCCO1,inactive +Cl.CC(C)(C)NCC(O)CO/C1=C/N(C)C(=O)c2ccccc12,inactive +OC(=O)CC[N+](=O)[O-],inactive +O=C1CCCCC1,inactive +CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O,inactive +O=C1CCCCCN1,inactive +N#[N+][O-],inactive +Cl.CC(=O)O[C@@H](CC)C(C[C@H](C)N(C)C)(c1ccccc1)c2ccccc2,inactive +OC(CC(C1)C)C(C1)C(C)C,inactive +C1(CCCCC1[N+]).O=S(=O)([O-])O,inactive +OC(CNC(C)C)C1=CC=C(NS(=O)(C)=O)C=C1.[H]Cl,inactive +O=C1C=CC(=O)NN1,inactive +OC(CN(C1=CC=C(N=N1)NN)C)C.Cl.Cl,inactive +O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N,inactive +O=C1C2=C(C=CC=C2)C(=O)C(=C1Cl)Cl,inactive +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3,inactive +OC(=O)C1=CC=C(C=C1)[N+](=O)[O-],inactive +O=C1C(=C(C(=O)C(=C1Cl)Cl)Cl)Cl,inactive +OC(=O)C=CC=CC,inactive +OC(=O)C1=C(C=CC=C1)OC(=O)C,inactive +OB(O)O,inactive +C1(C(OCC(C)C)=O)=CC=C(O)C=C1,inactive +OC1=CC(O)=C(C[C@H]([C@@H]([C@]3=CC(O)=C(O)C(O)=C3)O2)OC(C4=CC(O)=C(O)C(O)=C4)=O)C2=C1,inactive +O=S(C1=C3C(C=CC=C3)=C(O)C(/N=N/C2=CC(S(=O)([O-])=O)=C(C)C=C2C)=C1)([O-])=O.[Na+].[Na+],inactive +O[As](=O)(C1=CC(=C(C=C1)O)[N+](=O)[O-])O,inactive +C1COS(O1)(=O)=O,inactive +O=CC(\Cl)=C(\Cl)C(O)=O,inactive +O=C3[C@@]2(C)CC[C@]1([H])[C@](CC[C@H](OS(=O)(O)=O)C4)(C)C4=CC[C@]([H])1[C@@]([H])2CC3,inactive +COC2=CC=C(C=C2)CN(CCN(C)C)C1=NC=CC=C1.OC(\C=C/C(O)=O)=O,inactive +OC1=C(C=CC=C1)C2=CC=CC=C2,inactive +O=C(O[C@H](CC)[C@](O)(C)[C@H](O)[C@@H](C)C2=O)[C@H](C)[C@@H](O[C@H]3C[C@](OC)(C)[C@@H](O)[C@H](C)O3)[C@H](C)[C@H]([C@@](O)(C)C[C@H]2C)O[C@H]1[C@H](O)[C@@H]([N@H+](C)C)C[C@@H](C)O1.[O-]C(CCCCCCCCCCCCCCCCC)=O,inactive +C1=CC=CC(=C1)C(C(C2=CC=CC=C2)=O)O,inactive +O=S(C1=NC2=C(C=CC(=C2)OC)N1)CC3=C(C(=C(C=N3)C)OC)C,inactive +O=C(N1)N(C2OCCC2)C=C(F)C1=O,inactive +Oc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@H](O)CC[C@@H]12)c4cc3,inactive +O=C(CN1C(=O)CCC1)NC2=C(C=CC=C2C)C,inactive +O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC,inactive +O=C(COC1=C(Cl)C=C(Cl)C=C1)OCC(CC)CCCC,inactive +OC2=C1[C@@](C=C(C)CC3)([H])[C@]3([H])C(C)(C)OC1=CC(CCCCC)=C2,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2,inactive +Oc1ccc(C[C@](C)(N)C(O)=O)cc1O.OC(=O)[C@@](C)(N)Cc1cc(O)c(O)cc1.O.O.O,inactive +O=CCBr,inactive +O=C(N(C)C)NC1=CC=C(C=C1)Cl,inactive +Br/C(Br)=C/[C@H]3[C@@H](C(=O)O[C@H](C#N)c2cccc(Oc1ccccc1)c2)C3(C)C,inactive +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +[Cd+2].[O-]C(C)=O.[O-]C(C)=O,inactive +OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2,inactive +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N,inactive +[Ca+2].[N-2]C#N,inactive +ClC(C(C1=CC=C(C=C1)CC)C2=CC=C(C=C2)CC)Cl,inactive +ClC6C4(Cl)C3C1C5C(C3C2OC12)C4(Cl)C(Cl)(Cl)C56Cl,inactive +OC1=C(C=C(C=C1SC2=C(C(=CC(=C2)Cl)Cl)O)Cl)Cl,inactive +O=C(O[C@H](CC)C(/C=C(C)/C=C/C4=O)CO[C@H](O[C@H](C)[C@H]2O)[C@H](OC)[C@@H]2OC)C[C@@H](O)[C@H](C)[C@H]([C@@H](CC=O)C[C@H]4C)O[C@H]1[C@H](O)[C@@H](N(C)C)[C@H](O[C@H](O[C@@H](C)[C@@H]3O)C[C@@]3(C)O)[C@@H](C)O1.OC(C)C(O)=O,inactive +O=C(OC)C1=C(C)NC(C)=C(C(OCCC3=CC=C(N4CCN(C(C6=CC=CC=C6)C5=CC=CC=C5)CC4)C=C3)=O)C1C2=CC([N+]([O-])=O)=CC=C2.Cl.Cl,inactive +O=C(OC1=C2C(=CC=C1)C=CC=C2)NC,inactive +OC1=C(C=C(C=C1)N)[N+](=O)[O-],inactive +O=C2C=1/N=C\NC=1N(C)C(=O)N2C,inactive +ClCl,inactive +OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-],inactive +O=C(OC1=CC=CC=C1)OC2=CC=CC=C2,inactive +CC#N,inactive +O=C(NC1=CC=CC(=C1)C(F)(F)F)N(C)C,inactive +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,inactive +O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2,inactive +NC1=CC=CC=C1[H]Cl,inactive +O=C(NC1=CC=CC(=C1)Cl)OC(C)C,inactive +O=C(NC1=CC=CC=C1)OC(C)C,inactive +NC1=C(C=CC=C1)C(=O)O,inactive +O=C(O)CC[C@@H](C)[C@]3([H])[C@](CC2)(C)[C@](CC3)([H])[C@@](CC4)([H])[C@@]2([H])[C@]1(C)[C@@]4([H])C[C@H](O)CC1,inactive +O=C(O[C@@H]1[C@@](O[C@@H](O[C@H](COC(C)=O)[C@H]2OC(C(C)C)=O)[C@H](OC(C(C)C)=O)[C@H]2OC(C(C)C)=O)(COC(C)=O)O[C@H](COC(C(C)C)=O)[C@H]1OC(C(C)C)=O)C(C)C,inactive +O=C(C(O)(C2=CC=CC=C2)C1CCCCC1)OC(C)(C)C#CCN(CC)CC.O.Cl,inactive +NC(=O)NCCCC,inactive +OC1=CC(=CC=C1)O,inactive +OC1=C(C=CC(=C1)O)CCCCCC,inactive +O=C(O)COC1=C(C)C=C(Cl)C=C1,inactive +C1=CC=C(C(C(=O)OC)C2N(N=O)CCCC2)C=C1,inactive +[Hg+2].[Cl-].[Cl-],inactive +OC(CNC(C)C)COC1=CC=CC=C1OCC=C.Cl,inactive +C12=C(C=CC(=C1)C(CNC(C)C)O)C=CC=C2.[H]Cl,inactive +C1=CC=C(NC(=O)C(/N=N/C2=C(Cl)C=C(C3=CC(Cl)=C(/N=N/C(C(=O)NC4=CC=CC=C4)C(=O)C)C=C3)C=C2)C(=O)C)C=C1,inactive +C1=CC=C(C(OC)C(=O)O)C=C1,inactive +NC(=S)NN,inactive +C1=C(C(=C(C=C1O)C)N(C)C)C,inactive +C1=C2C(=CC=C1NC3=CC=C(C=C3)NC4=CC=C5C(=C4)C=CC=C5)C=CC=C2,inactive +CC(=O)[O-].[O-]C(=O)C.[Ba+2],inactive +CC3=CC=C(C=C3)\C(C2=CC=CC=N2)=C/CN1CCCC1.O.Cl,inactive +C12=C(C(=O)NS1(=O)=O)C=CC=C2,inactive +O=S(C1=CC=C2C(C=CC(O)=C2\N=N/C3=CC=C(S(=O)([O-])=O)C=C3)=C1)([O-])=O.[Na+].[Na+],inactive +C1C(CC(CC1(OOC(C)(C)C)OOC(C)(C)C)(C)C)C,inactive +C12C(=CC=CC=1NCCN)C=CC=C2.[H]Cl.[H]Cl,inactive +C12C(=C(C=CC=1NC(C)=O)S(=O)(=O)[O-])C=C(C(=C2O)/N=N/C3=C4C(=C(C=C3)/N=N\C5=CC=C(C=C5)S(=O)(=O)[O-])C=CC(=C4)S(=O)(=O)[O-])S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OCC)OCC,inactive +C1=CC=C2C(=C1)C=C(C=C2)C(CNC(C)C)O,inactive +C12(=C(C=C(C=C1C=CC(=C2/N=N/C3=CC=CC=C3)O)S(=O)(=O)[O-])S(=O)(=O)[O-]).[Na+].[Na+],inactive +CS(=O)(=O)OCCCNCCCOS(C)(=O)=O.[H]Cl,inactive +[Cl-].[Cd+2].[Cl-],inactive +O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+],inactive +C1(=CC=CC=C1)C(=O)[O-].[Na+],inactive +C1(=CC(=CC=C1N)N).[H]Cl.[H]Cl,inactive +C1(CCNC(NC(N)=N)=N)=CC=CC=C1.[H]Cl,inactive +C1(C(=CC=C(C=1)NC(C(C)=C)=O)Cl)Cl,inactive +OC1=CC=CC2=CC=CN=C12,inactive +O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+],inactive +C1(=CC(=C(C(=C1)N)C)N).[H]Cl.[H]Cl,inactive +S=C(N(CCCC)CCCC)S[Ni]SC(=S)N(CCCC)CCCC,inactive +C1(=CC=C(N)C=C1)OC.[H]Cl,inactive +C1(=CC(=CC=C1N)OC)OC.[H]Cl,inactive +O=C1N(C2=CC=CC=C2)N(C(=C1N(C)C)C)C,inactive +C1(C=CC=CN=1)CCl.Cl,inactive +C(S)(=S)N(C)C.N(C)C,inactive +CC(C)C=O,inactive +C1(CSCCNC(NC)=NC#N)=C(C)NC=N1,inactive +C1(C[C@H]([C@@H]([C@H]1CCCCCCC(=O)OC)/C=C/CC(O)(CCCC)C)O)=O,inactive +C1(C(COCCOC(=O)CCCCCCCC=CCCCCCCCC)OCCO)OC(OCCO)CC1OCCO,inactive +[N+].[O-],inactive +C1(C2=CC=C(C(=C2)Cl)N=NC(C(C)=O)C(=O)NC3=C(C=C(C(=C3)OC)Cl)OC)=CC(=C(C=C1)N=NC(C(C)=O)C(=O)NC4=CC(=C(C=C4OC)Cl)OC)Cl,inactive +CC(C)NCC(O)COc1ccc(cc1)NC(C)=O,inactive +CC(OC1=CC=C(C=C1)NC2=CC=CC=C2)C,inactive +CC(Cl)Cl,inactive +CC(C=NOC(=O)NC)(SC)C,inactive +ClC1=C(OC(C)C(O)=O)C=CC(Cl)=C1,inactive +CC=CC1=CC=C(C=C1)OC,inactive +CC=C,inactive +CC(C)\C1=C\C=C(/C)CC\C=C(/C)CC\C=C(/C)C[C@@H]1O,inactive +N1C2=C(C=CC=C2)SC3=CC=CC=C13,inactive +CC(Cl)(Cl)Cl,inactive +CC1=C(C(=CC(=C1)OC(=O)NC)C)N(C)C,inactive +CC(C1=CC(=C(C=C1O)C)SC2=CC(=C(C=C2C)O)C(C)(C)C)(C)C,inactive +CC1=C2C(=CC=C1)C=CC=C2,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)CCCCCCCCCCCCCCC)C)C)C,inactive +O=C1C2=C(N=CN2C)N(C(=O)N1C)C,inactive +CC1=CC=CC(C=C)=C1,inactive +CC1=CC=CC(C)=C1,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CC(=O)O)C)C)C,inactive +CC(CC1=CC=CC=C1)NN.[H]Cl,inactive +CC1=C(Cl)C(=O)OC2=C1C=CC(=C2)OP(=S)(OCC)OCC,inactive +CC1=C(C=C(C=C1)C)OCCCC(C(=O)O)(C)C,inactive +CC1(CC(=CC(=O)C1)C)C,inactive +FCC(F)(F)F,inactive +CBr,inactive +C([O-])(C)=O.[Pb+2].[O-]C(C)=O,inactive +N1=C(SNC2CCCCC2)SC3=C1C=CC=C3,inactive +CC(=O)[C@]2(CC[C@H]3[C@@H]4/C=C(/Cl)\C1=C\C(=O)CC[C@]1(C)[C@H]4CC[C@]23C)OC(C)=O,inactive +O=C2C1=C(CCC2)C(OC[C@@H](O)CNC(C)(C)C)=CC=C1.Cl,inactive +c1cccc2N\C=C/c12,inactive +[Na+].[O-]Cl=O,inactive +C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2,inactive +C1N2CN3CN(C2)CN1C3,inactive +O=C(O)Cc1ccc(cc1)NC(C)=O,inactive +CC(=O)O[Sn](OC(=O)C)(CCCC)CCCC,inactive +CNC1=NC=NC2=C1N=CN2,inactive +CC(C)(C)c1cc(O)ccc1O,inactive +CN(C1=CC=CC=C1)C,inactive +S=C(N(C)C)NC,inactive +O[C@H]1[C@H](OC[C@H]2O[C@@H](OC(/C(C)=C/C=C/C(C)=C/C=C/C=C(C)/C=C/C=C(C)/C(O[C@H]3[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O4)O3)=O)=O)[C@H](O)[C@@H](O)[C@@H]2O)O[C@H](CO)[C@@H](O)[C@@H]1O,inactive +CC(=O)[O-].[O-]C(=O)C.[O-]C(=O)C.[Cr+3],inactive +CC(=O)O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3,inactive +CC(=O)O[Hg]C1=CC=CC=C1,inactive +CC(=O)NNC(=O)C,inactive +[O-][N+](=O)C1=CC=CC(=C1)NC(=O)C2=CC3=CC=CC=C3C(=C2O)/N=N/C4=CC(=CC=C4OC)[N+]([O-])=O,inactive +[O-]C1=C(I)C=C(C(C2=C(C([O-])=O)C=CC=C2)=C3C=C(C(C(I)=C3O4)=O)I)C4=C1I.[Na+].[Na+],inactive +ClCC(=O)C1=CC=C(NC(=O)C)C=C1,inactive +BrC(Br)Br,inactive +[O-][N+](C1=CC=CC(C2C(C(OC3CN(C(C5=CC=CC=C5)C4=CC=CC=C4)C3)=O)=C(NC(C)=C2C(OC(C)C)=O)N)=C1)=O,inactive +O=CCCCC=O,inactive +[Na+].C1(=C(C=C(C=C1)NC2=C(C=C(C=C2)[N+](=O)[O-])[N+](=O)[O-])S(=O)(=O)[O-])NC3=CC=CC=C3,inactive +[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2,inactive +[O-][N+](=O)C1=C(Cl)C(=C(Cl)C(=C1)[N+]([O-])=O)Cl,inactive +[O-][N+](/C=C/C1=CC=CC=C1)=O,inactive +ClC1=C(C=CC(=C1)Cl)O,inactive +[Sn+2].[Cl-].[Cl-],inactive +[O-]S(S(=O)[O-])(=O)=O.[K+].[K+],inactive +O=[C@@]([C@@H]1C=C([C@]4([H])N(C)C1)C3=C2C(C4)=C(NC2=CC=C3)Br)N[C@@]5([C@H](C)C)C(N([C@@H](CC(C)C)C(N7CCC[C@@]67[H])=O)[C@@]6(O)O5)=O.O=S(O)(C)=O,inactive +S=C(N(C)C)SC(=S)N(C)C,inactive +BrC(C(=O)NC(=O)N)(CC)CC,inactive +CCN(CC)C(=O)C1=CC=CC(C)=C1,inactive +[O-][N+]1=CC=CC=C1C=C,inactive +O=S1(=O)CC=CC1,inactive +[S-]C1=NC(C=CC=C2)=C2S1.[S-]C3=NC(C=CC=C4)=C4S3.[Zn+2],inactive +CC(C)=C,inactive +[Cl-].OC[P+](CO)(CO)CO,inactive +[Cl-].[Ba+2].[Cl-].O.O,inactive +[Be+2].O=S(=O)([O-])[O-],inactive +[Na+].[As](=O)[O-],inactive +C1(=CC=C2C(=C1)N(C(\N=C/2C3=CC=CC=C3)=O)C(C)C)C,inactive +[Fe+3].O=C([O-])CC(O)(CC(=O)[O-])C([O-])=O.O.O.O.O,inactive +[As]21O[As]3O[As](O1)O[As](O2)O3,inactive +O[C@@H]2C/C(C(CC2)=C)=C/C=C3/[C@@]1([H])[C@@](CCC3)(C)[C@]([C@H](C)/C=C/[C@H](C)C(C)C)([H])CC1,inactive +O=S(=O)(C1=CC=C(C=C1)Cl)OC2=CC=C(C=C2)Cl,inactive +[Cd+2].[Cd+2].[Cd+2].[O-]S(=O)(=O)[O-].[O-]S([O-])(=O)=O.[O-]S([O-])(=O)=O.O.O.O.O.O.O.O.O,inactive +CC(OC1=CC=C(C=C1)Cl)(C(=O)OCC)C,inactive +CN(C)C(C)=O,inactive +[Hg+].[Cl-],inactive +[Na+].[Na+].S=C(NCCNC(=S)[S-])[S-],inactive +[Na+].[Na+].OC(=O)[C@]5(C)C[C@H]6/C7=C/C(=O)[C@H]4[C@@](C)(CC[C@@H]3[C@]4(C)CC[C@H](OC2O[C@H](C([O-])=O)[C@@H](O)[C@H](O)[C@H]2O[C@H]1O[C@@H]([C@@H](O)[C@H](O)[C@H]1O)C([O-])=O)C3(C)C)[C@]7(C)CC[C@@]6(C)CC5,inactive +N(C)(C)C([S-])=S.[Fe+3].[S-]C(=S)N(C)C.[S-]C(=S)N(C)C,inactive +[H][N+]([H])([H])[H].[Cl-],inactive +C=CC1=CC=C(C=C1)C,inactive +[Mn+2].[S-]C(=S)NCCNC(=S)[S-],inactive +[K+].[K+].[O-]C(=O)C2O[Sb]3OC(C(O[Sb]1OC(=O)C2O1)C([O-])=O)C(=O)O3.O.O.O,inactive +C1=CC(=CC=C1NNC(CC[C@@H](C(O)=O)N)=O)CO,inactive +C=CCCl,inactive +C1(=C(C=CC=C1)C(OCCCC)=O)C(OCC2=CC=CC=C2)=O,inactive +O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C,inactive +C1(=C(C=CC(=C1)N(CCO)CCO)NCCO)[N+]([O-])=O,inactive +NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl,inactive +C=CCN=C=S,inactive +C/C=C/C1=CC2=C(C=C1)OCO2,inactive +C[N+](CCC(C1=CC=C(C=C1)Cl)C2=NC=CC=C2)C.C(\C(=C(/C(=O)[O-])[H])[H])(=O)O,inactive +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O,inactive +C=CC=O,inactive +O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3,inactive +N1=CC=CC2=CC=CC(=C12)O[Cu]OC3=CC=CC4=CC=CN=C34,inactive +ON=C1C=CC(=NO)C=C1,inactive +C1(=C2C(=CC=C1N)C=CC=C2)S(=O)(O)=O,inactive +C1(=C(C=CC=C1N)N).[H]Cl.[H]Cl,inactive +C1(=C(C=CC(=C1)NC(N(CC)CC)=O)OCC(CNC(C)(C)C)O)C(C)=O,inactive +OCCNC1=C(OCCO)C=C([N+]([O-])=O)C=C1,inactive +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl,inactive +C1(SC2=C(C(=CC(=C2)Cl)Cl)[O-])(=C(C(=CC(=C1)Cl)Cl)[O-]).[Na+].[Na+],inactive +O=[N],inactive +C1(/N=N/C2=CC=CC=C2)=CC=CC=C1,inactive +C(=O)(/C=C/C)OC1=C(C(CCCCCC)C)C=C(C=C1[N+]([O-])=O)[N+]([O-])=O,inactive +O=C1NCCN1,inactive +C([O-])(C)=O.[O-]C(C)=O.[Ni+2],inactive +C(N)(N)=O,inactive +C(C1=CC=C(C=C1)O)(=O)OCCCC,inactive +C(C(=O)[O-])(O[Ti](OC(C(=O)[O-])=O)=O)=O.[K+].[K+],inactive +C([O-])(=O)CN(CC(=O)O)CCN(CC([O-])=O)CC([O-])=O.[Na+].[Na+].[Na+].[H]O[H].[H]O[H].[H]O[H],inactive +C([N+](C)(C)C)CO.[Cl-],inactive +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](\CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=CC=C5.[Na+],inactive +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+],inactive +C(/C1=C(C=C(C=C1)O)S(=O)(=O)[O-])(C2=CC=C(C=C2)N(CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)=C4/C=C/C(C=C4)=[N+](\CC5=CC(=CC=C5)S(=O)(=O)[O-])CC.[Na+].[Na+],inactive +C(CCOCCl)COCCl,inactive +C(C1C=CC(=CC=1)O)(C2=CC=C(C=C2)O)(C)C,inactive +S=C(NC1CCCCC1)NC1CCCCC1,inactive +C[As](=O)(C)O,inactive +C(NC)CC(OC1=CC=C(C=C1)C(F)(F)F)C2=CC=CC=C2.[H]Cl,inactive +ClC1=NC(=NC(=N1)NC(C)C)NC(C)C,inactive +O=C(C)OC/C=C(C)/CC/C=C(C)/C,inactive +C(CCCCCOCCl)OCCl,inactive +O=C(/C=C/C6=CC=C(O)C(OC)=C6)O[C@@H]4C(C)(C)[C@@]5([H])[C@]1(CC4)[C@]3([C@](CC5)([H])[C@]2(C)CC[C@@]([C@H](C)CC/C=C(C)\C)([H])[C@](C)2CC3)C1,inactive +C(CC(=O)O)(CC(=O)O)(C(=O)O)O.C(=C(/Cl)C1=CC=CC=C1)(/C2=CC=C(C=C2)OCCN(CC)CC)C3=CC=CC=C3,inactive +N1C(=NC2=C1C=CC=C2)C3=CSC=N3,inactive +N1(C2C(SC3=C1C=CC=C3)=CC=CC=2)CC(N(C)C)C.[H]Cl,inactive +NC(=S)NC1=C2C(=CC=C1)C=CC=C2,inactive +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O,inactive +NC(=O)C1=C(C=CC=C1)C(=O)N,inactive +N#CC(C1=CC=CC=C1)C2=CC=CC=C2,inactive +C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2)=NN=C4,inactive +NC1=NC(=NC(=N1)N)C2=CC=CC=C2,inactive +N1=C(SSC2=NC3=C(C=CC=C3)S2)SC4=C1C=CC=C4,inactive +N1=C(SC2=C1C=CC=C2)SN3CCOCC3,inactive +NC(=S)N,inactive +NC(=O)CCCCC(=O)N,inactive +NC(=S)NNC(=S)N,inactive +C1=C(C=CC=C1)C2=CC=CC=C2,inactive +NC(=S)NC1=CC=CC=C1,inactive +NC(=O)CC1=C2C(=CC=C1)C=CC=C2,inactive +NC(=O)C1=NC=CN=C1,inactive +NC(=O)OC,inactive +CC2=CC1=CC=CC=C1C=C2,inactive +NC(=O)C1=CC=NC=C1,inactive +OC(=O)C1=CC=C(C=C1)NN,inactive +CP(=O)(OC)OC,inactive +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2,inactive +N(C1=CC=C(C=C1)NC2=CC=CC=C2)C3=CC=CC=C3,inactive +FC(C(OC(F)F)Cl)(F)F,inactive +FC(C(F)Cl)(OC(F)F)F,inactive +OC(C)C,inactive +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O,inactive +COc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C)c4cc3,inactive +O.[Na+].O.O.CCN(CC)C([S-])=S,inactive +COC1=CC(=C(C=C1)N)C,inactive +O=C1C2=CC3=C(C=C2N(C=C1C(=O)O)CC)OCO3,inactive +CC(=C)[C@@H]1CCC(=CC1)C,inactive +S=C(N(C)C)SSC(=S)N(C)C,inactive +N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O,inactive +O=S(=O)([O-])[O-].[V+2]=O,inactive +FC(F)Cl,inactive +FC(F)(Cl)Cl,inactive +N(C([S-])=S)(CC)CC.[S-]C(N(CC)CC)=S.[Cd+2],inactive +N(=C(C=1)C)N(C(C)C)C=1OC(=O)N(C)C,inactive +CC1=CC=CC=C1,inactive +S=C([S-])N(CCCC)CCCC.[S-]C(N(CCCC)CCCC)=S.[Zn+2],inactive +O.O.O.O.NC(=O)[C@@H]3CCCN3C(=O)[C@@H](NC(=O)[C@@H]1CC(=O)N(C)C(=O)N1)C\C2=C\N=C/N2,inactive +O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+],inactive +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2,inactive +O[As](O)(C)=O,inactive +OC1=CC=C(C=C1)OCC2=CC=CC=C2,inactive +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC,inactive +O=C1c2c(O)cc(C)cc2C(=O)c3cc(O)cc(O)c13,inactive +C12C(C3C(CC1C3)NC(N(C)C)=O)CCC2,inactive +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,inactive +FC(Cl)(Cl)Cl,inactive +O[C@H]([C@@H]2O)[C@@H](O[C@@H]2CO)N1C(N=CN=C3NC)=C3N=C1,inactive +O[C@@H]1C(=O)C(\C)=C/[C@H]2O[C@@H]4[C@H](O)C[C@](C)([C@@]12CO)[C@@]34CO3,inactive +C([N+](C)(C)C)CCl.[Cl-],inactive +O[C@H]1[C@H](O[C@H](CO)[C@@H](O)[C@@H]1O)O[C@]2(CO)O[C@H](CO)[C@@H](O)[C@@H]2O,inactive +O[C@H]1[C@@H](NC(CO)CO)C[C@](O)(CO)[C@@H](O)[C@@H]1O,inactive +NC1=CC=C(C=C1)Cl,inactive +O=C1N(C2=CC=CC=C2)N=C(C1)C,inactive +O[C@@H]8[C@@H](O)[C@@H]1O[C@H](CO)[C@H]8O[C@H]7O[C@H](CO)[C@@H](O[C@H]6O[C@H](CO)[C@@H](O[C@H]5O[C@H](CO)[C@@H](O[C@H]4O[C@H](CO)[C@@H](O[C@H]3O[C@H](CO)[C@@H](O[C@H]2O[C@H](CO)[C@@H](O1)[C@H](O)[C@H]2O)[C@H](O)[C@H]3O)[C@H](O)[C@H]4O)[C@H](O)[C@H]5O)[C,inactive +.[Na+].[Cl-],inactive +OC(=O)CCCC\C=C(\c1cccnc1)c2ccccc2,inactive +C1=CC=C5C(=C1)N(CC2=CC=C(F)C=C2)C(NC4CCN(CCC3=CC=C(OC)C=C3)CC4)=N5,inactive +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,inactive +NC1(=CC=C(C=C1)NC2=CC=CC=C2).[H]Cl,inactive +NC1=NC(=NC(=N1)N)N,inactive +NC1=CC(=CC=C1)N,inactive +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,inactive +S=C(S[Pb]SC(N(C)C)=S)N(C)C,inactive +NC(C(=O)O)CCSC,inactive +Cl.CC3CCCC(C)N3CCCC(O)(c1ccccc1)c2ccccn2,inactive +C1(C(NCC2CCCCN2)=O)=C(C=CC(=C1)OCC(F)(F)F)OCC(F)(F)F.CC(=O)O,inactive +Cl.O=C(c2cn(C)c1ccccc12)[C@H]3CC=4N\C=N/C=4CC3,inactive +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C,inactive +Cl.CCOC(=O)[C@H](CCc1ccccc1)N[C@@H](C)C(=O)N2Cc3ccccc3C[C@H]2C(O)=O,inactive +O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.Cl,inactive +Nc1cc(Cl)c(N)cc1.OS(O)(=O)=O,inactive +ClC1=NC(=NC(=N1)NCC)NCC,inactive +OC(=O)CC[C@@H](C)[C@H]4CC[C@@H]3[C@]4(C)CC[C@H]2[C@H]3[C@H](O)C[C@@H]1C[C@H](O)CC[C@@]12C,inactive +OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO,inactive +O[C@@H]1[C@@](O[C@@H](O[C@H](CO)[C@@H]2Cl)[C@H](O)[C@H]2O)(CCl)O[C@H](CCl)[C@H]1O,inactive +O=C1C[C@H](C\C=C1\C)C(C)=C,inactive +Cl/C2=C(\Cl)C3(Cl)C1C(Cl)OC(Cl)C1C2(Cl)C3(Cl)Cl,inactive +Cl[Mg]Cl.O.O.O.O.O.O,inactive +NC1=C(C)C=C(N)C=C1.O=S(O)(O)=O,inactive +C13CC(C4C3O4)C2C1C5C(O5)C2,inactive +Cl\C2=C(/Cl)C3(Cl)C1COS(=O)OCC1C2(Cl)C3(Cl)Cl,inactive +O=[Ti]=O,inactive +Cl.CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(cccc1O)[C@@](C)(O)[C@H]4C[C@@H]23,inactive +Cl.Cl.Cl.Cc1ccc(cn1)C\C2=C\N/C(=N\C2=O)NCCSCc3ccc(CN(C)C)o3,inactive +O=CC=C(CCC=C(C)C)C,inactive +Cl[C@@H]1[C@H](OCCO1)Cl,inactive +Cl.O=P1(OCC(C)(C)CO1)C\4=C(/C)NC(/C)=C(/C(=O)OCCN(Cc2ccccc2)c3ccccc3)C/4c5cccc(c5)[N+]([O-])=O.CCO,inactive +ClC(C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)(Cl)Cl,inactive +O=C(CCCCCCCC/C=C/C(CCCCCC)=O)OC,inactive +CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O,inactive +ClC1(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +C(O)(=O)[O-].[Na+],inactive +O=C(O)CC[C@H](N)C(O)=O,inactive +ClC([N+](=O)[O-])(Cl)Cl,inactive +C1=CC=C(C(O)C)C=C1,inactive +ClC(C(C1=C(C=CC=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2],inactive +CCC1(C2=C(C3=C(C(=CC=C3)CC)N2)CCO1)CC(=O)O,inactive +OC[C@@H](O)[C@@H](O)[C@H](O)[C@H](O)CO[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1O,inactive +CC1CC(OC(O1)C)OC(=O)C,inactive +OC(=O)CC1=CNC2=C1C=CC=C2,inactive +ClC1=C(C=C(C=C1)Cl)OC(C(=O)O)C,inactive +O=N(=O)c1ccc(C)cc1,inactive +CC1=CC=CC=C1OCC(O)CNCCN2/C=C(/C)C(=O)NC2=O.[H]Cl,inactive +N1C2=C(C=CC=C2)N=N1,inactive +CC2(C)OC1(C)CCC2CC1,inactive +CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C,inactive +ClC1=C(C=CC(=C1)Cl)OS(=O)(=O)C2=CC=CC=C2,inactive +CCOP(=O)(C[CH]1CO1)OCC,inactive +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,inactive +Cl.Cl.[O-][N+](=O)c1cccc(c1)C/2C(\C(=O)OC)=C(\C)NC(\C)=C\2C(=O)OCCN3CCN(CC3)C(c4ccccc4)c5ccccc5,inactive +NC1=CC=C(C=C1)/N=N/C2=CC=C(C=C2)N,inactive +Cl.CC(C)(C)NCC(O)COc1cccc(C)c1C,inactive +O=C(OCC2=CC=CC(C3=CC=CC=C3)=C2C)C1C(C)(C)C1/C=C(Cl)/C(F)(F)F,inactive +CCCCCl,inactive +CCO,inactive +[O-]S([O-])(=O)=O.S(=O)(=O)([O-])[O-].[Zr+4],inactive +S=C(S[Se](SC(=S)N(C)C)(SC(=S)N(C)C)SC(=S)N(C)C)N(C)C,inactive +O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1,inactive +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C,inactive +ClC1=CC2=C(C=C1)OC3=C(C=CC(=C3)Cl)O2,inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1.Cl,inactive +C1(=C2/C(C3=CC(S(=O)(=O)[O-])=CC=C3N2)=O)/C(C4=CC(S(=O)(=O)[O-])=CC=C4N1)=O.[Na+].[Na+],inactive +[Na+].CN(C)c1ccc(/N=N/S([O-])(=O)=O)cc1,inactive +O=[N+](C1=CC=C(C=C1)N)[O-],inactive +ClC1=CC=CC=C1,inactive +Clc1c([N+]([O-])=O)c(Cl)c(Cl)c(OC)c1Cl,inactive +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl,inactive +ClC1=NC(=NC(=N1)NC(C)C)NCC,inactive +CN(C=O)C,inactive +OC1=CC=CC=C1,inactive +N12([C@@H]([C@@H](C1=O)NC(COC3=CC=CC=C3)=O)SC([C@@H]2C(=O)[O-])(C)C).[K+],inactive +CN1C2=CC=C(C=C2C(=NC(C1=O)O)C3=CC=CC=C3)Cl,inactive +CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3,inactive +OC1=CC(C2=NC(N(C(C)C)C3=C2C=CC(C)=C3)=O)=CC=C1,inactive +ClCC1CO1,inactive +[O-][N+](OCC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O)=O,inactive +CN(C)[C@@H]2/C=C\CC[C@@]2(c1ccccc1)C(=O)OCC.OC(=O)\C=C\C(O)=O,inactive +S(NNC(N)=S)(=O)(=O)C1=CC=CC=C1,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)O,inactive +C1(CCCCC1)N.[H]Cl,inactive +ClC1=C(C=C(C(=C1)Cl)Cl)OCC(=O)O,inactive +ClC1=CC(=CC=C1OCC(=O)OC(C)C)Cl,inactive +O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].Cl[O-].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+],inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)OCCCC,inactive +Cl[O-].[Na+],inactive +ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N,inactive +[Na+].O=C([O-])[C@@H](N)CCC(O)=O,inactive +ClC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +ClC1=C(C=C(C(=C1)Cl)Cl)OC(C(=O)O)C,inactive +ClC1=CC(=C(C=C1C2=C(C=C(C(=C2)Cl)N)Cl)Cl)N,inactive +O=C(C(=C)C)OC,inactive +C(CO)O,inactive +ClC1=CC(Cl)=C(/N=N/C(C(=O)NC2=C(C=C(C3=CC(C)=C(NC(=O)C(/N=N/C4=C(Cl)C=C(Cl)C=C4)C(=O)C)C=C3)C=C2)C)C(=O)C)C=C1,inactive +O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4,inactive +ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl,inactive +ClC1=C(C=CC(=C1)N)C,inactive +CC1=CC(=O)NC(=S)N1,inactive +ClC1=C(Cl)N=C(C(O)=O)C(Cl)=C1N,inactive +ClC1=C(Cl)C=CC([C@H]2C3=C(C=CC=C3)[C@@H](NC)CC2)=C1.Cl,inactive diff --git a/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_MultiCellCall.csv b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_MultiCellCall.csv new file mode 100644 index 0000000..8f8bbf4 --- /dev/null +++ b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_MultiCellCall.csv @@ -0,0 +1,1120 @@ +STRUCTURE_SMILES,ActivityOutcome_CPDBAS_MultiCellCall +NN,active +C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl,active +O=S(C1=NC2=C(C=CC(=C2)OC)N1)CC3=C(C(=C(C=N3)C)OC)C,active +N(NCCCC)CCCC.Cl.Cl,active +N#[N+]C1=CC=CC=C1.O=S([O-])(O)=O,active +O=NN(CC=C1)CC1,active +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O,active +CC(=C)C=C,active +NNC1=CC=CC=C1.[H]Cl,active +N(N)(CCCC)C=O,active +N(NCC=C)CC=C.[H]Cl.[H]Cl,active +N(NC)C.[H]Cl.[H]Cl,active +O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H],active +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl,active +N1(C2=CC=CC=C2)C(C(N(CS(=O)(=O)[O-])C)=C(N1C)C)=O.[Na+],active +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,active +N1=CC=CC=C1,active +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O,active +N1=C(N=C(N(CO)CO)N=C1N(CO)CO)N(CO)CO,active +N=C(N(CC)N=O)N[N+]([O-])=O,active +O=[N+](C1=CC(=C(C=C1)C)N)[O-],active +N#CN(CC)N=O,active +NNC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1,active +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1,active +N=C(N(N=O)C)N[N+](=O)[O-],active +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2,active +N(C1=CC=CC=C1)NC2=CC=CC=C2,active +N(C(=O)N)(N=O)CC(=O)O,active +N(CC(C)O)(CC=C)N=O,active +C(NN)(N)=O.Cl,active +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2],active +NC1=CC=C(C2=CC=C(N)C=C2)C=C1,active +O=C1N(CCC1)C,active +F/C(F)=C(\F)F,active +CCCCOCCO,active +FCCl,active +FC(F)(F)CNC(=N)Nc1ccn(CCCCC(N)=O)n1,active +N(CCN(C)C)(C)N=O,active +N(CCCCO)(CCCC)N=O,active +N(CCCCCCCCCCCCCC)(C)N=O,active +N(N)(CC)C=O,active +N(N(CCCO)C)=O,active +C1(=CC=C(Cl)C=C1)N.[H]Cl,active +N(CC(CO)O)(CC(O)C)N=O,active +N(CC(CO)O)(CC(C)=O)N=O,active +N(CC(CO)O)(C)N=O,active +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-],active +N(CCCC(F)(F)F)(CCCC(F)(F)F)N=O,active +N(CC=C)(CCO)N=O,active +[O-]\[N+](CC)=N/C,active +NC1=CC=C(C=C1)C2=CC=CC=C2,active +NC1=CC=C(C=C1)C2=CC=C(C=C2)F,active +NC1=CC=CC(C)=C1.[H]Cl,active +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)Cl,active +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+],active +NC1=CC(=CC=C1C)Cl,active +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+],active +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,active +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl,active +NC1=CC=C(/C=C/C2=CC(OC)=CC=C2OC)C=C1,active +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl,active +NC1C=CC2=C(N=1)NC3=CC=CC=C23,active +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1,active +NC3=CC1=C(C=C3)OC2=C1C=CC=C2,active +NC2=NC(C3=CC=CC=C3)=C(CCOCC)C1=NC=NN12,active +O=NN(C)CCOS(C1=CC=C(C)C=C1)(=O)=O,active +[O-][N+](C2=CC=C(O2)C1=CSC(NN(C)C)=N1)=O,active +NC1=CC2=C(C=CC=C2)C=C1,active +NC1=CC=CC=C1[H]Cl,active +O=S(\N=C(NCCSCC2=CC=C(CNC)O2)/NCC(C1=CC=C(O)C=C1)O)(C)=O,active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C,active +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1,active +NC(=O)NNC1=CC=CC=C1,active +O=[N+](C1=CC=CC2=CC=CN=C12)[O-],active +NC(=O)N(CC=C)N=O,active +NC(N3C)=NC2=C3C(C)=CC1=NC=CC=C12,active +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+],active +NC(=O)OC=C,active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O,active +N1(C(=CN=C1C)[N+](=O)[O-])CCO,active +O(C)c1cc(CC=C)ccc1OC,active +CCBr,active +NC(=O)C=C,active +N/1C(N(\C=C\1)C)=S,active +CC(C)(O)CC[C@@H](O)[C@@H](C)[C@H]2CC[C@@]1(O)C/3=C/C(=O)[C@@H]4C[C@@H](O)[C@@H](O)C[C@]4(C)[C@H]\3CC[C@@]12C,active +NC1=C(C=CC(=C1)N)Cl,active +NC1=C(C=CC(=C1)N)C,active +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N,active +NC1=C2C(=CC=C1)C(=CC=C2)N,active +NC1=C(C=CC=C1)C(=O)OC/C=C/C2=CC=CC=C2,active +NC1=C(C=C(C=C1Cl)Cl)Cl,active +O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.[Mg+2],active +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl,active +NC1=C(C=CC(=C1)Cl)N,active +Cl\C=C\CCl,active +NC1=C(C=C(C=C1Cl)N)Cl,active +ClC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N,active +ClC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)Cl)N,active +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br,active +ClC1=C(C=CC=C1)[N+](=O)[O-],active +[H][C@]12N(CC=C2COC([C@@](O)(C(O)(C)C)[C@H](C)OC)=O)CC[C@@H]1OC(\C(C)=C/C)=O,active +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-],active +ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl,active +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +ClC#CCl,active +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl,active +CCN(CC)N=O,active +OCC1CO1,active +ClC1C(C(C(Cl)C(C1Cl)Cl)Cl)Cl,active +O=C(N(CCCCC)N=O)OCC,active +ClC1=NC(SCC(NCCO)=O)=NC(NC2=CC=CC(C)=C2C)=C1,active +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,active +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O,active +ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12,active +ClC1=CC=C(C=C1)Cl,active +ClC1=C(Cl)C(Cl)=CC2=C1OC3=C(C=C(Cl)C(Cl)=C3Cl)O2,active +O=NN(CCCCCC1)CCCCCC1,active +C1(C(=CC=C(C=1)C)C)N.[H]Cl,active +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2,active +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3,active +BrC(Br)Br,active +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,active +NC1=C(C=C2C3=C(C=CC=C3)OC2=C1)OC,active +ClC(C(=O)O)(Cl)Cl,active +ClC(=CCl)Cl,active +ClC(=CCl)Cl,active +C[C@@H](CC)C(=O)O[C@H]2C[C@@H](C)\C=C3\C=C/[C@H](C)[C@H](CC[C@@H]1C[C@@H](O)CC(=O)O1)[C@@H]23,active +C1CCCO1,active +O=[N+](C1=CC=C(C=C1)Cl)[O-],active +Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl,active +Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,active +Cl[C@@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl,active +ClC(Cl)(Cl)Cl,active +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C,active +ClC(CC(Cl)C(Cl)CCC(Cl)CC)C(Cl)C(Cl)CCl,active +ClC/C=C/CCl,active +ClC(Cl)C(F)(F)F,active +ClC(Cl)Br,active +ClC(C(Cl)(Cl)Cl)(Cl)Cl,active +NC(=O)OCC,active +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,active +CCCC1=CC2=C(C=C1)OCO2,active +C1=CC=CC=C1,active +ClC(C(Cl)Cl)(Cl)Cl,active +O=NN1CCCCCCC1,active +CN(N=O)C1=CC=C(C=C1)C=CC2=C3C=CC=CC3=NC=C2,active +CN(N=O)C(=O)NCCC[C@H](N)C(O)=O,active +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC,active +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N,active +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O,active +CN(CCCCCCCCCCC)N=O,active +CN(CC)N=O,active +CN(CC(C)=O)N=O,active +CN(N=O)C,active +C1N(C(OC1)=O)N=O,active +CN(CCO)N=O,active +COC2=CC=C(C=C2)CN(CCN(C)C)C1=NC=CC=C1.OC(\C=C/C(O)=O)=O,active +COC1C=C(C=CC=1C2NC3=CN=CC=C3N=2)S(C)=O,active +O=C1NC(=O)NC=C1,active +C=CC1=CC=CC=C1,active +CS(=O)(=O)OC,active +O=C1C(=CNC(=O)N1)F,active +CNN,active +CN1N(C2=CC=CC=C2)C(=O)C=C1C,active +CN1CC[C@H]2OC(=O)C3(C[C@@H](C)[C@@](C)(O)C(=O)OC\C(=C\C1)C2=O)O[C@@H]3C,active +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2,active +COC1=C(O)C=CC(=C1)C=NNC(=O)C2=CC=NC=C2,active +COC1=C(C=CC=C1)[N+](=O)[O-],active +ClCC1=CC=CC=C1,active +ClCC(Cl)CCl,active +Cn3nc(CO)nc3NCCCOc2cc(CN1CCCCC1)ccc2,active +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl,active +ClCCl,active +N(CC(CO)O)(CC=C)N=O,active +ClC2=C(C=CC=C2Cl)C1=C(Cl)C=C(Cl)C=C1,active +ClC2=C(C=CC(Cl)=C2Cl)C1=C(Cl)C(Cl)=CC=C1,active +O=C(N(C)C)Cl,active +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl,active +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl,active +O=C(NCO)C=C,active +CN(C)CNc2nnc(/C=C/c1ccc(o1)[N+]([O-])=O)o2,active +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,active +NC(=O)N(CC)N=O,active +CN(C1=CC=CC=C1)N=O,active +ClC(C(Cl)Cl)Cl,active +CN(C)N,active +ClCCN[P]1(=O)OCCCN1CCCl,active +ClCCN(CCCl)C1=CC=C(CC(OC3=CC=C(C4=C3)[C@]2([H])[C@](CC4)([H])[C@@](CC[C@@H]5OC(CC6=CC=C(N(CCCl)CCCl)C=C6)=O)([H])[C@]5(C)CC2)=O)C=C1,active +ClCCN(CCCl)[P]1(=O)NCCCO1,active +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1,active +CN(C(=O)N)N=O,active +ClCOCCl,active +SC1=NC2=C(C=CC=C2)S1,active +O=NN1CCCCC1,active +O=[N+](C1=CC2=C(C=C1)NC=N2)[O-],active +O=NN1CCC(=O)NC1=O,active +O=NN1CCOCC1,active +CN[N+](=O)[O-],active +O=NN1CCCCCC1,active +O=C4C=C2[C@@](CC4)([H])[C@]1([H])[C@](CC2)([H])[C@@](CC3)([H])[C@@](CC1)(C)[C@]3(OC(C)=O)C#C,active +O=NN(CCCC)CCCC,active +O=NN(CCC)CCC,active +O=NN(CCO)CCO,active +S=C(N1CCOCC1)SN1CCOCC1,active +O=NN(CCN(C)C)C(=O)[NH2+]CC.[O-]N=O,active +Cl.CCCCNN,active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C.[H]Cl,active +O=P(OCCCl)(OCCCl)OCCCl,active +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N,active +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC,active +ClC(Cl)Cl,active +O=P(OC(CCl)CCl)(OC(CCl)CCl)OC(CCl)CCl,active +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,active +O=NN1CCSCC1,active +O=NN1CCN(N=O)CC1,active +ClC(CCl)(Cl)Cl,active +O=P(OC=C(Cl)Cl)(OC)OC,active +O=P(H)(OC)OC,active +O=C1OC2=C(C=CC=C2)CC1,active +O=C1OC2=C(C=CC=C2)C=C1,active +O=CC1=CC=CO1,active +OC1=C(C=CC(=C1)/C=C/C(=O)O)O,active +O=C3C[C@@H]4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](C)(O)CC[C@@H]12)[C@@]4(C)C\C3=C\O,active +O=C1N2CC3=CC=CC=C3C(=O)N2CC4C=CC=CC1=4,active +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC,active +O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,active +O=C1OC(O)C(C(Cl)Cl)=C1Cl,active +[K+].[I-],active +O=C1NC(=S)NC=C1,active +NC2=CC=C(C=C2N)C1=CC=C(N)C(N)=C1.Cl.Cl.Cl.Cl,active +O=NN(C)CCCCCCCCCCCC,active +O=NN(C)C1=NC=NC2=C1N=CN2[C@@H]3O[C@H](CO)[C@@H](O)[C@H]3O,active +O=NN(CC(C)O)CC(C)O,active +O=NN(CC(=O)C)CC(=O)C,active +O=NN(C1=CC=CC=C1)C2=CC=CC=C2,active +C=C(Cl)C=C,active +O=CC1=CC=CC=C1,active +C1=C(CO)OC=C1,active +C1(N=C(SC=1)NN)C2=CC=C(C=C2)N,active +O=N[O-].[Na+],active +O=CNNC=O,active +[O-][N+](C2=CC=C(O2)C1=CSC=N1)=O,active +OCC(CO)(CBr)CBr,active +CC=NN(C)C=O,active +O=C(OCC)C=C,active +OCCBr,active +ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N,active +OC1=C(C=CC(=C1)C)O,active +BrC2=C(C=C(Br)C(Br)=C2)C1=C(Br)C=C(Br)C(Br)=C1,active +OC1=C(C=C(C=C1Cl)Cl)Cl,active +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1,active +OC1=CC=C(C=C1C(C)(C)C)OC,active +OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O,active +O=NN(CCN1)CC1,active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N,active +O(CC1(C)C)C1=O,active +S=P(N1CC1)(N1CC1)N1CC1,active +ClCOC,active +S=C(NCC)NCC,active +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O,active +O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+],active +OCCN(CCO)CCO,active +P(=O)(OC)(OC)N1CCOCC1,active +C[N+](=NC)[O-],active +OS(=O)(=O)O.NN,active +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-],active +N(CCCCCCCCCC)(C)N=O,active +OC(=O)C(C)(C)CCCOc1ccc(OCCCC(C)(C)C(O)=O)c(c1)c2ccccc2,active +OC(=O)CN(CC(=O)O)CC(=O)O,active +OC(=O)CCCCCCCCCCN,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,active +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C,active +Br(=O)(=O)[O-].[K+],active +O(C1=CC=CC=C1)CC2CO2,active +C1CO1,active +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N,active +NNCCC.[H]Cl,active +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C,active +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C,active +OC1=C(C=C(C=C1)CNC(=O)CCCC/C=C/C(C)C)OC,active +BrCCBr,active +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl,active +CCC1=CC=CC=C1,active +C1(/N=N/C2=CC=CC=C2)=CC=CC=C1,active +O=C(CCC(=O)O)NN(C)C,active +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O,active +COC1=CC=C(C=C1)O,active +S=C(N(CC)CC)SCC(=C)Cl,active +ClC(C1=CC=CC=C1)(Cl)Cl,active +O=[N+](OC(CO[N+](=O)[O-])CO[N+](=O)[O-])[O-],active +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2,active +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O,active +O=C(C(C)(OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl)C)OC,active +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],active +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-],active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O,active +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2,active +O=NN1CCCC1,active +O=[N+](C1=CC=C2C3=C4C(=CC=C13)C=CC=C4C=C2)[O-],active +O=C(C1=CC=CC=C1)NN,active +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C,active +COC1=CC(=C(C=C1)N)C,active +O=C(C1=CC=NC=C1)NN,active +O=C(C1=CC=CN=C1)NN,active +[Se]=S,active +O=C1C=C(NC(=S)N1)CCC,active +O=C(C)NCC1=NC(=NO1)C2=CC=C(O2)[N+]([O-])=O,active +O=C(C)NC3=CC=C(C2=C3)C1=C(C2=O)C=CC=C1,active +[O-]\[N+](C)=N/CC,active +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC,active +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O,active +N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O,active +N1C=CC=C(C=1)C2N(N=O)CCC2,active +Cl\C=C\CCl,active +O[C@H]([C@H]([C@@H]([C@@H](CO)O1)O)O)[C@@H]1OC/N=[N+](C)\[O-],active +C=CCNN.HCl,active +[O-][N+](C3=CC=C(O3)C1=CN=C2N1C=CC=C2)=O,active +N(N1CCCCC1C2=CC=CN=C2)=O,active +NN(CCCC)CCCC,active +NN(C=O)CCC,active +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O,active +O=S1(=O)CCCO1,active +NNC1=NC(=CS1)C2=CC=C(O2)[N+]([O-])=O,active +O=[N+]([O-])C3=CC=C(O3)/C=N/N1C(O[C@@H](CN2CCOCC2)C1)=O.Cl,active +O=[N+](C1=CC=CC=C1)[O-],active +C1(CN(N=O)CC(O1)C)C,active +Cl.CC(=O)O[C@@H](CC)C(C[C@H](C)N(C)C)(c1ccccc1)c2ccccc2,active +O=[N+](C1=CC(=C(C=C1)OC)N)[O-],active +OC(=O)C(Cl)Cl,active +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,active +O=C(N(CCO)N=O)NCC,active +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr,active +ClCC1CO1,active +C1CN1,active +BrC(CCl)CBr,active +O=NN(CCN1N=O)CCC1,active +O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C,active +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,active +O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N,active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-],active +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N,active +OC(COC(C)(C)C)C,active +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O,active +O=C(O[C@@H]1CC[N+]2([O-])[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C,active +O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1,active +O=C1[C@H]3[C@H](C3)[C@@]([C@]4([H])[C@@]([C@@]5([H])[C@]([C@@](CC5)(OC(C)=O)[C@@](C)=O)(C)CC4)([H])C=C2Cl)(C)C2=C1,active +O=C(OC)C1=CCCN(C)C1.[H]Cl,active +OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2,active +O=C1C23C4C5C6(C(=O)C7=C(O)C(C)=CC(=C7C(C6=C(C2C5O)O)=O)O)C(C4O)C(=C3C(=O)C8=C1C(O)=C(C)C=C8O)O,active +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N,active +O=C1N(C=C)CCC1,active +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl,active +O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl,active +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC,active +O=C(N(CCCC)N=O)N,active +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O,active +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O,active +O=C1C2=C(C=CC=C2C(=O)C3=C1C=CC=C3)O,active +O=C(CN=C2C3=CC=CC=C3)NC1=C2N(N=C1C)CC,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl,active +O=C(N(CC)N=O)OCC,active +O=C(N(CC(C)O)N=O)NCCCl,active +O=C(N(CC)N=O)NCCO,active +O=C(N(CCCC)N=O)NCCCC,active +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC,active +OC1=CC2=C(C=C1)OCO2,active +O=C(CC(C)C)OCC=C,active +[O-]\[N+](CC)=N/CC,active +NC(CCSCC)C(=O)O,active +O=C(N(C)C)NC1=CC=C(C=C1)Cl,active +ClC2=C(C=CC(Cl)=C2Cl)C1=C(Cl)C(Cl)=C(Cl)C=C1,active +O=C(NC2=C1C=C(C3=NNC(CC3)=O)C=C2)C1(C)C,active +O=C(NC2=C(Cl)C=NC=C2Cl)C1=CC(OC3CCCC3)=C(OC)C=C1,active +O=C1C=CC(=O)C=C1,active +CC1=NC=CN1,active +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,active +S=C1NCCN1,active +O=C(N(CCO)N=O)N,active +O=C(N(CCCO)N=O)N,active +O=C(N(CCCCCC)N=O)N,active +O=C(N)C1=C(N=CN1)/N=N/N(C)C,active +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,active +O=C(N(CCO)N=O)NCCCl,active +CC1SC(SC(N1N=O)C)C,active +[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O,active +C1=C(C(=CC(=C1N)C)C)C.[H]Cl,active +C1=C2C(=CC=C1)C=CC=C2,active +C1=C(C=CC=C1OCC2CO2)OCC3CO3,active +OC1=C(C=CC=C1)O,active +C1(NNC(C)=O)=CC=CC=C1,active +C(C1C=CC=CC=1)(=O)N(N=O)C,active +O=C=NC1=CC(N=C=O)=CC=C1C,active +CC(=S)N,active +C1=COC=C1,active +C1=CC=CC=C1C(COC(N)=O)COC(N)=O,active +ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl,active +C1=COC2=C1C=CC=C2,active +C1=CC=CC(=C1)CCN(C)N=O,active +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,active +N(NC(C)=O)C1=CC=C(C=C1)CO,active +NC(=O)Cc2c([O-])on[n+]2Cc1ccccc1,active +C1=CC=C2C(=C1)N=C(N=C2N(CCO)CCO)C3=CC=C(S3)[N+]([O-])=O,active +C1(N=CNN=1)N,active +C1(=CC=C(N)C=C1)C.[H]Cl,active +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N,active +C1(=CC=CC=C1)CCNN.S(O)(O)(=O)=O,active +C1(=CC=C(NN)C=C1)C(O)=O.[H]Cl,active +C1(=CC=C(C=C1)O)NC(C)=O,active +O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-],active +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl,active +C1(=CC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)C)C,active +C1(=CC(=CC(=C1N)C)C)C.[H]Cl,active +O=[Mo](=O)=O,active +[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+],active +O=NN(C(=O)N)CCC,active +CC(OC)(C)C,active +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+],active +ClC1=NC(=NC(=N1)NC(C)C)NCC,active +C1(=CC=CN=C1)CCl.[H]Cl,active +C1(C2=CC=C(C=C2)N)=CC=C(C=C1)N.[H]Cl.[H]Cl,active +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1,active +CC(=O)NC1=CC=C(C=C1)OCC,active +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,active +CC(=O)O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,active +CC(=O)NN,active +CC(=O)N,active +CC(=C)CCl,active +N(NC(C)=O)C(C1=CC=NC=C1)=O,active +OC1=CC=C(C=C1)O,active +CC(=C)CCl,active +CC(C)(C)O,active +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,active +ClC(CCl)Cl,active +CC(C)C(O)(C(C)O)C(=O)OC\C1=C\CN2CC[C@@H](OC(=O)C(\C)=C\C)[C@@H]12,active +C1(NS(=O)(=O)[O-])CCCCC1.[Na+],active +[O-][N+](C)=O,active +N(C(=O)N)(N=O)CC(C)=O,active +CC(=O)OCC1=CC=CC=C1,active +CC(=O)OC=C,active +N(CC(C)=O)(CC=C)N=O,active +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl,active +C12C3=C(C=CC=C3)NC1=CC=CC=2,active +CC(Cl)CCl,active +C1C(C2=CC=CC=C2)O1,active +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O,active +C12C(=CC(=C(C=1O)/N=N/C3=C(C=C(C=C3)C4=CC(=C(C=C4)/N=N/C5=C(C=C6C(=C5O)C(=CC(=C6)S(=O)(=O)[O-])N)S(=O)(=O)[O-])OC)OC)S(=O)(=O)[O-])C=C(C=C2N)S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],active +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+],active +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C,active +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2,active +O=NN(CCCCC)CCCCC,active +C1N(COC1)N=O,active +C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1,active +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2,active +CC(O)CN(C)N=O,active +ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2],active +C1C(OC(O1)C(C)I)CO,active +C1COCCO1,active +C1=CC=CC=C1C(O)C(N(C)N=O)C,active +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O,active +CC(C)CC(=O)O[C@H]1C[C@]2(COC(C)=O)[C@@]4(C)[C@H](OC(C)=O)[C@@H](O)[C@@H](O[C@@H]2/C=C1/C)[C@]34CO3,active +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1,active +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O,active +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,active +[O-][N+](=O)N(C)C,active +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,active +ClC(=C(Cl)Cl)Cl,active +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,active +Brc1c(c(Br)c(Br)c(Br)c1Br)c2c(Br)cc(Br)c(Br)c2Br,active +O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O,active +O=S(C1=C(/N=N/C2=CC=C(C3=CC=C(\N=N/C4=C(S(=O)([O-])=O)C=C5C(C(N)=CC(S(=O)([O-])=O)=C5)=C4O)C=C3)C=C2)C(O)=C(C(N)=CC(S(=O)([O-])=O)=C6)C6=C1)([O-])=O.[Na+].[Na+].[Na+].[Na+],active +C1(=C(C=CC=C1)N)OC.[H]Cl,active +OC(C=C)C1=CC=C2OCOC2=C1,active +[O-]C12[C@@H](CC[N+](C)1CC=C2COC([C@](OC(C)=O)(C)[C@@H](C)\C=C3C=C)=O)OC/3=O,active +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],active +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-],active +N(N)(CC=C)CC=C,active +[Cl-].[Cd+2].[Cl-],active +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O,active +N(CC(F)(F)F)(CC)N=O,active +O=[N+](C1=CN=C(S1)N)[O-],active +[Cl-].C/[N+](C)=C1\C=C/C(C=C1)=C(\c2ccc(cc2)N(C)C)c3ccc(cc3)N(C)C,active +C1C(N(C(CN1N=O)C)C)C,active +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,active +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O,active +ClCCCl,active +O=C(C(F)(F)F)NC1=CC3=C(C2=CC=CC=C2C3)C=C1,active +[O-][N+](=O)c1ccc2c3ccccc3Cc2c1,active +[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2,active +[N+](=O)([O-])c1ccccc1C,active +Cl[C@@]1(C(C)2C)C(Cl)(Cl)C(Cl)([C@](Cl)(C2=C)C1Cl)Cl,active +[K+].C1(=CC=C2C(=N1)N(C=C(C2=O)C([O-])=O)C)/C=C/C3=CC=C(O3)[N+]([O-])=O,active +[N+](=N/CCC)(/CCC)[O-],active +[N+].C1(N(N=O)[O-])=CC=CC=C1,active +NC(=O)OC,active +C=CC=C,active +C=CCl,active +C=CCC1=CC=C2C(=C1)OCO2,active +C=CC#N,active +CC(CCl)OC(C)CCl,active +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2,active +CC1=CC(C)=C(/N=N/C2=C(C(S([O-])(=O)=O)=CC3=C2C=CC(S([O-])(=O)=O)=C3)O)C=C1C.[Na+].[Na+],active +C=C(Cl)Cl,active +C1(=C(C=CC(=C1)Cl)N)C.[H]Cl,active +ClC2(Cl)C1(Cl)C(=C)C(CCl)(CCl)C2(Cl)C(Cl)C1Cl,active +N(C)[N+].S(=O)(=O)([O-])O,active +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,active +C1(=C(C(OCCCCCCC(C)C)=O)C=CC=C1)C(OCCCCCCC(C)C)=O,active +C=CF,active +C=CCN(CC=C)N=O,active +O=C1CCO1,active +C=O,active +C\C(C)=C/Cl,active +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N,active +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl,active +C(CCCN(N=O)C)(O)C1C=NC=CC=1,active +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2,active +O=C(C)CN(N=O)CCO,active +O=C(N(CC(C)=O)N=O)NCCCl,active +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr,active +C(=C/C=O)\[O-].[Na+],active +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](\CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=CC=C5.[Na+],active +O=C(N(CC)N=O)NCC(=O)C,active +Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,active +O=C(N(CCCCC)N=O)N,active +C1(NC(CN1N=O)=O)=O,active +C(O)(=O)[O-].[K+],active +O=C(C1=CC=CN=C1)CCCN(N=O)C,active +C(CCl)(F)(F)F,active +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3,active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +CC1=CC(=C(C=C1C)N)C,active +C=CBr,active +CC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)C)N,active +CC1=C(C=CC=C1)N=O,active +CC1=CC(C4=CC(C)=C(/N=N/C5=CC=C(OS(=O)(C6=CC=C(C)C=C6)=O)C=C5)C=C4)=CC=C1/N=N/C2=C(O)C=CC3=CC(S(=O)([O-])=O)=CC(S(=O)([O-])=O)=C23.[Na+].[Na+],active +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5,active +CC1CC(OC(O1)C)OC(=O)C,active +Cl.Cl.Cl.Cc1ccc(cn1)C\C2=C\N/C(=N\C2=O)NCCSCc3ccc(CN(C)C)o3,active +CC1=CC=CC(C)=C1,active +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl,active +CN(N)C=O,active +CC(OC1=CC=C(C=C1)Cl)(C(=O)OCC)C,active +CC(CON=O)C,active +CC(N(C1=CC=CC2=C1CC3=C2C=CC=C3)C(C)=O)=O,active +CC/C(=C/CC)[N+](=O)[O-],active +CCO,active +CC1(CC(=CC(=O)C1)C)C,active +CC/C(C2=CC=CC=C2)=C(C1=CC=CC=C1)/C(C=C3)=CC=C3OCCN(C)C.OC(C(CC(O)=O)(O)CC(O)=O)=O,active +CC=O,active +CCCCCNN.[H]Cl,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N),active +O=C(N(CCC1=CC=CC=C1)N=O)N,active +CCCCOP(=O)(OCCCC)OCCCC,active +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +CCNN.[H]Cl,active +N(CC(C)O)(CCO)N=O,active +O=S(=O)([O-])[O-].[Cd+2],active +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)C)C)C)C,active +CCOC(=O)N(C)N=O,active +CC1CO1,active +CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC,active +NC1=CC(=CC=C1OC)C,active +CC1=CC=CC=C1,active +CCC(C)=NO,active +CCC1CO1,active +CCCCC/C=N/N(C=O)C,active +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl,active +CCCC/C=N/N(C=O)C,active +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,active +O=CNN,active +O=C1C(O)=COC(CO)=C1,active +CC(C/C=N/N(C=O)C)C,active +CC(C1=C(C(=C(C(=C1[N+](=O)[O-])C)[N+](=O)[O-])C)[N+](=O)[O-])(C)C,active +C(N)(=O)OC(C#C)(C1C=CC=CC=1)C2C=CC(=CC=2)Cl,active +CS(=O)(=O)OC1=C(C=C(C=C1C(C)(C)C)[N+]([O-])=O)[N+](=O)[O-],inactive +CC(C)(C)c1cc(O)ccc1O,inactive +OC[P+](CO)(CO)CO.[O-]S([O-])(=O)=O.OC[P+](CO)(CO)CO,inactive +NC1=CC=C(C=C1)/N=N/C2=CC=C(C=C2)N,inactive +F[B-](F)(F)F.[Na+],inactive +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,inactive +O=NN(C)C2=NC1=CC=C(Cl)C=C1C(C3=CC=CC=C3)=[N+]([O-])C2,inactive +CCCCCl,inactive +[Sn+2].[Cl-].[Cl-],inactive +[Ti+2](C1=CC=CC1)C2(=CC=CC2).[Cl-].[Cl-],inactive +C(CO)O,inactive +ClC1=C(C=CC=C1)Cl,inactive +NC(=S)NC1=CC=CC=C1,inactive +Br/C(Br)=C/[C@H]3[C@@H](C(=O)O[C@H](C#N)c2cccc(Oc1ccccc1)c2)C3(C)C,inactive +O=NN(CCC1)C(C1)C(=O)O,inactive +N(C([S-])=S)(CC)CC.[S-]C(N(CC)CC)=S.[Cd+2],inactive +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,inactive +C([S-])#N.[Na+],inactive +O=CC=C(CCC=C(C)C)C,inactive +O=CC(\Cl)=C(\Cl)C(O)=O,inactive +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,inactive +O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC,inactive +C(/C1=C(C=C(C=C1)O)S(=O)(=O)[O-])(C2=CC=C(C=C2)N(CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)=C4/C=C/C(C=C4)=[N+](\CC5=CC(=CC=C5)S(=O)(=O)[O-])CC.[Na+].[Na+],inactive +O=C3[C@@]2(C)CC[C@]1([H])[C@](CC[C@H](OS(=O)(O)=O)C4)(C)C4=CC[C@]([H])1[C@@]([H])2CC3,inactive +OC1=C(C=C(C=C1)CC=C)OC,inactive +C([N+](C)(C)C)CCl.[Cl-],inactive +O=NN(/C(=N\C#N)NCCSCC1=C(N=CN1)C)C,inactive +O=C4[C@@]3(C)CC[C@]2([H])C1=CC=C(OS(=O)([O-])=O)C=C1CC=C2[C@@]([H])3CC4.[Na+],inactive +CN(C)[C@@H]2/C=C\CC[C@@]2(c1ccccc1)C(=O)OCC.OC(=O)\C=C\C(O)=O,inactive +O=CCCCC=O,inactive +C([N+](C)(C)C)CO.[Cl-],inactive +ClC1=C(OC(C)C(O)=O)C=CC(Cl)=C1,inactive +O=C(C1=CC(=CC=C1O)/N=N/C2=CC=C(C=C2)C(=O)O)O,inactive +N1(C2C(SC3=C1C=CC=C3)=CC=CC=2)CC(N(C)C)C.[H]Cl,inactive +[O-][N+](C1=CC=CC(C2C(C(OC3CN(C(C5=CC=CC=C5)C4=CC=CC=C4)C3)=O)=C(NC(C)=C2C(OC(C)C)=O)N)=C1)=O,inactive +[Na+].[Na+].S=C(NCCNC(=S)[S-])[S-],inactive +O=S(=O)([O-])[O-].[V+2]=O,inactive +ClC(C(C1=C(C=CC=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +ClC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +O=S(=O)([O-])[O-].O.O.O.O.O.O.[Ni+2],inactive +O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3,inactive +Cl.N#Cc1ccc(cc1)C3CCCc2cncn23,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC,inactive +O=S(=O)(C1=CC=C(C=C1)Cl)OC2=CC=C(C=C2)Cl,inactive +[O-][N+](OCC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O)=O,inactive +[N+].[O-],inactive +O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+],inactive +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2,inactive +CC(=O)[O-].[O-]C(=O)C.[Ba+2],inactive +[Na+].[Na+].OC(=O)[C@]5(C)C[C@H]6/C7=C/C(=O)[C@H]4[C@@](C)(CC[C@@H]3[C@]4(C)CC[C@H](OC2O[C@H](C([O-])=O)[C@@H](O)[C@H](O)[C@H]2O[C@H]1O[C@@H]([C@@H](O)[C@H](O)[C@H]1O)C([O-])=O)C3(C)C)[C@]7(C)CC[C@@]6(C)CC5,inactive +C1=C(C(=C(C=C1O)C)N(C)C)C,inactive +O=C(C3)C(C(O)=CC(O[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]5[C@H](O)[C@H](O)[C@@H](O)[C@H](C)O5)O4)=C2)=C2O[C@@H]3[C@@]1=CC(OC)=C(OC)C=C1,inactive +O=S(=O)(C1=CC(=C(C=C1Cl)Cl)Cl)C2=CC=C(C=C2)Cl,inactive +[O-]S(S(=O)[O-])(=O)=O.[K+].[K+],inactive +O=C1C[C@H](C\C=C1\C)C(C)=C,inactive +O=NN1CCC[C@H]1[C@@](O)=O,inactive +[O-]P(=O)=O.[Na+],inactive +NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl,inactive +CCN(CC)C(=O)C1=CC=CC(C)=C1,inactive +O=P(OC(=C(C(=O)N(CC)CC)Cl)C)(OC)OC,inactive +C12(=C(C=C(C=C1C=CC(=C2/N=N/C3=CC=CC=C3)O)S(=O)(=O)[O-])S(=O)(=O)[O-]).[Na+].[Na+],inactive +ClC(C(C1=CC=C(C=C1)CC)C2=CC=C(C=C2)CC)Cl,inactive +C1(=CC(=C2C(=C1)N=CC=C2)Br)Br,inactive +NC1=CC=C(C=C1)N,inactive +[O-][N+]1=CC=CC=C1C=C,inactive +O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].Cl[O-].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+],inactive +C(NC)CC(OC1=CC=C(C=C1)C(F)(F)F)C2=CC=CC=C2.[H]Cl,inactive +O=C1C=CC(=O)NN1,inactive +S=C(N(C)C)SSC(=S)N(C)C,inactive +C(N)(N)=O,inactive +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl,inactive +CC(C=NOC(=O)NC)(SC)C,inactive +NC2=CC=C(C(OC)=C2)\N=N/C1=CC=CC=C1,inactive +O=C(C)OC/C=C(C)/CC/C=C(C)/C,inactive +O=C1C2=C(C=CC=C2)C(=O)C(=C1Cl)Cl,inactive +OC(C(SC(Cl)=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=CC=C3)=O,inactive +C(CCCCCCCC)CCCNC(N)=N.CC(=O)O,inactive +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3,inactive +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,inactive +C=CCO,inactive +OCC1=C(C(=C(C(=C1)/N=N/C2=C3C=CC=CC3=C(C=C2)S(=O)(=O)[O-])O)/N=N/C4=C5C=CC=CC5=C(C=C4)S(=O)(=O)[O-])O.[Na+].[Na+],inactive +FC(C(OC(F)F)Cl)(F)F,inactive +C(O)(=O)[O-].[Na+],inactive +OCCN.O=C(C1=C(C=CC(=C1)Cl)O)NC2=CC=C(C=C2Cl)[N+](=O)[O-],inactive +O=C(OC1=CC=CC=C1)OC2=CC=CC=C2,inactive +O=C(OCC2=CC=CC(C3=CC=CC=C3)=C2C)C1C(C)(C)C1/C=C(Cl)/C(F)(F)F,inactive +O=C(OCC)C4=C(C=CC=C4)C(C(C=C(C)C(NCC)=C3)=C3O1)=C(C=C2C)C1=C/C2=N/CC.Cl,inactive +C[C@H](C\C=C\C)[C@@H](O)[C@@H]1N(C)C(=O)[C@H](C(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](NC(=O)[C@H](CC(C)C)N(C)C(=O)CN(C)C(=O)[C@H](CC)NC1=O)C(C)C,inactive +OC(COC1=CC=CC2=C1C=CC=C2)CNC(C)C.[H]Cl,inactive +ClC1=C(C=C(C(=C1)Cl)Cl)OC(C(=O)O)C,inactive +O[C@@H]1[C@@](O[C@@H](O[C@H](CO)[C@@H]2Cl)[C@H](O)[C@H]2O)(CCl)O[C@H](CCl)[C@H]1O,inactive +COc3ccccc3N2CCN(CCCN\C1=C\C(=O)N(C)C(=O)N1C)CC2,inactive +O=C1C(=C(C(=O)C(=C1Cl)Cl)Cl)Cl,inactive +C(S)(=S)N(C)C.N(C)C,inactive +O=C1C(C(=O)OC(=C1)C)C(=O)C,inactive +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl,inactive +O=C/C=C/C1=CC=CC=C1,inactive +O=C(NCCCN(CC)CC)CN1N=CC(C3=CC=CC=C3)=C1C2=CC=CC=C2.O=C(O)/C([H])=C([H])/C(O)=O,inactive +O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.Cl,inactive +C1N2CN3CN(C2)CN1C3,inactive +OC(C(C=CC=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=C(C)S3)=O,inactive +C(C(F)(Cl)Cl)(F)(F)Cl,inactive +O=C1NCCN1,inactive +C(C(C)O)(O[Ca]OC(C(C)O)=O)=O,inactive +[O-][N+](=O)C1=C(Cl)C(=C(Cl)C(=C1)[N+]([O-])=O)Cl,inactive +O=C1N(C2=CC=CC=C2)N=C(C1)C,inactive +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,inactive +ClCC(=O)C1=CC=C(NC(=O)C)C=C1,inactive +O=C2C1=C(CCC2)C(OC[C@@H](O)CNC(C)(C)C)=CC=C1.Cl,inactive +OC(=O)CCC(=O)OCC2(CCCC)C(=O)N(c1ccccc1)N(C2=O)c3ccccc3,inactive +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,inactive +O=C2C1=C(N=CN2)N([C@@H]3O[C@H](COP([O-])([O-])=O)[C@@H](O)[C@H]3O)C=N1.[Na+].[Na+],inactive +O=C(C1=CC=C(C=C1)C(=O)OC)OC,inactive +O=C1OC(=O)CC1,inactive +O=C([C@H](CO)[C@]2=CC=CC=C2)O[C@@H]1C[C@H](N4C)[C@@H](O3)[C@@H]3[C@@H]4C1.Br.O.O.O,inactive +C(=O)(/C=C/C)OC1=C(C(CCCCCC)C)C=C(C=C1[N+]([O-])=O)[N+]([O-])=O,inactive +FC(C(F)Cl)(OC(F)F)F,inactive +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C,inactive +C[N+](CCC(C1=CC=C(C=C1)Cl)C2=NC=CC=C2)C.C(\C(=C(/C(=O)[O-])[H])[H])(=O)O,inactive +O=C1CCCCC1,inactive +CCCC[Sn](O[Sn](CCCC)(CCCC)CCCC)(CCCC)CCCC,inactive +CNC1=NC=NC2=C1N=CN2,inactive +N1C2=C(C=CC=C2)N=N1,inactive +O=C1C2=C(N=CN2C)N(C(=O)N1C)C,inactive +O.[Na+].O.O.CCN(CC)C([S-])=S,inactive +O=C(/C=C/C6=CC=C(O)C(OC)=C6)O[C@@H]4C(C)(C)[C@@]5([H])[C@]1(CC4)[C@]3([C@](CC5)([H])[C@]2(C)CC[C@@]([C@H](C)CC/C=C(C)\C)([H])[C@](C)2CC3)C1,inactive +C(C1=CC=C(C=C1)O)(=O)OCCCC,inactive +O=C1N(C2=CC=CC=C2)N(C(=C1N(C)C)C)C,inactive +C1(=C(C=CC(=C1)N(CCO)CCO)NCCO)[N+]([O-])=O,inactive +O=C1CCCO1,inactive +O=C1CCCCCN1,inactive +C(C1=CC=CC=C1)(C2=CC=CC=C2)OCCN(C)C.[H]Cl,inactive +C1(=C(/C=C/C2=C(S(=O)(=O)[O-])C=C(C=C2)N)C=CC(=C1)N)S(=O)(=O)[O-].[Na+].[Na+],inactive +Cl.CC(C)(C)NCC(O)COc1cccc(C)c1C,inactive +OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)/C=C\[C@]1(C)[C@H]4C(=O)C[C@@]23C,inactive +Cl.CC3CCCC(C)N3CCCC(O)(c1ccccc1)c2ccccn2,inactive +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O,inactive +S=C(N(C)C)SSC(=S)N(C)C,inactive +Cl.CC(C)(C)NCC(O)CO/C1=C/N(C)C(=O)c2ccccc12,inactive +OCC(=O)[C@@]2(O)CC[C@H]3[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4[C@@H](O)C[C@]23C,inactive +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O.O=S(O)(O)=O,inactive +Cl.O=P1(OCC(C)(C)CO1)C\4=C(/C)NC(/C)=C(/C(=O)OCCN(Cc2ccccc2)c3ccccc3)C/4c5cccc(c5)[N+]([O-])=O.CCO,inactive +[As]21O[As]3O[As](O1)O[As](O2)O3,inactive +OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1,inactive +[Cd+2].[O-]C(C)=O.[O-]C(C)=O,inactive +N1=C(SSC2=NC3=C(C=CC=C3)S2)SC4=C1C=CC=C4,inactive +OCC1=CC=CC=C1,inactive +O=S(=O)(C1=C(C=CC=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+],inactive +[Fe+3].O=C([O-])CC(O)(CC(=O)[O-])C([O-])=O.O.O.O.O,inactive +OC2=C1[C@@](C=C(C)CC3)([H])[C@]3([H])C(C)(C)OC1=CC(CCCCC)=C2,inactive +OC1=CC(C2=NC(N(C(C)C)C3=C2C=CC(C)=C3)=O)=CC=C1,inactive +Cl[O-].[Na+],inactive +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,inactive +CC2=CC1=CC=CC=C1C=C2,inactive +OC1=C(C=CC(=C1)O)CCCCCC,inactive +Cl/C2=C(\Cl)C3(Cl)C1C(Cl)OC(Cl)C1C2(Cl)C3(Cl)Cl,inactive +OC1=CC(=CC=C1)O,inactive +OC(=O)CC[N+](=O)[O-],inactive +OC1=CC=CC2=CC=CN=C12,inactive +OC1=CC=CC=C1,inactive +Oc1ccc(C[C@](C)(N)C(O)=O)cc1O.OC(=O)[C@@](C)(N)Cc1cc(O)c(O)cc1.O.O.O,inactive +O=C1C2=C(C=CC=C2)C(=O)O1,inactive +O=[As](O)(O)[O-].[Na+],inactive +OC1=CC=C(C=C1)OCC2=CC=CC=C2,inactive +O=C1c2c(O)cc(C)cc2C(=O)c3cc(O)cc(O)c13,inactive +O=[N+](CC)[O-],inactive +Cl.Cl.[O-][N+](=O)c1cccc(c1)C/2C(\C(=O)OC)=C(\C)NC(\C)=C\2C(=O)OCCN3CCN(CC3)C(c4ccccc4)c5ccccc5,inactive +S=C1NC=NC2=C1N=CN2,inactive +S=C=NC1=CC=CC=C1,inactive +.[K+].[Cl-],inactive +O=C(NC3=CC2=C(C=C3)C1=CC=C(NC(C)=O)C=C1C2)C,inactive +S=C(S[Pb]SC(N(C)C)=S)N(C)C,inactive +OC(=O)C1=C(C=CC=C1)OC(=O)C,inactive +S=C(S[Te](SC(=S)N(CC)CC)(SC(=S)N(CC)CC)SC(=S)N(CC)CC)N(CC)CC,inactive +.[Na+].[Cl-],inactive +S=P(SC1C(SP(=S)(OCC)OCC)OCCO1)(OCC)OCC,inactive +S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC,inactive +S1C=CC(=C1)CN(C2=NC=CC=C2)CCN(C)C,inactive +S=P(SCC(=O)NC)(OC)OC,inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OC)OC,inactive +S=P(OC1=CC(=C(C=C1)SC)C)(OC)OC,inactive +S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC,inactive +O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C,inactive +S=C(NC1CCCCC1)NC1CCCCC1,inactive +S=C([S-])N(CCCC)CCCC.[S-]C(N(CCCC)CCCC)=S.[Zn+2],inactive +S=C([S-])N(CC)CC.[S-]C(N(CC)CC)=S.[Zn+2],inactive +ClC1=C(C=C(C(=C1)Cl)Cl)OCC(=O)O,inactive +S=C([S-])NCCNC([S-])=S.[Zn+2],inactive +S(=O)(=O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2,inactive +CC1=C2C(=CC=C1)C=CC=C2,inactive +CC(CO)O,inactive +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Cu+2],inactive +S=C(N(CCCC)CCCC)S[Ni]SC(=S)N(CCCC)CCCC,inactive +CC1=C(C(=CC(=C1)OC(=O)NC)C)N(C)C,inactive +O=S1(=O)CC=CC1,inactive +C1(SC2=C(C(=CC(=C2)Cl)Cl)[O-])(=C(C(=CC(=C1)Cl)Cl)[O-]).[Na+].[Na+],inactive +Cl.CCOC(=O)[C@H](CCc1ccccc1)N[C@@H](C)C(=O)N2Cc3ccccc3C[C@H]2C(O)=O,inactive +S=C(N(C)C)SC(=S)N(C)C,inactive +OCCNC1=C(OCCO)C=C([N+]([O-])=O)C=C1,inactive +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,inactive +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,inactive +CC1=CC(NC2=C1C=C(C=C2)OCC)(C)C,inactive +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,inactive +OC(=O)C1=CC=NC=C1,inactive +C1=CC=C(NC(=O)C(/N=N/C2=C(Cl)C=C(C3=CC(Cl)=C(/N=N/C(C(=O)NC4=CC=CC=C4)C(=O)C)C=C3)C=C2)C(=O)C)C=C1,inactive +ClC([N+](=O)[O-])(Cl)Cl,inactive +OC(CNC(C)C)C1=CC=C(NS(=O)(C)=O)C=C1.[H]Cl,inactive +OC(=O)C=CC=CC,inactive +OC(=O)C=C,inactive +O=C(C1=CC=C(C=C1)N)NC2=CC=C(C=C2)N,inactive +O=C2C=1/N=C\NC=1N(C)C(=O)N2C,inactive +OC(=O)CCl,inactive +[O-][N+](/C=C/C1=CC=CC=C1)=O,inactive +CCCOC(=O)[CH]1[CH](C)CC2=C(C=C3OCOC3=C2)[CH]1C(=O)OCCC,inactive +OC(=O)C1=NN(C2=C1C=CC=C2)CC3=CC=C(C=C3Cl)Cl,inactive +OC(=O)CC1=CNC2=C1C=CC=C2,inactive +OC(=O)CC1=C2C(=CC=C1)C=CC=C2,inactive +OC(=O)\C=C/C(O)=O.C(C(C1CCCCC1)C2CCCCC2)C3CCCCN3,inactive +NC1=C(C=CC=C1)C(=O)O,inactive +[O-][N+](C)(C)CCCCCCCCCC,inactive +O=S(O)(O)=O.O[C@@H]([C@H](C)NC)[C@@]1=CC=CC=C1.O[C@@H]([C@H](C)NC)[C@@]2=CC=CC=C2,inactive +C(C1C=CC(=CC=1)O)(C2=CC=C(C=C2)O)(C)C,inactive +O=C1C(NC(=O)N1)NC(=O)N,inactive +[O-][N+](C1=CC([N+]([O-])=O)=CC([N+]([O-])=O)=C1)=O,inactive +O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)([O-])=O.[Na+],inactive +CC(=O)O[C@H]1[C@@H]([C@H](O[C@H]([C@@H]1OC(=O)C)COC(=O)C)S[Au]=P(CC)(CC)CC)OC(=O)C,inactive +OB(O)O,inactive +O1C2=C(C=CC=C2)OC3=CC=CC=C13,inactive +OC(=O)[C@@H]3[C@]51C[C@@](O)(CC[C@H]1[C@@]24\C=C/[C@H](O)[C@@](C)(C(=O)O2)[C@@H]34)C(=C)C5,inactive +[O-][N+](=O)C1=CC=CC(=C1)NC(=O)C2=CC3=CC=CC=C3C(=C2O)/N=N/C4=CC(=CC=C4OC)[N+]([O-])=O,inactive +[Be+2].O=S(=O)([O-])[O-],inactive +[Na+].[As](=O)[O-],inactive +C1(=CC(=CC=C1N)OC)OC.[H]Cl,inactive +OC(OC(O)CC)CC,inactive +CC(C)NCC(O)COc1ccc(cc1)NC(C)=O,inactive +OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl,inactive +[Na+].[O-]C(=O)[C@@H](N)CC(O)=O,inactive +[O-]C1=C(I)C=C(C(C2=C(C([O-])=O)C=CC=C2)=C3C=C(C(C(I)=C3O4)=O)I)C4=C1I.[Na+].[Na+],inactive +CC(C)C=O,inactive +OC1(=C(O)C(=O)O[C@H]1[C@@H](C[O-])O).[Na+],inactive +C1(=C(C=C(N)C=C1)[N+](=O)[O-])NCCO,inactive +ClC1(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +C1=CC=CC(=C1)C(C(C2=CC=CC=C2)=O)O,inactive +OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-],inactive +OC1=C(C=C(C=C1C(C)(C)C)CO)C(C)(C)C,inactive +CC(CC1=CC=CC=C1)NN.[H]Cl,inactive +O.O.O.O.NC(=O)[C@@H]3CCCN3C(=O)[C@@H](NC(=O)[C@@H]1CC(=O)N(C)C(=O)N1)C\C2=C\N=C/N2,inactive +OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C,inactive +[Na+].[N-]=[N+]=[N-],inactive +O=[Ti]=O,inactive +[Na+].[F-],inactive +BrC(C(=O)NC(=O)N)(CC)CC,inactive +[Cd+2].[Cl-].[Cl-].[H]O[H],inactive +O[As](=O)(C1=CC=C(C=C1)NC(=O)N)O,inactive +C12=C(C=CC(=C1)C(CNC(C)C)O)C=CC=C2.[H]Cl,inactive +OC(CC(C1)C)C(C1)C(C)C,inactive +[Na+].O=C([O-])[C@@H](N)CCC(O)=O,inactive +N[C@@H](C\C1=C\N=C/N1)C(O)=O.Cl,inactive +OC(C)CCl,inactive +OC(C)C,inactive +O=C1N(C2=CC=C(C=C2C(=NC1)C3=CC=CC=C3)Cl)CC4CC4,inactive +C1CNCCN1,inactive +OC[C@@H](O)[C@@H](O)[C@H](O)[C@H](O)CO[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1O,inactive +OC[C@@H](NC(C(Cl)Cl)=O)[C@H](O)C1=CC=C(S(=O)(C)=O)C=C1,inactive +OC(CNC(C)C)COC1=CC=CC=C1OCC=C.Cl,inactive +[Na+].C1(=CC=C2C(=C1S([O-])(=O)=O)C=CC=C2)/N=N/C3=C(C=CC4=C3C=CC=C4)O,inactive +O=C(OC)C1=C(C)NC(C)=C(C(OCC(C)(C)CN(CC3=CC=CC=C3)C)=O)C1C2=CC([N+]([O-])=O)=CC=C2F.Cl,inactive +OC(CO)CCl,inactive +NC1=CC(=CC=C1)N,inactive +C1=CC=C(C(C(=O)OC)C2N(N=O)CCCC2)C=C1,inactive +CCC1(C2=C(C3=C(C(=CC=C3)CC)N2)CCO1)CC(=O)O,inactive +S=C(N(CC)CC)SSC(=S)N(CC)CC,inactive +NC(=S)NNC(=S)N,inactive +OC(=O)C1=CC=CN=C1,inactive +CC(=O)[O-].[O-]C(=O)C.[O-]C(=O)C.[Cr+3],inactive +C1=CC=C(C(OC)C(=O)O)C=C1,inactive +C1=C(Cl)C=C3C(=C1)N(CCO)C(=O)C(O)N=C3C2=CC=CC=C2F,inactive +C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2)=NN=C4,inactive +ClCC/C(C2=CC=CC=C2)=C(C3=CC=CC=C3)/C1=CC=C(C=C1)OCCN(C)C.OC(C(O)=O)(CC(O)=O)CC(O)=O,inactive +NC1=CC=C(C=C1)Cl,inactive +C1=C2C(=CC=C1NC3=CC=C(C=C3)NC4=CC=C5C(=C4)C=CC=C5)C=CC=C2,inactive +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,inactive +O=CCBr,inactive +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +C1=CC=C2C(=C1)C=C(C=C2)C(CNC(C)C)O,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CC(=O)O)C)C)C,inactive +NC(CCCN)(C(=O)O)C(F)F,inactive +O=C(O)[C@H](CS)N.Cl,inactive +N(CC(=O)[O-])CC(=O)O.[Na+],inactive +C1(C(NCC2CCCCN2)=O)=C(C=CC(=C1)OCC(F)(F)F)OCC(F)(F)F.CC(=O)O,inactive +CC(=O)O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3,inactive +O=C(C(C)=C2C)C(C(CCCCCC(O)=O)C1=CC=CC=C1)=C(C)C2=O,inactive +NC(C(=O)O)CCSC,inactive +C13CC(C4C3O4)C2C1C5C(O5)C2,inactive +CN(C=O)C,inactive +C1=CC=C5C(=C1)N(CC2=CC=C(F)C=C2)C(NC4CCN(CCC3=CC=C(OC)C=C3)CC4)=N5,inactive +CC1(C2=CC=CC=C2)C(O1)C(=O)OCC,inactive +C1=C(C=CC=C1)C2=CC=CC=C2,inactive +NC1(=CC=C(C=C1)NC2=CC=CC=C2).[H]Cl,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)CCCCCCCCCCCCCCC)C)C)C,inactive +NC1=C(C)C=C(N)C=C1.O=S(O)(O)=O,inactive +O[As](=O)(C1=CC(=C(C=C1)O)[N+](=O)[O-])O,inactive +NC(=S)NN,inactive +CC1=CC=CC(C)=C1,inactive +N=C\2/N=C3/O[C@H]1[C@H](O)[C@@H](CO)O[C@H]1N3/C=C/2,inactive +C1(C2=CC=C(C(=C2)Cl)N=NC(C(C)=O)C(=O)NC3=C(C=C(C(=C3)OC)Cl)OC)=CC(=C(C=C1)N=NC(C(C)=O)C(=O)NC4=CC(=C(C=C4OC)Cl)OC)Cl,inactive +C(CCC(=O)O)([O-])=O.[Na+],inactive +C1(CCNC(NC(N)=N)=N)=CC=CC=C1.[H]Cl,inactive +CC(=O)O[Hg]C1=CC=CC=C1,inactive +C1(CCCCC1[N+]).O=S(=O)([O-])O,inactive +C1(C(OCC(C)C)=O)=CC=C(O)C=C1,inactive +O.O=C(Nc3cccc1c3O/C(=C\C1=O)C2=N\N\N=N2)c5ccc(OCCCCc4ccccc4)cc5.O=C(Nc3cccc1c3O/C(=C\C1=O)/C=2N\N=N/N=2)c5ccc(OCCCCc4ccccc4)cc5,inactive +O=S(=O)([O-])[O-].O.[Mn+2],inactive +[S-]C1=NC(C=CC=C2)=C2S1.[S-]C3=NC(C=CC=C4)=C4S3.[Zn+2],inactive +O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC,inactive +Nc1cc(Cl)c(N)cc1.OS(O)(=O)=O,inactive +C1(C[C@H]([C@@H]([C@H]1CCCCCCC(=O)OC)/C=C/CC(O)(CCCC)C)O)=O,inactive +CC1=CC=CC(C=C)=C1,inactive +CC(=O)O[C@@H]3CC(=O)O[C@H](C)C\C=C\C=C\[C@H](O)[C@H](C)C[C@H](CC=O)[C@H](O[C@@H]2O[C@H](C)[C@@H](O[C@H]1C[C@@](C)(O)[C@H](OC(=O)CC(C)C)[C@H](C)O1)[C@H](N(C)C)[C@H]2O)C3OC,inactive +S=C(N1CCCCC1)SSSSSSC(=S)N1CCCCC1,inactive +ClC6C4(Cl)C3C1C5C(C3C2OC12)C4(Cl)C(Cl)(Cl)C56Cl,inactive +NC1=NC(=NC(=N1)N)C2=CC=CC=C2,inactive +C1(CCCCC1)N.[H]Cl,inactive +CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O,inactive +OC(=O)CCCC\C=C(\c1cccnc1)c2ccccc2,inactive +CN1CCN(CC1)/C2=N/C3=CC=CC=C3SC4C=CC(C)=CC2=4,inactive +FC(Cl)(Cl)Cl,inactive +c1(n(cnc1)C)C[C@@H]2[C@@H](C(=O)OC2)CC,inactive +C1(=C(C=CC(=C1)NC(N(CC)CC)=O)OCC(CNC(C)(C)C)O)C(C)=O,inactive +N(C)(C)C([S-])=S.[Fe+3].[S-]C(=S)N(C)C.[S-]C(=S)N(C)C,inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OCC)OCC,inactive +CC1=C(Cl)C(=O)OC2=C1C=CC(=C2)OP(=S)(OCC)OCC,inactive +N(C1=CC=C(C=C1)NC2=CC=CC=C2)C3=CC=CC=C3,inactive +[Cd+2].[Cd+2].[Cd+2].[O-]S(=O)(=O)[O-].[O-]S([O-])(=O)=O.[O-]S([O-])(=O)=O.O.O.O.O.O.O.O.O,inactive +CC1=C(SSC1=S)C2=CN=CC=N2,inactive +CC=C,inactive +C1(=CC=CC=C1)C(=O)[O-].[Na+],inactive +C12C(=CC=CC=1NCCN)C=CC=C2.[H]Cl.[H]Cl,inactive +C1CCNCC1,inactive +N#CC(C1=CC=CC=C1)C2=CC=CC=C2,inactive +C1(CSCCNC(NC)=NC#N)=C(C)NC=N1,inactive +CC(OC(=O)OC1CCCCC1)OC(=O)c5cccc6nc(OCC)n(Cc2ccc(cc2)c3ccccc3C\4=N\N=N/N/4)c56,inactive +N#[N+][O-],inactive +[Ni],inactive +CC#N,inactive +CC(=O)NNC(=O)C,inactive +CN(C)CCN(CC1=CC=CO1)C2=CC=CC=N2,inactive +NCCS(O)(=O)=O,inactive +C1CCCNCCC1,inactive +Cl.O=C(c2cn(C)c1ccccc12)[C@H]3CC=4N\C=N/C=4CC3,inactive +.[Cl-].[Fe+3].[Cl-].[Cl-],inactive +Cl.CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(cccc1O)[C@@](C)(O)[C@H]4C[C@@H]23,inactive +OCCOCCOC1=CC=C(CCCCCCCCC)C=C1,inactive +ClC1=C(C=CC(=C1)Cl)OS(=O)(=O)C2=CC=CC=C2,inactive +[Ca+2].[N-2]C#N,inactive +CC(=C)C#N,inactive +N(N(CC(O)=O)CC(O)=O)=O,inactive +C1C(CC(CC1(OOC(C)(C)C)OOC(C)(C)C)(C)C)C,inactive +CC(Cl)(Cl)Cl,inactive +CC(Cl)Cl,inactive +COc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C)c4cc3,inactive +C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2,inactive +CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3,inactive +O=C(NC1=CC=CC=C1)OC(C)C,inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1.Cl,inactive +[Cl-].OC[P+](CO)(CO)CO,inactive +C=C(Cl)C=C,inactive +O=[C@](O[C@H](O[C@H](CO)[C@H]1O)[C@H](O)[C@H]1O)[C@@]5(C)[C@](CC3)([H])[C@](CCC5)(C)[C@@](CC4)([H])[C@@](C2)3C[C@]4(O[C@H]6[C@H](O[C@H]7[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O7)[C@@H](O)[C@H](O)[C@@H](CO)O6)[C@@]2=C,inactive +CBr,inactive +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,inactive +NC(=O)CC1=C2C(=CC=C1)C=CC=C2,inactive +NC(=O)C1=NC=CN=C1,inactive +NC(=O)CCCCC(=O)N,inactive +Cl\C2=C(/Cl)C3(Cl)C1COS(=O)OCC1C2(Cl)C3(Cl)Cl,inactive +NC(=O)C1=C(C=CC=C1)C(=O)N,inactive +CN1C2=CC=C(C=C2C(=NC(C1=O)O)C3=CC=CC=C3)Cl,inactive +NC(=O)C1=CC=NC=C1,inactive +CC(=O)O[Sn](OC(=O)C)(CCCC)CCCC,inactive +IC(I)I,inactive +C=CC=O,inactive +NC(=S)NC1=C2C(=CC=C1)C=CC=C2,inactive +ClC(C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)(Cl)Cl,inactive +C12=C(C(=O)NS1(=O)=O)C=CC=C2,inactive +CN(C)CCN(CC1=CC=CS1)C2=CC=CC=C2,inactive +C12(C(=C(/N=N/C3=C(C4=C(C(=C3)S(=O)(=O)[O-])C=CC=C4)O)C=CC=1S(=O)(=O)[O-])C=CC=C2).[Na+].[Na+],inactive +S=C(S[Se](SC(=S)N(C)C)(SC(=S)N(C)C)SC(=S)N(C)C)N(C)C,inactive +NC(=N)NC#N,inactive +N1=CC=CC2=CC=CC(=C12)O[Cu]OC3=CC=CC4=CC=CN=C34,inactive +C12C(C3C(CC1C3)NC(N(C)C)=O)CCC2,inactive +C1=CC(=CC=C1NNC(CC[C@@H](C(O)=O)N)=O)CO,inactive +N12([C@@H]([C@@H](C1=O)NC(COC3=CC=CC=C3)=O)SC([C@@H]2C(=O)[O-])(C)C).[K+],inactive +N1=C(SC2=C1C=CC=C2)SN3CCOCC3,inactive +CN(C)C(C)=O,inactive +C([O-])(C)=O.[O-]C(C)=O.[Ni+2],inactive +N1=C(SNC2CCCCC2)SC3=C1C=CC=C3,inactive +O=[N+](C1=CC=C(C=C1)N)[O-],inactive +N1C2=C(C=CC=C2)SC3=CC=CC=C13,inactive +C1(=CC(=C(C(=C1)N)C)N).[H]Cl.[H]Cl,inactive +CC(C1=CC(=C(C=C1O)C)SC2=CC(=C(C=C2C)O)C(C)(C)C)(C)C,inactive +N1C(N(CC(C1=O)C)N=O)=O,inactive +N1C(=NC2=C1C=CC=C2)C3=CSC=N3,inactive +OC1=C(C=C(C=C1SC2=C(C(=CC(=C2)Cl)Cl)O)Cl)Cl,inactive +OCC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4,inactive +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC=C(C=C3)O,inactive +O=C(CN1C(=O)CCC1)NC2=C(C=CC=C2C)C,inactive +CC1CC(OC(O1)C)OC(=O)C,inactive +ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl,inactive +O=C(COC1=C(Cl)C=C(Cl)C=C1)OCC(CC)CCCC,inactive +O=C(CC(/C=C/C2=CC=C(O)C(OC)=C2)=O)/C=C/C1=CC=C(O)C(OC)=C1,inactive +O[C@H]1[C@@H](NC(CO)CO)C[C@](O)(CO)[C@@H](O)[C@@H]1O,inactive +OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO,inactive +O[C@H]([C@@H]2O)[C@@H](O[C@@H]2CO)N1C(N=CN=C3NC)=C3N=C1,inactive +C=CC1=CC=C(C=C1)C,inactive +Clc1c([N+]([O-])=O)c(Cl)c(Cl)c(OC)c1Cl,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)OCCCC,inactive +NC(=O)C1=CC=CN=C1,inactive +ClC1=C(C=CC(=C1)N)C,inactive +O=C(O)COC1=C(C)C=C(Cl)C=C1,inactive +C[C@@H]3O[C@]1(CS3)C2CCN(CC2)C1.C[C@@H]6O[C@]4(CS6)C5CCN(CC5)C4.O.Cl.Cl,inactive +CS(=O)(=O)OCCCNCCCOS(C)(=O)=O.[H]Cl,inactive +FC(F)(Cl)Cl,inactive +ClC1=C(Cl)N=C(C(O)=O)C(Cl)=C1N,inactive +O=P(OC2=CC=C(C)C=C2)(OC3=CC=C(C)C=C3)OC1=CC=C(C)C=C1,inactive +ClC1=C(Cl)C=CC([C@H]2C3=C(C=CC=C3)[C@@H](NC)CC2)=C1.Cl,inactive +C(C(=O)[O-])(O[Ti](OC(C(=O)[O-])=O)=O)=O.[K+].[K+],inactive +C1(=C(C=CC(=C1)[C@H](CN[C@@H](CCC2=CC=CC=C2)C)O)O)C(N)=O.[H]Cl,inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1,inactive +O=C(C1=C(C=CC=C1)C(=O)OCC=C)OCC=C,inactive +[Na+].[O-]Cl=O,inactive +N(=C(C=1)C)N(C(C)C)C=1OC(=O)N(C)C,inactive +C1([C@H](CNC)O)(=CC(=CC=C1)O).[H]Cl,inactive +O=C(C2=CC=CC=C2)S\C(CCOC(C3=CC=CC=C3)=O)=C(C)/N(C=O)CC1=CN=C(C)N=C1N.Cl,inactive +ClCl,inactive +O=C(C1=CC=CC=C1)CCl,inactive +ClC1=CC=CC=C1C=C(C#N)C#N,inactive +O=C(C1=CC=CC=C1)OOC(=O)C2=CC=CC=C2,inactive +CC(C)(CO)CCCCCCC(C)(C)CO,inactive +O=C(O[C@H](CC)C(/C=C(C)/C=C/C4=O)CO[C@H](O[C@H](C)[C@H]2O)[C@H](OC)[C@@H]2OC)C[C@@H](O)[C@H](C)[C@H]([C@@H](CC=O)C[C@H]4C)O[C@H]1[C@H](O)[C@@H](N(C)C)[C@H](O[C@H](O[C@@H](C)[C@@H]3O)C[C@@]3(C)O)[C@@H](C)O1.OC(C)C(O)=O,inactive +C[N+](CCCCCCCCCCCC)(C)[O-],inactive +O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2,inactive +O=C(O)CC[C@@H](C)[C@]3([H])[C@](CC2)(C)[C@](CC3)([H])[C@@](CC4)([H])[C@@]2([H])[C@]1(C)[C@@]4([H])C[C@H](O)CC1,inactive +O=C(O)\C=C/C(O)=O.O=C(NC3CC(N4C)CCC4C3)C1=C2C(CC(C)(C)O2)=CC(Cl)=C1,inactive +ClC1=C(C=CC(=C1)Cl)O,inactive +C/C=C/C1=CC2=C(C=C1)OCO2,inactive +O=C(NN)OC,inactive +ClC4=C(C=CC=C4)C2=NC(C)C1=NN=C(C)N1C3=C2C=C(CCC5=CC=C(CC(C)C)C=C5)S3,inactive +C1(C=CC=CN=1)CCl.Cl,inactive +C1(=CC=C2C(=C1)N(C(\N=C/2C3=CC=CC=C3)=O)C(C)C)C,inactive +O=C(O[C@H](CC)[C@](O)(C)[C@H](O)[C@@H](C)C2=O)[C@H](C)[C@@H](O[C@H]3C[C@](OC)(C)[C@@H](O)[C@H](C)O3)[C@H](C)[C@H]([C@@](O)(C)C[C@H]2C)O[C@H]1[C@H](O)[C@@H]([N@H+](C)C)C[C@@H](C)O1.[O-]C(CCCCCCCCCCCCCCCCC)=O,inactive +P,inactive +CC(C)NCC(O)COC1(=CC=C(C=C1)CC(=O)N).[H]Cl,inactive +O=C(O)Cc1ccc(cc1)NC(C)=O,inactive +S=C(N(C)C)S[Bi](SC(=S)N(C)C)SC(=S)N(C)C,inactive +O=C(O[C@@H]1[C@@](O[C@@H](O[C@H](COC(C)=O)[C@H]2OC(C(C)C)=O)[C@H](OC(C(C)C)=O)[C@H]2OC(C(C)C)=O)(COC(C)=O)O[C@H](COC(C(C)C)=O)[C@H]1OC(C(C)C)=O)C(C)C,inactive +CC3=CC=C(C=C3)\C(C2=CC=CC=N2)=C/CN1CCCC1.O.Cl,inactive +C=C(F)F,inactive +C=C/C=N/O,inactive +FC(F)Cl,inactive +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2,inactive +C\1=C/C(O[C@@H](C/C=C/C=C/C=C/C=C/[C@@H](C[C@@H]3O[C@](C[C@H](C[C@H]2O[C@H]/12)O)(C[C@@H]([C@H]3C(O)=O)O)O)O[C@@H]4O[C@@H]([C@H]([C@@H]([C@@H]4O)N)O)C)C)=O,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)O,inactive +O=C(N1)N(C2OCCC2)C=C(F)C1=O,inactive +C=CC(OCC)OCC,inactive +O=C(NC1=CC=CC(=C1)Cl)OC(C)C,inactive +O=C(NC1=CC=CC(=C1)C(F)(F)F)N(C)C,inactive +ClC1=C(C=C(C=C1)Cl)OC(C(=O)O)C,inactive +C1(=C(C=CC(=C1)CCNC)OC(C(C)C)=O)OC(C(C)C)=O.[H]Cl,inactive +CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C,inactive +CC([N+](=O)[O-])C,inactive +C/C=C/C1=CC=C(C=C1)OC,inactive +C=CCCl,inactive +C1(=CC(=CC=C1N)N).[H]Cl.[H]Cl,inactive +O=S(C1=CC=C2C(C=CC(O)=C2\N=N/C3=CC=C(S(=O)([O-])=O)C=C3)=C1)([O-])=O.[Na+].[Na+],inactive +CC1=CC=CC=C1OCC(O)CNCCN2/C=C(/C)C(=O)NC2=O.[H]Cl,inactive +O=C(N(CCCC)CC)SCCC,inactive +ClC1=CC2=C(C=C1)OC3=C(C=CC(=C3)Cl)O2,inactive +O=[C@]([C@@H]1C[C@@H](O)CN1N=O)O,inactive +Cl[Mg]Cl.O.O.O.O.O.O,inactive +C1(=CC=C(N)C=C1)OC.[H]Cl,inactive +ClC1=NC(=NC(=N1)NC(C)C)NC(C)C,inactive +[Na+].CN(C)c1ccc(/N=N/S([O-])(=O)=O)cc1,inactive +O=[N+](C1=CC(=C(C=C1)N)N)[O-],inactive +ClC(=C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC,inactive +CC1=CC=CC2=CC=CN=C12,inactive +O=[N+](C1=CC(=C(C(=C1)Cl)N)Cl)[O-],inactive +O=[N+](C1=C2C(=CC=C1)C=CC=C2)[O-],inactive +OC(CN(C1=CC=C(N=N1)NN)C)C.Cl.Cl,inactive +O=[N+](C1=CC(=C(C=C1)C(=O)O)N)[O-],inactive +O=C(O[C@@H]2C[C@@H](CC3)N(C)[C@H]3C2)C(CO)C1=CC=CC=C1,inactive +O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4,inactive +O=C(OC)C1=C(C)NC(C)=C(C(OCCC3=CC=C(N4CCN(C(C6=CC=CC=C6)C5=CC=CC=C5)CC4)C=C3)=O)C1C2=CC([N+]([O-])=O)=CC=C2.Cl.Cl,inactive +O[C@@H]8[C@@H](O)[C@@H]1O[C@H](CO)[C@H]8O[C@H]7O[C@H](CO)[C@@H](O[C@H]6O[C@H](CO)[C@@H](O[C@H]5O[C@H](CO)[C@@H](O[C@H]4O[C@H](CO)[C@@H](O[C@H]3O[C@H](CO)[C@@H](O[C@H]2O[C@H](CO)[C@@H](O1)[C@H](O)[C@H]2O)[C@H](O)[C@H]3O)[C@H](O)[C@H]4O)[C@H](O)[C@H]5O)[C,inactive +[Na+].[O-]S(=O)(=O)c4ccc(c1c3cc(C)c(cc3[o+]c2cc(c(C)cc12)N(CC)CC)N(CC)CC)c(c4)S([O-])(=O)=O,inactive +O[As](O)(C)=O,inactive +C1(C(COCCOC(=O)CCCCCCCC=CCCCCCCCC)OCCO)OC(OCCO)CC1OCCO,inactive +O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO,inactive +C([O-])(=O)CN(CC(=O)O)CCN(CC([O-])=O)CC([O-])=O.[Na+].[Na+].[Na+].[H]O[H].[H]O[H].[H]O[H],inactive +O[C@H]1[C@H](O[C@H](CO)[C@@H](O)[C@@H]1O)O[C@]2(CO)O[C@H](CO)[C@@H](O)[C@@H]2O,inactive +OC1=CC=C(C=C1)C2=CC=CC=C2,inactive +CC(OC1=CC=C(C=C1)NC2=CC=CC=C2)C,inactive +O[C@H]1[C@H](OC[C@H]2O[C@@H](OC(/C(C)=C/C=C/C(C)=C/C=C/C=C(C)/C=C/C=C(C)/C(O[C@H]3[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O4)O3)=O)=O)[C@H](O)[C@@H](O)[C@@H]2O)O[C@H](CO)[C@@H](O)[C@@H]1O,inactive +ClC1=NC(=NC(=N1)NCC)NCC,inactive +C1(C(=CC=C(C=1)NC(C(C)=C)=O)Cl)Cl,inactive +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl,inactive +ClC1=CC(=CC=C1OCC(=O)OC(C)C)Cl,inactive +O=C(C)NCCSP(=S)(OC)OC,inactive +C1(=N\CCN/1)C(C)OC2C(=CC=CC=2Cl)Cl.[H]Cl,inactive +N(N(CC(F)(F)F)CC(F)(F)F)=O,inactive +O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N,inactive +ClC1=CC(=C(C=C1SC2=CC=C(C=C2)Cl)Cl)Cl,inactive +O=S([N-]C1=O)(OC(C)=C1)=O.[K+],inactive +ClC1=CC(Cl)=C(/N=N/C(C(=O)NC2=C(C=C(C3=CC(C)=C(NC(=O)C(/N=N/C4=C(Cl)C=C(Cl)C=C4)C(=O)C)C=C3)C=C2)C)C(=O)C)C=C1,inactive +O=C(C(=NOC(=O)NC)SC)N(C)C,inactive +O=C(C(=C)C)OC,inactive +C(C\C=C/CCCCCCCC)CCCCCC(=O)[O-].[Na+],inactive +O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC,inactive +ClC1=CC(=C(C=C1C2=C(C=C(C(=C2)Cl)N)Cl)Cl)N,inactive +OC1=C(C=C(C=C1C(C)(C)C)C)CC2=CC(=CC(=C2O)C(C)(C)C)C,inactive +O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1,inactive +O=C(C(C1=CC=CC=C1)(C2=CC=CC=C2)CC(N(C)C)C)CC.[H]Cl,inactive +O=C(C(SP(=O)(OC)OC)CC(=O)OCC)OCC,inactive +O=C(C(O)(C2=CC=CC=C2)C1CCCCC1)OC(C)(C)C#CCN(CC)CC.O.Cl,inactive +O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+],inactive +O=[N+](C1=CC2=CC=CN=C2C=C1)[O-],inactive +C12C(=C(C=CC=1NC(C)=O)S(=O)(=O)[O-])C=C(C(=C2O)/N=N/C3=C4C(=C(C=C3)/N=N\C5=CC=C(C=C5)S(=O)(=O)[O-])C=CC(=C4)S(=O)(=O)[O-])S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],inactive +C1(=C2C(=CC=C1N)C=CC=C2)S(=O)(O)=O,inactive +[Cl-].[Ba+2].[Cl-].O.O,inactive +O=C(C1=CC(=C(C(=C1)O)O)O)OCCC,inactive +CC1=CC2=CC=CN=C2C=C1,inactive +NC(=O)NCCCC,inactive +O=[N+]([O-])[O-].[Na+],inactive +O=C([C@H](CC1=CC=CC=C1)NC(=O)[C@H](CC(=O)O)N)OC,inactive +O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1,inactive +O=C([O-])C(C(/C(CC([O-])=O)=C([C@@H](CCC([O-])=O)[C@@H]5C)\N=C5/C=C4\[N-]\C(C(C=C)=C4C)=C3)=N2)=C(C)/C2=C/C1=C(CC)C(C)=C/3[N-]1.[Na+].[Na+].[Na+].[Cu+2],inactive +C1(=C(C=CC=C1N)N).[H]Cl.[H]Cl,inactive +C1(=C2/C(C3=CC(S(=O)(=O)[O-])=CC=C3N2)=O)/C(C4=CC(S(=O)(=O)[O-])=CC=C4N1)=O.[Na+].[Na+],inactive +O=[N+](CCC)[O-],inactive +O=[W](=O)([O-])[O-].[Na+].[Na+],inactive +C1(=C(C)C2OC(CCC=2C(=C1OC(=O)C)C)(CCCC(CCCC(CCCC(C)C)C)C)C)C,inactive diff --git a/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_MultiCellCall_no_duplicates.csv b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_MultiCellCall_no_duplicates.csv new file mode 100644 index 0000000..333d7a6 --- /dev/null +++ b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_MultiCellCall_no_duplicates.csv @@ -0,0 +1,1113 @@ +STRUCTURE_SMILES,ActivityOutcome_CPDBAS_MultiCellCall +NN,active +C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl,active +O=S(C1=NC2=C(C=CC(=C2)OC)N1)CC3=C(C(=C(C=N3)C)OC)C,active +N(NCCCC)CCCC.Cl.Cl,active +N#[N+]C1=CC=CC=C1.O=S([O-])(O)=O,active +O=NN(CC=C1)CC1,active +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O,active +CC(=C)C=C,active +NNC1=CC=CC=C1.[H]Cl,active +N(N)(CCCC)C=O,active +N(NCC=C)CC=C.[H]Cl.[H]Cl,active +N(NC)C.[H]Cl.[H]Cl,active +O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H],active +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl,active +N1(C2=CC=CC=C2)C(C(N(CS(=O)(=O)[O-])C)=C(N1C)C)=O.[Na+],active +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,active +N1=CC=CC=C1,active +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O,active +N1=C(N=C(N(CO)CO)N=C1N(CO)CO)N(CO)CO,active +N=C(N(CC)N=O)N[N+]([O-])=O,active +O=[N+](C1=CC(=C(C=C1)C)N)[O-],active +N#CN(CC)N=O,active +NNC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1,active +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1,active +N=C(N(N=O)C)N[N+](=O)[O-],active +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2,active +N(C1=CC=CC=C1)NC2=CC=CC=C2,active +N(C(=O)N)(N=O)CC(=O)O,active +N(CC(C)O)(CC=C)N=O,active +C(NN)(N)=O.Cl,active +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2],active +NC1=CC=C(C2=CC=C(N)C=C2)C=C1,active +O=C1N(CCC1)C,active +F/C(F)=C(\F)F,active +CCCCOCCO,active +FCCl,active +FC(F)(F)CNC(=N)Nc1ccn(CCCCC(N)=O)n1,active +N(CCN(C)C)(C)N=O,active +N(CCCCO)(CCCC)N=O,active +N(CCCCCCCCCCCCCC)(C)N=O,active +N(N)(CC)C=O,active +N(N(CCCO)C)=O,active +C1(=CC=C(Cl)C=C1)N.[H]Cl,active +N(CC(CO)O)(CC(O)C)N=O,active +N(CC(CO)O)(CC(C)=O)N=O,active +N(CC(CO)O)(C)N=O,active +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-],active +N(CCCC(F)(F)F)(CCCC(F)(F)F)N=O,active +N(CC=C)(CCO)N=O,active +[O-]\[N+](CC)=N/C,active +NC1=CC=C(C=C1)C2=CC=CC=C2,active +NC1=CC=C(C=C1)C2=CC=C(C=C2)F,active +NC1=CC=CC(C)=C1.[H]Cl,active +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)Cl,active +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+],active +NC1=CC(=CC=C1C)Cl,active +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+],active +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,active +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl,active +NC1=CC=C(/C=C/C2=CC(OC)=CC=C2OC)C=C1,active +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl,active +NC1C=CC2=C(N=1)NC3=CC=CC=C23,active +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1,active +NC3=CC1=C(C=C3)OC2=C1C=CC=C2,active +NC2=NC(C3=CC=CC=C3)=C(CCOCC)C1=NC=NN12,active +O=NN(C)CCOS(C1=CC=C(C)C=C1)(=O)=O,active +[O-][N+](C2=CC=C(O2)C1=CSC(NN(C)C)=N1)=O,active +NC1=CC2=C(C=CC=C2)C=C1,active +NC1=CC=CC=C1[H]Cl,active +O=S(\N=C(NCCSCC2=CC=C(CNC)O2)/NCC(C1=CC=C(O)C=C1)O)(C)=O,active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C,active +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1,active +NC(=O)NNC1=CC=CC=C1,active +O=[N+](C1=CC=CC2=CC=CN=C12)[O-],active +NC(=O)N(CC=C)N=O,active +NC(N3C)=NC2=C3C(C)=CC1=NC=CC=C12,active +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+],active +NC(=O)OC=C,active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O,active +N1(C(=CN=C1C)[N+](=O)[O-])CCO,active +O(C)c1cc(CC=C)ccc1OC,active +CCBr,active +NC(=O)C=C,active +N/1C(N(\C=C\1)C)=S,active +CC(C)(O)CC[C@@H](O)[C@@H](C)[C@H]2CC[C@@]1(O)C/3=C/C(=O)[C@@H]4C[C@@H](O)[C@@H](O)C[C@]4(C)[C@H]\3CC[C@@]12C,active +NC1=C(C=CC(=C1)N)Cl,active +NC1=C(C=CC(=C1)N)C,active +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N,active +NC1=C2C(=CC=C1)C(=CC=C2)N,active +NC1=C(C=CC=C1)C(=O)OC/C=C/C2=CC=CC=C2,active +NC1=C(C=C(C=C1Cl)Cl)Cl,active +O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.[Mg+2],active +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl,active +NC1=C(C=CC(=C1)Cl)N,active +Cl\C=C\CCl,active +NC1=C(C=C(C=C1Cl)N)Cl,active +ClC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N,active +ClC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)Cl)N,active +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br,active +ClC1=C(C=CC=C1)[N+](=O)[O-],active +[H][C@]12N(CC=C2COC([C@@](O)(C(O)(C)C)[C@H](C)OC)=O)CC[C@@H]1OC(\C(C)=C/C)=O,active +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-],active +ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl,active +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +ClC#CCl,active +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl,active +CCN(CC)N=O,active +OCC1CO1,active +ClC1C(C(C(Cl)C(C1Cl)Cl)Cl)Cl,active +O=C(N(CCCCC)N=O)OCC,active +ClC1=NC(SCC(NCCO)=O)=NC(NC2=CC=CC(C)=C2C)=C1,active +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,active +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O,active +ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12,active +ClC1=CC=C(C=C1)Cl,active +ClC1=C(Cl)C(Cl)=CC2=C1OC3=C(C=C(Cl)C(Cl)=C3Cl)O2,active +O=NN(CCCCCC1)CCCCCC1,active +C1(C(=CC=C(C=1)C)C)N.[H]Cl,active +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2,active +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3,active +BrC(Br)Br,active +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,active +NC1=C(C=C2C3=C(C=CC=C3)OC2=C1)OC,active +ClC(C(=O)O)(Cl)Cl,active +ClC(=CCl)Cl,active +C[C@@H](CC)C(=O)O[C@H]2C[C@@H](C)\C=C3\C=C/[C@H](C)[C@H](CC[C@@H]1C[C@@H](O)CC(=O)O1)[C@@H]23,active +C1CCCO1,active +O=[N+](C1=CC=C(C=C1)Cl)[O-],active +Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl,active +Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,active +Cl[C@@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl,active +ClC(Cl)(Cl)Cl,active +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C,active +ClC(CC(Cl)C(Cl)CCC(Cl)CC)C(Cl)C(Cl)CCl,active +ClC/C=C/CCl,active +ClC(Cl)C(F)(F)F,active +ClC(Cl)Br,active +ClC(C(Cl)(Cl)Cl)(Cl)Cl,active +NC(=O)OCC,active +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,active +CCCC1=CC2=C(C=C1)OCO2,active +C1=CC=CC=C1,active +ClC(C(Cl)Cl)(Cl)Cl,active +O=NN1CCCCCCC1,active +CN(N=O)C1=CC=C(C=C1)C=CC2=C3C=CC=CC3=NC=C2,active +CN(N=O)C(=O)NCCC[C@H](N)C(O)=O,active +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC,active +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N,active +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O,active +CN(CCCCCCCCCCC)N=O,active +CN(CC)N=O,active +CN(CC(C)=O)N=O,active +CN(N=O)C,active +C1N(C(OC1)=O)N=O,active +CN(CCO)N=O,active +COC2=CC=C(C=C2)CN(CCN(C)C)C1=NC=CC=C1.OC(\C=C/C(O)=O)=O,active +COC1C=C(C=CC=1C2NC3=CN=CC=C3N=2)S(C)=O,active +O=C1NC(=O)NC=C1,active +C=CC1=CC=CC=C1,active +CS(=O)(=O)OC,active +O=C1C(=CNC(=O)N1)F,active +CNN,active +CN1N(C2=CC=CC=C2)C(=O)C=C1C,active +CN1CC[C@H]2OC(=O)C3(C[C@@H](C)[C@@](C)(O)C(=O)OC\C(=C\C1)C2=O)O[C@@H]3C,active +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2,active +COC1=C(O)C=CC(=C1)C=NNC(=O)C2=CC=NC=C2,active +COC1=C(C=CC=C1)[N+](=O)[O-],active +ClCC1=CC=CC=C1,active +ClCC(Cl)CCl,active +Cn3nc(CO)nc3NCCCOc2cc(CN1CCCCC1)ccc2,active +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl,active +ClCCl,active +N(CC(CO)O)(CC=C)N=O,active +ClC2=C(C=CC=C2Cl)C1=C(Cl)C=C(Cl)C=C1,active +ClC2=C(C=CC(Cl)=C2Cl)C1=C(Cl)C(Cl)=CC=C1,active +O=C(N(C)C)Cl,active +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl,active +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl,active +O=C(NCO)C=C,active +CN(C)CNc2nnc(/C=C/c1ccc(o1)[N+]([O-])=O)o2,active +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,active +NC(=O)N(CC)N=O,active +CN(C1=CC=CC=C1)N=O,active +ClC(C(Cl)Cl)Cl,active +CN(C)N,active +ClCCN[P]1(=O)OCCCN1CCCl,active +ClCCN(CCCl)C1=CC=C(CC(OC3=CC=C(C4=C3)[C@]2([H])[C@](CC4)([H])[C@@](CC[C@@H]5OC(CC6=CC=C(N(CCCl)CCCl)C=C6)=O)([H])[C@]5(C)CC2)=O)C=C1,active +ClCCN(CCCl)[P]1(=O)NCCCO1,active +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1,active +CN(C(=O)N)N=O,active +ClCOCCl,active +SC1=NC2=C(C=CC=C2)S1,active +O=NN1CCCCC1,active +O=[N+](C1=CC2=C(C=C1)NC=N2)[O-],active +O=NN1CCC(=O)NC1=O,active +O=NN1CCOCC1,active +CN[N+](=O)[O-],active +O=NN1CCCCCC1,active +O=C4C=C2[C@@](CC4)([H])[C@]1([H])[C@](CC2)([H])[C@@](CC3)([H])[C@@](CC1)(C)[C@]3(OC(C)=O)C#C,active +O=NN(CCCC)CCCC,active +O=NN(CCC)CCC,active +O=NN(CCO)CCO,active +S=C(N1CCOCC1)SN1CCOCC1,active +O=NN(CCN(C)C)C(=O)[NH2+]CC.[O-]N=O,active +Cl.CCCCNN,active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C.[H]Cl,active +O=P(OCCCl)(OCCCl)OCCCl,active +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N,active +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC,active +ClC(Cl)Cl,active +O=P(OC(CCl)CCl)(OC(CCl)CCl)OC(CCl)CCl,active +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,active +O=NN1CCSCC1,active +O=NN1CCN(N=O)CC1,active +ClC(CCl)(Cl)Cl,active +O=P(OC=C(Cl)Cl)(OC)OC,active +O=P(H)(OC)OC,active +O=C1OC2=C(C=CC=C2)CC1,active +O=C1OC2=C(C=CC=C2)C=C1,active +O=CC1=CC=CO1,active +OC1=C(C=CC(=C1)/C=C/C(=O)O)O,active +O=C3C[C@@H]4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](C)(O)CC[C@@H]12)[C@@]4(C)C\C3=C\O,active +O=C1N2CC3=CC=CC=C3C(=O)N2CC4C=CC=CC1=4,active +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC,active +O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,active +O=C1OC(O)C(C(Cl)Cl)=C1Cl,active +[K+].[I-],active +O=C1NC(=S)NC=C1,active +NC2=CC=C(C=C2N)C1=CC=C(N)C(N)=C1.Cl.Cl.Cl.Cl,active +O=NN(C)CCCCCCCCCCCC,active +O=NN(C)C1=NC=NC2=C1N=CN2[C@@H]3O[C@H](CO)[C@@H](O)[C@H]3O,active +O=NN(CC(C)O)CC(C)O,active +O=NN(CC(=O)C)CC(=O)C,active +O=NN(C1=CC=CC=C1)C2=CC=CC=C2,active +C=C(Cl)C=C,active +O=CC1=CC=CC=C1,active +C1=C(CO)OC=C1,active +C1(N=C(SC=1)NN)C2=CC=C(C=C2)N,active +O=N[O-].[Na+],active +O=CNNC=O,active +[O-][N+](C2=CC=C(O2)C1=CSC=N1)=O,active +OCC(CO)(CBr)CBr,active +CC=NN(C)C=O,active +O=C(OCC)C=C,active +OCCBr,active +ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N,active +OC1=C(C=CC(=C1)C)O,active +BrC2=C(C=C(Br)C(Br)=C2)C1=C(Br)C=C(Br)C(Br)=C1,active +OC1=C(C=C(C=C1Cl)Cl)Cl,active +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1,active +OC1=CC=C(C=C1C(C)(C)C)OC,active +OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O,active +O=NN(CCN1)CC1,active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N,active +O(CC1(C)C)C1=O,active +S=P(N1CC1)(N1CC1)N1CC1,active +ClCOC,active +S=C(NCC)NCC,active +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O,active +O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+],active +OCCN(CCO)CCO,active +P(=O)(OC)(OC)N1CCOCC1,active +C[N+](=NC)[O-],active +OS(=O)(=O)O.NN,active +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-],active +N(CCCCCCCCCC)(C)N=O,active +OC(=O)C(C)(C)CCCOc1ccc(OCCCC(C)(C)C(O)=O)c(c1)c2ccccc2,active +OC(=O)CN(CC(=O)O)CC(=O)O,active +OC(=O)CCCCCCCCCCN,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,active +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C,active +Br(=O)(=O)[O-].[K+],active +O(C1=CC=CC=C1)CC2CO2,active +C1CO1,active +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N,active +NNCCC.[H]Cl,active +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C,active +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C,active +OC1=C(C=C(C=C1)CNC(=O)CCCC/C=C/C(C)C)OC,active +BrCCBr,active +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl,active +CCC1=CC=CC=C1,active +C1(/N=N/C2=CC=CC=C2)=CC=CC=C1,active +O=C(CCC(=O)O)NN(C)C,active +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O,active +COC1=CC=C(C=C1)O,active +S=C(N(CC)CC)SCC(=C)Cl,active +ClC(C1=CC=CC=C1)(Cl)Cl,active +O=[N+](OC(CO[N+](=O)[O-])CO[N+](=O)[O-])[O-],active +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2,active +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O,active +O=C(C(C)(OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl)C)OC,active +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],active +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-],active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O,active +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2,active +O=NN1CCCC1,active +O=[N+](C1=CC=C2C3=C4C(=CC=C13)C=CC=C4C=C2)[O-],active +O=C(C1=CC=CC=C1)NN,active +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C,active +COC1=CC(=C(C=C1)N)C,active +O=C(C1=CC=NC=C1)NN,active +O=C(C1=CC=CN=C1)NN,active +[Se]=S,active +O=C1C=C(NC(=S)N1)CCC,active +O=C(C)NCC1=NC(=NO1)C2=CC=C(O2)[N+]([O-])=O,active +O=C(C)NC3=CC=C(C2=C3)C1=C(C2=O)C=CC=C1,active +[O-]\[N+](C)=N/CC,active +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC,active +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O,active +N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O,active +N1C=CC=C(C=1)C2N(N=O)CCC2,active +O[C@H]([C@H]([C@@H]([C@@H](CO)O1)O)O)[C@@H]1OC/N=[N+](C)\[O-],active +C=CCNN.[H]Cl,active +[O-][N+](C3=CC=C(O3)C1=CN=C2N1C=CC=C2)=O,active +N(N1CCCCC1C2=CC=CN=C2)=O,active +NN(CCCC)CCCC,active +NN(C=O)CCC,active +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O,active +O=S1(=O)CCCO1,active +NNC1=NC(=CS1)C2=CC=C(O2)[N+]([O-])=O,active +O=[N+]([O-])C3=CC=C(O3)/C=N/N1C(O[C@@H](CN2CCOCC2)C1)=O.Cl,active +O=[N+](C1=CC=CC=C1)[O-],active +C1(CN(N=O)CC(O1)C)C,active +Cl.CC(=O)O[C@@H](CC)C(C[C@H](C)N(C)C)(c1ccccc1)c2ccccc2,active +O=[N+](C1=CC(=C(C=C1)OC)N)[O-],active +OC(=O)C(Cl)Cl,active +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,active +O=C(N(CCO)N=O)NCC,active +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr,active +ClCC1CO1,active +C1CN1,active +BrC(CCl)CBr,active +O=NN(CCN1N=O)CCC1,active +O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C,active +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,active +O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N,active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-],active +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N,active +OC(COC(C)(C)C)C,active +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O,active +O=C(O[C@@H]1CC[N+]2([O-])[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C,active +O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1,active +O=C1[C@H]3[C@H](C3)[C@@]([C@]4([H])[C@@]([C@@]5([H])[C@]([C@@](CC5)(OC(C)=O)[C@@](C)=O)(C)CC4)([H])C=C2Cl)(C)C2=C1,active +O=C(OC)C1=CCCN(C)C1.[H]Cl,active +OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2,active +O=C1C23C4C5C6(C(=O)C7=C(O)C(C)=CC(=C7C(C6=C(C2C5O)O)=O)O)C(C4O)C(=C3C(=O)C8=C1C(O)=C(C)C=C8O)O,active +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N,active +O=C1N(C=C)CCC1,active +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl,active +O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl,active +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC,active +O=C(N(CCCC)N=O)N,active +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O,active +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O,active +O=C1C2=C(C=CC=C2C(=O)C3=C1C=CC=C3)O,active +O=C(CN=C2C3=CC=CC=C3)NC1=C2N(N=C1C)CC,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl,active +O=C(N(CC)N=O)OCC,active +O=C(N(CC(C)O)N=O)NCCCl,active +O=C(N(CC)N=O)NCCO,active +O=C(N(CCCC)N=O)NCCCC,active +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC,active +OC1=CC2=C(C=C1)OCO2,active +O=C(CC(C)C)OCC=C,active +[O-]\[N+](CC)=N/CC,active +NC(CCSCC)C(=O)O,active +O=C(N(C)C)NC1=CC=C(C=C1)Cl,active +ClC2=C(C=CC(Cl)=C2Cl)C1=C(Cl)C(Cl)=C(Cl)C=C1,active +O=C(NC2=C1C=C(C3=NNC(CC3)=O)C=C2)C1(C)C,active +O=C(NC2=C(Cl)C=NC=C2Cl)C1=CC(OC3CCCC3)=C(OC)C=C1,active +O=C1C=CC(=O)C=C1,active +CC1=NC=CN1,active +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,active +S=C1NCCN1,active +O=C(N(CCO)N=O)N,active +O=C(N(CCCO)N=O)N,active +O=C(N(CCCCCC)N=O)N,active +O=C(N)C1=C(N=CN1)/N=N/N(C)C,active +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,active +O=C(N(CCO)N=O)NCCCl,active +CC1SC(SC(N1N=O)C)C,active +[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O,active +C1=C(C(=CC(=C1N)C)C)C.[H]Cl,active +C1=C2C(=CC=C1)C=CC=C2,active +C1=C(C=CC=C1OCC2CO2)OCC3CO3,active +OC1=C(C=CC=C1)O,active +C1(NNC(C)=O)=CC=CC=C1,active +C(C1C=CC=CC=1)(=O)N(N=O)C,active +O=C=NC1=CC(N=C=O)=CC=C1C,active +CC(=S)N,active +C1=COC=C1,active +C1=CC=CC=C1C(COC(N)=O)COC(N)=O,active +ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl,active +C1=COC2=C1C=CC=C2,active +C1=CC=CC(=C1)CCN(C)N=O,active +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,active +N(NC(C)=O)C1=CC=C(C=C1)CO,active +NC(=O)Cc2c([O-])on[n+]2Cc1ccccc1,active +C1=CC=C2C(=C1)N=C(N=C2N(CCO)CCO)C3=CC=C(S3)[N+]([O-])=O,active +C1(N=CNN=1)N,active +C1(=CC=C(N)C=C1)C.[H]Cl,active +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N,active +C1(=CC=CC=C1)CCNN.S(O)(O)(=O)=O,active +C1(=CC=C(NN)C=C1)C(O)=O.[H]Cl,active +C1(=CC=C(C=C1)O)NC(C)=O,active +O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-],active +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl,active +C1(=CC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)C)C,active +C1(=CC(=CC(=C1N)C)C)C.[H]Cl,active +O=[Mo](=O)=O,active +[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+],active +O=NN(C(=O)N)CCC,active +CC(OC)(C)C,active +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+],active +ClC1=NC(=NC(=N1)NC(C)C)NCC,active +C1(=CC=CN=C1)CCl.[H]Cl,active +C1(C2=CC=C(C=C2)N)=CC=C(C=C1)N.[H]Cl.[H]Cl,active +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1,active +CC(=O)NC1=CC=C(C=C1)OCC,active +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,active +CC(=O)O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,active +CC(=O)NN,active +CC(=O)N,active +CC(=C)CCl,active +N(NC(C)=O)C(C1=CC=NC=C1)=O,active +OC1=CC=C(C=C1)O,active +CC(C)(C)O,active +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,active +ClC(CCl)Cl,active +CC(C)C(O)(C(C)O)C(=O)OC\C1=C\CN2CC[C@@H](OC(=O)C(\C)=C\C)[C@@H]12,active +C1(NS(=O)(=O)[O-])CCCCC1.[Na+],active +[O-][N+](C)=O,active +N(C(=O)N)(N=O)CC(C)=O,active +CC(=O)OCC1=CC=CC=C1,active +CC(=O)OC=C,active +N(CC(C)=O)(CC=C)N=O,active +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl,active +C12C3=C(C=CC=C3)NC1=CC=CC=2,active +CC(Cl)CCl,active +C1C(C2=CC=CC=C2)O1,active +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O,active +C12C(=CC(=C(C=1O)/N=N/C3=C(C=C(C=C3)C4=CC(=C(C=C4)/N=N/C5=C(C=C6C(=C5O)C(=CC(=C6)S(=O)(=O)[O-])N)S(=O)(=O)[O-])OC)OC)S(=O)(=O)[O-])C=C(C=C2N)S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],active +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+],active +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C,active +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2,active +O=NN(CCCCC)CCCCC,active +C1N(COC1)N=O,active +C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1,active +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2,active +CC(O)CN(C)N=O,active +ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2],active +C1C(OC(O1)C(C)I)CO,active +C1COCCO1,active +C1=CC=CC=C1C(O)C(N(C)N=O)C,active +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O,active +CC(C)CC(=O)O[C@H]1C[C@]2(COC(C)=O)[C@@]4(C)[C@H](OC(C)=O)[C@@H](O)[C@@H](O[C@@H]2/C=C1/C)[C@]34CO3,active +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1,active +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O,active +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,active +[O-][N+](=O)N(C)C,active +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,active +ClC(=C(Cl)Cl)Cl,active +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,active +Brc1c(c(Br)c(Br)c(Br)c1Br)c2c(Br)cc(Br)c(Br)c2Br,active +O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O,active +O=S(C1=C(/N=N/C2=CC=C(C3=CC=C(\N=N/C4=C(S(=O)([O-])=O)C=C5C(C(N)=CC(S(=O)([O-])=O)=C5)=C4O)C=C3)C=C2)C(O)=C(C(N)=CC(S(=O)([O-])=O)=C6)C6=C1)([O-])=O.[Na+].[Na+].[Na+].[Na+],active +C1(=C(C=CC=C1)N)OC.[H]Cl,active +OC(C=C)C1=CC=C2OCOC2=C1,active +[O-]C12[C@@H](CC[N+](C)1CC=C2COC([C@](OC(C)=O)(C)[C@@H](C)\C=C3C=C)=O)OC/3=O,active +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],active +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-],active +N(N)(CC=C)CC=C,active +[Cl-].[Cd+2].[Cl-],active +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O,active +N(CC(F)(F)F)(CC)N=O,active +O=[N+](C1=CN=C(S1)N)[O-],active +[Cl-].C/[N+](C)=C1\C=C/C(C=C1)=C(\c2ccc(cc2)N(C)C)c3ccc(cc3)N(C)C,active +C1C(N(C(CN1N=O)C)C)C,active +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,active +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O,active +ClCCCl,active +O=C(C(F)(F)F)NC1=CC3=C(C2=CC=CC=C2C3)C=C1,active +[O-][N+](=O)c1ccc2c3ccccc3Cc2c1,active +[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2,active +[N+](=O)([O-])c1ccccc1C,active +Cl[C@@]1(C(C)2C)C(Cl)(Cl)C(Cl)([C@](Cl)(C2=C)C1Cl)Cl,active +[K+].C1(=CC=C2C(=N1)N(C=C(C2=O)C([O-])=O)C)/C=C/C3=CC=C(O3)[N+]([O-])=O,active +[N+](=N/CCC)(/CCC)[O-],active +[N+].C1(N(N=O)[O-])=CC=CC=C1,active +NC(=O)OC,active +C=CC=C,active +C=CCl,active +C=CCC1=CC=C2C(=C1)OCO2,active +C=CC#N,active +CC(CCl)OC(C)CCl,active +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2,active +CC1=CC(C)=C(/N=N/C2=C(C(S([O-])(=O)=O)=CC3=C2C=CC(S([O-])(=O)=O)=C3)O)C=C1C.[Na+].[Na+],active +C=C(Cl)Cl,active +C1(=C(C=CC(=C1)Cl)N)C.[H]Cl,active +ClC2(Cl)C1(Cl)C(=C)C(CCl)(CCl)C2(Cl)C(Cl)C1Cl,active +N(C)[N+].S(=O)(=O)([O-])O,active +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,active +C1(=C(C(OCCCCCCC(C)C)=O)C=CC=C1)C(OCCCCCCC(C)C)=O,active +C=CF,active +C=CCN(CC=C)N=O,active +O=C1CCO1,active +C=O,active +C\C(C)=C/Cl,active +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N,active +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl,active +C(CCCN(N=O)C)(O)C1C=NC=CC=1,active +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2,active +O=C(C)CN(N=O)CCO,active +O=C(N(CC(C)=O)N=O)NCCCl,active +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr,active +C(=C/C=O)\[O-].[Na+],active +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](\CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=CC=C5.[Na+],active +O=C(N(CC)N=O)NCC(=O)C,active +Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,active +O=C(N(CCCCC)N=O)N,active +C1(NC(CN1N=O)=O)=O,active +C(O)(=O)[O-].[K+],active +O=C(C1=CC=CN=C1)CCCN(N=O)C,active +C(CCl)(F)(F)F,active +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3,active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +CC1=CC(=C(C=C1C)N)C,active +C=CBr,active +CC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)C)N,active +CC1=C(C=CC=C1)N=O,active +CC1=CC(C4=CC(C)=C(/N=N/C5=CC=C(OS(=O)(C6=CC=C(C)C=C6)=O)C=C5)C=C4)=CC=C1/N=N/C2=C(O)C=CC3=CC(S(=O)([O-])=O)=CC(S(=O)([O-])=O)=C23.[Na+].[Na+],active +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5,active +CC1CC(OC(O1)C)OC(=O)C,active +Cl.Cl.Cl.Cc1ccc(cn1)C\C2=C\N/C(=N\C2=O)NCCSCc3ccc(CN(C)C)o3,active +CC1=CC=CC(C)=C1,active +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl,active +CN(N)C=O,active +CC(OC1=CC=C(C=C1)Cl)(C(=O)OCC)C,active +CC(CON=O)C,active +CC(N(C1=CC=CC2=C1CC3=C2C=CC=C3)C(C)=O)=O,active +CC/C(=C/CC)[N+](=O)[O-],active +CCO,active +CC1(CC(=CC(=O)C1)C)C,active +CC/C(C2=CC=CC=C2)=C(C1=CC=CC=C1)/C(C=C3)=CC=C3OCCN(C)C.OC(C(CC(O)=O)(O)CC(O)=O)=O,active +CC=O,active +CCCCCNN.[H]Cl,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N),active +O=C(N(CCC1=CC=CC=C1)N=O)N,active +CCCCOP(=O)(OCCCC)OCCCC,active +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +CCNN.[H]Cl,active +N(CC(C)O)(CCO)N=O,active +O=S(=O)([O-])[O-].[Cd+2],active +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)C)C)C)C,active +CCOC(=O)N(C)N=O,active +CC1CO1,active +CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC,active +NC1=CC(=CC=C1OC)C,active +CC1=CC=CC=C1,active +CCC(C)=NO,active +CCC1CO1,active +CCCCC/C=N/N(C=O)C,active +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl,active +CCCC/C=N/N(C=O)C,active +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,active +O=CNN,active +O=C1C(O)=COC(CO)=C1,active +CC(C/C=N/N(C=O)C)C,active +CC(C1=C(C(=C(C(=C1[N+](=O)[O-])C)[N+](=O)[O-])C)[N+](=O)[O-])(C)C,active +C(N)(=O)OC(C#C)(C1C=CC=CC=1)C2C=CC(=CC=2)Cl,active +CS(=O)(=O)OC1=C(C=C(C=C1C(C)(C)C)[N+]([O-])=O)[N+](=O)[O-],inactive +CC(C)(C)c1cc(O)ccc1O,inactive +OC[P+](CO)(CO)CO.[O-]S([O-])(=O)=O.OC[P+](CO)(CO)CO,inactive +NC1=CC=C(C=C1)/N=N/C2=CC=C(C=C2)N,inactive +F[B-](F)(F)F.[Na+],inactive +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,inactive +O=NN(C)C2=NC1=CC=C(Cl)C=C1C(C3=CC=CC=C3)=[N+]([O-])C2,inactive +CCCCCl,inactive +[Sn+2].[Cl-].[Cl-],inactive +[Ti+2](C1=CC=CC1)C2(=CC=CC2).[Cl-].[Cl-],inactive +C(CO)O,inactive +ClC1=C(C=CC=C1)Cl,inactive +NC(=S)NC1=CC=CC=C1,inactive +Br/C(Br)=C/[C@H]3[C@@H](C(=O)O[C@H](C#N)c2cccc(Oc1ccccc1)c2)C3(C)C,inactive +O=NN(CCC1)C(C1)C(=O)O,inactive +N(C([S-])=S)(CC)CC.[S-]C(N(CC)CC)=S.[Cd+2],inactive +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,inactive +C([S-])#N.[Na+],inactive +O=CC=C(CCC=C(C)C)C,inactive +O=CC(\Cl)=C(\Cl)C(O)=O,inactive +O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC,inactive +C(/C1=C(C=C(C=C1)O)S(=O)(=O)[O-])(C2=CC=C(C=C2)N(CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)=C4/C=C/C(C=C4)=[N+](\CC5=CC(=CC=C5)S(=O)(=O)[O-])CC.[Na+].[Na+],inactive +O=C3[C@@]2(C)CC[C@]1([H])[C@](CC[C@H](OS(=O)(O)=O)C4)(C)C4=CC[C@]([H])1[C@@]([H])2CC3,inactive +OC1=C(C=C(C=C1)CC=C)OC,inactive +C([N+](C)(C)C)CCl.[Cl-],inactive +O=NN(/C(=N\C#N)NCCSCC1=C(N=CN1)C)C,inactive +O=C4[C@@]3(C)CC[C@]2([H])C1=CC=C(OS(=O)([O-])=O)C=C1CC=C2[C@@]([H])3CC4.[Na+],inactive +CN(C)[C@@H]2/C=C\CC[C@@]2(c1ccccc1)C(=O)OCC.OC(=O)\C=C\C(O)=O,inactive +O=CCCCC=O,inactive +C([N+](C)(C)C)CO.[Cl-],inactive +ClC1=C(OC(C)C(O)=O)C=CC(Cl)=C1,inactive +O=C(C1=CC(=CC=C1O)/N=N/C2=CC=C(C=C2)C(=O)O)O,inactive +N1(C2C(SC3=C1C=CC=C3)=CC=CC=2)CC(N(C)C)C.[H]Cl,inactive +[O-][N+](C1=CC=CC(C2C(C(OC3CN(C(C5=CC=CC=C5)C4=CC=CC=C4)C3)=O)=C(NC(C)=C2C(OC(C)C)=O)N)=C1)=O,inactive +[Na+].[Na+].S=C(NCCNC(=S)[S-])[S-],inactive +O=S(=O)([O-])[O-].[V+2]=O,inactive +ClC(C(C1=C(C=CC=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +ClC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +O=S(=O)([O-])[O-].O.O.O.O.O.O.[Ni+2],inactive +O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3,inactive +Cl.N#Cc1ccc(cc1)C3CCCc2cncn23,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC,inactive +O=S(=O)(C1=CC=C(C=C1)Cl)OC2=CC=C(C=C2)Cl,inactive +[O-][N+](OCC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O)=O,inactive +[N+].[O-],inactive +O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+],inactive +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2,inactive +CC(=O)[O-].[O-]C(=O)C.[Ba+2],inactive +[Na+].[Na+].OC(=O)[C@]5(C)C[C@H]6/C7=C/C(=O)[C@H]4[C@@](C)(CC[C@@H]3[C@]4(C)CC[C@H](OC2O[C@H](C([O-])=O)[C@@H](O)[C@H](O)[C@H]2O[C@H]1O[C@@H]([C@@H](O)[C@H](O)[C@H]1O)C([O-])=O)C3(C)C)[C@]7(C)CC[C@@]6(C)CC5,inactive +C1=C(C(=C(C=C1O)C)N(C)C)C,inactive +O=C(C3)C(C(O)=CC(O[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]5[C@H](O)[C@H](O)[C@@H](O)[C@H](C)O5)O4)=C2)=C2O[C@@H]3[C@@]1=CC(OC)=C(OC)C=C1,inactive +O=S(=O)(C1=CC(=C(C=C1Cl)Cl)Cl)C2=CC=C(C=C2)Cl,inactive +[O-]S(S(=O)[O-])(=O)=O.[K+].[K+],inactive +O=C1C[C@H](C\C=C1\C)C(C)=C,inactive +O=NN1CCC[C@H]1[C@@](O)=O,inactive +[O-]P(=O)=O.[Na+],inactive +NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl,inactive +CCN(CC)C(=O)C1=CC=CC(C)=C1,inactive +O=P(OC(=C(C(=O)N(CC)CC)Cl)C)(OC)OC,inactive +C12(=C(C=C(C=C1C=CC(=C2/N=N/C3=CC=CC=C3)O)S(=O)(=O)[O-])S(=O)(=O)[O-]).[Na+].[Na+],inactive +ClC(C(C1=CC=C(C=C1)CC)C2=CC=C(C=C2)CC)Cl,inactive +C1(=CC(=C2C(=C1)N=CC=C2)Br)Br,inactive +NC1=CC=C(C=C1)N,inactive +[O-][N+]1=CC=CC=C1C=C,inactive +O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].Cl[O-].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+],inactive +C(NC)CC(OC1=CC=C(C=C1)C(F)(F)F)C2=CC=CC=C2.[H]Cl,inactive +O=C1C=CC(=O)NN1,inactive +S=C(N(C)C)SSC(=S)N(C)C,inactive +C(N)(N)=O,inactive +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl,inactive +CC(C=NOC(=O)NC)(SC)C,inactive +NC2=CC=C(C(OC)=C2)\N=N/C1=CC=CC=C1,inactive +O=C(C)OC/C=C(C)/CC/C=C(C)/C,inactive +O=C1C2=C(C=CC=C2)C(=O)C(=C1Cl)Cl,inactive +OC(C(SC(Cl)=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=CC=C3)=O,inactive +C(CCCCCCCC)CCCNC(N)=N.CC(=O)O,inactive +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3,inactive +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,inactive +C=CCO,inactive +OCC1=C(C(=C(C(=C1)/N=N/C2=C3C=CC=CC3=C(C=C2)S(=O)(=O)[O-])O)/N=N/C4=C5C=CC=CC5=C(C=C4)S(=O)(=O)[O-])O.[Na+].[Na+],inactive +FC(C(OC(F)F)Cl)(F)F,inactive +C(O)(=O)[O-].[Na+],inactive +OCCN.O=C(C1=C(C=CC(=C1)Cl)O)NC2=CC=C(C=C2Cl)[N+](=O)[O-],inactive +O=C(OC1=CC=CC=C1)OC2=CC=CC=C2,inactive +O=C(OCC2=CC=CC(C3=CC=CC=C3)=C2C)C1C(C)(C)C1/C=C(Cl)/C(F)(F)F,inactive +O=C(OCC)C4=C(C=CC=C4)C(C(C=C(C)C(NCC)=C3)=C3O1)=C(C=C2C)C1=C/C2=N/CC.Cl,inactive +C[C@H](C\C=C\C)[C@@H](O)[C@@H]1N(C)C(=O)[C@H](C(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](NC(=O)[C@H](CC(C)C)N(C)C(=O)CN(C)C(=O)[C@H](CC)NC1=O)C(C)C,inactive +OC(COC1=CC=CC2=C1C=CC=C2)CNC(C)C.[H]Cl,inactive +ClC1=C(C=C(C(=C1)Cl)Cl)OC(C(=O)O)C,inactive +O[C@@H]1[C@@](O[C@@H](O[C@H](CO)[C@@H]2Cl)[C@H](O)[C@H]2O)(CCl)O[C@H](CCl)[C@H]1O,inactive +COc3ccccc3N2CCN(CCCN\C1=C\C(=O)N(C)C(=O)N1C)CC2,inactive +O=C1C(=C(C(=O)C(=C1Cl)Cl)Cl)Cl,inactive +C(S)(=S)N(C)C.N(C)C,inactive +O=C1C(C(=O)OC(=C1)C)C(=O)C,inactive +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl,inactive +O=C/C=C/C1=CC=CC=C1,inactive +O=C(NCCCN(CC)CC)CN1N=CC(C3=CC=CC=C3)=C1C2=CC=CC=C2.O=C(O)/C([H])=C([H])/C(O)=O,inactive +O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.Cl,inactive +C1N2CN3CN(C2)CN1C3,inactive +OC(C(C=CC=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=C(C)S3)=O,inactive +C(C(F)(Cl)Cl)(F)(F)Cl,inactive +O=C1NCCN1,inactive +C(C(C)O)(O[Ca]OC(C(C)O)=O)=O,inactive +[O-][N+](=O)C1=C(Cl)C(=C(Cl)C(=C1)[N+]([O-])=O)Cl,inactive +O=C1N(C2=CC=CC=C2)N=C(C1)C,inactive +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,inactive +ClCC(=O)C1=CC=C(NC(=O)C)C=C1,inactive +O=C2C1=C(CCC2)C(OC[C@@H](O)CNC(C)(C)C)=CC=C1.Cl,inactive +OC(=O)CCC(=O)OCC2(CCCC)C(=O)N(c1ccccc1)N(C2=O)c3ccccc3,inactive +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,inactive +O=C2C1=C(N=CN2)N([C@@H]3O[C@H](COP([O-])([O-])=O)[C@@H](O)[C@H]3O)C=N1.[Na+].[Na+],inactive +O=C(C1=CC=C(C=C1)C(=O)OC)OC,inactive +O=C1OC(=O)CC1,inactive +O=C([C@H](CO)[C@]2=CC=CC=C2)O[C@@H]1C[C@H](N4C)[C@@H](O3)[C@@H]3[C@@H]4C1.Br.O.O.O,inactive +C(=O)(/C=C/C)OC1=C(C(CCCCCC)C)C=C(C=C1[N+]([O-])=O)[N+]([O-])=O,inactive +FC(C(F)Cl)(OC(F)F)F,inactive +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C,inactive +C[N+](CCC(C1=CC=C(C=C1)Cl)C2=NC=CC=C2)C.C(\C(=C(/C(=O)[O-])[H])[H])(=O)O,inactive +O=C1CCCCC1,inactive +CCCC[Sn](O[Sn](CCCC)(CCCC)CCCC)(CCCC)CCCC,inactive +CNC1=NC=NC2=C1N=CN2,inactive +N1C2=C(C=CC=C2)N=N1,inactive +O=C1C2=C(N=CN2C)N(C(=O)N1C)C,inactive +O.[Na+].O.O.CCN(CC)C([S-])=S,inactive +O=C(/C=C/C6=CC=C(O)C(OC)=C6)O[C@@H]4C(C)(C)[C@@]5([H])[C@]1(CC4)[C@]3([C@](CC5)([H])[C@]2(C)CC[C@@]([C@H](C)CC/C=C(C)\C)([H])[C@](C)2CC3)C1,inactive +C(C1=CC=C(C=C1)O)(=O)OCCCC,inactive +O=C1N(C2=CC=CC=C2)N(C(=C1N(C)C)C)C,inactive +C1(=C(C=CC(=C1)N(CCO)CCO)NCCO)[N+]([O-])=O,inactive +O=C1CCCO1,inactive +O=C1CCCCCN1,inactive +C(C1=CC=CC=C1)(C2=CC=CC=C2)OCCN(C)C.[H]Cl,inactive +C1(=C(/C=C/C2=C(S(=O)(=O)[O-])C=C(C=C2)N)C=CC(=C1)N)S(=O)(=O)[O-].[Na+].[Na+],inactive +Cl.CC(C)(C)NCC(O)COc1cccc(C)c1C,inactive +OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)/C=C\[C@]1(C)[C@H]4C(=O)C[C@@]23C,inactive +Cl.CC3CCCC(C)N3CCCC(O)(c1ccccc1)c2ccccn2,inactive +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O,inactive +Cl.CC(C)(C)NCC(O)CO/C1=C/N(C)C(=O)c2ccccc12,inactive +OCC(=O)[C@@]2(O)CC[C@H]3[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4[C@@H](O)C[C@]23C,inactive +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O.O=S(O)(O)=O,inactive +Cl.O=P1(OCC(C)(C)CO1)C\4=C(/C)NC(/C)=C(/C(=O)OCCN(Cc2ccccc2)c3ccccc3)C/4c5cccc(c5)[N+]([O-])=O.CCO,inactive +[As]21O[As]3O[As](O1)O[As](O2)O3,inactive +OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1,inactive +[Cd+2].[O-]C(C)=O.[O-]C(C)=O,inactive +N1=C(SSC2=NC3=C(C=CC=C3)S2)SC4=C1C=CC=C4,inactive +OCC1=CC=CC=C1,inactive +O=S(=O)(C1=C(C=CC=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+],inactive +[Fe+3].O=C([O-])CC(O)(CC(=O)[O-])C([O-])=O.O.O.O.O,inactive +OC2=C1[C@@](C=C(C)CC3)([H])[C@]3([H])C(C)(C)OC1=CC(CCCCC)=C2,inactive +OC1=CC(C2=NC(N(C(C)C)C3=C2C=CC(C)=C3)=O)=CC=C1,inactive +Cl[O-].[Na+],inactive +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,inactive +CC2=CC1=CC=CC=C1C=C2,inactive +OC1=C(C=CC(=C1)O)CCCCCC,inactive +Cl/C2=C(\Cl)C3(Cl)C1C(Cl)OC(Cl)C1C2(Cl)C3(Cl)Cl,inactive +OC1=CC(=CC=C1)O,inactive +OC(=O)CC[N+](=O)[O-],inactive +OC1=CC=CC2=CC=CN=C12,inactive +OC1=CC=CC=C1,inactive +Oc1ccc(C[C@](C)(N)C(O)=O)cc1O.OC(=O)[C@@](C)(N)Cc1cc(O)c(O)cc1.O.O.O,inactive +O=C1C2=C(C=CC=C2)C(=O)O1,inactive +O=[As](O)(O)[O-].[Na+],inactive +OC1=CC=C(C=C1)OCC2=CC=CC=C2,inactive +O=C1c2c(O)cc(C)cc2C(=O)c3cc(O)cc(O)c13,inactive +O=[N+](CC)[O-],inactive +Cl.Cl.[O-][N+](=O)c1cccc(c1)C/2C(\C(=O)OC)=C(\C)NC(\C)=C\2C(=O)OCCN3CCN(CC3)C(c4ccccc4)c5ccccc5,inactive +S=C1NC=NC2=C1N=CN2,inactive +S=C=NC1=CC=CC=C1,inactive +.[K+].[Cl-],inactive +O=C(NC3=CC2=C(C=C3)C1=CC=C(NC(C)=O)C=C1C2)C,inactive +S=C(S[Pb]SC(N(C)C)=S)N(C)C,inactive +OC(=O)C1=C(C=CC=C1)OC(=O)C,inactive +S=C(S[Te](SC(=S)N(CC)CC)(SC(=S)N(CC)CC)SC(=S)N(CC)CC)N(CC)CC,inactive +.[Na+].[Cl-],inactive +S=P(SC1C(SP(=S)(OCC)OCC)OCCO1)(OCC)OCC,inactive +S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC,inactive +S1C=CC(=C1)CN(C2=NC=CC=C2)CCN(C)C,inactive +S=P(SCC(=O)NC)(OC)OC,inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OC)OC,inactive +S=P(OC1=CC(=C(C=C1)SC)C)(OC)OC,inactive +S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC,inactive +O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C,inactive +S=C(NC1CCCCC1)NC1CCCCC1,inactive +S=C([S-])N(CCCC)CCCC.[S-]C(N(CCCC)CCCC)=S.[Zn+2],inactive +S=C([S-])N(CC)CC.[S-]C(N(CC)CC)=S.[Zn+2],inactive +ClC1=C(C=C(C(=C1)Cl)Cl)OCC(=O)O,inactive +S=C([S-])NCCNC([S-])=S.[Zn+2],inactive +S(=O)(=O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2,inactive +CC1=C2C(=CC=C1)C=CC=C2,inactive +CC(CO)O,inactive +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Cu+2],inactive +S=C(N(CCCC)CCCC)S[Ni]SC(=S)N(CCCC)CCCC,inactive +CC1=C(C(=CC(=C1)OC(=O)NC)C)N(C)C,inactive +O=S1(=O)CC=CC1,inactive +C1(SC2=C(C(=CC(=C2)Cl)Cl)[O-])(=C(C(=CC(=C1)Cl)Cl)[O-]).[Na+].[Na+],inactive +Cl.CCOC(=O)[C@H](CCc1ccccc1)N[C@@H](C)C(=O)N2Cc3ccccc3C[C@H]2C(O)=O,inactive +S=C(N(C)C)SC(=S)N(C)C,inactive +OCCNC1=C(OCCO)C=C([N+]([O-])=O)C=C1,inactive +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,inactive +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,inactive +CC1=CC(NC2=C1C=C(C=C2)OCC)(C)C,inactive +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,inactive +OC(=O)C1=CC=NC=C1,inactive +C1=CC=C(NC(=O)C(/N=N/C2=C(Cl)C=C(C3=CC(Cl)=C(/N=N/C(C(=O)NC4=CC=CC=C4)C(=O)C)C=C3)C=C2)C(=O)C)C=C1,inactive +ClC([N+](=O)[O-])(Cl)Cl,inactive +OC(CNC(C)C)C1=CC=C(NS(=O)(C)=O)C=C1.[H]Cl,inactive +OC(=O)C=CC=CC,inactive +OC(=O)C=C,inactive +O=C(C1=CC=C(C=C1)N)NC2=CC=C(C=C2)N,inactive +O=C2C=1/N=C\NC=1N(C)C(=O)N2C,inactive +OC(=O)CCl,inactive +[O-][N+](/C=C/C1=CC=CC=C1)=O,inactive +CCCOC(=O)[CH]1[CH](C)CC2=C(C=C3OCOC3=C2)[CH]1C(=O)OCCC,inactive +OC(=O)C1=NN(C2=C1C=CC=C2)CC3=CC=C(C=C3Cl)Cl,inactive +OC(=O)CC1=CNC2=C1C=CC=C2,inactive +OC(=O)CC1=C2C(=CC=C1)C=CC=C2,inactive +OC(=O)\C=C/C(O)=O.C(C(C1CCCCC1)C2CCCCC2)C3CCCCN3,inactive +NC1=C(C=CC=C1)C(=O)O,inactive +[O-][N+](C)(C)CCCCCCCCCC,inactive +O=S(O)(O)=O.O[C@@H]([C@H](C)NC)[C@@]1=CC=CC=C1.O[C@@H]([C@H](C)NC)[C@@]2=CC=CC=C2,inactive +C(C1C=CC(=CC=1)O)(C2=CC=C(C=C2)O)(C)C,inactive +O=C1C(NC(=O)N1)NC(=O)N,inactive +[O-][N+](C1=CC([N+]([O-])=O)=CC([N+]([O-])=O)=C1)=O,inactive +O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)([O-])=O.[Na+],inactive +CC(=O)O[C@H]1[C@@H]([C@H](O[C@H]([C@@H]1OC(=O)C)COC(=O)C)S[Au]=P(CC)(CC)CC)OC(=O)C,inactive +OB(O)O,inactive +O1C2=C(C=CC=C2)OC3=CC=CC=C13,inactive +OC(=O)[C@@H]3[C@]51C[C@@](O)(CC[C@H]1[C@@]24\C=C/[C@H](O)[C@@](C)(C(=O)O2)[C@@H]34)C(=C)C5,inactive +[O-][N+](=O)C1=CC=CC(=C1)NC(=O)C2=CC3=CC=CC=C3C(=C2O)/N=N/C4=CC(=CC=C4OC)[N+]([O-])=O,inactive +[Be+2].O=S(=O)([O-])[O-],inactive +[Na+].[As](=O)[O-],inactive +C1(=CC(=CC=C1N)OC)OC.[H]Cl,inactive +OC(OC(O)CC)CC,inactive +CC(C)NCC(O)COc1ccc(cc1)NC(C)=O,inactive +OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl,inactive +[Na+].[O-]C(=O)[C@@H](N)CC(O)=O,inactive +[O-]C1=C(I)C=C(C(C2=C(C([O-])=O)C=CC=C2)=C3C=C(C(C(I)=C3O4)=O)I)C4=C1I.[Na+].[Na+],inactive +CC(C)C=O,inactive +OC1(=C(O)C(=O)O[C@H]1[C@@H](C[O-])O).[Na+],inactive +C1(=C(C=C(N)C=C1)[N+](=O)[O-])NCCO,inactive +ClC1(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +C1=CC=CC(=C1)C(C(C2=CC=CC=C2)=O)O,inactive +OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-],inactive +OC1=C(C=C(C=C1C(C)(C)C)CO)C(C)(C)C,inactive +CC(CC1=CC=CC=C1)NN.[H]Cl,inactive +O.O.O.O.NC(=O)[C@@H]3CCCN3C(=O)[C@@H](NC(=O)[C@@H]1CC(=O)N(C)C(=O)N1)C\C2=C\N=C/N2,inactive +OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C,inactive +[Na+].[N-]=[N+]=[N-],inactive +O=[Ti]=O,inactive +[Na+].[F-],inactive +BrC(C(=O)NC(=O)N)(CC)CC,inactive +[Cd+2].[Cl-].[Cl-].[H]O[H],inactive +O[As](=O)(C1=CC=C(C=C1)NC(=O)N)O,inactive +C12=C(C=CC(=C1)C(CNC(C)C)O)C=CC=C2.[H]Cl,inactive +OC(CC(C1)C)C(C1)C(C)C,inactive +[Na+].O=C([O-])[C@@H](N)CCC(O)=O,inactive +N[C@@H](C\C1=C\N=C/N1)C(O)=O.Cl,inactive +OC(C)CCl,inactive +OC(C)C,inactive +O=C1N(C2=CC=C(C=C2C(=NC1)C3=CC=CC=C3)Cl)CC4CC4,inactive +C1CNCCN1,inactive +OC[C@@H](O)[C@@H](O)[C@H](O)[C@H](O)CO[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1O,inactive +OC[C@@H](NC(C(Cl)Cl)=O)[C@H](O)C1=CC=C(S(=O)(C)=O)C=C1,inactive +OC(CNC(C)C)COC1=CC=CC=C1OCC=C.Cl,inactive +[Na+].C1(=CC=C2C(=C1S([O-])(=O)=O)C=CC=C2)/N=N/C3=C(C=CC4=C3C=CC=C4)O,inactive +O=C(OC)C1=C(C)NC(C)=C(C(OCC(C)(C)CN(CC3=CC=CC=C3)C)=O)C1C2=CC([N+]([O-])=O)=CC=C2F.Cl,inactive +OC(CO)CCl,inactive +NC1=CC(=CC=C1)N,inactive +C1=CC=C(C(C(=O)OC)C2N(N=O)CCCC2)C=C1,inactive +CCC1(C2=C(C3=C(C(=CC=C3)CC)N2)CCO1)CC(=O)O,inactive +S=C(N(CC)CC)SSC(=S)N(CC)CC,inactive +NC(=S)NNC(=S)N,inactive +OC(=O)C1=CC=CN=C1,inactive +CC(=O)[O-].[O-]C(=O)C.[O-]C(=O)C.[Cr+3],inactive +C1=CC=C(C(OC)C(=O)O)C=C1,inactive +C1=C(Cl)C=C3C(=C1)N(CCO)C(=O)C(O)N=C3C2=CC=CC=C2F,inactive +C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2)=NN=C4,inactive +ClCC/C(C2=CC=CC=C2)=C(C3=CC=CC=C3)/C1=CC=C(C=C1)OCCN(C)C.OC(C(O)=O)(CC(O)=O)CC(O)=O,inactive +NC1=CC=C(C=C1)Cl,inactive +C1=C2C(=CC=C1NC3=CC=C(C=C3)NC4=CC=C5C(=C4)C=CC=C5)C=CC=C2,inactive +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,inactive +O=CCBr,inactive +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +C1=CC=C2C(=C1)C=C(C=C2)C(CNC(C)C)O,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CC(=O)O)C)C)C,inactive +NC(CCCN)(C(=O)O)C(F)F,inactive +O=C(O)[C@H](CS)N.Cl,inactive +N(CC(=O)[O-])CC(=O)O.[Na+],inactive +C1(C(NCC2CCCCN2)=O)=C(C=CC(=C1)OCC(F)(F)F)OCC(F)(F)F.CC(=O)O,inactive +CC(=O)O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3,inactive +O=C(C(C)=C2C)C(C(CCCCCC(O)=O)C1=CC=CC=C1)=C(C)C2=O,inactive +NC(C(=O)O)CCSC,inactive +C13CC(C4C3O4)C2C1C5C(O5)C2,inactive +CN(C=O)C,inactive +C1=CC=C5C(=C1)N(CC2=CC=C(F)C=C2)C(NC4CCN(CCC3=CC=C(OC)C=C3)CC4)=N5,inactive +CC1(C2=CC=CC=C2)C(O1)C(=O)OCC,inactive +C1=C(C=CC=C1)C2=CC=CC=C2,inactive +NC1(=CC=C(C=C1)NC2=CC=CC=C2).[H]Cl,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)CCCCCCCCCCCCCCC)C)C)C,inactive +NC1=C(C)C=C(N)C=C1.O=S(O)(O)=O,inactive +O[As](=O)(C1=CC(=C(C=C1)O)[N+](=O)[O-])O,inactive +NC(=S)NN,inactive +CC1=CC=CC(C)=C1,inactive +N=C\2/N=C3/O[C@H]1[C@H](O)[C@@H](CO)O[C@H]1N3/C=C/2,inactive +C1(C2=CC=C(C(=C2)Cl)N=NC(C(C)=O)C(=O)NC3=C(C=C(C(=C3)OC)Cl)OC)=CC(=C(C=C1)N=NC(C(C)=O)C(=O)NC4=CC(=C(C=C4OC)Cl)OC)Cl,inactive +C(CCC(=O)O)([O-])=O.[Na+],inactive +C1(CCNC(NC(N)=N)=N)=CC=CC=C1.[H]Cl,inactive +CC(=O)O[Hg]C1=CC=CC=C1,inactive +C1(CCCCC1[N+]).O=S(=O)([O-])O,inactive +C1(C(OCC(C)C)=O)=CC=C(O)C=C1,inactive +O.O=C(Nc3cccc1c3O/C(=C\C1=O)C2=N\N\N=N2)c5ccc(OCCCCc4ccccc4)cc5.O=C(Nc3cccc1c3O/C(=C\C1=O)/C=2N\N=N/N=2)c5ccc(OCCCCc4ccccc4)cc5,inactive +O=S(=O)([O-])[O-].O.[Mn+2],inactive +[S-]C1=NC(C=CC=C2)=C2S1.[S-]C3=NC(C=CC=C4)=C4S3.[Zn+2],inactive +O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC,inactive +Nc1cc(Cl)c(N)cc1.OS(O)(=O)=O,inactive +C1(C[C@H]([C@@H]([C@H]1CCCCCCC(=O)OC)/C=C/CC(O)(CCCC)C)O)=O,inactive +CC1=CC=CC(C=C)=C1,inactive +CC(=O)O[C@@H]3CC(=O)O[C@H](C)C\C=C\C=C\[C@H](O)[C@H](C)C[C@H](CC=O)[C@H](O[C@@H]2O[C@H](C)[C@@H](O[C@H]1C[C@@](C)(O)[C@H](OC(=O)CC(C)C)[C@H](C)O1)[C@H](N(C)C)[C@H]2O)C3OC,inactive +S=C(N1CCCCC1)SSSSSSC(=S)N1CCCCC1,inactive +ClC6C4(Cl)C3C1C5C(C3C2OC12)C4(Cl)C(Cl)(Cl)C56Cl,inactive +NC1=NC(=NC(=N1)N)C2=CC=CC=C2,inactive +C1(CCCCC1)N.[H]Cl,inactive +CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O,inactive +OC(=O)CCCC\C=C(\c1cccnc1)c2ccccc2,inactive +CN1CCN(CC1)/C2=N/C3=CC=CC=C3SC4C=CC(C)=CC2=4,inactive +FC(Cl)(Cl)Cl,inactive +c1(n(cnc1)C)C[C@@H]2[C@@H](C(=O)OC2)CC,inactive +C1(=C(C=CC(=C1)NC(N(CC)CC)=O)OCC(CNC(C)(C)C)O)C(C)=O,inactive +N(C)(C)C([S-])=S.[Fe+3].[S-]C(=S)N(C)C.[S-]C(=S)N(C)C,inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OCC)OCC,inactive +CC1=C(Cl)C(=O)OC2=C1C=CC(=C2)OP(=S)(OCC)OCC,inactive +N(C1=CC=C(C=C1)NC2=CC=CC=C2)C3=CC=CC=C3,inactive +[Cd+2].[Cd+2].[Cd+2].[O-]S(=O)(=O)[O-].[O-]S([O-])(=O)=O.[O-]S([O-])(=O)=O.O.O.O.O.O.O.O.O,inactive +CC1=C(SSC1=S)C2=CN=CC=N2,inactive +CC=C,inactive +C1(=CC=CC=C1)C(=O)[O-].[Na+],inactive +C12C(=CC=CC=1NCCN)C=CC=C2.[H]Cl.[H]Cl,inactive +C1CCNCC1,inactive +N#CC(C1=CC=CC=C1)C2=CC=CC=C2,inactive +C1(CSCCNC(NC)=NC#N)=C(C)NC=N1,inactive +CC(OC(=O)OC1CCCCC1)OC(=O)c5cccc6nc(OCC)n(Cc2ccc(cc2)c3ccccc3C\4=N\N=N/N/4)c56,inactive +N#[N+][O-],inactive +[Ni],inactive +CC#N,inactive +CC(=O)NNC(=O)C,inactive +CN(C)CCN(CC1=CC=CO1)C2=CC=CC=N2,inactive +NCCS(O)(=O)=O,inactive +C1CCCNCCC1,inactive +Cl.O=C(c2cn(C)c1ccccc12)[C@H]3CC=4N\C=N/C=4CC3,inactive +.[Cl-].[Fe+3].[Cl-].[Cl-],inactive +Cl.CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(cccc1O)[C@@](C)(O)[C@H]4C[C@@H]23,inactive +OCCOCCOC1=CC=C(CCCCCCCCC)C=C1,inactive +ClC1=C(C=CC(=C1)Cl)OS(=O)(=O)C2=CC=CC=C2,inactive +[Ca+2].[N-2]C#N,inactive +CC(=C)C#N,inactive +N(N(CC(O)=O)CC(O)=O)=O,inactive +C1C(CC(CC1(OOC(C)(C)C)OOC(C)(C)C)(C)C)C,inactive +CC(Cl)(Cl)Cl,inactive +CC(Cl)Cl,inactive +COc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C)c4cc3,inactive +C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2,inactive +CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3,inactive +O=C(NC1=CC=CC=C1)OC(C)C,inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1.Cl,inactive +[Cl-].OC[P+](CO)(CO)CO,inactive +C=C(Cl)C=C,inactive +O=[C@](O[C@H](O[C@H](CO)[C@H]1O)[C@H](O)[C@H]1O)[C@@]5(C)[C@](CC3)([H])[C@](CCC5)(C)[C@@](CC4)([H])[C@@](C2)3C[C@]4(O[C@H]6[C@H](O[C@H]7[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O7)[C@@H](O)[C@H](O)[C@@H](CO)O6)[C@@]2=C,inactive +CBr,inactive +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,inactive +NC(=O)CC1=C2C(=CC=C1)C=CC=C2,inactive +NC(=O)C1=NC=CN=C1,inactive +NC(=O)CCCCC(=O)N,inactive +Cl\C2=C(/Cl)C3(Cl)C1COS(=O)OCC1C2(Cl)C3(Cl)Cl,inactive +NC(=O)C1=C(C=CC=C1)C(=O)N,inactive +CN1C2=CC=C(C=C2C(=NC(C1=O)O)C3=CC=CC=C3)Cl,inactive +NC(=O)C1=CC=NC=C1,inactive +CC(=O)O[Sn](OC(=O)C)(CCCC)CCCC,inactive +IC(I)I,inactive +C=CC=O,inactive +NC(=S)NC1=C2C(=CC=C1)C=CC=C2,inactive +ClC(C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)(Cl)Cl,inactive +C12=C(C(=O)NS1(=O)=O)C=CC=C2,inactive +CN(C)CCN(CC1=CC=CS1)C2=CC=CC=C2,inactive +C12(C(=C(/N=N/C3=C(C4=C(C(=C3)S(=O)(=O)[O-])C=CC=C4)O)C=CC=1S(=O)(=O)[O-])C=CC=C2).[Na+].[Na+],inactive +S=C(S[Se](SC(=S)N(C)C)(SC(=S)N(C)C)SC(=S)N(C)C)N(C)C,inactive +NC(=N)NC#N,inactive +N1=CC=CC2=CC=CC(=C12)O[Cu]OC3=CC=CC4=CC=CN=C34,inactive +C12C(C3C(CC1C3)NC(N(C)C)=O)CCC2,inactive +C1=CC(=CC=C1NNC(CC[C@@H](C(O)=O)N)=O)CO,inactive +N12([C@@H]([C@@H](C1=O)NC(COC3=CC=CC=C3)=O)SC([C@@H]2C(=O)[O-])(C)C).[K+],inactive +N1=C(SC2=C1C=CC=C2)SN3CCOCC3,inactive +CN(C)C(C)=O,inactive +C([O-])(C)=O.[O-]C(C)=O.[Ni+2],inactive +N1=C(SNC2CCCCC2)SC3=C1C=CC=C3,inactive +O=[N+](C1=CC=C(C=C1)N)[O-],inactive +N1C2=C(C=CC=C2)SC3=CC=CC=C13,inactive +C1(=CC(=C(C(=C1)N)C)N).[H]Cl.[H]Cl,inactive +CC(C1=CC(=C(C=C1O)C)SC2=CC(=C(C=C2C)O)C(C)(C)C)(C)C,inactive +N1C(N(CC(C1=O)C)N=O)=O,inactive +N1C(=NC2=C1C=CC=C2)C3=CSC=N3,inactive +OC1=C(C=C(C=C1SC2=C(C(=CC(=C2)Cl)Cl)O)Cl)Cl,inactive +OCC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4,inactive +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC=C(C=C3)O,inactive +O=C(CN1C(=O)CCC1)NC2=C(C=CC=C2C)C,inactive +CC1CC(OC(O1)C)OC(=O)C,inactive +ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl,inactive +O=C(COC1=C(Cl)C=C(Cl)C=C1)OCC(CC)CCCC,inactive +O=C(CC(/C=C/C2=CC=C(O)C(OC)=C2)=O)/C=C/C1=CC=C(O)C(OC)=C1,inactive +O[C@H]1[C@@H](NC(CO)CO)C[C@](O)(CO)[C@@H](O)[C@@H]1O,inactive +OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO,inactive +O[C@H]([C@@H]2O)[C@@H](O[C@@H]2CO)N1C(N=CN=C3NC)=C3N=C1,inactive +C=CC1=CC=C(C=C1)C,inactive +Clc1c([N+]([O-])=O)c(Cl)c(Cl)c(OC)c1Cl,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)OCCCC,inactive +NC(=O)C1=CC=CN=C1,inactive +ClC1=C(C=CC(=C1)N)C,inactive +O=C(O)COC1=C(C)C=C(Cl)C=C1,inactive +C[C@@H]3O[C@]1(CS3)C2CCN(CC2)C1.C[C@@H]6O[C@]4(CS6)C5CCN(CC5)C4.O.Cl.Cl,inactive +CS(=O)(=O)OCCCNCCCOS(C)(=O)=O.[H]Cl,inactive +FC(F)(Cl)Cl,inactive +ClC1=C(Cl)N=C(C(O)=O)C(Cl)=C1N,inactive +O=P(OC2=CC=C(C)C=C2)(OC3=CC=C(C)C=C3)OC1=CC=C(C)C=C1,inactive +ClC1=C(Cl)C=CC([C@H]2C3=C(C=CC=C3)[C@@H](NC)CC2)=C1.Cl,inactive +C(C(=O)[O-])(O[Ti](OC(C(=O)[O-])=O)=O)=O.[K+].[K+],inactive +C1(=C(C=CC(=C1)[C@H](CN[C@@H](CCC2=CC=CC=C2)C)O)O)C(N)=O.[H]Cl,inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1,inactive +O=C(C1=C(C=CC=C1)C(=O)OCC=C)OCC=C,inactive +[Na+].[O-]Cl=O,inactive +N(=C(C=1)C)N(C(C)C)C=1OC(=O)N(C)C,inactive +C1([C@H](CNC)O)(=CC(=CC=C1)O).[H]Cl,inactive +O=C(C2=CC=CC=C2)S\C(CCOC(C3=CC=CC=C3)=O)=C(C)/N(C=O)CC1=CN=C(C)N=C1N.Cl,inactive +ClCl,inactive +O=C(C1=CC=CC=C1)CCl,inactive +ClC1=CC=CC=C1C=C(C#N)C#N,inactive +O=C(C1=CC=CC=C1)OOC(=O)C2=CC=CC=C2,inactive +CC(C)(CO)CCCCCCC(C)(C)CO,inactive +O=C(O[C@H](CC)C(/C=C(C)/C=C/C4=O)CO[C@H](O[C@H](C)[C@H]2O)[C@H](OC)[C@@H]2OC)C[C@@H](O)[C@H](C)[C@H]([C@@H](CC=O)C[C@H]4C)O[C@H]1[C@H](O)[C@@H](N(C)C)[C@H](O[C@H](O[C@@H](C)[C@@H]3O)C[C@@]3(C)O)[C@@H](C)O1.OC(C)C(O)=O,inactive +C[N+](CCCCCCCCCCCC)(C)[O-],inactive +O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2,inactive +O=C(O)CC[C@@H](C)[C@]3([H])[C@](CC2)(C)[C@](CC3)([H])[C@@](CC4)([H])[C@@]2([H])[C@]1(C)[C@@]4([H])C[C@H](O)CC1,inactive +O=C(O)\C=C/C(O)=O.O=C(NC3CC(N4C)CCC4C3)C1=C2C(CC(C)(C)O2)=CC(Cl)=C1,inactive +ClC1=C(C=CC(=C1)Cl)O,inactive +C/C=C/C1=CC2=C(C=C1)OCO2,inactive +O=C(NN)OC,inactive +ClC4=C(C=CC=C4)C2=NC(C)C1=NN=C(C)N1C3=C2C=C(CCC5=CC=C(CC(C)C)C=C5)S3,inactive +C1(C=CC=CN=1)CCl.Cl,inactive +C1(=CC=C2C(=C1)N(C(\N=C/2C3=CC=CC=C3)=O)C(C)C)C,inactive +O=C(O[C@H](CC)[C@](O)(C)[C@H](O)[C@@H](C)C2=O)[C@H](C)[C@@H](O[C@H]3C[C@](OC)(C)[C@@H](O)[C@H](C)O3)[C@H](C)[C@H]([C@@](O)(C)C[C@H]2C)O[C@H]1[C@H](O)[C@@H]([N@H+](C)C)C[C@@H](C)O1.[O-]C(CCCCCCCCCCCCCCCCC)=O,inactive +P,inactive +CC(C)NCC(O)COC1(=CC=C(C=C1)CC(=O)N).[H]Cl,inactive +O=C(O)Cc1ccc(cc1)NC(C)=O,inactive +S=C(N(C)C)S[Bi](SC(=S)N(C)C)SC(=S)N(C)C,inactive +O=C(O[C@@H]1[C@@](O[C@@H](O[C@H](COC(C)=O)[C@H]2OC(C(C)C)=O)[C@H](OC(C(C)C)=O)[C@H]2OC(C(C)C)=O)(COC(C)=O)O[C@H](COC(C(C)C)=O)[C@H]1OC(C(C)C)=O)C(C)C,inactive +CC3=CC=C(C=C3)\C(C2=CC=CC=N2)=C/CN1CCCC1.O.Cl,inactive +C=C(F)F,inactive +C=C/C=N/O,inactive +FC(F)Cl,inactive +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2,inactive +C\1=C/C(O[C@@H](C/C=C/C=C/C=C/C=C/[C@@H](C[C@@H]3O[C@](C[C@H](C[C@H]2O[C@H]/12)O)(C[C@@H]([C@H]3C(O)=O)O)O)O[C@@H]4O[C@@H]([C@H]([C@@H]([C@@H]4O)N)O)C)C)=O,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)O,inactive +O=C(N1)N(C2OCCC2)C=C(F)C1=O,inactive +C=CC(OCC)OCC,inactive +O=C(NC1=CC=CC(=C1)Cl)OC(C)C,inactive +O=C(NC1=CC=CC(=C1)C(F)(F)F)N(C)C,inactive +ClC1=C(C=C(C=C1)Cl)OC(C(=O)O)C,inactive +C1(=C(C=CC(=C1)CCNC)OC(C(C)C)=O)OC(C(C)C)=O.[H]Cl,inactive +CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C,inactive +CC([N+](=O)[O-])C,inactive +C/C=C/C1=CC=C(C=C1)OC,inactive +C=CCCl,inactive +C1(=CC(=CC=C1N)N).[H]Cl.[H]Cl,inactive +O=S(C1=CC=C2C(C=CC(O)=C2\N=N/C3=CC=C(S(=O)([O-])=O)C=C3)=C1)([O-])=O.[Na+].[Na+],inactive +CC1=CC=CC=C1OCC(O)CNCCN2/C=C(/C)C(=O)NC2=O.[H]Cl,inactive +O=C(N(CCCC)CC)SCCC,inactive +ClC1=CC2=C(C=C1)OC3=C(C=CC(=C3)Cl)O2,inactive +O=[C@]([C@@H]1C[C@@H](O)CN1N=O)O,inactive +Cl[Mg]Cl.O.O.O.O.O.O,inactive +C1(=CC=C(N)C=C1)OC.[H]Cl,inactive +ClC1=NC(=NC(=N1)NC(C)C)NC(C)C,inactive +[Na+].CN(C)c1ccc(/N=N/S([O-])(=O)=O)cc1,inactive +O=[N+](C1=CC(=C(C=C1)N)N)[O-],inactive +ClC(=C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC,inactive +CC1=CC=CC2=CC=CN=C12,inactive +O=[N+](C1=CC(=C(C(=C1)Cl)N)Cl)[O-],inactive +O=[N+](C1=C2C(=CC=C1)C=CC=C2)[O-],inactive +OC(CN(C1=CC=C(N=N1)NN)C)C.Cl.Cl,inactive +O=[N+](C1=CC(=C(C=C1)C(=O)O)N)[O-],inactive +O=C(O[C@@H]2C[C@@H](CC3)N(C)[C@H]3C2)C(CO)C1=CC=CC=C1,inactive +O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4,inactive +O=C(OC)C1=C(C)NC(C)=C(C(OCCC3=CC=C(N4CCN(C(C6=CC=CC=C6)C5=CC=CC=C5)CC4)C=C3)=O)C1C2=CC([N+]([O-])=O)=CC=C2.Cl.Cl,inactive +O[C@@H]8[C@@H](O)[C@@H]1O[C@H](CO)[C@H]8O[C@H]7O[C@H](CO)[C@@H](O[C@H]6O[C@H](CO)[C@@H](O[C@H]5O[C@H](CO)[C@@H](O[C@H]4O[C@H](CO)[C@@H](O[C@H]3O[C@H](CO)[C@@H](O[C@H]2O[C@H](CO)[C@@H](O1)[C@H](O)[C@H]2O)[C@H](O)[C@H]3O)[C@H](O)[C@H]4O)[C@H](O)[C@H]5O)[C,inactive +[Na+].[O-]S(=O)(=O)c4ccc(c1c3cc(C)c(cc3[o+]c2cc(c(C)cc12)N(CC)CC)N(CC)CC)c(c4)S([O-])(=O)=O,inactive +O[As](O)(C)=O,inactive +C1(C(COCCOC(=O)CCCCCCCC=CCCCCCCCC)OCCO)OC(OCCO)CC1OCCO,inactive +O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO,inactive +C([O-])(=O)CN(CC(=O)O)CCN(CC([O-])=O)CC([O-])=O.[Na+].[Na+].[Na+].[H]O[H].[H]O[H].[H]O[H],inactive +O[C@H]1[C@H](O[C@H](CO)[C@@H](O)[C@@H]1O)O[C@]2(CO)O[C@H](CO)[C@@H](O)[C@@H]2O,inactive +OC1=CC=C(C=C1)C2=CC=CC=C2,inactive +CC(OC1=CC=C(C=C1)NC2=CC=CC=C2)C,inactive +O[C@H]1[C@H](OC[C@H]2O[C@@H](OC(/C(C)=C/C=C/C(C)=C/C=C/C=C(C)/C=C/C=C(C)/C(O[C@H]3[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O4)O3)=O)=O)[C@H](O)[C@@H](O)[C@@H]2O)O[C@H](CO)[C@@H](O)[C@@H]1O,inactive +ClC1=NC(=NC(=N1)NCC)NCC,inactive +C1(C(=CC=C(C=1)NC(C(C)=C)=O)Cl)Cl,inactive +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl,inactive +ClC1=CC(=CC=C1OCC(=O)OC(C)C)Cl,inactive +O=C(C)NCCSP(=S)(OC)OC,inactive +C1(=N\CCN/1)C(C)OC2C(=CC=CC=2Cl)Cl.[H]Cl,inactive +N(N(CC(F)(F)F)CC(F)(F)F)=O,inactive +O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N,inactive +ClC1=CC(=C(C=C1SC2=CC=C(C=C2)Cl)Cl)Cl,inactive +O=S([N-]C1=O)(OC(C)=C1)=O.[K+],inactive +ClC1=CC(Cl)=C(/N=N/C(C(=O)NC2=C(C=C(C3=CC(C)=C(NC(=O)C(/N=N/C4=C(Cl)C=C(Cl)C=C4)C(=O)C)C=C3)C=C2)C)C(=O)C)C=C1,inactive +O=C(C(=NOC(=O)NC)SC)N(C)C,inactive +O=C(C(=C)C)OC,inactive +C(C\C=C/CCCCCCCC)CCCCCC(=O)[O-].[Na+],inactive +O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC,inactive +ClC1=CC(=C(C=C1C2=C(C=C(C(=C2)Cl)N)Cl)Cl)N,inactive +OC1=C(C=C(C=C1C(C)(C)C)C)CC2=CC(=CC(=C2O)C(C)(C)C)C,inactive +O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1,inactive +O=C(C(C1=CC=CC=C1)(C2=CC=CC=C2)CC(N(C)C)C)CC.[H]Cl,inactive +O=C(C(SP(=O)(OC)OC)CC(=O)OCC)OCC,inactive +O=C(C(O)(C2=CC=CC=C2)C1CCCCC1)OC(C)(C)C#CCN(CC)CC.O.Cl,inactive +O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+],inactive +O=[N+](C1=CC2=CC=CN=C2C=C1)[O-],inactive +C12C(=C(C=CC=1NC(C)=O)S(=O)(=O)[O-])C=C(C(=C2O)/N=N/C3=C4C(=C(C=C3)/N=N\C5=CC=C(C=C5)S(=O)(=O)[O-])C=CC(=C4)S(=O)(=O)[O-])S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],inactive +C1(=C2C(=CC=C1N)C=CC=C2)S(=O)(O)=O,inactive +[Cl-].[Ba+2].[Cl-].O.O,inactive +O=C(C1=CC(=C(C(=C1)O)O)O)OCCC,inactive +CC1=CC2=CC=CN=C2C=C1,inactive +NC(=O)NCCCC,inactive +O=[N+]([O-])[O-].[Na+],inactive +O=C([C@H](CC1=CC=CC=C1)NC(=O)[C@H](CC(=O)O)N)OC,inactive +O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1,inactive +O=C([O-])C(C(/C(CC([O-])=O)=C([C@@H](CCC([O-])=O)[C@@H]5C)\N=C5/C=C4\[N-]\C(C(C=C)=C4C)=C3)=N2)=C(C)/C2=C/C1=C(CC)C(C)=C/3[N-]1.[Na+].[Na+].[Na+].[Cu+2],inactive +C1(=C(C=CC=C1N)N).[H]Cl.[H]Cl,inactive +C1(=C2/C(C3=CC(S(=O)(=O)[O-])=CC=C3N2)=O)/C(C4=CC(S(=O)(=O)[O-])=CC=C4N1)=O.[Na+].[Na+],inactive +O=[N+](CCC)[O-],inactive +O=[W](=O)([O-])[O-].[Na+].[Na+],inactive +C1(=C(C)C2OC(CCC=2C(=C1OC(=O)C)C)(CCCC(CCCC(CCCC(C)C)C)C)C)C,inactive diff --git a/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mutagenicity.csv b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mutagenicity.csv new file mode 100644 index 0000000..2f5f73a --- /dev/null +++ b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mutagenicity.csv @@ -0,0 +1,850 @@ +STRUCTURE_SMILES,ActivityOutcome_CPDBAS_Mutagenicity +CN(C1=CC=C(C=C1)/N=N/C2=CC(=CC=C2)C)C,active +N1C2=C(C=CC=C2)N=N1,active +CN(C)N,active +O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-],active +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N,active +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2,active +N1=C(SSC2=NC3=C(C=CC=C3)S2)SC4=C1C=CC=C4,active +N1C(=NC2=C1C=CC=C2)C3=CSC=N3,active +[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+],active +O=C(NC3=CC2=C(C=C3)C1=CC=C(NC(C)=O)C=C1C2)C,active +NC(=S)NC1=C2C(=CC=C1)C=CC=C2,active +NC(N3C)=NC2=C3C(C)=CC1=NC=CC=C12,active +Nc(c(ccc1)C)c1C,active +CC1=CC2=CC=CN=C2C=C1,active +NC(=O)CC1=C2C(=CC=C1)C=CC=C2,active +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+],active +NC(=O)N(CC)N=O,active +O=C1C(O)=COC(CO)=C1,active +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2,active +N(C1=CC=C(C=C1)NC2=CC=CC=C2)C3=CC=CC=C3,active +CS(=O)(=O)OC,active +O=C(N)C1=C(N=CN1)/N=N/N(C)C,active +N(NC)C.[H]Cl.[H]Cl,active +COC1=CC(=C(C=C1)N)C,active +IC(I)I,active +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N,active +O=C(OCC)CBr,active +N=C(N(CCC)N=O)N[N+](=O)[O-],active +N1(C(=CN=C1C)[N+](=O)[O-])CCO,active +N=C(N(N=O)C)N[N+](=O)[O-],active +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-],active +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O,active +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl,active +N#CN(CC)N=O,active +ClC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)Cl)N,active +S=C1NCCN1,active +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1,active +O=NN(C(=O)N)CCC,active +Nc1cc(Cl)c(N)cc1.OS(O)(=O)=O,active +NC1=CC=CC(C)=C1.[H]Cl,active +NC1=CC=C3C(N=C2C=C(C=CC2=C3)N)=C1.NC4=CC=C6C(N=C5C=C(C=CC5=C6)N)=C4.Cl.Cl.O,active +NC1=CC2=C(C=CC=C2)C=C1,active +NC1=CC=CC2=C1C=CC=C2,active +O(CC1(C)C)C1=O,active +O=C(OC(COC(=O)CCCCCCC)COC(=O)CCCCCCC)CCCCCCC,active +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr,active +CCN(CC)N=O,active +NNC1=CC=CC=C1,active +NN,active +ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2],active +NNC1=CC=CC=C1.[H]Cl,active +NC1=CC=C(C2=CC=C(N)C=C2)C=C1,active +NC1=C(C=CC(=C1)N)Cl,active +NC1=C(C=CC(=C1)N)C,active +NC1=C2C(=CC=C1)C(=CC=C2)N,active +NC1=C(C=CC(=C1)NC(=O)C)OCC,active +NC1=C(C=C(C=C1)N)[N+](=O)[O-],active +O=[O+1][O-1],active +C1(NC(CN1N=O)=O)=O,active +NC1=C(C=C(C=C1Cl)N)Cl,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,active +NC1=CC=C(C=C1)N,active +CC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)C)N,active +NC1=CC=C(C=C1OC)/N=N/C2=CC=CC=C2,active +NC1=CC(=CC=C1)N,active +NC(=O)OCC,active +NC1=CC=C(C=C1)C2=CC=CC=C2,active +NC1=NC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)N,active +C=CCCl,active +C12C(=CC=CC=1NCCN)C=CC=C2.[H]Cl.[H]Cl,active +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr,active +CC(=O)NC1=CC=C(C=C1)OCC,active +CC([N+](=O)[O-])C,active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C.[H]Cl,active +Cl\C=C\CCl,active +ClC([N+](=O)[O-])(Cl)Cl,active +O=CCCl,active +C1(=CC(=C(C(=C1)N)C)N).[H]Cl.[H]Cl,active +C\C(C)=C/Cl,active +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,active +ClC(Cl)Br,active +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1,active +ClC(C(C1=CC=C(C=C1)CC)C2=CC=C(C=C2)CC)Cl,active +ClC(C1=CC=CC=C1)(Cl)Cl,active +ClC(C(O)O)(Cl)Cl,active +Cl\C=C\CCl,active +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],active +C1CN1,active +ClCCOCCCl,active +CCC1CO1,active +CC1CC(OC(O1)C)OC(=O)C,active +CC1=CC=CC2=CC=CN=C12,active +CC1CO1,active +CC1CC(OC(O1)C)OC(=O)C,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N),active +C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O,active +NC1C=CC2=C(N=1)NC3=CC=CC=C23,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl,active +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl,active +C1=CC=C2C(=C1)NC(NC2=O)C3=CC=C(S3)[N+]([O-])=O,active +N(C1=CC=CC=C1)NC2=CC=CC=C2,active +CCCCCN(N=O)C(=N)N[N+]([O-])=O,active +COC1=C(C=CC=C1)[N+](=O)[O-],active +ClCCN(CCCl)[P]1(=O)NCCCO1,active +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl,active +CN(C(=O)N)N=O,active +C1(C2=C(C=CC=C2)N)(=CC=CC=C1).[H]Cl,active +ClCCCl,active +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl,active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +ClCCl,active +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N,active +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3,active +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O,active +CNN,active +CN(C1=CC=C(C=C1)/N=N/C2=CC=CC=C2)C,active +N1C(N(CC(C1=O)C)N=O)=O,active +CN(N=O)C,active +CN(CC)N=O,active +O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC,active +ClC1=C(C=CC=C1)[N+](=O)[O-],active +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-],active +ClC1=CC(C2=CC(Cl)=C(N)C=C2)=CC=C1N.Cl.Cl,active +ClC1=CC(=C(C=C1C2=C(C=C(C(=C2)Cl)N)Cl)Cl)N,active +O=NN(CCCC)CCCC,active +ClC1(=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N).[H]Cl.[H]Cl,active +CN(C)CNc2nnc(/C=C/c1ccc(o1)[N+]([O-])=O)o2,active +O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C,active +C1(=CC(=CC=C1N)N).[H]Cl.[H]Cl,active +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-],active +ClCC(Cl)CCl,active +ClCC(=O)C1=CC=C(NC(=O)C)C=C1,active +C1CO1,active +NC1=C(C)C=C(N)C=C1.O=S(O)(O)=O,active +S=C1NC=NC2=C1N=CN2,active +ClC1=CC=CC=C1C=C(C#N)C#N,active +BrC(Br)Br,active +O1C2C1CCC(C2)C1CO1,active +O1C(=CC=C1[N+](=O)[O-])/C(=N/O)N,active +ClC/C=C/CCl,active +S=P(N1CC1)(N1CC1)N1CC1,active +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br,active +O=C(OC1=C2C(=CC=C1)C=CC=C2)NC,active +O=S1(=O)CCCO1,active +C1C(OC(O1)C(C)I)CO,active +OC(CO)CCl,active +O=NN1CCC1,active +NC1=CC(=CC=C1OC)C,active +OC(COC(C)(C)C)C,active +O=[N+](C1=CC2=CC=CN=C2C=C1)[O-],active +OC(=O)C1=CC=C(C=C1)[N+](=O)[O-],active +C1(=C(C=C(N)C=C1)[N+](=O)[O-])NCCO,active +OC(C(Cl)(Cl)Cl)P(=O)(OC)OC,active +O=P(OC=C(Cl)Cl)(OC)OC,active +O=NN(CCN1)CC1,active +O=NN(CCCCCC1)CCCCCC1,active +O=NN1CCC(=O)NC1=O,active +O=NN(CCN1N=O)CCC1,active +O=C(O[C@@H]1CCN2[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C,active +O=N[O-].[Na+],active +O=NN(CCC)CCC,active +O=NN(CC=C1)CC1,active +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl,active +O=P(H)(OC)OC,active +[O-][N+](C2=CC=C(O2)C1=CSC(NN(C)C)=N1)=O,active +O=P(OC(CCl)CCl)(OC(CCl)CCl)OC(CCl)CCl,active +O=NN1CCCC1,active +O=P(OC(=C(C(=O)N(CC)CC)Cl)C)(OC)OC,active +O=NN1CCN(N=O)CC1,active +O=NN1CCCCCC1,active +S=P(SCC(=O)NC)(OC)OC,active +OS(=O)(=O)O.NN,active +ON=C1C=CC(=NO)C=C1,active +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+],active +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,active +OCCNC1=C(OCCO)C=C([N+]([O-])=O)C=C1,active +OCC1CO1,active +OCCOCCOCCO,active +OCCNC2=C1C=CC=CC1=NC(C3=CC=C([N+]([O-])=O)S3)=N2,active +C[N+](=NC)[O-],active +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OC)OC,active +O=C1OC2=C(C=CC=C2)C=C1,active +C(C1C=CC=CC=1)(=O)N(N=O)C,active +ClCC1CO1,active +S=C(N(C)C)SSC(=S)N(C)C,active +NC1=CC=C(C=C1)Cl,active +C1=CC=CC(=N1)N(N=O)C,active +C=CBr,active +OC1=CC(=CC=C1O)CCN.[H]Cl,active +OC1=C(C=CC=C1)C2=CC=CC=C2,active +O=C(C1=CCCN(N=O)C1)OC,active +CN(C)/N=N/C1=CC=CC=C1,active +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,active +OC1=C(C([O-])=O)C=C(N=NC2=CC=C(C3=CC=C(N=NC4=C([O-])C(/N=N/C(C=C(S([O-])(=O)=O)C=C5)=C5[O-])=CC=C4O)C=C3)C=C2)C=C1.[Na+].[Na+].[Cu+2],active +OC1=C(C=C(C=C1)N)[N+](=O)[O-],active +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C,active +OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)/C=C\[C@]1(C)[C@H]4C(=O)C[C@@]23C,active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O,active +OCC(CO)(CBr)CBr,active +OCC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4,active +OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2,active +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2,active +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,active +ClCCN[P]1(=O)OCCCN1CCCl,active +[Ca+2].[N-2]C#N,active +O=C(N(CCO)N=O)N,active +O=CCCCC=O,active +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl,active +O=C(C1=CC=NC=C1)NN,active +CCOC(=O)N(C)N=O,active +O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H],active +ClC1=C(C=C(C=C1C(=O)O)Cl)N,active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-],active +O=C(N(CC)N=O)OCC,active +O=C(N(C)C)Cl,active +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C,active +O=C(N(CCCCCC)N=O)N,active +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O,active +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl,active +O=[N+]([O-])C1=CC=C(O1)/C=N/N2C(N(CCO)CC2)=O,active +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C,active +O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+],active +O=[N+](C1=CC(=C(C=C1)N)N)[O-],active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C,active +O=[N+](C1=CC(=C(C=C1)O)N)[O-],active +O=[N+](C1=CC(=C(C=C1)N)O)[O-],active +O=[N+](C1=C2C(=CC=C1)C=CC=C2)[O-],active +O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O,active +O=[N+](C1=CC(=C(C=C1)C(=O)O)N)[O-],active +O=[N+](C1=CC(=C(C(=C1)Cl)N)Cl)[O-],active +O=[N+](C1=CC=CC2=CC=CN=C12)[O-],active +CCBr,active +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl,active +O=[N+](C1=CN=C(S1)N)[O-],active +O=[N+](C1=CC=C(C=C1)Cl)[O-],active +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N,active +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-],active +O=[N+](C1=CC=C(C=C1)N)[O-],active +O=CC1CO1,active +C1(CN(N=O)CC(O1)C)C,active +C=CC=C,active +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,active +O=C1c2c(O)cc(C)cc2C(=O)c3cc(O)cc(O)c13,active +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC,active +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O,active +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O,active +ClCC1=CC=CC=C1,active +S=P(SC1C(SP(=S)(OCC)OCC)OCCO1)(OCC)OCC,active +N#CN(C)N=O,active +O=CC1=CC=CO1,active +O=CC(\Cl)=C(\Cl)C(O)=O,active +O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl,active +O=C1CCO1,active +O=C1N(C2=CC=CC=C2)N(C(=C1N(C)C)C)C,active +OC(=O)CC[N+](=O)[O-],active +O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N,active +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O,active +O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC,active +C1(C=CC=CN=1)CCl.Cl,active +O=C(OC[C@@H](C(=O)O)N)C=[N+]=[N-],active +NC1=C(C=CC(=C1)Cl)N,active +N(CCCCO)(CCCC)N=O,active +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O,active +OC1=CC=CC2=CC=CN=C12,active +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N,active +O=C1C(=C(C(=O)C(=C1Cl)Cl)Cl)Cl,active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N,active +O=C(C)NCC1=NC(=NO1)C2=CC=C(O2)[N+]([O-])=O,active +O=C=NC1=CC(N=C=O)=CC=C1C,active +N=C(N(CCCC)N=O)N[N+](=O)[O-],active +O=C(N(CCCC)N=O)N,active +ClC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N,active +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2],active +O=NN(CCO)CCO,active +C1(C2=CC=C(C=C2)N)=CC=C(C=C1)N.[H]Cl.[H]Cl,active +O=[N+](C1=CC(=C(C=C1)C)N)[O-],active +CC(C)CN(N=O)C(=N)N[N+]([O-])=O,active +OCCBr,active +CC(Cl)CCl,active +CC(C)OC1=CC=CC=C1OC(=O)N(C)N=O,active +CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C,active +C1(CN(CC(N1N=O)C)N=O)C,active +CC(CON=O)C,active +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,active +ClCCN(C)CCCl,active +C1(CCN(C1)N=O)O,active +C=C(F)F,active +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O,active +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O,active +C=C(Cl)Cl,active +O=[N+](C1=CC(=C(C=C1)OC)N)[O-],active +C=CC=O,active +CCCl,active +C=CC#N,active +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,active +C1(C(=CC=C(C=1)C)N)C.[H]Cl,active +C1(=CC=CN=C1)CCl.[H]Cl,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,active +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl,active +C13=C(C=CC=C3)NC2=CN=CC=C12,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,active +[O-][N+](=O)C1=CC=CC(=C1)NC(=O)C2=CC3=CC=CC=C3C(=C2O)/N=N/C4=CC(=CC=C4OC)[N+]([O-])=O,active +C1C(C2=CC=CC=C2)O1,active +C1=CC=CC(=C1)CCN(C)N=O,active +CC(Cl)(Cl)Cl,active +CC(CCl)OC(C)CCl,active +CC1=CC(C4=CC(C)=C(/N=N/C5=CC=C(OS(=O)(C6=CC=C(C)C=C6)=O)C=C5)C=C4)=CC=C1/N=N/C2=C(O)C=CC3=CC(S(=O)([O-])=O)=CC(S(=O)([O-])=O)=C23.[Na+].[Na+],active +CBr,active +[Ti+2](C1=CC=CC1)C2(=CC=CC2).[Cl-].[Cl-],active +C1=CC=C2C(=C1)N=C(N=C2N3CCOCC3)C4=CC=C(S4)[N+]([O-])=O,active +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2,active +Br(=O)(=O)[O-].[K+],active +O=NN1CCCCCCC1,active +BrCCBr,active +C1=C(C=CC=C1OCC2CO2)OCC3CO3,active +BrC(CCl)CBr,active +S=C(N(CC)CC)SCC(=C)Cl,active +O(C1=CC=CC=C1)CC2CO2,active +CC=C,active +C1=C2C(=CC=C1NC3=CC=C(C=C3)NC4=CC=C5C(=C4)C=CC=C5)C=CC=C2,active +[Se]=S,active +O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].Cl[O-].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+],active +CC(=C)CCl,active +C1OC1C2CO2,active +C1=C2C=CC3=CC=CC=C3C2=CC4=CC=C5C(=C14)C=CC=C5,active +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2,active +CC1=C2C3=C(C=C4C(=C3CC2)C=CC5=CC=CC=C45)C=C1,active +CC(=O)OC(C1=CC=C(O1)[N+](=O)[O-])OC(=O)C,active +C1(NC(CN1/N=C/C2=CC=C(O2)[N+](=O)[O-])C)=O,active +O=P(OC)(OC)OC,active +NC1(=CC=C(C=C1)C2=CC=CC=C2).[H]Cl,active +OC(=O)C(Cl)Cl,active +C1(N(C(C)=NC=1)C)[N+](=O)[O-],active +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,active +C1=C(C(=CC(=C1N)C)C)C.[H]Cl,active +C1(NNC(C)=O)=CC=CC=C1,active +C1N2CN3CN(C2)CN1C3,active +O=NN1CCOCC1,active +[O-][N+](C2=CC=C(O2)C1=CSC=N1)=O,active +C1=CC(=CC(=C1OCC)[N+]([O-])=O)NC(=O)C,active +O=[Cr](=O)(O[Cr](=O)(=O)[O-])[O-].[Na+].[Na+],active +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O,active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +C1(=C(C=CC=C1N)N).[H]Cl.[H]Cl,active +C1(=C(C=CC=C1)N)OC.[H]Cl,active +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,active +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl,active +O=NN(C)CCCCCCCCCCCC,active +CC(C)N(C(=O)SCC(\Cl)=C\Cl)C(C)C,active +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5,active +O=S(C1=C(/N=N/C2=CC=C(C3=CC=C(\N=N/C4=C(S(=O)([O-])=O)C=C5C(C(N)=CC(S(=O)([O-])=O)=C5)=C4O)C=C3)C=C2)C(O)=C(C(N)=CC(S(=O)([O-])=O)=C6)C6=C1)([O-])=O.[Na+].[Na+].[Na+].[Na+],active +O=NN1CCCCC1,active +[H][C@]12N(CC=C2COC([C@@](O)(C(O)(C)C)[C@H](C)OC)=O)CC[C@@H]1OC(\C(C)=C/C)=O,active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +C12C(=CC(=C(C=1O)/N=N/C3=C(C=C(C=C3)C4=CC(=C(C=C4)/N=N/C5=C(C=C6C(=C5O)C(=CC(=C6)S(=O)(=O)[O-])N)S(=O)(=O)[O-])OC)OC)S(=O)(=O)[O-])C=C(C=C2N)S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],active +ClC2(Cl)C1(Cl)C(=C)C(CCl)(CCl)C2(Cl)C(Cl)C1Cl,active +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C,active +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC,active +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O,active +C1(/N=N/C2=CC=CC=C2)=CC=CC=C1,active +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+],active +O=NN1CCSCC1,active +C1(=C(C=CC(=C1)N(CCO)CCO)NCCO)[N+]([O-])=O,active +C1(=CC=CC=C1)CCNN.S(O)(O)(=O)=O,active +O=[N+](C1=CC2=C(C=C1)NC=N2)[O-],active +O(S(=O)(=O)C)CCCCOS(=O)(C)=O,active +OC(C)CCl,active +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O,active +C=CCOCC1CO1,active +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,active +CC1=C2C=CC=CC2=C(C3=CC=C4C(=C13)C=CC=C4)C,active +CC1=CC(=C(C=C1C)N)C,active +C=O,active +C=CF,active +C1(=CC=C(N)C=C1)C.[H]Cl,active +C1(=CC=C(N)C=C1)OC.[H]Cl,active +[Na+].C1(=C(C=C(C=C1)NC2=C(C=C(C=C2)[N+](=O)[O-])[N+](=O)[O-])S(=O)(=O)[O-])NC3=CC=CC=C3,active +C1(C(=CC=C(C=1)C)C)N.[H]Cl,active +[Na+].[N-]=[N+]=[N-],active +C1(=CC(=CC=C1N)OC)OC.[H]Cl,active +[O-][N+](=O)c1ccc2c3ccccc3Cc2c1,active +C1(=CC=C(Cl)C=C1)N.[H]Cl,active +C12(C(=C(/N=N/C3=C(C4=C(C(=C3)S(=O)(=O)[O-])C=CC=C4)O)C=CC=1S(=O)(=O)[O-])C=CC=C2).[Na+].[Na+],active +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2,active +C1(C(=CC=C(C=1)N)O)N.[H]Cl.[H]Cl,active +S=C(S[Pb]SC(N(C)C)=S)N(C)C,active +C=CC1=CC=CC=C1,active +[Na+].CN(C)c1ccc(/N=N/S([O-])(=O)=O)cc1,active +C1(=NC(=NC(=N1)NC(C)=O)C2=CC=C(O2)[N+](=O)[O-])NC(C)=O,active +OO,active +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O,active +ClC6C4(Cl)C3C1C5C(C3C2OC12)C4(Cl)C(Cl)(Cl)C56Cl,active +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl,active +OCCNN,active +C=CCN(CC=C)N=O,active +C=CCl,active +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC=C(C=C3)O,active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O,active +C=CCN=C=S,active +[N+].C1(N(N=O)[O-])=CC=CC=C1,active +C(C1=CC=C(C=C1)O)(=O)OCCCC,inactive +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,inactive +S=C(N(C)C)NC,inactive +O=C1N(CCC1)C,inactive +ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl,inactive +C1(CCCCC1)N.[H]Cl,inactive +CC(Cl)Cl,inactive +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC,inactive +O=C(C1=CC=CC=C1)OOC(=O)C2=CC=CC=C2,inactive +O=C2C=1/N=C\NC=1N(C)C(=O)N2C,inactive +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,inactive +O=C1CCCCCN1,inactive +C(CCl)(F)(F)F,inactive +ClC1=CC2=C(C=C1)OC3=C(C=CC(=C3)Cl)O2,inactive +CC(=S)N,inactive +S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC,inactive +Br/C(Br)=C/[C@H]3[C@@H](C(=O)O[C@H](C#N)c2cccc(Oc1ccccc1)c2)C3(C)C,inactive +O=CC=C(CCC=C(C)C)C,inactive +ClC(Cl)Cl,inactive +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O,inactive +NC(=S)C1=CC(=NC=C1)CC,inactive +OC(=O)C1=CC(=C(C(=C1)O)O)O,inactive +C=CCC1=CC=C2C(=C1)OCO2,inactive +O=CC1=CC=CC=C1,inactive +O=C(O)CC[C@H](N)C(O)=O,inactive +NC1=C(C=CC=C1)C(=O)O,inactive +NC(NC1=CC=C(C=C1)OCC)=O,inactive +O=C/C=C/C1=CC=CC=C1,inactive +O=C1C(=CNC(=O)N1)F,inactive +S=C([S-])NCCNC([S-])=S.[Zn+2],inactive +O=C(OCC)C=C,inactive +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl,inactive +C=CC1CCC=CC1,inactive +C1(=C(C(OCCCCCCC(C)C)=O)C=CC=C1)C(OCCCCCCC(C)C)=O,inactive +CCCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)C,inactive +O=C(N(C)C)NC1=CC=C(C=C1)Cl,inactive +O=C(CC(/C=C/C2=CC=C(O)C(OC)=C2)=O)/C=C/C1=CC=C(O)C(OC)=C1,inactive +O=C(CC(C)C)OCC=C,inactive +O=C(CCCN(C)N=O)O,inactive +O=C(NCO)C=C,inactive +CC1=NC=CN1,inactive +C=CCO,inactive +O=C1[N-]S(=O)(=O)C2=CC=CC=C12.[Na+],inactive +OC1=CC(=CC=C1)O,inactive +O=C(O)CC[C@@H](C)[C@]3([H])[C@](CC2)(C)[C@](CC3)([H])[C@@](CC4)([H])[C@@]2([H])[C@]1(C)[C@@]4([H])C[C@H](O)CC1,inactive +S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC,inactive +O=C1CCCCC1,inactive +C[Hg]Cl,inactive +O=C1C2=C(N=CN2C)N(C(=O)N1C)C,inactive +O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.Cl,inactive +C[N+](CCC(C1=CC=C(C=C1)Cl)C2=NC=CC=C2)C.C(\C(=C(/C(=O)[O-])[H])[H])(=O)O,inactive +O=C1N(C=C)CCC1,inactive +C(NN)(N)=O.Cl,inactive +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC,inactive +O=C1CCCO1,inactive +C[C@]12[C@@]3(C(OC4[C@@]1(C(C(=O)C(=C4)C)O)CO)[C@@H]([C@@H]2OC(=O)C)O)CO3,inactive +C[As](=O)(C)O,inactive +[N+](=O)([O-])c1ccccc1C,inactive +O=C1C=CC(=O)C=C1,inactive +O=C1C=CC(=O)NN1,inactive +O=C1C(C2=CC=CC=C2)(C3=CC=CC=C3)NC(=O)N1,inactive +N1(C2C(SC3=C1C=CC=C3)=CC=CC=2)CC(N(C)C)C.[H]Cl,inactive +CC(CC1=CC2=C(C=C1)OCO2)S(=O)CCCCCCCC,inactive +O=C1C2=C(C=CC=C2)C(=O)O1,inactive +ClC(CCl)(Cl)Cl,inactive +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC,inactive +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,inactive +C=C(Cl)C=C,inactive +CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3,inactive +SC1=NC2=C(C=CC=C2)S1,inactive +O=C(NC1=CC=CC(=C1)C(F)(F)F)N(C)C,inactive +OC1=C(C=C(C=C1Cl)Cl)Cl,inactive +C1=C2C(=CC=C1)C=CC=C2,inactive +OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O,inactive +OC1=C(C=CC(=C1)C)O,inactive +OC1=C(C=CC(=C1)/C=C/C(=O)O)O,inactive +OC1=C(C=CC=C1)O,inactive +O=C(O[C@H](CC)[C@](O)(C)[C@H](O)[C@@H](C)C2=O)[C@H](C)[C@@H](O[C@H]3C[C@](OC)(C)[C@@H](O)[C@H](C)O3)[C@H](C)[C@H]([C@@](O)(C)C[C@H]2C)O[C@H]1[C@H](O)[C@@H]([N@H+](C)C)C[C@@H](C)O1.[O-]C(CCCCCCCCCCCCCCCCC)=O,inactive +Oc1ccc(C[C@](C)(N)C(O)=O)cc1O.OC(=O)[C@@](C)(N)Cc1cc(O)c(O)cc1.O.O.O,inactive +OC1C2=CC(=O)OC2=CCO1,inactive +OC2=C1[C@@](C=C(C)CC3)([H])[C@]3([H])C(C)(C)OC1=CC(CCCCC)=C2,inactive +[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2,inactive +OC1=CC=CC=C1,inactive +[Na+].C1(=CC=C2C(=C1S([O-])(=O)=O)C=CC=C2)/N=N/C3=C(C=CC4=C3C=CC=C4)O,inactive +OC1C2=C3C(C(OC4C3=C(C=C(C=4O)O)C(=O)O2)=O)=CC=1O,inactive +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O,inactive +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C,inactive +OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl,inactive +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +OC1=CC=C(C=C1C(C)(C)C)OC,inactive +N1C(=NC(=C2C=CC=CC=12)N(CCO)CCO)C3=CC=CS3,inactive +OC1(=C(O)C(=O)O[C@H]1[C@@H](C[O-])O).[Na+],inactive +OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO,inactive +OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-],inactive +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C,inactive +OC1=C(C=C(C=C1SC2=C(C(=CC(=C2)Cl)Cl)O)Cl)Cl,inactive +O=S(=O)(C1=CC=C(C=C1)C(=O)O)N(CCC)CCC,inactive +OC1=C(C=C(C=C1)CC=C)OC,inactive +CC(CNCC(C)O)O,inactive +[Hg+2].[Cl-].[Cl-],inactive +OC1=C(C=C(C=C1)Cl)CC2=CC=CC=C2,inactive +[C@@]12(C3=C(C=C(OC)C(=C3)OC)CCN1C[C@H](CC)[C@H](C2)C[C@@]4(C5=C(C=C(OC)C(=C5)OC)CCN4)[H])[H].[H]Cl.[H]Cl,inactive +S=C(NCC)NCC,inactive +ClC1=NC(=NC(=N1)NCC)NCC,inactive +S=C(S[Te](SC(=S)N(CC)CC)(SC(=S)N(CC)CC)SC(=S)N(CC)CC)N(CC)CC,inactive +[Cl-].[Ba+2].[Cl-].O.O,inactive +[Cl-].[Cd+2].[Cl-],inactive +S=C(NC1CCCCC1)NC1CCCCC1,inactive +S=C(N(CC)CC)SSC(=S)N(CC)CC,inactive +.[Na+].[Cl-],inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OCC)OCC,inactive +.[Cl-].[Fe+3].[Cl-].[Cl-],inactive +.[K+].[Cl-],inactive +OC(=O)C=C,inactive +[C@]13([C@@](C(=O)CO)(CC[C@H]1[C@@H]2CCC=4[C@@]([C@H]2[C@H](C3)O)(\C=C/C(C=4)=O)C)O)C,inactive +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O,inactive +S=P(OC1=CC(=C(C=C1)SC)C)(OC)OC,inactive +OCC(O)CO,inactive +C(N)(N)=O,inactive +C(CO)O,inactive +OCC1=CC=CC=C1,inactive +[Na+].[F-],inactive +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1,inactive +[K+].[K+].[O-]C(=O)C2O[Sb]3OC(C(O[Sb]1OC(=O)C2O1)C([O-])=O)C(=O)O3.O.O.O,inactive +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,inactive +P(=O)(OC)(OC)N1CCOCC1,inactive +[Cl-].C/[N+](C)=C1\C=C/C(C=C1)=C(\c2ccc(cc2)N(C)C)c3ccc(cc3)N(C)C,inactive +OCC(O)CO,inactive +S(=O)(=O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)CCCCCCCCCCCCCCC)C)C)C,inactive +O[As](=O)(C1=CC=C(C=C1)NC(=O)N)O,inactive +NC(=O)C1=C(C=CC=C1)OCC,inactive +OCCOCCO,inactive +BrC(C(=O)NC(=O)N)(CC)CC,inactive +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,inactive +O=P(OCC(CCCC)CC)(OCC(CCCC)CC)OCC(CCCC)CC,inactive +OC[P+](CO)(CO)CO.[O-]S([O-])(=O)=O.OC[P+](CO)(CO)CO,inactive +C1([C@H](CNC)O)(=CC(=CC=C1)O).[H]Cl,inactive +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N,inactive +C([N+](C)(C)C)CCl.[Cl-],inactive +C[C@H](C\C=C\C)[C@@H](O)[C@@H]1N(C)C(=O)[C@H](C(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](NC(=O)[C@H](CC(C)C)N(C)C(=O)CN(C)C(=O)[C@H](CC)NC1=O)C(C)C,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC,inactive +OC1=C(O)C=C4C(C[C@](COC2=C3C=CC(O)=C2O)([C@@]34[H])O)=C1,inactive +O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2,inactive +OC(CC(C1)C)C(C1)C(C)C,inactive +O=P(OCCCl)(OCCCl)OCCCl,inactive +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2,inactive +O=S(=O)(C1=CC=C(C=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+],inactive +ClC1=C(Cl)N=C(C(O)=O)C(Cl)=C1N,inactive +C(C1=CC=CC=C1)(C2=CC=CC=C2)OCCN(C)C.[H]Cl,inactive +C(=C/C=O)\[O-].[Na+],inactive +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)[N+](=O)[O-],inactive +NCCS(O)(=O)=O,inactive +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,inactive +O=NN(C1=CC=CC=C1)C2=CC=CC=C2,inactive +C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl,inactive +C([O-])(=O)CN(CC(=O)O)CCN(CC([O-])=O)CC([O-])=O.[Na+].[Na+].[Na+].[H]O[H].[H]O[H].[H]O[H],inactive +[H][C@]14[C@@]([C@]3([H])CC[C@@](O)(C#C)[C@](C)3CC4)([H])CCC2=CC(O)=CC=C12,inactive +FC(C(OC(F)F)Cl)(F)F,inactive +C1=C(C=CC=C1)C2=CC=CC=C2,inactive +O=C1NC(=O)NC=C1,inactive +[O-][N+](=O)CCCC,inactive +C([O-])(C)=O.[Pb+2].[O-]C(C)=O,inactive +C(/C1=C(C=C(C=C1)O)S(=O)(=O)[O-])(C2=CC=C(C=C2)N(CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)=C4/C=C/C(C=C4)=[N+](\CC5=CC(=CC=C5)S(=O)(=O)[O-])CC.[Na+].[Na+],inactive +C1=CC=C(C(O)C)C=C1,inactive +Oc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@H](O)CC[C@@H]12)c4cc3,inactive +OC(=O)CC1=CNC2=C1C=CC=C2,inactive +OC(=O)CC1=C2C(=CC=C1)C=CC=C2,inactive +OC(=O)C1=C(C=CC=C1)OC(=O)C,inactive +OC(=O)C=CC=CC,inactive +CC1=CC=CC(C=C)=C1,inactive +[O-]C1=C(I)C=C(C(C2=C(C([O-])=O)C=CC=C2)=C3C=C(C(C(I)=C3O4)=O)I)C4=C1I.[Na+].[Na+],inactive +OC(C=C)C1=CC=C2OCOC2=C1,inactive +O=C(CC(/C=C/C2=CC=C(O)C(OC)=C2)=O)/C=C/C1=CC=C(O)C(OC)=C1,inactive +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl,inactive +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC,inactive +CC3=CC=C(C=C3)\C(C2=CC=CC=N2)=C/CN1CCCC1.O.Cl,inactive +OC(=O)CCCCCCCCCCN,inactive +OC(C)C,inactive +OC(=O)CN(CC(=O)O)CC(=O)O,inactive +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C,inactive +O=C(C(SP(=O)(OC)OC)CC(=O)OCC)OCC,inactive +O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1,inactive +O=S(O)(O)=O.O[C@@H]([C@H](C)NC)[C@@]1=CC=CC=C1.O[C@@H]([C@H](C)NC)[C@@]2=CC=CC=C2,inactive +O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C,inactive +O=C3C[C@@H]4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](C)(O)CC[C@@H]12)[C@@]4(C)C\C3=C\O,inactive +O=S(C1=C3C(C=CC=C3)=C(O)C(/N=N/C2=CC(S(=O)([O-])=O)=C(C)C=C2C)=C1)([O-])=O.[Na+].[Na+],inactive +CC1=C(Cl)C(=O)OC2=C1C=CC(=C2)OP(=S)(OCC)OCC,inactive +OC(=O)[C@@H]3[C@]51C[C@@](O)(CC[C@H]1[C@@]24\C=C/[C@H](O)[C@@](C)(C(=O)O2)[C@@H]34)C(=C)C5,inactive +CC=O,inactive +ClC(=CCl)Cl,inactive +C1=CC=CC(=C1)C(C(C2=CC=CC=C2)=O)O,inactive +O1C2=C(C=CC=C2)OC3=CC=CC=C13,inactive +CN(CCO)C,inactive +[Sn+2].[Cl-].[Cl-],inactive +OB(O)O,inactive +CC(C)CC(=O)O[C@H]1C[C@]2(COC(C)=O)[C@@]4(C)[C@H](OC(C)=O)[C@@H](O)[C@@H](O[C@@H]2/C=C1/C)[C@]34CO3,inactive +CP(=O)(OC)OC,inactive +ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12,inactive +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O,inactive +O=C1OC(=O)CC1,inactive +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2,inactive +ClC1=NC(=NC(=N1)NC(C)C)NCC,inactive +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl,inactive +CC(C)(C)O,inactive +CC(C)(C)c1cc(O)ccc1O,inactive +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,inactive +CN(C1=CC=CC=C1)C,inactive +CC(C)C=O,inactive +ClC2=C(C=CC(Cl)=C2Cl)C1=C(Cl)C(Cl)=CC=C1,inactive +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl,inactive +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl,inactive +ClC1=C(C=CC(=C1)Cl)O,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)O,inactive +NC(CCSCC)C(=O)O,inactive +ClC1=C(C=CC(=C1)N)C,inactive +CCCCOP(=O)(OCCCC)OCCCC,inactive +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,inactive +O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2,inactive +CCC(CCCC)CO,inactive +CC(C=NOC(=O)NC)(SC)C,inactive +ClC1=CC(Cl)=C(/C(OP(=O)(OC)OC)=C/Cl)C=C1Cl,inactive +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3,inactive +C12(C(=CC(=C(C=1/N=N/C3=C4C(=C(C=C3)S(=O)(=O)[O-])C=CC=C4)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+].[Na+],inactive +O=C1C[C@H](C\C=C1\C)C(C)=C,inactive +ClC1=C(C=CC=C1)Cl,inactive +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,inactive +CC(C1=CC(=C(C=C1O)C)SC2=CC(=C(C=C2C)O)C(C)(C)C)(C)C,inactive +O=C1N(C2=CC=CC=C2)N=C(C1)C,inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1.Cl,inactive +O=S1(=O)CC=CC1,inactive +CN(C)P(=O)(N(C)C)N(C)C,inactive +CN(C=O)C,inactive +ClC(C(Cl)Cl)Cl,inactive +CC(=O)N,inactive +CC(=C)[C@@H]1CCC(=CC1)C,inactive +C=CCC1=CC=C(C=C1)OC,inactive +CNNCC1=CC=C(C=C1)C(=O)NC(C)C,inactive +O=C(CCC(=O)O)NN(C)C,inactive +CC(=C)CCl,inactive +NC1=CC=CC=C1,inactive +CC(=C)C#N,inactive +CN1N(C2=CC=CC=C2)C(=O)C=C1C,inactive +CCC1=CC=CC=C1,inactive +CC(=O)O[Hg]C1=CC=CC=C1,inactive +C1(=C(/C=C/C2=C(S(=O)(=O)[O-])C=C(C=C2)N)C=CC(=C1)N)S(=O)(=O)[O-].[Na+].[Na+],inactive +ClCl,inactive +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2,inactive +CC(=O)OCC1=CC=CC=C1,inactive +CC(=O)OC=C,inactive +C1CNCCN1,inactive +ClC(C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)(Cl)Cl,inactive +[Be+2].O=S(=O)([O-])[O-],inactive +CC(=C)C=C,inactive +O=P(OC2=CC=C(C)C=C2)(OC3=CC=C(C)C=C3)OC1=CC=C(C)C=C1,inactive +ClCOC,inactive +ClC(C(C1=C(C=CC=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +OC1=CC=C(C=C1)O,inactive +CN(C)C(C)=O,inactive +CC1=C(C2=C(C=CC(=C2)OC)N1C(=O)C3=CC=C(C=C3)Cl)CC(=O)O,inactive +CCN(CC)C(=O)C1=CC=CC(C)=C1,inactive +C1(=C(C)C2OC(CCC=2C(=C1OC(=O)C)C)(CCCC(CCCC(CCCC(C)C)C)C)C)C,inactive +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,inactive +CCCCCC,inactive +CC1=C2C(=CO[C@H]([C@@H]2C)C)C(=C(C1=O)C(=O)O)O,inactive +CC1=C2C(=CC=C1)C=CC=C2,inactive +Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,inactive +Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,inactive +CCCCCl,inactive +O=C(C(Cl)Cl)N[C@H](CO)[C@@H](C1=CC=C([N+]([O-])=O)C=C1)O,inactive +CC1=C(C=CC=C1)S(=O)(=O)N,inactive +CCO,inactive +C1=CC=CC=C1,inactive +Cl.CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(cccc1O)[C@@](C)(O)[C@H]4C[C@@H]23,inactive +CC1=CC=CC(C)=C1,inactive +CC1=CC(NC2=C1C=C(C=C2)OCC)(C)C,inactive +O=C(OCC)C4=C(C=CC=C4)C(C(C=C(C)C(NCC)=C3)=C3O1)=C(C=C2C)C1=C/C2=N/CC.Cl,inactive +CC1=CC(C)=C(/N=N/C2=C(C(S([O-])(=O)=O)=CC3=C2C=CC(S([O-])(=O)=O)=C3)O)C=C1C.[Na+].[Na+],inactive +[O-][N+](OCC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O)=O,inactive +CC1=CC=CC=C1,inactive +NC(=O)CCCCC(=O)N,inactive +ClC1=C(C=C(C(=C1)Cl)Cl)OCC(=O)O,inactive +CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC,inactive +CC(=O)O[Sn](OC(=O)C)(CCCC)CCCC,inactive +CCCC[Sn](O[Sn](CCCC)(CCCC)CCCC)(CCCC)CCCC,inactive +CCCC1=CC2=C(C=C1)OCO2,inactive +CC2(C)OC1(C)CCC2CC1,inactive +OC(=O)CCl,inactive +CC1=CC(=O)NC(=S)N1,inactive +O=N(=O)c1ccc(C)cc1,inactive +CC(OC1=CC=C(C=C1)NC2=CC=CC=C2)C,inactive +ClC(CCl)Cl,inactive +CC(OC)(C)C,inactive +ClC(C(Cl)Cl)(Cl)Cl,inactive +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1,inactive +C1=CC(=CC=N1)N(N=O)C,inactive +CC#N,inactive +C/C=C/C1=CC2=C(C=C1)OCO2,inactive +ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N,inactive +Cl\C2=C(/Cl)C3(Cl)C1COS(=O)OCC1C2(Cl)C3(Cl)Cl,inactive +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +CC(CO)O,inactive +OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +CC(CN(CC(C)O)CC(C)O)O,inactive +ClC1(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +ClC(=C(Cl)Cl)Cl,inactive +ClC(=CCl)Cl,inactive +ClC(Br)Br,inactive +ClC(C(=O)O)(Cl)Cl,inactive +Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl,inactive +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,inactive +N12([C@@H]([C@@H](C1=O)NC(COC3=CC=CC=C3)=O)SC([C@@H]2C(=O)[O-])(C)C).[K+],inactive +CC1(C2=CC=CC=C2)C(O1)C(=O)OCC,inactive +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +CC=CC1=CC=C(C=C1)OC,inactive +ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2,inactive +ClC(C(Cl)(Cl)Cl)(Cl)Cl,inactive +NS(C1=C(Cl)C=C(NCC2=CC=CO2)C(C(O)=O)=C1)(=O)=O,inactive +CC=NO,inactive +CC=NN(C)C=O,inactive +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,inactive +OCCN(CCO)CCO,inactive +O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO,inactive +O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4,inactive +OC2=C(C)C1=C(C(C)=C2)OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CC1,inactive +O(C)c1cc(CC=C)ccc1OC,inactive +O=C1O[C@@H]3CCN2C\C=C(\COC(=O)[C@](C)(O)[C@](C)(O)[C@H]1C)[C@@H]23,inactive +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+],inactive +O[As](=O)(C1=CC(=C(C=C1)O)[N+](=O)[O-])O,inactive +O=C(COC1=C(Cl)C=C(Cl)C=C1)OCC(CC)CCCC,inactive +[Cl-].OC[P+](CO)(CO)CO,inactive +NC(=O)C=C,inactive +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O,inactive +O[C@H]1[C@H](O[C@H](CO)[C@@H](O)[C@@H]1O)O[C@]2(CO)O[C@H](CO)[C@@H](O)[C@@H]2O,inactive +O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3,inactive +C1COS(O1)(=O)=O,inactive +O=[Mo](=O)=O,inactive +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +NC1=CC=CC=C1[H]Cl,inactive +NC1=CC(=CC=C1C)Cl,inactive +NC1=NC(=NC(=N1)N)N,inactive +N1=CC=CC=C1,inactive +[Na+].O=C([O-])[C@@H](N)CCC(O)=O,inactive +C1=C(CO)OC=C1,inactive +C1=C(C=CC=C1N)C.[H]Cl,inactive +O=C1C23C4C5C6(C(=O)C7=C(O)C(C)=CC(=C7C(C6=C(C2C5O)O)=O)O)C(C4O)C(=C3C(=O)C8=C1C(O)=C(C)C=C8O)O,inactive +C1(CCNC(NC(N)=N)=N)=CC=CC=C1.[H]Cl,inactive +O.[Na+].O.O.CCN(CC)C([S-])=S,inactive +OC1=C(C=C(C=C1)CNC(=O)CCCC/C=C/C(C)C)OC,inactive +C=CC(C1=CC=C(C=C1)OC)O,inactive +Cl[O-].[Na+],inactive +C1(N=CNN=1)N,inactive +NCC(O)=O,inactive +O=C(C=C)C1=CC=C2C(OCO2)=C1,inactive +O=C(C1=C(C=CC=C1)C(=O)OCC=C)OCC=C,inactive +O=C(C1=CC(=C(C(=C1)O)O)O)OCCC,inactive +O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC,inactive +O=S(=O)([O-])[O-].O.[Mn+2],inactive +C1(=C(C=CC=C1)C(OCCCC)=O)C(OCC2=CC=CC=C2)=O,inactive +C12(=C(C=C(C=C1C=CC(=C2/N=N/C3=CC=CC=C3)O)S(=O)(=O)[O-])S(=O)(=O)[O-]).[Na+].[Na+],inactive +O=C1OC2=C(C=CC=C2)CC1,inactive +[O-][N+](C)=O,inactive +C1(=C(C=CC(=C1)Cl)N)C.[H]Cl,inactive +C1(=C(C=CC(=C1)[C@H](CNC)O)O)O.[H]Cl,inactive +O=C(C1=CC=C(C=C1)C(=O)OC)OC,inactive +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +O=C(C1=CC=CC=C1)CCl,inactive +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,inactive +O=[N+](C1=CC=CC=C1)[O-],inactive +O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+],inactive +OC(=O)C1=CC=CC=C1,inactive +O=[N+](CC)[O-],inactive +C1(C(COCCOC(=O)CCCCCCCC=CCCCCCCCC)OCCO)OC(OCCO)CC1OCCO,inactive +CC1=CC=CC(C)=C1,inactive +FC(Cl)(Cl)Cl,inactive +C1(=CC=C(C=C1)O)NC(C)=O,inactive +.[Cl-].[Ca+2].[Cl-],inactive +C1(=C2/C(C3=CC(S(=O)(=O)[O-])=CC=C3N2)=O)/C(C4=CC(S(=O)(=O)[O-])=CC=C4N1)=O.[Na+].[Na+],inactive +O=C(C(=C)C)OC,inactive +O=S(C1=CC=C2C(C=CC(O)=C2\N=N/C3=CC=C(S(=O)([O-])=O)C=C3)=C1)([O-])=O.[Na+].[Na+],inactive +O=[N+](CCC)[O-],inactive +O=[Ti]=O,inactive +O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1,inactive +O=C([C@H](CO)[C@]2=CC=CC=C2)O[C@@H]1C[C@H](N4C)[C@@H](O3)[C@@H]3[C@@H]4C1.Br.O.O.O,inactive +CC1(CC(=CC(=O)C1)C)C,inactive +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2,inactive +ClC(=C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC,inactive +O=S(=O)([O-])[O-].O.O.O.O.O.O.[Ni+2],inactive +C12C3=C(C=CC=C3)NC1=CC=CC=2,inactive +C1=CC=C(NC(=O)C(/N=N/C2=C(Cl)C=C(C3=CC(Cl)=C(/N=N/C(C(=O)NC4=CC=CC=C4)C(=O)C)C=C3)C=C2)C(=O)C)C=C1,inactive +N1(CC(N(C(C1)C)C(C2C=CC=CC=2)=O)C)N=O,inactive +NC(=O)C1=C(C=CC=C1)C(=O)N,inactive +ClC(Cl)(Cl)Cl,inactive +NC(=O)C1=NC=CN=C1,inactive +C1=CC=C2C(=C1)C=C(C=C2)C(CNC(C)C)O,inactive +C12=C(C=CC(=C1)C(CNC(C)C)O)C=CC=C2.[H]Cl,inactive +N1C2=C(C=CC=C2)SC3=CC=CC=C13,inactive +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,inactive +OC(=O)C1=CC=CN=C1,inactive +C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2,inactive +FC(C(F)Cl)(OC(F)F)F,inactive +C([N+](C)(C)C)CO.[Cl-],inactive +NC(=S)NC1=CC=CC=C1,inactive +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3,inactive +COC1=CC=C(C=C1)O,inactive +COc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C)c4cc3,inactive +Clc1c([N+]([O-])=O)c(Cl)c(Cl)c(OC)c1Cl,inactive +ClC1=CC=CC=C1,inactive +N[C@@H](CCSCC)C(=O)O,inactive +N/1C(N(\C=C\1)C)=S,inactive +C1CCCO1,inactive +N(C(=O)N)(N=O)CC(=O)O,inactive +O=C(C)OC/C=C(C)/CC/C=C(C)/C,inactive +N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O,inactive +C1COCCO1,inactive +ClC1=CC=C(C=C1)Cl,inactive +C1=CC=C(C=N1)N(N=O)C,inactive +C12=C(C(=O)NS1(=O)=O)C=CC=C2,inactive +NC1(=CC=C(C=C1)NC2=CC=CC=C2).[H]Cl,inactive +NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl,inactive +NC1=C(C=C(C=C1Cl)Cl)Cl,inactive +C1=CC=C2C(=C1)N=C(N=C2N(CCO)CCO)C3=CC=C(S3)[N+]([O-])=O,inactive +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+],inactive +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl,inactive +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,inactive +O=C1C=C(NC(=S)N1)CCC,inactive +NC1=C(C=CC=C1)C(=O)OC/C=C/C2=CC=CC=C2,inactive +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N,inactive +C(C1C=CC(=CC=1)O)(C2=CC=C(C=C2)O)(C)C,inactive +OC(OC(O)CC)CC,inactive +NC(=O)OC,inactive +C1=COC2=C1C=CC=C2,inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1,inactive +NC(=S)N,inactive +NC(=O)CCCCC,inactive +C=C(Cl)C=C,inactive +CCCCOCCO,inactive +NC(=O)NC1=CC=C(C=C1)C,inactive +OC1=C(C=CC(=C1)O)CCCCCC,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)OCCCC,inactive +O=C(C3=CC=C6C2=C34)C1=CC=CC=C1C4=CC=C2C(C5=CC=CC=C56)=O,inactive +CC(C)=C,inactive +C1=COC=C1,inactive +NC(=S)NNC(=S)N,inactive +NC(C(=O)O)CCSC,inactive +ClC(CC(Cl)C(Cl)CCC(Cl)CC)C(Cl)C(Cl)CCl,inactive diff --git a/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mutagenicity_no_duplicates.csv b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mutagenicity_no_duplicates.csv new file mode 100644 index 0000000..835b2b1 --- /dev/null +++ b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Mutagenicity_no_duplicates.csv @@ -0,0 +1,829 @@ +STRUCTURE_SMILES,ActivityOutcome_CPDBAS_Mutagenicity +CN(C1=CC=C(C=C1)/N=N/C2=CC(=CC=C2)C)C,active +N1C2=C(C=CC=C2)N=N1,active +CN(C)N,active +O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-],active +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N,active +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2,active +N1=C(SSC2=NC3=C(C=CC=C3)S2)SC4=C1C=CC=C4,active +N1C(=NC2=C1C=CC=C2)C3=CSC=N3,active +[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+],active +O=C(NC3=CC2=C(C=C3)C1=CC=C(NC(C)=O)C=C1C2)C,active +NC(=S)NC1=C2C(=CC=C1)C=CC=C2,active +NC(N3C)=NC2=C3C(C)=CC1=NC=CC=C12,active +Nc(c(ccc1)C)c1C,active +CC1=CC2=CC=CN=C2C=C1,active +NC(=O)CC1=C2C(=CC=C1)C=CC=C2,active +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+],active +NC(=O)N(CC)N=O,active +O=C1C(O)=COC(CO)=C1,active +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2,active +N(C1=CC=C(C=C1)NC2=CC=CC=C2)C3=CC=CC=C3,active +CS(=O)(=O)OC,active +O=C(N)C1=C(N=CN1)/N=N/N(C)C,active +N(NC)C.[H]Cl.[H]Cl,active +COC1=CC(=C(C=C1)N)C,active +IC(I)I,active +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N,active +O=C(OCC)CBr,active +N=C(N(CCC)N=O)N[N+](=O)[O-],active +N1(C(=CN=C1C)[N+](=O)[O-])CCO,active +N=C(N(N=O)C)N[N+](=O)[O-],active +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-],active +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O,active +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl,active +N#CN(CC)N=O,active +ClC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)Cl)N,active +S=C1NCCN1,active +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1,active +O=NN(C(=O)N)CCC,active +Nc1cc(Cl)c(N)cc1.OS(O)(=O)=O,active +NC1=CC=C3C(N=C2C=C(C=CC2=C3)N)=C1.NC4=CC=C6C(N=C5C=C(C=CC5=C6)N)=C4.Cl.Cl.O,active +NC1=CC2=C(C=CC=C2)C=C1,active +NC1=CC=CC2=C1C=CC=C2,active +O(CC1(C)C)C1=O,active +O=C(OC(COC(=O)CCCCCCC)COC(=O)CCCCCCC)CCCCCCC,active +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr,active +CCN(CC)N=O,active +NNC1=CC=CC=C1,active +NN,active +ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2],active +NNC1=CC=CC=C1.[H]Cl,active +NC1=CC=C(C2=CC=C(N)C=C2)C=C1,active +NC1=C(C=CC(=C1)N)Cl,active +NC1=C(C=CC(=C1)N)C,active +NC1=C2C(=CC=C1)C(=CC=C2)N,active +NC1=C(C=CC(=C1)NC(=O)C)OCC,active +NC1=C(C=C(C=C1)N)[N+](=O)[O-],active +O=[O+1][O-1],active +C1(NC(CN1N=O)=O)=O,active +NC1=C(C=C(C=C1Cl)N)Cl,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,active +NC1=CC=C(C=C1)N,active +CC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)C)N,active +NC1=CC=C(C=C1OC)/N=N/C2=CC=CC=C2,active +NC1=CC(=CC=C1)N,active +NC(=O)OCC,active +NC1=CC=C(C=C1)C2=CC=CC=C2,active +NC1=NC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)N,active +C=CCCl,active +C12C(=CC=CC=1NCCN)C=CC=C2.[H]Cl.[H]Cl,active +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr,active +CC(=O)NC1=CC=C(C=C1)OCC,active +CC([N+](=O)[O-])C,active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C.[H]Cl,active +Cl\C=C\CCl,active +ClC([N+](=O)[O-])(Cl)Cl,active +O=CCCl,active +C1(=CC(=C(C(=C1)N)C)N).[H]Cl.[H]Cl,active +C\C(C)=C/Cl,active +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,active +ClC(Cl)Br,active +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1,active +ClC(C(C1=CC=C(C=C1)CC)C2=CC=C(C=C2)CC)Cl,active +ClC(C1=CC=CC=C1)(Cl)Cl,active +ClC(C(O)O)(Cl)Cl,active +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],active +C1CN1,active +ClCCOCCCl,active +CCC1CO1,active +CC1CC(OC(O1)C)OC(=O)C,active +CC1=CC=CC2=CC=CN=C12,active +CC1CO1,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N),active +C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O,active +NC1C=CC2=C(N=1)NC3=CC=CC=C23,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl,active +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl,active +C1=CC=C2C(=C1)NC(NC2=O)C3=CC=C(S3)[N+]([O-])=O,active +N(C1=CC=CC=C1)NC2=CC=CC=C2,active +CCCCCN(N=O)C(=N)N[N+]([O-])=O,active +COC1=C(C=CC=C1)[N+](=O)[O-],active +ClCCN(CCCl)[P]1(=O)NCCCO1,active +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl,active +CN(C(=O)N)N=O,active +C1(C2=C(C=CC=C2)N)(=CC=CC=C1).[H]Cl,active +ClCCCl,active +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl,active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +ClCCl,active +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N,active +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3,active +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O,active +CNN,active +CN(C1=CC=C(C=C1)/N=N/C2=CC=CC=C2)C,active +N1C(N(CC(C1=O)C)N=O)=O,active +CN(N=O)C,active +CN(CC)N=O,active +O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC,active +ClC1=C(C=CC=C1)[N+](=O)[O-],active +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-],active +ClC1=CC(C2=CC(Cl)=C(N)C=C2)=CC=C1N.Cl.Cl,active +ClC1=CC(=C(C=C1C2=C(C=C(C(=C2)Cl)N)Cl)Cl)N,active +O=NN(CCCC)CCCC,active +ClC1(=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N).[H]Cl.[H]Cl,active +CN(C)CNc2nnc(/C=C/c1ccc(o1)[N+]([O-])=O)o2,active +O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C,active +C1(=CC(=CC=C1N)N).[H]Cl.[H]Cl,active +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-],active +ClCC(Cl)CCl,active +ClCC(=O)C1=CC=C(NC(=O)C)C=C1,active +C1CO1,active +NC1=C(C)C=C(N)C=C1.O=S(O)(O)=O,active +S=C1NC=NC2=C1N=CN2,active +ClC1=CC=CC=C1C=C(C#N)C#N,active +BrC(Br)Br,active +O1C2C1CCC(C2)C1CO1,active +O1C(=CC=C1[N+](=O)[O-])/C(=N/O)N,active +ClC/C=C/CCl,active +S=P(N1CC1)(N1CC1)N1CC1,active +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br,active +O=C(OC1=C2C(=CC=C1)C=CC=C2)NC,active +O=S1(=O)CCCO1,active +C1C(OC(O1)C(C)I)CO,active +OC(CO)CCl,active +O=NN1CCC1,active +NC1=CC(=CC=C1OC)C,active +OC(COC(C)(C)C)C,active +O=[N+](C1=CC2=CC=CN=C2C=C1)[O-],active +OC(=O)C1=CC=C(C=C1)[N+](=O)[O-],active +C1(=C(C=C(N)C=C1)[N+](=O)[O-])NCCO,active +OC(C(Cl)(Cl)Cl)P(=O)(OC)OC,active +O=P(OC=C(Cl)Cl)(OC)OC,active +O=NN(CCN1)CC1,active +O=NN(CCCCCC1)CCCCCC1,active +O=NN1CCC(=O)NC1=O,active +O=NN(CCN1N=O)CCC1,active +O=C(O[C@@H]1CCN2[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C,active +O=N[O-].[Na+],active +O=NN(CCC)CCC,active +O=NN(CC=C1)CC1,active +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl,active +[O-][N+](C2=CC=C(O2)C1=CSC(NN(C)C)=N1)=O,active +O=P(OC(CCl)CCl)(OC(CCl)CCl)OC(CCl)CCl,active +O=NN1CCCC1,active +O=P(OC(=C(C(=O)N(CC)CC)Cl)C)(OC)OC,active +O=NN1CCN(N=O)CC1,active +O=NN1CCCCCC1,active +S=P(SCC(=O)NC)(OC)OC,active +OS(=O)(=O)O.NN,active +ON=C1C=CC(=NO)C=C1,active +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+],active +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,active +OCCNC1=C(OCCO)C=C([N+]([O-])=O)C=C1,active +OCC1CO1,active +OCCOCCOCCO,active +OCCNC2=C1C=CC=CC1=NC(C3=CC=C([N+]([O-])=O)S3)=N2,active +C[N+](=NC)[O-],active +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OC)OC,active +O=C1OC2=C(C=CC=C2)C=C1,active +C(C1C=CC=CC=1)(=O)N(N=O)C,active +ClCC1CO1,active +S=C(N(C)C)SSC(=S)N(C)C,active +NC1=CC=C(C=C1)Cl,active +C1=CC=CC(=N1)N(N=O)C,active +C=CBr,active +OC1=CC(=CC=C1O)CCN.[H]Cl,active +OC1=C(C=CC=C1)C2=CC=CC=C2,active +O=C(C1=CCCN(N=O)C1)OC,active +CN(C)/N=N/C1=CC=CC=C1,active +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,active +OC1=C(C([O-])=O)C=C(N=NC2=CC=C(C3=CC=C(N=NC4=C([O-])C(/N=N/C(C=C(S([O-])(=O)=O)C=C5)=C5[O-])=CC=C4O)C=C3)C=C2)C=C1.[Na+].[Na+].[Cu+2],active +OC1=C(C=C(C=C1)N)[N+](=O)[O-],active +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C,active +OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)/C=C\[C@]1(C)[C@H]4C(=O)C[C@@]23C,active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O,active +OCC(CO)(CBr)CBr,active +OCC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4,active +OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2,active +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2,active +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,active +ClCCN[P]1(=O)OCCCN1CCCl,active +[Ca+2].[N-2]C#N,active +O=C(N(CCO)N=O)N,active +O=CCCCC=O,active +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl,active +O=C(C1=CC=NC=C1)NN,active +CCOC(=O)N(C)N=O,active +O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H],active +ClC1=C(C=C(C=C1C(=O)O)Cl)N,active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-],active +O=C(N(CC)N=O)OCC,active +O=C(N(C)C)Cl,active +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C,active +O=C(N(CCCCCC)N=O)N,active +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O,active +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl,active +O=[N+]([O-])C1=CC=C(O1)/C=N/N2C(N(CCO)CC2)=O,active +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C,active +O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+],active +O=[N+](C1=CC(=C(C=C1)N)N)[O-],active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C,active +O=[N+](C1=CC(=C(C=C1)O)N)[O-],active +O=[N+](C1=CC(=C(C=C1)N)O)[O-],active +O=[N+](C1=C2C(=CC=C1)C=CC=C2)[O-],active +O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O,active +O=[N+](C1=CC(=C(C=C1)C(=O)O)N)[O-],active +O=[N+](C1=CC(=C(C(=C1)Cl)N)Cl)[O-],active +O=[N+](C1=CC=CC2=CC=CN=C12)[O-],active +CCBr,active +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl,active +O=[N+](C1=CN=C(S1)N)[O-],active +O=[N+](C1=CC=C(C=C1)Cl)[O-],active +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N,active +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-],active +O=[N+](C1=CC=C(C=C1)N)[O-],active +O=CC1CO1,active +C1(CN(N=O)CC(O1)C)C,active +C=CC=C,active +O=C1c2c(O)cc(C)cc2C(=O)c3cc(O)cc(O)c13,active +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC,active +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O,active +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O,active +ClCC1=CC=CC=C1,active +S=P(SC1C(SP(=S)(OCC)OCC)OCCO1)(OCC)OCC,active +N#CN(C)N=O,active +O=CC1=CC=CO1,active +O=CC(\Cl)=C(\Cl)C(O)=O,active +O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl,active +O=C1CCO1,active +O=C1N(C2=CC=CC=C2)N(C(=C1N(C)C)C)C,active +OC(=O)CC[N+](=O)[O-],active +O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N,active +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O,active +O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC,active +C1(C=CC=CN=1)CCl.Cl,active +O=C(OC[C@@H](C(=O)O)N)C=[N+]=[N-],active +NC1=C(C=CC(=C1)Cl)N,active +N(CCCCO)(CCCC)N=O,active +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O,active +OC1=CC=CC2=CC=CN=C12,active +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N,active +O=C1C(=C(C(=O)C(=C1Cl)Cl)Cl)Cl,active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N,active +O=C(C)NCC1=NC(=NO1)C2=CC=C(O2)[N+]([O-])=O,active +O=C=NC1=CC(N=C=O)=CC=C1C,active +N=C(N(CCCC)N=O)N[N+](=O)[O-],active +O=C(N(CCCC)N=O)N,active +ClC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N,active +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2],active +O=NN(CCO)CCO,active +C1(C2=CC=C(C=C2)N)=CC=C(C=C1)N.[H]Cl.[H]Cl,active +O=[N+](C1=CC(=C(C=C1)C)N)[O-],active +CC(C)CN(N=O)C(=N)N[N+]([O-])=O,active +OCCBr,active +CC(Cl)CCl,active +CC(C)OC1=CC=CC=C1OC(=O)N(C)N=O,active +CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C,active +C1(CN(CC(N1N=O)C)N=O)C,active +CC(CON=O)C,active +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,active +ClCCN(C)CCCl,active +C1(CCN(C1)N=O)O,active +C=C(F)F,active +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O,active +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O,active +C=C(Cl)Cl,active +O=[N+](C1=CC(=C(C=C1)OC)N)[O-],active +C=CC=O,active +CCCl,active +C=CC#N,active +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,active +C1(C(=CC=C(C=1)C)N)C.[H]Cl,active +C1(=CC=CN=C1)CCl.[H]Cl,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,active +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl,active +C13=C(C=CC=C3)NC2=CN=CC=C12,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,active +[O-][N+](=O)C1=CC=CC(=C1)NC(=O)C2=CC3=CC=CC=C3C(=C2O)/N=N/C4=CC(=CC=C4OC)[N+]([O-])=O,active +C1C(C2=CC=CC=C2)O1,active +C1=CC=CC(=C1)CCN(C)N=O,active +CC(Cl)(Cl)Cl,active +CC(CCl)OC(C)CCl,active +CC1=CC(C4=CC(C)=C(/N=N/C5=CC=C(OS(=O)(C6=CC=C(C)C=C6)=O)C=C5)C=C4)=CC=C1/N=N/C2=C(O)C=CC3=CC(S(=O)([O-])=O)=CC(S(=O)([O-])=O)=C23.[Na+].[Na+],active +CBr,active +[Ti+2](C1=CC=CC1)C2(=CC=CC2).[Cl-].[Cl-],active +C1=CC=C2C(=C1)N=C(N=C2N3CCOCC3)C4=CC=C(S4)[N+]([O-])=O,active +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2,active +Br(=O)(=O)[O-].[K+],active +O=NN1CCCCCCC1,active +BrCCBr,active +C1=C(C=CC=C1OCC2CO2)OCC3CO3,active +BrC(CCl)CBr,active +S=C(N(CC)CC)SCC(=C)Cl,active +O(C1=CC=CC=C1)CC2CO2,active +CC=C,active +C1=C2C(=CC=C1NC3=CC=C(C=C3)NC4=CC=C5C(=C4)C=CC=C5)C=CC=C2,active +[Se]=S,active +O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].Cl[O-].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+],active +C1OC1C2CO2,active +C1=C2C=CC3=CC=CC=C3C2=CC4=CC=C5C(=C14)C=CC=C5,active +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2,active +CC1=C2C3=C(C=C4C(=C3CC2)C=CC5=CC=CC=C45)C=C1,active +CC(=O)OC(C1=CC=C(O1)[N+](=O)[O-])OC(=O)C,active +C1(NC(CN1/N=C/C2=CC=C(O2)[N+](=O)[O-])C)=O,active +O=P(OC)(OC)OC,active +NC1(=CC=C(C=C1)C2=CC=CC=C2).[H]Cl,active +OC(=O)C(Cl)Cl,active +C1(N(C(C)=NC=1)C)[N+](=O)[O-],active +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,active +C1=C(C(=CC(=C1N)C)C)C.[H]Cl,active +C1(NNC(C)=O)=CC=CC=C1,active +C1N2CN3CN(C2)CN1C3,active +O=NN1CCOCC1,active +[O-][N+](C2=CC=C(O2)C1=CSC=N1)=O,active +C1=CC(=CC(=C1OCC)[N+]([O-])=O)NC(=O)C,active +O=[Cr](=O)(O[Cr](=O)(=O)[O-])[O-].[Na+].[Na+],active +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O,active +C1(=C(C=CC=C1N)N).[H]Cl.[H]Cl,active +C1(=C(C=CC=C1)N)OC.[H]Cl,active +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,active +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl,active +O=NN(C)CCCCCCCCCCCC,active +CC(C)N(C(=O)SCC(\Cl)=C\Cl)C(C)C,active +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5,active +O=S(C1=C(/N=N/C2=CC=C(C3=CC=C(\N=N/C4=C(S(=O)([O-])=O)C=C5C(C(N)=CC(S(=O)([O-])=O)=C5)=C4O)C=C3)C=C2)C(O)=C(C(N)=CC(S(=O)([O-])=O)=C6)C6=C1)([O-])=O.[Na+].[Na+].[Na+].[Na+],active +O=NN1CCCCC1,active +[H][C@]12N(CC=C2COC([C@@](O)(C(O)(C)C)[C@H](C)OC)=O)CC[C@@H]1OC(\C(C)=C/C)=O,active +C12C(=CC(=C(C=1O)/N=N/C3=C(C=C(C=C3)C4=CC(=C(C=C4)/N=N/C5=C(C=C6C(=C5O)C(=CC(=C6)S(=O)(=O)[O-])N)S(=O)(=O)[O-])OC)OC)S(=O)(=O)[O-])C=C(C=C2N)S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],active +ClC2(Cl)C1(Cl)C(=C)C(CCl)(CCl)C2(Cl)C(Cl)C1Cl,active +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C,active +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC,active +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O,active +C1(/N=N/C2=CC=CC=C2)=CC=CC=C1,active +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+],active +O=NN1CCSCC1,active +C1(=C(C=CC(=C1)N(CCO)CCO)NCCO)[N+]([O-])=O,active +C1(=CC=CC=C1)CCNN.S(O)(O)(=O)=O,active +O=[N+](C1=CC2=C(C=C1)NC=N2)[O-],active +O(S(=O)(=O)C)CCCCOS(=O)(C)=O,active +OC(C)CCl,active +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O,active +C=CCOCC1CO1,active +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,active +CC1=C2C=CC=CC2=C(C3=CC=C4C(=C13)C=CC=C4)C,active +CC1=CC(=C(C=C1C)N)C,active +C=O,active +C=CF,active +C1(=CC=C(N)C=C1)C.[H]Cl,active +C1(=CC=C(N)C=C1)OC.[H]Cl,active +[Na+].C1(=C(C=C(C=C1)NC2=C(C=C(C=C2)[N+](=O)[O-])[N+](=O)[O-])S(=O)(=O)[O-])NC3=CC=CC=C3,active +C1(C(=CC=C(C=1)C)C)N.[H]Cl,active +[Na+].[N-]=[N+]=[N-],active +C1(=CC(=CC=C1N)OC)OC.[H]Cl,active +[O-][N+](=O)c1ccc2c3ccccc3Cc2c1,active +C1(=CC=C(Cl)C=C1)N.[H]Cl,active +C12(C(=C(/N=N/C3=C(C4=C(C(=C3)S(=O)(=O)[O-])C=CC=C4)O)C=CC=1S(=O)(=O)[O-])C=CC=C2).[Na+].[Na+],active +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2,active +C1(C(=CC=C(C=1)N)O)N.[H]Cl.[H]Cl,active +S=C(S[Pb]SC(N(C)C)=S)N(C)C,active +C=CC1=CC=CC=C1,active +[Na+].CN(C)c1ccc(/N=N/S([O-])(=O)=O)cc1,active +C1(=NC(=NC(=N1)NC(C)=O)C2=CC=C(O2)[N+](=O)[O-])NC(C)=O,active +OO,active +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O,active +ClC6C4(Cl)C3C1C5C(C3C2OC12)C4(Cl)C(Cl)(Cl)C56Cl,active +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl,active +OCCNN,active +C=CCN(CC=C)N=O,active +C=CCl,active +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC=C(C=C3)O,active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O,active +C=CCN=C=S,active +[N+].C1(N(N=O)[O-])=CC=CC=C1,active +C(C1=CC=C(C=C1)O)(=O)OCCCC,inactive +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,inactive +S=C(N(C)C)NC,inactive +O=C1N(CCC1)C,inactive +ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl,inactive +C1(CCCCC1)N.[H]Cl,inactive +CC(Cl)Cl,inactive +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC,inactive +O=C(C1=CC=CC=C1)OOC(=O)C2=CC=CC=C2,inactive +O=C2C=1/N=C\NC=1N(C)C(=O)N2C,inactive +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,inactive +O=C1CCCCCN1,inactive +C(CCl)(F)(F)F,inactive +ClC1=CC2=C(C=C1)OC3=C(C=CC(=C3)Cl)O2,inactive +CC(=S)N,inactive +S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC,inactive +Br/C(Br)=C/[C@H]3[C@@H](C(=O)O[C@H](C#N)c2cccc(Oc1ccccc1)c2)C3(C)C,inactive +O=CC=C(CCC=C(C)C)C,inactive +ClC(Cl)Cl,inactive +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O,inactive +NC(=S)C1=CC(=NC=C1)CC,inactive +OC(=O)C1=CC(=C(C(=C1)O)O)O,inactive +C=CCC1=CC=C2C(=C1)OCO2,inactive +O=CC1=CC=CC=C1,inactive +O=C(O)CC[C@H](N)C(O)=O,inactive +NC1=C(C=CC=C1)C(=O)O,inactive +NC(NC1=CC=C(C=C1)OCC)=O,inactive +O=C/C=C/C1=CC=CC=C1,inactive +O=C1C(=CNC(=O)N1)F,inactive +S=C([S-])NCCNC([S-])=S.[Zn+2],inactive +O=C(OCC)C=C,inactive +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl,inactive +C=CC1CCC=CC1,inactive +C1(=C(C(OCCCCCCC(C)C)=O)C=CC=C1)C(OCCCCCCC(C)C)=O,inactive +CCCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)C,inactive +O=C(N(C)C)NC1=CC=C(C=C1)Cl,inactive +O=C(CC(/C=C/C2=CC=C(O)C(OC)=C2)=O)/C=C/C1=CC=C(O)C(OC)=C1,inactive +O=C(CC(C)C)OCC=C,inactive +O=C(CCCN(C)N=O)O,inactive +O=C(NCO)C=C,inactive +CC1=NC=CN1,inactive +C=CCO,inactive +O=C1[N-]S(=O)(=O)C2=CC=CC=C12.[Na+],inactive +OC1=CC(=CC=C1)O,inactive +O=C(O)CC[C@@H](C)[C@]3([H])[C@](CC2)(C)[C@](CC3)([H])[C@@](CC4)([H])[C@@]2([H])[C@]1(C)[C@@]4([H])C[C@H](O)CC1,inactive +S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC,inactive +O=C1CCCCC1,inactive +C[Hg]Cl,inactive +O=C1C2=C(N=CN2C)N(C(=O)N1C)C,inactive +O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.Cl,inactive +C[N+](CCC(C1=CC=C(C=C1)Cl)C2=NC=CC=C2)C.C(\C(=C(/C(=O)[O-])[H])[H])(=O)O,inactive +O=C1N(C=C)CCC1,inactive +C(NN)(N)=O.Cl,inactive +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC,inactive +O=C1CCCO1,inactive +C[C@]12[C@@]3(C(OC4[C@@]1(C(C(=O)C(=C4)C)O)CO)[C@@H]([C@@H]2OC(=O)C)O)CO3,inactive +C[As](=O)(C)O,inactive +[N+](=O)([O-])c1ccccc1C,inactive +O=C1C=CC(=O)C=C1,inactive +O=C1C=CC(=O)NN1,inactive +O=C1C(C2=CC=CC=C2)(C3=CC=CC=C3)NC(=O)N1,inactive +N1(C2C(SC3=C1C=CC=C3)=CC=CC=2)CC(N(C)C)C.[H]Cl,inactive +CC(CC1=CC2=C(C=C1)OCO2)S(=O)CCCCCCCC,inactive +O=C1C2=C(C=CC=C2)C(=O)O1,inactive +ClC(CCl)(Cl)Cl,inactive +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC,inactive +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,inactive +C=C(Cl)C=C,inactive +CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3,inactive +SC1=NC2=C(C=CC=C2)S1,inactive +O=C(NC1=CC=CC(=C1)C(F)(F)F)N(C)C,inactive +OC1=C(C=C(C=C1Cl)Cl)Cl,inactive +C1=C2C(=CC=C1)C=CC=C2,inactive +OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O,inactive +OC1=C(C=CC(=C1)C)O,inactive +OC1=C(C=CC(=C1)/C=C/C(=O)O)O,inactive +OC1=C(C=CC=C1)O,inactive +O=C(O[C@H](CC)[C@](O)(C)[C@H](O)[C@@H](C)C2=O)[C@H](C)[C@@H](O[C@H]3C[C@](OC)(C)[C@@H](O)[C@H](C)O3)[C@H](C)[C@H]([C@@](O)(C)C[C@H]2C)O[C@H]1[C@H](O)[C@@H]([N@H+](C)C)C[C@@H](C)O1.[O-]C(CCCCCCCCCCCCCCCCC)=O,inactive +Oc1ccc(C[C@](C)(N)C(O)=O)cc1O.OC(=O)[C@@](C)(N)Cc1cc(O)c(O)cc1.O.O.O,inactive +OC1C2=CC(=O)OC2=CCO1,inactive +OC2=C1[C@@](C=C(C)CC3)([H])[C@]3([H])C(C)(C)OC1=CC(CCCCC)=C2,inactive +[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2,inactive +OC1=CC=CC=C1,inactive +[Na+].C1(=CC=C2C(=C1S([O-])(=O)=O)C=CC=C2)/N=N/C3=C(C=CC4=C3C=CC=C4)O,inactive +OC1C2=C3C(C(OC4C3=C(C=C(C=4O)O)C(=O)O2)=O)=CC=1O,inactive +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O,inactive +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C,inactive +OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl,inactive +OC1=CC=C(C=C1C(C)(C)C)OC,inactive +N1C(=NC(=C2C=CC=CC=12)N(CCO)CCO)C3=CC=CS3,inactive +OC1(=C(O)C(=O)O[C@H]1[C@@H](C[O-])O).[Na+],inactive +OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO,inactive +OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-],inactive +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C,inactive +OC1=C(C=C(C=C1SC2=C(C(=CC(=C2)Cl)Cl)O)Cl)Cl,inactive +O=S(=O)(C1=CC=C(C=C1)C(=O)O)N(CCC)CCC,inactive +OC1=C(C=C(C=C1)CC=C)OC,inactive +CC(CNCC(C)O)O,inactive +[Hg+2].[Cl-].[Cl-],inactive +OC1=C(C=C(C=C1)Cl)CC2=CC=CC=C2,inactive +[C@@]12(C3=C(C=C(OC)C(=C3)OC)CCN1C[C@H](CC)[C@H](C2)C[C@@]4(C5=C(C=C(OC)C(=C5)OC)CCN4)[H])[H].[H]Cl.[H]Cl,inactive +S=C(NCC)NCC,inactive +ClC1=NC(=NC(=N1)NCC)NCC,inactive +S=C(S[Te](SC(=S)N(CC)CC)(SC(=S)N(CC)CC)SC(=S)N(CC)CC)N(CC)CC,inactive +[Cl-].[Ba+2].[Cl-].O.O,inactive +[Cl-].[Cd+2].[Cl-],inactive +S=C(NC1CCCCC1)NC1CCCCC1,inactive +S=C(N(CC)CC)SSC(=S)N(CC)CC,inactive +.[Na+].[Cl-],inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OCC)OCC,inactive +.[Cl-].[Fe+3].[Cl-].[Cl-],inactive +.[K+].[Cl-],inactive +OC(=O)C=C,inactive +[C@]13([C@@](C(=O)CO)(CC[C@H]1[C@@H]2CCC=4[C@@]([C@H]2[C@H](C3)O)(\C=C/C(C=4)=O)C)O)C,inactive +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O,inactive +S=P(OC1=CC(=C(C=C1)SC)C)(OC)OC,inactive +OCC(O)CO,inactive +C(N)(N)=O,inactive +C(CO)O,inactive +OCC1=CC=CC=C1,inactive +[Na+].[F-],inactive +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1,inactive +[K+].[K+].[O-]C(=O)C2O[Sb]3OC(C(O[Sb]1OC(=O)C2O1)C([O-])=O)C(=O)O3.O.O.O,inactive +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,inactive +P(=O)(OC)(OC)N1CCOCC1,inactive +[Cl-].C/[N+](C)=C1\C=C/C(C=C1)=C(\c2ccc(cc2)N(C)C)c3ccc(cc3)N(C)C,inactive +S(=O)(=O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)CCCCCCCCCCCCCCC)C)C)C,inactive +O[As](=O)(C1=CC=C(C=C1)NC(=O)N)O,inactive +NC(=O)C1=C(C=CC=C1)OCC,inactive +OCCOCCO,inactive +BrC(C(=O)NC(=O)N)(CC)CC,inactive +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,inactive +O=P(OCC(CCCC)CC)(OCC(CCCC)CC)OCC(CCCC)CC,inactive +OC[P+](CO)(CO)CO.[O-]S([O-])(=O)=O.OC[P+](CO)(CO)CO,inactive +C1([C@H](CNC)O)(=CC(=CC=C1)O).[H]Cl,inactive +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N,inactive +C([N+](C)(C)C)CCl.[Cl-],inactive +C[C@H](C\C=C\C)[C@@H](O)[C@@H]1N(C)C(=O)[C@H](C(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](NC(=O)[C@H](CC(C)C)N(C)C(=O)CN(C)C(=O)[C@H](CC)NC1=O)C(C)C,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC,inactive +OC1=C(O)C=C4C(C[C@](COC2=C3C=CC(O)=C2O)([C@@]34[H])O)=C1,inactive +O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2,inactive +OC(CC(C1)C)C(C1)C(C)C,inactive +O=P(OCCCl)(OCCCl)OCCCl,inactive +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2,inactive +O=S(=O)(C1=CC=C(C=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+],inactive +ClC1=C(Cl)N=C(C(O)=O)C(Cl)=C1N,inactive +C(C1=CC=CC=C1)(C2=CC=CC=C2)OCCN(C)C.[H]Cl,inactive +C(=C/C=O)\[O-].[Na+],inactive +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)[N+](=O)[O-],inactive +NCCS(O)(=O)=O,inactive +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,inactive +O=NN(C1=CC=CC=C1)C2=CC=CC=C2,inactive +C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl,inactive +C([O-])(=O)CN(CC(=O)O)CCN(CC([O-])=O)CC([O-])=O.[Na+].[Na+].[Na+].[H]O[H].[H]O[H].[H]O[H],inactive +[H][C@]14[C@@]([C@]3([H])CC[C@@](O)(C#C)[C@](C)3CC4)([H])CCC2=CC(O)=CC=C12,inactive +FC(C(OC(F)F)Cl)(F)F,inactive +C1=C(C=CC=C1)C2=CC=CC=C2,inactive +O=C1NC(=O)NC=C1,inactive +[O-][N+](=O)CCCC,inactive +C([O-])(C)=O.[Pb+2].[O-]C(C)=O,inactive +C(/C1=C(C=C(C=C1)O)S(=O)(=O)[O-])(C2=CC=C(C=C2)N(CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)=C4/C=C/C(C=C4)=[N+](\CC5=CC(=CC=C5)S(=O)(=O)[O-])CC.[Na+].[Na+],inactive +C1=CC=C(C(O)C)C=C1,inactive +Oc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@H](O)CC[C@@H]12)c4cc3,inactive +OC(=O)CC1=CNC2=C1C=CC=C2,inactive +OC(=O)CC1=C2C(=CC=C1)C=CC=C2,inactive +OC(=O)C1=C(C=CC=C1)OC(=O)C,inactive +OC(=O)C=CC=CC,inactive +CC1=CC=CC(C=C)=C1,inactive +[O-]C1=C(I)C=C(C(C2=C(C([O-])=O)C=CC=C2)=C3C=C(C(C(I)=C3O4)=O)I)C4=C1I.[Na+].[Na+],inactive +OC(C=C)C1=CC=C2OCOC2=C1,inactive +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl,inactive +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC,inactive +CC3=CC=C(C=C3)\C(C2=CC=CC=N2)=C/CN1CCCC1.O.Cl,inactive +OC(=O)CCCCCCCCCCN,inactive +OC(C)C,inactive +OC(=O)CN(CC(=O)O)CC(=O)O,inactive +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C,inactive +O=C(C(SP(=O)(OC)OC)CC(=O)OCC)OCC,inactive +O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1,inactive +O=S(O)(O)=O.O[C@@H]([C@H](C)NC)[C@@]1=CC=CC=C1.O[C@@H]([C@H](C)NC)[C@@]2=CC=CC=C2,inactive +O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C,inactive +O=C3C[C@@H]4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](C)(O)CC[C@@H]12)[C@@]4(C)C\C3=C\O,inactive +O=S(C1=C3C(C=CC=C3)=C(O)C(/N=N/C2=CC(S(=O)([O-])=O)=C(C)C=C2C)=C1)([O-])=O.[Na+].[Na+],inactive +CC1=C(Cl)C(=O)OC2=C1C=CC(=C2)OP(=S)(OCC)OCC,inactive +OC(=O)[C@@H]3[C@]51C[C@@](O)(CC[C@H]1[C@@]24\C=C/[C@H](O)[C@@](C)(C(=O)O2)[C@@H]34)C(=C)C5,inactive +CC=O,inactive +ClC(=CCl)Cl,inactive +C1=CC=CC(=C1)C(C(C2=CC=CC=C2)=O)O,inactive +O1C2=C(C=CC=C2)OC3=CC=CC=C13,inactive +CN(CCO)C,inactive +[Sn+2].[Cl-].[Cl-],inactive +OB(O)O,inactive +CC(C)CC(=O)O[C@H]1C[C@]2(COC(C)=O)[C@@]4(C)[C@H](OC(C)=O)[C@@H](O)[C@@H](O[C@@H]2/C=C1/C)[C@]34CO3,inactive +CP(=O)(OC)OC,inactive +ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12,inactive +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O,inactive +O=C1OC(=O)CC1,inactive +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2,inactive +ClC1=NC(=NC(=N1)NC(C)C)NCC,inactive +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl,inactive +CC(C)(C)O,inactive +CC(C)(C)c1cc(O)ccc1O,inactive +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,inactive +CN(C1=CC=CC=C1)C,inactive +CC(C)C=O,inactive +ClC2=C(C=CC(Cl)=C2Cl)C1=C(Cl)C(Cl)=CC=C1,inactive +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl,inactive +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl,inactive +ClC1=C(C=CC(=C1)Cl)O,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)O,inactive +NC(CCSCC)C(=O)O,inactive +ClC1=C(C=CC(=C1)N)C,inactive +CCCCOP(=O)(OCCCC)OCCCC,inactive +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,inactive +O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2,inactive +CCC(CCCC)CO,inactive +CC(C=NOC(=O)NC)(SC)C,inactive +ClC1=CC(Cl)=C(/C(OP(=O)(OC)OC)=C/Cl)C=C1Cl,inactive +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3,inactive +C12(C(=CC(=C(C=1/N=N/C3=C4C(=C(C=C3)S(=O)(=O)[O-])C=CC=C4)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+].[Na+],inactive +O=C1C[C@H](C\C=C1\C)C(C)=C,inactive +ClC1=C(C=CC=C1)Cl,inactive +CC(C1=CC(=C(C=C1O)C)SC2=CC(=C(C=C2C)O)C(C)(C)C)(C)C,inactive +O=C1N(C2=CC=CC=C2)N=C(C1)C,inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1.Cl,inactive +O=S1(=O)CC=CC1,inactive +CN(C)P(=O)(N(C)C)N(C)C,inactive +CN(C=O)C,inactive +ClC(C(Cl)Cl)Cl,inactive +CC(=O)N,inactive +CC(=C)[C@@H]1CCC(=CC1)C,inactive +C=CCC1=CC=C(C=C1)OC,inactive +CNNCC1=CC=C(C=C1)C(=O)NC(C)C,inactive +O=C(CCC(=O)O)NN(C)C,inactive +NC1=CC=CC=C1,inactive +CC(=C)C#N,inactive +CN1N(C2=CC=CC=C2)C(=O)C=C1C,inactive +CCC1=CC=CC=C1,inactive +CC(=O)O[Hg]C1=CC=CC=C1,inactive +C1(=C(/C=C/C2=C(S(=O)(=O)[O-])C=C(C=C2)N)C=CC(=C1)N)S(=O)(=O)[O-].[Na+].[Na+],inactive +ClCl,inactive +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2,inactive +CC(=O)OCC1=CC=CC=C1,inactive +CC(=O)OC=C,inactive +C1CNCCN1,inactive +ClC(C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)(Cl)Cl,inactive +[Be+2].O=S(=O)([O-])[O-],inactive +CC(=C)C=C,inactive +O=P(OC2=CC=C(C)C=C2)(OC3=CC=C(C)C=C3)OC1=CC=C(C)C=C1,inactive +ClCOC,inactive +ClC(C(C1=C(C=CC=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +OC1=CC=C(C=C1)O,inactive +CN(C)C(C)=O,inactive +CC1=C(C2=C(C=CC(=C2)OC)N1C(=O)C3=CC=C(C=C3)Cl)CC(=O)O,inactive +CCN(CC)C(=O)C1=CC=CC(C)=C1,inactive +C1(=C(C)C2OC(CCC=2C(=C1OC(=O)C)C)(CCCC(CCCC(CCCC(C)C)C)C)C)C,inactive +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,inactive +CCCCCC,inactive +CC1=C2C(=CO[C@H]([C@@H]2C)C)C(=C(C1=O)C(=O)O)O,inactive +CC1=C2C(=CC=C1)C=CC=C2,inactive +Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,inactive +Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,inactive +CCCCCl,inactive +O=C(C(Cl)Cl)N[C@H](CO)[C@@H](C1=CC=C([N+]([O-])=O)C=C1)O,inactive +CC1=C(C=CC=C1)S(=O)(=O)N,inactive +CCO,inactive +C1=CC=CC=C1,inactive +Cl.CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(cccc1O)[C@@](C)(O)[C@H]4C[C@@H]23,inactive +CC1=CC=CC(C)=C1,inactive +CC1=CC(NC2=C1C=C(C=C2)OCC)(C)C,inactive +O=C(OCC)C4=C(C=CC=C4)C(C(C=C(C)C(NCC)=C3)=C3O1)=C(C=C2C)C1=C/C2=N/CC.Cl,inactive +CC1=CC(C)=C(/N=N/C2=C(C(S([O-])(=O)=O)=CC3=C2C=CC(S([O-])(=O)=O)=C3)O)C=C1C.[Na+].[Na+],inactive +[O-][N+](OCC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O)=O,inactive +CC1=CC=CC=C1,inactive +NC(=O)CCCCC(=O)N,inactive +ClC1=C(C=C(C(=C1)Cl)Cl)OCC(=O)O,inactive +CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC,inactive +CC(=O)O[Sn](OC(=O)C)(CCCC)CCCC,inactive +CCCC[Sn](O[Sn](CCCC)(CCCC)CCCC)(CCCC)CCCC,inactive +CCCC1=CC2=C(C=C1)OCO2,inactive +CC2(C)OC1(C)CCC2CC1,inactive +OC(=O)CCl,inactive +CC1=CC(=O)NC(=S)N1,inactive +O=N(=O)c1ccc(C)cc1,inactive +CC(OC1=CC=C(C=C1)NC2=CC=CC=C2)C,inactive +ClC(CCl)Cl,inactive +CC(OC)(C)C,inactive +ClC(C(Cl)Cl)(Cl)Cl,inactive +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1,inactive +C1=CC(=CC=N1)N(N=O)C,inactive +CC#N,inactive +C/C=C/C1=CC2=C(C=C1)OCO2,inactive +ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N,inactive +Cl\C2=C(/Cl)C3(Cl)C1COS(=O)OCC1C2(Cl)C3(Cl)Cl,inactive +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +CC(CO)O,inactive +OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +CC(CN(CC(C)O)CC(C)O)O,inactive +ClC1(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +ClC(=C(Cl)Cl)Cl,inactive +ClC(Br)Br,inactive +ClC(C(=O)O)(Cl)Cl,inactive +Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl,inactive +N12([C@@H]([C@@H](C1=O)NC(COC3=CC=CC=C3)=O)SC([C@@H]2C(=O)[O-])(C)C).[K+],inactive +CC1(C2=CC=CC=C2)C(O1)C(=O)OCC,inactive +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +CC=CC1=CC=C(C=C1)OC,inactive +ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2,inactive +ClC(C(Cl)(Cl)Cl)(Cl)Cl,inactive +NS(C1=C(Cl)C=C(NCC2=CC=CO2)C(C(O)=O)=C1)(=O)=O,inactive +CC=NO,inactive +CC=NN(C)C=O,inactive +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,inactive +OCCN(CCO)CCO,inactive +O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO,inactive +O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4,inactive +OC2=C(C)C1=C(C(C)=C2)OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CC1,inactive +O(C)c1cc(CC=C)ccc1OC,inactive +O=C1O[C@@H]3CCN2C\C=C(\COC(=O)[C@](C)(O)[C@](C)(O)[C@H]1C)[C@@H]23,inactive +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+],inactive +O[As](=O)(C1=CC(=C(C=C1)O)[N+](=O)[O-])O,inactive +O=C(COC1=C(Cl)C=C(Cl)C=C1)OCC(CC)CCCC,inactive +[Cl-].OC[P+](CO)(CO)CO,inactive +NC(=O)C=C,inactive +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O,inactive +O[C@H]1[C@H](O[C@H](CO)[C@@H](O)[C@@H]1O)O[C@]2(CO)O[C@H](CO)[C@@H](O)[C@@H]2O,inactive +O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3,inactive +C1COS(O1)(=O)=O,inactive +O=[Mo](=O)=O,inactive +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +NC1=CC=CC=C1[H]Cl,inactive +NC1=CC(=CC=C1C)Cl,inactive +NC1=NC(=NC(=N1)N)N,inactive +N1=CC=CC=C1,inactive +[Na+].O=C([O-])[C@@H](N)CCC(O)=O,inactive +C1=C(CO)OC=C1,inactive +O=C1C23C4C5C6(C(=O)C7=C(O)C(C)=CC(=C7C(C6=C(C2C5O)O)=O)O)C(C4O)C(=C3C(=O)C8=C1C(O)=C(C)C=C8O)O,inactive +C1(CCNC(NC(N)=N)=N)=CC=CC=C1.[H]Cl,inactive +O.[Na+].O.O.CCN(CC)C([S-])=S,inactive +OC1=C(C=C(C=C1)CNC(=O)CCCC/C=C/C(C)C)OC,inactive +C=CC(C1=CC=C(C=C1)OC)O,inactive +Cl[O-].[Na+],inactive +C1(N=CNN=1)N,inactive +NCC(O)=O,inactive +O=C(C=C)C1=CC=C2C(OCO2)=C1,inactive +O=C(C1=C(C=CC=C1)C(=O)OCC=C)OCC=C,inactive +O=C(C1=CC(=C(C(=C1)O)O)O)OCCC,inactive +O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC,inactive +O=S(=O)([O-])[O-].O.[Mn+2],inactive +C1(=C(C=CC=C1)C(OCCCC)=O)C(OCC2=CC=CC=C2)=O,inactive +C12(=C(C=C(C=C1C=CC(=C2/N=N/C3=CC=CC=C3)O)S(=O)(=O)[O-])S(=O)(=O)[O-]).[Na+].[Na+],inactive +O=C1OC2=C(C=CC=C2)CC1,inactive +[O-][N+](C)=O,inactive +C1(=C(C=CC(=C1)Cl)N)C.[H]Cl,inactive +C1(=C(C=CC(=C1)[C@H](CNC)O)O)O.[H]Cl,inactive +O=C(C1=CC=C(C=C1)C(=O)OC)OC,inactive +O=C(C1=CC=CC=C1)CCl,inactive +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,inactive +O=[N+](C1=CC=CC=C1)[O-],inactive +O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+],inactive +OC(=O)C1=CC=CC=C1,inactive +O=[N+](CC)[O-],inactive +C1(C(COCCOC(=O)CCCCCCCC=CCCCCCCCC)OCCO)OC(OCCO)CC1OCCO,inactive +FC(Cl)(Cl)Cl,inactive +C1(=CC=C(C=C1)O)NC(C)=O,inactive +.[Cl-].[Ca+2].[Cl-],inactive +C1(=C2/C(C3=CC(S(=O)(=O)[O-])=CC=C3N2)=O)/C(C4=CC(S(=O)(=O)[O-])=CC=C4N1)=O.[Na+].[Na+],inactive +O=C(C(=C)C)OC,inactive +O=S(C1=CC=C2C(C=CC(O)=C2\N=N/C3=CC=C(S(=O)([O-])=O)C=C3)=C1)([O-])=O.[Na+].[Na+],inactive +O=[N+](CCC)[O-],inactive +O=[Ti]=O,inactive +O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1,inactive +O=C([C@H](CO)[C@]2=CC=CC=C2)O[C@@H]1C[C@H](N4C)[C@@H](O3)[C@@H]3[C@@H]4C1.Br.O.O.O,inactive +CC1(CC(=CC(=O)C1)C)C,inactive +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2,inactive +ClC(=C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC,inactive +O=S(=O)([O-])[O-].O.O.O.O.O.O.[Ni+2],inactive +C12C3=C(C=CC=C3)NC1=CC=CC=2,inactive +C1=CC=C(NC(=O)C(/N=N/C2=C(Cl)C=C(C3=CC(Cl)=C(/N=N/C(C(=O)NC4=CC=CC=C4)C(=O)C)C=C3)C=C2)C(=O)C)C=C1,inactive +N1(CC(N(C(C1)C)C(C2C=CC=CC=2)=O)C)N=O,inactive +NC(=O)C1=C(C=CC=C1)C(=O)N,inactive +ClC(Cl)(Cl)Cl,inactive +NC(=O)C1=NC=CN=C1,inactive +C1=CC=C2C(=C1)C=C(C=C2)C(CNC(C)C)O,inactive +C12=C(C=CC(=C1)C(CNC(C)C)O)C=CC=C2.[H]Cl,inactive +N1C2=C(C=CC=C2)SC3=CC=CC=C13,inactive +OC(=O)C1=CC=CN=C1,inactive +C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2,inactive +FC(C(F)Cl)(OC(F)F)F,inactive +C([N+](C)(C)C)CO.[Cl-],inactive +NC(=S)NC1=CC=CC=C1,inactive +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3,inactive +COC1=CC=C(C=C1)O,inactive +COc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C)c4cc3,inactive +Clc1c([N+]([O-])=O)c(Cl)c(Cl)c(OC)c1Cl,inactive +ClC1=CC=CC=C1,inactive +N[C@@H](CCSCC)C(=O)O,inactive +N/1C(N(\C=C\1)C)=S,inactive +C1CCCO1,inactive +N(C(=O)N)(N=O)CC(=O)O,inactive +O=C(C)OC/C=C(C)/CC/C=C(C)/C,inactive +N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O,inactive +C1COCCO1,inactive +ClC1=CC=C(C=C1)Cl,inactive +C1=CC=C(C=N1)N(N=O)C,inactive +C12=C(C(=O)NS1(=O)=O)C=CC=C2,inactive +NC1(=CC=C(C=C1)NC2=CC=CC=C2).[H]Cl,inactive +NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl,inactive +NC1=C(C=C(C=C1Cl)Cl)Cl,inactive +C1=CC=C2C(=C1)N=C(N=C2N(CCO)CCO)C3=CC=C(S3)[N+]([O-])=O,inactive +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+],inactive +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl,inactive +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,inactive +O=C1C=C(NC(=S)N1)CCC,inactive +NC1=C(C=CC=C1)C(=O)OC/C=C/C2=CC=CC=C2,inactive +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N,inactive +C(C1C=CC(=CC=1)O)(C2=CC=C(C=C2)O)(C)C,inactive +OC(OC(O)CC)CC,inactive +NC(=O)OC,inactive +C1=COC2=C1C=CC=C2,inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1,inactive +NC(=S)N,inactive +NC(=O)CCCCC,inactive +CCCCOCCO,inactive +NC(=O)NC1=CC=C(C=C1)C,inactive +OC1=C(C=CC(=C1)O)CCCCCC,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)OCCCC,inactive +O=C(C3=CC=C6C2=C34)C1=CC=CC=C1C4=CC=C2C(C5=CC=CC=C56)=O,inactive +CC(C)=C,inactive +C1=COC=C1,inactive +NC(=S)NNC(=S)N,inactive +NC(C(=O)O)CCSC,inactive +ClC(CC(Cl)C(Cl)CCC(Cl)CC)C(Cl)C(Cl)CCl,inactive diff --git a/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Rat.csv b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Rat.csv new file mode 100644 index 0000000..5136286 --- /dev/null +++ b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_Rat.csv @@ -0,0 +1,1198 @@ +STRUCTURE_SMILES,ActivityOutcome_CPDBAS_Rat +[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2,active +N(CC(F)(F)F)(CC)N=O,active +N#CN(CC)N=O,active +N#CN(C)N=O,active +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1,active +N=C(N(CCC)N=O)N[N+](=O)[O-],active +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl,active +N(N1CCCCC1C2=CC=CN=C2)=O,active +N(CCCCO)(CCCC)N=O,active +N(CCCCCCCCCC)(C)N=O,active +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O,active +NC1=C(C=CC=C1)C(=O)OC/C=C/C2=CC=CC=C2,active +N[C@@H](CCSCC)C(=O)O,active +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,active +N1C=CC=C(C=1)C2N(N=O)CCC2,active +C1CO1,active +NC(=O)C=C,active +CNNCC1=CC=C(C=C1)C(=O)NC(C)C,active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O,active +N1=C(N=C(N(CO)CO)N=C1N(CO)CO)N(CO)CO,active +N1/C(=N\C2=C(C1=S)N=CN2[C@]3(C([C@@]([C@](O3)(CO)[H])(O)[H])([H])[H])[H])N,active +N1(C(=CN=C1C)[N+](=O)[O-])CCO,active +S=C(N1CCOCC1)SN1CCOCC1,active +OC1=C(C=C(C=C1Cl)Cl)Cl,active +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2,active +N(CCCC(F)(F)F)(CCCC(F)(F)F)N=O,active +F/C(F)=C(\F)F,active +F[C@@]([C@](C=C4)(C)C3=CC4=O)2[C@@H](O)C[C@]([C@](C5)([H])[C@@]([H])2CC3)(C)[C@@]1([C@](CO)=O)[C@@H]5OC(C)(C)O1,active +CP(=O)(OC)OC,active +FCCl,active +CC(NC1=CC=C(C2=CC=C(F)C=C2)C=C1)=O,active +FC(F)(F)CNC(=N)Nc1ccn(CCCCC(N)=O)n1,active +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2,active +NCC1(CC(=O)O)CCCCC1,active +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],active +COC2=CC=C(C=C2)CN(CCN(C)C)C1=NC=CC=C1.OC(\C=C/C(O)=O)=O,active +O=C1OC(O)C(C(Cl)Cl)=C1Cl,active +COC1=CC=C(C=C1)O,active +N(CC(CO)O)(CC(O)C)N=O,active +N(CC(CO)O)(C)N=O,active +N(CC(C)O)(CCO)N=O,active +N(CC=C)(CCO)N=O,active +O=C(C1=CC=CN=C1)CCCN(N=O)C,active +N(CC(CO)O)(CC=C)N=O,active +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2,active +N(C(=O)NCC(C)O)(N=O)C(C)Cl,active +O=C(NC2=C1C=C(C3=NNC(CC3)=O)C=C2)C1(C)C,active +N(CC(C)O)(CC=C)N=O,active +O=C(N(CCF)N=O)N,active +N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O,active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C,active +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1,active +C(CCC)(CCC)C(=O)[O-].C(CCC)(CCC)C(=O)[O-].[Ca+2],active +NC2=CC=C(C=C2N)C1=CC=C(N)C(N)=C1.Cl.Cl.Cl.Cl,active +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1,active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C.[H]Cl,active +O=C(N(CCCCC)N=O)N,active +NC1=CC=C(C2=CC=C(N)C=C2)C=C1,active +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl,active +NC1=NC(=NC(=N1)N)N,active +NC1=NC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)N,active +NC1=CC=CC=C1[H]Cl,active +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+],active +O(C)c1cc(CC=C)ccc1OC,active +C1CCC[C@H](N1N=O)C,active +N(CC(CO)O)(CC(C)=O)N=O,active +OC1=C(C=CC(=C1)/C=C/C(=O)O)O,active +CC(CC)[N+]([O-])=O,active +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,active +COC1=C(C=CC=C1)[N+](=O)[O-],active +NCC(O)=O,active +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O,active +C=CC1=CC=CC=C1,active +NNC1=NC(=CS1)C2=CC=C(O2)[N+]([O-])=O,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,active +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O,active +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +NC(=S)N,active +BrC2=C(C=C(Br)C(Br)=C2)C1=C(Br)C=C(Br)C(Br)=C1,active +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl,active +O=NN(CCO)CCO,active +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O,active +CC(O)CN(C)N=O,active +O=S(C1=C3C(C=CC=C3)=C(O)C(/N=N/C2=CC(S(=O)([O-])=O)=C(C)C=C2C)=C1)([O-])=O.[Na+].[Na+],active +NC(=O)OC,active +NC(=O)N(CC=C)N=O,active +NC(=O)N(CC)N=O,active +[O-][N+](C=C2)=CC=C2/N=N/C1=CC=C(N(CC)CC)C=C1,active +C1=CC=CC(=C1)CCN(C)N=O,active +NC1=CC(=CC=C1OC)C,active +C1(N=C(SC=1)NN)C2=CC=C(C=C2)N,active +BrC(CCl)CBr,active +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl,active +NC1=C(C=CC(=C1)Cl)N,active +NC1=C(C=C2C3=C(C=CC=C3)OC2=C1)OC,active +CC1=CC(=C(C=C1C)N)C,active +NC1=C2C(=CC=C1)C(=CC=C2)N,active +C1=CC=CC=C1C(O)C(N(C)N=O)C,active +NC1=C(C=CC(=C1)N)Cl,active +NC1=CC2=C(C=CC=C2)C=C1,active +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl,active +CC1=CC=CC(C)=C1,active +CN(CC(C)=O)N=O,active +ClC(Cl)C(F)(F)F,active +BrCCBr,active +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,active +C[As](=O)(C)O,active +Cl\C=C\CCl,active +Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl,active +C(O)(=O)[O-].[K+],active +ClC(=CCl)Cl,active +ClC(=C(Cl)Cl)Cl,active +[O-][N+](C2=CC=C(O2)C1=CSC(NN(C)C)=N1)=O,active +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl,active +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +O=P(H)(OC)OC,active +ClC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N,active +ClC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)Cl)N,active +ClC#CCl,active +NC1=CC=C2C3=C(C=CC=C3)OC2=C1,active +ClC(Cl)Cl,active +P(=O)(OC)(OC)N1CCOCC1,active +ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N,active +C=CBr,active +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+],active +C\C(C)=C/Cl,active +N(C(=O)N)(N=O)CC(=O)O,active +CC(=O)N,active +CCC1CO1,active +CCC1=CC=CC=C1,active +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C,active +CC1=NC=CN1,active +ClC(Cl)(Cl)Cl,active +CC1=CC=CC=C1,active +CC1SC(SC(N1N=O)C)C,active +CC1CO1,active +CC1CC(=O)O1,active +CCO,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl,active +CCN(CC)N=O,active +Cl[C@@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl,active +O=S(=O)([O-])[O-].[Cd+2],active +Cl.Cl.Cl.Cc1ccc(cn1)C\C2=C\N/C(=N\C2=O)NCCSCc3ccc(CN(C)C)o3,active +C=C(Cl)C=C,active +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,active +CCCC1=CC2=C(C=C1)OCO2,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N),active +C1(CCN(C1)N=O)O,active +CCCCOP(=O)(OCCCC)OCCCC,active +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N,active +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1,active +CN(C)/N=N/C1=CC=CC=C1,active +CN(C1=CC=C(C=C1)/N=N/C2=CC=CC=C2)C,active +CN(C1=CC=C(C=C1)/N=N/C2=CC(=CC=C2)C)C,active +CN(C)P(=O)(N(C)C)N(C)C,active +N(CCCCCCCCCCCCCC)(C)N=O,active +ClCCN(CCCl)[P]1(=O)NCCCO1,active +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC,active +CN(C(=O)N)N=O,active +ClCOC,active +ClCCN[P]1(=O)OCCCN1CCCl,active +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N,active +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O,active +O=NN(CCN1N=O)CCC1,active +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N,active +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],active +CN1N(C2=CC=CC=C2)C(=O)C=C1C,active +ClC(C(Cl)(Cl)Cl)(Cl)Cl,active +O=S(C1=C(/N=N/C2=CC=C(C3=CC=C(\N=N/C4=C(S(=O)([O-])=O)C=C5C(C(N)=CC(S(=O)([O-])=O)=C5)=C4O)C=C3)C=C2)C(O)=C(C(N)=CC(S(=O)([O-])=O)=C6)C6=C1)([O-])=O.[Na+].[Na+].[Na+].[Na+],active +CN(C1=CC=CC=C1)C,active +CN(N=O)C,active +CN(CCO)N=O,active +CN(CC)N=O,active +CN(N=O)C(=O)NCCC[C@H](N)C(O)=O,active +ClC1=NC(=NC(=N1)NC(C)C)NCC,active +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2,active +ClC1=CC=CC=C1,active +ClC13C5(Cl)C2(Cl)C4C(Cl)(C(Cl)(Cl)C12Cl)C3(Cl)C4(Cl)C5(Cl)Cl,active +ClC1=NC(SCC(NCCO)=O)=NC(NC2=CC=CC(C)=C2C)=C1,active +CN(N=O)C1=CC=C(C=C1)C=CC2=C3C=CC=CC3=NC=C2,active +CC(=C)C=C,active +ClC1=C(Cl)C(Cl)=CC2=C1OC3=C(C=C(Cl)C(Cl)=C3Cl)O2,active +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC,active +ClC1=CC=CC(C2=CC(Cl)=CC=C2)=C1,active +CC(C)(C)O,active +ClC1=CC(C2=CC(Cl)=CC(Cl)=C2)=CC=C1,active +ClCC(Cl)CCl,active +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O,active +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl,active +ClCCl,active +ClCC1CO1,active +N1C=NN(C=1)CC(CN2N=CN=C2)(C3=C(C=C(C=C3)F)F)O,active +ClC2=C(C=CC(Cl)=C2Cl)C1=C(Cl)C(Cl)=CC=C1,active +ClC2=C(C=CC(Cl)=C2Cl)C1=C(Cl)C(Cl)=C(Cl)C=C1,active +Clc1nc(NCC)nc(NC(C)(C)C#N)n1,active +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl,active +N1(CC(N(C(C1)C)C(C2C=CC=CC=2)=O)C)N=O,active +ClC2=C(C=CC=C2Cl)C1=C(Cl)C=C(Cl)C=C1,active +SC1=NC2=C(C=CC=C2)S1,active +CN(C)CNc2nnc(/C=C/c1ccc(o1)[N+]([O-])=O)o2,active +O=S(=O)(C1=CC=C(C=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+],active +O=P(OCCCl)(OCCCl)OCCCl,active +O=S(C1=NC2=C(C=CC(=C2)OC)N1)CC3=C(C(=C(C=N3)C)OC)C,active +O=[N+](C1=CC(=C(C=C1)N)O)[O-],active +CN(C1=CC=CC=C1)N=O,active +C1=COC=C1,active +O=P(OC(CCl)CCl)(OC(CCl)CCl)OC(CCl)CCl,active +O=P(N1C(C1)C)(N1C(C1)C)N1C(C1)C,active +C1(=CC(=CC(=C1N)C)C)C.[H]Cl,active +O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.[Mg+2],active +O=P(OC=C(Cl)Cl)(OC)OC,active +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O,active +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O,active +O=NN(CCCCCC1)CCCCCC1,active +O=[N+](C1=CC=CC2=CC=CN=C12)[O-],active +OC1=C(C=CC=C1OC)O,active +ClC1=CC=C(C=C1)Cl,active +O=S1(=O)CCCO1,active +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl,active +O=S(N1C[C@@H](C)C[C@H](C1)C)(C2=CC(C(O)=O)=C(Cl)C=C2)=O,active +C1(N(C(C)=NC=1)C)[N+](=O)[O-],active +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N,active +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl,active +CC(=O)NC1=CC=C(C=C1)OCC,active +O=C(O[C@@H]1CCN2[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C,active +O=NN(C)CCCCCCCCCCCC,active +O=NN(C(=O)N)CCC,active +O=NN(CC=C1)CC1,active +O=NN(CC(C)O)CC(C)O,active +OC1=CC=C(C=C1)O,active +O=C(C)NCC1=NC(=NO1)C2=CC=C(O2)[N+]([O-])=O,active +NC1=CC=CC(C)=C1.[H]Cl,active +O=C4C=C2[C@@](CC4)([H])[C@]1([H])[C@](CC2)([H])[C@@](CC3)([H])[C@@](CC1)(C)[C@]3(OC(C)=O)C#C,active +O=N[O-].[Na+],active +O=N(=O)c1ccc(C)cc1,active +ClCOCCl,active +O=NN1CCCC1,active +O=NN1CCC(=O)NC1=O,active +NC(NC1=CC=C(C=C1)OCC)=O,active +O=NN1CCSCC1,active +O=NN1CCOCC1,active +O=NN1CCCCCCC1,active +NN,active +O=NN(CCCCC)CCCCC,active +O=NN(CCCC)CCCC,active +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl,active +O=NN(CCN1)CC1,active +O=NN(CCN(C)C)C(=O)[NH2+]CC.[O-]N=O,active +CN1CC[C@H]2OC(=O)C3(C[C@@H](C)[C@@](C)(O)C(=O)OC\C(=C\C1)C2=O)O[C@@H]3C,active +C1=CC(=CC=C1N(C)N=O)N=O,active +OCCNC2=C1C=CC=CC1=NC(C3=CC=C([N+]([O-])=O)S3)=N2,active +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O,active +O=C(OC1=C2C(=CC=C1)C=CC=C2)NC,active +ON=C1C=CC(=NO)C=C1,active +[N+](=N/CCC)(/CCC)[O-],active +OC2=NN=C(O2)C1=CC=C([N+]([O-])=O)O1,active +O=NN(C1=CC=CC=C1)C2=CC=CC=C2,active +OCC1CO1,active +COC1=CC(=C(C=C1)N)C,active +OCC(CO)(CBr)CBr,active +S=C1NCCN1,active +CN(N=O)C1=C(C(NC)=O)N(C)C=N1,active +[Al+3].[O-]P(=O)OCC.[O-]P(=O)OCC.[O-]P(=O)OCC,active +O(C1=CC=CC=C1)CC2CO2,active +N=C(N(N=O)C)N[N+](=O)[O-],active +S=P(N1CC1)(N1CC1)N1CC1,active +S=C([S-])NCCNC([S-])=S.[Zn+2],active +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2],active +C1(=CC=C(C=C1)O)NC(C)=O,active +S=C(NCC)NCC,active +O(CC1(C)C)C1=O,active +S=C(N(CC)CC)SCC(=C)Cl,active +O=C1OC2=C(C=CC=C2)CC1,active +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C,active +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +OC1=C(C([O-])=O)C=C(N=NC2=CC=C(C3=CC=C(N=NC4=C([O-])C(/N=N/C(C=C(S([O-])(=O)=O)C=C5)=C5[O-])=CC=C4O)C=C3)C=C2)C=C1.[Na+].[Na+].[Cu+2],active +OC1=C(C=CC(=C1)C)O,active +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,active +OC1=C(C=C(C=C1)N)[N+](=O)[O-],active +OC(C=C)C1=CC=C2OCOC2=C1,active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O,active +OC(=O)CN(CC(=O)O)CC(=O)O,active +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N,active +C1=C(C=CC=C1OCC2CO2)OCC3CO3,active +OC(C1=CC=C(C(=C1)CO)O)CNC(C)(C)C,active +ClCCCl,active +OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2,active +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2,active +CCC(C)=NO,active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +OC1=CC2=C(C=C1)OCO2,active +OC1=C(O)C=C4C(C[C@](COC2=C3C=CC(O)=C2O)([C@@]34[H])O)=C1,active +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-],active +OC1=C(C=CC=C1)O,active +OC1=CC=C(C=C1C(C)(C)C)OC,active +O=NN(CC(=O)C)CC(=O)C,active +C12(C(=CC(=CC=1S(=O)(=O)[O-])S(=O)(=O)[O-])C=CC(=C2/N=N/C3=C4C(=C(C=C3)S(=O)(=O)[O-])C=CC=C4)O).[Na+].[Na+].[Na+],active +O=C3C[C@@H]4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](C)(O)CC[C@@H]12)[C@@]4(C)C\C3=C\O,active +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC,active +C=CCN=C=S,active +O=C(C[C@@H](C[C@@H](/C=C/C1=C(C2=C(N1C(C)C)C=CC=C2)C3=CC=C(C=C3)F)O)O)O,active +O=C(C1=CC=NC=C1)NN,active +N(CC(CO)O)(CCO)N=O,active +CCC(CC)[N+]([O-])=O,active +O=C(C)NC3=CC=C(C2=C3)C1=C(C2=O)C=CC=C1,active +O=C(C)CN(N=O)CCO,active +OC(=O)C1=CC=C(C=C1)[N+](=O)[O-],active +C1/C=C\CN(O1)N=O,active +O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C,active +O=CC1=CC=CO1,active +O=C(N(C)N=O)C1=C(N(N=O)C)N=CN1C,active +O=C(N(C)C)NC1=CC=C(C=C1)Cl,active +CC(C)=C,active +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-],active +O=C(N(CC(C)C)N=O)N,active +O=C(N(C)N=O)NC1=NC2=C(S1)C=CC=C2,active +O=C(CC(C)C)OCC=C,active +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,active +NC(CCSCC)C(=O)O,active +CC(C)C(O)(C(C)O)C(=O)OC\C1=C\CN2CC[C@@H](OC(=O)C(\C)=C\C)[C@@H]12,active +O=C(CCCN(C)N=O)O,active +O=C(CCC(=O)O)NN(C)C,active +O=C(C(F)(F)F)NC1=CC3=C(C2=CC=CC=C2C3)C=C1,active +O=[N+]([O-])C3=CC=C(O3)/C=N/N1C(O[C@@H](CN2CCOCC2)C1)=O.Cl,active +O=[N+]([O-])C1=CC=C(O1)/C=N/N2C(N(CCO)CC2)=O,active +S=C(N(C)C)NC,active +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-],active +O=[N+](C1=CC(=C(C=C1)O)N)[O-],active +O=C(N(CC(C)O)N=O)NCCCl,active +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr,active +N(N(CCCO)C)=O,active +O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,active +O=[Cr](=O)(O[Cr](=O)(=O)[O-])[O-].[Na+].[Na+],active +O=[C@@]([C@@H]1C=C([C@]4([H])N(C)C1)C3=C2C(C4)=C(NC2=CC=C3)Br)N[C@@]5([C@H](C)C)C(N([C@@H](CC(C)C)C(N7CCC[C@@]67[H])=O)[C@@]6(O)O5)=O.O=S(O)(C)=O,active +O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O,active +O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+],active +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br,active +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,active +O=C(O[C@@H]1CC[N+]2([O-])[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C,active +O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H],active +O=C(C(C)(OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl)C)OC,active +O=[N+](C1=CC=CC=C1)[O-],active +O=[N+](C1=CC=C2C3=C4C(=CC=C13)C=CC=C4C=C2)[O-],active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-],active +O=[N+](OC(CO[N+](=O)[O-])CO[N+](=O)[O-])[O-],active +O=[N+](C1=CN=C(S1)N)[O-],active +[O-]\[N+](C)=N/CC,active +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O,active +O=C1C2=C(C=CC=C2C(=O)C3=C1C=CC=C3)O,active +NC(=O)OCC,active +O=C1C2=CC3=C(C=C2N(C=C1C(=O)O)CC)OCO3,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,active +O=C1C2=C(C3=C(C=C2OC)OC4C3C=CO4)OC5=C1C(=CC(=C5OC)OC)O,active +Cn3nc(CO)nc3NCCCOc2cc(CN1CCCCC1)ccc2,active +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N,active +O=C1C=C(NC(=S)N1)CCC,active +NC1=C(C=CC(=C1)N)C,active +O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N,active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N,active +O=C1OC2=C(C=CC=C2)C=C1,active +O=C1O[C@@H]3CCN2C\C=C(\COC(=O)[C@](C)(O)[C@](C)(O)[C@H]1C)[C@@H]23,active +O=C1NC(=O)NC=C1,active +C1(=CC=C(Cl)C=C1)N.[H]Cl,active +O=C2c1ccccc1C(=O)c3c2c(O)cc(O)c3O,active +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1,active +O=C1CCO1,active +C1=COC2=C1C=CC=C2,active +N(C1=CC=CC=C1)NC2=CC=CC=C2,active +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC,active +C1(=CC=CN=C1)CCl.[H]Cl,active +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl,active +O=C1[N-]S(=O)(=O)C2=CC=CC=C12.[Na+],active +O=C(N(CCO)N=O)N,active +O=C(N(CCCO)N=O)N,active +O=C(N(CCCCCC)N=O)N,active +O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1,active +O=C(N(CCO)N=O)NCCCl,active +O=C(N(CCO)N=O)NCC,active +O=C(N(CC)N=O)OCC,active +O=C1[C@H](OC(\C(C[C@@]([H])(C)[C@](C)2O)=C/C)=O)CCN(C)C/C=C1/COC2=O,active +O=C(N(CC)N=O)NCC(=O)C,active +O=C(N(CCCCC)N=O)OCC,active +O=C(N(CCCC)N=O)NCCCC,active +O=C(N(CCCC)N=O)N,active +O=C(OCC)C=C,active +OS(=O)(=O)O.NN,active +O=C(OC[C@@H](C(=O)O)N)C=[N+]=[N-],active +O=C(N(CC)N=O)NCCO,active +O=C=NC1=CC(N=C=O)=CC=C1C,active +O=C/C=C/C,active +CN(CCCCCCCCCCC)N=O,active +O=C(NC2=C(Cl)C=NC=C2Cl)C1=CC(OC3CCCC3)=C(OC)C=C1,active +O=C(N)C1=C(N=CN1)/N=N/N(C)C,active +O=C(OC(COC(=O)CCCCCCC)COC(=O)CCCCCCC)CCCCCCC,active +O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC,active +C1=CC=C2C(=C1)NC(NC2=O)C3=CC=C(S3)[N+]([O-])=O,active +C1(NC(CN1N=O)=O)=O,active +CN[N+](=O)[O-],active +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl,active +C1=C(C(=CC(=C1N)C)C)C.[H]Cl,active +[Hg+2].[Cl-].[Cl-],active +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+],active +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)Cl,active +CC(N(C1=CC=CC2=C1CC3=C2C=CC=C3)C(C)=O)=O,active +Cl.CC(=O)O[C@@H](CC)C(C[C@H](C)N(C)C)(c1ccccc1)c2ccccc2,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,active +C1=CC=C2C(=C1)N=C(N=C2N(CCO)CCO)C3=CC=C(S3)[N+]([O-])=O,active +C1=CC=C2C(=C1)N(C(\C=C/2C)(C)C)N=O,active +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,active +C1(/C=C(\C=C/C1=O)CCN)=[N+]=[N-].[H]Cl,active +C1=C(CO)OC=C1,active +ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl,active +OCCOCCO,active +C1=CC=C2C(=C1)N=C(N=C2N3CCOCC3)C4=CC=C(S4)[N+]([O-])=O,active +O=C1NC(=S)NC=C1,active +O\N=C1\CCCC1,active +C1(=C(C=CC=C1)N)OC.[H]Cl,active +C1(=C(C=CC=C1)C(OCCCC)=O)C(OCC2=CC=CC=C2)=O,active +C1(=C(C(OCCCCCCC(C)C)=O)C=CC=C1)C(OCCCCCCC(C)C)=O,active +C1(/N=N/C2=CC=CC=C2)=CC=CC=C1,active +C1=C2C(=CC=C1)C=CC=C2,active +N1=CC=CC=C1,active +ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2],active +C1(C(=CC=C(C=1)C)C)N.[H]Cl,active +C1(=NC(=NC(=N1)NC(C)=O)C2=CC=C(O2)[N+](=O)[O-])NC(C)=O,active +C1(C)=CSC(=N1)NNC=O,active +C1(C(N\C(=N/C1=O)[O-])=O)(CC)CC.[Na+],active +O=C1N(C=C)CCC1,active +C1(=CC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)C)C,active +OC(=O)CCCCCCCCCCN,active +NC1=CC=C(/C=C/C2=CC(OC)=CC=C2OC)C=C1,active +NC1(=CC=C(C=C1)C2=CC=CC=C2).[H]Cl,active +CC(=S)N,active +CC(=O)N(CC)CC,active +CC1=C(C=CC=C1[N+](=O)[O-])[N+](=O)[O-],active +CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2,active +[O-]C12[C@@H](CC[N+](C)1CC=C2COC([C@](OC(C)=O)(C)[C@@H](C)\C=C3C=C)=O)OC/3=O,active +CC(=C)CCl,active +C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1,active +ClCCN(C)CCCl,active +NC2=NC(C3=CC=CC=C3)=C(CCOCC)C1=NC=NN12,active +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3,active +Br(=O)(=O)[O-].[K+],active +[O-][N+](C)=O,active +C1C(C2=CC=CC=C2)O1,active +CC(=O)OCC(=O)[C@@]53/N=C(/C)O[C@@H]5C[C@H]2[C@@H]4CC\C1=C\C(=O)\C=C/[C@]1(C)[C@H]4[C@@H](O)C[C@@]23C,active +C=O,active +N(CC(C)=O)(CC=C)N=O,active +CC(=O)NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(NC(C)=O)C=C2,active +C12C(=CC(=C(C=1O)/N=N/C3=C(C=C(C=C3)C4=CC(=C(C=C4)/N=N/C5=C(C=C6C(=C5O)C(=CC(=C6)S(=O)(=O)[O-])N)S(=O)(=O)[O-])OC)OC)S(=O)(=O)[O-])C=C(C=C2N)S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],active +CC(=O)O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,active +C1N(C(OC1)=O)N=O,active +C12(C(=CC(=C(C=1/N=N/C3=C4C(=C(C=C3)S(=O)(=O)[O-])C=CC=C4)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+].[Na+],active +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+],active +CC1=C(C=CC(=C1)C)C,active +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC,active +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,active +C1=CC=CC=C1,active +C1=CC=CC(=N1)N(N=O)C,active +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5,active +C1=CC=CC=C1C(COC(N)=O)COC(N)=O,active +C1CCCO1,active +C1CCCN(O1)N=O,active +C1COCCO1,active +CC(=C)[C@@H]1CCC(=CC1)C,active +C1CCC[C@@H](N1N=O)C,active +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C,active +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2,active +C1C(OC(O1)C(C)I)CO,active +C1C(N(C(CN1N=O)C)C)C,active +BrC(Br)Br,active +[O-][N+](=O)c1ccc2c3ccccc3Cc2c1,active +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N,active +[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+],active +C1(NC(CN1/N=C/C2=CC=C(O2)[N+](=O)[O-])C)=O,active +[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O,active +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C,active +[Na+].C1(=C(C=C(C=C1)NC2=C(C=C(C=C2)[N+](=O)[O-])[N+](=O)[O-])S(=O)(=O)[O-])NC3=CC=CC=C3,active +[O-][N+](C2=CC=C(O2)C1=CSC=N1)=O,active +CC1(CC(=CC(=O)C1)C)C,active +CC1=C(C=CC=C1)S(=O)(=O)N,active +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O,active +CC(=O)OC=C,active +[Se]=S,active +[O-]\[N+](CC)=N/CC,active +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O,active +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O,active +[O-]\[N+](CC)=N/C,active +[O-][N+](C3=CC=C(O3)C1=CN=C2N1C=CC=C2)=O,active +C(C1)N1C(=CC(=O)C=2N(C3)C3)C(=O)C=2N(C4)C4,active +[H][C@]12N(CC=C2COC([C@@](O)(C(O)(C)C)[C@H](C)OC)=O)CC[C@@H]1OC(\C(C)=C/C)=O,active +[Cl-].[Cd+2].[Cl-],active +ClC/C=C/CCl,active +[H][C@]14[C@@]([C@]3([H])CC[C@@](O)(C#C)[C@](C)3CC4)([H])CCC2=CC(O)=CC=C12,active +C(CCCN(N=O)C)(O)C1C=NC=CC=1,active +[C@]13([C@@](C(=O)CO)(CC[C@H]1[C@@H]2CCC=4[C@@]([C@H]2[C@H](C3)O)(\C=C/C(C=4)=O)C)O)C,active +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O,active +O=NN1CCCCC1,active +[C@]24([C@@](C(COC(=O)CCCc1ccc(cc1)N(CCCl)CCCl)=O)(CC[C@H]2[C@@H]3CCC=5[C@@]([C@H]3[C@H](C4)O)(\C=C/C(C=5)=O)C)O)C,active +[N+](=O)([O-])c1ccccc1C,active +[N+](=N\C(C)C)(/C(C)C)[O-],active +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr,active +[N+](CCCl)(CCCl)(C)[O-],active +OCC(=O)[C@@]54OC(O[C@@H]5C[C@@H]1[C@]4(C)C[C@H](O)[C@@H]2[C@@]3(C)/C=C\C(=O)\C=C3\CC[C@@H]12)CCC,active +[K+].[I-],active +C1(N=CNN=1)N,active +[N+].C1(N(N=O)[O-])=CC=CC=C1,active +[Mn+2].[S-]C(=S)NCCNC(=S)[S-],active +ClC(CC(Cl)C(Cl)CCC(Cl)CC)C(Cl)C(Cl)CCl,active +CCBr,active +C1=CC=C(C(O)C)C=C1,active +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,active +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2,active +C[N+](=NC)[O-],active +Cl\C=C\CCl,active +COC1C=C(C=CC=1C2NC3=CN=CC=C3N=2)S(C)=O,active +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O,active +C[As](C)(C)=O,active +C=CCl,active +C=CCC1=CC=C2C(=C1)OCO2,active +C=CF,active +C=CCN(CC=C)N=O,active +NNC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1,active +O=NN(C)CCOS(C1=CC=C(C)C=C1)(=O)=O,active +C1=CC(=CC=C1N(N=O)C)F,active +C=CC=C,active +C=CC#N,active +C(N)(=O)OC(C#C)(C1C=CC=CC=1)C2C=CC(=CC=2)Cl,active +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+],active +C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-],active +C(=C/C=O)\[O-].[Na+],active +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](\CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=CC=C5.[Na+],active +C([O-])(C)=O.[Pb+2].[O-]C(C)=O,active +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl,active +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,active +C1CCN(CN1N=O)N=O,active +ClC(Cl)Br,active +CC/C(=C/CC)[N+](=O)[O-],active +CC1=C(C=CC=C1)N=O,active +C(CCl)(F)(F)F,active +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2,active +O=NN(CCC)CCC,active +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,active +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-],active +OC1=C(C=CC=C1)C2=CC=CC=C2,active +CC(OC1=CC=C(C=C1)Cl)(C(=O)OCC)C,active +CC(OC)(C)C,active +NC(=O)Cc2c([O-])on[n+]2Cc1ccccc1,active +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O,active +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)C)C)C)C,active +CC=O,active +N/1C(N(\C=C\1)C)=S,active +CC/C(C2=CC=CC=C2)=C(C1=CC=CC=C1)/C(C=C3)=CC=C3OCCN(C)C.OC(C(CC(O)=O)(O)CC(O)=O)=O,active +OC(=O)C(Cl)Cl,active +CC(C)OC1=CC=CC=C1OC(=O)N(C)N=O,active +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O,active +FCC(F)(F)F,active +CC(CON=O)C,active +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,active +CC(Cl)(Cl)F,active +CC1=C2C3=C(C=C4C(=C3CC2)C=CC5=CC=CC=C45)C=C1,active +CC1=C2C(=CO[C@H]([C@@H]2C)C)C(=C(C1=O)C(=O)O)O,active +CC1=C(C2=C(C=CC(=C2)OC)N1C(=O)C3=CC=C(C=C3)Cl)CC(=O)O,active +CC1=C(C=C(C=C1)C)OCCCC(C(=O)O)(C)C,active +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1,active +CC1=CC(C4=CC(C)=C(/N=N/C5=CC=C(OS(=O)(C6=CC=C(C)C=C6)=O)C=C5)C=C4)=CC=C1/N=N/C2=C(O)C=CC3=CC(S(=O)([O-])=O)=CC(S(=O)([O-])=O)=C23.[Na+].[Na+],active +CC1=CC(C)=C(/N=N/C2=C(C(S([O-])(=O)=O)=CC3=C2C=CC(S([O-])(=O)=O)=C3)O)C=C1C.[Na+].[Na+],active +O=[N+](C1=CC(=C(C=C1)OC)N)[O-],active +[O-][N+](=O)N(C)C,active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +CC1CC(OC(O1)C)OC(=O)C,active +CC(=NO)C,active +C(C1C=CC=CC=1)(=O)N(N=O)C,active +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C,active +CC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)C)N,active +CC(C)(C)NCC(O)C1=CC(O)=CC(=C1)O,active +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,active +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl,active +O=CC1=CC=CC=C1,inactive +O=C4[C@@]3(C)CC[C@]2([H])C1=CC=C(OS(=O)([O-])=O)C=C1CC=C2[C@@]([H])3CC4.[Na+],inactive +C(C\C=C/CCCCCCCC)CCCCCC(=O)[O-].[Na+],inactive +O=[N+](CCC)[O-],inactive +C1(C(=CC=C(C=1)N)O)N.[H]Cl.[H]Cl,inactive +[Na+].[O-]Cl=O,inactive +O=C2C1=C(N=CN2)N([C@@H]3O[C@H](COP([O-])([O-])=O)[C@@H](O)[C@H]3O)C=N1.[Na+].[Na+],inactive +C1(=CC=C(N)C=C1)OC.[H]Cl,inactive +O=C2NC(/N)=N\CN2[C@@H]1O[C@H](CO)[C@@H](O)[C@H]1O,inactive +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +C=CC(OCC)OCC,inactive +ClC1=CC(Cl)=C(/C(OP(=O)(OC)OC)=C/Cl)C=C1Cl,inactive +Cl.CCOC(=O)[C@H](CCc1ccccc1)N[C@@H](C)C(=O)N2Cc3ccccc3C[C@H]2C(O)=O,inactive +Cl.CC3CCCC(C)N3CCCC(O)(c1ccccc1)c2ccccn2,inactive +O=[Ti]=O,inactive +[Ni],inactive +CN(C)CCN(CC1=CC=CO1)C2=CC=CC=N2,inactive +Cl.CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(cccc1O)[C@@](C)(O)[C@H]4C[C@@H]23,inactive +O=CNNC1=NC(C2=CC=CO2)=CS1,inactive +CC1(C(=O)NC(=O)O1)C,inactive +S=P(OC1=CC(=C(C=C1)SC)C)(OC)OC,inactive +C(C1C=CC(=CC=1)O)(C2=CC=C(C=C2)O)(C)C,inactive +O=C1N(CCC1)C,inactive +OC(=O)C1=C(C=CC=C1)OC(=O)C,inactive +O=C1N(C2=CC=C(C=C2C(=NC1)C3=CC=CC=C3)Cl)CC4CC4,inactive +O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl,inactive +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O.O=S(O)(O)=O,inactive +O=[N+]([O-])[O-].[Na+],inactive +CN(C)CCN(CC1=CC=CS1)C2=CC=CC=C2,inactive +C12(=C(C=C(C=C1C=CC(=C2/N=N/C3=CC=CC=C3)O)S(=O)(=O)[O-])S(=O)(=O)[O-]).[Na+].[Na+],inactive +C3(S(N)(=O)=O)=CC=C(N2N=C(C(F)(F)F)C=C2C1=CC=C(C)C=C1)C=C3,inactive +O=[N+](C1=CC(=C(C=C1)C)N)[O-],inactive +O=C2C=1/N=C\NC=1N(C)C(=O)N2C,inactive +N1C2=C(C=CC=C2)N=N1,inactive +OC(=O)\C=C/C(O)=O.C(C(C1CCCCC1)C2CCCCC2)C3CCCCN3,inactive +C1(=C(C=CC(=C1)[C@H](CN[C@@H](CCC2=CC=CC=C2)C)O)O)C(N)=O.[H]Cl,inactive +C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl,inactive +O=C1OC(=O)CC1,inactive +Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,inactive +NC1=C(C=C(C=C1Cl)Cl)Cl,inactive +CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1,inactive +[O-]P(=O)=O.[Na+],inactive +[O-]C1=C(I)C=C(C(C2=C(C([O-])=O)C=CC=C2)=C3C=C(C(C(I)=C3O4)=O)I)C4=C1I.[Na+].[Na+],inactive +O=P(OC2=CC=C(C)C=C2)(OC3=CC=C(C)C=C3)OC1=CC=C(C)C=C1,inactive +CC1=C(C=CC(=C1)O)O,inactive +[Sn+2].[Cl-].[Cl-],inactive +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,inactive +CCN(CC)CCOC1=CC=C(C=C1)[C](O)(CC2=CC=C(OC)C=C2)C3=CC=CC=C3,inactive +ClC1=C(C=CC(=C1)Cl)O,inactive +ClCl,inactive +O=C1c2c(O)cc(C)cc2C(=O)c3cc(O)cc(O)c13,inactive +O=S(=O)([O-])[O-].O.[Mn+2],inactive +O=S(=O)(C1=C(C=CC=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+],inactive +CN(C=O)C,inactive +O=S(=O)([O-])[O-].[V+2]=O,inactive +[O-]C([C@H]([C@H](O)CO)O1)=C(O)C1=O.[Na+],inactive +OC(=O)C=CC=CC,inactive +Cl.N#Cc1ccc(cc1)C3CCCc2cncn23,inactive +O=S(\N=C(NCCSCC2=CC=C(CNC)O2)/NCC(C1=CC=C(O)C=C1)O)(C)=O,inactive +C([N+](C)(C)C)CCl.[Cl-],inactive +O=NN(CCC1)C(C1)C(=O)O,inactive +C(CC([O-])=O)(CC(O)=O)(C([O-])=O)O.[N+].[N+],inactive +Cl,inactive +[Na+].[As](=O)[O-],inactive +Cl.CC(C)(C)NCC(O)CO/C1=C/N(C)C(=O)c2ccccc12,inactive +C([S-])#N.[Na+],inactive +C([N+](C)(C)C)CO.[Cl-],inactive +C1=CC=C(NC(=O)C(/N=N/C2=C(Cl)C=C(C3=CC(Cl)=C(/N=N/C(C(=O)NC4=CC=CC=C4)C(=O)C)C=C3)C=C2)C(=O)C)C=C1,inactive +O[C@@H]8[C@@H](O)[C@@H]1O[C@H](CO)[C@H]8O[C@H]7O[C@H](CO)[C@@H](O[C@H]6O[C@H](CO)[C@@H](O[C@H]5O[C@H](CO)[C@@H](O[C@H]4O[C@H](CO)[C@@H](O[C@H]3O[C@H](CO)[C@@H](O[C@H]2O[C@H](CO)[C@@H](O1)[C@H](O)[C@H]2O)[C@H](O)[C@H]3O)[C@H](O)[C@H]4O)[C@H](O)[C@H]5O)[C,inactive +O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+],inactive +ClCCN(CCCl)C1=CC=C(CC(OC3=CC=C(C4=C3)[C@]2([H])[C@](CC4)([H])[C@@](CC[C@@H]5OC(CC6=CC=C(N(CCCl)CCCl)C=C6)=O)([H])[C@]5(C)CC2)=O)C=C1,inactive +NC1=C(C=CC(=C1)NC(=O)C)OCC,inactive +Br/C(Br)=C/[C@H]3[C@@H](C(=O)O[C@H](C#N)c2cccc(Oc1ccccc1)c2)C3(C)C,inactive +O=NN1CCC[C@H]1[C@@](O)=O,inactive +BrC1=C(Br)C(Br)=CC(C2=CC=C(Br)C(Br)=C2Br)=C1,inactive +C12=CC(=CC(=C1C3=C(C(O2)=O)C(CC3)=O)OC)OC,inactive +CC=NO,inactive +NC1=CC=C(C=C1)Cl,inactive +C=C(Cl)C=C,inactive +.[Cl-].[Fe+3].[Cl-].[Cl-],inactive +O=C(C(C1=CC=CC=C1)CC)NC(=O)N,inactive +O=C(O[C@@H]1[C@@](O[C@@H](O[C@H](COC(C)=O)[C@H]2OC(C(C)C)=O)[C@H](OC(C(C)C)=O)[C@H]2OC(C(C)C)=O)(COC(C)=O)O[C@H](COC(C(C)C)=O)[C@H]1OC(C(C)C)=O)C(C)C,inactive +O=C(O)CC[C@@H](C)[C@]3([H])[C@](CC2)(C)[C@](CC3)([H])[C@@](CC4)([H])[C@@]2([H])[C@]1(C)[C@@]4([H])C[C@H](O)CC1,inactive +OC(CO)CCl,inactive +CC1(C(=O)N(C)C(=O)O1)C,inactive +O=C(O)\C=C/C(O)=O.O=C(NC3CC(N4C)CCC4C3)C1=C2C(CC(C)(C)O2)=CC(Cl)=C1,inactive +O=C(O)[C@H](CS)N.Cl,inactive +C[N+](CCCCCCCCCCCC)(C)[O-],inactive +O=C(CC1=CC=C(C=C1)OC(=O)C2=CC=C(C=C2)NC(=N)N)OCC(=O)N(C)C.O=S(=O)(C)O,inactive +C\1=C/C(O[C@@H](C/C=C/C=C/C=C/C=C/[C@@H](C[C@@H]3O[C@](C[C@H](C[C@H]2O[C@H]/12)O)(C[C@@H]([C@H]3C(O)=O)O)O)O[C@@H]4O[C@@H]([C@H]([C@@H]([C@@H]4O)N)O)C)C)=O,inactive +O=[C@](O[C@H](O[C@H](CO)[C@H]1O)[C@H](O)[C@H]1O)[C@@]5(C)[C@](CC3)([H])[C@](CCC5)(C)[C@@](CC4)([H])[C@@](C2)3C[C@]4(O[C@H]6[C@H](O[C@H]7[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O7)[C@@H](O)[C@H](O)[C@@H](CO)O6)[C@@]2=C,inactive +S=C(S[Te](SC(=S)N(CC)CC)(SC(=S)N(CC)CC)SC(=S)N(CC)CC)N(CC)CC,inactive +ClC(=CCl)Cl,inactive +O=CCCCC=O,inactive +O=C(O[C@@H]2C[C@@H](CC3)N(C)[C@H]3C2)C(CO)C1=CC=CC=C1,inactive +O\C1=C(/OCC(=O)CCCCCCCCCCCC)[C@H](OC1=O)[C@@H](O)CO,inactive +[Na+].C1(=CC=C2C(=C1S([O-])(=O)=O)C=CC=C2)/N=N/C3=C(C=CC4=C3C=CC=C4)O,inactive +ClC(C(=O)O)(Cl)Cl,inactive +C1(=C(/C=C/C2=C(S(=O)(=O)[O-])C=C(C=C2)N)C=CC(=C1)N)S(=O)(=O)[O-].[Na+].[Na+],inactive +C=C(F)F,inactive +C=C/C=N/O,inactive +N(CC(=O)[O-])CC(=O)O.[Na+],inactive +NS(C1=C(Cl)C=C(NCC2=CC=CO2)C(C(O)=O)=C1)(=O)=O,inactive +O=CC=C(CCC=C(C)C)C,inactive +ClC(C(C1=CC=C(C=C1)CC)C2=CC=C(C=C2)CC)Cl,inactive +FC(Cl)(Cl)Cl,inactive +O=C(NN)OC,inactive +N(C(=O)N)(N=O)CC(C)=O,inactive +CCCCCN(N=O)C(=N)N[N+]([O-])=O,inactive +O=C(NCO)C=C,inactive +NC(=S)NN,inactive +O=C(NC1=CC=CC(=C1)Cl)OC(C)C,inactive +O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N,inactive +O=C(N)NC(C(CC)CC)=O,inactive +O=C(NC1=CC=CC(=C1)C(F)(F)F)N(C)C,inactive +O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO,inactive +Cl.O=C(c2cn(C)c1ccccc12)[C@H]3CC=4N\C=N/C=4CC3,inactive +ClC(Br)Br,inactive +O=C1C2=C(C=CC=C2)C(=O)O1,inactive +ClC2(Cl)C1(Cl)C(=C)C(CCl)(CCl)C2(Cl)C(Cl)C1Cl,inactive +S=C=NCC1=CC=CC=C1,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)CCCCCCCCCCCCCCC)C)C)C,inactive +C(O)(=O)[O-].[Na+],inactive +C1N2CN3CN(C2)CN1C3,inactive +CCC1(C2=C(C3=C(C(=CC=C3)CC)N2)CCO1)CC(=O)O,inactive +OC(C(C=CC=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=C(C)S3)=O,inactive +CC1=C(C(=CC(=C1)OC(=O)NC)C)N(C)C,inactive +O=C1CCCCC1,inactive +NC1=NC(C(C2=CC=CC=C2)O1)=O.O[Mg]O,inactive +C(CCC(=O)O)([O-])=O.[Na+],inactive +O=C1CCCCCN1,inactive +O=S(=O)([O-])[O-].O.O.O.O.O.O.[Ni+2],inactive +O=C1C2=C(N=CN2C)N(C(=O)N1C)C,inactive +c12[C@H]([C@@H](C(=O)NNCC)[C@@H]([C@H](c1cc3c(c2)OCO3)O)CO)c4cc(c(c(c4)OC)OC)OC,inactive +C1=C(Cl)C=C3C(=C1)N(CCO)C(=O)C(O)N=C3C2=CC=CC=C2F,inactive +CC1=C(C(=C(C2=C1OC(CCCC(CCCC(CCCC(C)C)C)C)(C)CC2)C)O)C,inactive +C[C@H](C\C=C\C)[C@@H](O)[C@@H]1N(C)C(=O)[C@H](C(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](NC(=O)[C@H](CC(C)C)N(C)C(=O)CN(C)C(=O)[C@H](CC)NC1=O)C(C)C,inactive +N1C(=NC(=C2C=CC=CC=12)N(CCO)CCO)C3=CC=CS3,inactive +O=C1C(=CNC(=O)N1)F,inactive +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +C[Hg]Cl,inactive +ClC(C(Cl)Cl)Cl,inactive +CC1(C2=CC=CC=C2)C(O1)C(=O)OCC,inactive +O=C/C=C/C1=CC=CC=C1,inactive +C1(C(NCC2CCCCN2)=O)=C(C=CC(=C1)OCC(F)(F)F)OCC(F)(F)F.CC(=O)O,inactive +O1C(=O)/C2=C(\C3=C1C=C(C=C3OC)OC)CCC2,inactive +C[C@]12[C@@]3(C(OC4[C@@]1(C(C(=O)C(=C4)C)O)CO)[C@@H]([C@@H]2OC(=O)C)O)CO3,inactive +O=C1C=CC(=O)NN1,inactive +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,inactive +Cl\C2=C(/Cl)C3(Cl)C1COS(=O)OCC1C2(Cl)C3(Cl)Cl,inactive +C[C@@H](CC)C(=O)O[C@H]2C[C@@H](C)\C=C3\C=C/[C@H](C)[C@H](CC[C@@H]1C[C@@H](O)CC(=O)O1)[C@@H]23,inactive +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,inactive +O=C1C(C2=C(C(O)=C3C)C(O)=C(NC(\C(C)=C/C=C/[C@@H]5C)=O)C(/C=N/N4CCN(C)CC4)=C2O)=C3O[C@@](C)1O/C=C/[C@H](OC)[C@@H](C)[C@@H](OC(C)=O)[C@H](C)[C@H](O)[C@H](C)[C@H]5O,inactive +O=C(C1=CCCN(N=O)C1)OC,inactive +O=C1C(C2=CC=CC=C2)(C3=CC=CC=C3)NC(=O)N1,inactive +CC(=O)OC(C1=CC=C(O1)[N+](=O)[O-])OC(=O)C,inactive +OC2=C1[C@@](C=C(C)CC3)([H])[C@]3([H])C(C)(C)OC1=CC(CCCCC)=C2,inactive +Oc1ccc(C[C@](C)(N)C(O)=O)cc1O.OC(=O)[C@@](C)(N)Cc1cc(O)c(O)cc1.O.O.O,inactive +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,inactive +Oc1ccc(cc1OC)/C=C/C(=O)OCCc2ccccc2,inactive +OC1C2=C3C(C(OC4C3=C(C=C(C=4O)O)C(=O)O2)=O)=CC=1O,inactive +O=C(C(O)(C2=CC=CC=C2)C1CCCCC1)OC(C)(C)C#CCN(CC)CC.O.Cl,inactive +CCC(CCCC)CO,inactive +Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,inactive +OCCN(CCO)CCO,inactive +OCC1=CC=CC=C1,inactive +OCC(O)CO,inactive +O=C(C1=CC=CC=C1)OOC(=O)C2=CC=CC=C2,inactive +C1OC1C2CO2,inactive +S=C=NCCCCCCC1=CC=CC=C1,inactive +OCC(=O)[C@@]4(O)[C@H](C)C[C@@H]1[C@]4(C)C[C@H](O)[C@]2(F)[C@@]3(C)/C=C\C(=O)/C=C3/CC[C@@H]12,inactive +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,inactive +CN(N=O)C1=CC=C(C=C1)[N+]([O-])=O,inactive +CC3=CC=C(C=C3)\C(C2=CC=CC=N2)=C/CN1CCCC1.O.Cl,inactive +[Na+].CN(C)c1ccc(/N=N/S([O-])(=O)=O)cc1,inactive +C(C1=CC=C(O)C=C1)(C)(C)C,inactive +C=CC=O,inactive +NC(=O)CI,inactive +OC1=C(C=CC(=C1)O)CCCCCC,inactive +CCCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)C,inactive +OC(=O)C=C,inactive +OC1=C(C=CC(=C1)CC(C(=O)O)N)O,inactive +C1(C)(C)C(=O)NC(=O)NC1=O,inactive +ClC1=CC(C2=CC(Cl)=CC(Cl)=C2)=CC(Cl)=C1,inactive +[Na+].[N-]=[N+]=[N-],inactive +[Na+].[O-]C(=O)[C@@H](N)CC(O)=O,inactive +OC1=CC=CC2=CC=CN=C12,inactive +[Na+].[F-],inactive +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC=C(C=C3)O,inactive +[Na+].[O-]S(=O)(=O)c4ccc(c1c3cc(C)c(cc3[o+]c2cc(c(C)cc12)N(CC)CC)N(CC)CC)c(c4)S([O-])(=O)=O,inactive +OC1=CC(=CC=C1O)CCN.[H]Cl,inactive +CC1=C(SSC1=S)C2=CN=CC=N2,inactive +OC1=CC(C2=NC(N(C(C)C)C3=C2C=CC(C)=C3)=O)=CC=C1,inactive +C(NC)CC(OC1=CC=C(C=C1)C(F)(F)F)C2=CC=CC=C2.[H]Cl,inactive +O=C(/C=C\C(=O)OCC)OCC,inactive +CC1=CC=CC(C=C)=C1,inactive +S=C1NC=NC2=C1N=CN2,inactive +O=C(CC(/C=C/C2=CC=C(O)C(OC)=C2)=O)/C=C/C1=CC=C(O)C(OC)=C1,inactive +O=C(OC)C1=C(C)NC(C)=C(C(OCCC3=CC=C(N4CCN(C(C6=CC=CC=C6)C5=CC=CC=C5)CC4)C=C3)=O)C1C2=CC([N+]([O-])=O)=CC=C2.Cl.Cl,inactive +S=C(NC1CCCCC1)NC1CCCCC1,inactive +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl,inactive +C(S(=O)(=O)[O-])CS.[Na+],inactive +CCCC[Sn](O[Sn](CCCC)(CCCC)CCCC)(CCCC)CCCC,inactive +CC(=O)[O-].[O-]C(=O)C.[O-]C(=O)C.[Cr+3],inactive +S=P(SC1C(SP(=S)(OCC)OCC)OCCO1)(OCC)OCC,inactive +O=C(O)Cc1ccc(cc1)NC(C)=O,inactive +S1C=CC(=C1)CN(C2=NC=CC=C2)CCN(C)C,inactive +S=P(SCC(=O)NC)(OC)OC,inactive +S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC,inactive +O=C1N(C2=CC=CC=C2)N=C(C1)C,inactive +.[Na+].[Cl-],inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OCC)OCC,inactive +.[K+].[Cl-],inactive +CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C,inactive +[Cl-].OC[P+](CO)(CO)CO,inactive +P,inactive +[Cl-].[Ba+2].[Cl-].O.O,inactive +O[As](O)(C)=O,inactive +CC(CCl)OC(C)CCl,inactive +OCCNC1=C(OCCO)C=C([N+]([O-])=O)C=C1,inactive +OCCOCCOC1=CC=C(CCCCCCCCC)C=C1,inactive +Cl.Cl.[O-][N+](=O)c1cccc(c1)C/2C(\C(=O)OC)=C(\C)NC(\C)=C\2C(=O)OCCN3CCN(CC3)C(c4ccccc4)c5ccccc5,inactive +S=C(NC)NC,inactive +[Ca+2].[N-2]C#N,inactive +S=C(N(C)C)SSC(=S)N(C)C,inactive +CC1=CC=CC(C)=C1,inactive +S=C(N(CC)CC)SSC(=S)N(CC)CC,inactive +O=S(=O)(C1=CC=C(C=C1)C(=O)O)N(CCC)CCC,inactive +[Cd+2].[Cl-].[Cl-].[H]O[H],inactive +O=C(OCC)C4=C(C=CC=C4)C(C(C=C(C)C(NCC)=C3)=C3O1)=C(C=C2C)C1=C/C2=N/CC.Cl,inactive +[Cd+2].[Cd+2].[Cd+2].[O-]S(=O)(=O)[O-].[O-]S([O-])(=O)=O.[O-]S([O-])(=O)=O.O.O.O.O.O.O.O.O,inactive +S=C([S-])NCCNC([S-])=S.[Zn+2],inactive +O=C(N1)N(C2OCCC2)C=C(F)C1=O,inactive +OC(=O)[C@]3(C)C[C@H]4/C5=C/C(=O)[C@H]2[C@@](C)(CC[C@@H]1[C@]2(C)CC[C@H](O)C1(C)C)[C@]5(C)CC[C@@]4(C)CC3,inactive +CC(C1=CC(=C(C=C1O)C)SC2=CC(=C(C=C2C)O)C(C)(C)C)(C)C,inactive +[O-][N+](C1=CC([N+]([O-])=O)=CC([N+]([O-])=O)=C1)=O,inactive +CCCCCCCN,inactive +CC(CNCC(C)O)O,inactive +O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)([O-])=O.[Na+],inactive +CCCCCl,inactive +O1C2=C(C=CC=C2)OC3=CC=CC=C13,inactive +[O-][N+](C)(C)CCCCCCCCCC,inactive +OC(=O)CC[N+](=O)[O-],inactive +CC(=O)O[Sn](OC(=O)C)(CCCC)CCCC,inactive +OC(=O)CCCC\C=C(\c1cccnc1)c2ccccc2,inactive +OC(=O)CCC(=O)OCC2(CCCC)C(=O)N(c1ccccc1)N(C2=O)c3ccccc3,inactive +OC(=O)C1=CC=CC=C1,inactive +OC(=O)C1=NN(C2=C1C=CC=C2)CC3=CC=C(C=C3Cl)Cl,inactive +C1(=CC=C2C(=C1)S([N-]C2=O)(=O)=O).C3(=CC=C4C(=C3)S([N-]C4=O)(=O)=O).[Ca+2],inactive +O.O.O.O.NC(=O)[C@@H]3CCCN3C(=O)[C@@H](NC(=O)[C@@H]1CC(=O)N(C)C(=O)N1)C\C2=C\N=C/N2,inactive +C1(C2=CC=CC=C2)=CC(=C(C=C1)N)O,inactive +CN(C)[C@@H]2/C=C\CC[C@@]2(c1ccccc1)C(=O)OCC.OC(=O)\C=C\C(O)=O,inactive +O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC,inactive +NC(=O)C1=NC=CN=C1,inactive +O=[N+](C1=CC2=CC=CN=C2C=C1)[O-],inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2,inactive +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2,inactive +CCCl,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC,inactive +ClC4=C(C=CC=C4)C2=NC(C)C1=NN=C(C)N1C3=C2C=C(CCC5=CC=C(CC(C)C)C=C5)S3,inactive +[O-][N+](C1=CC=CC(C2C(C(OC3CN(C(C5=CC=CC=C5)C4=CC=CC=C4)C3)=O)=C(NC(C)=C2C(OC(C)C)=O)N)=C1)=O,inactive +O[C@H]1[C@@H](NC(CO)CO)C[C@](O)(CO)[C@@H](O)[C@@H]1O,inactive +O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1,inactive +[O]N=O,inactive +ClC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +[O-][N+](/C=C/C1=CC=CC=C1)=O,inactive +NC(=O)NCCCC,inactive +N#CSCC1=CC=CC=C1,inactive +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C,inactive +CCCCOCCO,inactive +OC1=C(C(=O)NC2=NC=CC=C2)N(S(=O)(=O)C3=C1C=CC=C3)C,inactive +OC1=CC=CC=C1,inactive +C1=CC=C(C=N1)N(N=O)C,inactive +C13CC(C4C3O4)C2C1C5C(O5)C2,inactive +Nc(c(ccc1)C)c1C,inactive +CCCCC/C=C\C/C=C\CCCCCCCC(OC)=O,inactive +C1(C2=C(C=CC=C2)N)(=CC=CC=C1).[H]Cl,inactive +CC=C,inactive +OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO,inactive +OC[P+](CO)(CO)CO.[O-]S([O-])(=O)=O.OC[P+](CO)(CO)CO,inactive +N1C(=NC2=C1C=CC=C2)C3=CSC=N3,inactive +O.[Na+].O.O.CCN(CC)C([S-])=S,inactive +OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C,inactive +OC1=C(C=C(C=C1C(C)(C)C)CO)C(C)(C)C,inactive +OC1=C(C=C(C=C1C(C)(C)C)C)CC2=CC(=CC(=C2O)C(C)(C)C)C,inactive +CC1=CC2=CC=CN=C2C=C1,inactive +O=CC1CO1,inactive +OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl,inactive +OC1=C(C=C(C=C1)Cl)CC2=CC=CC=C2,inactive +N1(CSCSC1)N=O,inactive +OC(C)C,inactive +NC1(=CC=C(C=C1)NC2=CC=CC=C2).[H]Cl,inactive +[O-][N+](=O)CCCC,inactive +OC1(=C(O)C(=O)O[C@H]1[C@@H](C[O-])O).[Na+],inactive +O=C(C3=CC=C6C2=C34)C1=CC=CC=C1C4=CC=C2C(C5=CC=CC=C56)=O,inactive +OC(=O)CCl,inactive +OC(=O)CCCCCN,inactive +CC(Cl)Cl,inactive +CCCCCC(/C=C/C=C\CCCCCCCC(=O)OC)OO,inactive +CC1=CC=CC2=CC=CN=C12,inactive +O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2,inactive +S=C=NCCCC1=CC=CC=C1,inactive +OC(COC1=CC=CC2=C1C=CC=C2)CNC(C)C.[H]Cl,inactive +OC(COC(C)(C)C)C,inactive +[O-][N+](=O)C1=CC=CC(=C1)NC(=O)C2=CC3=CC=CC=C3C(=C2O)/N=N/C4=CC(=CC=C4OC)[N+]([O-])=O,inactive +CCCCCC,inactive +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC,inactive +OC(CC(C1)C)C(C1)C(C)C,inactive +OC(CC(=O)O)(CC(=O)O)C(=O)O,inactive +[O-][N+](OCC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O)=O,inactive +Cl[O-].[Na+],inactive +CC(Cl)CCl,inactive +NC(=O)NC1=CC=C(C=C1)C,inactive +C1=CC=CC(=C1)C(C(C2=CC=CC=C2)=O)O,inactive +NC(=O)CCCCC(=O)N,inactive +ClC1=CC(Cl)=C(/N=N/C(C(=O)NC2=C(C=C(C3=CC(C)=C(NC(=O)C(/N=N/C4=C(Cl)C=C(Cl)C=C4)C(=O)C)C=C3)C=C2)C)C(=O)C)C=C1,inactive +CC(Cl)(Cl)Cl,inactive +NC(=O)CCCCC,inactive +O=NN(/C(=N\C#N)NCCSCC1=C(N=CN1)C)C,inactive +NC(=S)NNC=O,inactive +NC(=S)NC1=CC=CC=C1,inactive +O[C@@]2([C@](OC)=O)[C@@]1([H])[C@]([C@](N6CC=C5)([H])[C@]5(CC)[C@H]2OC(C)=O)(CC6)C3=C(C=C(OC)[C@]([C@@]([C@@](OC)=O)(C[C@@H]8CN(C[C@](O)(CC)C8)CC7)C4=C7C(C=CC=C9)=C9N4)=C3)N1C,inactive +NC(=S)NNC(=S)N,inactive +O=C(NCCCN(CC)CC)CN1N=CC(C3=CC=CC=C3)=C1C2=CC=CC=C2.O=C(O)/C([H])=C([H])/C(O)=O,inactive +NC(=S)C1=CC(=NC=C1)CC,inactive +C1=CC=C5C(=C1)N(CC2=CC=C(F)C=C2)C(NC4CCN(CCC3=CC=C(OC)C=C3)CC4)=N5,inactive +NC(=O)NN=CC1=CC=CO1,inactive +C1(=CC=CC=C1)C(=O)[O-].[Na+],inactive +O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC,inactive +OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O,inactive +N12([C@@H]([C@@H](C1=O)NC(COC3=CC=CC=C3)=O)SC([C@@H]2C(=O)[O-])(C)C).[K+],inactive +CC1=CC(NC2=C1C=C(C=C2)OCC)(C)C,inactive +O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.Cl,inactive +C1(=C(C(=C(C(=C1N)F)N)F)F)F.[H]Cl.[H]Cl,inactive +OC1=C(C=C(C=C1)CC=C)OC,inactive +FC(F)Cl,inactive +C1(=C(C=CC(=C1)Cl)N)C.[H]Cl,inactive +C12=C(C(=O)NS1(=O)=O)C=CC=C2,inactive +NC(=O)C1=C(C=CC=C1)C(=O)N,inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1,inactive +C[C@@H]3O[C@]1(CS3)C2CCN(CC2)C1.C[C@@H]6O[C@]4(CS6)C5CCN(CC5)C4.O.Cl.Cl,inactive +CN(C)C(C)=O,inactive +NC(=N)NC#N,inactive +O=P(OC)(OC)OC,inactive +ClCC1=CC=CC=C1,inactive +C12(C(=C(/N=N/C3=C(C4=C(C(=C3)S(=O)(=O)[O-])C=CC=C4)O)C=CC=1S(=O)(=O)[O-])C=CC=C2).[Na+].[Na+],inactive +O=C1CCCO1,inactive +ClCC/C(C2=CC=CC=C2)=C(C3=CC=CC=C3)/C1=CC=C(C=C1)OCCN(C)C.OC(C(O)=O)(CC(O)=O)CC(O)=O,inactive +O1C2C1CCC(C2)C1CO1,inactive +S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC,inactive +Clc3cc(Cl)cnc3Oc1ccc(cc1)Oc2ncc(Cl)cc2Cl,inactive +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,inactive +NC1=CC(=CC=C1C)Cl,inactive +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N,inactive +NC1=C(C=CC=C1)C(=O)O,inactive +OC(C(SC(Cl)=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=CC=C3)=O,inactive +C1=CC(=CC(=C1OCC)[N+]([O-])=O)NC(=O)C,inactive +CC#N,inactive +C1(=CC(=C(C(=C1C)C)O)C)OCCCCCC,inactive +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,inactive +C1=C(C=CC=C1N)C.[H]Cl,inactive +ClC(F)C(F)(F)F,inactive +C(=O)([O-])/C1=C/C(=O)NC(N1)=O.[Na+],inactive +OC(CNC(C)C)C1=CC=C(NS(=O)(C)=O)C=C1.[H]Cl,inactive +C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2)=NN=C4,inactive +ClC1=C(C=CC(=C1)N)C,inactive +NC1=CC=C(C=C1)N,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)O,inactive +ClC1=CC(=C(C=C1SC2=CC=C(C=C2)Cl)Cl)Cl,inactive +O=C1C(NC(=O)N1)NC(=O)N,inactive +OC1C2=CC(=O)OC2=CCO1,inactive +ClC1=CC(=C(C=C1C2=C(C=C(C(=C2)Cl)N)Cl)Cl)N,inactive +NC(CCCN)(C(=O)O)C(F)F,inactive +CC(=O)OCC1=CC=CC=C1,inactive +NC(C(=O)O)CCSC,inactive +NC(CC1=CNC2=C1C=CC=C2)C(=O)O,inactive +O=C2C1=C(CCC2)C(OC[C@@H](O)CNC(C)(C)C)=CC=C1.Cl,inactive +ClC1=C(C=CC=C1)Cl,inactive +C1=CC(=CC=N1)N(N=O)C,inactive +C[N+](CCC(C1=CC=C(C=C1)Cl)C2=NC=CC=C2)C.C(\C(=C(/C(=O)[O-])[H])[H])(=O)O,inactive +CC(CN(CC(C)O)CC(C)O)O,inactive +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,inactive +NC1=C(C=C(C=C1Cl)N)Cl,inactive +NC1=C(C)C=C(N)C=C1.O=S(O)(O)=O,inactive +NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl,inactive +OC(=O)C1=CC(=C(C(=C1)O)O)O,inactive +ClC1=C(Cl)C=CC([C@H]2C3=C(C=CC=C3)[C@@H](NC)CC2)=C1.Cl,inactive +O[C@@]12[C@]3([H])C(O[C@@](C[C@]5(CC[C@H](C)[C@]([C@@H](C)CC)([H])O5)O4)([H])C[C@@]4([H])C/C=C(C)/[C@@H](O[C@]6([H])O[C@@H](C)[C@H](O[C@@]7([H])C[C@H](OC)[C@@H](O)[C@H](C)O7)[C@@H](OC)C6)[C@@H](C)/C=C/C=C1\CO[C@@]([H])2[C@H](O)C(C)=C3)=O,inactive +C(N)(N)=O,inactive +C=C(Cl)Cl,inactive +FC(F)(Cl)Cl,inactive +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2,inactive +C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2,inactive +S(=O)(=O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2,inactive +CS(=O)(=O)OCCCNCCCOS(C)(=O)=O.[H]Cl,inactive +CC(=O)[O-].[O-]C(=O)C.[Ca+2],inactive +C1CN(CC(O1)O)N=O,inactive +C1CNCCN1,inactive +N1C(N(CC(C1=O)C)N=O)=O,inactive +O=C1CC(=O)NC(=O)N1,inactive +N(C1=CC=C(C=C1)NC2=CC=CC=C2)C3=CC=CC=C3,inactive +CC2=C(C(C)=CC=C2)NC1=NCCCS1.Cl,inactive +ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12,inactive +.[Cl-].[Ca+2].[Cl-],inactive +N(=NC1=CC=C(C=C1)N(CCC)CCC)C2=CC=[N+](C=C2)[O-],inactive +IC(I)I,inactive +CN1CCN(CC1)/C2=N/C3=CC=CC=C3SC4C=CC(C)=CC2=4,inactive +OCCOCCOCCO,inactive +CC(C)CN(N=O)C(=N)N[N+]([O-])=O,inactive +O=[Mo](=O)=O,inactive +CC(=O)[O-].[O-]C(=O)C.[Ba+2],inactive +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O,inactive +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl,inactive +CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3,inactive +CS(=O)(=O)OC1=C(C=C(C=C1C(C)(C)C)[N+]([O-])=O)[N+](=O)[O-],inactive +COc3ccccc3N2CCN(CCCN\C1=C\C(=O)N(C)C(=O)N1C)CC2,inactive +CN(N=O)C(=O)C1=C(C=CC=C1)C(=O)N(C)N=O,inactive +OCC(O)CO,inactive +OCC(=O)[C@@]2(O)CC[C@H]3[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4[C@@H](O)C[C@]23C,inactive +Cl.O=P1(OCC(C)(C)CO1)C\4=C(/C)NC(/C)=C(/C(=O)OCCN(Cc2ccccc2)c3ccccc3)C/4c5cccc(c5)[N+]([O-])=O.CCO,inactive +CBr,inactive +CC(=C)C#N,inactive +ClC1=C(Cl)N=C(C(O)=O)C(Cl)=C1N,inactive +CC([N+](=O)[O-])C,inactive +CC(C)NCC(O)COC1(=CC=C(C=C1)CC(=O)N).[H]Cl,inactive +ClC1=CC2=C(C=C1)OC3=C(C=CC(=C3)Cl)O2,inactive +CC(=O)O[C@@H]3CC(=O)O[C@H](C)C\C=C\C=C\[C@H](O)[C@H](C)C[C@H](CC=O)[C@H](O[C@@H]2O[C@H](C)[C@@H](O[C@H]1C[C@@](C)(O)[C@H](OC(=O)CC(C)C)[C@H](C)O1)[C@H](N(C)C)[C@H]2O)C3OC,inactive +C12C(=CC=CC=1NCCN)C=CC=C2.[H]Cl.[H]Cl,inactive +C12=CC(=CC(=C1C3=C(C(O2)=O)CCC3=O)OC)OC,inactive +C12C(=C(C=CC=1NC(C)=O)S(=O)(=O)[O-])C=C(C(=C2O)/N=N/C3=C4C(=C(C=C3)/N=N\C5=CC=C(C=C5)S(=O)(=O)[O-])C=CC(=C4)S(=O)(=O)[O-])S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],inactive +CC(CC1=CC2=C(C=C1)OCO2)S(=O)CCCCCCCC,inactive +N[C@@H](C\C1=C\N=C/N1)C(O)=O.Cl,inactive +CC(C)C=O,inactive +O=C(O)COC1=C(C)C=C(Cl)C=C1,inactive +O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1,inactive +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,inactive +C12=C(C(NC(=N1)N)=O)N(C)C=N2,inactive +ClC(CCl)Cl,inactive +N1(C2C(SC3=C1C=CC=C3)=CC=CC=2)CC(N(C)C)C.[H]Cl,inactive +N1(C2=CC=CC=C2)C(C(N(CS(=O)(=O)[O-])C)=C(N1C)C)=O.[Na+],inactive +C1(=N\CCN/1)C(C)OC2C(=CC=CC=2Cl)Cl.[H]Cl,inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OC)OC,inactive +N=C(N(CCCC)N=O)N[N+](=O)[O-],inactive +O=S(O)(O)=O.O[C@@H]([C@H](C)NC)[C@@]1=CC=CC=C1.O[C@@H]([C@H](C)NC)[C@@]2=CC=CC=C2,inactive +N=C(N)NC,inactive +C(C1=CC=CC=C1)(C2=CC=CC=C2)OCCN(C)C.[H]Cl,inactive +Clc1c([N+]([O-])=O)c(Cl)c(Cl)c(OC)c1Cl,inactive +CC(C1=C(C=CC(=C1)C)O)(C)C,inactive +O.O=C(Nc3cccc1c3O/C(=C\C1=O)C2=N\N\N=N2)c5ccc(OCCCCc4ccccc4)cc5.O=C(Nc3cccc1c3O/C(=C\C1=O)/C=2N\N=N/N=2)c5ccc(OCCCCc4ccccc4)cc5,inactive +C1CCCNCCC1,inactive +O=C(N(CC(C)=O)N=O)NCCCl,inactive +C1(=C(C=C(N)C=C1)[N+](=O)[O-])NCCO,inactive +CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC,inactive +OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1,inactive +C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O,inactive +N(N(CC(F)(F)F)CC(F)(F)F)=O,inactive +C13=C(C=CC=C3)NC2=CN=CC=C12,inactive +O[C@H]([C@@H]2O)[C@@H](O[C@@H]2CO)N(N=CC(N)=N1)C1=O,inactive +N(N(CC(O)=O)CC(O)=O)=O,inactive +CCN(CC)C=O,inactive +CC(C1=CC=C(C=C1)CC(C)C)C(=O)O,inactive +[O-][N+]1=CC=CC=C1C=C,inactive +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +OC[C@@H](NC(C(Cl)Cl)=O)[C@H](O)C1=CC=C(S(=O)(C)=O)C=C1,inactive +O=C(C(C1=CC=CC=C1)(C2=CC=CC=C2)CC(N(C)C)C)CC.[H]Cl,inactive +O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N,inactive +O=C(C(Cl)Cl)N[C@H](CO)[C@@H](C1=CC=C([N+]([O-])=O)C=C1)O,inactive +C1(=CC(=C(O)C=C1)O)C(O)=O,inactive +C1(=CC(=C2C(=C1)N=CC=C2)Br)Br,inactive +O=C(C(=NOC(=O)NC)SC)N(C)C,inactive +C(/C1=C(C=C(C=C1)O)S(=O)(=O)[O-])(C2=CC=C(C=C2)N(CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)=C4/C=C/C(C=C4)=[N+](\CC5=CC(=CC=C5)S(=O)(=O)[O-])CC.[Na+].[Na+],inactive +O=C(C4=CC(OC)=C(C(OC)=C4)OC)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=CC=C6)=C6N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,inactive +O=P(OCC(CCCC)CC)(OCC(CCCC)CC)OCC(CCCC)CC,inactive +O1C(=CC=C1[N+](=O)[O-])/C(=N/O)N,inactive +O=C(C)NCCSP(=S)(OC)OC,inactive +COC1=C(C(=CC2=C1C3=CC=C(OC)C(=O)C=C3[C@@H](NC)CC2)OC)OC,inactive +CC(C)(O)[C@H](O)CC[C@@H](C)[C@H]1CC[C@H]2C(\CCC[C@]12C)=C\C=C3\C[C@@H](O)CCC3=C,inactive +[Cd+2].[O-]C(C)=O.[O-]C(C)=O,inactive +O=[N+](C1=CC2=C(C=C1)NC=N2)[O-],inactive +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O,inactive +OC1=CC(=CC=C1)O,inactive +C1(=C2/C(C3=CC(S(=O)(=O)[O-])=CC=C3N2)=O)/C(C4=CC(S(=O)(=O)[O-])=CC=C4N1)=O.[Na+].[Na+],inactive +O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC,inactive +C(C(C)O)(O[Ca]OC(C(C)O)=O)=O,inactive +O=[N+](CC)[O-],inactive +O=[O+1][O-1],inactive +ClC1(=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N).[H]Cl.[H]Cl,inactive +OC(C)CCl,inactive +C1(=CC(=C(C(=C1)N)C)N).[H]Cl.[H]Cl,inactive +O=C([O-])C(C(/C(CC([O-])=O)=C([C@@H](CCC([O-])=O)[C@@H]5C)\N=C5/C=C4\[N-]\C(C(C=C)=C4C)=C3)=N2)=C(C)/C2=C/C1=C(CC)C(C)=C/3[N-]1.[Na+].[Na+].[Na+].[Cu+2],inactive +O=[W](=O)([O-])[O-].[Na+].[Na+],inactive +C1(=C(C=CC=C1N)N).[H]Cl.[H]Cl,inactive +O=C(C(=C)C)OC,inactive +C1(=CC(=CC=C1N)N).[H]Cl.[H]Cl,inactive +O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+],inactive +OC(CNC(C)C)COC1=CC=CC=C1OCC=C.Cl,inactive +O=C(/C=C/C6=CC=C(O)C(OC)=C6)O[C@@H]4C(C)(C)[C@@]5([H])[C@]1(CC4)[C@]3([C@](CC5)([H])[C@]2(C)CC[C@@]([C@H](C)CC/C=C(C)\C)([H])[C@](C)2CC3)C1,inactive +C1(=CC(=CC=C1N)OC)OC.[H]Cl,inactive +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3,inactive +O=C2NC(=O)CCN2[C@@H]1O[C@H](CO)[C@@H](O)[C@H]1O,inactive +O=C([C@H](CO)[C@]2=CC=CC=C2)O[C@@H]1C[C@H](N4C)[C@@H](O3)[C@@H]3[C@@H]4C1.Br.O.O.O,inactive +O=C([C@H](CC1=CC=CC=C1)NC(=O)[C@H](CC(=O)O)N)OC,inactive +CC(C)(CO)CCCCCCC(C)(C)CO,inactive +ClC(CCl)(Cl)Cl,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CC(=O)O)C)C)C,inactive +ClC(C(O)O)(Cl)Cl,inactive +C1([C@H](CNC)O)(=CC(=CC=C1)O).[H]Cl,inactive +O=C(OC)C1=C(C)NC(C)=C(C(OCC(C)(C)CN(CC3=CC=CC=C3)C)=O)C1C2=CC([N+]([O-])=O)=CC=C2F.Cl,inactive +CN(C)N,inactive +O=C(C1=CC=CC=C1)CCl,inactive +O=C(CC(CCCCCCCCCCCCCCC)=O)CCCCCCCCCCCCCCC,inactive +O=C(CC(C3=C2C=CC(F)=C3)=C(C)/C2=C/C1=CC=C(S(=O)(C)=O)C=C1)O,inactive +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +ClC1=C(C=CC=C1)[N+](=O)[O-],inactive +O=C(C=C)C1=CC=C2C(OCO2)=C1,inactive +ClC(C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)(Cl)Cl,inactive +ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2,inactive +C=CCO,inactive +ClC(C(Cl)Cl)(Cl)Cl,inactive +CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O,inactive +C=CCOCC1CO1,inactive +OCCN.O=C(C1=C(C=CC(=C1)Cl)O)NC2=CC=C(C=C2Cl)[N+](=O)[O-],inactive +O=C(C1=CC=C(C=C1)C(=O)OC)OC,inactive +O=C(C1=CC(=CC=C1O)/N=N/C2=CC=C(C=C2)C(=O)O)O,inactive +O=C(C1=CC=CC(=C1)C(C(=O)O)C)C2=CC=CC=C2,inactive +ClC1=CC=CC=C1C=C(C#N)C#N,inactive +O=C(C1=CC(=C(C(=C1)O)O)O)OCCC,inactive +C1(=C(C=CC(=C1)N(CCO)CCO)NCCO)[N+]([O-])=O,inactive +C1(=C(C=CC(=C1)NC(N(CC)CC)=O)OCC(CNC(C)(C)C)O)C(C)=O,inactive +CC1CC(OC(O1)C)OC(=O)C,inactive +ClC6C4(Cl)C3C1C5C(C3C2OC12)C4(Cl)C(Cl)(Cl)C56Cl,inactive +[Be+2].O=S(=O)([O-])[O-],inactive +O=C(C(C)=C2C)C(C(CCCCCC(O)=O)C1=CC=CC=C1)=C(C)C2=O,inactive +OC(C(Cl)(Cl)Cl)P(=O)(OC)OC,inactive +O=C(CC(/C=C/C2=CC=C(O)C(OC)=C2)=O)/C=C/C1=CC=C(O)C(OC)=C1,inactive +C1(=C(C)C2OC(CCC=2C(=C1OC(=O)C)C)(CCCC(CCCC(CCCC(C)C)C)C)C)C,inactive +O=C(C2=CC=CC=C2)S\C(CCOC(C3=CC=CC=C3)=O)=C(C)/N(C=O)CC1=CN=C(C)N=C1N.Cl,inactive +C1(=C(C=CC(=C1)CCNC)OC(C(C)C)=O)OC(C(C)C)=O.[H]Cl,inactive +C([O-])(=O)CN(CC(=O)O)CCN(CC([O-])=O)CC([O-])=O.[Na+].[Na+].[Na+].[H]O[H].[H]O[H].[H]O[H],inactive +BrC(C(=O)NC(=O)N)(CC)CC,inactive +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl,inactive +O.[Zn+2].O.[O-]C(C)=O.[O-]C(C)=O,inactive +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C,inactive +O=C(C(SP(=O)(OC)OC)CC(=O)OCC)OCC,inactive +C1(C2=CC=CC=C2)=CC(=C(C=C1)NC(=O)C)O,inactive +CC1=C(Cl)C(=O)OC2=C1C=CC(=C2)OP(=S)(OCC)OCC,inactive +C1(CCCCC1[N+]).O=S(=O)([O-])O,inactive +ClC1=C(C=C(C=C1C(=O)O)Cl)N,inactive +C1(CCCCC1)N.[H]Cl,inactive +NNC1=NC(=CS1)C2=CC=CC=C2,inactive +C1(C[C@H]([C@@H]([C@H]1CCCCCCC(=O)OC)/C=C/CC(O)(CCCC)C)O)=O,inactive +O=C(CN=C2C3=CC=CC=C3)NC1=C2N(N=C1C)CC,inactive +O[As](=O)(C1=CC=C(C=C1)NC(=O)N)O,inactive +C1(C=CC=CN=1)CCl.Cl,inactive +O=C(CN1C(=O)CCC1)NC2=C(C=CC=C2C)C,inactive +O[As](=O)(C1=CC(=C(C=C1)O)[N+](=O)[O-])O,inactive +C1(C2=CC=C(C(=C2)Cl)N=NC(C(C)=O)C(=O)NC3=C(C=C(C(=C3)OC)Cl)OC)=CC(=C(C=C1)N=NC(C(C)=O)C(=O)NC4=CC(=C(C=C4OC)Cl)OC)Cl,inactive +ClC1=C(C=C(C(=C1)Cl)Cl)OCC(=O)O,inactive +O(S(=O)(=O)C)CCCCOS(=O)(C)=O,inactive +N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O,inactive +CC(CO)O,inactive +NC1=NC(=NC(=N1)N)C2=CC=CC=C2,inactive +CC(=O)N[C@@H](CS)C(=O)O,inactive +OC(OC(O)CC)CC,inactive +C1(NS(=O)(=O)[O-])CCCCC1.[Na+],inactive +NC1=CC=CC=C1,inactive +O=C(C)OC/C=C(C)/CC/C=C(C)/C,inactive +CC(C)NCC(O)COc1ccc(cc1)NC(C)=O,inactive +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl,inactive +CCN(CC)C(=O)C1=CC=CC(C)=C1,inactive +C1(CCNC(NC(N)=N)=N)=CC=CC=C1.[H]Cl,inactive +C1CCNCC1,inactive +NCCS(O)(=O)=O,inactive +C1(CCN=C=S)=CC=CC=C1,inactive +C1(CSCCNC(NC)=NC#N)=C(C)NC=N1,inactive +O=[Cr]O[Cr]=O,inactive +c1(n(cnc1)C)C[C@@H]2[C@@H](C(=O)OC2)CC,inactive +Nc1cc(Cl)c(N)cc1.OS(O)(=O)=O,inactive +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,inactive +S=C(S[Pb]SC(N(C)C)=S)N(C)C,inactive +O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-],inactive +N=C\2/N=C3/O[C@H]1[C@H](O)[C@@H](CO)O[C@H]1N3/C=C/2,inactive +O=[N+](C1=CC(=C(C=C1)C(=O)O)N)[O-],inactive +O=[N+](C1=C2C(=CC=C1)C=CC=C2)[O-],inactive +ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl,inactive +C1(C(=CC=C(C=1)C)N)C.[H]Cl,inactive +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)[N+](=O)[O-],inactive +O=NN1CN(C2)CN(N=O)CN2C1,inactive +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +C1(=CC=C(N)C=C1)C.[H]Cl,inactive +NC(=S)C(=S)N,inactive +O=[N+](C1=CC=C(C=C1)N)[O-],inactive +O=C(C1=C(C=CC=C1)C(=O)OCC=C)OCC=C,inactive +ClC1(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +O=[N+](C1=CC=C(C=C1)Cl)[O-],inactive +O=S(C1=CC=C2C(C=CC(O)=C2\N=N/C3=CC=C(S(=O)([O-])=O)C=C3)=C1)([O-])=O.[Na+].[Na+],inactive +O=[N+](C1=CC(=C(C=C1)N)N)[O-],inactive +NC1=C(C=C(C=C1)N)[N+](=O)[O-],inactive +ClCC(=O)C1=CC=C(NC(=O)C)C=C1,inactive +ClC(=C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC,inactive +[Na+].O=C([O-])[C@@H](N)CCC(O)=O,inactive +O=S1(=O)CC=CC1,inactive +O[C@H]([C@H](O)CNCCCl)[C@H](O)[C@H](O)CNCCCl,inactive +[Ti+2](C1=CC=CC1)C2(=CC=CC2).[Cl-].[Cl-],inactive +O[C@@H](CO)[C@@H](O1)C(OCC)=C(O)C1=O,inactive +OC(=O)[C@@H](N)CSCC,inactive +CC(OC(=O)OC1CCCCC1)OC(=O)c5cccc6nc(OCC)n(Cc2ccc(cc2)c3ccccc3C\4=N\N=N/N/4)c56,inactive +O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4,inactive +NC1=NC(N)=NC(C2=CC(Cl)=CC=C2Cl)=N1.O=C(O)/C=C\C(O)=O,inactive +C/C=C/C1=CC=C(C=C1)OC,inactive +O=[C@]([C@@H]1C[C@@H](O)CN1N=O)O,inactive +C(C(F)(Cl)Cl)(F)(F)Cl,inactive +C1(C(COCCOC(=O)CCCCCCCC=CCCCCCCCC)OCCO)OC(OCCO)CC1OCCO,inactive +O=[Bi]Cl,inactive +O=C(O[C@H](CC)[C@](O)(C)[C@H](O)[C@@H](C)C2=O)[C@H](C)[C@@H](O[C@H]3C[C@](OC)(C)[C@@H](O)[C@H](C)O3)[C@H](C)[C@H]([C@@](O)(C)C[C@H]2C)O[C@H]1[C@H](O)[C@@H]([N@H+](C)C)C[C@@H](C)O1.[O-]C(CCCCCCCCCCCCCCCCC)=O,inactive +O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3,inactive +O=[As](O)(O)[O-].[Na+],inactive +CC(C=NOC(=O)NC)(SC)C,inactive diff --git a/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_SingleCellCall.csv b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_SingleCellCall.csv new file mode 100644 index 0000000..e658360 --- /dev/null +++ b/test/data/CPDBAS_v5d_cleaned/DSSTox_Carcinogenic_Potency_DBS_SingleCellCall.csv @@ -0,0 +1,1505 @@ +STRUCTURE_SMILES,ActivityOutcome_CPDBAS_SingleCellCall +FCC(F)(F)F,active +C1(CCN(C1)N=O)O,active +ClCCOCCCl,active +N1/C(=N\C2=C(C1=S)N=CN2[C@]3(C([C@@]([C@](O3)(CO)[H])(O)[H])([H])[H])[H])N,active +N1=C(N=C(N(CO)CO)N=C1N(CO)CO)N(CO)CO,active +CCC(C)=NO,active +OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2,active +N1=CC=CC=C1,active +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](\CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=CC=C5.[Na+],active +N=C(N(CC)N=O)N[N+]([O-])=O,active +N=C(N(N=O)C)N[N+](=O)[O-],active +BrC(CCl)CBr,active +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl,active +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl,active +N1(CC(N(C(C1)C)C(C2C=CC=CC=2)=O)C)N=O,active +C1(=CC=C(N)C=C1)C.[H]Cl,active +N=C(N)NCCC[C@H](NC([C@@H](NC([C@@H](NC(C)=O)CC(C)C)=O)CC(C)C)=O)C=O,active +NC(=O)NC1=CC=C(C=C1)C,active +NC(=O)NNC1=CC=CC=C1,active +NC(=O)N(CC)N=O,active +NC(=O)N(CC=C)N=O,active +O=C(N(CC(C)O)N=O)NCCCl,active +CC(C)(O)CC[C@@H](O)[C@@H](C)[C@H]2CC[C@@]1(O)C/3=C/C(=O)[C@@H]4C[C@@H](O)[C@@H](O)C[C@]4(C)[C@H]\3CC[C@@]12C,active +NC(=O)OC,active +NC(=O)OCC,active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O,active +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O,active +N1C=CC=C(C=1)C2N(N=O)CCC2,active +N1C=NN(C=1)CC(CN2N=CN=C2)(C3=C(C=C(C=C3)F)F)O,active +NC(=O)Cc2c([O-])on[n+]2Cc1ccccc1,active +NC(=O)CCCCC,active +NC(=O)C=C,active +OC(=O)C(Cl)Cl,active +N(CC(CO)O)(C)N=O,active +N(CC(CO)O)(CC(C)=O)N=O,active +CN(C1=CC=C(C=C1)/N=N/C2=CC(=CC=C2)C)C,active +N(CC(C)O)(CCO)N=O,active +C1CC=C2[C@](C1)([C@@]3([C@@](CC2)([C@]4([C@](CC3)([C@](CC4)(C#C)O)C)[H])[H])[H])[H],active +CCC(CCCC)CO,active +N(CC(CO)O)(CC=C)N=O,active +N(CC(CO)O)(CCO)N=O,active +N(C(=O)N)(N=O)CC(C)=O,active +N(C(=O)NCC(C)O)(N=O)C(C)Cl,active +NC1=C(C=CC(=C1)N)C,active +N(C(=O)N)(N=O)CC(=O)O,active +N(C1=CC=CC=C1)NC2=CC=CC=C2,active +N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O,active +O=NN(CC=C1)CC1,active +N(C)[N+].S(=O)(=O)([O-])O,active +N(NC(C)=O)C1=CC=C(C=C1)CO,active +N(CCCCO)(CCCC)N=O,active +ClC1=CC=CC(C2=CC(Cl)=CC=C2)=C1,active +N(NC(C)=O)C(C1=CC=NC=C1)=O,active +N/1C(N(\C=C\1)C)=S,active +N#[N+]C1=CC=CC=C1.O=S([O-])(O)=O,active +N(NCC=C)CC=C.[H]Cl.[H]Cl,active +CC1=CC=CC=C1,active +N(NC(CC[C@H](N)C(=O)O)=O)C1C=CC(=CC=1)C(=O)O,active +N(CCN(C)C)(C)N=O,active +N(CCCCCCCCCC)(C)N=O,active +N(CCCCCCCCCCCCCC)(C)N=O,active +N(N)(CC=C)CC=C,active +N(N)(CCCC)C=O,active +CC=CCl,active +N(N)(CC)C=O,active +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1,active +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1,active +NC1C=CC2=C(N=1)NC3=CC=CC=C23,active +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1,active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C,active +NC2=CC=C(C=C2N)C1=CC=C(N)C(N)=C1.Cl.Cl.Cl.Cl,active +O=C(N(CCO)N=O)N,active +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O,active +NC2=C(O)C=C(C=C2)C(C=C1O)=CC=C1N.Cl.Cl,active +NC1=CC=CC2=C1C=CC=C2,active +NC1=CC2=C(C=CC=C2)C=C1,active +NC1=CC=CC(C)=C1.[H]Cl,active +NC1=CC=CC=C1[H]Cl,active +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,active +NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1,active +NC1=NC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)N,active +NC1=NC(=NC(=N1)N)N,active +N#CN(C)N=O,active +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O,active +NNCCC.[H]Cl,active +NS(C1=C(Cl)C=C(NCC2=CC=CO2)C(C(O)=O)=C1)(=O)=O,active +O(C1=CC=CC=C1)CC2CO2,active +O(CC1(C)C)C1=O,active +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2,active +OC1=CC=C(C=C1)O,active +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+],active +C=O,active +NC3=CC1=C(C=C3)OC2=C1C=CC=C2,active +NCC(O)=O,active +NNC1=NC(=CS1)C2=CC=C(O2)[N+]([O-])=O,active +NC1=CC=C(C=C1OC)/N=N/C2=CC=CC=C2,active +NN(CCCC)CCCC,active +NNC1=CC=CC=C1.[H]Cl,active +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3,active +NC1=C(C=CC(=C1)Cl)N,active +NC1=C(C=C(C=C1)N)[N+](=O)[O-],active +O=C(O[C@@H]1CC[N+]2([O-])[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C,active +NC1=C(C=CC(=C1)NC(=O)C)OCC,active +ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl,active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-],active +NC1=C(C=CC(=C1)N)Cl,active +O=C(N(C)C)Cl,active +NC(NC1=CC=C(C=C1)OCC)=O,active +[C@]24([C@@](C(COC(=O)CCCc1ccc(cc1)N(CCCl)CCCl)=O)(CC[C@H]2[C@@H]3CCC=5[C@@]([C@H]3[C@H](C4)O)(\C=C/C(C=5)=O)C)O)C,active +NC(CCSCC)C(=O)O,active +OC1=C(C=CC(=C1)C)O,active +O=[C@@]([C@@H]1C=C([C@]4([H])N(C)C1)C3=C2C(C4)=C(NC2=CC=C3)Br)N[C@@]5([C@H](C)C)C(N([C@@H](CC(C)C)C(N7CCC[C@@]67[H])=O)[C@@]6(O)O5)=O.O=S(O)(C)=O,active +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl,active +NC1(=CC=C(C=C1)C2=CC=CC=C2).[H]Cl,active +NC1=CC=C(C=C1)C2=CC=C(C=C2)F,active +O=NN1CCCCCCC1,active +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2,active +NC1=CC=C(C=C1)C2=CC=CC=C2,active +NC1=CC=C(OC2=CC=C(N)C=C2)C=C1N,active +NC1=CC=C2C3=C(C=CC=C3)OC2=C1,active +CN(CCCCCCCCCCC)N=O,active +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl,active +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N,active +NC1=CC(=CC=C1C)Cl,active +C(=C/C=O)\[O-].[Na+],active +[N+](=N/CCC)(/CCC)[O-],active +NC1=CC=C(/C=C/C2=CC(OC)=CC=C2OC)C=C1,active +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl,active +NC1=CC(=CC=C1OC)C,active +C=CCN(CC=C)N=O,active +CCBr,active +CN(CC(C)=O)N=O,active +ClC/C=C/CCl,active +ClC(Cl)Br,active +ClC(Cl)C(F)(F)F,active +ClC1(=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N).[H]Cl.[H]Cl,active +ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl,active +ClC/C=C/CCl,active +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O,active +ClC(C(Cl)Cl)(Cl)Cl,active +ClC(C(Cl)Cl)Cl,active +OO,active +ClC(C(Cl)(Cl)Cl)(Cl)Cl,active +ClC(CCl)(Cl)Cl,active +ClC(Cl)(Cl)Cl,active +ClC(C1=CC=CC=C1)(Cl)Cl,active +O=NN(C)CCOS(C1=CC=C(C)C=C1)(=O)=O,active +O=C(N(CCCCC)N=O)N,active +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,active +ClC1=C(Cl)C(Cl)=CC2=C1OC3=C(C=C(Cl)C(Cl)=C3Cl)O2,active +O=C(CC(CCCCCCCCCCCCCCC)=O)CCCCCCCCCCCCCCC,active +ClC1=CC=C(C=C1)Cl,active +O=[N+](C1=CC=CC2=CC=CN=C12)[O-],active +ClC1=CC(C2=CC(Cl)=C(N)C=C2)=CC=C1N.Cl.Cl,active +ClC1=CC(Cl)=C(/C(OP(=O)(OC)OC)=C/Cl)C=C1Cl,active +NC1=C(C=C(C=C1Cl)N)Cl,active +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl,active +ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N,active +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)[N+](=O)[O-],active +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-],active +O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1,active +NC(=O)C1=C(C=CC=C1)OCC,active +ClC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)Cl)N,active +C1(C(N\C(=N/C1=O)[O-])=O)(CC)CC.[Na+],active +CCOC(=O)N(C)N=O,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl,active +CCNN.[H]Cl,active +O=C(OC[C@@H](C(=O)O)N)C=[N+]=[N-],active +Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,active +CC(=O)NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(NC(C)=O)C=C2,active +Cl.Cl.Cl.Cc1ccc(cn1)C\C2=C\N/C(=N\C2=O)NCCSCc3ccc(CN(C)C)o3,active +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2,active +CCCCOCCO,active +CCCCC/C=N/N(C=O)C,active +CCCCCC,active +ClCCN(C)CCCl,active +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N),active +CCCCOP(=O)(OCCCC)OCCCC,active +CCCl,active +ClC(=CCl)Cl,active +ClC(C(=O)O)(Cl)Cl,active +OC(=O)C(C)(C)CCCOc1ccc(OCCCC(C)(C)C(O)=O)c(c1)c2ccccc2,active +ClC(=C(Cl)Cl)Cl,active +OCC1CO1,active +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,active +ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2],active +C=CCC1=CC=C2C(=C1)OCO2,active +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N,active +CC(N(C1=CC=CC2=C1CC3=C2C=CC=C3)C(C)=O)=O,active +Cl[C@@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl,active +NC(N3C)=NC2=C3C(C)=CC1=NC=CC=C12,active +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,active +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,active +Cl\C=C\CCl,active +Cl\C=C\CCl,active +ClC1=CC=CC=C1,active +CC(C)(C)NCC(O)C1=CC(O)=CC(=C1)O,active +CN1CC[C@H]2OC(=O)C3(C[C@@H](C)[C@@](C)(O)C(=O)OC\C(=C\C1)C2=O)O[C@@H]3C,active +NNC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1,active +N(NC)C.[H]Cl.[H]Cl,active +CN[N+](=O)[O-],active +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O,active +CN(N=O)C(=O)NCCC[C@H](N)C(O)=O,active +CN(N=O)C1=C(C(NC)=O)N(C)C=N1,active +N(CC(C)=O)(CC=C)N=O,active +CN(C1=CC=C(C=C1)/N=N/C2=CC=CC=C2)C,active +CN(C)N,active +CN(C)P(=O)(N(C)C)N(C)C,active +C1(=CC=CC=C1)CCNN.S(O)(O)(=O)=O,active +CN(CC)N=O,active +CN(C1=CC=CC=C1)C,active +CN(C1=CC=CC=C1)N=O,active +COC1C=C(C=CC=1C2NC3=CN=CC=C3N=2)S(C)=O,active +COC2=CC=C(C=C2)CN(CCN(C)C)C1=NC=CC=C1.OC(\C=C/C(O)=O)=O,active +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2,active +COC1=CC=C(C=C1)O,active +CC(C)(C)O,active +F[C@@]([C@](C=C4)(C)C3=CC4=O)2[C@@H](O)C[C@]([C@](C5)([H])[C@@]([H])2CC3)(C)[C@@]1([C@](CO)=O)[C@@H]5OC(C)(C)O1,active +CP(=O)(OC)OC,active +CS(=O)(=O)OC,active +CN1N(C2=CC=CC=C2)C(=O)C=C1C,active +Cn3nc(CO)nc3NCCCOc2cc(CN1CCCCC1)ccc2,active +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N,active +CN(N=O)C,active +COC1=C(C=CC=C1)[N+](=O)[O-],active +COC1=C(O)C=CC(=C1)C=NNC(=O)C2=CC=NC=C2,active +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl,active +CC1=C(C2=C(C=CC(=C2)OC)N1C(=O)C3=CC=C(C=C3)Cl)CC(=O)O,active +ClC2(Cl)C1(Cl)C(=C)C(CCl)(CCl)C2(Cl)C(Cl)C1Cl,active +ClC2=C(C=CC(Cl)=C2Cl)C1=C(Cl)C(Cl)=C(Cl)C=C1,active +Clc1nc(NCC)nc(NC(C)(C)C#N)n1,active +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O,active +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl,active +NC(=O)OC=C,active +ClC2=C(C=CC=C2Cl)C1=C(Cl)C=C(Cl)C=C1,active +C1(=CC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)C)C,active +ClC1=NC(=NC(=N1)NC(C)C)NCC,active +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],active +F/C(F)=C(\F)F,active +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2,active +ClC1C(C(C(Cl)C(C1Cl)Cl)Cl)Cl,active +Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,active +ClC1=NC(SCC(NCCO)=O)=NC(NC2=CC=CC(C)=C2C)=C1,active +ClC13C5(Cl)C2(Cl)C4C(Cl)(C(Cl)(Cl)C12Cl)C3(Cl)C4(Cl)C5(Cl)Cl,active +ClCCN[P]1(=O)OCCCN1CCCl,active +ClCOC,active +ClCCN(CCCl)[P]1(=O)NCCCO1,active +ClCCN(CCCl)C1=CC=C(CC(OC3=CC=C(C4=C3)[C@]2([H])[C@](CC4)([H])[C@@](CC[C@@H]5OC(CC6=CC=C(N(CCCl)CCCl)C=C6)=O)([H])[C@]5(C)CC2)=O)C=C1,active +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,active +O=NN(CCC)CCC,active +ClCOCCl,active +CN(C)/N=N/C1=CC=CC=C1,active +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O,active +O=[N+](C1=CC(=C(C=C1)OC)N)[O-],active +C=C(Cl)Cl,active +ClCC1=CC=CC=C1,active +O=N(=O)c1ccc(C)cc1,active +CN(C)CNc2nnc(/C=C/c1ccc(o1)[N+]([O-])=O)o2,active +ClCCl,active +[O-]\[N+](CC)=N/C,active +C1(NC(CN1N=O)=O)=O,active +O=S(=O)([O-])[O-].[Cd+2],active +NC1=CC=C(C2=CC=C(N)C=C2)C=C1,active +O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H],active +O=S(\N=C(NCCSCC2=CC=C(CNC)O2)/NCC(C1=CC=C(O)C=C1)O)(C)=O,active +O=S(=O)(C1=CC=C(C=C1)C(=O)O)N(CCC)CCC,active +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N,active +[N+](=N\C(C)C)(/C(C)C)[O-],active +O=S(=O)(C1=CC=C(C=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+],active +O=P(N1C(C1)C)(N1C(C1)C)N1C(C1)C,active +O=C(OC1=C2C(=CC=C1)C=CC=C2)NC,active +O=NN1CCSCC1,active +O=P(H)(OC)OC,active +O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.[Mg+2],active +O=P(OCC(CCCC)CC)(OCC(CCCC)CC)OCC(CCCC)CC,active +O=P(OC)(OC)OC,active +O=P(OC=C(Cl)Cl)(OC)OC,active +N[C@@H](CCSCC)C(=O)O,active +Cl.CC(=O)O[C@@H](CC)C(C[C@H](C)N(C)C)(c1ccccc1)c2ccccc2,active +[Cl-].C/[N+](C)=C1\C=C/C(C=C1)=C(\c2ccc(cc2)N(C)C)c3ccc(cc3)N(C)C,active +OC(=O)C1=CC=C(C=C1)[N+](=O)[O-],active +OC(=O)CCCCCCCCCCN,active +C1/C=C\CN(O1)N=O,active +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl,active +O=C1OC2=C(C=CC=C2)CC1,active +O=S(N1C[C@@H](C)C[C@H](C1)C)(C2=CC(C(O)=O)=C(Cl)C=C2)=O,active +ClC(C(O)O)(Cl)Cl,active +O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C,active +O=S(C1=C3C(C=CC=C3)=C(O)C(/N=N/C2=CC(S(=O)([O-])=O)=C(C)C=C2C)=C1)([O-])=O.[Na+].[Na+],active +N(CCCC(F)(F)F)(CCCC(F)(F)F)N=O,active +ON=C1C=CC(=NO)C=C1,active +O=S1(=O)CCCO1,active +O1C(N(CC1C)N=O)=O,active +O=C(C[C@@H](C[C@@H](/C=C/C1=C(C2=C(N1C(C)C)C=CC=C2)C3=CC=C(C=C3)F)O)O)O,active +C1=CC=CC=C1C(O)C(N(C)N=O)C,active +CCN(CC)N=O,active +O=N[O-].[Na+],active +C=CF,active +O=NN(CC(=O)C)CC(=O)C,active +O=NN(C)C1=NC=NC2=C1N=CN2[C@@H]3O[C@H](CO)[C@@H](O)[C@H]3O,active +O=NN(C)CCCCCCCCCCCC,active +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O,active +O=CC1=CC=CC=C1,active +FCCl,active +O=C3C[C@@H]4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](C)(O)CC[C@@H]12)[C@@]4(C)C\C3=C\O,active +O=CNN,active +O=CNNC=O,active +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-],active +C(CCCN(N=O)C)(O)C1C=NC=CC=1,active +O=NN1CCC(=O)NC1=O,active +O=NN1CCCC1,active +O=C(N(CCO)N=O)NCCCl,active +O=NN(CCO)CCO,active +O=NN1CCN(N=O)CC1,active +O=NN1CCOCC1,active +C1(N=C(SC=1)NN)C2=CC=C(C=C2)N,active +C1CO1,active +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl,active +O=NN(CCCC)CCCC,active +OC2=NN=C(O2)C1=CC=C([N+]([O-])=O)O1,active +[O-][N+](=O)c1ccc2c3ccccc3Cc2c1,active +O=NN(CCN(C)C)C(=O)[NH2+]CC.[O-]N=O,active +O=NN(CCN1)CC1,active +NN,active +O=NN(CCCCCC1)CCCCCC1,active +OC(=O)CN(CC(=O)O)CC(=O)O,active +OCCOCCO,active +CC(=S)N,active +OCCNC2=C1C=CC=CC1=NC(C3=CC=C([N+]([O-])=O)S3)=N2,active +OCCNN,active +NC1=C(C=C2C3=C(C=CC=C3)OC2=C1)OC,active +S(CC)(=O)(=O)C1C2=C(C(=CC=1)S(N)(=O)=O)C=CC=C2,active +ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2,active +P(=O)(OC)(OC)N1CCOCC1,active +OCC(CO)(CBr)CBr,active +OC1=CC=C(C=C1C(C)(C)C)OC,active +CC=O,active +OCC(=O)[C@@]54OC(O[C@@H]5C[C@@H]1[C@]4(C)C[C@H](O)[C@@H]2[C@@]3(C)/C=C\C(=O)\C=C3\CC[C@@H]12)CCC,active +OCCBr,active +OCCN(CCO)CCO,active +OC1=C(O)C=C4C(C[C@](COC2=C3C=CC(O)=C2O)([C@@]34[H])O)=C1,active +ClC#CCl,active +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,active +S=C1NCCN1,active +S=C(NCC)NCC,active +NN(C=O)CCC,active +S=P(SCN1C(=O)SC(=N1)OC)(OC)OC,active +SC1=NC2=C(C=CC=C2)S1,active +O=C(N(CCCCC)N=O)OCC,active +CC(=NO)C,active +S=C(N(C)C)NC,active +[K+].C1(=CC=C2C(=N1)N(C=C(C2=O)C([O-])=O)C)/C=C/C3=CC=C(O3)[N+]([O-])=O,active +S=C([S-])NCCNC([S-])=S.[Zn+2],active +C1(NNC(C)=O)=CC=CC=C1,active +S=C(N1CCOCC1)SN1CCOCC1,active +NCC1(CC(=O)O)CCCCC1,active +S=C(N(CC)CC)SCC(=C)Cl,active +C1=COC=C1,active +[O-][N+](C3=CC=C(O3)C1=CN=C2N1C=CC=C2)=O,active +OC1=C(C=C(C=C1)Cl)CC2=CC=CC=C2,active +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C,active +OC1=C(C=C(C=C1Cl)Cl)Cl,active +OC1=C(C=CC(=C1)/C=C/C(=O)O)O,active +C[C@@H](CC)C(=O)O[C@H]2C[C@@H](C)\C=C3\C=C/[C@H](C)[C@H](CC[C@@H]1C[C@@H](O)CC(=O)O1)[C@@H]23,active +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C,active +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl,active +CC(=O)NN,active +OC(C1=CC=C(C(=C1)CO)O)CNC(C)(C)C,active +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC,active +CC(NC(=O)C1=CC(=CC(=C1)Cl)Cl)(C#C)C,active +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +OC(COC(C)(C)C)C,active +C1COCCO1,active +OC2=C(C)C1=C(C(C)=C2)OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CC1,active +ClCCCl,active +OC1=CC2=C(C=C1)OCO2,active +N1(C(=CN=C1C)[N+](=O)[O-])CCO,active +O=NN(CC(C)O)CC(C)O,active +O=C1C=C(NC(=S)N1)CCC,active +O=C(N(C)N=O)C1=C(N(N=O)C)N=CN1C,active +ClC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N,active +OC1=C(C=CC=C1OC)O,active +[H][C@]12N(CC=C2COC([C@@](O)(C(O)(C)C)[C@H](C)OC)=O)CC[C@@H]1OC(\C(C)=C/C)=O,active +ClC1=C(C=C(C=C1C(=O)O)Cl)N,active +OC1=C(C=CC=C1)O,active +CC1=CC(=C(C=C1C)N)C,active +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2,active +OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O,active +O(C)c1cc(CC=C)ccc1OC,active +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1,active +O=C(N(CC(C)C)N=O)N,active +O=C(C1=CC=CC=C1)NN,active +C1(C2=C(C=CC=C2)N)(=CC=CC=C1).[H]Cl,active +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C,active +O=C(C1=CC=NC=C1)NN,active +O=C=NC1=CC(N=C=O)=CC=C1C,active +OS(=O)(=O)O.NN,active +O=C1C(C2=CC=CC=C2)(C3=CC=CC=C3)NC(=O)N1,active +O=C1[C@H]3[C@H](C3)[C@@]([C@]4([H])[C@@]([C@@]5([H])[C@]([C@@](CC5)(OC(C)=O)[C@@](C)=O)(C)CC4)([H])C=C2Cl)(C)C2=C1,active +O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C,active +O=C(C)NC3=CC=C(C2=C3)C1=C(C2=O)C=CC=C1,active +O=C(C)NCC1=NC(=NO1)C2=CC=C(O2)[N+]([O-])=O,active +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC,active +C12(C(=CC(=C(C=1/N=N/C3=C4C(=C(C=C3)S(=O)(=O)[O-])C=CC=C4)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+].[Na+],active +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O,active +O=NN(C(=O)N)CCC,active +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1,active +O=C(N(C)N=O)NC1=NC2=C(S1)C=CC=C2,active +C1CCCN(O1)N=O,active +CC/C(C2=CC=CC=C2)=C(C1=CC=CC=C1)/C(C=C3)=CC=C3OCCN(C)C.OC(C(CC(O)=O)(O)CC(O)=O)=O,active +O=C(N(CC)N=O)NCC(=O)C,active +O=C(N(CC)N=O)NCCO,active +O=C(N(CC(C)=O)N=O)NCCCl,active +NC(=S)C1=CC(=NC=C1)CC,active +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,active +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,active +O=C(C3=CC=C6C2=C34)C1=CC=CC=C1C4=CC=C2C(C5=CC=CC=C56)=O,active +ClC(CCl)Cl,active +O=C(CCCN(C)N=O)O,active +O=C(CN=C2C3=CC=CC=C3)NC1=C2N(N=C1C)CC,active +NC(=S)N,active +C1CCC[C@@H](N1N=O)C,active +O\N=C1\CCCC1,active +O=[Cr](=O)(O[Cr](=O)(=O)[O-])[O-].[Na+].[Na+],active +O=NN(CCCCC)CCCCC,active +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O,active +O=[N+]([O-])C1=CC=C(O1)/C=N/N2C(N(CCO)CC2)=O,active +O=[N+]([O-])C3=CC=C(O3)/C=N/N1C(O[C@@H](CN2CCOCC2)C1)=O.Cl,active +O=[Mo](=O)=O,active +O=P(OC(CCl)CCl)(OC(CCl)CCl)OC(CCl)CCl,active +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr,active +CC(CC1=CC2=C(C=C1)OCO2)S(=O)CCCCCCCC,active +O[C@]1(C(C)2C)[C@]2([H])[C@@](C=C(CO)C4)([H])[C@]([C@@](C=C3C)([H])[C@@]4(O)C3=O)(O)[C@H](C)[C@H]1O,active +O=NN(C1=CC=CC=C1)C2=CC=CC=C2,active +O[C@H]([C@H]([C@@H]([C@@H](CO)O1)O)O)[C@@H]1OC/N=[N+](C)\[O-],active +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr,active +O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,active +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl,active +O=P(OCCCl)(OCCCl)OCCCl,active +O=C4C=C2[C@@](CC4)([H])[C@]1([H])[C@](CC2)([H])[C@@](CC3)([H])[C@@](CC1)(C)[C@]3(OC(C)=O)C#C,active +O=[N+](C1=CN=C(S1)N)[O-],active +O=[N+](OC(CO[N+](=O)[O-])CO[N+](=O)[O-])[O-],active +O=C(C(F)(F)F)NC1=CC3=C(C2=CC=CC=C2C3)C=C1,active +O=C(C)CN(N=O)CCO,active +O=C(C(C)(OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl)C)OC,active +CN(N)C=O,active +O=[N+](C1=CC(=C(C=C1)C)N)[O-],active +O=[N+](C1=CC(=C(C=C1)N)O)[O-],active +O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-],active +C1=COC2=C1C=CC=C2,active +N(N1CCCCC1C2=CC=CN=C2)=O,active +O=[N+](C1=CC2=C(C=C1)NC=N2)[O-],active +C=CCN=C=S,active +O=[N+](C1=CC=CC=C1)[O-],active +O=C(N(CC)N=O)OCC,active +O=C1C2=CC3=C(C=C2N(C=C1C(=O)O)CC)OCO3,active +O=C1C23C4C5C6(C(=O)C7=C(O)C(C)=CC(=C7C(C6=C(C2C5O)O)=O)O)C(C4O)C(=C3C(=O)C8=C1C(O)=C(C)C=C8O)O,active +O=C1C2=C(C3=C(C=C2OC)OC4C3C=CO4)OC5=C1C(=CC(=C5OC)OC)O,active +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC,active +O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl,active +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl,active +O=C1[C@H](OC(\C(C[C@@]([H])(C)[C@](C)2O)=C/C)=O)CCN(C)C/C=C1/COC2=O,active +CC1=CC(C4=CC(C)=C(/N=N/C5=CC=C(OS(=O)(C6=CC=C(C)C=C6)=O)C=C5)C=C4)=CC=C1/N=N/C2=C(O)C=CC3=CC(S(=O)([O-])=O)=CC(S(=O)([O-])=O)=C23.[Na+].[Na+],active +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N,active +O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N,active +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N,active +ClC2=C(C=CC(Cl)=C2Cl)C1=C(Cl)C(Cl)=CC=C1,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)Cl,active +C1CCCO1,active +N1(C2=CC=CC=C2)C(C(N(CS(=O)(=O)[O-])C)=C(N1C)C)=O.[Na+],active +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC,active +O=C1OC(O)C(C(Cl)Cl)=C1Cl,active +O=C1OC2=C(C=CC=C2)C=C1,active +OC1=C(C=C(C=C1)CNC(=O)CCCC/C=C/C(C)C)OC,active +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O,active +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,active +O=C2c1ccccc1C(=O)c3c2c(O)cc(O)c3O,active +C1=C(C(=CC(=C1N)C)C)C.[H]Cl,active +O=C2C(CO)NC(=O)CC(NC(=O)C(CO)NC(=O)C(NC(=O)C1C(Cl)C(Cl)CN12)CC)c3ccccc3,active +O=C(C1=CC=CN=C1)CCCN(N=O)C,active +O=C1N(CCC1)C,active +O=C1N(C=C)CCC1,active +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC,active +O=C1NC(=S)NC=C1,active +O=C1O[C@@H]3CCN2C\C=C(\COC(=O)[C@](C)(O)[C@](C)(O)[C@H]1C)[C@@H]23,active +O=C1N2CC3=CC=CC=C3C(=O)N2CC4C=CC=CC1=4,active +C(C1C=CC=CC=1)(=O)N(N=O)C,active +O=C(NC2=C1C=C(C3=NNC(CC3)=O)C=C2)C1(C)C,active +O=C(OC)C1=CCCN(C)C1.[H]Cl,active +O=C(NC1=CC=C(C=C1)OCC)CC(C)O,active +O=C(NC2=C(Cl)C=NC=C2Cl)C1=CC(OC3CCCC3)=C(OC)C=C1,active +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1,active +CC=NN(C)C=O,active +O=C(NCO)C=C,active +OC1=C(C=CC=C1)C2=CC=CC=C2,active +O=C(N(CCCCCC)N=O)N,active +O=C(N(CCCO)N=O)N,active +O=C(N(CCCC)N=O)N,active +S=P(N1CC1)(N1CC1)N1CC1,active +O=NN(CCN1N=O)CCC1,active +O=C(N)C1=C(N=CN1)/N=N/N(C)C,active +NC2=NC(C3=CC=CC=C3)=C(CCOCC)C1=NC=NN12,active +O=C(N(CCO)N=O)NCC,active +O=C1C(C2=C(C(O)=C3C)C(O)=C(NC(\C(C)=C/C=C/[C@@H]5C)=O)C(/C=N/N4CCN(C)CC4)=C2O)=C3O[C@@](C)1O/C=C/[C@H](OC)[C@@H](C)[C@@H](OC(C)=O)[C@H](C)[C@H](O)[C@H](C)[C@H]5O,active +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,active +O=C1[N-]S(=O)(=O)C2=CC=CC=C12.[Na+],active +O=C1C(=CNC(=O)N1)F,active +O=[O+1][O-1],active +O=C1C=CC(=O)C=C1,active +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-],active +O=C1C(O)=COC(CO)=C1,active +O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC,active +[Al+3].[O-]P(=O)OCC.[O-]P(=O)OCC.[O-]P(=O)OCC,active +O=[N+](C1=CC(=C(C=C1)O)N)[O-],active +ClCC1CO1,active +CCCCCNN.[H]Cl,active +O=C(CC(C)C)OCC=C,active +O=C(OCC)C=C,active +O=C/C=C/C,active +CC(=O)OCC(=O)[C@@]53/N=C(/C)O[C@@H]5C[C@H]2[C@@H]4CC\C1=C\C(=O)\C=C/[C@]1(C)[C@H]4[C@@H](O)C[C@@]23C,active +O=NN1CCCCC1,active +C1(N(C(C)=NC=1)C)[N+](=O)[O-],active +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O,active +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C.[H]Cl,active +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,active +C1(NC(CN1/N=C/C2=CC=C(O2)[N+](=O)[O-])C)=O,active +C1(CN(CC(N1N=O)C)N=O)C,active +C1(=CC(=CC(=C1N)C)C)C.[H]Cl,active +CCO,active +C1(C(=CC=C(C=1)N)O)N.[H]Cl.[H]Cl,active +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+],active +C1(C2=CC=C(C=C2)N)=CC=C(C=C1)N.[H]Cl.[H]Cl,active +CC(OC)(C)C,active +NC1=C2C(=CC=C1)C(=CC=C2)N,active +C1=CC(=CC=C1COCCl)COCCl,active +C1=CC(=CC(=C1OCC)[N+]([O-])=O)NC(=O)C,active +O=C(N(CCF)N=O)N,active +C1=CC=C(C(O)C)C=C1,active +C1=CC(=CC=C1N(N=O)C)F,active +C1=C2C=CC3=CC=CC=C3C2=CC4=CC=C5C(=C14)C=CC=C5,active +C1=C(C=CC=C1N)C.[H]Cl,active +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1,active +NC1=C(C=C(C=C1Cl)Cl)Cl,active +C1=C2C(=CC=C1)C=CC=C2,active +C1=C(CO)OC=C1,active +CC1=NC=CN1,active +O=[N+](C1=CC=C(C=C1)Cl)[O-],active +C1=CC=CC=C1C(COC(N)=O)COC(N)=O,active +CC1=C(C=CC=C1[N+](=O)[O-])[N+](=O)[O-],active +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,active +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O,active +C1(=C(C=CC(=C1)Cl)N)C.[H]Cl,active +C1(=C(C(=C(C(=C1N)F)N)F)F)F.[H]Cl.[H]Cl,active +ClC(CC(Cl)C(Cl)CCC(Cl)CC)C(Cl)C(Cl)CCl,active +C=CCOCC1CO1,active +N=C(N(CCC)N=O)N[N+](=O)[O-],active +C1C(C2=CC=CC=C2)O1,active +C1(/C=C(\C=C/C1=O)CCN)=[N+]=[N-].[H]Cl,active +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +ClC(Cl)Cl,active +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O,active +C1(=CC=C(NN)C=C1)C(O)=O.[H]Cl,active +C1(C(=CC=C(C=1)C)C)N.[H]Cl,active +C1(=NC(=NC(=N1)NC(C)=O)C2=CC=C(O2)[N+](=O)[O-])NC(C)=O,active +C1(=CC=CC=C1)CNN.[H]Cl.[H]Cl,active +C1(=CC=C(Cl)C=C1)N.[H]Cl,active +C1(/N=N/C2=CC=CC=C2)=CC=CC=C1,active +CC(Cl)CCl,active +C1(=C(C=CC=C1)C(OCCCC)=O)C(OCC2=CC=CC=C2)=O,active +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N,active +C1(=CC=C(C=C1)O)NC(C)=O,active +O=C1C2=C(C=CC=C2C(=O)C3=C1C=CC=C3)O,active +C1N(C(OC1)=O)N=O,active +ClC1=C(C=CC=C1)[N+](=O)[O-],active +O=NN1CCCCCC1,active +C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1,active +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2,active +O=NN1CCC1,active +C1CN1,active +C1CCC[C@H](N1N=O)C,active +O=C(CCC(=O)O)NN(C)C,active +O=C(OC(COC(=O)CCCCCCC)COC(=O)CCCCCCC)CCCCCCC,active +C1CCN(CN1N=O)N=O,active +O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O,active +Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl,active +CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2,active +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,active +CC(=O)N(CC)CC,active +Br(=O)(=O)[O-].[K+],active +C1(CN(N=O)CC(O1)C)C,active +CC(=O)NC1=CC=C(C=C1)OCC,active +CC(=O)N,active +CN(N=O)C1=CC=C(C=C1)C=CC2=C3C=CC=CC3=NC=C2,active +CC(=C)[C@@H]1CCC(=CC1)C,active +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3,active +Brc1c(c(Br)c(Br)c(Br)c1Br)c2c(Br)cc(Br)c(Br)c2Br,active +CC(=C)CCl,active +CC(=C)CCl,active +O=NN(C)C1=NC=NC2=C1N=CN2,active +C1=CC=CC=C1,active +C1=CC=CC(=N1)N(N=O)C,active +C12(C(=CC(=CC=1S(=O)(=O)[O-])S(=O)(=O)[O-])C=CC(=C2/N=N/C3=C4C(=C(C=C3)S(=O)(=O)[O-])C=CC=C4)O).[Na+].[Na+].[Na+],active +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+],active +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5,active +C1=CC=CC(=C1)CCN(C)N=O,active +C1=CC=C2C(=C1)N(C(\C=C/2C)(C)C)N=O,active +OC(C=C)C1=CC=C2OCOC2=C1,active +C1N(COC1)N=O,active +O=C(N(CCCC)N=O)NCCCC,active +C1=CC=C2C(=C1)NC(NC2=O)C3=CC=C(S3)[N+]([O-])=O,active +C1=CC=C2C(=C1)N=C(N=C2N3CCOCC3)C4=CC=C(S4)[N+]([O-])=O,active +C12C3=C(C=CC=C3)NC1=CC=CC=2,active +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,active +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C,active +C1C(OC(O1)C(C)I)CO,active +C1C(N(C(CN1N=O)C)C)C,active +N(N(CCCO)C)=O,active +ClC1=CC(C2=CC(Cl)=CC(Cl)=C2)=CC=C1,active +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC,active +[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2,active +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-],active +C12C(=CC(=C(C=1O)/N=N/C3=C(C=C(C=C3)C4=CC(=C(C=C4)/N=N/C5=C(C=C6C(=C5O)C(=CC(=C6)S(=O)(=O)[O-])N)S(=O)(=O)[O-])OC)OC)S(=O)(=O)[O-])C=C(C=C2N)S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],active +CCC(CC)[N+]([O-])=O,active +ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12,active +C=CCNN.HCl,active +[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+],active +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N,active +[O-][N+](C=C2)=CC=C2/N=N/C1=CC=C(N(CC)CC)C=C1,active +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O,active +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,active +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O,active +[O-][N+](C)=O,active +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,active +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,active +C1(=CC=CN=C1)CCl.[H]Cl,active +[O-][N+](=O)N(C)C,active +CNN,active +[O-]C12[C@@H](CC[N+](C)1CC=C2COC([C@](OC(C)=O)(C)[C@@H](C)\C=C3C=C)=O)OC/3=O,active +C(COCCl)OCCl,active +CC(=O)O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,active +[Se]=S,active +[S-]C(N(CC)CC)=S.[S-]C(N(CC)CC)=S.[S-]C(N(CC)CC)=S.[S-]C(N(CC)CC)=S.[Se+4],active +C1(N=CNN=1)N,active +COC1=CC(=C(C=C1)N)C,active +O=C(N(CCC1=CC=CC=C1)N=O)N,active +[O-][N+](C2=CC=C(O2)C1=CSC=N1)=O,active +[O-][N+](C2=CC=C(O2)C1=CSC(NN(C)C)=N1)=O,active +[O-]\[N+](CC)=N/CC,active +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl,active +[O-]\[N+](C)=N/CC,active +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O,active +N(CC(CO)O)(CC(O)C)N=O,active +[Cl-].[Cd+2].[Cl-],active +[Hg+2].[Cl-].[Cl-],active +O=CC1=CC=CO1,active +[H][C@]14[C@@]([C@]3([H])CC[C@@](O)(C#C)[C@](C)3CC4)([H])CCC2=CC(O)=CC=C12,active +O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+],active +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-],active +C1(C)=CSC(=N1)NNC=O,active +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br,active +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O,active +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2,active +[C@]13([C@@](C(=O)CO)(CC[C@H]1[C@@H]2CCC=4[C@@]([C@H]2[C@H](C3)O)(\C=C/C(C=4)=O)C)O)C,active +[Na+].C1(=C(C=C(C=C1)NC2=C(C=C(C=C2)[N+](=O)[O-])[N+](=O)[O-])S(=O)(=O)[O-])NC3=CC=CC=C3,active +CC(=C)C=C,active +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2],active +[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O,active +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],active +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C,active +O=C(C1=CC=CN=C1)NN,active +C1=CC(=CC=C1N(C)N=O)N=O,active +[Mn+2].[S-]C(=S)NCCNC(=S)[S-],active +[K+].[I-],active +[N+](CCCl)(CCCl)(C)[O-],active +[N+](=O)([O-])c1ccccc1C,active +Cl[C@@]1(C(C)2C)C(Cl)(Cl)C(Cl)([C@](Cl)(C2=C)C1Cl)Cl,active +O=[N+](C1=CC=C2C3=C4C(=CC=C13)C=CC=C4C=C2)[O-],active +C[As](C)(C)=O,active +C[As](=O)(C)O,active +C\C(C)=C/Cl,active +N(CC(F)(F)F)(CC)N=O,active +C[N+](=NC)[O-],active +C(O)(=O)[O-].[K+],active +C(CCl)(F)(F)F,active +O=CCCl,active +CN(C(=O)N)N=O,active +C(NN)(N)=O.Cl,active +CNNCC1=CC=C(C=C1)C(=O)NC(C)C,active +C(N)(=O)OC(C#C)(C1C=CC=CC=1)C2C=CC(=CC=2)Cl,active +C=CCC1=CC=C(C=C1)OC,active +C=CC1CCC=CC1,active +C=CC1=CC=CC=C1,active +C[Hg]Cl,active +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+],active +C=CCl,active +CC1CO1,active +C=CBr,active +ClCC(Cl)CCl,active +C=C(Cl)C=C,active +C=CC=C,active +C=CC#N,active +C=CC(C1=CC=C(C=C1)OC)O,active +C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-],active +ClC(=CCl)Cl,active +OC1=C(C=C(C=C1)N)[N+](=O)[O-],active +NC1=C(C=CC=C1)C(=O)OC/C=C/C2=CC=CC=C2,active +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+],active +C1(=C(C=CC=C1)N)OC.[H]Cl,active +BrCCBr,active +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O,active +BrC(Br)Br,active +CC(=O)OC=C,active +BrC2=C(C=C(Br)C(Br)=C2)C1=C(Br)C=C(Br)C(Br)=C1,active +C1(=C(C(OCCCCCCC(C)C)=O)C=CC=C1)C(OCCCCCCC(C)C)=O,active +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,active +O=C1NC(=O)NC=C1,active +O=C(O[C@@H]1CCN2[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C,active +C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl,active +C1(C(=CC=C(C=1)C)N)C.[H]Cl,active +C(CCC)(CCC)C(=O)[O-].C(CCC)(CCC)C(=O)[O-].[Ca+2],active +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl,active +O=S(C1=C(/N=N/C2=CC=C(C3=CC=C(\N=N/C4=C(S(=O)([O-])=O)C=C5C(C(N)=CC(S(=O)([O-])=O)=C5)=C4O)C=C3)C=C2)C(O)=C(C(N)=CC(S(=O)([O-])=O)=C6)C6=C1)([O-])=O.[Na+].[Na+].[Na+].[Na+],active +C1(NS(=O)(=O)[O-])CCCCC1.[Na+],active +C(C(COCCl)OCCl)OCCl,active +C([O-])(C)=O.[Pb+2].[O-]C(C)=O,active +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl,active +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,active +C(C1)N1C(=CC(=O)C=2N(C3)C3)C(=O)C=2N(C4)C4,active +CC(OC1=CC=C(C=C1)Cl)(C(=O)OCC)C,active +CC/C(=C/CC)[N+](=O)[O-],active +O=C(N(C)C)NC1=CC=C(C=C1)Cl,active +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N,active +Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl,active +OC1=C(C([O-])=O)C=C(N=NC2=CC=C(C3=CC=C(N=NC4=C([O-])C(/N=N/C(C=C(S([O-])(=O)=O)C=C5)=C5[O-])=CC=C4O)C=C3)C=C2)C=C1.[Na+].[Na+].[Cu+2],active +CC(NC1=CC=C(C2=CC=C(F)C=C2)C=C1)=O,active +CC(O)CN(C)N=O,active +N(CC(C)O)(CC=C)N=O,active +CC1=C(C=C(C=C1)C)OCCCC(C(=O)O)(C)C,active +CC1=C(C=CC(=C1)C)C,active +CC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)C)N,active +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)C)C)C)C,active +CC1(CC(=CC(=O)C1)C)C,active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],active +CC(C)N(C(=O)SCC(\Cl)=C\Cl)C(C)C,active +N#CN(CC)N=O,active +CC(C)OC1=CC=CC=C1OC(=O)N(C)N=O,active +CC(C/C=N/N(C=O)C)C,active +O=S(C1=NC2=C(C=CC(=C2)OC)N1)CC3=C(C(=C(C=N3)C)OC)C,active +CC(C)=C,active +CC(C)C(O)(C(C)O)C(=O)OC\C1=C\CN2CC[C@@H](OC(=O)C(\C)=C\C)[C@@H]12,active +CC(C)CC(=O)O[C@H]1C[C@]2(COC(C)=O)[C@@]4(C)[C@H](OC(C)=O)[C@@H](O)[C@@H](O[C@@H]2/C=C1/C)[C@]34CO3,active +CC(CCl)OC(C)CCl,active +CC(Cl)(Cl)F,active +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,active +CC(CON=O)C,active +CC(C=O)Cl,active +CC(C1=C(C(=C(C(=C1[N+](=O)[O-])C)[N+](=O)[O-])C)[N+](=O)[O-])(C)C,active +CC(CC)[N+]([O-])=O,active +CC1SC(SC(N1N=O)C)C,active +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2,active +Cl.CCCCNN,active +N(CC=C)(CCO)N=O,active +N(NCCCC)CCCC.Cl.Cl,active +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl,active +CC1CC(=O)O1,active +CC1CC(OC(O1)C)OC(=O)C,active +CCCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)CCC(Cl)C,active +CCCC/C=N/N(C=O)C,active +CCCC1=CC2=C(C=C1)OCO2,active +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,active +CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC,active +S=C(N(CCO)CCO)[S-].[K+],active +CCC1=CC=CC=C1,active +CCC1CO1,active +CC1=C(C=CC=C1)S(=O)(=O)N,active +C1(=C(C(=C(C=C1)C(C)=O)O)CCC)OCCCCC2NN=NN=2,active +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O,active +FC(F)(F)CNC(=N)Nc1ccn(CCCCC(N)=O)n1,active +ClC(Br)Br,active +C1=C(C=CC=C1OCC2CO2)OCC3CO3,active +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C,active +CC1=C(C=CC=C1)N=O,active +CC1=CC(=O)NC(=S)N1,active +CC1=CC(C)=C(/N=N/C2=C(C(S([O-])(=O)=O)=CC3=C2C=CC(S([O-])(=O)=O)=C3)O)C=C1C.[Na+].[Na+],active +O=C1CCO1,active +CC1=CC=CC(C)=C1,active +CC1=C2C(=CO[C@H]([C@@H]2C)C)C(=C(C1=O)C(=O)O)O,active +CC1=C2C=CC=CC2=C(C3=CC=C4C(=C13)C=CC=C4)C,active +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,active +CC1=C2C3=C(C=C4C(=C3CC2)C=CC5=CC=CC=C45)C=C1,active +[N+].C1(N(N=O)[O-])=CC=CC=C1,active +CN(CCO)N=O,active +CC(C)(C)NC(=O)[C@H]4CC[C@@H]3[C@]4(C)CC[C@H]1[C@H]3CC[C@H]2NC(=O)\C=C/[C@]12C,active +C1=CC=C2C(=C1)N=C(N=C2N(CCO)CCO)C3=CC=C(S3)[N+]([O-])=O,active +CC(=O)OCC1=CC=CC=C1,active +CC1=CC=CC(C)=C1,inactive +C([O-])(=O)CN(CC(=O)O)CCN(CC([O-])=O)CC([O-])=O.[Na+].[Na+].[Na+].[H]O[H].[H]O[H].[H]O[H],inactive +C1(=C(C=CC(=C1)N(CCO)CCO)NCCO)[N+]([O-])=O,inactive +C([N+](C)(C)C)CCl.[Cl-],inactive +FC(C(OC(F)F)Cl)(F)F,inactive +C([O-])(C)=O.[O-]C(C)=O.[Ni+2],inactive +C(C(=O)[O-])(O[Ti](OC(C(=O)[O-])=O)=O)=O.[K+].[K+],inactive +O=[As](O)(O)[O-].[Na+],inactive +C(C(F)(Cl)Cl)(F)(F)Cl,inactive +CCCOC(=O)[CH]1[CH](C)CC2=C(C=C3OCOC3=C2)[CH]1C(=O)OCCC,inactive +CC(CO)O,inactive +C([S-])#N.[Na+],inactive +ClC1=CC(=CC=C1OCC(=O)OC(C)C)Cl,inactive +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl,inactive +C=C(F)F,inactive +FC(C(F)Cl)(OC(F)F)F,inactive +C1N2CN3CN(C2)CN1C3,inactive +O=NN1CCC[C@H]1[C@@](O)=O,inactive +C1(=CC(=C(C(=C1)N)C)N).[H]Cl.[H]Cl,inactive +O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO,inactive +N1=C(SNC2CCCCC2)SC3=C1C=CC=C3,inactive +CC(=O)O[C@@H]3CC(=O)O[C@H](C)C\C=C\C=C\[C@H](O)[C@H](C)C[C@H](CC=O)[C@H](O[C@@H]2O[C@H](C)[C@@H](O[C@H]1C[C@@](C)(O)[C@H](OC(=O)CC(C)C)[C@H](C)O1)[C@H](N(C)C)[C@H]2O)C3OC,inactive +IC(I)I,inactive +C(C(C)O)(O[Ca]OC(C(C)O)=O)=O,inactive +C1CCNCC1,inactive +O=NN(/C(=N\C#N)NCCSCC1=C(N=CN1)C)C,inactive +ClC1=CC2=C(C=C1)OC3=C(C=CC(=C3)Cl)O2,inactive +O=CCBr,inactive +O=C(C1=CC=CC=C1)OOC(=O)C2=CC=CC=C2,inactive +OC1=C(C=C(C=C1)CC=C)OC,inactive +O=C3[C@@]2(C)CC[C@]1([H])[C@](CC[C@H](OS(=O)(O)=O)C4)(C)C4=CC[C@]([H])1[C@@]([H])2CC3,inactive +O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC,inactive +OC(=O)[C@]3(C)C[C@H]4/C5=C/C(=O)[C@H]2[C@@](C)(CC[C@@H]1[C@]2(C)CC[C@H](O)C1(C)C)[C@]5(C)CC[C@@]4(C)CC3,inactive +C(=O)(/C=C/C)OC1=C(C(CCCCCC)C)C=C(C=C1[N+]([O-])=O)[N+]([O-])=O,inactive +FC(Cl)(Cl)Cl,inactive +ClC(C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)(Cl)Cl,inactive +N1=CC=CC2=CC=CC(=C12)O[Cu]OC3=CC=CC4=CC=CN=C34,inactive +O=NN(C)C2=NC1=CC=C(Cl)C=C1C(C3=CC=CC=C3)=[N+]([O-])C2,inactive +CC1=C2C(=CC=C1)C=CC=C2,inactive +O[C@@]12[C@]3([H])C(O[C@@](C[C@]5(CC[C@H](C)[C@]([C@@H](C)CC)([H])O5)O4)([H])C[C@@]4([H])C/C=C(C)/[C@@H](O[C@]6([H])O[C@@H](C)[C@H](O[C@@]7([H])C[C@H](OC)[C@@H](O)[C@H](C)O7)[C@@H](OC)C6)[C@@H](C)/C=C/C=C1\CO[C@@]([H])2[C@H](O)C(C)=C3)=O,inactive +OC1=C(C=CC(=C1)O)CCCCCC,inactive +C(=O)([O-])/C1=C/C(=O)NC(N1)=O.[Na+],inactive +O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].Cl[O-].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+],inactive +C1=C(Cl)C=C3C(=C1)N(CCO)C(=O)C(O)N=C3C2=CC=CC=C2F,inactive +[Na+].CN(C)c1ccc(/N=N/S([O-])(=O)=O)cc1,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC,inactive +O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)([O-])=O.[Na+],inactive +CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O,inactive +C(C1=CC=C(O)C=C1)(C)(C)C,inactive +[O-]P(=O)=O.[Na+],inactive +O=C(NN)OC,inactive +O=S(=O)(C1=CC=C(C=C1)Cl)OC2=CC=C(C=C2)Cl,inactive +O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC,inactive +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2,inactive +Cl/C2=C(\Cl)C3(Cl)C1C(Cl)OC(Cl)C1C2(Cl)C3(Cl)Cl,inactive +O=S1(=O)CC=CC1,inactive +CC1CC(OC(O1)C)OC(=O)C,inactive +OCC1=CC=CC=C1,inactive +ClC1=C(C=C(C=C1)Cl)OC(C(=O)O)C,inactive +O=S1OCCO1,inactive +CC(=O)O[C@H]1[C@@H]([C@H](O[C@H]([C@@H]1OC(=O)C)COC(=O)C)S[Au]=P(CC)(CC)CC)OC(=O)C,inactive +O=S(C1=CC=C2C(C=CC(O)=C2\N=N/C3=CC=C(S(=O)([O-])=O)C=C3)=C1)([O-])=O.[Na+].[Na+],inactive +F[B-](F)(F)F.[Na+],inactive +O=S(O)(O)=O.O[C@@H]([C@H](C)NC)[C@@]1=CC=CC=C1.O[C@@H]([C@H](C)NC)[C@@]2=CC=CC=C2,inactive +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C,inactive +[Sn+2].[Cl-].[Cl-],inactive +O=C(C(=C)C)OC,inactive +Br/C(Br)=C/[C@H]3[C@@H](C(=O)O[C@H](C#N)c2cccc(Oc1ccccc1)c2)C3(C)C,inactive +C=CC1=CC=C(C=C1)C,inactive +O=CCCCC=O,inactive +.[Cl-].[Ca+2].[Cl-],inactive +C=CC(OCC)OCC,inactive +BrC(C(=O)NC(=O)N)(CC)CC,inactive +[Ti+2](C1=CC=CC1)C2(=CC=CC2).[Cl-].[Cl-],inactive +CC1=CC=CC2=CC=CN=C12,inactive +O=[N],inactive +Cl\C2=C(/Cl)C3(Cl)C1COS(=O)OCC1C2(Cl)C3(Cl)Cl,inactive +O=S(=O)([O-])[O-].O.O.O.O.O.O.[Ni+2],inactive +ClC([N+](=O)[O-])(Cl)Cl,inactive +[O-]S([O-])(=O)=O.S(=O)(=O)([O-])[O-].[Zr+4],inactive +O=S(=O)(C1=CC(=C(C=C1Cl)Cl)Cl)C2=CC=C(C=C2)Cl,inactive +O=S(=O)(C1=C(C=CC=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+],inactive +[S-]C1=NC(C=CC=C2)=C2S1.[S-]C3=NC(C=CC=C4)=C4S3.[Zn+2],inactive +O=S([N-]C1=O)(OC(C)=C1)=O.[K+],inactive +O=S(=O)([O-])[O-].O.[Mn+2],inactive +O=S(=O)([O-])[O-].[V+2]=O,inactive +[O]N=O,inactive +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,inactive +C[N+](CCC(C1=CC=C(C=C1)Cl)C2=NC=CC=C2)C.C(\C(=C(/C(=O)[O-])[H])[H])(=O)O,inactive +C[N+](CCCCCCCCCCCC)(C)[O-],inactive +C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O,inactive +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC=C(C=C3)O,inactive +OC1=CC=CC=C1,inactive +C\1=C/C(O[C@@H](C/C=C/C=C/C=C/C=C/[C@@H](C[C@@H]3O[C@](C[C@H](C[C@H]2O[C@H]/12)O)(C[C@@H]([C@H]3C(O)=O)O)O)O[C@@H]4O[C@@H]([C@H]([C@@H]([C@@H]4O)N)O)C)C)=O,inactive +Oc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@H](O)CC[C@@H]12)c4cc3,inactive +O=C(C1=CCCN(N=O)C1)OC,inactive +CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1,inactive +C/C=C/C1=CC2=C(C=C1)OCO2,inactive +O=C1C=CC(=O)NN1,inactive +O=C1OC(=O)CC1,inactive +C[C@@H]3O[C@]1(CS3)C2CCN(CC2)C1.C[C@@H]6O[C@]4(CS6)C5CCN(CC5)C4.O.Cl.Cl,inactive +OCCOCCOC1=CC=C(CCCCCCCCC)C=C1,inactive +Cl[Mg]Cl.O.O.O.O.O.O,inactive +O=C1C2=C(N=CN2C)N(C(=O)N1C)C,inactive +Oc1ccc(cc1OC)/C=C/C(=O)OCCc2ccccc2,inactive +O=C1C2=C(C=CC=C2)C(=O)C(=C1Cl)Cl,inactive +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl,inactive +C[C@H](C\C=C\C)[C@@H](O)[C@@H]1N(C)C(=O)[C@H](C(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](NC(=O)[C@H](CC(C)C)N(C)C(=O)CN(C)C(=O)[C@H](CC)NC1=O)C(C)C,inactive +FC(F)(Cl)Cl,inactive +O=C1C2=C(C=CC=C2)C(=O)O1,inactive +CC(=O)N[C@@H](CS)C(=O)O,inactive +O=C(C(=NOC(=O)NC)SC)N(C)C,inactive +C=C(Cl)C=C,inactive +O1C(=CC=C1[N+](=O)[O-])/C(=N/O)N,inactive +O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.Cl,inactive +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +O=C(OC1=CC=CC=C1)OC2=CC=CC=C2,inactive +O1C2=C(C=CC=C2)OC3=CC=CC=C13,inactive +CC2=C(C(C)=CC=C2)NC1=NCCCS1.Cl,inactive +O=C(OCC)CBr,inactive +O=C([O-])C(C(/C(CC([O-])=O)=C([C@@H](CCC([O-])=O)[C@@H]5C)\N=C5/C=C4\[N-]\C(C(C=C)=C4C)=C3)=N2)=C(C)/C2=C/C1=C(CC)C(C)=C/3[N-]1.[Na+].[Na+].[Na+].[Cu+2],inactive +ClC1=C(C=C(C(=C1)Cl)Cl)OCC(=O)O,inactive +N(CC(=O)[O-])CC(=O)O.[Na+],inactive +ClC1=C(C=C(C(=C1)Cl)Cl)OC(C(=O)O)C,inactive +N#CSCC1=CC=CC=C1,inactive +O=C1C(NC(=O)N1)NC(=O)N,inactive +O=C1C(=C(C(=O)C(=C1Cl)Cl)Cl)Cl,inactive +C=C/C=N/O,inactive +CN(CCO)C,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)OCCCC,inactive +OC(=O)CC1=C2C(=CC=C1)C=CC=C2,inactive +S=C(N(C)C)SSC(=S)N(C)C,inactive +O=C2C=1/N=C\NC=1N(C)C(=O)N2C,inactive +N1(CSCSC1)N=O,inactive +O=C4[C@@]3(C)CC[C@]2([H])C1=CC=C(OS(=O)([O-])=O)C=C1CC=C2[C@@]([H])3CC4.[Na+],inactive +N(=NC1=CC=C(C=C1)N(CCC)CCC)C2=CC=[N+](C=C2)[O-],inactive +O=C2C1=C(N=CN2)N([C@@H]3O[C@H](COP([O-])([O-])=O)[C@@H](O)[C@H]3O)C=N1.[Na+].[Na+],inactive +C(CCCCCOCCl)OCCl,inactive +CC(=O)NNC(=O)C,inactive +NC1=C(C=CC=C1)C(=O)O,inactive +O=C2[C@@H](O)[C@]1(CO)[C@]([C@@H]4O)(C)[C@]3(OC3)[C@]([C@@H]4O)([H])O[C@@]([H])1C=C2C,inactive +C(CCC(=O)O)([O-])=O.[Na+],inactive +S=C(NC)NC,inactive +CC(=O)O[Sn](OC(=O)C)(CCCC)CCCC,inactive +CC1=C(SSC1=S)C2=CN=CC=N2,inactive +O=CC=C(CCC=C(C)C)C,inactive +C(C1=CC=CC=C1)(C2=CC=CC=C2)OCCN(C)C.[H]Cl,inactive +O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+],inactive +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,inactive +CC1=C(Cl)C(=O)OC2=C1C=CC(=C2)OP(=S)(OCC)OCC,inactive +C(CC([O-])=O)(CC(O)=O)(C([O-])=O)O.[N+].[N+],inactive +C12(C(=C(/N=N/C3=C(C4=C(C(=C3)S(=O)(=O)[O-])C=CC=C4)O)C=CC=1S(=O)(=O)[O-])C=CC=C2).[Na+].[Na+],inactive +S=C(N(C)C)SSC(=S)N(C)C,inactive +CC(C)NCC(O)COC1(=CC=C(C=C1)CC(=O)N).[H]Cl,inactive +Clc1c([N+]([O-])=O)c(Cl)c(Cl)c(OC)c1Cl,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CC(=O)O)C)C)C,inactive +C(CCOCCl)COCCl,inactive +S=C([S-])N(CCCC)CCCC.[S-]C(N(CCCC)CCCC)=S.[Zn+2],inactive +C(NC)CC(OC1=CC=C(C=C1)C(F)(F)F)C2=CC=CC=C2.[H]Cl,inactive +C(S)(=S)N(C)C.N(C)C,inactive +O=C1c2c(O)cc(C)cc2C(=O)c3cc(O)cc(O)c13,inactive +N(C1=CC=C(C=C1)NC2=CC=CC=C2)C3=CC=CC=C3,inactive +O=C1CCCO1,inactive +O=C1CCCCCN1,inactive +O=C1CCCCC1,inactive +C[C@]12[C@@]3(C(OC4[C@@]1(C(C(=O)C(=C4)C)O)CO)[C@@H]([C@@H]2OC(=O)C)O)CO3,inactive +[O-]C1=C(I)C=C(C(C2=C(C([O-])=O)C=CC=C2)=C3C=C(C(C(I)=C3O4)=O)I)C4=C1I.[Na+].[Na+],inactive +OC(CNC(C)C)COC1=CC=CC=C1OCC=C.Cl,inactive +C1(=CC=C2C(=C1)S([N-]C2=O)(=O)=O).C3(=CC=C4C(=C3)S([N-]C4=O)(=O)=O).[Ca+2],inactive +OC(C(Cl)(Cl)Cl)P(=O)(OC)OC,inactive +C(S(=O)(=O)[O-])CS.[Na+],inactive +ClC1(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,inactive +O=C1N(C2=CC=CC=C2)N(C(=C1N(C)C)C)C,inactive +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,inactive +Cl.Cl.[O-][N+](=O)c1cccc(c1)C/2C(\C(=O)OC)=C(\C)NC(\C)=C\2C(=O)OCCN3CCN(CC3)C(c4ccccc4)c5ccccc5,inactive +C(N)(N)=O,inactive +[K+].[K+].[O-]C(=O)C2O[Sb]3OC(C(O[Sb]1OC(=O)C2O1)C([O-])=O)C(=O)O3.O.O.O,inactive +OCC(O)CO,inactive +CC1=CC(NC2=C1C=C(C=C2)OCC)(C)C,inactive +CC(C1=CC(=C(C=C1O)C)SC2=CC(=C(C=C2C)O)C(C)(C)C)(C)C,inactive +CCN(CC)C(=O)C1=CC=CC(C)=C1,inactive +OCC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4,inactive +O=C2C1=C(CCC2)C(OC[C@@H](O)CNC(C)(C)C)=CC=C1.Cl,inactive +OC1=CC=CC2=CC=CN=C12,inactive +S=C(N(C)C)S[Bi](SC(=S)N(C)C)SC(=S)N(C)C,inactive +CCN(CC)C=O,inactive +N1C2=C(C=CC=C2)N=N1,inactive +OCCOCCOCCO,inactive +OC1=CC(=CC=C1)O,inactive +C1=CC=C(C(C(=O)OC)C2N(N=O)CCCC2)C=C1,inactive +O=CNNC1=NC(C2=CC=CO2)=CS1,inactive +COC1=C(C(=CC2=C1C3=CC=C(OC)C(=O)C=C3[C@@H](NC)CC2)OC)OC,inactive +Cl.CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(cccc1O)[C@@](C)(O)[C@H]4C[C@@H]23,inactive +CC(=O)O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3,inactive +OCCN.O=C(C1=C(C=CC(=C1)Cl)O)NC2=CC=C(C=C2Cl)[N+](=O)[O-],inactive +O=C(C4=CC(OC)=C(C(OC)=C4)OC)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=CC=C6)=C6N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,inactive +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O,inactive +[H][N+]([H])([H])[H].[Cl-],inactive +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O.O=S(O)(O)=O,inactive +COc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C)c4cc3,inactive +N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O,inactive +[Na+].[N-]=[N+]=[N-],inactive +[Na+].[Na+].OC(=O)[C@]5(C)C[C@H]6/C7=C/C(=O)[C@H]4[C@@](C)(CC[C@@H]3[C@]4(C)CC[C@H](OC2O[C@H](C([O-])=O)[C@@H](O)[C@H](O)[C@H]2O[C@H]1O[C@@H]([C@@H](O)[C@H](O)[C@H]1O)C([O-])=O)C3(C)C)[C@]7(C)CC[C@@]6(C)CC5,inactive +C12=C(C(NC(=N1)N)=O)N(C)C=N2,inactive +OC1=CC=C(C=C1)C2=CC=CC=C2,inactive +O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+],inactive +CC(=O)OC(C1=CC=C(O1)[N+](=O)[O-])OC(=O)C,inactive +OCC(O)CO,inactive +[Na+].[O-]C(=O)[C@@H](N)CC(O)=O,inactive +COc3ccccc3N2CCN(CCCN\C1=C\C(=O)N(C)C(=O)N1C)CC2,inactive +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,inactive +OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)/C=C\[C@]1(C)[C@H]4C(=O)C[C@@]23C,inactive +OCC(=O)[C@@]2(O)CC[C@H]3[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4[C@@H](O)C[C@]23C,inactive +CCN(CC)CCOC1=CC=C(C=C1)[C](O)(CC2=CC=C(OC)C=C2)C3=CC=CC=C3,inactive +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3,inactive +Oc1ccc(C[C@](C)(N)C(O)=O)cc1O.OC(=O)[C@@](C)(N)Cc1cc(O)c(O)cc1.O.O.O,inactive +C12C(C3C(CC1C3)NC(N(C)C)=O)CCC2,inactive +CC(=O)O[Hg]C1=CC=CC=C1,inactive +CC(C)(O)[C@H](O)CC[C@@H](C)[C@H]1CC[C@H]2C(\CCC[C@]12C)=C\C=C3\C[C@@H](O)CCC3=C,inactive +CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O,inactive +S=C=NCC1=CC=CC=C1,inactive +S=C=NC1=CC=CC=C1,inactive +S=P(SCC(=O)NC)(OC)OC,inactive +S=C1NC=NC2=C1N=CN2,inactive +S=C=NCCCCCCC1=CC=CC=C1,inactive +S=C(NC1CCCCC1)NC1CCCCC1,inactive +O[C@@H](CO)[C@@H](O1)C(OCC)=C(O)C1=O,inactive +S=C([S-])N(CC)CC.[S-]C(N(CC)CC)=S.[Zn+2],inactive +S=C(S[Te](SC(=S)N(CC)CC)(SC(=S)N(CC)CC)SC(=S)N(CC)CC)N(CC)CC,inactive +S=C(S[Pb]SC(N(C)C)=S)N(C)C,inactive +[O-]C([C@H]([C@H](O)CO)O1)=C(O)C1=O.[Na+],inactive +NNC1=CC=CC=C1,inactive +S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC,inactive +Se(=O)=O,inactive +S1C=CC(=C1)CN(C2=NC=CC=C2)CCN(C)C,inactive +.[Cl-].[Fe+3].[Cl-].[Cl-],inactive +S=P(OC1=CC(=C(C=C1)SC)C)(OC)OC,inactive +O[C@@H]2C/C(C(CC2)=C)=C/C=C3/[C@@]1([H])[C@@](CCC3)(C)[C@]([C@H](C)/C=C/[C@H](C)C(C)C)([H])CC1,inactive +O=P(OC(=C(C(=O)N(CC)CC)Cl)C)(OC)OC,inactive +.[K+].[Cl-],inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OCC)OCC,inactive +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OC)OC,inactive +[Na+].[F-],inactive +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Cu+2],inactive +CBr,inactive +O=[N+](C1=CC(=C(C=C1)C(=O)O)N)[O-],inactive +O=C1N(C2=CC=C(C=C2C(=NC1)C3=CC=CC=C3)Cl)CC4CC4,inactive +[Fe+3].O=C([O-])CC(O)(CC(=O)[O-])C([O-])=O.O.O.O.O,inactive +P,inactive +OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1,inactive +S(NNC(N)=S)(=O)(=O)C1=CC=CC=C1,inactive +[O-][N+](=O)CCCC,inactive +[Cl-].OC[P+](CO)(CO)CO,inactive +S=C(N(CC)CC)SSC(=S)N(CC)CC,inactive +CCCCCl,inactive +CCCCCCCN,inactive +S=C(N1CCCCC1)SSSSSSC(=S)N1CCCCC1,inactive +CCC1(C2=C(C3=C(C(=CC=C3)CC)N2)CCO1)CC(=O)O,inactive +C12=CC(=CC(=C1C3=C(C(O2)=O)CCC3=O)OC)OC,inactive +[Cd+2].[O-]C(C)=O.[O-]C(C)=O,inactive +[Cl-].[Ba+2].[Cl-].O.O,inactive +O=NN1CN(C2)CN(N=O)CN2C1,inactive +O=C2NC(/N)=N\CN2[C@@H]1O[C@H](CO)[C@@H](O)[C@H]1O,inactive +S=C(N(C)C)SC(=S)N(C)C,inactive +OC(=O)CCCC\C=C(\c1cccnc1)c2ccccc2,inactive +OC(=O)CCC(=O)OCC2(CCCC)C(=O)N(c1ccccc1)N(C2=O)c3ccccc3,inactive +N=C\2/N=C3/O[C@H]1[C@H](O)[C@@H](CO)O[C@H]1N3/C=C/2,inactive +Cl.O=P1(OCC(C)(C)CO1)C\4=C(/C)NC(/C)=C(/C(=O)OCCN(Cc2ccccc2)c3ccccc3)C/4c5cccc(c5)[N+]([O-])=O.CCO,inactive +C12C(=C(C=CC=1NC(C)=O)S(=O)(=O)[O-])C=C(C(=C2O)/N=N/C3=C4C(=C(C=C3)/N=N\C5=CC=C(C=C5)S(=O)(=O)[O-])C=CC(=C4)S(=O)(=O)[O-])S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+],inactive +OC(=O)CC[C@@H](C)[C@H]4CC[C@@H]3[C@]4(C)CC[C@H]2[C@H]3[C@H](O)C[C@@H]1C[C@H](O)CC[C@@]12C,inactive +O=C(O)COC1=C(C)C=C(Cl)C=C1,inactive +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,inactive +CC2(C)OC1(C)CCC2CC1,inactive +O=C1C(C(=O)OC(=C1)C)C(=O)C,inactive +OC(=O)CC[N+](=O)[O-],inactive +O=C(OCC2=CC=CC(C3=CC=CC=C3)=C2C)C1C(C)(C)C1/C=C(Cl)/C(F)(F)F,inactive +C1=CC=C2C(=C1)C=C(C=C2)C(CNC(C)C)O,inactive +Cl,inactive +C(/C1=C(C=C(C=C1)O)S(=O)(=O)[O-])(C2=CC=C(C=C2)N(CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)=C4/C=C/C(C=C4)=[N+](\CC5=CC(=CC=C5)S(=O)(=O)[O-])CC.[Na+].[Na+],inactive +[O-][N+](C)(C)CCCCCCCCCC,inactive +O=C1NCCN1,inactive +OC(C(C=CC=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=C(C)S3)=O,inactive +Cl.O=C(c2cn(C)c1ccccc12)[C@H]3CC=4N\C=N/C=4CC3,inactive +OC(C)CCl,inactive +OC(C)C,inactive +OC(C(SC(Cl)=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=CC=C3)=O,inactive +N12([C@@H]([C@@H](C1=O)NC(COC3=CC=CC=C3)=O)SC([C@@H]2C(=O)[O-])(C)C).[K+],inactive +ClC(C(C1=CC=C(C=C1)CC)C2=CC=C(C=C2)CC)Cl,inactive +CC(C=NOC(=O)NC)(SC)C,inactive +OC(=O)\C=C/C(O)=O.C(C(C1CCCCC1)C2CCCCC2)C3CCCCN3,inactive +OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +Cl[O-].[Na+],inactive +O1C(=O)/C2=C(\C3=C1C=C(C=C3OC)OC)CCC2,inactive +O=C(NC1=CC=CC(=C1)Cl)OC(C)C,inactive +OB(O)O,inactive +O1C2C1CCC(C2)C1CO1,inactive +S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC,inactive +CS(=O)(=O)OCCCNCCCOS(C)(=O)=O.[H]Cl,inactive +OC(=O)C1=CC(=C(C(=C1)O)O)O,inactive +CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C,inactive +Cl[C@@H]1[C@H](OCCO1)Cl,inactive +OC(=O)C1=CC=CC=C1,inactive +OC(=O)C=C,inactive +NC(=O)CC1=C2C(=CC=C1)C=CC=C2,inactive +[O-][N+](OCC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O)=O,inactive +OC(=O)C1=C(C=CC=C1)OC(=O)C,inactive +[Be+2].O=S(=O)([O-])[O-],inactive +O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1,inactive +O=C(CN1C(=O)CCC1)NC2=C(C=CC=C2C)C,inactive +OC1=C(C=C(C=C1C(C)(C)C)CO)C(C)(C)C,inactive +OC1=CC(=CC=C1O)CCN.[H]Cl,inactive +C1(CSCCNC(NC)=NC#N)=C(C)NC=N1,inactive +O=[N+](C1=CC2=CC=CN=C2C=C1)[O-],inactive +C([N+](C)(C)C)CO.[Cl-],inactive +[O-][N+](/C=C/C1=CC=CC=C1)=O,inactive +OC[C@@H](NC(C(Cl)Cl)=O)[C@H](O)C1=CC=C(S(=O)(C)=O)C=C1,inactive +Cl.CC(C)(C)NCC(O)COc1cccc(C)c1C,inactive +[Ni],inactive +OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C,inactive +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2,inactive +OCC1=C(C(=C(C(=C1)/N=N/C2=C3C=CC=CC3=C(C=C2)S(=O)(=O)[O-])O)/N=N/C4=C5C=CC=CC5=C(C=C4)S(=O)(=O)[O-])O.[Na+].[Na+],inactive +OC1=CC(O)=C(C[C@H]([C@@H]([C@]3=CC(O)=C(O)C(O)=C3)O2)OC(C4=CC(O)=C(O)C(O)=C4)=O)C2=C1,inactive +CN(C)[C@@H]2/C=C\CC[C@@]2(c1ccccc1)C(=O)OCC.OC(=O)\C=C\C(O)=O,inactive +[Na+].[O-]Cl=O,inactive +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,inactive +OC1=C(C=CC(=C1)CC(C(=O)O)N)O,inactive +NC1(=CC=C(C=C1)NC2=CC=CC=C2).[H]Cl,inactive +CCOP(=O)(C[CH]1CO1)OCC,inactive +[Na+].C1(=CC=C2C(=C1S([O-])(=O)=O)C=CC=C2)/N=N/C3=C(C=CC4=C3C=CC=C4)O,inactive +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,inactive +Cl.CCOC(=O)[C@H](CCc1ccccc1)N[C@@H](C)C(=O)N2Cc3ccccc3C[C@H]2C(O)=O,inactive +OC(COC1=CC=CC2=C1C=CC=C2)CNC(C)C.[H]Cl,inactive +OC(=O)[C@@H]3[C@]51C[C@@](O)(CC[C@H]1[C@@]24\C=C/[C@H](O)[C@@](C)(C(=O)O2)[C@@H]34)C(=C)C5,inactive +OC[P+](CO)(CO)CO.[O-]S([O-])(=O)=O.OC[P+](CO)(CO)CO,inactive +OC[C@@H](O)[C@@H](O)[C@H](O)[C@H](O)CO[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1O,inactive +OC(CNC(C)C)C1=CC=C(NS(=O)(C)=O)C=C1.[H]Cl,inactive +OC(CN(C1=CC=C(N=N1)NN)C)C.Cl.Cl,inactive +OC(CC(C1)C)C(C1)C(C)C,inactive +CC3=CC=C(C=C3)\C(C2=CC=CC=N2)=C/CN1CCCC1.O.Cl,inactive +OC(CO)CCl,inactive +CC2=CC1=CC=CC=C1C=C2,inactive +OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl,inactive +OC1=C(C(=O)NC2=NC=CC=C2)N(S(=O)(=O)C3=C1C=CC=C3)C,inactive +OC(=O)C1=CC=NC=C1,inactive +OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO,inactive +OC1=C(C=C(C=C1C(C)(C)C)C)CC2=CC(=CC(=C2O)C(C)(C)C)C,inactive +O=C(N1)N(C2OCCC2)C=C(F)C1=O,inactive +OC1(=C(O)C(=O)O[C@H]1[C@@H](C[O-])O).[Na+],inactive +Cl.CC(C)(C)NCC(O)CO/C1=C/N(C)C(=O)c2ccccc12,inactive +Cl.CC3CCCC(C)N3CCCC(O)(c1ccccc1)c2ccccn2,inactive +NCCS(O)(=O)=O,inactive +[Cd+2].[Cl-].[Cl-].[H]O[H],inactive +N1=C(SSC2=NC3=C(C=CC=C3)S2)SC4=C1C=CC=C4,inactive +CC(Cl)(Cl)Cl,inactive +O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2,inactive +C1=CC(=CC=N1)N(N=O)C,inactive +CCCCCC(/C=C/C=C\CCCCCCCC(=O)OC)OO,inactive +NC1=CC=C(C=C1)N,inactive +NC1=CC=C(C=C1)Cl,inactive +ClC(=C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC,inactive +CN(C=O)C,inactive +OC1=CC=C(C=C1)OCC2=CC=CC=C2,inactive +OC1=CC(C2=NC(N(C(C)C)C3=C2C=CC(C)=C3)=O)=CC=C1,inactive +CC(CNCC(C)O)O,inactive +NC1=NC(=NC(=N1)N)C2=CC=CC=C2,inactive +CC(OC(=O)OC1CCCCC1)OC(=O)c5cccc6nc(OCC)n(Cc2ccc(cc2)c3ccccc3C\4=N\N=N/N/4)c56,inactive +ClCC/C(C2=CC=CC=C2)=C(C3=CC=CC=C3)/C1=CC=C(C=C1)OCCN(C)C.OC(C(O)=O)(CC(O)=O)CC(O)=O,inactive +C1=C2C(=CC=C1NC3=CC=C(C=C3)NC4=CC=C5C(=C4)C=CC=C5)C=CC=C2,inactive +O[C@H]([C@@H]2O)[C@@H](O[C@@H]2CO)N1C(N=CN=C3NC)=C3N=C1,inactive +C1=CC(=CC=C1NNC(CC[C@@H](C(O)=O)N)=O)CO,inactive +OC(=O)CCCCCN,inactive +CC(CN(CC(C)O)CC(C)O)O,inactive +NC(=S)NC1=CC=CC=C1,inactive +CC(Cl)Cl,inactive +CN(C)C(C)=O,inactive +S=C(N(CCCC)CCCC)S[Ni]SC(=S)N(CCCC)CCCC,inactive +S=C([S-])NCCNC([S-])=S.[Zn+2],inactive +C1=CC=C(C=N1)N(N=O)C,inactive +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br,inactive +OC(=O)CCl,inactive +CC(=O)[O-].[O-]C(=O)C.[O-]C(=O)C.[Cr+3],inactive +O=C(C1=C(C=CC=C1)C(=O)OCC=C)OCC=C,inactive +O=[N+](C1=C2C(=CC=C1)C=CC=C2)[O-],inactive +C12(=C(C=C(C=C1C=CC(=C2/N=N/C3=CC=CC=C3)O)S(=O)(=O)[O-])S(=O)(=O)[O-]).[Na+].[Na+],inactive +O=C2NC(=O)CCN2[C@@H]1O[C@H](CO)[C@@H](O)[C@H]1O,inactive +ClCl,inactive +C1=CC=C5C(=C1)N(CC2=CC=C(F)C=C2)C(NC4CCN(CCC3=CC=C(OC)C=C3)CC4)=N5,inactive +C1=CC=C(NC(=O)C(/N=N/C2=C(Cl)C=C(C3=CC(Cl)=C(/N=N/C(C(=O)NC4=CC=CC=C4)C(=O)C)C=C3)C=C2)C(=O)C)C=C1,inactive +CC(CC1=CC=CC=C1)NN.[H]Cl,inactive +CC(C)C=O,inactive +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,inactive +CC(C1=CC=C(C=C1)CC(C)C)C(=O)O,inactive +ClC(F)C(F)(F)F,inactive +CN1C2=CC=C(C=C2C(=NC(C1=O)O)C3=CC=CC=C3)Cl,inactive +NC1=CC(=CC=C1)N,inactive +N(C([S-])=S)(CC)CC.[S-]C(N(CC)CC)=S.[Cd+2],inactive +[Na+].O=C([O-])[C@@H](N)CCC(O)=O,inactive +O=C(O)CC[C@@H](C)[C@]3([H])[C@](CC2)(C)[C@](CC3)([H])[C@@](CC4)([H])[C@@]2([H])[C@]1(C)[C@@]4([H])C[C@H](O)CC1,inactive +O[C@@H]1[C@@](O[C@@H](O[C@H](CO)[C@@H]2Cl)[C@H](O)[C@H]2O)(CCl)O[C@H](CCl)[C@H]1O,inactive +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2,inactive +O(S(=O)(=O)C)CCCCOS(=O)(C)=O,inactive +[O-]S(S(=O)[O-])(=O)=O.[K+].[K+],inactive +O.[Na+].O.O.CCN(CC)C([S-])=S,inactive +CC(=O)[C@]2(CC[C@H]3[C@@H]4/C=C(/Cl)\C1=C\C(=O)CC[C@]1(C)[C@H]4CC[C@]23C)OC(C)=O,inactive +O.O=C(Nc3cccc1c3O/C(=C\C1=O)C2=N\N\N=N2)c5ccc(OCCCCc4ccccc4)cc5.O=C(Nc3cccc1c3O/C(=C\C1=O)/C=2N\N=N/N=2)c5ccc(OCCCCc4ccccc4)cc5,inactive +c1(n(cnc1)C)C[C@@H]2[C@@H](C(=O)OC2)CC,inactive +N(=C(C=1)C)N(C(C)C)C=1OC(=O)N(C)C,inactive +[As]21O[As]3O[As](O1)O[As](O2)O3,inactive +C1(CCCCC1[N+]).O=S(=O)([O-])O,inactive +ClC1=CC(C2=CC(Cl)=CC(Cl)=C2)=CC(Cl)=C1,inactive +O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4,inactive +O[C@@H]1C(=O)C(\C)=C/[C@H]2O[C@@H]4[C@H](O)C[C@](C)([C@@]12CO)[C@@]34CO3,inactive +C1(CCNC(NC(N)=N)=N)=CC=CC=C1.[H]Cl,inactive +C1(C2=CC=C(C(=C2)Cl)N=NC(C(C)=O)C(=O)NC3=C(C=C(C(=C3)OC)Cl)OC)=CC(=C(C=C1)N=NC(C(C)=O)C(=O)NC4=CC(=C(C=C4OC)Cl)OC)Cl,inactive +O[As](=O)(C1=CC=C(C=C1)NC(=O)N)O,inactive +N1=C(SC2=C1C=CC=C2)SN3CCOCC3,inactive +O[C@@]2([C@](OC)=O)[C@@]1([H])[C@]([C@](N6CC=C5)([H])[C@]5(CC)[C@H]2OC(C)=O)(CC6)C3=C(C=C(OC)[C@]([C@@]([C@@](OC)=O)(C[C@@H]8CN(C[C@](O)(CC)C8)CC7)C4=C7C(C=CC=C9)=C9N4)=C3)N1C,inactive +C1(CCN=C=S)=CC=CC=C1,inactive +ClC6C4(Cl)C3C1C5C(C3C2OC12)C4(Cl)C(Cl)(Cl)C56Cl,inactive +NC2=CC=C(C(OC)=C2)\N=N/C1=CC=CC=C1,inactive +NNC1=NC(=CS1)C2=CC=CC=C2,inactive +OC(=O)CC1=CNC2=C1C=CC=C2,inactive +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,inactive +OC(=O)C1=NN(C2=C1C=CC=C2)CC3=CC=C(C=C3Cl)Cl,inactive +NC1=NC(N)=NC(C2=CC(Cl)=CC=C2Cl)=N1.O=C(O)/C=C\C(O)=O,inactive +C(C\C=C/CCCCCCCC)CCCCCC(=O)[O-].[Na+],inactive +CC1=C(C=CC(=C1)O)O,inactive +[Hg+].[Cl-],inactive +Cl.N#Cc1ccc(cc1)C3CCCc2cncn23,inactive +ClC4=C(C=CC=C4)C2=NC(C)C1=NN=C(C)N1C3=C2C=C(CCC5=CC=C(CC(C)C)C=C5)S3,inactive +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl,inactive +CC(=O)[O-].[O-]C(=O)C.[Ca+2],inactive +CC(=O)[O-].[O-]C(=O)C.[Ba+2],inactive +O=S(=O)([O-])[O-].[Na+].[Na+],inactive +O[As](=O)(C1=CC(=C(C=C1)O)[N+](=O)[O-])O,inactive +C(CC(=O)O)(CC(=O)O)(C(=O)O)O.C(=C(/Cl)C1=CC=CC=C1)(/C2=CC=C(C=C2)OCCN(CC)CC)C3=CC=CC=C3,inactive +C1=C(C(=C(C=C1O)C)N(C)C)C,inactive +S=P(SC1C(SP(=S)(OCC)OCC)OCCO1)(OCC)OCC,inactive +C1(SC2=C(C(=CC(=C2)Cl)Cl)[O-])(=C(C(=CC(=C1)Cl)Cl)[O-]).[Na+].[Na+],inactive +S=C(S[Se](SC(=S)N(C)C)(SC(=S)N(C)C)SC(=S)N(C)C)N(C)C,inactive +O=C(C(Cl)Cl)N[C@H](CO)[C@@H](C1=CC=C([N+]([O-])=O)C=C1)O,inactive +CC(C)(CO)CCCCCCC(C)(C)CO,inactive +FC(F)Cl,inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1.Cl,inactive +C1CCCNCCC1,inactive +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2,inactive +[Na+].[Na+].S=C(NCCNC(=S)[S-])[S-],inactive +OC1C2=C3C(C(OC4C3=C(C=C(C=4O)O)C(=O)O2)=O)=CC=1O,inactive +[Na+].[O-]S(=O)(=O)c4ccc(c1c3cc(C)c(cc3[o+]c2cc(c(C)cc12)N(CC)CC)N(CC)CC)c(c4)S([O-])(=O)=O,inactive +O.O.O.O.NC(=O)[C@@H]3CCCN3C(=O)[C@@H](NC(=O)[C@@H]1CC(=O)N(C)C(=O)N1)C\C2=C\N=C/N2,inactive +C1CN(CC(O1)O)N=O,inactive +N1(C2C(SC3=C1C=CC=C3)=CC=CC=2)CC(N(C)C)C.[H]Cl,inactive +N1C(N(CC(C1=O)C)N=O)=O,inactive +O=C(COC1=C(Cl)C=C(Cl)C=C1)OCC(CC)CCCC,inactive +NC(=S)NN,inactive +[N+].[O-],inactive +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1,inactive +NC(=S)NNC(=S)N,inactive +c1cccc2N\C=C/c12,inactive +C3(S(N)(=O)=O)=CC=C(N2N=C(C(F)(F)F)C=C2C1=CC=C(C)C=C1)C=C3,inactive +N1C(=NC2=C1C=CC=C2)C3=CSC=N3,inactive +N1C(=NC(=C2C=CC=CC=12)N(CCO)CCO)C3=CC=CS3,inactive +NC1=NC(C(C2=CC=CC=C2)O1)=O.O[Mg]O,inactive +OC(=O)[C@@H](N)CSCC,inactive +N#[N+][O-],inactive +O[As](O)(C)=O,inactive +O.[Zn+2].O.[O-]C(C)=O.[O-]C(C)=O,inactive +N#CC(C1=CC=CC=C1)C2=CC=CC=C2,inactive +N[C@@H](C\C1=C\N=C/N1)C(O)=O.Cl,inactive +O=C(C)NCCSP(=S)(OC)OC,inactive +ClC1=CC(=C(C=C1SC2=CC=C(C=C2)Cl)Cl)Cl,inactive +NC(=O)CI,inactive +C1OC1C2CO2,inactive +OC(=O)C1=CC=CN=C1,inactive +CC(C)\C1=C\C=C(/C)CC\C=C(/C)CC\C=C(/C)C[C@@H]1O,inactive +OC(OC(O)CC)CC,inactive +CN(N=O)C(=O)C1=C(C=CC=C1)C(=O)N(C)N=O,inactive +OCCNC1=C(OCCO)C=C([N+]([O-])=O)C=C1,inactive +C1CNCCN1,inactive +C1(=CC=CC=C1)C(=O)[O-].[Na+],inactive +S=C=NCCCC1=CC=CC=C1,inactive +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,inactive +N=C(N(CCCC)N=O)N[N+](=O)[O-],inactive +C=CCO,inactive +O=C(CC1=CC=C(C=C1)OC(=O)C2=CC=C(C=C2)NC(=N)N)OCC(=O)N(C)C.O=S(=O)(C)O,inactive +[Cd+2].[Cd+2].[Cd+2].[O-]S(=O)(=O)[O-].[O-]S([O-])(=O)=O.[O-]S([O-])(=O)=O.O.O.O.O.O.O.O.O,inactive +NC(=S)NC1=C2C(=CC=C1)C=CC=C2,inactive +NC(=O)NCCCC,inactive +NC(=S)NNC=O,inactive +O=[N+](CCC)[O-],inactive +C12C(=CC=CC=1NCCN)C=CC=C2.[H]Cl.[H]Cl,inactive +ClCC(=O)C1=CC=C(NC(=O)C)C=C1,inactive +NC(=O)C1=CC=CN=C1,inactive +NC1=CC=CC=C1,inactive +CN1CCN(CC1)/C2=N/C3=CC=CC=C3SC4C=CC(C)=CC2=4,inactive +NC(=S)C(=S)N,inactive +CC1=C(C(=CC(=C1)OC(=O)NC)C)N(C)C,inactive +O=[N+](CC)[O-],inactive +NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl,inactive +CN(C)CCN(CC1=CC=CO1)C2=CC=CC=N2,inactive +c12[C@H]([C@@H](C(=O)NNCC)[C@@H]([C@H](c1cc3c(c2)OCO3)O)CO)c4cc(c(c(c4)OC)OC)OC,inactive +C1C(CC(CC1(OOC(C)(C)C)OOC(C)(C)C)(C)C)C,inactive +Nc(c(ccc1)C)c1C,inactive +NC(C(=O)O)CCSC,inactive +N(N(CC(O)=O)CC(O)=O)=O,inactive +NC(CCCN)(C(=O)O)C(F)F,inactive +NC(CC1=CNC2=C1C=CC=C2)C(=O)O,inactive +O=C([C@H](CC1=CC=CC=C1)NC(=O)[C@H](CC(=O)O)N)OC,inactive +NC(=O)C1=C(C=CC=C1)C(=O)N,inactive +CN(C)CCN(CC1=CC=CS1)C2=CC=CC=C2,inactive +NC(=O)C1=NC=CN=C1,inactive +NC(=O)C1=CC=NC=C1,inactive +[Ca+2].[N-2]C#N,inactive +CC(C)CN(N=O)C(=N)N[N+]([O-])=O,inactive +N1C2=C(C=CC=C2)SC3=CC=CC=C13,inactive +C1(=C(/C=C/C2=C(S(=O)(=O)[O-])C=C(C=C2)N)C=CC(=C1)N)S(=O)(=O)[O-].[Na+].[Na+],inactive +NC(=N)NC#N,inactive +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +CS(=O)(=O)OC1=C(C=C(C=C1C(C)(C)C)[N+]([O-])=O)[N+](=O)[O-],inactive +CC(C)NCC(O)COc1ccc(cc1)NC(C)=O,inactive +CC(=C)C#N,inactive +OC1C2=CC(=O)OC2=CCO1,inactive +NC(=O)NN=CC1=CC=CO1,inactive +CC([N+](=O)[O-])C,inactive +C13=C(C=CC=C3)NC2=CN=CC=C12,inactive +C13CC(C4C3O4)C2C1C5C(O5)C2,inactive +OC(CC(=O)O)(CC(=O)O)C(=O)O,inactive +Nc1cc(Cl)c(N)cc1.OS(O)(=O)=O,inactive +NC(=O)CCCCC(=O)N,inactive +NC1=CC=C(C=C1)/N=N/C2=CC=C(C=C2)N,inactive +CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3,inactive +ClC1=CC(=C(C=C1C2=C(C=C(C(=C2)Cl)N)Cl)Cl)N,inactive +C1(=C(C=CC(=C1)[C@H](CN[C@@H](CCC2=CC=CC=C2)C)O)O)C(N)=O.[H]Cl,inactive +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)CCCCCCCCCCCCCCC)C)C)C,inactive +O=C(CCCCCCCC/C=C/C(CCCCCC)=O)OC,inactive +C1(=C(C=CC(=C1)NC(N(CC)CC)=O)OCC(CNC(C)(C)C)O)C(C)=O,inactive +C1(=CC(=C(C(=C1C)C)O)C)OCCCCCC,inactive +OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-],inactive +CC=NO,inactive +BrC1=C(Br)C(Br)=CC(C2=CC=C(Br)C(Br)=C2Br)=C1,inactive +O=C(N(CCCC)CC)SCCC,inactive +[O-][N+]1=CC=CC=C1C=C,inactive +O=C(O[C@@H]1[C@@](O[C@@H](O[C@H](COC(C)=O)[C@H]2OC(C(C)C)=O)[C@H](OC(C(C)C)=O)[C@H]2OC(C(C)C)=O)(COC(C)=O)O[C@H](COC(C(C)C)=O)[C@H]1OC(C(C)C)=O)C(C)C,inactive +CC1=CC=CC(C=C)=C1,inactive +C1=CC=CC(=C1)C(C(C2=CC=CC=C2)=O)O,inactive +C1(=C(C)C2OC(CCC=2C(=C1OC(=O)C)C)(CCCC(CCCC(CCCC(C)C)C)C)C)C,inactive +O=C(C1=CC=C(C=C1)N)NC2=CC=C(C=C2)N,inactive +C1(=C(C=C(N)C=C1)[N+](=O)[O-])NCCO,inactive +C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2,inactive +O=C(OCC)C4=C(C=CC=C4)C(C(C=C(C)C(NCC)=C3)=C3O1)=C(C=C2C)C1=C/C2=N/CC.Cl,inactive +CC1(C(=O)N(C)C(=O)O1)C,inactive +C1(=CC(=C(O)C=C1)O)C(O)=O,inactive +C1(=CC(=C2C(=C1)N=CC=C2)Br)Br,inactive +O=C1CC(=O)NC(=O)N1,inactive +OCC(=O)[C@@]4(O)[C@H](C)C[C@@H]1[C@]4(C)C[C@H](O)[C@]2(F)[C@@]3(C)/C=C\C(=O)/C=C3/CC[C@@H]12,inactive +[Na+].[As](=O)[O-],inactive +C1(=CC(=CC=C1[O-])[N+](=O)[O-])[N+](=O)[O-].[Na+],inactive +O=C(C1=CC=C(C=C1)C(=O)OC)OC,inactive +O=C(C1=CC(=CC=C1O)/N=N/C2=CC=C(C=C2)C(=O)O)O,inactive +O=C(C1=CC=CC=C1)CCl,inactive +O=C(C1=CC=CC(=C1)C(C(=O)O)C)C2=CC=CC=C2,inactive +CC1=CC2=CC=CN=C2C=C1,inactive +O=C(CC(/C=C/C2=CC=C(O)C(OC)=C2)=O)/C=C/C1=CC=C(O)C(OC)=C1,inactive +O=C(CC(/C=C/C2=CC=C(O)C(OC)=C2)=O)/C=C/C1=CC=C(O)C(OC)=C1,inactive +ClC1=CC(Cl)=C(/N=N/C(C(=O)NC2=C(C=C(C3=CC(C)=C(NC(=O)C(/N=N/C4=C(Cl)C=C(Cl)C=C4)C(=O)C)C=C3)C=C2)C)C(=O)C)C=C1,inactive +O=C1N(C2=CC=CC=C2)N=C(C1)C,inactive +O=C(CC(C3=C2C=CC(F)=C3)=C(C)/C2=C/C1=CC=C(S(=O)(C)=O)C=C1)O,inactive +O=C(C3)C(C(O)=CC(O[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]5[C@H](O)[C@H](O)[C@@H](O)[C@H](C)O5)O4)=C2)=C2O[C@@H]3[C@@]1=CC(OC)=C(OC)C=C1,inactive +O=C(C2=CC=CC=C2)S\C(CCOC(C3=CC=CC=C3)=O)=C(C)/N(C=O)CC1=CN=C(C)N=C1N.Cl,inactive +C1(=C2C(=CC=C1N)C=CC=C2)S(=O)(O)=O,inactive +C(CO)O,inactive +C1(=C(C=CC=C1N)N).[H]Cl.[H]Cl,inactive +O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC,inactive +[O-][N+](C1=CC=CC(C2C(C(OC3CN(C(C5=CC=CC=C5)C4=CC=CC=C4)C3)=O)=C(NC(C)=C2C(OC(C)C)=O)N)=C1)=O,inactive +O=C(O)Cc1ccc(cc1)NC(C)=O,inactive +O=C(OC)C1=C(C)NC(C)=C(C(OCCC3=CC=C(N4CCN(C(C6=CC=CC=C6)C5=CC=CC=C5)CC4)C=C3)=O)C1C2=CC([N+]([O-])=O)=CC=C2.Cl.Cl,inactive +C(C1C=CC(=CC=1)O)(C2=CC=C(C=C2)O)(C)C,inactive +CC(C1=C(C=CC(=C1)C)O)(C)C,inactive +O=C(O)[C@H](CS)N.Cl,inactive +ClC(C(C1=C(C=CC=C1)Cl)C2=CC=C(C=C2)Cl)Cl,inactive +ClC1=C(C=CC=C1)Cl,inactive +ClC1=C(C=CC(=C1)Cl)OCC(=O)O,inactive +CC1=C(C(=C(C2=C1OC(CCCC(CCCC(CCCC(C)C)C)C)(C)CC2)C)O)C,inactive +O=C(O)\C=C/C(O)=O.O=C(NC3CC(N4C)CCC4C3)C1=C2C(CC(C)(C)O2)=CC(Cl)=C1,inactive +O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N,inactive +C/C=C/C1=CC=C(C=C1)OC,inactive +O=C/C=C/C1=CC=CC=C1,inactive +C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2)=NN=C4,inactive +O=C(NC3=CC2=C(C=C3)C1=CC=C(NC(C)=O)C=C1C2)C,inactive +ClC1=C(C=CC(=C1)Cl)O,inactive +C1=C(C=CC=C1)C2=CC=CC=C2,inactive +O=C(O[C@@H]2C[C@@H](CC3)N(C)[C@H]3C2)C(CO)C1=CC=CC=C1,inactive +C=CC=O,inactive +O=C(O[C@H](CC)C(/C=C(C)/C=C/C4=O)CO[C@H](O[C@H](C)[C@H]2O)[C@H](OC)[C@@H]2OC)C[C@@H](O)[C@H](C)[C@H]([C@@H](CC=O)C[C@H]4C)O[C@H]1[C@H](O)[C@@H](N(C)C)[C@H](O[C@H](O[C@@H](C)[C@@H]3O)C[C@@]3(C)O)[C@@H](C)O1.OC(C)C(O)=O,inactive +O=C(O[C@H](CC)[C@](O)(C)[C@H](O)[C@@H](C)C2=O)[C@H](C)[C@@H](O[C@H]3C[C@](OC)(C)[C@@H](O)[C@H](C)O3)[C@H](C)[C@H]([C@@](O)(C)C[C@H]2C)O[C@H]1[C@H](O)[C@@H]([N@H+](C)C)C[C@@H](C)O1.[O-]C(CCCCCCCCCCCCCCCCC)=O,inactive +ClC1=C(Cl)N=C(C(O)=O)C(Cl)=C1N,inactive +C(C1=CC=C(C=C1)O)(=O)OCCCC,inactive +ClC1=C(C=CC(=C1)Cl)OS(=O)(=O)C2=CC=CC=C2,inactive +O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N,inactive +O=C(N)NC(C(CC)CC)=O,inactive +C1([C@H](CNC)O)(=CC(=CC=C1)O).[H]Cl,inactive +ClC1=C(OC(C)C(O)=O)C=CC(Cl)=C1,inactive +C1(=C2/C(C3=CC(S(=O)(=O)[O-])=CC=C3N2)=O)/C(C4=CC(S(=O)(=O)[O-])=CC=C4N1)=O.[Na+].[Na+],inactive +ClC1=C(Cl)C=CC([C@H]2C3=C(C=CC=C3)[C@@H](NC)CC2)=C1.Cl,inactive +CC1(C2=CC=CC=C2)C(O1)C(=O)OCC,inactive +C1=CC=C(C(OC)C(=O)O)C=C1,inactive +ClC1=C(C=CC(=C1)N)C,inactive +ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl,inactive +CC(=O)[C@]2(CC[C@H]3[C@@H]4/C=C(/Cl)\C1=C\C(=O)CC[C@]1(C)[C@H]4CC[C@]23C)OC(C)=O,inactive +C=CCCl,inactive +O=C(NCCCN(CC)CC)CN1N=CC(C3=CC=CC=C3)=C1C2=CC=CC=C2.O=C(O)/C([H])=C([H])/C(O)=O,inactive +C1COS(O1)(=O)=O,inactive +O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C,inactive +N(C)(C)C([S-])=S.[Fe+3].[S-]C(=S)N(C)C.[S-]C(=S)N(C)C,inactive +C1(C2=CC=CC=C2)=CC(=C(C=C1)N)O,inactive +[O-][N+](C1=CC([N+]([O-])=O)=CC([N+]([O-])=O)=C1)=O,inactive +O=C(NC1=CC=CC(=C1)C(F)(F)F)N(C)C,inactive +C1(C(NCC2CCCCN2)=O)=C(C=CC(=C1)OCC(F)(F)F)OCC(F)(F)F.CC(=O)O,inactive +C1(C(OCC(C)C)=O)=CC=C(O)C=C1,inactive +C12=C(C(=O)NS1(=O)=O)C=CC=C2,inactive +[O-][N+](=O)C1=C(Cl)C(=C(Cl)C(=C1)[N+]([O-])=O)Cl,inactive +CCCCCN(N=O)C(=N)N[N+]([O-])=O,inactive +O=[N+](C1=CC(=C(C(=C1)Cl)N)Cl)[O-],inactive +C1(C[C@H]([C@@H]([C@H]1CCCCCCC(=O)OC)/C=C/CC(O)(CCCC)C)O)=O,inactive +C1(C=CC=CN=1)CCl.Cl,inactive +OC(=O)C=CC=CC,inactive +C1(C)(C)C(=O)NC(=O)NC1=O,inactive +.[Na+].[Cl-],inactive +O=[N+]([O-])[O-].[Na+],inactive +O=CC1CO1,inactive +O=[N+](C1=CC=C(C=C1)N)[O-],inactive +O=C(C(O)(C2=CC=CC=C2)C1CCCCC1)OC(C)(C)C#CCN(CC)CC.O.Cl,inactive +CNC1=NC=NC2=C1N=CN2,inactive +C(O)(=O)[O-].[Na+],inactive +C1(C(COCCOC(=O)CCCCCCCC=CCCCCCCCC)OCCO)OC(OCCO)CC1OCCO,inactive +O=[N+](C1=CC(=C(C=C1)N)N)[O-],inactive +C1(C(=CC=C(C=1)NC(C(C)=C)=O)Cl)Cl,inactive +C1(=C(C=CC(=C1)CCNC)OC(C(C)C)=O)OC(C(C)C)=O.[H]Cl,inactive +OC2=C1[C@@](C=C(C)CC3)([H])[C@]3([H])C(C)(C)OC1=CC(CCCCC)=C2,inactive +[O-][N+](=O)C1=CC=CC(=C1)NC(=O)C2=CC3=CC=CC=C3C(=C2O)/N=N/C4=CC(=CC=C4OC)[N+]([O-])=O,inactive +O[C@H]([C@H](O)CNCCCl)[C@H](O)[C@H](O)CNCCCl,inactive +C12=CC(=CC(=C1C3=C(C(O2)=O)C(CC3)=O)OC)OC,inactive +O=[C@](O[C@H](O[C@H](CO)[C@H]1O)[C@H](O)[C@H]1O)[C@@]5(C)[C@](CC3)([H])[C@](CCC5)(C)[C@@](CC4)([H])[C@@](C2)3C[C@]4(O[C@H]6[C@H](O[C@H]7[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O7)[C@@H](O)[C@H](O)[C@@H](CO)O6)[C@@]2=C,inactive +O[C@H]1[C@H](O[C@H](CO)[C@@H](O)[C@@H]1O)O[C@]2(CO)O[C@H](CO)[C@@H](O)[C@@H]2O,inactive +O[C@H]1[C@@H](NC(CO)CO)C[C@](O)(CO)[C@@H](O)[C@@H]1O,inactive +O[C@@H]8[C@@H](O)[C@@H]1O[C@H](CO)[C@H]8O[C@H]7O[C@H](CO)[C@@H](O[C@H]6O[C@H](CO)[C@@H](O[C@H]5O[C@H](CO)[C@@H](O[C@H]4O[C@H](CO)[C@@H](O[C@H]3O[C@H](CO)[C@@H](O[C@H]2O[C@H](CO)[C@@H](O1)[C@H](O)[C@H]2O)[C@H](O)[C@H]3O)[C@H](O)[C@H]4O)[C@H](O)[C@H]5O)[C,inactive +C1(CCCCC1)N.[H]Cl,inactive +CCCCC/C=C\C/C=C\CCCCCCCC(OC)=O,inactive +O=C(NC1=CC=CC=C1)OC(C)C,inactive +C1(C2=CC=CC=C2)=CC(=C(C=C1)NC(=O)C)O,inactive +O[C@H]([C@@H]2O)[C@@H](O[C@@H]2CO)N(N=CC(N)=N1)C1=O,inactive +O=[C@]([C@@H]1C[C@@H](O)CN1N=O)O,inactive +O=[Bi]Cl,inactive +O=[Cr]O[Cr]=O,inactive +O=C(C1=CC(=C(C(=C1)O)O)O)OCCC,inactive +NC1=C(C)C=C(N)C=C1.O=S(O)(O)=O,inactive +O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3,inactive +CC(OC1=CC=C(C=C1)NC2=CC=CC=C2)C,inactive +O[C@H]1[C@H](OC[C@H]2O[C@@H](OC(/C(C)=C/C=C/C(C)=C/C=C/C=C(C)/C=C/C=C(C)/C(O[C@H]3[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O4)O3)=O)=O)[C@H](O)[C@@H](O)[C@@H]2O)O[C@H](CO)[C@@H](O)[C@@H]1O,inactive +O=NN(CCC1)C(C1)C(=O)O,inactive +CC(C)(C)c1cc(O)ccc1O,inactive +O\C1=C(/OCC(=O)CCCCCCCCCCCC)[C@H](OC1=O)[C@@H](O)CO,inactive +ClC1=NC(=NC(=N1)NC(C)C)NC(C)C,inactive +CN(N=O)C1=CC=C(C=C1)[N+]([O-])=O,inactive +O=C(C=C)C1=CC=C2C(OCO2)=C1,inactive +S(=O)(=O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2,inactive +O=C(C(SP(=O)(OC)OC)CC(=O)OCC)OCC,inactive +O=C(OC)C1=C(C)NC(C)=C(C(OCC(C)(C)CN(CC3=CC=CC=C3)C)=O)C1C2=CC([N+]([O-])=O)=CC=C2F.Cl,inactive +ClC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],inactive +O=C1C[C@H](C\C=C1\C)C(C)=C,inactive +O=C(C(CCC([O-])=O)N)O.[Na+],inactive +O=C(C(C1=CC=CC=C1)CC)NC(=O)N,inactive +O=C(C(C1=CC=CC=C1)(C2=CC=CC=C2)CC(N(C)C)C)CC.[H]Cl,inactive +CCCC[Sn](O[Sn](CCCC)(CCCC)CCCC)(CCCC)CCCC,inactive +ClC1=CC=CC=C1C=C(C#N)C#N,inactive +C1(=CC(=CC=C1N)N).[H]Cl.[H]Cl,inactive +C1(=CC(=CC=C1N)OC)OC.[H]Cl,inactive +Clc3cc(Cl)cnc3Oc1ccc(cc1)Oc2ncc(Cl)cc2Cl,inactive +C1(=CC=C(N)C=C1)OC.[H]Cl,inactive +N(N(CC(F)(F)F)CC(F)(F)F)=O,inactive +C1(=CC=C2C(=C1)N(C(\N=C/2C3=CC=CC=C3)=O)C(C)C)C,inactive +O=C(C)OC/C=C(C)/CC/C=C(C)/C,inactive +O=C(O)CC[C@H](N)C(O)=O,inactive +N=C(N)NC,inactive +O=[Nb](=O)[O-].[Na+],inactive +C1(=N\CCN/1)C(C)OC2C(=CC=CC=2Cl)Cl.[H]Cl,inactive +O=P(OC2=CC=C(C)C=C2)(OC3=CC=C(C)C=C3)OC1=CC=C(C)C=C1,inactive +O=[W](=O)([O-])[O-].[Na+].[Na+],inactive +O=[Ti]=O,inactive +OC1=C(C=C(C=C1SC2=C(C(=CC(=C2)Cl)Cl)O)Cl)Cl,inactive +CC#N,inactive +C(CCCCCCCC)CCCNC(N)=N.CC(=O)O,inactive +[Se],inactive +C12=C(C=CC(=C1)C(CNC(C)C)O)C=CC=C2.[H]Cl,inactive +ClC1=NC(=NC(=N1)NCC)NCC,inactive +O=C(/C=C\C(=O)OCC)OCC,inactive +O=C(/C=C/C6=CC=C(O)C(OC)=C6)O[C@@H]4C(C)(C)[C@@]5([H])[C@]1(CC4)[C@]3([C@](CC5)([H])[C@]2(C)CC[C@@]([C@H](C)CC/C=C(C)\C)([H])[C@](C)2CC3)C1,inactive +O=C(C(C)=C2C)C(C(CCCCCC(O)=O)C1=CC=CC=C1)=C(C)C2=O,inactive +CC=CC1=CC=C(C=C1)OC,inactive +CC1=CC=CC=C1OCC(O)CNCCN2/C=C(/C)C(=O)NC2=O.[H]Cl,inactive +O=C([C@H](CO)[C@]2=CC=CC=C2)O[C@@H]1C[C@H](N4C)[C@@H](O3)[C@@H]3[C@@H]4C1.Br.O.O.O,inactive +O=CC(\Cl)=C(\Cl)C(O)=O,inactive +O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1,inactive +OC(=O)C1=CC=C(C=C1)NN,inactive +CC=C,inactive +CC1(C(=O)NC(=O)O1)C,inactive diff --git a/test/data/EPAFHM.csv b/test/data/EPAFHM.csv new file mode 100644 index 0000000..9092abc --- /dev/null +++ b/test/data/EPAFHM.csv @@ -0,0 +1,618 @@ +"STRUCTURE_SMILES","LC50_mmol" +"C1=CC(C=O)=CC(OC)=C1OCCCCCC",1.13E-02 +"C1(OC)=C([N+]([O-])=O)C(C=O)=CC(Br)=C1O",2.66E-01 +"CCCCCCCCOC(=O)C1=CC=CC(C(=O)OCCCCCCCC)=C1", +"C1=CC(Cl)=CC=C1OC2=C([N+](=O)[O-])C=CC=C2",7.69E-03 +"CC1=C(NC=O)C=CC=C1Cl",2.75E-01 +"CCCCOC(=O)C1=CC=CC(C(=O)OCCCC)=C1",3.23E-03 +"C(C1=CC=CC=C1)(C2=CC=CC=C2)(O)C#C",5.33E-02 +"CCCSCCSCCC",4.22E-02 +"CCCCCCCCOC(=O)C1=CC=C(C(=O)OCCCCCCCC)C=C1", +"OCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCOC(=O)C2=CC=CC=C2C(=O)OCCCCO", +"CCCSCCCCSCCC",1.45E-02 +"C1([N+](=O)[O-])=CC=C(C)C=C1OP(=O)(OC2=C([N+](=O)[O-])C=CC(C)=C2)OC3=C([N+]([O-])=O)C=CC(C)=C3", +"C1=C([N+]([O-])=O)C=CC=C1P(=O)(C2=CC([N+](=O)[O-])=CC=C2)C3=CC([N+](=O)[O-])=CC=C3", +"ClCCOC(=O)NC1CCCCC1",1.70E-01 +"O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC",2.08E+00 +"OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-]",5.92E-02 +"NC(=O)OCC",5.88E+01 +"[O-]C(C1=CC=CC=C1O)=O.[Na+]",1.25E+01 +"C1=CC=CC=C1C(=O)N",5.46E+00 +"CC[N+](CC)(CC)CC1(=CC=CC=C1).[Cl-]",7.07E-01 +"CN(C)N",1.31E-01 +"CC(C(C(NC([O-])=N1)=O)(C1=O)CC)CCC.[Na+]",1.99E-01 +"N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O",3.77E-01 +"O=C1C2=C(N=CN2C)N(C(=O)N1C)C",7.78E-01 +"C1=CC=C2C(=C1)C(=O)C(C)=CC2=O",6.39E-04 +"OC1=C(Cl)C(Cl)=C(Cl)C=C1Cl",4.44E-03 +"OC1=CC(C)=C(Cl)C=C1",3.84E-02 +"[H]Cl.C1=CC=CC=C1CC2=NCCN2",1.80E+00 +"O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C",7.82E-02 +"O(CC)CC",3.45E+01 +"O=C2N5[C@@]3([H])[C@@]1([H])[C@](C[C@]4([H])N(C7)CC[C@]34C6=C5C=CC=C6)([H])C7=CCO[C@]([H])1C2.O=C9N%12[C@@]%10([H])[C@@]8([H])[C@](C[C@]%11([H])N(C%14)CC[C@]%10%11C%13=C%12C=CC=C%13)([H])C%14=CCO[C@]([H])8C9.O=S(O)(O)=O",1.11E-03 +"NC1=CC=CC=C1",1.13E+00 +"O=C(OC1=C2C(=CC=C1)C=CC=C2)NC",4.35E-02 +"CCO",3.19E+02 +"C1(=NC=CC=C1C2CCCN2C).OS(O)(=O)=O",5.30E-02 +"C1(O)=CC=CC=C1C(=O)N",7.36E-01 +"O=C1NC(=O)NC=C1", +"CCCCCC=O",1.75E-01 +"O=C1OC2=CC=CC=C2C(O)=C1CC3=C(O)C4=CC=CC=C4OC3=O",1.52E-02 +"C1(C=O)=CC=C(OC2=CC=CC=C2)C=C1",2.32E-02 +"CO",9.17E+02 +"OC(C)C",1.44E+02 +"CC(=O)C",1.23E+02 +"ClC(Cl)Cl",5.92E-01 +"CS(=O)C",4.35E+02 +"ClC(C(Cl)(Cl)Cl)(Cl)Cl",6.00E-03 +"OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl",5.16E-05 +"C1=CC(=CC=C1N)C(=O)CC",9.79E-01 +"OCCC",7.57E+01 +"CCCCO",2.33E+01 +"CCCCCO",5.36E+00 +"C1=CC=CC=C1",2.25E-01 +"CC(Cl)(Cl)Cl",3.55E-01 +"[S-]C1=NC(C(C(C)CCC)(CC)C(N1)=O)=O.[Na+]",9.91E-02 +"CC#N",4.01E+01 +"CC=O",7.67E-01 +"ClCCl",3.89E+00 +"IC(I)I",7.42E-03 +"[N+](C)(C)(C)C.[Cl-]",4.22E+00 +"CC(C)(C)O",8.65E+01 +"C(F)(F)(F)CO",1.19E+00 +"CC(=O)C(C)(C)C",8.69E-01 +"ClC(C(Cl)Cl)(Cl)Cl",3.72E-02 +"CC1(C)NC(=O)NC1=O",1.29E+02 +"CCC(O)(C)CC",6.58E+00 +"C#CC(O)(C)CC",1.24E+01 +"C1CCCC(C#C)(O)C1",2.06E+00 +"CCCCOCCOP(=O)(OCCOCCCC)OCCOCCCC",2.81E-02 +"OCC(C)C",1.93E+01 +"CC(Cl)CCl",1.12E+00 +"NCC(N)C",1.36E+01 +"CC(O)CC",4.95E+01 +"CCC(=O)C",4.47E+01 +"OC(C)CN",3.36E+01 +"ClC(CCl)Cl",6.12E-01 +"ClC(=CCl)Cl",3.36E-01 +"CC(=O)OC",4.82E+00 +"ClC(C(Cl)Cl)Cl",1.21E-01 +"C1(C)(C)CCCC(C)=C1C=CC(C)=O",2.65E-02 +"ClC1=C(O)C(Cl)=CC(=C1)C(C2=CC(Cl)=C(O)C(=C2)Cl)(C)C",3.63E-03 +"C(C1C=CC(=CC=1)O)(CC)(C)C",1.58E-02 +"C1CC(CCC1(N)C)C(C)(N)C",3.83E-01 +"ClC(Cl)C1=C(Cl)C=CC=C1Cl",4.22E-03 +"C1=CC=C2C=CC=C3C2=C1CC3",1.12E-02 +"CC1=CNC2=C1C=CC=C2",6.74E-02 +"O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1",1.32E-05 +"O=C2C1=NC3=C(C=C(C)C(C)=C3)N(C[C@H](O)[C@H](O)[C@H](O)CO)C1=NC(N2)=O", +"C1=CC=CC=C1OC(=O)C2=CC=CC=C2C(=O)OC3=CC=CC=C3",2.51E-04 +"O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3", +"CCOC(=O)C1=CC=CC=C1C(=O)OCC",1.43E-01 +"C1=CC=C(C(=O)OCCCC)C(=C1)C(=O)OCCCC",3.5900E-03 +"CCC1=C(Br)C(Br)=C(Br)C(Br)=C1Br", +"O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC",2.02E-04 +"C1=CC=CC=C1NC(=O)C2=C(O)C=CC=C2",1.85E-02 +"Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl",3.45E-04 +"OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl",9.12E-04 +"OC1=C(C=C(C=C1Cl)Cl)Cl",2.48E-02 +"OC1=CC(C(F)(F)F)=C([N+]([O-])=O)C=C1",4.41E-02 +"C1(N)=CC=CC=C1C(=O)N",2.90E+00 +"OC1=C([N+]([O-])=O)C=CC=C1",1.15E+00 +"OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-]",2.23E-03 +"O=CC1=CC=CC=C1O",1.88E-02 +"OC1=CC=CC2=CC=CC=C12",3.21E-02 +"OC1=C(C=CC=C1)C2=CC=CC=C2",3.61E-02 +"C12C(=O)C3=C(OC=1C=CC=C2)C=CC=C3", +"BrC1=C(O)C(C=O)=CC(Br)=C1",3.04E-03 +"C1=C2C(=CC=C1)C=CC=C2",4.79E-02 +"N1=CC=CC2=C1C=CC=C2",6.02E-01 +"CCN(CC)C1CCCCC1",1.38E-01 +"CCN(CC)C1=CC=CC=C1",1.10E-01 +"OCCN(CC)C1=CC(C)=CC=C1",2.95E-01 +"C1CCCCC1C2CCCCC2", +"C1=CC=CC=C1C(=O)CC(=O)C",6.78E-03 +"C1=CC(N)=CC=C1C(=O)OCC",2.16E-01 +"O1COC2=CC=C(/C=C/C=C/C(=O)N3CCCCC3)C=C12",2.75E-02 +"C1(C=O)=C(O)C=C(O)C=C1",9.50E-02 +"CC1=C(C)C=CC=C1",1.54E-01 +"OC1=C(C)C=CC=C1",1.29E-01 +"ClC1=C(C=CC=C1)Cl",6.40E-02 +"NC1=C(Cl)C=CC=C1",4.50E-02 +"CC1=C(F)C=CC=C1",1.76E-01 +"OC1=CC=CC=C1Cl",8.87E-02 +"CC1=C(C=CC(=C1)C)C",6.42E-02 +"CC1=CC(Cl)=C(Cl)C=C1",1.81E-02 +"NC1=CC(Cl)=C(Cl)C=C1",4.67E-02 +"C=C(C)C(=O)OCC=C",7.85E-03 +"BrCC(Br)CO",3.26E-01 +"CC(C=O)CC",1.16E-01 +"ClCC(Cl)CCl",3.91E-01 +"CCC(=O)CC",1.79E+01 +"CCC(C)=NO",9.68E+00 +"OCCN(C(C)C)C(C)C",1.38E+00 +"NC1=C([N+]([O-])=O)C=C([N+]([O-])=O)C=C1",8.08E-02 +"OC1=CC=C(Cl)C=C1CC2=CC(Cl)=CC=C2O",1.15E-03 +"C[N+](C1=CC=CC=C1)(C)C.[I-]",9.24E-01 +"C(C1=CC=C(O)C=C1)(C)(C)C",3.43E-02 +"C1=CC=CC=C1C(C)C",5.26E-02 +"C1=CC=CC=C1C(=O)C",1.35E+00 +"O=[N+](C1=CC=CC=C1)[O-]",9.67E-01 +"C1=C(C(=O)C)C=C(N)C=C1",2.83E+00 +"CC1=CC([N+](=O)[O-])=CC=C1",1.87E-01 +"CN(C)C1=CC=C(C)C=C1",3.62E-01 +"O=[N+](C1=CC=C(C=C1)N)[O-]",9.05E-01 +"OC1=CC=C([N+](=O)[O-])C=C1",3.22E-01 +"CN(C)C1=CC=C(C=O)C=C1",3.06E-01 +"[O-][N+](=O)C1=CC=C([N+]([O-])=O)C=C1",4.22E-03 +"CCN(CCO)CC",1.52E+01 +"CCC1=CC=CC=C1",9.89E-02 +"NCC1=CC=CC=C1",9.52E-01 +"O=CC1=CC=CC=C1",9.30E-02 +"C1=CC=C(NC)C=C1",9.33E-01 +"ON=C1CCCCC1",1.84E+00 +"N1=C(C#N)C=CC=C1",6.97E+00 +"N1=C(CC)C=CC=C1",3.86E+00 +"CC1(C)OCC(CO)O1",1.26E+02 +"C1N2CN3CN(C2)CN1C3",3.55E+02 +"C1=CC=CC=C1OC2=CC=CC=C2",2.35E-02 +"CCNC1=CC(C)=CC=C1",3.66E-01 +"CCCN(CCC)CCC",3.55E-01 +"OCCN(CCO)CCO",7.91E+01 +"C1=CC=CC=C1CCC(C)(C)O",4.04E-01 +"C1=CC(C)=CC=C1SSC2=CC=C(C)C=C2", +"OCCN1CCNCC1",4.92E+01 +"CN(C)CC1=CC=CC=C1",2.80E-01 +"C1(=CC=C(C=C1)O)NC(C)=O",5.39E+00 +"NC1=CC=C(CCCC)C=C1",6.80E-02 +"CCCCCCCCCC1=CC=C(O)C=C1",6.35E-04 +"NC1=CC=C(CCCCCCCCCCCC)C=C1", +"CCC(CCCC)CO",2.17E-01 +"ClC1=CC=C(C=O)C=C1",1.56E-02 +"N1=C(C)C=CC(CC)=C1",6.69E-01 +"CC(=O)CCCN(CC)CC",2.14E+00 +"CCOC(=O)CC(=O)OCC",9.18E-02 +"OC1=C(C)C=C(C)C=C1",1.36E-01 +"CCCCOC(=O)C=CC(=O)OCCCC",2.76E-03 +"CCCCOC(=O)CCCCC(=O)OCCCC",1.41E-02 +"NC1=CC=C(Br)C=C1",2.76E-01 +"CC1=CC=C(C)C=C1",8.35E-02 +"OC1=CC=C(C)C=C1",1.53E-01 +"NC1=CC=C(C=C1)Cl",2.46E-01 +"OC1=CC=C(Cl)C=C1",4.75E-02 +"NC1=CC=C(C)C=C1",1.49E+00 +"C=CC(=O)OCC(C)C",1.64E-02 +"BrCCC",5.47E-01 +"C=CC=O",3.03E-04 +"ClCCCl",1.37E+00 +"ClCCO",6.67E-01 +"CCCN",5.21E+00 +"CCC#N",2.76E+01 +"ClCC#N",1.78E-02 +"NCCN",3.66E+00 +"C=CCO",5.51E-03 +"C(O)C#C",2.64E-02 +"CC=NO",1.29E+00 +"C[C@](CC(O)C)(C)O",9.05E+01 +"CC(C)(C)CC(C)(C)N",1.90E-01 +"CC(C)(C)SC(C)(C)C",1.99E-01 +"CCCC(=O)C",1.44E+01 +"CC(=O)CC(C)C",5.21E+00 +"CC(C)OC(C)C",7.69E+00 +"CC1=CC=CC=C1",3.68E-01 +"N1=CC=C(C)C=C1",4.33E+00 +"ClC1=CC=CC=C1",1.50E-01 +"C1CCCCC1O",7.03E+00 +"O=C1CCCCC1",6.33E+00 +"OC1=CC=CC=C1",3.47E-01 +"N1=CC(C)=CC=C1",1.55E+00 +"CN1CCNCC1",2.30E+01 +"N1=C(C)C=CC=C1",9.63E+00 +"N1CC(C)NCC1",2.24E+01 +"CC(=O)OCCC",5.87E-01 +"BrCCCBr",1.04E-02 +"BrCCCC",2.68E-01 +"CCCCN",3.66E+00 +"C=CCC#N",2.71E+00 +"NCCCN",1.61E+01 +"N#CCC#N",8.48E-03 +"COCCN",6.98E+00 +"CCNCC",1.17E+01 +"N1C=CC=C1",3.13E+00 +"C1CCCO1",3.00E+01 +"C1=COC=C1",8.96E-01 +"CC(C)(C)SSC(C)(C)C",7.68E-03 +"CC(=O)CCC(C)C",1.39E+00 +"CCOC(=O)CCCCCCCCC(=O)OCC",1.05E-02 +"CCCCCC(=O)C",1.15E+00 +"CCCCCC",2.90E-02 +"ClCCCCCl",4.06E-01 +"CCCCCN",2.03E+00 +"CCCCC=O",1.50E-01 +"C(O)C#CC(O)",6.23E-01 +"CCNCCO",1.66E+01 +"C1CCCCC1",5.38E-02 +"N1=CC=CC=C1",1.26E+00 +"C1OCOCO1",6.61E+01 +"O=C(CC/C=C(C)/C)C",6.79E-01 +"CC(=O)CCCCCC",2.81E-01 +"CC(=O)OCCOCC",3.19E-01 +"BrCCCCCC",2.09E-02 +"CCCCCCN",5.59E-01 +"CCCCCCO",9.56E-01 +"OCCNCCO",4.48E+01 +"OCCOCCO",7.09E+02 +"CCCSCCC",1.84E-01 +"CCCCCCCN",1.89E-01 +"N#CCCCCC#N",1.79E+01 +"CCCCCCCO",2.97E-01 +"BrCCCCCCCC",4.34E-03 +"CCCCCCCCN",4.02E-02 +"CCCCCCCCO",1.04E-01 +"CCOCCOCCO",1.98E+02 +"CCCCCCCCC(=O)O",6.57E-01 +"CCCCCCCCCC(=O)C",8.81E-03 +"CCCCCCCCCN",1.50E-02 +"OCCOCCOCCO",4.59E+02 +"CCCCCCCCCCO",1.52E-02 +"CCCCCCCCCCCCCO", +"CC(C)OC1=CC=CC=C1OC(=O)NC",4.21E-02 +"CC(O)(C)C#C",3.91E+01 +"C(Cl)(Cl)(Cl)CO",2.00E+00 +"OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl",1.67E-03 +"C1=CC=CC=C1OP(=O)(OC2=CC=CC=C2)OC3=CC=CC=C3",2.66E-03 +"S(=O)(C)C1=CC=C(OP(=S)(OCC)OCC)C=C1",1.40E-01 +"CC(C=NOC(=O)NC)(SC)C",4.52E-03 +"O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC", +"CCCCCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCCCCC", +"C1=CC=CC(O)=C1C(=O)OC2=CC=CC=C2",5.51E-03 +"C1=CC=CC(O)=C1C(=O)OCC",1.22E-01 +"OC1=C(Br)C=C(Br)C=C1Br",1.98E-02 +"OC1=C(C=C(C=C1)N)[N+](=O)[O-]",2.35E-01 +"C1=CC=CC=C1C(=O)C2=CC=CC=C2",8.07E-02 +"C1=CC=CC=C1N(CCO)CCO",4.06E+00 +"C1=CC(=CC=C1C=O)N(CC)CC",1.35E-01 +"OC1=C(C=CC=C1)O",8.37E-02 +"ClC1=C(Cl)C=C(Cl)C=C1",1.65E-02 +"ClC1=C(C=CC(=C1)Cl)O",4.75E-02 +"CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-]",1.33E-01 +"O=CC1=CC(OCC)=C(O)C=C1",5.27E-01 +"C1(C=O)=CC(OC)=C(O)C=C1",5.51E-01 +"CN(C1=CC=CC=C1)C",5.29E-01 +"ClC1=CC([N+](=O)[O-])=CC=C1",1.19E-01 +"O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC",4.27E-02 +"NC1=C(Cl)C=C([N+]([O-])=O)C=C1",1.16E-01 +"C1(C=O)=CC=C(C(C)C)C=C1",4.47E-02 +"C1=CC=CC=C1NC2=CC=CC=C2",2.24E-02 +"C1=CC=CC=C1OCCO",2.49E+00 +"OC1=CC=C(CC)C=C1",8.51E-02 +"CC(C=O)CCC",1.88E-01 +"CC(=O)CC(=O)C",1.35E+00 +"CCCCCC(=O)OCC",6.17E-02 +"CCCC=O",2.04E-01 +"CC(=O)OCCCC",1.55E-01 +"C1COCCO1",1.17E+02 +"CCCCCCCCCCCCN",5.56E-04 +"CCCCCCCCCCCCCC=O", +"CCCCOP(=O)(OCCCC)OCCCC",3.56E-02 +"O=C(CC(=O)C1)CC1(C)C",8.20E+01 +"OC(C)CCl",2.59E+00 +"ClC(=C(Cl)Cl)Cl",9.95E-02 +"CC(C1=CC=CC=C1)(O)C#C",7.73E-01 +"OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C",1.65E-03 +"O=S(C1=CC=CC=C1C([N-]2)=O)2=O.[Na+].[O]",8.20E+01 +"C1=CC=CC2C3=CC=CC=C3OC1=2",8.92E-03 +"C1=CC=CC=C1OC(=O)C2=C(O)C=C(N)C=C2",2.08E-02 +"CCN(CC)C(=O)C1=CC=CC(C)=C1",5.75E-01 +"CCC([O-])=O.[Na+]",4.99E+01 +"NCCN1CCNCC1",1.70E+01 +"CCCCOC(=O)CCC(=O)OCCCC",1.94E-02 +"CCOC(=O)CCCCC(=O)OCC",8.99E-02 +"OCCN",3.39E+01 +"CC(=O)OCC",2.61E+00 +"N1CC(C)OC(C)C1",3.36E+00 +"CCC1=CC(CC)=CC=C1",3.09E-02 +"ClCCCCl",9.82E-01 +"CCCCCC(O)=O",2.76E+00 +"CC(=O)OCCCCCC",3.05E-02 +"CCCCOCCCC",2.48E-01 +"CCCCCCCCCO",3.95E-02 +"CCCCCCNCCCCCC",4.21E-03 +"OCCCCCCCC\C=C/CCCCCCCC", +"C1(C=O)=C(O)C(OC)=CC=C1",1.58E-02 +"OC1=CC(OC)=CC=C1",5.96E-01 +"COC1=CC=C(C=C1)O",8.86E-01 +"COC1=CC=C(OC)C=C1",8.47E-01 +"C1=COC2=C1C=CC=C2",1.19E-01 +"C(CN(C1)C2)N(C1)C2",1.54E+01 +"C(CC(CC1CC23)C2)(C1)C3",2.06E-03 +"CCOP(OCC)(=S)SCCSCC",9.95E-03 +"[O-]C(N1)=NC(C(C(CCC)C)(CC=C)C1=O)=O.[Na+]",9.07E-02 +"BrC1=C(C)NC(=O)N(C(C)CC)C1=O",7.12E-01 +"OC1=C([N+](=O)[O-])C=CC([N+]([O-])=O)=C1",1.82E-02 +"ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl",6.09E-02 +"C1=CC(F)=CC=C1OC2=CC=C(F)C=C2",5.48E-03 +"S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC",3.07E-02 +"FC1=CC=C([N+](=O)[O-])C=C1",2.01E-01 +"C(F)(F)(F)C1=CC(C#N)=CC=C1",2.79E-01 +"NC1=CC=C(F)C=C1",1.52E-01 +"C1(C=O)=C(Cl)C=CC=C1F",5.93E-02 +"NC1=C(C(F)(F)F)C=C(F)C=C1",1.65E-01 +"C1(C=O)=C(F)C=CC=C1",1.09E-02 +"C1=CC=CC(=C1C(F)(F)F)C#N",2.47E-01 +"C1(C=O)=CC(C(F)(F)F)=CC=C1",5.31E-03 +"CNC1=CC=C(F)C=C1",3.07E-01 +"CCCCCCC(=O)CCCCCC", +"O[C@H]1[C@@]([C@@](C)2C)(C)CC[C@H]2C1",4.10E-01 +"O=C(CC1C2)C(C2)(C1(C)C)C",1.12E-01 +"CC2(C)OC1(C)CCC2CC1",6.61E-01 +"O=[C@](O)[C@@]1(C)[C@]([C@]([C@]([H])2CC3)(C)CCC1)([H])CCC2=C\C3=C(C)/C",4.93E-03 +"N1=C(C2=CC=CC=C2)NC(C3=CC=CC=C3)=C1C4=CC=CC=C4", +"C1COC2=CC=CC=C12",6.80E-01 +"O[C@H]1[C@H](CC2)C[C@H]2C1",2.03E+00 +"C1C2C=CC1CC2",1.06E-01 +"N1=C(C(=O)O)C=CC=C1C(=O)O",1.93E+00 +"N1=CC(C=O)=CC=C1",1.53E-01 +"CCCCC(=O)CCCC",2.18E-01 +"C=C(C)C(C)=C",8.41E-02 +"O=[C@](O)[C@@]3(C)[C@@]1([H])[C@@](CCC3)(C)[C@]2([H])C(C=[C@@]([C@@H](C)C)CC2)=CC1",7.87E-03 +"C1=CC=CC=C1C2=CC(=O)C3=CC=CC=C3O2",1.57E-02 +"OC1=C(C)C=C(C)C=C1C",9.54E-02 +"C1(C#N)=CC=CC=C1C",3.82E-01 +"C1(C=O)=C(C)C=CC=C1",4.40E-01 +"C1(=CC=CC=C1)C(=O)[O-].[Na+]",3.36E+00 +"OC1=C(C)C=C([N+]([O-])=O)C=C1[N+]([O-])=O",8.73E-03 +"C1=CC=CC=C1CCCCC",1.15E-02 +"O=C(OC(C)(C)C)C",2.82E+00 +"ClC1=CC(Cl)=CC=C1",5.46E-02 +"Cl\C=C\CCl",2.15E-03 +"CCCCSCCCC",2.45E-02 +"C1(O)=CC(OC)=CC=C1C(=O)C",4.18E-01 +"C1(C=O)=C([N+]([O-])=O)C=CC=C1",9.53E-02 +"O=CC1=CC=C([N+](=O)[O-])C=C1",6.68E-02 +"CC(=O)C(C)C",1.00E+01 +"OC1=C([N+]([O-])=O)C=CC=C1[N+]([O-])=O",2.16E-01 +"BrC1=C(Br)C=CC=C1",1.72E-02 +"C=CCNC1=CC=CC=C1",2.70E-01 +"NC1=CC=C(CC)C=C1",6.02E-01 +"CC(C)CC=O",3.77E-02 +"CCCCC(=O)C",4.27E+00 +"CC=CC=CC",2.43E-01 +"CCCCCCCCCCCC(=O)C",1.81E-03 +"C1=CC=CC=C1[Sn](C2=CC=CC=C2)(C3=CC=CC=C3)C4=CC=CC=C4", +"[H][C@]1(CC2)C(C)(C)CCC[C@@](C)1[C@@H](CC[C@@](O)(C)C=C)C2=C",4.13E-04 +"CC[Sn](CC)(CC)CC",4.68E-05 +"CC(C)C(C)N",3.26E+00 +"CC(C)C(O)C(C)C",1.40E+00 +"C1=CC=CC=C1N(C2=CC=CC=C2)C3=CC=CC=C3", +"C1=CC=CC=C1N(C2=CC=CC=C2)C=O",1.54E-01 +"CCOC(=O)C(CC1=CC=CC=C1)C(=O)OCC",2.17E-02 +"OC1=C(Br)C(Br)=C(Br)C(Br)=C1Br",1.90E-04 +"OC1=C(I)C=C(I)C=C1I",2.56E-03 +"C1(C=O)=C(OC)C=C(OC)C=C1",1.21E-01 +"OC1=C(NC(=O)C)C=CC=C1",1.79E-01 +"NC1=C(Cl)C=C(C)C=C1",2.54E-01 +"NC1=C([N+]([O-])=O)C=C(OCC)C=C1",1.43E-01 +"C1=CC([N+](=O)[O-])=CC=C1C(=O)OC",1.31E-01 +"C1=CC([N+]([O-])=O)=CC=C1C(=O)N",8.01E-01 +"C1=CC=CC=C1OC2=CC=C([N+](=O)[O-])C=C2",1.23E-02 +"C1=CC=C(CS(=O)CC2=CC=CC=C2)C=C1",3.48E-01 +"OC1=CC(NC(=O)C)=CC=C1",7.48E+00 +"OCCN1CCOCC1",2.07E+01 +"ClCC1=CC=C(CCl)C=C1",2.23E-04 +"IC1=CC=C(I)C=C1", +"O1C(C)=CC=C1C",7.40E-01 +"ClCCCCCCl",1.79E-01 +"BrCCCCCCC",8.21E-03 +"CCCSSCCC",1.70E-02 +"N#CCCCCCCC#N",3.88E+00 +"NC1=C(Cl)C(Cl)=C(Cl)C=C1",1.85E-02 +"C1(C=O)=C(O)C=CC(Cl)=C1",4.92E-03 +"OC1=CC=C(CCC)C=C1",8.08E-02 +"C1(C=O)=C(F)C(F)=C(F)C(F)=C1F",5.61E-03 +"C(Cl)(Cl)C(=O)N",1.88E+00 +"CCCCCCC(C)N",4.02E-02 +"CC(=O)CCCCCCCC",3.09E-02 +"CCCCCOCCCCC",1.98E-02 +"CC1=COC=N1",1.67E+01 +"CC1=NC=CN1",3.48E+00 +"O=C1C3CC2CC1CC(C3)C2",4.05E-01 +"CCCCCCC1OC(=O)CC1",1.06E-01 +"C1(C=O)=C(O)C=C(OC)C=C1OC",1.47E-02 +"C1=C(Cl)C(Cl)=CC=C1NC(=O)CC",3.94E-02 +"OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C",2.32E-04 +"C=CC(Cl)C(Cl)",6.54E-02 +"C(=O)N(CCCC)CCCC",5.68E-01 +"C(O)C#CC",1.44E-01 +"CC(C)=CC=C(C)C",3.43E-02 +"NC13CC(CC(C3)C2)CC2C1",1.65E-01 +"N1=C(O)C(C#N)=C(C)C=C1C",1.06E+00 +"NC1=C(F)C(F)=C(F)C(F)=C1F",2.03E-01 +"ClC1=CC=C(SCSP(=S)(OCC)OCC)C=C1",7.00E-04 +"C1=CC=CC=C1P(=O)(C2=CC=CC=C2)C3=CC=CC=C3",1.93E-01 +"C1=CC(N(C)C)=CC=C1P(=O)(C2=CC=C(N(C)C)C=C2)C3=CC=C(N(C)C)C=C3", +"C=CC(=O)OCCO",4.14E-02 +"C#CC(O)CCCCC",3.27E-03 +"CCCCCCCC(=O)C",1.07E-01 +"Cl[C@@H]1CCCC[C@H]1Cl",1.20E-01 +"C1=CC=CC=C1OC2=CC=C(O)C=C2",2.66E-02 +"C=C(C)C(=O)OCCO",1.74E+00 +"C1(Br)=CSC=C1",3.80E-02 +"O=CC1=C(Cl)C=C(Cl)C=C1",1.03E-02 +"C1=CC=CC=C1SSC2=CC=CC=C2",5.04E-04 +"C1(=CC=CC=C1)/C=C/C=C/C2=CC=CC=C2", +"O=C(OCC)C1=CC(N)=CC=C1.OS(C)(=O)=O",3.02E-01 +"C(F)(F)(F)C(O)C(F)(F)(F)",1.45E+00 +"C=CC(O)CC=C",3.88E-01 +"C(O)CC#C",5.15E-01 +"CC\C=C/CCO",3.80E+00 +"CC/C=C/CCO",2.71E+00 +"CN1C(C(=O)C)=CC=C1",1.28E+00 +"N1=CC=C(C2=CC=CC=C2)C=C1",1.04E-01 +"C1=CC=CC=C1S(=O)C2=CC=CC=C2",4.32E-01 +"C1=CC=CC=C1C2=CC=C(C3=CC=CC=C3)O2", +"C=CC(=O)OCC(O)C",2.60E-02 +"N1=C(N)C=CC(Br)=C1",1.02E+00 +"CCOP(=O)(CC1=CC=CC=C1)OCC",1.47E+00 +"CCCCCCCCCCCC(=O)N", +"N1=CC=C(C(=O)C)C=C1",1.39E+00 +"C1=CC(Cl)=CC=C1C(=O)OC",6.40E-02 +"CCCCOC1=CC=CC=C1",3.80E-02 +"C1=CC(C#N)=CC=C1C(=O)OC",2.90E-01 +"OC1=C(O)C(Cl)=C(Cl)C(Cl)=C1Cl",5.12E-03 +"C1=C(C(=O)CBr)C(OC)=CC=C1OC",2.55E-03 +"CCCC[Sn](CCCC)(CCCC)CCCC",1.30E-04 +"C#CC(C)(O)C(C)C",1.83E+00 +"C1=CC=C2C3=CC=CC=C3N(C2=C1)C=C",1.66E-05 +"C1=C(N)C=CC=C1OCC2=CC=CC=C2",4.59E-02 +"O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C",3.81E-03 +"CC(OC)(C)C",7.62E+00 +"C=CCCCCCCC=C",2.10E-03 +"C1=CC(O)=CC=C1/N=N/C2=CC=CC=C2",6.00E-03 +"C1=C(I)C(O)=C(I)C=C1C#N",1.83E-02 +"C1=C(Br)C(O)=C(Br)C=C1C#N",4.55E-02 +"O=[C@](O)[C@@]3(C)[C@@]2([H])[C@@](CCC3)(C)C1=C(CC2)C=[C@@]([C@@H](C)C)C=C1",6.99E-03 +"C=CCC1=CC=CC=C1O",1.12E-01 +"C1(C=O)=C(O)C=CC(Br)=C1",6.46E-03 +"C=C(CCl)C(Cl)",1.52E-03 +"C1=C(Cl)C(O)=C(Cl)C=C1C#N",1.29E-01 +"CCCCOC(=O)C1=CC=C(C(=O)OCCCC)C=C1",2.12E-03 +"C1=CC(O)=CC=C1OC2=CC=C(O)C=C2",2.86E-02 +"C1(Cl)=CC=CC(Cl)=C1C(=O)N",2.47E+00 +"CCCCCCCCCCN",6.55E-03 +"CNC(=O)OC1=CC(C)=C(N(C)C)C=C1",9.36E-03 +"N1=C(Br)NC(Br)=C1Br",2.01E-02 +"CCOP(=S)(OC1=CC=C(C=C1)[N+](=O)[O-])C2=CC=CC=C2",2.43E-04 +"OC(C)CC#C",4.17E-01 +"OC1=C(O)C=C(Cl)C=C1",1.09E-02 +"C1(O)=CC(O)=CC=C1C(=O)OC",2.72E-01 +"C=CC(=O)OCCCCCCCCCCCC", +"N1=C(Cl)C(Cl)=C(Cl)C(Cl)=C1Cl",1.87E-03 +"C1[C@H](C[C@H]([C@@H](C1)C(C)C)O)C",1.21E-01 +"C1=CN=CN1S(=O)(=O)C2=CC=C(C)C=C2",1.88E-01 +"C1=C(C(=O)C)C(Cl)=CC(Cl)=C1",6.89E-02 +"CCCCCCCCC#N",3.77E-02 +"NC1=CC(C(F)(F)F)=C(F)C=C1",1.68E-01 +"[C@H]1(CCCC[C@H]1O)C2=CC=CC=C2",2.52E-01 +"C=C(C)C(=O)OCCOCC",1.75E-01 +"OC1=C(C)C(C)=CC=C1C",6.02E-02 +"CCCCCCCCCCCC#N",2.37E-03 +"C1(OC)=CC=CC=C1C(=O)N",7.94E-01 +"C1(Cl)=CC(Cl)=CC=C1C(=O)N",5.03E-01 +"C=C(C)C(=O)OCC1OCCC1",2.04E-01 +"OC1=C(OC)C=C(Cl)C(Cl)=C1",2.32E-02 +"C=C(C)C(=O)OCC1=CC=CC=C1",2.65E-02 +"C=CC(=O)OCCCCCC",7.10E-03 +"CC(C)(C)C1=CC=C(OC(=O)NC)C=C1",4.82E-02 +"N1=C(CCN)C=CC=C1", +"C1=CC=CC=C1CN2CCNCC2",2.69E-01 +"N1=CC=CC(=C1)CCCO",1.09E+00 +"CCCCCCCCCCCCCN",3.28E-04 +"C1=CC=CC(N)=C1C(=O)C2=CC=C(Cl)C=C2",9.15E-03 +"C1(Cl)=CC=C(Cl)C=C1C(=O)OC",6.83E-02 +"S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC",9.07E-04 +"C1(OC)=CC(C=O)=CC(Br)=C1O",2.58E-01 +"C=CC(=O)OC1CCCCC1",9.60E-03 +"S(C1=CC=C(Cl)C=C1)(=O)C2=CC=C(Cl)C=C2", +"CCOC(=O)N(C(=O)OCC)C(=O)OCC",5.70E-02 +"OC1=C(O)C=C(Cl)C(Cl)=C1",4.97E-03 +"NC1=C(Cl)C(Cl)=CC(Cl)=C1Cl",1.17E-03 +"N1=C(C2=CC=CC=C2)C=CC=C1C3=CC=CC=C3",9.08E-04 +"ClC1=CC(Cl)=C([N+]([O-])=O)C=C1[N+]([O-])=O",1.92E-04 +"C1(Cl)=CC(Cl)=C(Cl)C=C1SSC2=C(Cl)C=C(Cl)C(Cl)=C2", +"C1=C(C)C(C)=CC=C1OP(=O)(OC2=CC(C)=C(C)C=C2)OC3=CC(C)=C(C)C=C3", +"CCC(C)C(C)C=O",1.40E-01 +"C(O)C#CCCCCCCC",6.94E-03 +"N1=C(O)C=CC(Cl)=C1",8.80E+00 +"CC(C)SSC(C)C",5.53E-02 +"C1(C=O)=C(OC)C=C(OC)C(OC)=C1",2.52E-01 +"C=C(C)C(=O)OC(C)C",2.96E-01 +"C=CC(O)CCC",3.04E-01 +"OC1=C(Cl)C(Cl)=C(Cl)C(Cl)=C1",1.77E-03 +"C1=CN=CC=C1CCC2=CC=NC=C2",8.20E-01 +"C1C(=O)N(CC)C(=S)N(CC)C1=O",2.25E+01 +"COC(=O)C1=CC=C(C(=O)OC)C=C1[N+]([O-])=O",2.73E-02 +"C1=CC(Cl)=CC2N=C(S)SC1=2",1.59E-02 +"COC(=O)C1=CC=C(C(=O)OC)C=C1N",4.27E-02 +"CCSCCSCC",4.01E-01 +"CN(CCCCl)C.[H]Cl",8.41E-01 +"C1=C(C(=O)C)C=C([N+]([O-])=O)C(Cl)=C1",2.76E-02 +"CC1=CC(Cl)=NC(N)=N1",9.82E-01 +"CC1=C(OC)C=CC=C1OC",1.33E-01 +"N1=C(N(C)C)C=CC=C1",1.04E+00 +"CC(C)(C)CN",5.45E+00 +"O=[C@](O)[C@@]3(C)[C@@]1([H])[C@@](CCC3)(C)[C@]2([H])C(C[C@](C=C)(C)CC2)=CC1",2.88E-03 +"C1(N)=CC=C(Cl)C=C1C#N",1.87E-01 +"ClC(Cl)(C(C)(O)C)Cl.ClC(Cl)(C(C)(O)C)Cl.[H]O[H]",3.62E-01 +"CCCCCCCCCCC(=O)C",6.40E-03 +"C1=C(/C=C/C=O)C=CC(N(C)C)=C1",3.67E-02 +"C(C(=O)O)[N+]1(=CC=CC=C1).[Cl-]",9.33E-01 +"ClC1=C([N+]([O-])=O)C(Cl)=C([N+]([O-])=O)C(Cl)=C1",8.18E-04 +"ClC1=CC=C([N+](=O)[O-])C=C1C=O",2.09E-02 +"N#CC1=C(Cl)C=CC=C1C",9.96E-02 +"N1=C(Br)C(O)=CC=C1",2.70E+00 +"N1=C(Cl)C(O)=CC=C1",4.80E+00 +"C#CCN(CC#C)CC#C",2.26E+00 +"CCOC(OCC)CN(C)CC(OCC)OCC",2.41E+00 +"NCCCN1CCN(CCCN)CC1",1.55E+01 +"OC(CC/C=C(C)/CC/C=C(C)\C)(C)C=C",6.43E-03 +"ClCCN1CCCC1.[H]Cl",9.00E-01 +"CCCCCCCCCCCN",1.23E-03 +"C#CC(O)CCCC",1.57E-02 +"C1(C=O)=CC=C(OCC)C=C1",1.87E-01 +"O=C(C(C(C1C2)(C)C)(C2)C)C1Br",2.96E-01 +"CC(C)=CC1C(C)(C)C1C(=O)OCC2=COC(CC3=CC=CC=C3)=C2",1.82E-05 +"CCOP(=S)(OCC)SCSC(C)(C)C",4.61E-05 +"BrC(Br)C1=C(C(Br)Br)C=CC=C1",1.04E-03 +"C1=C(C(=O)C)C(Cl)=C(Cl)C(Cl)=C1",8.95E-03 +"C1(OC)=C(OC)C(OC)=CC=C1C(=O)C",9.47E-01 +"CCOC(=O)C(Cl)C(=O)OCC",4.88E-03 +"CCNCC1=CC=CC=C1",4.22E-01 +"ClC1=CC=CC=[N+]1C.[I-]",7.79E-01 +"C1=CC(Br)=CC=C1C(=O)C2=CC=CN=C2",7.78E-02 +"C1=CC=CC=C1C(=O)C2=CC=NC=C2",5.62E-01 +"CC1(C)CCC(C)(C)O1",1.31E+00 +"N1=C([N+]([O-])=O)C(O)=CC=C1",1.19E+00 +"C1(CC)=CC=CC(CC)=C1N(COC)C(=O)CCl",1.85E-02 +"NC1=CC=C(CCCCCCCC)C=C1",5.84E-04 +"CSC(C)=NOC(=O)NC",1.30E-02 +"N1=C(O)C=CC=C1Cl",1.65E+00 +"NC1=NN=C(C)C(C)=N1",7.67E+00 +"C1=CC([N+]([O-])=O)=CC([N+](=O)[O-])=C1OC2=CC=C(Br)C=C2", +"O=CC1=CC=C(N(CC)CC)C=C1O",2.77E-02 +"N1=C(C)C=CC=C1Cl",1.82E+00 +"C#CC(CCC(C)C)(C)O",3.49E-01 +"CC1=C(C)OC(C)=N1",4.04E+00 +"CC(=O)C(C)CN(C)C",6.58E-02 +"C1=CC([N+](=O)[O-])=CC=C1OC2=CC(C)=C(Cl)C=C2", +"C1=CC=C(Br)C=C1C(=O)N",4.63E-01 +"O=C(C(=NOC(=O)NC)SC)N(C)C",3.09E-02 +"NC1=C(C(C)C)C=CC=C1C(C)C",8.63E-02 +"[Na+].[N-]=[N+]=[N-]",8.40E-02 +"C[N+](C1=CC=CC=C1)(C)C.[O-]S(=O)(=O)OC",1.00E+00 +"ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl", +"CC(C)(O)C(F)(C(F)F)F",3.64E+00 +"CCC(N)C",3.76E+00 +"COCCCNCC1=CC(OC)=C(OC)C(OC)=C1",5.05E-01 +"BrCC1OCCCC1",1.15E+00 +"NC1=CC=C(CCCCCCCCCC)C=C1",2.66E-04 +"NC1=CC=C(OCCCCCC)C=C1",1.56E-02 +"C1([N+](=O)[O-])=CC(Cl)=CC=C1C(=O)OC",1.28E-01 +"C1(C=O)=C([N+](=O)[O-])C=CC(O)=C1",2.51E-01 +"O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N",1.21E-05 +"C1=CC=C(OC2=CC=CC=C2)C=C1COC(=O)C3C(C)(C)C3C=C(Cl)Cl",4.09E-05 +"CCSCCCCSCC",3.40E-02 +"CCCCCCCCOC1=CC=CC=C1NC(=O)C",1.71E-03 +"C1=CC(C(C)(C)C)=CC=C1C(=O)N",1.80E-01 +"CSCCCCCCSC",5.66E-02 +"CC(O)C#C",1.67E-01 +"C1(C)=C(C)C=CC=C1OP(=O)(OC2=C(C)C(C)=CC=C2)OC3=C(C)C(C)=CC=C3", +"C1C(=CC=C[N+]=1CC2C=CC=CC=2)S(=O)(=O)[O-]",9.67E+00 +"C1=CC(C(C)(C)C)=CC=C1OC2=CC=CC(C=O)=C2",1.45E-03 +"O=C(OC(C2=CC=CC(OC3=CC=CC=C3)=C2)C#N)[C@H](C1=CC=C(OC(F)F)C=C1)[C@H](C)C",4.21E-07 +"ClC1=CC=CC(Cl)=C1OP(=O)(OC2=C(Cl)C=CC=C2Cl)OC3=C(Cl)C=CC=C3Cl", +"C1=C(C=O)C=CC=C1OC2=CC(Cl)=C(Cl)C=C2",1.12E-03 +"[Na+].O.O.[O-]C1=C([N+]([O-])=O)C=C([N+]([O-])=O)C2=CC=CC=C12",1.45E-02 +"CC(C)(C)C1=CC=C(C=C)C=C1",3.06E-03 +"O=P(OCC)(SCCSCC)OCC",6.19E-02 +"ClCC1=CC(C=C)=CC=C1",2.03E-03 diff --git a/test/data/EPAFHM.medi.csv b/test/data/EPAFHM.medi.csv new file mode 100644 index 0000000..9f8205a --- /dev/null +++ b/test/data/EPAFHM.medi.csv @@ -0,0 +1,100 @@ +"STRUCTURE_SMILES","LC50_mmol" +"C1=CC(C=O)=CC(OC)=C1OCCCCCC",1.13E-02 +"C1(OC)=C([N+]([O-])=O)C(C=O)=CC(Br)=C1O",2.66E-01 +"CCCCCCCCOC(=O)C1=CC=CC(C(=O)OCCCCCCCC)=C1", +"C1=CC(Cl)=CC=C1OC2=C([N+](=O)[O-])C=CC=C2",7.69E-03 +"CC1=C(NC=O)C=CC=C1Cl",2.75E-01 +"CCCCOC(=O)C1=CC=CC(C(=O)OCCCC)=C1",3.23E-03 +"C(C1=CC=CC=C1)(C2=CC=CC=C2)(O)C#C",5.33E-02 +"CCCSCCSCCC",4.22E-02 +"CCCCCCCCOC(=O)C1=CC=C(C(=O)OCCCCCCCC)C=C1", +"OCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCOC(=O)C2=CC=CC=C2C(=O)OCCCCO", +"CCCSCCCCSCCC",1.45E-02 +"CCCSCCCCSCCC",1.85E-02 +"C1([N+](=O)[O-])=CC=C(C)C=C1OP(=O)(OC2=C([N+](=O)[O-])C=CC(C)=C2)OC3=C([N+]([O-])=O)C=CC(C)=C3", +"C1=C([N+]([O-])=O)C=CC=C1P(=O)(C2=CC([N+](=O)[O-])=CC=C2)C3=CC([N+](=O)[O-])=CC=C3", +"ClCCOC(=O)NC1CCCCC1",1.70E-01 +"O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC",2.08E+00 +"OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-]",5.92E-02 +"NC(=O)OCC",5.88E+01 +"[O-]C(C1=CC=CC=C1O)=O.[Na+]",1.25E+01 +"C1=CC=CC=C1C(=O)N",5.46E+00 +"CC[N+](CC)(CC)CC1(=CC=CC=C1).[Cl-]",7.07E-01 +"CN(C)N",1.31E-01 +"CC(C(C(NC([O-])=N1)=O)(C1=O)CC)CCC.[Na+]",1.99E-01 +"N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O",3.77E-01 +"O=C1C2=C(N=CN2C)N(C(=O)N1C)C",7.78E-01 +"C1=CC=C2C(=C1)C(=O)C(C)=CC2=O",6.39E-04 +"OC1=C(Cl)C(Cl)=C(Cl)C=C1Cl",4.44E-03 +"OC1=CC(C)=C(Cl)C=C1",3.84E-02 +"O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C",7.82E-02 +"O(CC)CC",3.45E+01 +"NC1=CC=CC=C1",1.13E+00 +"O=C(OC1=C2C(=CC=C1)C=CC=C2)NC",4.35E-02 +"CCO",3.19E+02 +"C1(=NC=CC=C1C2CCCN2C).OS(O)(=O)=O",5.30E-02 +"C1(O)=CC=CC=C1C(=O)N",7.36E-01 +"O=C1NC(=O)NC=C1", +"CCCCCC=O",1.75E-01 +"O=C1OC2=CC=CC=C2C(O)=C1CC3=C(O)C4=CC=CC=C4OC3=O",1.52E-02 +"C1(C=O)=CC=C(OC2=CC=CC=C2)C=C1",2.32E-02 +"CO",9.17E+02 +"OC(C)C",1.44E+02 +"CC(=O)C",1.23E+02 +"ClC(Cl)Cl",5.92E-01 +"CS(=O)C",4.35E+02 +"ClC(C(Cl)(Cl)Cl)(Cl)Cl",6.00E-03 +"OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl",5.16E-05 +"C1=CC(=CC=C1N)C(=O)CC",9.79E-01 +"OCCC",7.57E+01 +"CCCCO",2.33E+01 +"CCCCCO",5.36E+00 +"C1=CC=CC=C1",2.25E-01 +"CC(Cl)(Cl)Cl",3.55E-01 +"[S-]C1=NC(C(C(C)CCC)(CC)C(N1)=O)=O.[Na+]",9.91E-02 +"CC#N",4.01E+01 +"CC=O",7.67E-01 +"ClCCl",3.89E+00 +"IC(I)I",7.42E-03 +"[N+](C)(C)(C)C.[Cl-]",4.22E+00 +"CC(C)(C)O",8.65E+01 +"C(F)(F)(F)CO",1.19E+00 +"CC(=O)C(C)(C)C",8.69E-01 +"ClC(C(Cl)Cl)(Cl)Cl",3.72E-02 +"CC1(C)NC(=O)NC1=O",1.29E+02 +"CCC(O)(C)CC",6.58E+00 +"C#CC(O)(C)CC",1.24E+01 +"C1CCCC(C#C)(O)C1",2.06E+00 +"CCCCOCCOP(=O)(OCCOCCCC)OCCOCCCC",2.81E-02 +"CCCCOCCOP(=O)(OCCOCCCC)OCCOCCCC",1.81E-02 +"OCC(C)C",1.93E+01 +"CC(Cl)CCl",1.12E+00 +"NCC(N)C",1.36E+01 +"CC(O)CC",4.95E+01 +"CCC(=O)C",4.47E+01 +"OC(C)CN",3.36E+01 +"ClC(CCl)Cl",6.12E-01 +"ClC(=CCl)Cl",3.36E-01 +"CC(=O)OC",4.82E+00 +"ClC(C(Cl)Cl)Cl",1.21E-01 +"C1(C)(C)CCCC(C)=C1C=CC(C)=O",2.65E-02 +"ClC1=C(O)C(Cl)=CC(=C1)C(C2=CC(Cl)=C(O)C(=C2)Cl)(C)C",3.63E-03 +"C(C1C=CC(=CC=1)O)(CC)(C)C",1.58E-02 +"C1CC(CCC1(N)C)C(C)(N)C",3.83E-01 +"ClC(Cl)C1=C(Cl)C=CC=C1Cl",4.22E-03 +"C1=CC=C2C=CC=C3C2=C1CC3",1.12E-02 +"CC1=CNC2=C1C=CC=C2",6.74E-02 +"C1=CC=CC=C1OC(=O)C2=CC=CC=C2C(=O)OC3=CC=CC=C3",2.51E-04 +"O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3", +"CCOC(=O)C1=CC=CC=C1C(=O)OCC",1.43E-01 +"C1=CC=C(C(=O)OCCCC)C(=C1)C(=O)OCCCC",3.5900E-03 +"CCC1=C(Br)C(Br)=C(Br)C(Br)=C1Br", +"O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC",2.02E-04 +"C1=CC=CC=C1NC(=O)C2=C(O)C=CC=C2",1.85E-02 +"Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl",3.45E-04 +"OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl",9.12E-04 +"OC1=C(C=C(C=C1Cl)Cl)Cl",2.48E-02 +"OC1=CC(C(F)(F)F)=C([N+]([O-])=O)C=C1",4.41E-02 +"C1(N)=CC=CC=C1C(=O)N",2.90E+00 +"C1(N)=CC=CC=C1C(=O)N",2.50E+00 +"OC1=C([N+]([O-])=O)C=CC=C1",1.15E+00 diff --git a/test/data/EPAFHM.mini.csv b/test/data/EPAFHM.mini.csv new file mode 100644 index 0000000..a0de32f --- /dev/null +++ b/test/data/EPAFHM.mini.csv @@ -0,0 +1,22 @@ +"STRUCTURE_SMILES","LC50_mmol" +"C1=CC(C=O)=CC(OC)=C1OCCCCCC",1.13E-02 +"C1(OC)=C([N+]([O-])=O)C(C=O)=CC(Br)=C1O",2.66E-01 +"CCCCCCCCOC(=O)C1=CC=CC(C(=O)OCCCCCCCC)=C1", +"C1=CC(Cl)=CC=C1OC2=C([N+](=O)[O-])C=CC=C2",7.69E-03 +"CC1=C(NC=O)C=CC=C1Cl",2.75E-01 +"CCCCOC(=O)C1=CC=CC(C(=O)OCCCC)=C1",3.23E-03 +"C(C1=CC=CC=C1)(C2=CC=CC=C2)(O)C#C",5.33E-02 +"CCCSCCSCCC",4.22E-02 +"CCCCCCCCOC(=O)C1=CC=C(C(=O)OCCCCCCCC)C=C1", +"OCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCOC(=O)C2=CC=CC=C2C(=O)OCCCCO", +"CCCSCCCCSCCC",1.45E-02 +"C1([N+](=O)[O-])=CC=C(C)C=C1OP(=O)(OC2=C([N+](=O)[O-])C=CC(C)=C2)OC3=C([N+]([O-])=O)C=CC(C)=C3", +"C1=C([N+]([O-])=O)C=CC=C1P(=O)(C2=CC([N+](=O)[O-])=CC=C2)C3=CC([N+](=O)[O-])=CC=C3", +"ClCCOC(=O)NC1CCCCC1",1.70E-01 +"O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC",2.08E+00 +"OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-]",5.92E-02 +"NC(=O)OCC",5.88E+01 +"[O-]C(C1=CC=CC=C1O)=O.[Na+]",1.25E+01 +"C1=CC=CC=C1C(=O)N",5.46E+00 +"CC[N+](CC)(CC)CC1(=CC=CC=C1).[Cl-]",7.07E-01 +"OCCCCCCCC\C=C/CCCCCCCC", diff --git a/test/data/EPA_v4b_Fathead_Minnow_Acute_Toxicity_LC50_mmol.csv b/test/data/EPA_v4b_Fathead_Minnow_Acute_Toxicity_LC50_mmol.csv new file mode 100644 index 0000000..f9606a0 --- /dev/null +++ b/test/data/EPA_v4b_Fathead_Minnow_Acute_Toxicity_LC50_mmol.csv @@ -0,0 +1,581 @@ +STRUCTURE_SMILES,LC50_mmol +O=C(OC(C2=CC=CC(OC3=CC=CC=C3)=C2)C#N)[C@H](C1=CC=C(OC(F)F)C=C1)[C@H](C)C,0.000000421 +O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N,0.000012100 +O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1,0.000013200 +C1=CC=C2C3=CC=CC=C3N(C2=C1)C=C,0.000016600 +CC(C)=CC1C(C)(C)C1C(=O)OCC2=COC(CC3=CC=CC=C3)=C2,0.000018200 +C1=CC=C(OC2=CC=CC=C2)C=C1COC(=O)C3C(C)(C)C3C=C(Cl)Cl,0.000040900 +CCOP(=S)(OCC)SCSC(C)(C)C,0.000046100 +CC[Sn](CC)(CC)CC,0.000046800 +OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl,0.000051600 +CCCC[Sn](CCCC)(CCCC)CCCC,0.000130000 +OC1=C(Br)C(Br)=C(Br)C(Br)=C1Br,0.000190000 +ClC1=CC(Cl)=C([N+]([O-])=O)C=C1[N+]([O-])=O,0.000192000 +O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC,0.000202000 +ClCC1=CC=C(CCl)C=C1,0.000223000 +OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C,0.000232000 +CCOP(=S)(OC1=CC=C(C=C1)[N+](=O)[O-])C2=CC=CC=C2,0.000243000 +C1=CC=CC=C1OC(=O)C2=CC=CC=C2C(=O)OC3=CC=CC=C3,0.000251000 +NC1=CC=C(CCCCCCCCCC)C=C1,0.000266000 +C=CC=O,0.000303000 +CCCCCCCCCCCCCN,0.000328000 +Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl,0.000345000 +[H][C@]1(CC2)C(C)(C)CCC[C@@](C)1[C@@H](CC[C@@](O)(C)C=C)C2=C,0.000413000 +C1=CC=CC=C1SSC2=CC=CC=C2,0.000504000 +CCCCCCCCCCCCN,0.000556000 +NC1=CC=C(CCCCCCCC)C=C1,0.000584000 +CCCCCCCCCC1=CC=C(O)C=C1,0.000635000 +C1=CC=C2C(=C1)C(=O)C(C)=CC2=O,0.000639000 +ClC1=CC=C(SCSP(=S)(OCC)OCC)C=C1,0.000700000 +ClC1=C([N+]([O-])=O)C(Cl)=C([N+]([O-])=O)C(Cl)=C1,0.000818000 +S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC,0.000907000 +N1=C(C2=CC=CC=C2)C=CC=C1C3=CC=CC=C3,0.000908000 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0.000912000 +BrC(Br)C1=C(C(Br)Br)C=CC=C1,0.001040000 +O=C2N5[C@@]3([H])[C@@]1([H])[C@](C[C@]4([H])N(C7)CC[C@]34C6=C5C=CC=C6)([H])C7=CCO[C@]([H])1C2.O=C9N%12[C@@]%10([H])[C@@]8([H])[C@](C[C@]%11([H])N(C%14)CC[C@]%10%11C%13=C%12C=CC=C%13)([H])C%14=CCO[C@]([H])8C9.O=S(O)(O)=O,0.001110000 +C1=C(C=O)C=CC=C1OC2=CC(Cl)=C(Cl)C=C2,0.001120000 +OC1=CC=C(Cl)C=C1CC2=CC(Cl)=CC=C2O,0.001150000 +NC1=C(Cl)C(Cl)=CC(Cl)=C1Cl,0.001170000 +CCCCCCCCCCCN,0.001230000 +C1=CC(C(C)(C)C)=CC=C1OC2=CC=CC(C=O)=C2,0.001450000 +C=C(CCl)C(Cl),0.001520000 +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C,0.001650000 +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl,0.001670000 +CCCCCCCCOC1=CC=CC=C1NC(=O)C,0.001710000 +OC1=C(Cl)C(Cl)=C(Cl)C(Cl)=C1,0.001770000 +CCCCCCCCCCCC(=O)C,0.001810000 +N1=C(Cl)C(Cl)=C(Cl)C(Cl)=C1Cl,0.001870000 +ClCC1=CC(C=C)=CC=C1,0.002030000 +C(CC(CC1CC23)C2)(C1)C3,0.002060000 +C=CCCCCCCC=C,0.002100000 +CCCCOC(=O)C1=CC=C(C(=O)OCCCC)C=C1,0.002120000 +Cl\C=C\CCl,0.002150000 +OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-],0.002230000 +CCCCCCCCCCCC#N,0.002370000 +C1=C(C(=O)CBr)C(OC)=CC=C1OC,0.002550000 +OC1=C(I)C=C(I)C=C1I,0.002560000 +C1=CC=CC=C1OP(=O)(OC2=CC=CC=C2)OC3=CC=CC=C3,0.002660000 +CCCCOC(=O)C=CC(=O)OCCCC,0.002760000 +O=[C@](O)[C@@]3(C)[C@@]1([H])[C@@](CCC3)(C)[C@]2([H])C(C[C@](C=C)(C)CC2)=CC1,0.002880000 +BrC1=C(O)C(C=O)=CC(Br)=C1,0.003040000 +CC(C)(C)C1=CC=C(C=C)C=C1,0.003060000 +CCCCOC(=O)C1=CC=CC(C(=O)OCCCC)=C1,0.003230000 +C#CC(O)CCCCC,0.003270000 +C1=CC=C(C(=O)OCCCC)C(=C1)C(=O)OCCCC,0.003590000 +ClC1=C(O)C(Cl)=CC(=C1)C(C2=CC(Cl)=C(O)C(=C2)Cl)(C)C,0.003630000 +O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C,0.003810000 +CCCCCCNCCCCCC,0.004210000 +[O-][N+](=O)C1=CC=C([N+]([O-])=O)C=C1,0.004220000 +ClC(Cl)C1=C(Cl)C=CC=C1Cl,0.004220000 +BrCCCCCCCC,0.004340000 +OC1=C(Cl)C(Cl)=C(Cl)C=C1Cl,0.004440000 +CC(C=NOC(=O)NC)(SC)C,0.004520000 +CCOC(=O)C(Cl)C(=O)OCC,0.004880000 +C1(C=O)=C(O)C=CC(Cl)=C1,0.004920000 +O=[C@](O)[C@@]1(C)[C@]([C@]([C@]([H])2CC3)(C)CCC1)([H])CCC2=C\C3=C(C)/C,0.004930000 +OC1=C(O)C=C(Cl)C(Cl)=C1,0.004970000 +OC1=C(O)C(Cl)=C(Cl)C(Cl)=C1Cl,0.005120000 +C1(C=O)=CC(C(F)(F)F)=CC=C1,0.005310000 +C1=CC(F)=CC=C1OC2=CC=C(F)C=C2,0.005480000 +C=CCO,0.005510000 +C1=CC=CC(O)=C1C(=O)OC2=CC=CC=C2,0.005510000 +C1(C=O)=C(F)C(F)=C(F)C(F)=C1F,0.005610000 +C1=CC(O)=CC=C1/N=N/C2=CC=CC=C2,0.006000000 +ClC(C(Cl)(Cl)Cl)(Cl)Cl,0.006000000 +CCCCCCCCCCC(=O)C,0.006400000 +OC(CC/C=C(C)/CC/C=C(C)\C)(C)C=C,0.006430000 +C1(C=O)=C(O)C=CC(Br)=C1,0.006460000 +CCCCCCCCCCN,0.006550000 +C1=CC=CC=C1C(=O)CC(=O)C,0.006780000 +C(O)C#CCCCCCCC,0.006940000 +O=[C@](O)[C@@]3(C)[C@@]2([H])[C@@](CCC3)(C)C1=C(CC2)C=[C@@]([C@@H](C)C)C=C1,0.006990000 +C=CC(=O)OCCCCCC,0.007100000 +IC(I)I,0.007420000 +CC(C)(C)SSC(C)(C)C,0.007680000 +C1=CC(Cl)=CC=C1OC2=C([N+](=O)[O-])C=CC=C2,0.007690000 +C=C(C)C(=O)OCC=C,0.007850000 +O=[C@](O)[C@@]3(C)[C@@]1([H])[C@@](CCC3)(C)[C@]2([H])C(C=[C@@]([C@@H](C)C)CC2)=CC1,0.007870000 +BrCCCCCCC,0.008210000 +N#CCC#N,0.008480000 +OC1=C(C)C=C([N+]([O-])=O)C=C1[N+]([O-])=O,0.008730000 +CCCCCCCCCC(=O)C,0.008810000 +C1=CC=CC2C3=CC=CC=C3OC1=2,0.008920000 +C1=C(C(=O)C)C(Cl)=C(Cl)C(Cl)=C1,0.008950000 +C1=CC=CC(N)=C1C(=O)C2=CC=C(Cl)C=C2,0.009150000 +CNC(=O)OC1=CC(C)=C(N(C)C)C=C1,0.009360000 +C=CC(=O)OC1CCCCC1,0.009600000 +CCOP(OCC)(=S)SCCSCC,0.009950000 +O=CC1=C(Cl)C=C(Cl)C=C1,0.010300000 +BrCCCBr,0.010400000 +CCOC(=O)CCCCCCCCC(=O)OCC,0.010500000 +OC1=C(O)C=C(Cl)C=C1,0.010900000 +C1(C=O)=C(F)C=CC=C1,0.010900000 +C1=CC=C2C=CC=C3C2=C1CC3,0.011200000 +C1=CC(C=O)=CC(OC)=C1OCCCCCC,0.011300000 +C1=CC=CC=C1CCCCC,0.011500000 +C1=CC=CC=C1OC2=CC=C([N+](=O)[O-])C=C2,0.012300000 +CSC(C)=NOC(=O)NC,0.013000000 +CCCCOC(=O)CCCCC(=O)OCCCC,0.014100000 +[Na+].O.O.[O-]C1=C([N+]([O-])=O)C=C([N+]([O-])=O)C2=CC=CC=C12,0.014500000 +CCCSCCCCSCCC,0.014500000 +C1(C=O)=C(O)C=C(OC)C=C1OC,0.014700000 +CCCCCCCCCN,0.015000000 +O=C1OC2=CC=CC=C2C(O)=C1CC3=C(O)C4=CC=CC=C4OC3=O,0.015200000 +CCCCCCCCCCO,0.015200000 +NC1=CC=C(OCCCCCC)C=C1,0.015600000 +ClC1=CC=C(C=O)C=C1,0.015600000 +C#CC(O)CCCC,0.015700000 +C1=CC=CC=C1C2=CC(=O)C3=CC=CC=C3O2,0.015700000 +C(C1C=CC(=CC=1)O)(CC)(C)C,0.015800000 +C1(C=O)=C(O)C(OC)=CC=C1,0.015800000 +C1=CC(Cl)=CC2N=C(S)SC1=2,0.015900000 +C=CC(=O)OCC(C)C,0.016400000 +ClC1=C(Cl)C=C(Cl)C=C1,0.016500000 +CCCSSCCC,0.017000000 +BrC1=C(Br)C=CC=C1,0.017200000 +ClCC#N,0.017800000 +CC1=CC(Cl)=C(Cl)C=C1,0.018100000 +OC1=C([N+](=O)[O-])C=CC([N+]([O-])=O)=C1,0.018200000 +C1=C(I)C(O)=C(I)C=C1C#N,0.018300000 +NC1=C(Cl)C(Cl)=C(Cl)C=C1,0.018500000 +C1(CC)=CC=CC(CC)=C1N(COC)C(=O)CCl,0.018500000 +C1=CC=CC=C1NC(=O)C2=C(O)C=CC=C2,0.018500000 +O=CC1=CC=CC=C1O,0.018800000 +CCCCOC(=O)CCC(=O)OCCCC,0.019400000 +OC1=C(Br)C=C(Br)C=C1Br,0.019800000 +CCCCCOCCCCC,0.019800000 +N1=C(Br)NC(Br)=C1Br,0.020100000 +C1=CC=CC=C1OC(=O)C2=C(O)C=C(N)C=C2,0.020800000 +BrCCCCCC,0.020900000 +ClC1=CC=C([N+](=O)[O-])C=C1C=O,0.020900000 +CCOC(=O)C(CC1=CC=CC=C1)C(=O)OCC,0.021700000 +C1=CC=CC=C1NC2=CC=CC=C2,0.022400000 +OC1=C(OC)C=C(Cl)C(Cl)=C1,0.023200000 +C1(C=O)=CC=C(OC2=CC=CC=C2)C=C1,0.023200000 +C1=CC=CC=C1OC2=CC=CC=C2,0.023500000 +CCCCSCCCC,0.024500000 +OC1=C(C=C(C=C1Cl)Cl)Cl,0.024800000 +C=CC(=O)OCC(O)C,0.026000000 +C(O)C#C,0.026400000 +C1(C)(C)CCCC(C)=C1C=CC(C)=O,0.026500000 +C=C(C)C(=O)OCC1=CC=CC=C1,0.026500000 +C1=CC=CC=C1OC2=CC=C(O)C=C2,0.026600000 +COC(=O)C1=CC=C(C(=O)OC)C=C1[N+]([O-])=O,0.027300000 +O1COC2=CC=C(/C=C/C=C/C(=O)N3CCCCC3)C=C12,0.027500000 +C1=C(C(=O)C)C=C([N+]([O-])=O)C(Cl)=C1,0.027600000 +O=CC1=CC=C(N(CC)CC)C=C1O,0.027700000 +CCCCOCCOP(=O)(OCCOCCCC)OCCOCCCC,0.028100000 +C1=CC(O)=CC=C1OC2=CC=C(O)C=C2,0.028600000 +CCCCCC,0.029000000 +CC(=O)OCCCCCC,0.030500000 +S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC,0.030700000 +O=C(C(=NOC(=O)NC)SC)N(C)C,0.030900000 +CC(=O)CCCCCCCC,0.030900000 +CCC1=CC(CC)=CC=C1,0.030900000 +OC1=CC=CC2=CC=CC=C12,0.032100000 +CCSCCCCSCC,0.034000000 +CC(C)=CC=C(C)C,0.034300000 +C(C1=CC=C(O)C=C1)(C)(C)C,0.034300000 +CCCCOP(=O)(OCCCC)OCCCC,0.035600000 +OC1=C(C=CC=C1)C2=CC=CC=C2,0.036100000 +C1=C(/C=C/C=O)C=CC(N(C)C)=C1,0.036700000 +ClC(C(Cl)Cl)(Cl)Cl,0.037200000 +CC(C)CC=O,0.037700000 +CCCCCCCCC#N,0.037700000 +C1(Br)=CSC=C1,0.038000000 +CCCCOC1=CC=CC=C1,0.038000000 +OC1=CC(C)=C(Cl)C=C1,0.038400000 +C1=C(Cl)C(Cl)=CC=C1NC(=O)CC,0.039400000 +CCCCCCCCCO,0.039500000 +CCCCCCCCN,0.040200000 +CCCCCCC(C)N,0.040200000 +C=CC(=O)OCCO,0.041400000 +CC(C)OC1=CC=CC=C1OC(=O)NC,0.042100000 +CCCSCCSCCC,0.042200000 +O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC,0.042700000 +COC(=O)C1=CC=C(C(=O)OC)C=C1N,0.042700000 +O=C(OC1=C2C(=CC=C1)C=CC=C2)NC,0.043500000 +OC1=CC(C(F)(F)F)=C([N+]([O-])=O)C=C1,0.044100000 +C1(C=O)=CC=C(C(C)C)C=C1,0.044700000 +NC1=C(Cl)C=CC=C1,0.045000000 +C1=C(Br)C(O)=C(Br)C=C1C#N,0.045500000 +C1=C(N)C=CC=C1OCC2=CC=CC=C2,0.045900000 +NC1=CC(Cl)=C(Cl)C=C1,0.046700000 +ClC1=C(C=CC(=C1)Cl)O,0.047500000 +OC1=CC=C(Cl)C=C1,0.047500000 +C1=C2C(=CC=C1)C=CC=C2,0.047900000 +CC(C)(C)C1=CC=C(OC(=O)NC)C=C1,0.048200000 +C1=CC=CC=C1C(C)C,0.052600000 +C1(=NC=CC=C1C2CCCN2C).OS(O)(=O)=O,0.053000000 +C(C1=CC=CC=C1)(C2=CC=CC=C2)(O)C#C,0.053300000 +C1CCCCC1,0.053800000 +ClC1=CC(Cl)=CC=C1,0.054600000 +CC(C)SSC(C)C,0.055300000 +CSCCCCCCSC,0.056600000 +CCOC(=O)N(C(=O)OCC)C(=O)OCC,0.057000000 +OC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],0.059200000 +C1(C=O)=C(Cl)C=CC=C1F,0.059300000 +OC1=C(C)C(C)=CC=C1C,0.060200000 +ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl,0.060900000 +CCCCCC(=O)OCC,0.061700000 +O=P(OCC)(SCCSCC)OCC,0.061900000 +ClC1=C(C=CC=C1)Cl,0.064000000 +C1=CC(Cl)=CC=C1C(=O)OC,0.064000000 +CC1=C(C=CC(=C1)C)C,0.064200000 +C=CC(Cl)C(Cl),0.065400000 +CC(=O)C(C)CN(C)C,0.065800000 +O=CC1=CC=C([N+](=O)[O-])C=C1,0.066800000 +CC1=CNC2=C1C=CC=C2,0.067391147 +NC1=CC=C(CCCC)C=C1,0.068000000 +C1(Cl)=CC=C(Cl)C=C1C(=O)OC,0.068300000 +C1=C(C(=O)C)C(Cl)=CC(Cl)=C1,0.068900000 +C1=CC(Br)=CC=C1C(=O)C2=CC=CN=C2,0.077800000 +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C,0.078200000 +C1=CC=CC=C1C(=O)C2=CC=CC=C2,0.080700000 +OC1=CC=C(CCC)C=C1,0.080800000 +NC1=C([N+]([O-])=O)C=C([N+]([O-])=O)C=C1,0.080800000 +CC1=CC=C(C)C=C1,0.083500000 +OC1=C(C=CC=C1)O,0.083700000 +[Na+].[N-]=[N+]=[N-],0.084000000 +C=C(C)C(C)=C,0.084100000 +OC1=CC=C(CC)C=C1,0.085100000 +NC1=C(C(C)C)C=CC=C1C(C)C,0.086300000 +OC1=CC=CC=C1Cl,0.088700000 +CCOC(=O)CCCCC(=O)OCC,0.089900000 +[O-]C(N1)=NC(C(C(CCC)C)(CC=C)C1=O)=O.[Na+],0.090700000 +CCOC(=O)CC(=O)OCC,0.091800000 +O=CC1=CC=CC=C1,0.093000000 +C1(C=O)=C(O)C=C(O)C=C1,0.095000000 +C1(C=O)=C([N+]([O-])=O)C=CC=C1,0.095300000 +OC1=C(C)C=C(C)C=C1C,0.095400000 +CCC1=CC=CC=C1,0.098900000 +[S-]C1=NC(C(C(C)CCC)(CC)C(N1)=O)=O.[Na+],0.099100000 +ClC(=C(Cl)Cl)Cl,0.099500000 +N#CC1=C(Cl)C=CC=C1C,0.099600000 +N1=CC=C(C2=CC=CC=C2)C=C1,0.104000000 +CCCCCCCCO,0.104000000 +CCCCCCC1OC(=O)CC1,0.106000000 +C1C2C=CC1CC2,0.106000000 +CCCCCCCC(=O)C,0.107000000 +CCN(CC)C1=CC=CC=C1,0.110000000 +O=C(CC1C2)C(C2)(C1(C)C)C,0.112000000 +C=CCC1=CC=CC=C1O,0.112000000 +NC1=C(Cl)C=C([N+]([O-])=O)C=C1,0.116000000 +CC(C=O)CC,0.116000000 +ClC1=CC([N+](=O)[O-])=CC=C1,0.119000000 +C1=COC2=C1C=CC=C2,0.119000000 +Cl[C@@H]1CCCC[C@H]1Cl,0.120000000 +C1[C@H](C[C@H]([C@@H](C1)C(C)C)O)C,0.121000000 +C1(C=O)=C(OC)C=C(OC)C=C1,0.121000000 +ClC(C(Cl)Cl)Cl,0.121000000 +C1=CC=CC(O)=C1C(=O)OCC,0.122000000 +C1([N+](=O)[O-])=CC(Cl)=CC=C1C(=O)OC,0.128000000 +OC1=C(C)C=CC=C1,0.129000000 +C1=C(Cl)C(O)=C(Cl)C=C1C#N,0.129000000 +CN(C)N,0.131000000 +C1=CC([N+](=O)[O-])=CC=C1C(=O)OC,0.131000000 +CC1=C(OC)C=CC=C1OC,0.133000000 +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-],0.133000000 +C1=CC(=CC=C1C=O)N(CC)CC,0.135000000 +OC1=C(C)C=C(C)C=C1,0.136000000 +CCN(CC)C1CCCCC1,0.138000000 +S(=O)(C)C1=CC=C(OP(=S)(OCC)OCC)C=C1,0.140000000 +CCC(C)C(C)C=O,0.140000000 +NC1=C([N+]([O-])=O)C=C(OCC)C=C1,0.143000000 +CCOC(=O)C1=CC=CC=C1C(=O)OCC,0.143000000 +C(O)C#CC,0.144000000 +CCCCC=O,0.150000000 +ClC1=CC=CC=C1,0.150000000 +NC1=CC=C(F)C=C1,0.152000000 +N1=CC(C=O)=CC=C1,0.153000000 +OC1=CC=C(C)C=C1,0.153000000 +CC1=C(C)C=CC=C1,0.154000000 +C1=CC=CC=C1N(C2=CC=CC=C2)C=O,0.154000000 +CC(=O)OCCCC,0.155000000 +NC1=C(C(F)(F)F)C=C(F)C=C1,0.165000000 +NC13CC(CC(C3)C2)CC2C1,0.165000000 +CC(O)C#C,0.167000000 +NC1=CC(C(F)(F)F)=C(F)C=C1,0.168000000 +ClCCOC(=O)NC1CCCCC1,0.170000000 +C=C(C)C(=O)OCCOCC,0.175000000 +CCCCCC=O,0.175000000 +CC1=C(F)C=CC=C1,0.176000000 +ClCCCCCCl,0.179000000 +OC1=C(NC(=O)C)C=CC=C1,0.179000000 +C1=CC(C(C)(C)C)=CC=C1C(=O)N,0.180000000 +CCCSCCC,0.184000000 +C1(C=O)=CC=C(OCC)C=C1,0.187000000 +CC1=CC([N+](=O)[O-])=CC=C1,0.187000000 +C1(N)=CC=C(Cl)C=C1C#N,0.187000000 +CC(C=O)CCC,0.188000000 +C1=CN=CN1S(=O)(=O)C2=CC=C(C)C=C2,0.188000000 +CCCCCCCN,0.189000000 +CC(C)(C)CC(C)(C)N,0.190000000 +C1=CC=CC=C1P(=O)(C2=CC=CC=C2)C3=CC=CC=C3,0.193000000 +CC(C(C(NC([O-])=N1)=O)(C1=O)CC)CCC.[Na+],0.199000000 +CC(C)(C)SC(C)(C)C,0.199000000 +FC1=CC=C([N+](=O)[O-])C=C1,0.201000000 +NC1=C(F)C(F)=C(F)C(F)=C1F,0.203000000 +C=C(C)C(=O)OCC1OCCC1,0.204000000 +CCCC=O,0.204000000 +OC1=C([N+]([O-])=O)C=CC=C1[N+]([O-])=O,0.216000000 +C1=CC(N)=CC=C1C(=O)OCC,0.216000000 +CCC(CCCC)CO,0.217000000 +CCCCC(=O)CCCC,0.218000000 +C1=CC=CC=C1,0.225000000 +OC1=C(C=C(C=C1)N)[N+](=O)[O-],0.235000000 +CC=CC=CC,0.243000000 +NC1=CC=C(C=C1)Cl,0.246000000 +C1=CC=CC(=C1C(F)(F)F)C#N,0.247000000 +CCCCOCCCC,0.248000000 +C1(C=O)=C([N+](=O)[O-])C=CC(O)=C1,0.251000000 +[C@H]1(CCCC[C@H]1O)C2=CC=CC=C2,0.252000000 +C1(C=O)=C(OC)C=C(OC)C(OC)=C1,0.252000000 +NC1=C(Cl)C=C(C)C=C1,0.254000000 +C1(OC)=CC(C=O)=CC(Br)=C1O,0.258000000 +C1(OC)=C([N+]([O-])=O)C(C=O)=CC(Br)=C1O,0.266000000 +BrCCCC,0.268000000 +C1=CC=CC=C1CN2CCNCC2,0.269000000 +C=CCNC1=CC=CC=C1,0.270000000 +C1(O)=CC(O)=CC=C1C(=O)OC,0.272000000 +CC1=C(NC=O)C=CC=C1Cl,0.275000000 +NC1=CC=C(Br)C=C1,0.276000000 +C(F)(F)(F)C1=CC(C#N)=CC=C1,0.279000000 +CN(C)CC1=CC=CC=C1,0.280000000 +CC(=O)CCCCCC,0.281000000 +C1=CC(C#N)=CC=C1C(=O)OC,0.290000000 +OCCN(CC)C1=CC(C)=CC=C1,0.295000000 +C=C(C)C(=O)OC(C)C,0.296000000 +O=C(C(C(C1C2)(C)C)(C2)C)C1Br,0.296000000 +CCCCCCCO,0.297000000 +O=C(OCC)C1=CC(N)=CC=C1.OS(C)(=O)=O,0.302000000 +C=CC(O)CCC,0.304000000 +CN(C)C1=CC=C(C=O)C=C1,0.306000000 +CNC1=CC=C(F)C=C1,0.307000000 +CC(=O)OCCOCC,0.319000000 +OC1=CC=C([N+](=O)[O-])C=C1,0.322000000 +BrCC(Br)CO,0.326000000 +ClC(=CCl)Cl,0.336000000 +OC1=CC=CC=C1,0.347000000 +C1=CC=C(CS(=O)CC2=CC=CC=C2)C=C1,0.348000000 +C#CC(CCC(C)C)(C)O,0.349000000 +CC(Cl)(Cl)Cl,0.355000000 +CCCN(CCC)CCC,0.355000000 +ClC(Cl)(C(C)(O)C)Cl.ClC(Cl)(C(C)(O)C)Cl.[H]O[H],0.362000000 +CN(C)C1=CC=C(C)C=C1,0.362000000 +CCNC1=CC(C)=CC=C1,0.366000000 +CC1=CC=CC=C1,0.368000000 +N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O,0.377000000 +C1(C#N)=CC=CC=C1C,0.382000000 +C1CC(CCC1(N)C)C(C)(N)C,0.383000000 +C=CC(O)CC=C,0.388000000 +ClCC(Cl)CCl,0.391000000 +CCSCCSCC,0.401000000 +C1=CC=CC=C1CCC(C)(C)O,0.404000000 +O=C1C3CC2CC1CC(C3)C2,0.405000000 +ClCCCCCl,0.406000000 +O[C@H]1[C@@]([C@@](C)2C)(C)CC[C@H]2C1,0.410000000 +OC(C)CC#C,0.417000000 +C1(O)=CC(OC)=CC=C1C(=O)C,0.418000000 +CCNCC1=CC=CC=C1,0.422000000 +C1=CC=CC=C1S(=O)C2=CC=CC=C2,0.432000000 +C1(C=O)=C(C)C=CC=C1,0.440000000 +C1=CC=C(Br)C=C1C(=O)N,0.463000000 +C1(Cl)=CC(Cl)=CC=C1C(=O)N,0.503000000 +COCCCNCC1=CC(OC)=C(OC)C(OC)=C1,0.505000000 +C(O)CC#C,0.515000000 +O=CC1=CC(OCC)=C(O)C=C1,0.527000000 +CN(C1=CC=CC=C1)C,0.529000000 +BrCCC,0.547000000 +C1(C=O)=CC(OC)=C(O)C=C1,0.551000000 +CCCCCCN,0.559000000 +C1=CC=CC=C1C(=O)C2=CC=NC=C2,0.562000000 +C(=O)N(CCCC)CCCC,0.568000000 +CCN(CC)C(=O)C1=CC=CC(C)=C1,0.575000000 +CC(=O)OCCC,0.587000000 +ClC(Cl)Cl,0.592000000 +OC1=CC(OC)=CC=C1,0.596000000 +N1=CC=CC2=C1C=CC=C2,0.602000000 +NC1=CC=C(CC)C=C1,0.602000000 +ClC(CCl)Cl,0.612000000 +C(O)C#CC(O),0.623000000 +CCCCCCCCC(=O)O,0.657000000 +CC2(C)OC1(C)CCC2CC1,0.661000000 +ClCCO,0.667000000 +N1=C(C)C=CC(CC)=C1,0.669000000 +O=C(CC/C=C(C)/C)C,0.679000000 +C1COC2=CC=CC=C12,0.680000000 +CC[N+](CC)(CC)CC1(=CC=CC=C1).[Cl-],0.707000000 +BrC1=C(C)NC(=O)N(C(C)CC)C1=O,0.712000000 +C1(O)=CC=CC=C1C(=O)N,0.736000000 +O1C(C)=CC=C1C,0.740000000 +CC=O,0.767000000 +CC(C1=CC=CC=C1)(O)C#C,0.773000000 +O=C1C2=C(N=CN2C)N(C(=O)N1C)C,0.778000000 +ClC1=CC=CC=[N+]1C.[I-],0.779000000 +C1(OC)=CC=CC=C1C(=O)N,0.794000000 +C1=CC([N+]([O-])=O)=CC=C1C(=O)N,0.801000000 +C1=CN=CC=C1CCC2=CC=NC=C2,0.820000000 +CN(CCCCl)C.[H]Cl,0.841000000 +COC1=CC=C(OC)C=C1,0.847000000 +CC(=O)C(C)(C)C,0.869000000 +COC1=CC=C(C=C1)O,0.886000000 +C1=COC=C1,0.896000000 +ClCCN1CCCC1.[H]Cl,0.900000000 +O=[N+](C1=CC=C(C=C1)N)[O-],0.905000000 +C[N+](C1=CC=CC=C1)(C)C.[I-],0.924000000 +C(C(=O)O)[N+]1(=CC=CC=C1).[Cl-],0.933000000 +C1=CC=C(NC)C=C1,0.933000000 +C1(OC)=C(OC)C(OC)=CC=C1C(=O)C,0.947000000 +NCC1=CC=CC=C1,0.952000000 +CCCCCCO,0.956000000 +O=[N+](C1=CC=CC=C1)[O-],0.967000000 +C1=CC(=CC=C1N)C(=O)CC,0.979000000 +ClCCCCl,0.982000000 +CC1=CC(Cl)=NC(N)=N1,0.982000000 +C[N+](C1=CC=CC=C1)(C)C.[O-]S(=O)(=O)OC,1.003000000 +N1=C(N)C=CC(Br)=C1,1.023000000 +N1=C(N(C)C)C=CC=C1,1.040000000 +N1=C(O)C(C#N)=C(C)C=C1C,1.060000000 +N1=CC=CC(=C1)CCCO,1.093000000 +CC(Cl)CCl,1.124000000 +NC1=CC=CC=C1,1.130000000 +BrCC1OCCCC1,1.145000000 +CCCCCC(=O)C,1.147000000 +OC1=C([N+]([O-])=O)C=CC=C1,1.150000000 +C(F)(F)(F)CO,1.190000000 +N1=C([N+]([O-])=O)C(O)=CC=C1,1.192000000 +N1=CC=CC=C1,1.262000000 +CN1C(C(=O)C)=CC=C1,1.275000000 +CC=NO,1.287000000 +CC1(C)CCC(C)(C)O1,1.310000000 +C1=CC=CC=C1C(=O)C,1.348000000 +CC(=O)CC(=O)C,1.348000000 +ClCCCl,1.374000000 +OCCN(C(C)C)C(C)C,1.384000000 +N1=CC=C(C(=O)C)C=C1,1.387000000 +CC(=O)CCC(C)C,1.392000000 +CC(C)C(O)C(C)C,1.403000000 +C(F)(F)(F)C(O)C(F)(F)(F),1.452000000 +CCOP(=O)(CC1=CC=CC=C1)OCC,1.472000000 +NC1=CC=C(C)C=C1,1.493000000 +N1=CC(C)=CC=C1,1.546000000 +N1=C(O)C=CC=C1Cl,1.652000000 +C=C(C)C(=O)OCCO,1.744000000 +[H]Cl.C1=CC=CC=C1CC2=NCCN2,1.800000000 +N1=C(C)C=CC=C1Cl,1.819000000 +C#CC(C)(O)C(C)C,1.828000000 +ON=C1CCCCC1,1.838000000 +C(Cl)(Cl)C(=O)N,1.883000000 +N1=C(C(=O)O)C=CC=C1C(=O)O,1.927000000 +C(Cl)(Cl)(Cl)CO,2.001000000 +CCCCCN,2.031000000 +O[C@H]1[C@H](CC2)C[C@H]2C1,2.033000000 +C1CCCC(C#C)(O)C1,2.061000000 +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,2.080000000 +CC(=O)CCCN(CC)CC,2.137000000 +C#CCN(CC#C)CC#C,2.256000000 +CCOC(OCC)CN(C)CC(OCC)OCC,2.411000000 +C1(Cl)=CC=CC(Cl)=C1C(=O)N,2.468000000 +C1=CC=CC=C1OCCO,2.490000000 +OC(C)CCl,2.591000000 +CC(=O)OCC,2.610000000 +N1=C(Br)C(O)=CC=C1,2.695000000 +CC/C=C/CCO,2.706000000 +C=CCC#N,2.713000000 +CCCCCC(O)=O,2.755000000 +O=C(OC(C)(C)C)C,2.815000000 +C1=C(C(=O)C)C=C(N)C=C1,2.826000000 +C1(N)=CC=CC=C1C(=O)N,2.901000000 +N1C=CC=C1,3.130000000 +CC(C)C(C)N,3.258000000 +C1(=CC=CC=C1)C(=O)[O-].[Na+],3.359000000 +N1CC(C)OC(C)C1,3.360000000 +CC1=NC=CN1,3.483000000 +CC(C)(O)C(F)(C(F)F)F,3.635000000 +NCCN,3.661000000 +CCCCN,3.664000000 +CCC(N)C,3.760000000 +CC\C=C/CCO,3.804000000 +N1=C(CC)C=CC=C1,3.864000000 +N#CCCCCCCC#N,3.877000000 +ClCCl,3.885000000 +CC1=C(C)OC(C)=N1,4.040000000 +C1=CC=CC=C1N(CCO)CCO,4.056000000 +[N+](C)(C)(C)C.[Cl-],4.215000000 +CCCCC(=O)C,4.273000000 +N1=CC=C(C)C=C1,4.327000000 +N1=C(Cl)C(O)=CC=C1,4.801000000 +CC(=O)OC,4.819000000 +CCCN,5.211000000 +CC(=O)CC(C)C,5.212000000 +CCCCCO,5.355000000 +C1(=CC=C(C=C1)O)NC(C)=O,5.385000000 +CC(C)(C)CN,5.449000000 +C1=CC=CC=C1C(=O)N,5.460000000 +O=C1CCCCC1,6.327000000 +CCC(O)(C)CC,6.577000000 +N1=C(C#N)C=CC=C1,6.973000000 +COCCN,6.976000000 +C1CCCCC1O,7.029000000 +OC1=CC(NC(=O)C)=CC=C1,7.475000000 +CC(OC)(C)C,7.623000000 +NC1=NN=C(C)C(C)=N1,7.668000000 +CC(C)OC(C)C,7.693000000 +N1=C(O)C=CC(Cl)=C1,8.800000000 +N1=C(C)C=CC=C1,9.632000000 +C1C(=CC=C[N+]=1CC2C=CC=CC=2)S(=O)(=O)[O-],9.670000000 +CCC(C)=NO,9.676000000 +CC(=O)C(C)C,10.030000000 +CCNCC,11.690000000 +C#CC(O)(C)CC,12.430000000 +[O-]C(C1=CC=CC=C1O)=O.[Na+],12.500000000 +NCC(N)C,13.630000000 +CCCC(=O)C,14.400000000 +CCN(CCO)CC,15.190000000 +C(CN(C1)C2)N(C1)C2,15.420000000 +NCCCN1CCN(CCCN)CC1,15.470000000 +NCCCN,16.050000000 +CCNCCO,16.600000000 +CC1=COC=N1,16.730000000 +NCCN1CCNCC1,16.950000000 +N#CCCCCC#N,17.850000000 +CCC(=O)CC,17.880000000 +OCC(C)C,19.290000000 +OCCN1CCOCC1,20.660000000 +N1CC(C)NCC1,22.360000000 +C1C(=O)N(CC)C(=S)N(CC)C1=O,22.520000000 +CN1CCNCC1,22.960000000 +CCCCO,23.340000000 +CCC#N,27.600000000 +C1CCCO1,29.960000000 +OC(C)CN,33.550000000 +OCCN,33.890000000 +O(CC)CC,34.500000000 +CC(O)(C)C#C,39.110000000 +CC#N,40.050000000 +CCC(=O)C,44.660000000 +OCCNCCO,44.800000000 +OCCN1CCNCC1,49.240000000 +CC(O)CC,49.510000000 +CCC([O-])=O.[Na+],49.860000000 +NC(=O)OCC,58.800000000 +C1OCOCO1,66.050000000 +OCCC,75.700000000 +OCCN(CCO)CCO,79.090000000 +O=S(C1=CC=CC=C1C([N-]2)=O)2=O.[Na+].[O],82.000000000 +O=C(CC(=O)C1)CC1(C)C,82.040000000 +CC(C)(C)O,86.480000000 +C[C@](CC(O)C)(C)O,90.540000000 +C1COCCO1,116.900000000 +CC(=O)C,123.000000000 +CC1(C)OCC(CO)O1,126.400000000 +CC1(C)NC(=O)NC1=O,128.500000000 +OC(C)C,144.000000000 +CCOCCOCCO,197.500000000 +CCO,319.000000000 +C1N2CN3CN(C2)CN1C3,355.200000000 +CS(=O)C,435.000000000 +OCCOCCOCCO,458.800000000 +OCCOCCO,708.600000000 +CO,917.000000000 diff --git a/test/data/FDA_v3b_Maximum_Recommended_Daily_Dose_mmol.csv b/test/data/FDA_v3b_Maximum_Recommended_Daily_Dose_mmol.csv new file mode 100644 index 0000000..7bfe9e8 --- /dev/null +++ b/test/data/FDA_v3b_Maximum_Recommended_Daily_Dose_mmol.csv @@ -0,0 +1,1217 @@ +STRUCTURE_SMILES,Dose_MRDD_mmol +C1=C(OC)C=C3C(=C1)N(C(=O)C2=CC=C(Cl)C=C2)C(C)=C3CC(=O)OCC(O)=O,0.0072145956464436 +C1=CC=C3C(=C1)OC(=O)C(C(CC(C)=O)C2=CC=C(N(=O)=O)C=C2)=C3O,0.0005660502850771 +C1(=CC=C(C=C1)O)NC(C)=O,0.3307696480478640 +C1=CC=CC=C1NC(C)=O,0.0369923174355150 +N1N=C(S(N)(=O)=O)SC=1NC(C)=O,0.0751421491482570 +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2,0.0770664679790367 +CC(=O)NO,0.2224691140933520 +C1=CC=C3C(=C1)N(CCCN2CCN(CCO)CC2)C4=C(S3)C=CC(C(C)=O)=C4,0.0242977784103839 +[Na+].O=S(=O)([N-]C(C)=O)c1cc(N)ccc1S(=O)(=O)c2ccc(N)cc2,0.1704148436387600 +C1(I)=CC(I)=C(NC(C)=O)C(I)=C1C(O)=O,0.1795776244484160 +CC(=O)N[C@@H](CS)C(=O)O,0.0612764246921932 +CC(=O)O[C@H]1C[C@@H](O[C@H](C)[C@H]1O)O[C@H]2[C@@H](O)C[C@@H](O[C@@H]2C)O[C@@H]8[C@@H](C)O[C@@H](O[C@@H]5C[C@H]6CC[C@H]4[C@@]7(O)CC[C@H](C=3COC(=O)C=3)[C@@]7(C)CC[C@@H]4[C@@]6(C)CC5)C[C@@H]8O,0.0000041265181033 +C1=CC=C2C(=C1)N(CCCN(C)C)C3=C(S2)C=CC(C(C)=O)=C3,0.0004594803008236 +C1(C)=C(OC)C=C(C)C(C=CC(C)=CC=CC(C)=CC(O)=O)=C1C,0.0038293126469575 +COC(=O)[C@@H]4c3cc2C(=O)c1cccc(O)c1C(=O)c2c(O)c3[C@H](C[C@]4(O)CC)O[C@@H]7O[C@@H](C)[C@@H](O[C@H]6C[C@H](O)[C@H](O[C@H]5CCC(=O)[C@H](C)O5)[C@H](C)O6)[C@H](C7)N(C)C,0.0033256641055604 +C(=CCN1CCCC1)(C2=CC=C(C)C=C2)C3=CC=CC(C=CC(O)=O)=N3,0.0015296832011741 +N1C(N)=NC2=C(C1=O)N=CN2COCCO,0.0590573977516627 +NC1=NC=NC2=C1N=CN2,0.1110069290525110 +NC1=NC=NC2=C1N=CN2[C@@H]3O[C@H](CO)[C@@H](O)[C@H]3O,0.0074838726286788 +OP(O)(=O)OP(O)(=O)OP(O)(=O)OC[C@H]3O[C@@H](n2cnc1c(N)ncnc12)[C@H](O)[C@@H]3O,0.0003943365207495 +OP(O)(=O)OC[C@H]3O[C@@H](n2cnc1c(N)ncnc12)[C@@H](O)[C@@H]3O,0.0009590427654190 +C2=CC=CC(C(C(=O)OCCN(CC)CC)C1=CC=CC=C1)=C2,0.0240833863167832 +C1(N)=CC=C3C(=C1)C(=O)N(C2=CC=CC=C2C)C(CF)=N3,0.0035298233005754 +COC(=O)NC=1Nc2ccc(cc2N=1)SCCC,0.0501259933803538 +OC(C1=CC=C(C(=C1)CO)O)CNC(C)(C)C,0.0022272012729730 +C=CCN1C(=O)C(CC(C)C)NC1=S,0.1884021519293790 +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl,0.0073679872864718 +[C@]12([C@]([C@@]3(CCC4[C@@]([C@@]([C@H](C1)O)3[H])(CCC(=O)C=4)C)[H])(CC[C@H]2C(=O)CO)[H])C=O,0.0000231103860794 +OC(P(O)(O)=O)(CCCN)P(O)(O)=O,0.0026776820484366 +O[C@@H]3C\C(=C\C=C2/CCC[C@@]1(C)[C@H]2CC[C@@H]1[C@H](C)CCCC(C)C)C(=C)[C@@H](O)C3,0.0000074880741188 +N3=NN(CC)C(=O)N3CCN2CCC(COC)(N(C1=CC=CC=C1)C(=O)CC)CC2,0.0005882110312953 +C2=CC=C(Cl)C(N(CC=C)C1=NCCN1)=C2Cl,0.0049230501353062 +O=C1NC(=O)NC(=O)C1(CC=C)CC=C,0.0159931700998992 +N1C=NC2=C(C=1O)C=NN2,0.0977140065314099 +C=CC[C@]2(O)CC[C@H]3[C@@H]4CC\C1=C\CCC[C@@H]1[C@H]4CC[C@]23C,0.0008320071693725 +O=C(CC)O[C@@]1([C@@]2=CC=CC=C2)[C@@H](C)CN(C)CC1,0.0019130752186741 +CC(=O)[C@H]1CC[C@H]2[C@@H]3CC[C@H]4C[C@H](O)CC[C@]4(C)[C@H]3C(=O)C[C@]12C,0.0020302157460646 +C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2)=NN=C4C,0.0005408645515818 +O[C@@H]1CC(=O)[C@H](CCCCCCC(O)=O)[C@H]1/C=C/[C@@H](O)CCCCC,0.0000002821025987 +N1=C(N(C)C)N=C(N(C)C)N=C1N(C)C,0.0257276747032757 +NC13CC(CC(C3)C2)CC2C1,0.0440988819908629 +C1C(=NNC(N)=N)C=CC(=NNC(N)=S)C=1,0.0007037954889996 +[Cl-].[Cl-].Clc2ccccc2C[N+](CC)(CC)CCNC(=O)C(=O)NCC[N+](Cc1ccccc1Cl)(CC)CC,0.0027445858196487 +O[C@@H]2CC[C@@H](NCc1cc(Br)cc(Br)c1N)CC2,0.0052895664729504 +O=C(O)[C@@H]2N3C(=O)[C@@H](/N=C/N1CCCCCC1)[C@H]3SC2(C)C,0.0460933688174427 +P(O)(=O)(O)SCCNCCCN,0.1148336288751050 +NCC[C@H](O)C(=O)N[C@@H]3C[C@H](N)[C@@H](O[C@H]1O[C@H](CN)[C@@H](O)[C@H](O)[C@H]1O)[C@H](O)[C@H]3O[C@H]2O[C@H](CO)[C@@H](O)[C@H](N)[C@H]2O,0.0256146438714096 +OC(=O)CCCCCN,1.5246900686263000 +C3=C(C(=O)NC(CCC(O)=O)C(O)=O)C=CC(NCC1=NC2C(N=C1)=NC(N)=NC=2N)=C3,0.0000189140776367 +N2C(=O)CCC(C1=CC=C(N)C=C1)(CC)C2=O,0.0718965014129169 +C1=C(N)C=CC(C(=O)NCC(O)=O)=C1,0.0514966735723706 +C1=C(N)C=C(O)C(C(O)=O)=C1,1.3060339158723500 +C1=CC=C3C(=C1)OC(CCCC)=C3C(=O)C2=CC(I)=C(OCCN(CC)CC)C(I)=C2,0.0413753603685413 +C1=C(NC(C)=O)C=CC(C=NNC(N)=S)=C1,0.0105800634025111 +C1=CC=C2C(=C1)CCC3=C(C2=CCCN(C)C)C=CC=C3,0.0180242976183558 +C1=C(C(C)C)C=C2C(=C1)OC3=C(C2=O)C=C(C(=O)O)C(N)=N3,0.0083810112300187 +C2=C(Cl)C(C1C(C(=O)OC)=C(C)NC(COCCN)=C1C(=O)OCC)=CC=C2,0.0004084368875740 +C1(Cl)=CC=C3C(=C1)N=CC=C3NC2=CC(CN(CC)CC)=C(O)C=C2,0.0093575815153538 +C1=C(Cl)C=C3C(=C1)OC4=C(N=C3N2CCNCC2)C=CC=C4,0.0318693164261086 +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=C(O)C=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O,0.0596018595780188 +C1=CC=CC(CC(N)C)=C1,0.0073961094393438 +O[C@H]3[C@@H](N)[C@H](O)[C@@H](C)O[C@H]3O[C@H]1/C=C/C=C/C=C/C=C/C=C/C=C/C=C/[C@H](C)[C@@H](O)[C@@H](C)[C@H](C)OC(=O)C[C@H](O)C[C@H](O)CC[C@@H](O)[C@H](O)C[C@H](O)C[C@]2(O)C[C@H](O)[C@@H](C(O)=O)[C@H](C1)O2,0.0016232378400548 +O=C(O)[C@@H]2N3C(=O)[C@@H](NC(=O)[C@H](N)c1ccccc1)[C@H]3SC2(C)C,0.1668551968210160 +C2(N)C(=O)NC=C(C1=CC=NC=C1)C=2,0.0040064539164850 +C4=C(OC)C(NC1C3C(N=C2C=1C=CC=C2)=CC=CC=3)=CC=C4NS(=O)(=O)C,0.0082346593252815 +CC(C)CCON=O,0.0426816724045062 +CCC(C)CON=O,0.0426816578307099 +C2=C(C(C)(C)C#N)C=C(C(C)(C)C#N)C=C2CN1N=CN=C1,0.0000569254283025 +N=C\2/N=C3/O[C@H]1[C@H](O)[C@@H](CO)O[C@H]1N3/C=C/2,0.0888094340485601 +O[C@@H]3C\C4=C\C[C@@H]1[C@H](CC[C@]2(C)[C@@H](O)CC[C@@H]12)[C@@]4(C)CC3,0.0086076209121117 +C3=CC=C(C2(C(=O)OCC)CCN(CCC1=CC=C(N)C=C1)CC2)C=C3,0.0094476147070933 +C1=CC=C3C(=C1)C(=O)C(C2=CC=C(OC)C=C2)C3=O,0.0198204520743847 +O=C(C(CCC)CCC)O[C@@H]1C[C@@H](CC2)[N@+](C)(C)[C@H]2C1.[Br-],0.0068994927161779 +C3=CC=CC(CN(CC1NCCN=1)C2=CC=CC=C2)=C3,0.0188428344054780 +OC1=C(O)C=CC2=C1C4=C3[C@@](N(C)CCC3=CC=C4)([H])C2,0.0062471387543385 +C1=CC=C3C(=C1)CC(N(CCCN(CC)CC)C2=CC=CC=C2)C3,0.0155045009566277 +N1C(=O)NC(=O)C(CC=C)(C(C)C)C1=O,0.0127003902777609 +C1CC=C(C(=O)OC)CN1C,0.0002145697084790 +NC(=N)NCCCC(N)C(O)=O,2.8702482466227500 +C2C=C(C1=CSC(SCC(O)CNC(C)(C)C)=N1)SC=2C(=O)N,0.0008962668306395 +OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO,0.5677814677264500 +OC(C[C@@H](C(O)=O)N)=O,0.7512995604146270 +OC(=O)C1=C(C=CC=C1)OC(=O)C,0.3702318084075370 +C1=CC=C5C(=C1)N(CC2=CC=C(F)C=C2)C(NC4CCN(CCC3=CC=C(OC)C=C3)CC4)=N5,0.0003641753510858 +N[C@@H]2CC[C@H](O[C@@H]2O[C@@H]1[C@@H](N)[C@H](O)[C@H](OC)[C@@H](N(C)C(=O)CN)[C@H]1O)[C@@H](N)C,0.0164492464296874 +N[C@@H]2CC[C@H](O[C@@H]2O[C@@H]1[C@@H](N)[C@H](O)[C@H](OC)[C@@H](NC)[C@H]1O)[C@@H](N)C,0.0191425525511857 +C3C=CSC=3C(=C1CN(C)CCC1)C2SC=CC=2,0.0181532891327368 +C1=C(Cl)C=C2C(=C1)C(NC(C)CCCN(CC)CC)=C3C(=N2)C=CC(OC)=C3,0.0125013501458157 +C1=C(CC(N)=O)C=CC(OCC(O)CNC(C)C)=C1,0.0125029999690616 +OC=2C(=O)c1ccccc1C(=O)C=2[C@@H]3CC[C@H](CC3)c4ccc(Cl)cc4,0.1022251108161090 +[O-]S(=O)(=O)c1ccccc1.[O-]S(=O)(=O)c1ccccc1.COc1ccc(cc1OC)CC5c6cc(OC)c(OC)cc6CC[N+]5(C)CCC(=O)OCCCCCOC(=O)CC[N+]3(C)CCc4cc(OC)c(OC)cc4C3Cc2ccc(OC)c(OC)c2,0.0004020976048831 +O=C(O[C@@H]2C[C@@H](CC3)N(C)[C@H]3C2)C(CO)C1=CC=CC=C1,0.0000045961345472 +O=C(O[C@@H]2C[C@@H](CC3)[N@+]([O-])(C)[C@H]3C2)C(CO)C1=CC=CC=C1,0.0001637364286242 +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O,0.0831269832235006 +C1(C)=CC=C2C(=C1)N3N(C(N(C)C)=N2)C(=O)C(CCC)C3=O.O.O,0.0891843997458839 +CC(=O)OC[C@H]2O[C@@H](N1\N=C/C(=O)NC1=O)[C@H](OC(C)=O)[C@@H]2OC(C)=O,0.4578514357197590 +C1=CC=C3C(=C1)C(=C2CCN(C)CC2)C4=C(CC3)C=CC=N4,0.0001146686001698 +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O,0.0180334455494538 +C1=CC=C4C(=C1)C(=O)N(C2CCCN(C)CC2)N=C4CC3=CC=C(Cl)C=C3,0.0003482601108158 +O=C(O)[C@@H]3N4C(=O)[C@@H](NC(=O)[C@@H](NC(=O)N1CCNC1=O)c2ccccc2)[C@H]4SC3(C)C,0.2166887053525920 +Nc1nc(cs1)\C(=N\OC(C)(C)C(O)=O)C(=O)N[C@@H]2C(=O)N([C@H]2C)S(O)(=O)=O,0.3054432420085600 +C(=O)(O)CC(C1=CC=C(Cl)C=C1)CN,0.0062248204841338 +N1(C)C(=O)N(C)C2=C(C1=O)N(CCN(CCO)CC)C(CC3=CC=CC=C3)=N2,0.0778290711712611 +C1(=O)C(CC)(CC)C(=O)NC(=O)N1,0.0542910329455361 +OC(C(=O)OCCN(CC)CC)(C1=CC=CC=C1)C2=CC=CC=C2,0.0004581308140618 +CCOC(=O)[C@H](CCc1ccccc1)N[C@H]3CCc2ccccc2N(CC(O)=O)C3=O,0.0031331751134869 +C2CCCCCC2(CC1=CC=CC=C1)OCCCN(C)C,0.0345476199902755 +C1(S(N)(=O)=O)=C(C(F)(F)F)C=C3C(=C1)S(=O)(=O)NC(CC2=CC=CC=C2)N3,0.0007901957455246 +[O-][N+](=O)c1cccc(c1)[C@@H]/2C(\C(=O)OC)=C(\C)NC(\C)=C\2C(=O)O[C@@H]4CCCN(Cc3ccccc3)C4,0.0002630734447256 +C2(OC(C)=O)=CC=CC=C2C(=O)OC1=CC=C(NC(C)=O)C=C1,0.4245068778093660 +C1=C(C(C)C(O)=O)C=C3C(=C1)OC(C2=CC=C(Cl)C=C2)=N3,0.0331428305528377 +C1(O)=C(O)C=CC(CNNC(=O)C(N)CO)=C1O,0.0129449485933933 +C1=CC=C3C(=C1)OC(CC)=C3C(=O)C2=CC(Br)=C(O)C(Br)=C2,0.0117901342891579 +C1=CC(N)=CC=C1C(=O)OCC,0.0072643006839339 +C1=CC=C2C(=C1)C3(CNC)C4=C(C2CC3)C=CC=C4,0.0040104245371248 +C1(NCCCC)=CC=C(C(=O)OCCOCCOCCOCCOCCOCCOCCOCCOCCOC)C=C1,0.0165633686658697 +C[C@H](N(C)CC2=CC=CC=C2)CC1=CC=CC=C1,0.0104447220605147 +C1(OC)=C(OC)C=C2C(=C1)C3N(CC2)CC(C(=O)N(CC)CC)C(OC(C)=O)C3,0.0010309026544087 +C1(S(N)(=O)=O)=C(Cl)C=C3C(=C1)S(=O)(=O)NC(CSCC2=CC=CC=C2)=N3,0.0077094512037579 +CN1[C@H]2C[C@@H](OC(C4=CC=CC=C4)C3=CC=CC=C3)C[C@H]1CC2,0.0003252780395362 +OCC1=CC=CC=C1,0.0462373009253009 +C[N+](C)(Cc1ccccc1)CCOc2ccccc2,0.1626601812713150 +C[N+](C)(Cc1ccccc1)CCOc2ccccc2.[O-]C(=O)c1cc2ccccc2cc1O,0.0940175611276480 +N(CC(N1CCCC1)COCC(C)C)(CC2=CC=CC=C2)C3C=CC=CC=3,0.0181972172389796 +CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C,0.0000931319646411 +C1=CC=CC(CCNC)=N1,0.0058739618139616 +[O-]C(=O)C[N+](C)(C)C,0.0711076419459626 +F[C@]1([C@](C)2C=C3)[C@@H](O)C[C@@]([C@]([C@@](CO)=O)(O)[C@@H]4C)(C)[C@](C4)([H])[C@@]([H])1CCC2=CC3=O,0.0003822035204638 +F[C@]1([C@](C)2C=C3)[C@@H](O)C[C@@]([C@]([C@@](CO)=O)(O)[C@@H]4C)(C)[C@](C4)([H])[C@@]([H])1CCC2=CC3=O,0.0003452261889677 +CC(C)C(=O)O[C@]4(C(=O)COC(C)=O)[C@@H](C)C[C@@H]1[C@]4(C)C[C@H](O)[C@]2(F)[C@@]3(C)/C=C\C(=O)/C=C3/CC[C@@H]12,0.0002972724755705 +F[C@]1([C@](C)2C=C3)[C@@H](O)C[C@@]([C@]([C@](CO)=O)(OC(C5=CC=CC=C5)=O)[C@H]4C)(C)[C@](C4)([H])[C@@]([H])1CCC2=CC3=O,0.0003020739654155 +CCC(=O)OCC(=O)[C@@]4(OC(=O)CCC)[C@@H](C)C[C@@H]1[C@]4(C)C[C@H](O)[C@]2(F)[C@@]3(C)/C=C\C(=O)/C=C3/CC[C@@H]12,0.0002892323631782 +F[C@]1([C@](C)2C=C3)[C@@H](O)C[C@@]([C@]([C@@](COC(CC)=O)=O)(OC(CC)=O)[C@H]4C)(C)[C@](C4)([H])[C@@]([H])1CCC2=CC3=O,0.0002972724755705 +F[C@]1([C@](C)2C=C3)[C@@H](O)C[C@@]([C@]([C@@](CO)=O)(OC(CCCC)=O)[C@H]4C)(C)[C@](C4)([H])[C@@]([H])1CCC2=CC3=O,0.0003147442027534 +C2CC2COCCC1=CC=C(OCC(O)CNC(C)C)C=C1,0.0021696153919217 +C1(CCN)C=CNN=1,0.0044986254899678 +NC(=O)OC(C)C[N+](C)(C)C.[Cl-],0.0169314790668955 +C1=CC=CC(CNC(NC)=NC)=C1,0.0187874267544241 +O=S(=O)(C[C@](C)(O)C(=O)Nc1ccc(C#N)c(c1)C(F)(F)F)c2ccc(F)cc2,0.0019355286656805 +O=C1N[C@@H]2[C@H](CCCCC(O)=O)SC[C@@H]2N1,0.0000136301881899 +C4=CC(C(O)(CCN1CCCCC1)C23CCC(C=C2)C3)=CC=C4,0.0006421348466482 +C3=CC(C(C1=CC=C(OC(C)=O)C=C1)C2=CC=C(OC(C)=O)C=C2)=NC=C3,0.0006917722818468 +C1=CC(COCCOC(C)C)=CC=C1OCC(O)CNC(C)C,0.0010232205303884 +C(=O)(OC2=C(OC(=O)C1=CC=C(C)C=C1)C=CC(C(O)CNC(C)(C)C)=C2)C3C=CC(C)=CC=3,0.0000801647598142 +C2=CC(OCC(CNC(C)(C)C)OC(=O)C1=CC=CC=C1)=C3C(=C2)NC(C)=C3,0.0000438919236810 +Brc1ccccc1C[N+](C)(C)CC.[O-]S(=O)(=O)c1ccc(C)cc1,0.0120668874327856 +C2(Br)=CC(Br)=C(N)C(CN(C)C1CCCCC1)=C2,0.0021269242017388 +BrC=7Nc1cccc\6c1C=7C[C@@H]2C/6=C/[C@H](CN2C)C(=O)N[C@@]3(O[C@]5(O)N(C3=O)[C@@H](CC(C)C)C(=O)N4CCC[C@H]45)C(C)C,0.0025511977262259 +C2=CC(C(OCCN(C)C)C1=CC=C(Br)C=C1)=CC=C2,0.0074794136618372 +BrC(Br)Br,0.0989195609870748 +C3=C(Br)C=CC(C2(O)CCN(CCCC(=O)C1=CC=C(F)C=C1)CC2)=C3,0.0019818458957020 +C2=CC(C(C1=CC=C(Br)C=C1)CCN(C)C)=NC=C2,0.0012529779370007 +C1=C(Br)SC3=C1C(C2=CC=CC=C2Cl)=NCC4N3C(C)=NN=4,0.0000105921251994 +OCC1=C(C(=C(C(=C1)/N=N/C2=C3C=CC=CC3=C(C=C2)S(=O)(=O)[O-])O)/N=N/C4=C5C=CC=CC5=C(C=C4)S(=O)(=O)[O-])O.[Na+].[Na+],0.0022986387124411 +C4=C(Cl)C=CC(C(C1=CC=CC=C1)N3CCN(CC2=CC=C(C(C)(C)C)C=C2)CC3)=C4,0.0057732984576841 +C2CCCC(C1=C(Cl)C=C(C(=O)CCC(O)=O)C=C1)C2,0.0678487594159660 +O=[C@](CO)[C@]([C@H]2C1)(O[C@@](CCC)([H])O2)[C@](C[C@@H]3O)(C)[C@@]1([C@@]([C@@]([C@](C)4C=C5)3[H])(CCC4=CC5=O)[H])[H],0.0000100571375482 +C2(OC)=CC(OC)=CC(OC)=C2C(=O)CCCN1CCCC1,0.0325325235771331 +C2=CC(N(C(=O)C(CCCC)C(=O)O)NC1=CC=CC=C1)=CC=C2,0.0337020562972629 +S(=O)(=O)(N)C2=C(OC1=CC=CC=C1)C(NCCCC)=CC(C(=O)O)=C2,0.0004582673487807 +C1(OC)=C(OC)C=C3C(=C1)N=C(N2CCCN(C(=O)CCC)CC2)N=C3N,0.0001338869541034 +C1=CC=CC(OCC(O)CNC(C)(C)C)=C1C#N,0.0026860416042474 +O=C2C1=C(CCC2)C(OCC(O)CNC(C)(C)C)=CC=C1,0.0008579705290555 +C2CN(CCCC)C(C(=O)NC1=C(C)C=CC=C1C)CC2,0.0130015251655788 +C1(C)=CC=C(Cl)C(OCC(O)CNC(C)(C)C)=C1,0.0245416398039347 +CC(C)(C)[C@@](C)(O)[C@H]7C[C@]53CC[C@]7(OC)[C@@H]1Oc6c2c(C[C@H]5N(CC[C@@]123)CC4CC4)ccc6O,0.0011397652904646 +C1=CC(Cl)=CC(C(=O)C(C)NC(C)(C)C)=C1,0.0312837447326516 +C3C4(CC(=O)N(CCCCN2CCN(C1=NC=CC=N1)CC2)C3=O)CCCC4,0.0025940125935161 +O(S(=O)(=O)C)CCCCOS(=O)(C)=O,0.0005399879335027 +C1(=O)C(C(C)CC)(CC)C(=O)NC(=O)N1,0.0094230439786655 +C2(C1=CC=CC=C1)N=C(NCCN(CCCC)CCCC)ON=2,0.0126405822353302 +C1(=O)C(CC=C)(CC(C)C)C(=O)NC(=O)N1,0.0222959136852051 +C1=CC=C3C(=C1)N(CCCN2CCN(C)CC2)C4=C(S3)C=CC(C(=O)CCC)=C4,0.0040772734632683 +C1(S(N)(=O)=O)=C(Cl)C=C2C(=C1)S(=O)(=O)NC(CC(C)C)N2,0.0007065231644641 +Oc3ccc4C[C@H]1N(CC[C@@]2(CCCC[C@@]12O)c4c3)CC5CCC5,0.0008153656169664 +C1(CC(C)CN(C)C)C3=C(CCC2=C1C=CC=C2)C=CC=C3,0.0085194614146436 +O=C(O[C@@H]2C[C@@H](CC3)[N@@+](CCC4=CC=C(OCCCC)C=C4)(C)[C@H]3C2)[C@H](CO)C1=CC=CC=C1.[Br-],0.0009148541576096 +CC(C)(C)c1cc(O)ccc1O,0.0012032463586757 +OC[C@H](c1ccccc1)C(=O)O[C@@H]2C[C@@H]3[C@H]4O[C@H]4[C@H](C2)[N+]3(C)CCCC.[Br-],0.0030201793396117 +CCNC(=O)N(CCCN(C)C)C(=O)[C@@H]1C[C@@H]2c3cccc4N\C=C(\C[C@H]2N(C1)CC=C)c34,0.0000442865599059 +O=C1C2=C(N=CN2C)N(C(=O)N1C)C,0.0514957984578038 +O[C@@H]1C/C(C(=C)CC1)=C/C=C3\CCC[C@@]2(C)[C@H]3CC[C@@H]2[C@H](C)CCCC(C)(C)O,0.0000083117622718 +O[C@@H]3C\C(=C\C=C2/CCC[C@@]1(C)[C@H]2CC[C@@H]1[C@H](C)CCCC(C)(C)O)C(=C)[C@@H](O)C3,0.0000001200087002 +C[C@]43CCC(=O)\C=C4\C[C@H](C)[C@@H]1[C@@H]3CC[C@]2(C)[C@@](C)(O)CC[C@@H]12,0.0157989074613121 +C1=C(OC)C(OC)=C2C(=C1)CC3N(C2)CCC4=C3C=C5C(=C4)OCO5,0.0981186442395929 +OC(=O)c4cccc5nc(OCC)n(Cc1ccc(cc1)c2ccccc2C\3=N\N=N/N/3)c45,0.0006061927011674 +OC(=O)CC[C@]2(O)CC[C@H]3[C@@H]4\C=C/C1=C/C(=O)CC[C@]1(C)[C@H]4CC[C@]23C,0.0371020042893265 +O=C1C(C)=C(C(C)(C)CC1)/C=C/C(C)=C/C=C/C(C)=C/C=C/C=C(C)/C=C/C=C(C)/C=C/C(C(C)(C)CC2)=C(C)C2=O,0.0442603450147006 +CCC(C)C(C(=O)NC(N)=O)CC,0.0358118075019240 +C2=CC=CC=C2C1(C(=O)OCCN(CC)CC)CCCC1,0.0172763800648818 +NC(=O)OCC[N+](C)(C)C.[Cl-],0.0003651823037145 +C1=CC=C2C(=C1)N(C(N)=O)C3=C(C=C2)C=CC=C3,0.1130069759587180 +[Na+].NC(=O)N\N=C1/C=C\2/CC(N(C)C/2=C\C1=O)S([O-])(=O)=O,0.0093088804764881 +OC(=O)CCC(=O)O[C@H]3CC[C@]2(C)[C@H]4C(=O)/C=C1/[C@@H]5C[C@](C)(CC[C@]5(C)CC[C@@]1(C)[C@]4(C)CC[C@H]2C3(C)C)C(O)=O,0.0087603016767568 +C2=CC=CC=C2C1(C(=O)OCCOCCN(CC)CC)CCCC1,0.0059976302163489 +Oc1ccc(C[C@](C)(NN)C(O)=O)cc1O,0.0036821064654784 +C1(=S)N(C)C=CN1C(=O)OCC,0.0053696608790672 +C2=CC=C(C(OCCN(C)C)C1=CC=C(Cl)C=C1)N=C2,0.0013755732443576 +OC(=O)CSCC(N)C(O)=O,0.2092700960399070 +O=C(O)CCC/C=C\C[C@@H]1[C@H]([C@H](O)C[C@@H]1O)/C=C/[C@@](CCCCC)(C)O,0.0005427297362762 +BrC(C(=O)NC(=O)N)(CC)CC,0.0704361091768128 +C1=C(N)C=CC(S(=O)(=O)NC(=O)NCCCC)=C1,0.0615473111969891 +CC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(O)cccc2C(=O)c3c(O)c5C4,0.0013164729244363 +N(C(=O)NCCCl)(N=O)CCCl,0.0003891615926940 +C[N+](C)(C)CC(O)CC([O-])=O,0.1035987218275060 +C1=CC=C3C(=C1)N(CCCN2CCN(CCO)CC2)C4=C(S3)C=CC(C(=O)CC)=C4,0.0156724770906920 +C1=CC(OCC(O)CNC(C)(C)C)=C2C(=C1)NC(=O)CC2,0.0005711874707053 +C1C=CC2=C(C=1)C4=C(N2)C=CC=C4OCC(O)CNCCOC3=C(OC)C=CC=C3,0.0010258952695256 +O=C3N1/C(=C(/Cl)CS[C@@H]1[C@@H]3NC(=O)[C@H](N)c2ccccc2)C(O)=O,0.0679703636164322 +O=C3N1/C(=C(/C)CS[C@@H]1[C@@H]3NC(=O)[C@H](N)c2ccc(O)cc2)C(O)=O,0.0459563528025725 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)[C@H](O)c2ccccc2)CSc4nnnn4C)C(O)=O,0.2162149446385960 +[Na+].O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)[C@H](OC=O)c2ccccc2)CSc4nnnn4C)C([O-])=O,0.1951240071602710 +[H][C@]1(NC([C@H](N)C4=CC=C(O)C=C4)=O)[C@]2([H])N(C(C(O)=O)=C(CSC3=CNN=N3)CS2)C1=O,0.0361078957546455 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)Cn2cnnn2)CSc4nnc(C)s4)C(O)=O,0.1467523635931280 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)C(=N\OCC(O)=O)\c2csc(N)n2)C=C)C(O)=O,0.0293307128289451 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)C(=N\OC)/c2csc(N)n2)CSc4nnnn4C)C(O)=O,0.1303858749443470 +O=C2N1/C(=C(\CS[C@@H]1[C@]2(OC)NC(=O)CSCC#N)CSc3nnnn3C)C(O)=O,0.2120736138052120 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)C(=N\OC)/c2csc(N)n2)CSc4nc(C)c(CC(O)=O)s4)C(O)=O,0.0569553223979114 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)[C@H](O)c2ccccc2)CSc4nnnn4CS(O)(=O)=O)C(O)=O,0.0307796700537328 +O=C4N1/C(=C(\CS[C@@H]1[C@@H]4NC(=O)[C@H](NC(=O)N2CCN(CC)C(=O)C2=O)c3ccc(O)cc3)CSc5nnnn5C)C(O)=O,0.3097570145172890 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)Cc2ccccc2CN)CSc4nnnn4CC(O)=O)C(O)=O,0.0640934290492669 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)C(=N\OC)\c2csc(N)n2)COC(C)=O)C(O)=O,0.4391112143120050 +O=C1[C@](NC(C3S\C(S3)=C(C(O)=O)/C(N)=O)=O)(OC)[C@]2([H])N1C(C(O)=O)=C(CSC4=NN=NN4C)CS2,0.1158752617920970 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)Cc2csc(N)n2)CSc4nnnn4CCN(C)C)C(O)=O,0.1902485734591220 +O=C1[C@](NC(CC3=CC=CS3)=O)(OC)[C@]2([H])N1C(C(O)=O)=C(COC(N)=O)CS2,0.4678887046239190 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)C(=N\OC)/c2csc(N)n2)COC)C(O)=O,0.0233942546237224 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)C(=N\OC)\c2csc(N)n2)COC)C(=O)OC(C)OC(=O)OC(C)C,0.0179340935691246 +N/31[C@@H]([C@@H](C1=O)NC([C@H](N)c2ccc(cc2)O)=O)SCC(=C\3C(=O)O)\C=C/C,0.0428836771782520 +O=C1N(C(C(O)=O)=C(OC)CS2)[C@@]2([H])[C@@]([H])1NC([C@H](N)C3=CCC=CC3)=O,0.0911319674083623 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)C(c2ccccc2)S(O)(=O)=O)C[n+]4ccc(cc4)C(N)=O)C([O-])=O,0.1877771355799740 +O=C1[C@@H](NC(/C(C4=CSC(N)=N4)=N/OC(C)(C)C(O)=O)=O)[C@]2([H])N1C(C([O-])=O)=C(C[N+]3=CC=CC=C3)CS2,0.2433330049862410 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)Cn2cnnn2)CSc4nncs4)C(O)=O,0.1514255180103510 +O=C3N1/C(=C\CS[C@@H]1[C@@H]3NC(=O)C(=N\OC)/c2csc(N)n2)C(O)=O,0.2608222860749950 +N1\2C(=O)[C@H]([C@H]1SC/C(=C/2C(=O)O)CS/C3=N/C(C(=N/N3C)\O)=O)NC(C(\c4nc(N)sc4)=N/OC)=O,0.1202712135700840 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)C(=N\OC)\c2ccco2)COC(N)=O)C(O)=O,0.0393510424020442 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)C(=N\OC)\c2ccco2)COC(N)=O)C(=O)OC(C)OC(C)=O,0.0327146618573371 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)C(=N\OC)\c2ccco2)COC(N)=O)C(=O)OC(C)OC(=O)C(C)(C)OC,0.0293727792991627 +C3(S(N)(=O)=O)=CC=C(N2N=C(C(F)(F)F)C=C2C1=CC=C(C)C=C1)C=C3,0.0174894761600347 +C1(=C(C=CC(=C1)NC(N(CC)CC)=O)OCC(CNC(C)(C)C)O)C(C)=O,0.0175758316767607 +O=C2N1/C(=C(\CS[C@@H]1[C@@H]2NC(=O)CC#N)COC(C)=O)C(O)=O,0.2947037434625130 +O=C3N1/C(=C(/C)CS[C@@H]1[C@@H]3NC(=O)[C@H](N)c2ccccc2)C(O)=O,0.1920038430706250 +O=C1N(C(C(O)=O)=C(COC(C)=O)CS2)[C@@]2([H])[C@@]([H])1NC([C@H](N)C3=CC=CC=C3)=O,0.0821360381955763 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)Cc2cccs2)C[n+]4ccccc4)C([O-])=O,0.1605348993966050 +O=C1N(C(C(O)=O)=C(COC(C)=O)CS2)[C@@]2([H])[C@@]([H])1NC(CC3=CC=CS3)=O,0.2522462274306470 +O=C3N1/C(=C(\CS[C@@H]1[C@@H]3NC(=O)CSc2ccncc2)COC(C)=O)C(O)=O,0.2361479285410700 +O=C1N(C(C(O)=O)=C(C)CS2)[C@@]2([H])[C@@]([H])1NC([C@H](N)C3=CCC=CC3)=O,0.1908960828123810 +CC(C)c1nc(c(/C=C/[C@@H](O)C[C@@H](O)CC(O)=O)c(c1COC)c2ccc(F)cc2)C(C)C,0.0000108802026685 +C(C1=CC=C(Cl)C=C1)(C2=CC=CC=C2)N3CCN(CCOCC(O)=O)CC3,0.0432001209603387 +C[C@@H]3O[C@]1(CS3)C2CCN(CC2)C1.C[C@@H]6O[C@]4(CS6)C5CCN(CC5)C4.O.Cl.Cl,0.0061279103233433 +C2=CC=C(C(O)(CCN(C)C)C1=CC=CC=C1Cl)C=C2,0.0057625988699785 +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2,0.0269119137846958 +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl,0.0006574358293323 +O=C(C(Cl)Cl)N[C@H](CO)[C@@H](C1=CC=C([N+]([O-])=O)C=C1)O,0.3094735421784590 +C1=C(Cl)C=C3C(=C1)N=C(NC)CN(=O)=C3C2=CC=CC=C2,0.0055712190954969 +C1=C(Cl)C=CC(NC(=N)NC(=N)NC(C)C)=C1,0.0131241229893489 +C(O)(C(Cl)(Cl)Cl)OC(C)CC(C)(O)C,0.1005415309952220 +CC(=O)[C@@]2(O)CC[C@H]3[C@@H]4/C=C(/Cl)\C1=C\C(=O)CC[C@]1(C)[C@H]4CC[C@]23C,0.0000917632734611 +CC(=O)[C@]2(CC[C@H]3[C@@H]4/C=C(/Cl)\C1=C\C(=O)CC[C@]1(C)[C@H]4CC[C@]23C)OC(C)=O,0.0000822370533194 +C2CC(=O)N(C)C(C1=CC=C(Cl)C=C1)S2(=O)=O,0.0243665536282639 +C1=C(N)C=C(Cl)C(C(=O)OCCN(CC)CC)=C1,0.0307658033183929 +NS(=O)(=O)c2cc1c(/N=C\NS1(=O)=O)cc2Cl,0.1126053011735300 +C1(Cl)=CC(Cl)=C2C(=C1O)N=CC=C2,0.3116122030515570 +O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O,0.0129107433451334 +C1=C(Cl)C=CC(OCC(O)COC(N)=O)=C1,0.1628269493906970 +C2=CC(C(CCN(C)C)C1=CC=C(Cl)C=C1)=NC=C2,0.0004840086807139 +C2(Cl)=CC=C(C(C)(OCCN(C)C)C1=CC=CC=C1)C=C2,0.1234257538795680 +C1=C(Cl)C=CC(CC(C)(C)N)=C1,0.0058798594452266 +C1(Cl)=C(Cl)C=CC(NC(=N)NC(=N)NC(C)C)=C1,0.0011555426313684 +C1=CC2=C(C=C1)N(CCCN(C)C)C3=C(S2)C=CC(Cl)=C3,0.0523733993811032 +O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC,0.0451687830951674 +C1=CC=C2C(=C1)C(=CCCN(C)C)C3=C(S2)C=CC(Cl)=C3,0.0105426381327791 +CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(O)ccc(Cl)c1[C@@](C)(O)[C@H]4C[C@@H]23,0.0695373116750014 +C1=CC=C3C(=C1)C(O)(C2=CC(S(N)(=O)=O)=C(Cl)C=C2)NC3=O,0.0024589234331389 +C1=C(Cl)C=C2C(=C1)OC(=O)N2,0.1963846818532770 +[Na+].[Na+].[O-]C(=O)c4c(Cl)c(Cl)c(Cl)c(Cl)c4C=2c3cc(I)c([O-])c(I)c3OC=1C=2\C=C(\I)C(=O)C=1I,0.0019653386971357 +[O-]S(=O)(C1=CC(S([O-])(=O)=O)=C(C2=C1C=CC(/N=N/C3=CC=C(C6=CC=C(C(C)=C6)/N=N/C5=CC=C(C4=C5O)C(S([O-])(=O)=O)=CC(S([O-])(=O)=O)=C4N)C=C3C)=C2O)N)=O.[Na+].[Na+].[Na+].[Na+],0.0003465843024163 +[Na+].[Na+].[O-]S(=O)(=O)c5cc(/N=N/c1ccc(cc1)c2ccc(cc2)/N=N/c4cc(c3ccccc3c4N)S([O-])(=O)=O)c(N)c6ccccc56,0.0053828017503206 +O[C@H]1[C@H](O)[C@@H](O)[C@H](O[C@@H]1CO)c4c(O)c3C(=O)c2c(C)c(C(O)=O)c(O)cc2C(=O)c3c(O)c4O,0.0169176077974534 +O[C@H]1CC3=C(C=C(O)C=C3O)O[C@@H]1[C@@]2=CC(O)=C(O)C=C2,0.1147199867710290 +C4=CC=C(C3(C1=CC=CC=C1)C(C2=NCCN2)C3)C=C4,0.0247761645064138 +C1(CSCCNC(NC)=NC#N)=C(C)NC=N1,0.1585167900984070 +C4=CC=CC(C(C1=CC=CC=C1)N3CCN(CC=CC2=CC=CC=C2)CC3)=C4,0.0101760063771811 +C1C3=C(C=C2C=1C(=O)C(C(=O)O)=NN2CC)OCO3,0.0636874175781849 +ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl,0.0057754591403558 +C2(N1CCNCC1)=C(F)C=C4C(=C2)N(C3CC3)C=C(C(=O)O)C4=O,0.0401398528972538 +C3=CC(F)=CC=C3OCCCN2CCC(NC(=O)C1=CC(Cl)=C(N)C=C1OC)C(OC)C2,0.0028544113099973 +CN(C)CCCC1(C3=CC=C(F)C=C3)OCC2=CC(C#N)=CC=C21,0.0030826906184395 +OC(CC(=O)O)(CC(=O)O)C(=O)O,0.5204985334953820 +Nc3nc(Cl)nc2c3ncn2[C@H]1C[C@H](O)[C@@H](CO)O1,0.0003150300853732 +CN(C)[C@H]3C[C@@H](C)O[C@@H](O[C@@H]2C(C)[C@H](O[C@H]1C[C@@](C)(OC)[C@@H](O)[C@H](C)O1)[C@@H](C)C(=O)O[C@H](CC)[C@@](C)(O)[C@H](O)[C@@H](C)C(=O)[C@H](C)C[C@@]2(C)OC)[C@@H]3O,0.0111370574690883 +O=C(C2)N([C@]([H])1[C@@](O)=O)[C@]2([H])O\C1=C/CO,0.0313816838216524 +C3=C(Cl)C(N)=CC(OC)=C3C(=O)NC2CCN(CC1=CC=CC=C1)CC2,0.0000668670073532 +ClC2=CC=[C@@](C=C2)[C@@](OCC[C@@H]3N(C)CCC3)(C)C1=CC=CC=C1,0.0003896592121951 +C1(Cl)=C(N)C(Cl)=CC(C(O)CNC(C)(C)C)=C1,0.0000036076321912 +C1=C(C2CCCCC2)C(Cl)=CC3=C1CCC3C(=O)O,0.0026903526751038 +C4=CC=C(C(O)(C(=O)OC1C[N+]2(C)CCC1CC2)C3=CC=CC=C3)C=C4.[Br-],0.0007702080028821 +O[C@@H]1[C@@H](O)[C@@H](O)[C@H](O[C@@H]1SC)[C@H](NC(=O)[C@@H]2C[C@@H](CCC)CN2C)[C@H](C)Cl,0.0705910556144102 +C1(I)=CC(Cl)=C2C(=C1O)N=CC=C2,0.0818331677030019 +C1=C(Cl)C=CC(CC(C)(O)C(C)CN(C)C)=C1,0.0156382204049220 +C1=CC=C3C(=C1)N(C2=CC=C(Cl)C=C2)C5C(=N3)C=C(NC4=CC=C(Cl)C=C4)C(=NC(C)C)C=5,0.0070342743220808 +CC(OC1=CC=C(C=C1)Cl)(C(=O)OCC)C,0.1372071626259230 +C1=C(Cl)C=CC(OC(C)(C)C(=O)OCCCC(=O)N(C)C)=C1,0.1372774968198910 +S1C=NC(C)=C1CCCl,0.0395911177822145 +C3=CC=CC(C(Cl)=C(C1=CC=CC=C1)C2=CC=C(OCCN(CC)CC)C=C2)=C3,0.0041137098371365 +N2(CCCN(C)C)C1=CC(Cl)=CC=C1CCC3=C2C=CC=C3,0.0132443045044102 +N2=C(C1=CC=CC=C1Cl)C3=C(NC(=O)C2)C=CC(N(=O)=O)=C3,0.0004212710857264 +C2=CC=C(Cl)C(N=C1NCCN1)=C2Cl,0.0001738421007844 +C2=C(Cl)C(S(=O)(=O)N)=CC(C(=O)NN1C(C)CCCC1C)=C2,0.0028914695575965 +Clc1ccccc1[C@H](N2Cc3ccsc3CC2)C(=O)OC,0.0038841378460013 +OCC(=O)[C@@]2(O)CC[C@H]3[C@@H]4/C=C(/Cl)\C1=C\C(=O)\C=C/[C@]1(C)[C@H]4[C@@H](O)C[C@]23C,0.0005294329060878 +C1=CC=C(Cl)C(CC(C)(C)N)=C1,0.0045351138128460 +S2C4=C(N=C(N1CCN(C)CC1)C3=C2C=CC(Cl)=C3)C=CC=C4,0.0007270112781550 +N2=C(C1=CC=CC=C1Cl)C3=C(N(C)C(=O)C2)SC(CC)=C3,0.0031365552656333 +O=C(O)[C@H]3N4C(=O)[C@H](NC(=O)c2c(C)onc2c1ccccc1Cl)[C@@H]4SC3(C)C,0.0763969421768292 +C1=C(Cl)C=C2C(=C1)NC(=O)CN3COCC23C4=C(Cl)C=CC=C4,0.0005727192187331 +C1(Cl)=CC=C3C(=C1)N=C(N2CCN(C)CC2)C4=C(N3)C=CC=C4,0.0458963661276740 +O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4,0.0200424766889294 +OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4C(=O)C[C@@]23C,0.0138717795900734 +CC(=O)OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4C(=O)C[C@@]23C,0.0124229559330423 +O=C1OC2=C(C=CC=C2)C=C1,0.0114271872628602 +C1(=O)C4=C(OC(C(=O)O)=C1)C=CC=C4OCC(O)COC3C2C(=O)C=C(C(=O)O)OC=2C=CC=3,0.0283965630849719 +O=C(O)[C@@H]2N3C(=O)[C@@H](NC(=O)C1(N)CCCCC1)[C@H]3SC2(C)C,0.0975321667236532 +C2C(C)(C)CC(OC(=O)C(O)C1=CC=CC=C1)CC2C,0.0966093868285440 +Oc1ccc2c(c1)C3(C)CCN(CC2C3C)CC4CC4,0.0002457652473939 +C3N(C(C1=CC=CC=C1)C2=CC=CC=C2)CCN(C)C3,0.0125009065972803 +C2(=O)NC(=O)C(C1=CCCCC1)(CC)C(=O)N2,0.0282307680326464 +C3=C(OC(=O)C)C=CC(C(=C1CCCCC1)C2=CC=C(OC(C)=O)C=C2)=C3,0.0183023407294364 +C2=CC(N1C(N)=NC(N)=NC1(C)C)=CC=C2Cl,0.0013229228442794 +C1(S(N)(=O)=O)=C(Cl)C=C3C(=C1)S(=O)(=O)NC(CC2CCCC2)N3,0.0000658097846620 +ClCCN(CCCl)[P]1(=O)NCCCO1,0.0191507779045985 +O=C1[C@H](N)CON1,0.1635780454363000 +C1(S(N)(=O)=O)=C(Cl)C=C4C(=C1)S(=O)(=O)NC(C2C3C=CC(C2)C3)N4,0.0002564907945197 +C2=CC4=C(C(=C1CCN(C)CC1)C3=C2C=CC=C3)C=CC=C4,0.0017397468195167 +CC(=O)[C@@]3(O)CC[C@H]4[C@@H]5/C=C(/Cl)\C2=C\C(=O)[C@@H]1C[C@@H]1[C@]2(C)[C@H]5CC[C@]34C,0.0133368549743455 +O=C1[C@H]3[C@H](C3)[C@@]([C@]4([H])[C@@]([C@@]5([H])[C@]([C@@](CC5)(OC(C)=O)[C@@](C)=O)(C)CC4)([H])C=C2Cl)(C)C2=C1,0.0119921993141901 +SCCN,0.4316340862863760 +OC(=O)[C@@H](N)CS,0.8253673008293790 +O=C1N([C@@H]2O[C@H](CO)[C@@H](O)[C@@H]2O)C=CC(N)=N1,0.0111012159531874 +O=C(N)C1=C(N=CN1)/N=N/N(C)C,0.0247004114539650 +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C,0.0000119482211887 +O[C@@]3(C#C)CC[C@H]2[C@@H]4CC/C1=C/c5oncc5C[C@]1(C)[C@H]4CC[C@@]23C,0.0394126297268189 +C3(N(=O)=O)=CC=C(C2OC(C=NN1C(=O)NC(=O)C1)=CC=2)C=C3,0.0212249365956729 +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N,0.0201368581426809 +CC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4,0.0020473161296853 +CN(CCO)C,0.1682817979676050 +C1=CC=C2C(=C1)CN(C(N)=N)CC2,0.0285338747312680 +[Br-].[Br-].C[N+](C)(C)CCCCCCCCCC[N+](C)(C)C,0.0000996905767064 +NCCCCCN(O)C(=O)CCC(=O)NCCCCCN(O)C(=O)CCC(=O)NCCCCCN(O)C(C)=O,0.1783535760480560 +OC(=O)CC[C@@H](C)[C@H]4CC[C@@H]3[C@]4(C)C(=O)C[C@H]1[C@H]3C(=O)C[C@@H]2CC(=O)CC[C@]12C,0.0931622024001763 +O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,0.0115454864428946 +CC(=O)O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3,0.0100768290125525 +CC(=O)[C@@]53O[C@@](C)(O[C@@H]5C[C@H]2[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4CC[C@@]23C)c6ccccc6,0.0055729712144445 +CS(=O)(=O)Nc1cc2\C=C(/Nc2cc1)C(=O)N3CCN(CC3)c4ncccc4NC(C)C,0.0146092159577671 +CN(C)[C@@H]1C(\O)=C(\C(N)=O)C(=O)[C@@]2(O)C(/O)=C3/C(=O)c4c(O)ccc(Cl)c4[C@@H](O)[C@H]3C[C@@H]12,0.0322682626750166 +CC(=O)OCC(=O)[C@H]2CC[C@H]3[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4CC[C@]23C,0.0044832481954658 +O=C(C4=CC(OC)=C(C(OC)=C4)OC)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=CC=C6)=C6N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,0.0000288601425739 +N1(CCCNC)C3=C(CCC2=C1C=CC=C2)C=CC=C3,0.0187701300259463 +O=C\1OC/C(=C/1)[C@H]2CC[C@@]9(O)[C@]2(C)[C@H](O)C[C@H]3[C@H]9CC[C@@H]4C[C@H](CC[C@]34C)O[C@@H]8O[C@H](C)[C@@H](O[C@@H]7O[C@H](C)[C@@H](O[C@@H]6O[C@H](C)[C@@H](O[C@@H]5O[C@H](CO)[C@@H](O)[C@H](O)[C@H]5O)[C@@H](O)C6)[C@@H](O)C7)[C@@H](O)C8,0.0000000848285190 +C#C[C@]3(O)CC[C@H]2[C@@H]4CC\C1=C\CCC[C@@H]1[C@H]4C(=C)C[C@@]23CC,0.0000080522299846 +OCC(=O)[C@@]4(O)[C@H](C)C[C@@H]1[C@]4(C)C[C@H](O)[C@]2(F)[C@@]3(C)/C=C\C(=O)/C=C3/CC[C@@H]12,0.0003822034846256 +O=C(O[C@]2(C(=O)COC(C)=O)[C@H](C)C[C@H]3[C@@H]4CC\C1=C\C(=O)/C=C\[C@]1(C)[C@@]4(F)[C@@H](O)C[C@]23C)c5ccco5,0.0002837867395837 +CC(=O)OCC(=O)[C@@]4(O)[C@H](C)C[C@@H]1[C@]4(C)CC(O)[C@]2(F)[C@@]3(C)/C=C\C(=O)/C=C3/CC[C@@H]12,0.0003452261889677 +CCC(=O)OCC(=O)[C@@]4(OC(=O)CC)[C@H](C)C[C@@H]1[C@]4(C)C[C@H](O)[C@]2(F)[C@@]3(C)/C=C\C(=O)/C=C3/CC[C@@H]12,0.0002972724755705 +CCCCCCCCCCCCCCCC(=O)OCC(=O)[C@@]4(O)[C@H](C)C[C@@H]1[C@]4(C)C[C@H](O)[C@]2(F)[C@@]3(C)/C=C\C(=O)/C=C3/CC[C@@H]12,0.0002377669448960 +CCCCC(=O)OCC(=O)[C@@]4(O)[C@H](C)C[C@@H]1[C@]4(C)C[C@H](O)[C@]2(F)[C@@]3(C)/C=C\C(=O)/C=C3/CC[C@@H]12,0.0003147442027534 +Brc1ccc(cc1)[C@H](CCN(C)C)c2ccccn2,0.0025059558740013 +C(C)(C)(C(O)C(=O)NCCCO)CO,0.0405843641745593 +N[C@@H](C)Cc1ccccc1,0.0073961094393438 +COc3ccc4C[C@H]1N(C)CC[C@@]2(CCCC[C@@H]12)c4c3,0.0073692727854230 +O=C(N2CCCC2)C(C3=CC=CC=C3)(C4=CC=CC=C4)[C@H](C)CN1CCOCC1,0.0008483346324997 +O[C@H]1[C@H](O)[C@@H](CO)OC(O)[C@@H]1O,0.5550747991045530 +OC3=CC1=C(C=C3)C[C@]2([H])CCCCC[C@](C)1[C@H]2N,0.0006806327618627 +[O-]C(C1=C(I)C(NC(C)=O)=C(I)C(NC(C)=O)=C1I)=O.[Na+],0.7611314691063970 +CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3,0.0023424862383324 +C1(Cl)=CC=C2C(=C1)S(=O)(=O)NC(C)=N2,0.0346813722621333 +N[C@@H]3CC[C@@H](CN)O[C@@H]3O[C@H]2[C@H](O)[C@@H](O[C@H]1O[C@H](CO)[C@@H](O)[C@H](N)[C@H]1O)[C@H](N)C[C@@H]2N,0.0066442963543986 +C1=CC=C2C(=C1)N(CCN(C)C)C(=O)C3=C(N2C)C=CC=C3,0.0406257943189160 +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr,0.0158134801638238 +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr,0.0135404953353481 +C2=CC=CC(N1C(=O)C=C(C)N1C)=C2.C(Cl)(Cl)(Cl)C(O)O.C(Cl)(Cl)(Cl)C(O)O,0.0626165848560113 +OC(=O)C(Cl)Cl,0.5172864409684660 +OC1=CC=C(Cl)C=C1CC2=CC(Cl)=CC=C2O,0.3715768943082970 +C1(S(N)(=O)=O)=CC(Cl)=C(Cl)C(S(N)(=O)=O)=C1,0.0109123497782335 +C2(CC(O)=O)=CC=CC=C2NC1=C(Cl)C=CC=C1Cl,0.0126625619705783 +O=C(O)[C@@H]3N4C(=O)[C@@H](NC(=O)c2c(C)onc2c1c(Cl)cccc1Cl)[C@H]4SC3(C)C,0.0355072577472690 +O=C1OC2=CC=CC=C2C(O)=C1CC3=C(O)C4=CC=CC=C4OC3=O,0.0148678987198739 +C2(C(=O)OCCN(CC)CC)(C1CCCCC1)CCCCC2,0.0042974383067188 +O=C2C1=C(N=CN2)N([C@@H]3O[C@H](CO)CC3)C=N1,0.0282355172327669 +C1CN(C)CCN1C(=O)N(CC)CC,0.0301063899608436 +C1=CC=CC(C(=O)C(C)N(CC)CC)=C1,0.0060887676071328 +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1,0.0372647383903571 +C4(C(=O)O)(C1=CC=CC=C1)CCN(CCC(C#N)(C2C=CC=CC=2)C3C=CC=CC=3)CC4,0.0003132845953583 +C2(C(=O)O)C=C(C1=C(F)C=C(F)C=C1)C=CC=2O,0.0999210118805508 +O=C\1OC/C(=C/1)[C@H]8CC[C@@]7(O)[C@]8(C)CC[C@H]2[C@H]7CC[C@@H]3C[C@H](CC[C@]23C)O[C@@H]6O[C@H](C)[C@@H](O[C@H]5C[C@H](O)[C@H](O[C@H]4C[C@H](O)[C@H](O)[C@@H](C)O4)[C@@H](C)O5)[C@@H](O)C6,0.0000000261458736 +O=C\1OC/C(=C/1)[C@H]2CC[C@@]8(O)[C@]2(C)[C@H](O)C[C@H]3[C@H]8CC[C@@H]4C[C@H](CC[C@]34C)O[C@@H]7O[C@H](C)[C@@H](O[C@H]6C[C@H](O)[C@H](O[C@H]5C[C@H](O)[C@H](O)[C@@H](C)O5)[C@@H](C)O6)[C@@H](O)C7,0.0000000128051057 +C1=CC=CC2=C(NN)N=NC(NN)=C12,0.0175074077890615 +O[C@H]1CC[C@H]5[C@H]2Cc4ccc(OC)c3O[C@@H]1[C@]5(CCN2C)c34,0.0106178204454892 +NC(=N)N[C@@H]3[C@@H](O[C@@H]2O[C@@H](C)[C@](O)(CO)[C@H]2O[C@@H]1O[C@@H](CO)[C@H](O)[C@@H](O)[C@@H]1NC)[C@H](O)[C@@H](O)[C@H](NC(N)=N)[C@H]3O,0.0286159833392604 +O[C@@H]2C\C([C@@H](C)CC2)=C/C=C3/[C@@]1([H])[C@@](CCC3)(C)[C@]([C@H](C)/C=C/[C@H](C)C(C)C)([H])CC1,0.0001045992988987 +Oc1ccc(cc1)N(C)C(=O)C(Cl)Cl,0.1068014130254150 +CN(C)CCN1c3ccccc3S[C@H]([C@@H](OC(C)=O)C1=O)c2ccc(OC)cc2,0.0192995312336859 +C1=CC=C2C(=C1)N(CCCN(C)C)C3=C(C2(C)C)C=CC=C3,0.0339634873491444 +C1=CC=C3C(=C1)CC(CCN(C)C)=C3C(C)C2=NC=CC=C2,0.0003419762589138 +CN(C)C(C)=O,0.0066918884669951 +[I-].[I-].COc7ccc1cc7Oc6cc5c(CC[N+](C)(C)[C@H]5Cc4ccc(Oc3c2c(CC[N+](C)(C)[C@@H]2C1)cc(OC)c3OC)cc4)cc6OC,0.0004411953543982 +CC(=O)NCC(O)=O.CC(=O)NCC(O)=O.NC(=N)c2ccc(/N=N/Nc1ccc(cc1)C(N)=N)cc2,0.0096989003541961 +O[C@@H]1C[C@H](O)[C@H](C/C=C\CCCC(O)=O)[C@H]1/C=C/[C@@H](O)CCCCC,0.0000352628248355 +O[C@@H]1CC(=O)[C@H](C/C=C\CCCC(O)=O)[C@H]1/C=C/[C@@H](O)CCCCC,0.0000709290082905 +[O-]S(=O)(=O)OC.C[N+]1(C)CC\C(CC1)=C(\c2ccccc2)c3ccccc3,0.0341456050755260 +C2=CC(C(C1=CC=CC=C1)OCCN(C)C)=CC=C2,0.0032621285980437 +C3=CC=C(C(O)(CCCN1CCCCC1)C2=CC=CC=C2)C=C3,0.0161579508202390 +C4=CC=CC(C3(C(=O)OCC)CCN(CCC(C#N)(C1=CC=CC=C1)C2=CC=CC=C2)CC3)=C4,0.0007357696840265 +C3N(C)CCC(OC(C1=CC=CC=C1)C2=CC=CC=C2)C3,0.0011834024291094 +S=C(N(CC)CC)SSC(=S)N(CC)CC,0.0280907212267383 +N3C(C1=CC=CC=C1)=C(C2=CC=CC=C2)OC=3N(CCO)CCO,0.0616572798596187 +C1=CC=C4C(=C1)SC(=CC=CC=CC2SC3=C([N+]=2CC)C=CC=C3)N4CC.[I-],0.0064226622073718 +[Na+].CCN(CC)C([S-])=S,0.0583909554745608 +C2(O)=C(O)C=CC(CCNC(C)CCC1=CC=C(O)C=C1)=C2,0.0001327227555686 +O=S(C(C(OCC(CCCC)CC)=O)CC(OCC(CCCC)CC)=O)([O-])=O.[Na+],0.0109031064912953 +O=S1(C(SC(S(N)(=O)=O)=C2)=C2[C@@H](NCC)C[C@@H]1C)=O,0.0030822336231989 +C1=CC=C2C(=C1)C(=CCCN(C)C)C3=C(SC2)C=CC=C3,0.0084619052135287 +[Cl-].[Cl-].COc1cc(cc(OC)c1OC)C[C@H]5c6c(OC)c(OC)c(OC)cc6CC[N@+]5(C)CCCOC(=O)CCC(=O)OCCC[N@+]3(C)CCc4cc(OC)c(OC)c(OC)c4[C@H]3Cc2cc(OC)c(OC)c(OC)c2,0.0000452027121049 +C4(C1=CC=CC=C1)(C2=CC=CC=C2)C(=O)N(CC)CC4CCN3CCOCC3,0.0105678306779897 +C1(OC)=C(OC)C=C5C(=C1)N=C(N4CCN(C(=O)C2OC3=C(OC2)C=CC=C3)CC4)N=C5N,0.0005913947413711 +C1=C(Cl)C=C3C(=C1)N(CCO)C(=O)C(O)N=C3C2=CC=CC=C2F,0.0009548221095988 +C1=CC=C2C(=C1)C(=CCCN(C)C)C3=C(CO2)C=CC=C3,0.0178970186931497 +F\C1=C\N(C(=O)NC1=O)[C@@H]2O[C@H](C)[C@@H](O)[C@H]2O,0.0812372619567066 +N1(C)C(=O)N(C)C3=C(C1=O)N(CC2OCCO2)C=N3,0.0499524400189504 +OCC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4,0.0044708623962387 +C2=CC=C(C(C)(C1=NC=CC=C1)OCCN(C)C)C=C2,0.0015423343026245 +O=C2C[C@@H]3CC[C@H]1[C@@H]4CC[C@H](O)[C@@]4(C)CC[C@@H]1[C@@]3(C)C[C@H]2C,0.0054849972515894 +CCC(=O)O[C@H]4CC[C@@H]3[C@]4(C)CC[C@H]2[C@H]3CC[C@H]1CC(=O)[C@H](C)C[C@@]12C,0.0046320676545933 +C1=CC=C4C(=C1)N(C3CCN(CCCC(=O)C2=CC=C(F)C=C2)CC=3)C(=O)N4,0.0007247763661144 +CC(=O)[C@H]2CC[C@H]3[C@@H]4\C=C/C1=C/C(=O)CC[C@@]1(C)[C@@H]4CC[C@]23C,0.0016002774497031 +N1(C)C(=O)N(C)C2=C(C1=O)N(CC(O)CO)C=N2,0.2359951064054740 +[N+](C)(C)(C)CCSP(=O)(OCC)OCC.[I-],0.0004357729955759 +N(CCN(CC(O)=O)CC(O)=O)(CC(O)=O)CC(O)=O,0.2395270230965640 +C1(O)=CC=CC([N+](C)(C)CC)=C1.[Cl-],0.0034706187825724 +NC(CCCN)(C(=O)O)C(F)F,2.1957536320509800 +COc4cc5CCN[C@H](C[C@H]1C[C@H]2c3cc(OC)c(OC)cc3CCN2C[C@@H]1CC)c5cc4OC,0.0020805640159380 +N2N(C)C(=O)C(OCC)=C(N1CCOCC1)C=2,0.0139172748822277 +O=C(O)[C@@H]2CCCN2C(=O)[C@H](C)N[C@@H](CCc1ccccc1)C(=O)OCC,0.0017718310840907 +O=C(NC2=CC=CC=C2CCC3N(C)CCCC3)C1=CC=C(OC)C=C1,0.0094476147070933 +C2(F)=C(N1CCNCC1)N=C3C(=C2)C(=O)C(C(O)=O)=CN3CC,0.0624377801277249 +O[C@@H]([C@H](C)NC)[C@]1=CC=CC=C1,0.0101069888314747 +OC1=CC([C@H](CNC)O)=CC=C1O,0.0000911550159276 +OCC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4,0.0044708627252694 +O=C(O)CCC/C=C2\O[C@](C[C@H]1O)([H])[C@@](C2)([H])[C@H]1/C=C/[C@H](CCCCC)O,0.0000000283716049 +N3C=C(C=C(CC1=CC=CS1)C(=O)O)N(CC2=CC=C(C(O)=O)C=C2)C=3CCCC,0.0313300432547760 +[O-][N+](OC[C@@H](O[N+]([O-])=O)[C@H](CO[N+]([O-])=O)O[N+]([O-])=O)=O,0.0055277871599368 +CN(C)[C@H]3C[C@@H](C)O[C@@H](O[C@@H]2[C@@H](C)[C@H](O[C@H]1C[C@@](C)(OC)[C@@H](O)[C@H](C)O1)[C@@H](C)C(=O)O[C@H](CC)[C@@](C)(O)[C@H](O)[C@@H](C)C(=O)[C@H](C)C[C@@]2(C)O)[C@@H]3O,0.0908810004180526 +CCCCCCCCCCCCCCCCCC(O)=O.CC(=O)O[C@@H]3[C@H](C[C@@H](C)O[C@H]3O[C@@H]2[C@@H](C)[C@H](O[C@H]1C[C@@](C)(OC)[C@@H](O)[C@H](C)O1)[C@@H](C)C(=O)O[C@H](CC)[C@@](C)(O)[C@H](O)[C@@H](C)C(=O)[C@H](C)C[C@@]2(C)O)N(C)C,0.0628983780045409 +CCOC(=O)CCC(=O)O[C@@H]3[C@H](C[C@@H](C)O[C@H]3O[C@@H]2[C@@H](C)[C@H](O[C@H]1C[C@@](C)(OC)[C@@H](O)[C@H](C)O1)[C@@H](C)C(=O)O[C@H](CC)[C@@](C)(O)[C@H](O)[C@@H](C)C(=O)[C@H](C)C[C@@]2(C)O)N(C)C,0.0773734598824411 +CCC(=O)O[C@@H]3[C@H](C[C@@H](C)O[C@H]3O[C@@H]2[C@@H](C)[C@H](O[C@H]1C[C@@](C)(OC)[C@@H](O)[C@H](C)O1)[C@@H](C)C(=O)O[C@H](CC)[C@@](C)(O)[C@H](O)[C@@H](C)C(=O)[C@H](C)C[C@@]2(C)O)N(C)C,0.0844314442242841 +C1=C(CCC(=O)OC)C=CC(OCC(O)CNC(C)C)=C1,0.0006771076668901 +C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2)=NN=C4,0.0001129815686687 +Oc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@H](O)CC[C@@H]12)c4cc3,0.0018356572754441 +O=c(Oc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@H](O)CC[C@@H]12)c4cc3)c5ccccc5,0.0013280635065095 +Oc4cc5CC[C@@H]1[C@H](CC[C@]2(C)[C@H](CC[C@@H]12)OC(=O)CCC3CCCC3)c5cc4,0.0012608361300360 +CCC(=O)Oc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@H](CC[C@@H]12)OC(=O)CC)c4cc3,0.0013003614380624 +CCCCCCC(=O)O[C@H]2CC[C@H]3[C@@H]4CCc1cc(O)ccc1[C@H]4CC[C@]23C,0.0013002158306270 +ClCCN(CCCl)C1=CC=C(CC(OC3=CC=C(C4=C3)[C@]2([H])[C@](CC4)([H])[C@@](CC[C@@H]5OC(CC6=CC=C(N(CCCl)CCCl)C=C6)=O)([H])[C@]5(C)CC2)=O)C=C1,0.0211368667276808 +CCCCCCCCCCC(=O)O[C@H]2CC[C@H]3[C@@H]4CCc1cc(O)ccc1[C@H]4CC[C@]23C,0.0011346671542407 +CCCCC(=O)O[C@H]2CC[C@H]3[C@@H]4CCc1cc(O)ccc1[C@H]4CC[C@]23C,0.0014025309175318 +OS(=O)(=O)Oc1cc2CC[C@H]3[C@@H]4CCC(=O)[C@@]4(C)CC[C@@H]3c2cc1.C1CNCCN1,0.0001069714998605 +OC[C@H](CC)NCCN[C@H](CO)CC,0.1223632194565740 +C1(OC)=C(O)C=CC(C(=O)N(CC)CC)=C1,0.0186770821184272 +OC(=O)CCCCCCC/C=C\CCCCCCCC.NCCO,0.2424722693809280 +C1(OCC)=C(OCC)C=C3C(=C1)C(CC2=CC(OCC)=C(OCC)C=C2)=NC=C3,0.0252850024334286 +C(O)(C=CCl)(C#C)CC,0.1154920000697100 +C1(S(=O)(=O)N(CC)CC)=CC=C(C(=O)O)C=C1,0.1943210829436220 +NC(=O)C1=C(C=CC=C1)OCC,0.4037796682710910 +C1CCCC(OC(N)=O)(C#C)C1,0.0998773840641866 +[H][C@]14[C@@]([C@]3([H])CC[C@@](O)(C#C)[C@](C)3CC4)([H])CCC2=CC(O)=CC=C12,0.0000016868902314 +NC(=S)C1=CC(=NC=C1)CC,0.1004551158121160 +C[C@]43CCC(=O)\C=C4\CC[C@@H]1[C@@H]3CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C,0.0053449266820084 +C2(C1=CC=CC=C1)(C(=O)OCC)CCCN(C)CC2,0.0382615014455960 +C1=CC=C2C(=C1)N(CC(C)N(CC)CC)C3=C(S2)C=CC=C3,0.0320028408281746 +C1(C)(CC)CC(=O)NC1=O,0.1182989824729080 +C2(C1C(=O)N(CC)C(=O)N1)=CC=CC=C2,0.2448277925376290 +C1(OCC)=CC=C2C(=C1)SC(S(N)(=O)=O)=N2,0.0322471626948718 +CCO,2.1706853287720000 +CC(=O)OCC,0.2837520188956140 +CC[C@]2(O)CC[C@H]3[C@@H]4CC\C1=C\CCC[C@@H]1[C@H]4CC[C@]23C,0.0002312219041120 +O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](O)(CC[C@@H]23)C#C,0.0000555860446675 +CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O,0.0000434320720313 +C1(C)=CC=CC(C)=C1NC(=O)C(N(CCC)CC)CC,0.0241302073222553 +C(O)(C)(P(O)(=O)O)P(O)(=O)O,0.0970740898576020 +C1=CC(O)=CC(C(O)CNCC)=C1,0.0045963286755731 +C2(C1=CC=CC=C1Cl)=NCC4N(C3=C2C=C(CC)S3)C(C)=NN=4,0.0001945481029664 +N1(C)C(=O)N(C)C2=C(C1=O)N(CCO)C=N2,0.0371515790669896 +N1(C)C(=O)N(C)C3=C(C1=O)N(CCOC(=O)C(C)(C)OC2=CC=C(Cl)C=C2)C=N3,0.0297020170093234 +N2C=C(C(=O)OCC)N(C(C)C1=CC=CC=C1)C=2,0.0024561069133515 +C3(=O)N(CC)C(CC)=NN3CCCN2CCN(C1=CC(Cl)=CC=C1)CC2,0.0066153050851691 +COc1cc(cc(OC)c1O)[C@@H]5c2cc7OCOc7cc2C(O[C@@H]3O[C@@H]4CO[C@@H](C)O[C@H]4[C@H](O)[C@H]3O)C6COC(=O)[C@H]56,0.0045874942189078 +C1(C)=C(OC)C=C(C)C(C=CC(C)=CC=CC(C)=CC(=O)OCC)=C1C,0.0042315205969265 +C[C@]41/C=C\C(=O)\C=C4\C(=C)C[C@H]2[C@@H]3CCC(=O)[C@@]3(C)CC[C@H]12,0.0013495123672012 +C12N=C(N)N=CC=1N=CN2CCC(COC(=O)C)COC(=O)C,0.0778012108109077 +C1SC(N=C(N)N)=NC=1CSCCC(N)=NS(N)(=O)=O,0.0019766160688514 +C6=CC(C4N(N=NN2C(C1=CC=CC=C1)=C(C)[N+]3=C2C=CC=C3)C5=[N+](C=4C)C=CC=C5)=CC=C6.[Br-].[Br-],0.0016547021771049 +C1=CC=CC=C1C(COC(N)=O)COC(N)=O,0.2518470250947930 +C2(C)=C(C(=O)OCC)C(C1=CC=CC(Cl)=C1Cl)C(C(=O)OC)=C(C)N2,0.0008666148120450 +C2=CC=CC(C1=CC=C(C(=O)CCC(O)=O)C=C1)=C2,0.0589899597515437 +C1=CC=C(C(F)(F)F)C=C1CC(C)NCC,0.0086483737855655 +C2(OC1=CC=CC=C1)=CC=CC(C(C)C(=O)O)=C2,0.2063814293697120 +C2(O)=CC(O)=CC(C(O)CNC(C)CC1=CC=C(O)C=C1)=C2,0.0000880162888812 +C1=C(Cl)C=CC(C(O)(C)CC(C)(O)C)=C1,0.0437225023717271 +C3=CC=CC(CCN1CCC2(CC1)OC(=O)NC2)=C3,0.0307300499555375 +C3=CC=CC=C3N(C(=O)CC)C2CCN(CCC1=CC=CC=C1)CC2,0.0003180070574979 +O=C(O)CC1=C(C(C=C3)=CC=C3Cl)N=C(C2=CC=CC=C2)S1,0.0454820138344158 +C3(=O)C(CC=C(C)C)C(=O)N(C1=CC=CC=C1)N3C2=CC=CC=C2,0.0390155594050908 +CC(C)(C)NC(=O)[C@H]4CC[C@@H]3[C@]4(C)CC[C@H]1[C@H]3CC[C@H]2NC(=O)\C=C/[C@]12C,0.0002235976655008 +C2=CC=C4C(=C2C(=O)OCCN1CCCCC1)OC(C3=CC=CC=C3)=C(C)C4=O,0.0339754089566331 +C2=C(OCC(F)(F)F)C=CC(OCC(F)(F)F)=C2C(=O)NCC1CCCCN1,0.0120673050793648 +C1C=CC3=C2C=1C=CC=C2C4=C3C=CC(C(=O)CCC(O)=O)=C4,0.0552388674166627 +O=C2N1[C@]([C@@]([H])2NC(C3=C(C)ON=C3C(C(Cl)=CC=C4)=C4F)=O)([H])SC(C)(C)[C@@H]1[C@@](O)=O,0.1469578027735830 +F\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](O)[C@@H](CO)O2,0.0024371178587012 +C3=C(F)C=CC(C(=O)C1=CC=C2C(=C1)NC(NC(=O)OC)=N2)=C3,0.0053306404223232 +C1=C(F)C(N)=NC(=O)N1,1.1619578423227400 +OP(O)(=O)OC[C@H]3O[C@@H](n2cnc1c(N)nc(F)nc12)[C@@H](O)[C@@H]3O,0.0018509813054880 +OCC(=O)[C@@]4(O)CC[C@@H]1[C@]4(C)C[C@H](O)[C@]2(F)[C@@]3(C)CCC(=O)/C=C3/CC[C@@H]12,0.0000043895345137 +CC(=O)OCC(=O)[C@@]4(O)CC[C@@H]1[C@]4(C)C[C@H](O)[C@]2(F)[C@@]3(C)CCC(=O)/C=C3/CC[C@@H]12,0.0000039527839418 +C2=CC=CC(NC1=CC(C(F)(F)F)=CC=C1)=C2C(O)=O,0.0355580955604019 +C1=C(F)C=C2C(=C1)N3C(CN(C)C2=O)=C(C(=O)OCC)N=C3,0.0001648596057971 +N2=C(C1=CC=CC=C1F)C3=C(N(C)C(=O)C2)C=CC(N(=O)=O)=C3,0.0001062936084212 +O=C1C(=CNC(=O)N1)F,0.0922529082729333 +C2(C(F)(F)F)=CC=C(OC(CCNC)C1=CC=CC=C1)C=C2,0.0042996690959146 +C1=CC=C3C(=C1)N(CCCN2CCN(CCO)CC2)C4=C(S3)C=CC(C(F)(F)F)=C4,0.0007611053679629 +O=C(CCCCCCCCC)OCCN(CC4)CCN4CCCN2C1=CC=CC=C1SC3=C2C=C(C(F)(F)F)C=C3,0.0005627177968816 +O=C(CCCCCC)OCCN4CCN(CC4)CCCN1C(C=C3C(F)(F)F)=C(C=C3)SC2=C1C=CC=C2,0.0006057947818329 +C3=CC(F)=C(C1=NCC(=O)N(CCN(CC)CC)C2=C1C=C(Cl)C=C2)C=C3,0.0012890643766360 +C1=C(Cl)C=C3C(=C1)N(CCO)C(=O)CN4C3(C2=CC=CC=C2F)OCC4,0.0005307725705372 +O=C(C[C@@H](C[C@@H](/C=C/C1=C(C2=C(N1C(C)C)C=CC=C2)C3=CC=C(C=C3)F)O)O)O,0.0016210334805387 +O=C1N=C(N)NC(N=C2)=C1N=C2CNC3=CC=C(C=C3)C(N[C@@H](CCC(O)=O)C(O)=O)=O,0.0000301315707497 +C3OCCN(C(=O)CN(C)CC2=C(NC(=O)C1=CC=CC=C1)C=CC=C2Cl)C3,0.0199061148001565 +C1=CC=C2C(=C1)N(CC(C)N(C)C)C3=C(S2)C=CC(S(=O)(=O)N(C)C)=C3,0.0033967504080570 +Oc1ccc(cc1NC=O)[C@@H](O)CN[C@H](C)Cc2ccc(OC)cc2,0.0077525038409737 +[Na+].[Na+].[Na+].[O-]C(=O)P([O-])([O-])=O,0.6251602917500130 +O=C(CP(=O)(CCCCc1ccccc1)OC(OC(=O)CC)C(C)C)N2C[C@@H](C[C@H]2C(O)=O)C3CCCCC3,0.0023595679997169 +O=C(N)C(C=C3)=CC1=C3NC2=C1C[C@H](NC)CC2,0.0005137599716700 +O[C@H]1[C@H](O)[C@@H](CO)O[C@]1(O)CO,2.3146619122659900 +O[C@@H]1[C@@](O)(CO)OC[C@@H](O)[C@H]1O,2.3146621692281200 +NS(C1=C(Cl)C=C(NCC2=CC=CO2)C(C(O)=O)=C1)(=O)=O,0.0302348552854004 +O=CN(/C(C)=C(CCO)/SSCC2OCCC2)CC1=C(N)N=C(C)N=C1,0.0041902598789140 +C1=C(CCCC)C=CC(C(O)=O)=N1,0.0418490074419811 +C/C(C)=C\CC\C(=C4\[C@H](C[C@@]2(C)[C@H]4C[C@@H](O)[C@H]1[C@@]3(C)CC[C@@H](O)[C@@H](C)[C@@H]3CC[C@@]12C)OC(C)=O)C(O)=O,0.0483831118786694 +NCC1(CC(=O)O)CCCCC1,0.1167959597941590 +O[C@H]1[C@@H](O)[C@@H](CO)OC(O)[C@@H]1O,0.5550748607261670 +[I-].[I-].[I-].CC[N+](CC)(CC)CCOc1cccc(OCC[N+](CC)(CC)CC)c1OCC[N+](CC)(CC)CC,0.0022433367318763 +CC1=C(C=C(C=C1)C)OCCCC(C(=O)O)(C)C,0.0798934540896261 +N[C@H]1[C@H](O[C@H]2OC[C@@](O)(C)[C@H](NC)[C@H]2O)[C@@H](O)[C@H](O[C@H]3O[C@H](C(C)NC)CC[C@H]3N)[C@@H](N)C1,0.0062814672720270 +N[C@H]1[C@H](O[C@H]2OC[C@@](O)(C)[C@H](NC)[C@H]2O)[C@@H](O)[C@H](O[C@H]3O[C@H](CN)CC[C@H]3N)[C@@H](N)C1,0.0066734549049960 +N[C@H]1[C@H](O[C@H]2OC[C@@](O)(C)[C@H](NC)[C@H]2O)[C@@H](O)[C@H](O[C@H]3O[C@H](C(C)N)CC[C@H]3N)[C@@H](N)C1,0.0064715307439560 +O=C2C=C3C(CC2)=C1[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(CC)C=C1,0.0001352078436372 +C1CCC3C1CN(NC(=O)NS(=O)(=O)C2=CC=C(C)C=C2)C3,0.0164806007868513 +C1(OC)=CC=C4C(=C1)C(=O)N(CCC3=CC=C(S(=O)(=O)NC(=O)NC2CCCCC2)C=C3)C(=O)C4(C)C,0.0018952588243156 +C3(C(=O)NCCC2=CC=C(S(=O)(=O)NC(=O)NN1CCCCCC1)C=C2)C=C(C)ON=3,0.0005939617712857 +O[C@H]1[C@H](N)[C@@H](O)[C@H](O)[C@@H](CO)O1,0.5581257245169560 +O=C(O)CC[C@H](N)C(O)=O,0.6796742729014550 +NC(=O)CCC(N)C(O)=O,1.3685085651529800 +O=C(NCC(O)=O)[C@@H](NC(=O)CC[C@H](N)C(O)=O)CS,0.0162695020894596 +C2(=O)CCC(C1=CC=CC=C1)(CC)C(=O)N2,0.0383405051096893 +N2N=C(C(C)(C)C)SC=2NS(=O)(=O)C1=CC=CC=C1,0.0420314435547976 +OCC(O)CO,10.8476357800417000 +C(OP(O)(=O)O)C(O)CO,0.3876245577324380 +C(OP(O)(=O)O)(CO)CO,0.3876245577324380 +NCC(O)=O,1.3321503837925300 +C2=CC=CC(S(=O)(=O)NC1=NC=C(OCCOC)C=N1)=C2,0.1076482288633670 +C(O)(CC(=O)OC1C[N+](C)(C)CC1)(C2=CC=CC=C2)C3CCCC3.[Br-],0.0001617514358168 +C1(O)=C(O)C(C(C)C)=C4C(=C1C=O)C(O)=C(C2=C(C)C=C3C(=C2O)C(C=O)=C(O)C(O)=C3C(C)C)C(C)=C4,0.0006421698475608 +CN4[C@@H]1CCC[C@H]4C[C@H](C1)NC(=O)c3nn(C)c2ccccc23,0.0000320092842289 +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,0.0354342237339564 +C1=CC=CC(OC)=C1O,0.0902227535339930 +C1=CC=C(OC)C(OCC(O)CO)=C1,0.1009001504219440 +CCC(C)(C)NC(N)=NC#N,0.0674392524721998 +C1CCCCCN(CCNC(N)=N)C1,0.0042005263718425 +C(=N)(N)N,0.8464461956475740 +C1=C(Cl)C=C3C(=C1)N(CC(F)(F)F)C(=O)CN=C3C2=CC=CC=C2,0.0075693533581599 +C1=CC(C(F)(F)F)=CC2=C1C(C(O)CCN(CCCC)CCCC)=CC3=C2C=C(Cl)C=C3Cl,0.0499576649155634 +O=C(OCCNC(C)=O)C(OC2=CC=CC(C(F)(F)F)=C2)C1=CC=C(Cl)C=C1,0.0401644298471974 +[C@@H]1([C@@H]2N(C1=O)[C@H](C(S2)(C)C)C(=O)O)N3C(NC(C3=O)c4ccccc4)(C)C,0.0855011117455368 +C2(=O)C(C)(C1CCCCC=1)C(=O)N=C(O)N2C,0.0352567162986424 +OC(CN1CC[N+](C)(C)CC1)(c2ccccc2)C3CCCCC3.[O-]S(=O)(=O)OC,0.0038965347300007 +OC1=C(C=CC(=C1)O)CCCCCC,0.0858083668047734 +C1N=CNC=1CCN,0.0001304601392091 +N[C@@H](C\C1=C\N=C/N1)C(O)=O,0.6445186013224490 +CN3[C@@H]1CC[C@H]3CC(C1)OC(=O)C(O)c2ccccc2.BrC,0.0018013329107358 +C1=CC=C2C(=C1)C(=O)C3=C(S2)C(CO)=CC=C3NCCN(CC)CC,0.0280519229873727 +C1=CC=C2C(=C1)C(NN)=NN=C2,0.0207896417888532 +O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1,0.0111842885264314 +[C@]325c1c4c(OC)ccc1C[C@H]([C@@H]2CCC([C@@H]3O4)=O)N(CC5)C,0.0025053092513655 +C1(S(=O)(=O)N)=C(C(F)(F)F)C=C2C(=C1)S(=O)(=O)NCN2,0.0100515548291959 +[C@]325c1c4c(O)ccc1C[C@H]([C@@H]2CCC([C@@H]3O4)=O)N(CC5)C,0.0014018479018858 +C1=C(O)C=CC(CC(N)C)=C1,0.0264540431764375 +C1=C(Cl)C=C2C(=C1)C(NC(C)CCCN(CC)CCO)=CC=N2,0.0297732877278021 +C2=C(C(N)=N)C=C(O)C(C=CC1=CC=C(C(N)=N)C=C1)=C2,0.0148756205488184 +C3(Cl)=CC=C(C(C1=CC=CC=C1)N2CCN(CCOCCO)CC2)C=C3,0.0177912079317953 +C1=C(CCNC)C=C(OC(=O)C(C)C)C(OC(=O)C(C)C)=C1,0.0325325235771331 +CC(C1=CC=C(C=C1)CC(C)C)C(=O)O,0.1939074285935890 +C2(CC(C)C)=CC=C(C(C)C(=O)OCC1=NC=CC=C1)C=C2,0.1345028716699360 +C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1,0.0155440935985546 +CC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2ccccc2C(=O)c3c(O)c5C4,0.0054272024411637 +N21/C(=C(/SCCNC=N)C[C@@H]1[C@H](C2=O)[C@H](O)C)C(=O)O,0.2228190044901200 +O.O[C@@H]5Cc1ccccc1[C@@H]5NC(=O)[C@H](Cc2ccccc2)C[C@H](O)CN4CCN(Cc3cnccc3)C[C@H]4C(=O)NC(C)(C)C,0.0264322145067590 +[Na+].[O-]S(=O)(=O)CCCC[N+]=6c2ccc1ccccc1c2C(C)(C)C=6/C=C/C=C/C=C/C=C5\N(CCCCS([O-])(=O)=O)c4ccc3ccccc3c4C5(C)C,0.0006451922179237 +O[C@H]1[C@H](O)[C@H](O)[C@H](O)[C@@H](O)[C@@H]1O,0.5550748607261670 +O=C(O[C@H]6[C@H](OC(=O)c1cccnc1)[C@H](OC(=O)c2cccnc2)[C@H](OC(=O)c3cccnc3)[C@@H](OC(=O)c4cccnc4)[C@@H]6OC(=O)c5cccnc5)c7cccnc7,0.0822724869702336 +C2(I)=C(C(=O)NC)C(I)=C(NC(=O)CCCCC(=O)NC1=C(I)C(C(=O)NC)=C(I)C(C(O)=O)=C1I)C(I)=C2C(O)=O,0.0797534393710605 +CC(CN(C(C)=O)C1=C(I)C=C(I)C(N)=C1I)C(O)=O,0.1221584658186690 +C1(I)=C(CNC(C)=O)C(I)=C(NC(C)=O)C(I)=C1C(O)=O,0.1592508458011480 +O1C(CO)COC1CCI,0.0155006190365970 +C1C(OC(O1)C(C)I)CO,0.0155006190365970 +C2(I)=CC(I)=C(NC(=O)CCCCC(=O)NC1=C(I)C(C(=O)O)=C(I)C=C1I)C(I)=C2C(O)=O,0.1465218459948710 +O=C(O)CN/1/C=C(/I)C(=O)C(\I)=C\1.OCCNCCO,0.1960537977894860 +C1(I)=CC(I)=C2C(=C1O)N=CC=C2,0.0755760710439252 +C1(O)=C(I)C=NC(S)=N1,0.0196812511166650 +C1(I)C(C(=O)NCC(O)CO)=C(I)C(C(=O)NCC(O)CO)=C(I)C=1N(C(C)=O)CC(O)CO,0.1339604549954680 +O=C(NC(CO)CO)C1=C(I)C(NC([C@H](C)O)=O)=C(I)C(C(NC(CO)CO)=O)=C1I,0.1286860030512220 +C1=C(I)C(N)=C(I)C(CC(C(=O)O)CC)=C1I,0.1751522410142480 +C1(I)=CC=CC(C(C)CCCCCCCCC(=O)OCC)=C1,0.3002376705419020 +C1=CC=CC(C(C)CCCCCCCCC(=O)OCC)=C1I,0.3002376705419020 +C1=C(I)C=CC(C(C)CCCCCCCCC(=O)OCC)=C1,0.3002376705419020 +C1(NC(=O)COC)=C(I)C(C(=O)NCC(O)CO)=C(I)C(C(=O)N(C)CC(O)CO)=C1I,0.1264043731261420 +C1(I)=C(NC(C)=O)C(I)=C(C(=O)NC)C(I)=C1C(=O)O,0.1628893787117300 +C2(I)=C(C(=O)NC(C(O)CO)CO)C(I)=C(N(C)C(=O)CC(=O)N(C)C1=C(I)C(C(=O)NC(C(O)CO)CO)=C(I)C(C(=O)NC(CO)C(O)CO)=C1I)C(I)=C2C(=O)NC(CO)C(O)CO,0.0614917943750799 +Ic1c(c(I)c(c(I)c1N(C)C(C)=O)C(=O)NCC(=O)Nc2c(I)c(C(=O)NCCO)c(I)c(C(O)=O)c2I)C(=O)NC,0.0788097172948855 +C1(N=CN(C)C)=C(I)C=C(I)C(CCC(O)=O)=C1I,0.1672360412800760 +C1=CC(C(=O)NNC(C)C)=CC=N1,0.0139494122889412 +C5(CN1C(CCCC)=NC2(C1=O)CCCC2)=CC=C(C4=CC=CC=C4C3NN=NN=3)C=C5,0.0116678103454367 +C1=C(N)C=CC(C(=O)OCC(C)C)=C1,0.0345162523940152 +C2(CNNC(=O)C1C=C(C)ON=1)=CC=CC=C2,0.0043243146004601 +CC(C)=CCCC(C)NC,0.0383706328450069 +O=C(C1=CC=NC=C1)NN,0.0729185579917646 +C(C(=O)N)(CC[N+](C)(C(C)C)C(C)C)(C1=CC=CC=C1)C2=CC=CC=C2,0.0004723907145297 +C1=C(O)C(O)=CC(C(O)CNC(C)C)=C1,0.0007905041797790 +[N+](O[C@H]2[C@@H]1[C@@H]([C@@H](O)CO1)OC2)([O-])=O,0.0104636024634669 +OC(/C=C(C)\C=C\C=C(C)\C=C\C1=C(C)CCCC(C)1C)=O,0.0066570113374229 +C2=C(O)C=CC(C(O)C(C)NC(C)COC1=CC=CC=C1)=C2,0.0044130316226565 +C=1(C(\C(C(=O)OC)=C(/NC=1C)C)c3c2c(non2)ccc3)C(OC(C)C)=O,0.0004496655430772 +N\1(C(N(C(CC)C)/N=C/1)=O)c7ccc(N2CCN(CC2)c6ccc(OC[C@@H]5O[C@](c3c(cc(cc3)Cl)Cl)(Cn4ncnc4)OC5)cc6)cc7,0.0141716647766390 +O[C@@]12[C@]3([H])C(O[C@@](C[C@]5(CC[C@H](C)[C@]([C@@H](C)CC)([H])O5)O4)([H])C[C@@]4([H])C/C=C(C)/[C@@H](O[C@]6([H])O[C@@H](C)[C@H](O[C@@]7([H])C[C@H](OC)[C@@H](O)[C@H](C)O7)[C@@H](OC)C6)[C@@H](C)/C=C/C=C1\CO[C@@]([H])2[C@H](O)C(C)=C3)=O,0.0001714103999672 +O[C@@]12[C@]3([H])C(O[C@@](C[C@]5(CC[C@H](C)[C@](C(C)C)([H])O5)O4)([H])C[C@@]4([H])C/C=C(C)/[C@@H](O[C@]6([H])O[C@@H](C)[C@H](O[C@@]7([H])C[C@H](OC)[C@@H](O)[C@H](C)O7)[C@@H](OC)C6)[C@@H](C)/C=C/C=C1\CO[C@@]([H])2[C@H](O)C(C)=C3)=O,0.0001742026379436 +CC(=O)O[C@@H]3CC(=O)O[C@H](C)C\C=C\C=C\[C@H](O)[C@H](C)C[C@H](CC=O)[C@H](O[C@@H]2O[C@H](C)[C@@H](O[C@H]1C[C@@](C)(O)[C@H](OC(=O)CC(C)C)[C@H](C)O1)[C@H](N(C)C)[C@H]2O)C3OC,0.0603868410020274 +O[C@@H]3[C@@H](O)[C@H](O)[C@@H](CN)O[C@@H]3O[C@H]2[C@H](O)[C@@H](O[C@H]1O[C@H](CO)[C@@H](O)[C@H](N)[C@H]1O)[C@H](N)C[C@@H]2N,0.0309598392267933 +N[C@@H]3[C@@H](O)[C@H](O)[C@@H](CN)O[C@@H]3O[C@H]2[C@H](O)[C@@H](O[C@H]1O[C@H](CO)[C@@H](O)[C@H](N)[C@H]1O)[C@H](N)C[C@@H]2N,0.0310228943169119 +N[C@@H]3[C@@H](O)[C@H](O)[C@@H](CO)O[C@@H]3O[C@H]2[C@H](O)[C@@H](O[C@H]1O[C@H](CO)[C@@H](O)[C@H](N)[C@H]1O)[C@H](N)C[C@@H]2N,0.0309598392267933 +C2CCCC(NC)(C1=C(Cl)C=CC=C1)C2=O,0.0084130738494575 +C1=CC=C4C(=C1)NC(=O)N(CCN3CCC(C(=O)C2=CC=C(F)C=C2)CC3)C4=O,0.0033634545167552 +C3=CC=CC=C3C(=O)C1=CC=C2N1CCC2C(=O)O,0.0097936048700385 +C1=CC=C3C(=C1)CC(=O)C4=C(C3=C2CCN(C)CC2)C=CS4,0.0001076188802427 +C2=CC=CC(CCC(C)NCC(O)C1=CC=C(O)C(C(N)=O)=C1)=C2,0.1218006545932580 +C(O)(=O)C(C)O,1.1101502144255100 +[C@@H]1([C@@H]([C@H]([C@H]([C@H](O1)CO)O)O)O)O[C@H]2[C@@H]([C@H]([C@@H](O[C@@H]2CO)O)O)O,0.2921444006669310 +[C@@H]1(O[C@H](CS1)N\2C(\N=C(/C=C/2)N)=O)CO,0.0218096609819058 +C2=CC=C(C1=C(N)N=C(N)N=N1)C(Cl)=C2Cl,0.0260453905164633 +[C@@]82([C@@]([C@@H](/C1=C/C(=O)OC1)CC2)(CC[C@@H]9[C@]7(CCC(O[C@@H]3O[C@@H]([C@H]([C@H](C3)O)O[C@@H]6O[C@@H]([C@@H](O[C@@H]5O[C@@H]([C@@H](O[C@H]4[C@@H]([C@@H](O)[C@@H]([C@H](O4)CO)O)O)[C@H](C5)OC(=O)C)C)[C@H](C6)O)C)C)C[C@H]7CC[C@@H]89)C)C)O,0.0000343611996058 +O[C@]([C@@]3([H])[C@@]4([H])[C@@](C(C6)CC3)(C)CCC6O[C@@H]1O[C@H](C)[C@@H](O[C@@H](C[C@@H]9O)O[C@H](C)[C@H]9O[C@@H]8O[C@H](C)[C@H]([C@@H](OC(C)=O)C8)O[C@H](O[C@H](CO)[C@H]7O)[C@H](O)[C@H]7O)[C@@H](O)C1)(C[C@@H]2O)[C@@](CC4)(C)[C@H]2[C@@]5=CC(OC5)=O,0.0000338031346449 +[C@@]32([C@@]([C@@H](/C1=C/C(=O)OC1)CC2)([C@H](O)C[C@H]4[C@H]3CC[C@H]9[C@@]4(CC[C@H](O[C@@H]5O[C@@H]([C@H]([C@H](C5)O)O[C@@H]8O[C@@H]([C@@H](O[C@@H]7O[C@@H]([C@@H](O[C@H]6[C@@H]([C@@H](O)[C@@H]([C@H](O6)CO)O)O)[C@H](C7)OC(=O)C)C)C(C8)O)C)C)C9)C)C)O,0.0000338031346449 +O[C@]([C@@](CC6)([H])[C@]([C@](CC5)(C)C6CC5O[C@@H]2O[C@H](C)[C@@H](O[C@@H](C[C@@H]9O)O[C@H](C)[C@H]9O[C@@H]8O[C@H](C)[C@H]([C@@H](OC(C)=O)C8)O[C@H](O[C@H](CO)[C@H]7O)[C@H](O)[C@H]7O)[C@@H](O)C2)([H])C[C@H]1O)(C[C@@H]3O)[C@@]1(C)[C@H]3[C@@]4=CC(OC4)=O,0.0000332629072017 +C1=CC=C3C(=C1)N=C(S(=O)CC2=NC=CC(OCC(F)(F)F)=C2C)N3,0.0013536874881440 +C2(C(=O)NC1=CC=C(C(F)(F)F)C=C1)C=NOC=2C,0.0012323872725296 +C3=CC(C#N)=CC=C3C(C1=CC=C(C#N)C=C1)N2N=CN=C2,0.0001461605310906 +CC(C)C[C@H](N)C(O)=O,0.7623524733611170 +C1(N)=NC(=O)C3=C(N1)NCC(CNC2=CC=C(C(=O)NC(C(O)=O)CCC(O)=O)C=C2)N3C=O,0.0114270187782460 +[C@]243c1c(ccc(c1)O)C[C@H]([C@@H]2CCCC3)N(CC4)CC=C,0.0002353498261693 +N\1=C3/SCCN3C[C@@H]/1c2ccccc2,0.0040775092908962 +O=C1CCCN1[C@@H](CC)C(=O)N,0.3525077992350580 +C[N+](C)(C)C[C@H](O)CC([O-])=O,0.3070740557162610 +Oc1ccc(C[C@H](N)C(O)=O)cc1O,0.6744835763249160 +O[C@@H](CN1CCN(CC1)c2ccccc2)CO,0.0126951831512915 +O=C(C)O[C@@H](CC)C(C[C@@H](N(C)C)C)(C2=CC=CC=C2)C1=CC=CC=C1,0.0113154895983211 +[C@]([C@H](CN(C)C)C)(OC(=O)CC)(Cc1ccccc1)c2ccccc2,0.0049194164240638 +[C@]243c1c(ccc(c1)O)C[C@H]([C@@H]2CCCC3)N(CC4)C,0.0005828171063193 +OC(=O)[C@@H](N)Cc2cc(I)c(Oc1cc(I)c(O)c(I)c1)c(I)c2,0.0000107225144304 +[C@H]1([C@@H]([C@H]([C@H]([C@H](O1)[C@@H]([C@@H](C)O)NC(=O)[C@@H]2C[C@H](CN2C)CCC)O)O)O)SC,0.0819112910065633 +OC(=O)[C@@H](N)Cc2cc(I)c(Oc1cc(I)c(O)cc1)c(I)c2,0.0000025653886064 +CCN(CC)C(=O)N[C@H]2/C=C1/c3cccc4N\C=C(\C[C@H]1N(C)C2)c34,0.0002461244703153 +[H][C@]([C@@H](C(CC1N)N)O)([C@]([H])1O[C@@H](O2)[C@@H](C[C@@H]([C@@H]2CO)O)N)O[C@@H]3O[C@@H](CO)[C@H]([C@H]3O)O[C@]([H])(O[C@@H]4CN)C(N)[C@H](O)[C@]([H])4O[C@H]5[C@H](O)[C@H](O)[C@@H](O)[C@@H](O5)CO,0.0219226361983156 +N2([C@@H](CC(=O)c1ccccc1)CCC[C@H]2C[C@@H](c3ccccc3)O)C,0.0004948803882992 +C1=CC=C3C(=C1)CCC4=C(N3CCCN(C)CC(=O)C2=CC=C(Cl)C=C2)C=CC=C4,0.0083540517795586 +C2(Cl)=CC=CC(Cl)=C2OC(C)C1=NCCN1,0.0001543616147738 +C1CCC(NC(=O)N(N=O)CCCl)CC1,0.0150195639448307 +O=C1N(C(C(O)=O)=C2Cl)[C@@](CC2)([H])[C@@]([H])1NC([C@H](N)C(\C=C/C)=C)=O.O,0.0181356339866893 +C4(=C1C3=C(CCC2=C1C=CC(Cl)=C2)C=CC=N3)CCN(C(=O)OCC)CC4,0.0004361643218525 +C1=C(Cl)C=C3C(=C1)NC(=O)C(O)N=C3C2=CC=CC=C2Cl,0.0005199931124266 +C3=CC=CC(CC(=O)N(C1=CC=C(Cl)C=C1)C2CCN(C(C)C)CC2)=C3,0.0179825285311553 +N4(CC3C=CC(C2C(C1NN=NN=1)=CC=CC=2)=CC=3)C(CO)=C(Cl)N=C4CCCC,0.0039488249313768 +C[C@@H](CC)C(=O)O[C@H]2C[C@@H](C)\C=C3\C=C/[C@H](C)[C@H](CC[C@@H]1C[C@@H](O)CC(=O)O1)[C@@H]23,0.0032876880285638 +C1=CC=C3C(=C1)N=C(N2CCN(C)CC2)C4=C(O3)C=CC(Cl)=C4,0.0127208602156836 +C1=CC=C2C(=C1)C(=O)C3=C(S2)C(C)=CC=C3NCCN(CC)CC,0.0978024235969229 +CCN(CC)C(=O)[C@@H]2/C=C1/c3cccc4N\C=C(\C[C@H]1N(C)C2)c34,0.0000386480001979 +N[C@@H](CCCCN)C(O)=O,0.6840527333515930 +[C@@H]1([C@@H]([C@H]([C@@H]([C@H](O1)CO)O[C@@H]2[C@@H]([C@H]([C@@H]([C@H](O2)CO)O)O)O)O)O)O,0.2921444006669310 +C1=CC=CC(C(O)C(=O)O)=C1,0.4383908964022500 +O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO,5.4838344902998200 +O[C@H]([C@H](O)CNCCCl)[C@H](O)[C@H](O)CNCCCl,0.0109109253028224 +C1=CC=C3C(=C1)C4N(C3(O)C2=CC=C(Cl)C=C2)CCN=4,0.0001169487050337 +C2=C(OC)C=CC(CC(C)N(CCCCOC(=O)C1=CC(OC)=C(OC)C=C1)CC)=C2,0.0157141523518499 +NC(=O)OCC(C)(C(C)CC)COC(N)=O,0.0861041653751042 +C1CC2C(C)(C)C(C)(NC)C1C2,0.0024926604003057 +ClCCN(C)CCCl,0.0025632054421978 +C4=C(Cl)C=CC(C(C1=CC=CC=C1)N3CCN(CC2=CC=CC(C)=C2)CC3)=C4,0.0042716647838942 +C2=CC=CC(NC1=CC=CC(C)=C1C)=C2C(=O)O,0.0862050744119716 +[C@@H]([C@H]([C@@H]([C@@H](CO)O)O)O)(CNC)O,0.5122594442456310 +O=C(C)NCCC1=CNC2=C1C=C(OC)C=C2,0.0003586215328767 +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O,0.0003276537826646 +OC1=C(C)C=C(O)C2=CC=CC=C12,0.0009586907613784 +C1=CC=C2C(=C1)C(=O)C(C)=CC2=O,0.0001933988837458 +Clc1cc(c(O)c(c1)c2cc(Cl)cc(c2O)[N+]([O-])=O)[N+]([O-])=O,0.0057955586547627 +OC(CC(C1)C)C(C1)C(C)C,0.0127985747507158 +C#CC(O)(C)CC,0.1701574414841800 +C3=CC=C(C(O)(C(=O)OC1C[N+](C)(C)CCC1)C2=CC=CC=C2)C=C3.[Br-],0.0079221574989620 +C2CC(C(=O)OCC)(C1=CC=CC=C1)CCN2C,0.0606470457570639 +C1=CC=C(C)C(OCC(O)CO)=C1,0.2743990715213500 +C2=CC=C(OCC1OC(=O)NC1)C(OC)=C2,0.0895956111052326 +C1=CC=CC(CC(C)(C)NC)=C1,0.0061252223302575 +C2=CC=CC(C1(CC)NC(=O)N(C)C1=O)=C2,0.0458186454029053 +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NC(=O)N2C,0.0406071813150441 +C2CCCC(C(=O)NC1=C(C)C=CC=C1C)N2C,0.0270755213823957 +[C@@]42([C@H]([C@@H]1CCC=3[C@@]([C@H]1C(C2)=O)(\C=C/C(C=3)=O)C)C[C@@H]([C@@]4(C(=O)CO)O)C)C,0.0021479121005635 +NC(=O)OCC(C)(CCC)COC(N)=O,0.1832758916143030 +C1=CC=C4C(=C1)N(CC2CN3CCC2CC3)C5=C(S4)C=CC=C5,0.0005178823215071 +S=C1NC=NC2=C1N=CN2,0.0164282273745524 +SCCS(=O)(=O)O,0.0281299411999839 +C1=CC=C3C(=C1)N(CCC2CCCCN2C)C4=C(S3)C=CC(S(=O)C)=C4,0.0129341362224262 +COc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C)c4cc3,0.0000026736658729 +C2(N)=C(C)C=CC(S(=O)(=O)NC(=O)NC1CCCCC1)=C2,0.0106936471129850 +c1(cc(ccc1)O)[C@H]([C@H](C)N)O,0.0498190783984835 +C2(C)=CC(C)=CC(OCC1OC(=O)NC1)=C2,0.4836105732638380 +CN(C)C(=N)NC(N)=N,0.3871058449576060 +CC(=O)OC(C)C[N+](C)(C)C.[Cl-],0.0021309538057251 +[C@]\21([C@H]([C@@H](C(=C(/C1=O)C(=O)N)\O)N(C)C)[C@H]([C@H]3/C(=C/2O)C(c4c(C3=C)cccc4O)=O)O)O,0.0339045358573015 +C(=O)(C(CC(C)N(C)C)(C1=CC=CC=C1)C2=CC=CC=C2)CC,0.0016157950820239 +C2=CC=CC(C(CC(C)N(C)C)(C(CC)OC(=O)C)C1=CC=CC=C1)=C2,0.0065912726910220 +C1=C(OC)C=C2C(=C1)C=C(C(C(C)(C)C(O)=O)CC)C=C2,0.0005238061514956 +[C@@]2\1(\C(=C/C(/C=C/1)=O)CC[C@@H]4[C@@H]2CC[C@@]3([C@](O)(C)CC[C@H]34)C)C,0.0002220113281031 +C1=CC=C2C(=C1)C(C(=O)OCC[N+](C)(CC)CC)C3=C(O2)C=CC=C3.[Br-],0.0158681052606837 +C2C=CSC=2CN(CCN(C)C)C1=CC=CC=N1,0.0255178360874998 +C1=CC=C3C(=C1)N=C(C)N(C2=C(C)C=CC=C2)C3=O,0.0199764150453409 +C1(=O)C(CC)(CC)C(=O)NC(=O)N1C,0.0252246176528130 +N1N(C)C(=NC(=O)C)SC=1S(=O)(=O)N,0.0211620487267176 +C1=CC=C3C(=C1)N(CC2CCN(C)C2)C4=C(S3)C=CC=C4,0.0016867399971258 +OC[C@H](CC)NC(=O)[C@@H]2/C=C1/c3cccc4N\C=C(\C[C@H]1N(C)C2)c34,0.0000391831751570 +O=C2N1[C@]([C@@]([H])2NC(C(C(OC)=CC=C3)=C3OC)=O)([H])SC(C)(C)[C@@H]1[C@@](O)=O,0.5257409332690180 +N/1C(N(\C=C\1)C)=S,0.0087592673048085 +C1(OC)=CC=CC=C1OCC(O)COC(N)=O,0.4145240952493470 +C1(=O)N(C)C(=O)NC(=O)C1(C(C)C#CCC)CC=C,0.0076247314569581 +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,0.0011002569540090 +COC2=CC1=C(C=C2)SC3=C(C=CC=C3)N1C[C@H](C)CN(C)C,0.0101378609040427 +C1(OC)=CC=C(OC)C(C(O)C(C)N)=C1,0.0015762748015953 +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2,0.0027753429283106 +C1=CC=C(OC)C(CC(C)NC)=C1,0.0557852731118665 +C2=CC=CC(C1(C)C(=O)N(C)C(=O)C1)=C2,0.0984072200983757 +O[C@H]2C[C@@H](O[C@H](C)[C@H]2O[C@@H]3O[C@H](C)[C@@H](O[C@H]4C[C@H](O)[C@H](OC)[C@@H](C)O4)[C@@H](O)C3)O[C@H]1CC[C@@]5(C)[C@@](CC[C@]6([H])[C@@]([H])5C[C@@H](O)[C@@]7(C)[C@@](O)6CC[C@@H]7[C@@](CO8)=CC8=O)([H])C1,0.0000083903060693 +O=C(O)[C@](N)(C)CC1=CC=C(O)C(O)=C1,0.1576596303757550 +[Cl-].CN(C)c1ccc2nc3ccc(cc3[s+]c2c1)N(C)C,0.0203218849004706 +C(C1=CC=C(C=C1)O)(=O)OC,0.0657257802143055 +C2C(C)CCN(CCCC(=O)C1=CC=C(F)C=C1)C2,0.0253274740630793 +C2=CC=CC(C(C(=O)OC)C1CCCCN1)=C2,0.0042862134458859 +[C@@]2\1(\C(=C/C(/C=C/1)=O)[C@H](C[C@@H]4[C@@H]2[C@H](C[C@@]3([C@](C(=O)CO)(O)CC[C@H]34)C)O)C)C,0.0111357206680578 +C=1C(=O)\C=C2/[C@](C)(C=1)[C@@H]3[C@@H](C[C@@H]2C)C4[C@](C)(C[C@H]3O)[C@](C(=O)COC(=O)C)(OC(=O)CC)CC4,0.0088240794697020 +[C@@]2\1(\C(=C/C(/C=C/1)=O)[C@H](C[C@@H]4[C@@H]2[C@H](C[C@@]3([C@](C(COC(=O)C)=O)(O)CC[C@H]34)C)O)C)C,0.0100118298052317 +[Na+].[O-]C(=O)CCC(=O)OCC(=O)[C@@]4(O)CC[C@H]3[C@@H]2C[C@H](C)\C1=C\C(=O)/C=C\[C@]1(C)[C@H]2[C@@H](O)C[C@@]34C,0.0083983652793453 +O=C(COC(CCCCCCC(N(C)CCS([O-])(=O)=O)=O)=O)[C@]2(O)[C@@]1(C)C[C@H](O)[C@]([C@](C[C@@H]4C)([H])[C@@]([H])1CC2)([H])[C@](C=C3)(C)C4=CC3=O.[Na+],0.0060983662082070 +CC1=CC(=O)NC(=S)N1,0.0703339243727445 +C1C(C)C(=O)C(CC)(CC)C(=O)N1,0.0363988634386678 +C1=2c4c3c(C[C@H]1N(C)C[C@@H](C=2)C(N[C@H](CO)CC)=O)cn(c3ccc4)C,0.0002829190615529 +C1=CC=C2C(=C1)N(C)C3=C(S2)C=CC(CC(O)=O)=C3,0.0460686455250650 +C1(CCOC)=CC=C(OCC(O)CNC(C)C)C=C1,0.0249472722383239 +c2(C(N[C@H]1C(O[C@@H]([C@H]([C@@H]1O)O)CO)O)=O)c(c(N(C(=O)C)C)c(c(c2I)NC(=O)C)I)I,0.1317963863940050 +C1(I)=C(NC(C)=O)C(I)=C(N(C)C(C)=O)C(I)=C1C(O)=O,0.1592508458011480 +N1(C(=CN=C1C)[N+](=O)[O-])CCO,0.1945616228659570 +C1(S(N)(=O)=O)=C(Cl)C=C2C(=C1)S(=O)(=O)N(C)C(CCl)N2,0.0004635832587482 +N2=CC=CC(C(=O)C(C)(C)C1=CN=CC=C1)=C2,0.3314569042384760 +O=C(O)[C@](N)(C)CC(C=C1)=CC=C1O,0.3416743539127500 +N21[C@H](SC([C@@H]1C(=O)O)(C)C)[C@@H](C2=O)NC([C@H](NC(N3C(N(S(=O)(=O)C)CC3)=O)=O)c4ccccc4)=O,0.4948275692716900 +C1=CC=C2C(=C1)C4N(C3=C(C2)C=CC=C3)CCN(C)C4,0.0056739777761639 +CC(C)[C@H]3c4ccc(F)cc4CC[C@]3(OC(=O)COC)CCN(C)CCCC=1Nc2ccccc2N=1,0.0033694576642325 +C3=C(Cl)C(C(CN1C=NC=C1)OCC2=CC=C(Cl)C=C2Cl)=CC=C3Cl,0.1441861962864360 +C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2F)=CN=C4C,0.0002557039766351 +C1(OC)=CC=C(OC)C(C(O)CNC(=O)CN)=C1,0.0009831591909339 +C/23=C1/C(=C\C(CC1)=O)CC[C@H]\2[C@H]5[C@](C[C@@H]3c4ccc(cc4)N(C)C)([C@@](C#CC)(O)CC5)C,0.0232778087760598 +C1[C@@H]([C@H]([C@@H]([C@H]([N@]1CCO)CO)O)O)O,0.0241284467244861 +C2(C)NC(=O)C(C#N)=CC=2C1=CC=NC=C1,0.0002367207248426 +C1=CC=C2C(=C1)C4N(C3=C(C2)C=CC=N3)CCN(C)C4,0.0028264251608217 +C1(C[C@H]([C@@H]([C@H]1CCCCCCC(=O)OC)/C=C/CC(O)(CCCC)C)O)=O,0.0000347681404210 +O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H],0.0016181752486785 +O=C(CC/C=C/CCC(OCCC[N+]4(C)C(CC6=CC(OC)=C(OC)C(OC)=C6)C3=CC(OC)=C(OC)C=C3CC4)=O)OCCC[N+]1(C)C(CC5=CC(OC)=C(OC)C(OC)=C5)C(C=C2OC)=C(C=C2OC)CC1.[Cl-].[Cl-],0.0002272382696878 +C2=CC=CC(C(S(=O)CC(N)=O)C1=CC=CC=C1)=C2,0.0121821795565467 +c1(c(cc2c(c1)C[C@@H](C(=O)O)N(C2)C([C@@H](N[C@H](C(=O)OCC)CCc3ccccc3)C)=O)OC)OC,0.0016707849275383 +C2(=O)C(CCCC)C(=O)N(C1=CC=CC=C1)N2,0.0215258986266218 +C2(CN1CCOCC1)CCC3=C(C2=O)C(CC)=C(C)N3,0.0135685720897873 +[C@]23([C@](OC(c1occc1)=O)([C@H](C)C[C@H]2[C@H]5[C@]([C@H](C3)O)([C@@]\4(\C(=C/C(/C=C/4)=O)CC5)C)Cl)C(=O)CCl)C,0.0000287670720586 +ClC2=CC=C1C=CC(/C=C/C3=CC=CC([C@H](SCC5(CC5)CC(O)=O)CCC4=C(C(O)(C)C)C=CC=C4)=C3)=NC1=C2,0.0002848938499163 +C1=CC=C3C(=C1)SC4=C(N3C(=O)CCN2CCOCC2)C=C(NC(=O)OCC)C=C4,0.0350863568806451 +OC1=C3C([C@]([C@H]4O3)5[C@](C=C[C@@H]4O)([H])[C@H](N(C)CC5)C2)=C2C=C1,0.0058527149903732 +N2(C([C@@H](CSC([C@H](NC(=O)C1CCCCC1)C)=O)C)=O)[C@H](C(=O)O)CCC2,0.0025093038714293 +O=C3N1/C(=C(\CO[C@@H]1[C@]3(OC)NC(=O)C(c2ccc(O)cc2)C(O)=O)CSc4nnnn4C)C(O)=O,0.1281527596265390 +C1=C(OCCN(C)C)C(C(C)C)=CC(OC(C)=O)=C1C,0.0190783270920119 +C2(C)=C(OC)C(CC=C(C)CCC(=O)OCCN1CCOCC1)=C(O)C3=C2COC3=O,0.2768199678731970 +c12[C@H]3[C@H](C(Oc1cc(cc2O)C(CCCCCC)(C)C)(C)C)CCC(C3)=O,0.0002684269461571 +CC(C)(C)NCC(O)COc2cccc1C[C@@H](O)[C@@H](O)Cc12,0.0345829991656771 +O=C(O)[C@@H]3N4C(=O)[C@@H](NC(=O)c1c2ccccc2ccc1OCC)[C@H]4SC3(C)C,0.2412692034000240 +C1=CC=C3C(=C1)C(CC(C(=O)OCCN(CC)CC)CC2OCCC2)=CC=C3,0.0260740065829566 +O[C@@]1(CC[C@@H]4O)[C@]2([C@H]4OC3=C6O)C3=C(C=C6)C[C@H]1N(CC5CCC5)CC2,0.0027976458817058 +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC,0.2872087059977530 +O[C@@]1(CC4)[C@]2([C@H](C4=C)OC3=C6O)C3=C(C=C6)C[C@H]1N(CC5CC5)CC2,0.0024541279876357 +OC1=C3C([C@]([C@H]4O3)5[C@](C=C[C@@H]4O)([H])[C@H](N(CC=C)CC5)C2)=C2C=C1,0.0021421120145378 +O[C@@]1(CCC4=O)[C@@]([C@H]4OC2=C5O)(CC3)C2=C(C=C5)C[C@H]1N3CC=C,0.0003054607150945 +O=C\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@H](O)CC[C@@H]23,0.0121356640416703 +CC12/C=C\C(CC1)(CC2)C(=O)O[C@H]4CC[C@H]5[C@@H]6CC\C3=C\C(=O)CC[C@@H]3[C@H]6CC[C@]45C,0.0078798007153439 +CCCCCCCCCC(=O)O[C@H]2CC[C@H]3[C@@H]4CC\C1=C\C(=O)CC[C@@H]1[C@H]4CC[C@]23C,0.0077686272317773 +O=C\1CC[C@H]5C(=C/1)/CC[C@@H]2[C@@H]5CC[C@]3(C)[C@H](CC[C@@H]23)OC(=O)CCc4ccccc4,0.0081907321939016 +C1=C(CCS(=O)(=O)NC)C=C3C(=C1)NC=C3C2CCN(C)CC2,0.0002483125626184 +C\1=C/C(O[C@@H](C/C=C/C=C/C=C/C=C/[C@@H](C[C@@H]3O[C@](C[C@H](C[C@H]2O[C@H]/12)O)(C[C@@H]([C@H]3C(O)=O)O)O)O[C@@H]4O[C@@H]([C@H]([C@@H]([C@@H]4O)N)O)C)C)=O,0.0004130833687258 +C1=C(C(=O)O)OC2=C(C1=O)C=C3C(=C2CCC)N(CC)C(C(O)=O)=CC3=O,0.0006274559987729 +Clc1cccc(c1)N4CCN(CCCN3/N=C(/CC)N(CCOc2ccccc2)C3=O)CC4,0.0212762842960937 +N[C@H]2C[C@@H](N)[C@H](O)[C@@H](O)[C@@H]2O[C@H]1O[C@H](CN)[C@@H](O)[C@H](O)[C@H]1N,0.3102140712854560 +N[C@@H]4[C@@H](O)[C@H](O)[C@H](CN)O[C@@H]4O[C@H]1[C@@H](O)[C@@H](O[C@@H]1CO)O[C@H]3[C@H](O[C@H]2O[C@H](CN)[C@@H](O)[C@H](O)[C@H]2N)[C@@H](N)C[C@@H](N)[C@@H]3O,0.1626958732224300 +C1(OC(=O)N(C)C)=CC=CC([N+](C)(C)C)=C1,0.0279903226034708 +NC(=O)C1=CC=CN=C1,0.0682090258637490 +C2=NC=CC(C(=O)NNCCC(=O)NCC1=CC=CC=C1)=C2,0.0111617722239600 +C3(C)=C(C(=O)OC)C(C1=CC=CC(N(=O)=O)=C1)C(C(=O)OCCN(C)CC2=CC=CC=C2)=C(C)N3,0.0041707943628211 +C(C(COC(=O)C1=CC=CN=C1)(COC(=O)C2=CC=CN=C2)COC(=O)C3=CC=CN=C3)OC(=O)C4=CC=CN=C4,0.0071874855239549 +[C@@H]1(O[C@@]([C@H]([C@@H]1OC(c2cnccc2)=O)OC(c3cnccc3)=O)(COC(c4cnccc4)=O)O)COC(c5cnccc5)=O,0.1110681196263930 +OC(=O)C1=CC=CN=C1,0.1015357072652450 +C1=CC=C(CO)C=N1,0.0458186454029053 +C2=CC=C(C(=O)O)C(NC1=CC=CC(C(F)(F)F)=C1)=N2,0.0442920059899687 +C1=C(N(=O)=O)C=C3C(=C1)N(C)C(=O)CN=C3C2=CC=CC=C2,0.0002820929686313 +C2=CC(C1C(C(=O)OC(C)C)=C(C)NC(C)=C1C(=O)OCCOC)=CC(N(=O)=O)=C2,0.0143389616785036 +C2(C)=C(C(=O)OC)C(C1=CC=CC=C1N(=O)=O)C(C(=O)OCC(C)C)=C(C)N2,0.0017172382607069 +C1=C(N(=O)=O)C=C3C(=C1)NC(=O)CN=C3C2=CC=CC=C2,0.0011839320580856 +C2(C)=C(C(=O)OC)C(C1=CC=CC(N(=O)=O)=C1)C(C(=O)OCC)=C(C)N2,0.0009240728469103 +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-],0.0280067350529273 +CN(=O)(CCCl)CCCl.Cl,0.0019183375226628 +C1(CN(C)C)=NC(CSCCNC(NC)=CN(=O)=O)=CS1,0.0150848929503589 +C1=CC=C3C(=C1N)CN(C)CC3C2=CC=CC=C2,0.0139723687805756 +Oc1ccc(cc1O)[C@@H](O)CN,0.0003942596737256 +[C@@]42([C@H]([C@@H]1CCC=3[C@@H]([C@H]1CC2)CCC(C=3)=O)CC[C@@]4(O)CC)C,0.0016531603466347 +[C@@]42([C@H]([C@@H]1CCC=3[C@@H]([C@H]1CC2)CCC(C=3)=O)CC[C@]4(C#C)O)C,0.0000559615467101 +O=C4C=C2[C@@](CC4)([H])[C@]1([H])[C@](CC2)([H])[C@@](CC3)([H])[C@@](CC1)(C)[C@]3(OC(C)=O)C#C,0.0000490518713847 +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1,0.0022351108775843 +[C@@]42([C@H]([C@@H]1CCC=3[C@@H]([C@H]1CC2)CCC(C=3)=O)CC[C@@]4(O)C)C,0.0017335564027484 +C1C=CC2=C(C=1)CCC3=C(C2=CCCNC)C=CC=C3,0.0063407269753586 +C1N([C@H](c3c(C1)cc2OCOc2c3OC)[C@@H]5c4ccc(c(c4C(O5)=O)OC)OC)C,0.0060471115463741 +[Na+].C/C(C)=C\Cc1cc(ccc1O)C(=O)N\C3=C(/[O-])c4ccc(O[C@@H]2OC(C)(C)[C@H](OC)[C@@H](OC(N)=O)[C@H]2O)c(C)c4OC3=O,0.0393945114022450 +C2=C(O)C=CC(C(O)C(C)NC(C)CCC1=CC=CC=C1)=C2,0.0026719455404060 +C2(N1CCN(C)CC1)=NC4=C(NC3=C2C=C(C)S3)C=CC=C4,0.0008001728373329 +CN(C)[C@H]4C[C@@H](C)O[C@@H](O[C@@H]3[C@@H](C)[C@H](O[C@H]1C[C@H](OC)[C@@H](O)[C@H](C)O1)[C@@H](C)C(=O)O[C@H](C)[C@H](C)[C@H](O)[C@@H](C)C(=O)[C@@]2(CO2)C[C@@H]3C)[C@@H]4O,0.0484111306988006 +O1CC3=C(C(=CCCN(C)C)C2=C1C=CC(CC(O)=O)=C2)C=CC=C3,0.0009869233544653 +C2=C(C(O)=O)C(O)=CC=C2N=NC1=CC(C(=O)O)=C(O)C=C1,0.0552542855157673 +O=S(C1=NC2=C(C=CC(=C2)OC)N1)CC3=C(C(=C(C=N3)C)OC)C,0.0057901297973397 +C1=CC=C2C(=C1)C4=C(N2C)CCC(CN3C(C)=NC=C3)C4=O,0.0013634986502727 +C1=CC=C3C(=C1)C=CC4=C(N3CCCN2CCN(CCO)CC2)C=CC=C4,0.0137553148473273 +C1([C@@H](CCCCCC)[C@H](C[C@@H](OC(=O)C(CC(C)C)NC=O)CCCCCCCCCCC)O1)=O,0.0121032450373367 +C2=CC=CC(C(OCCN(C)C)C1=CC=CC=C1)=C2C,0.0247604399592370 +[C@@H]1([C@@H]2N(C1=O)[C@H](C(S2)(C)C)C(=O)O)NC(c4c(c3ccccc3)noc4C)=O,0.2491055491599090 +C1(N(=O)=O)=C(CO)C=C2C(=C1)NC(CNC(C)C)CC2,0.2147959774727710 +[C@]34([C@@H]1[C@H]([C@H]2[C@](CC1)([C@](O)(C)CC2)C)CC[C@H]3CC(OC4)=O)C,0.0010866738219624 +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3,0.0069756167317143 +[C@@]12(c3c(NC(CN1C[C@H](O2)C)=O)ccc(c3)Cl)c4ccccc4,0.0030414293160574 +[Br-].[C@H]21[C@H]3C[C@H](C[C@@H]([C@@H]1O2)[N+]3(C)CC)OC([C@@H](c4ccccc4)CO)=O,0.0000242531226623 +C2(C1=CC=CC=C1)N=C(CCN(CC)CC)ON=2,0.0135740984352855 +O=C1C2=CC3=C(C=C2N(C=C1C(=O)O)CC)OCO3,0.0956997874699120 +CN(C)CC(C)CN2c1ccccc1S(=O)(=O)c3ccccc23,0.0020184932719413 +C(O)(C(=O)OCC#CCN(CC)CC)(C1=CC=CC=C1)C2CCCCC2,0.0009315038634752 +O[C@@]1(CCC4=O)[C@]2([C@H]4OC3=C5OC)C3=C(C=C5)C[C@H]1N(C)CC2,0.0169011240484160 +c2(C(=O)CCN[C@H]([C@@H](c1ccccc1)O)C)cc(OC)ccc2,0.0025527231461343 +O[C@@]1(CCC4=O)[C@]2([C@H]4OC3=C5O)C3=C(C=C5)C[C@H]1N(C)CC2,0.0004977814544285 +C3=CC=C(C(O)(C(=O)OCC1=NCCCN1C)C2CCCCC2)C=C3,0.0014515982561311 +C1=CC=C4C(=C1)NC(=O)C4(C2=CC=C(OC(=O)C)C=C2)C3=CC=C(OC(C)=O)C=C3,0.0020751779421489 +O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.O.O,0.0670742795477107 +O=C(N[C@@H](c1ccccc1)[C@@H](O)C(=O)O[C@H]3C[C@@]4(O)[C@@H](OC(=O)c2ccccc2)[C@@H]5[C@]6(OC(C)=O)CO[C@@H]6C[C@H](O)[C@@]5(C)C(=O)[C@H](OC(C)=O)\C(=C3/C)C4(C)C)c7ccccc7,0.0055392507443149 +NCCC(O)(P(O)(=O)O)P(O)(=O)O,0.0063810925810516 +[Br-].[Br-].[N+]1(C)(CCCCC1)[C@@H]6[C@@H]([C@@]5([C@H]([C@H]4[C@@H]([C@]3(C[C@H]([N+]2(C)CCCCC2)[C@H](C[C@@H]3CC4)OC(=O)C)C)CC5)C6)C)OC(=O)C,0.0001364871137739 +FC(F)OC(C=C2)=CC1=C2NC(S(CC3=NC=CC(OC)=C3OC)=O)=N1,0.0017398344597437 +O=C(NCCC(O)=O)[C@H](O)C(C)(C)CO,0.0005336739602412 +C1(OC)=C(OC)C=C3C(=C1)C(CC2=CC=C(OC)C(OC)=C2)=NC=C3,0.0294650583302081 +C1(C)OC(C)OC(C)O1,1.8916794102802900 +N1(C)C(=O)C(C)(CC)OC1=O,0.2545061264078480 +OCC(=O)[C@@]2(O)[C@H](C)C[C@H]3[C@@H]4C[C@H](F)\C1=C\C(=O)\C=C/[C@]1(C)[C@H]4[C@@H](O)C[C@]23C,0.0010192093879034 +CC(=O)OCC(=O)[C@@]2(O)[C@H](C)C[C@H]3[C@@H]4C[C@H](F)\C1=C\C(=O)\C=C/[C@]1(C)[C@H]4[C@@H](O)C[C@]23C,0.0009206031705805 +C1=CC=CC(CN(C)CC#C)=C1,0.0209134570999680 +N[C@@H]4[C@@H](O)[C@H](O)[C@H](CN)O[C@@H]4O[C@H]1[C@@H](O)[C@@H](O[C@@H]1CO)O[C@H]3[C@H](O[C@H]2O[C@H](CO)[C@@H](O)[C@H](O)[C@H]2N)[C@@H](N)C[C@@H](N)[C@@H]3O,0.0568524686560158 +FC3=CC=[C@@](C=C3)[C@H]4[C@@H](CNCC4)COC2=CC1=C(C=C2)OCO1,0.0025291059470936 +C1=C(O)C=CC(C(=O)CC)=C1,0.3329460061461830 +N2C(=O)C(C1=CC=CC=C1)OC=2N,0.0106713881125959 +O[C@@H](CNC(C)(C)C)COC1=CC=CC=C1C2CCCC2,0.0045637288011366 +[H][C@@]12[C@]([H])(NC(COC3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)[C@@](C)(C)S2)=O,0.0713491699951054 +[O-][N+](OCC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O)=O,0.0126527583329485 +C2=C(C(N)=N)C=CC(OCCCCCOC1=CC=C(C(=N)N)C=C1)=C2,0.0117502095796756 +C2=CC(C(C(C)CC)C(=O)OC1CCN(C)CC1)=CC=C2,0.0017276380064882 +OC1=CC([C@@]3(C)[C@@H](C)[C@@](N(C\C=C(C)/C)CC3)([H])C2)=C2C=C1,0.0087589057926428 +OC(=O)CN(CCN(CC(O)=O)CC(O)=O)CCN(CC(O)=O)CC(O)=O,0.0424562037564232 +C1(=O)C(CC)(C(C)CCC)C(=O)N=C(O)N1,0.0147167867093892 +n2(c\1c([C@@H](CN/C=N/1)O)nc2)[C@@H]3O[C@H](CO)[C@H](C3)O,0.0002486309084973 +N1(CCCCC(C)=O)C(=O)N(C)C2=C(C1=O)N(C)C=N2,0.0718630812833970 +CSC[C@@H]1C[C@@H]2c3cccc4N\C=C(\C[C@H]2N(C1)CCC)c34,0.0001589885074839 +C3CCCC(CC(C1CCCCC1)C2CCCCC2)N3,0.0180188037027921 +N1([C@@H](C[C@H]2[C@@H]1CCCC2)C(=O)O)C([C@@H](N[C@H](C(=O)OCC)CCC)C)=O,0.0003609542196607 +C1=CC=C3C(=C1)N(CCCN2CCN(CCO)CC2)C4=C(S3)C=CC(Cl)=C4,0.0009901758710775 +C1=CC=CC(CC(=O)NC(N)=O)=C1,0.2806026671844720 +CC(=O)NC1=CC=C(C=C1)OCC,0.2789934140814670 +C1=C(Cl)C=CC(C(O)(C)C(C)(C)O)=C1,0.0931581835272110 +C2(N)=NC(N)=CC=C2N=NC1=CC=CC=C1,0.0312795238609306 +C3=CC=CC=C3C2(N1CCCCC1)CCCCC2,0.0008217362382805 +C2=CC=CC(C1C(C)N(C)CCO1)=C2,0.0182987897494153 +O=C(O)[C@@H]2N3C(=O)[C@@H](NC(=O)C(C)Oc1ccccc1)[C@H]3SC2(C)C,0.1372057930481120 +C1=CC=CC=C1CCNC(=N)NC(N)=N,0.0081360384605641 +C2(=O)CCC(CCN(CC)CC)(C1=CC=CC=C1)C(=O)N2,0.0028885031540859 +NC(=O)NNC1=CC=CC=C1,0.1653793537768680 +C1=CC=C3C(=C1)C(C2=CC=CC=C2)C4=C3CCN(C)C4,0.0095653189999451 +C1=CC=C3C(=C1)C(=O)C(C2=CC=CC=C2)C3=O,0.0149838889446348 +C2=CC=CC(C(CCN(C)C)C1=CC=CC=C1)=N2,0.0026004458620457 +C2CNC(C)C(C1=CC=CC=C1)O2,0.0070524686743446 +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,0.0093009116185179 +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O,0.0068168638530925 +C2=CC=CC(OCC(C)N(CCCl)CC1=CC=CC=C1)=C2,0.0065827068735769 +C1=CC=C3C(=C1)OC(=O)C(C(CC)C2=CC=CC=C2)=C3O,0.0014269516346159 +C2=CC=CC(C1C(=O)N(C)C(=O)C1)=C2,0.2642558918757910 +C1=CC=CC(CC(C)(C)N)=C1,0.0041880873373682 +C3=C(C)C=CC(N(CC1=NCCN1)C2=CC(O)=CC=C2)=C3,0.0005935619639238 +C1=CC=CC(CC(N)C(O)=O)=C1,0.6053666724095780 +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC,0.0324281238741361 +O[C@@H](CNC)c1cc(O)ccc1,0.0049819078398484 +O[C@H]([C@@H](C)N)c1ccccc1,0.0198405323823281 +C2=CC=CC(OCCN(C)C)=C2CC1=CC=CC=C1,0.0130406821506427 +O=C1C(C2=CC=CC=C2)(C3=CC=CC=C3)NC(=O)N1,0.0198201912252049 +CCOC(=O)c1c(C)cc2c(c1C)C(=O)N\N=C2\CO,0.7238828496951370 +C3=CC=CC(C(=O)NC2=CC=C(S(=O)(=O)NC1SC=CN=1)C=C2)=C3C(=O)O,0.4957462247313810 +[C@]13([C@@H](N(C)c2c1cc(OC(=O)NC)cc2)N(C)CC3)C,0.0000606509319506 +C/1(=C(/C(=O)c2c(C\1=O)cccc2)C)C/C=C(/CCC[C@@H](CCC[C@@H](CCCC(C)C)C)C)C,0.0009252361693057 +c1(n(cnc1)C)C[C@@H]2[C@@H](C(=O)OC2)CC,0.0024008497087289 +C1=CC5=C(C=C1)N(C4CCN(CCCC(C2=CC=C(F)C=C2)C3=CC=C(F)C=C3)CC4)C(=O)N5,0.0003618272930367 +C1=C(Cl)C=C3C(=C1)N(CC#C)C(=O)CN=C3C2=CC=CC=C2,0.0010785019200249 +C1C=CC(OCC(O)CNC(C)C)=C2C=1NC=C2,0.0040270488819302 +C1=CC=C3C(=C1)N(CCCN2CCC(C(N)=O)CC2)C4=C(S3)C=CC(Cl)=C4,0.0006219636357267 +O=C(C)O[C@@H]4[C@@]3(C)CC[C@]2([H])[C@@]1(C)C[C@H](N6CC[N+](C)(C)CC6)[C@@H](OC(C)=O)C[C@@]([H])1CC[C@]([H])2[C@@]([H])3C[C@@H]4N5CC[N+](C)(C)CC5.[Br-].[Br-],0.0001180019624513 +C1=C(C(O)=O)C(=O)C3=C(N1CC)N=C(N2CCNCC2)N=C3,0.0438485900930935 +C3CCC(OC(=O)C(O)(C1=CC=CC=C1)C2=CC=CC=C2)C[N+]3(C)CC.[Br-],0.0005755506719186 +C1=CC=C3C(=C1)N(CCCN2CCC(CCO)CC2)C4=C(S3)C=CC(C(C)=O)=C4,0.0065031193052038 +O=C(O)[C@@H]3N4C(=O)[C@@H](NC(=O)[C@H](NC(=O)N1CCN(CC)C(=O)C1=O)c2ccccc2)[C@H]4SC3(C)C,0.7728650482176980 +C1CNCCN1,0.7743604270475850 +OC(C(=O)OCCN1CCCCC1)(C2=CC=CC=C2)C3=CC=CC=C3,0.0039183556105107 +C1N(C(=O)CCBr)CCN(C(=O)CCBr)C1,0.0084256825589270 +C3=CC=C(C(O)(C1=CC=CC=C1)C2CCCCN2)C=C3,0.0003740199182063 +C1=CC=C3C(=C1)N(C(=O)CN2CCN(C)CC2)C4=C(NC3=O)C=CC=N4,0.0071143521696526 +C3(S(=O)(=O)N)=C(OC1=CC=CC=C1)C(N2CCCC2)=CC(C(=O)O)=C3,0.0005518760446669 +C2(Cl)=C(N1CC=CC1)C=CC(C(C)C(O)=O)=C2,0.0528388443850742 +C1=CC=C3C(=C1)CCC4=C(C3=C2CCN(C)CC2)C=CS4,0.0001692381042706 +C2=C(Cl)C=CC(OC(C)(C)C(=O)NC(=O)NCN1CCOCC1)=C2,0.1124174708216240 +O=C([C@H]2O[C@H]3C[C@@H](O[C@H]7C[C@@H](O[C@H]8C[C@@](O)(C)[C@H](O)[C@@H](C)O8)[C@H](O)[C@@H](C)O7)[C@H](O)[C@@H](C)O3)C1=C(O)C(C(O)=C(C(O[C@H]5C[C@@H](O[C@H]6C[C@@H](O)[C@H](O)[C@@H](C)O6)[C@@H](O)[C@@H](C)O5)=C4)C)=C4C=C1C[C@@]2([H])[C@H](OC)C([C@@H](O)[C@@H](C)O)=O,0.0000276460637387 +C1(C(COCCOC(=O)CCCCCCCC=CCCCCCCCC)OCCO)OC(OCCO)CC1OCCO,0.0413351040189626 +O[C@H]3[N+]1(CCC)[C@H](C6)C2[C@H](O)[C@]46[C@](N(C)C5=C4C=CC=C5)([H])[C@H]1C[C@H]2[C@@H]3CC,0.0035992607930195 +C1=CC=CC(C=NO)=[N+]1C.[Cl-],0.1929180423905250 +NC2=NC1=C(S2)C[C@@H](NCCC)CC1,0.0004732001218206 +C1=CN=C2C(=C1)CC3=C(O2)C=CC(C(C)C(=O)O)=C3,0.0146904073050577 +C\2=1[C@H]([C@@H](OC(=O)[C@H](CC)C)C[C@@H](C=1)O)[C@@H](CC[C@H](C[C@H](CC(O)=O)O)O)[C@H](/C=C/2)C,0.0015711576350700 +O=C1N(C2=CC=C(C=C2C(=NC1)C3=CC=CC=C3)Cl)CC4CC4,0.0030787314764272 +[C@]24([C@@](C(COC(=O)CCCc1ccc(cc1)N(CCCl)CCCl)=O)(CC[C@H]2[C@@H]3CCC=5[C@@]([C@H]3[C@H](C4)O)(\C=C/C(C=5)=O)C)O)C,0.0051496204435911 +[C@]13([C@@](C(=O)CO)(CC[C@H]1[C@@H]2CCC=4[C@@]([C@H]2[C@H](C3)O)(\C=C/C(C=4)=O)C)O)C,0.0092386057196125 +O=[C@](COC(C)=O)[C@](CC4)(O)[C@]2(C)[C@]4([H])[C@]1([H])CCC([C@@](C=C3)(C)[C@]([H])1[C@@H](O)C2)=CC3=O,0.0082736886514061 +O=[C@](COC(CCC([O-])=O)=O)[C@](CC4)(O)[C@]2(C)[C@]4([H])[C@]1([H])CCC([C@@](C=C3)(C)[C@]([H])1[C@@H](O)C2)=CC3=O.[Na+],0.0069015742864005 +O=[C@](COC(COC(CCCCCCCCCCCCCCCCC)=O)=O)[C@](CC4)(O)[C@]2(C)[C@]4([H])[C@]1([H])CCC([C@@](C=C3)(C)[C@]([H])1[C@@H](O)C2)=CC3=O,0.0048617250924845 +CC(C)(C)CC(=O)OCC(=O)[C@@]2(O)CC[C@H]3[C@@H]4CC\C1=C\C(=O)\C=C/[C@]1(C)[C@H]4[C@@H](O)C[C@]23C,0.0072614353541886 +CC(=O)OCC(=O)[C@]2(CC[C@H]3[C@@H]4CC\C1=C\C(=O)\C=C/[C@]1(C)[C@H]4[C@@H](O)C[C@]23C)OC(=O)CCCC,0.0068434437096545 +C1=C(O)C=CC(OCC(O)CNC(C)C)=C1,0.0014781332162900 +C(C1=CC=CC=C1)(C2=CC=CC=C2)=C3CC[N+](CC)(CC)C3C.[Br-],0.0051764064982330 +C1(OC)C=C2C(=C(NC(C)CCCN)C=1)N=CC=C2,0.0028918813477278 +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2,0.0381669246255930 +O=S(=O)(C1=CC=C(C=C1)C(=O)O)N(CCC)CCC,0.0585227115429565 +C1=C(N)C=CC(C(=O)NCCN(CC)CC)=C1,0.2124718060536960 +CNNCC1=CC=C(C=C1)C(=O)NC(C)C,0.0271123209231203 +C1=CC=C3C(=C1)N(CCCN2CCN(C)CC2)C4=C(S3)C=CC(Cl)=C4,0.0044659253373231 +C3=CC=CC(C(O)(CCN1CCCC1)C2CCCCC2)=C3,0.0011585040143730 +N(C(=O)C(CCC(O)=O)NC(=O)C1=CC=CC=C1)(CCC)CCC,0.0798421004345444 +C1=CC=C2C(=C1)N(CCCN(C)C)C3=C(S2)C=CC=C3,0.0587161692024199 +C1=CC2=C(C=C1)N(CC(C)N(C)C)C3=C(S2)C=CC=C3,0.0058716169202420 +C1=CC=C2C(=C1)C(C(=O)OCC[N+](C)(C(C)C)C(C)C)C3=C(O2)C=CC=C3.[Br-],0.0027877318389307 +C1=CC=C2C(=C1)N(CC(C)N(C)C)C3=C(S2)C=CC(C(=O)CC)=C3,0.0024465290947819 +[C@@H]3(O[C@H]2[C@@H]([C@H]([C@H](O[C@H]1C[C@]([C@H]([C@@H](O1)C)OC(=O)CCC)(OC(=O)CC)C)[C@H](O2)C)N(C)C)O)[C@H]([C@@H](CC(O[C@@H](C/C=C/C=C/[C@@H]([C@@H](C[C@@H]3CC=O)C)O)C)=O)O)OC,0.0241547364008109 +C2=CC=NC(N(C(C)CN1CCCCC1)C(=O)CC)=C2,0.0090780611585349 +C1(C(C)C)=CC=CC(C(C)C)=C1O,0.0140236168927367 +O=C(CC)O[C@](CC1=CC=CC=C1)(C2=CC=CC=C2)[C@H](C)CN(C)C,0.0191474291954580 +C1=CC2C(C=C1)=C(OCC(O)CNC(C)C)C=CC=2,0.0412580322062513 +C1CCCC(CC(C)NC)C1,0.0160999028596261 +C1(I)C(=O)C(I)=CN(CC(=O)OCCC)C=1,0.2237095526976710 +C(C1=CC=C(C=C1)O)(=O)OCCC,0.0554937416932805 +C2=CC(N1N(C)C(C)=C(C(C)C)C1=O)=CC=C2,0.1302617496966640 +C1(=CC=C2C(=C1)N(C(\N=C/2C3=CC=CC=C3)=O)C(C)C)C,0.0718512105132691 +c12[C@H]([C@@H](C(=O)NNCC)[C@@H]([C@H](c1cc3c(c2)OCO3)O)CO)c4cc(c(c(c4)OC)OC)OC,0.0070178603492155 +[C@@]42([C@@]([C@@H](/C/1=C/OC(\C=C\1)=O)CC2)(CC[C@@H]5[C@]\3(CC[C@@H](/C=C/3CC[C@@H]45)O[C@H]6[C@@H]([C@@H]([C@H]([C@@H](O6)C)O)O)O)C)C)O,0.0000785829174532 +O=C([C@H](CC1=CN=CN1)N[C@]([C@H](CC2)NC2=O)=O)N(CCC3)[C@@H]3[C@](N)=O,0.0000229866863762 +[C@@]572[C@H]([C@@]1([C@H]([C@@H]([C@H]3[C@H]([C@@H]1C2)CN4[C@H]([C@]3(O)C)CC[C@@H](C4)C)O)O)O)[C@@H]([C@@H]([C@H]6[C@@]5(CC[C@@H]([C@]6(O7)O)O)C)O)O,0.0000475618266648 +C1=CC=C2C(=C1)C(CCCNC)C3=C(C=C2)C=CC=C3,0.0037968425002147 +N1(C)C(=O)N(C)C2=C(C1=O)N(CC(C)O)C=N2,0.1678956911081940 +O[C@H]([C@H](C)NC)c1ccccc1,0.0242083564825742 +C2(C=CC1=CC=CS1)=NCCCN2C,0.0969427833029240 +NC(=O)C1=NC=CN=C1,0.2436791655125750 +C1=CC=C(OC(=O)N(C)C)C=[N+]1C.[Br-],0.0765943985750378 +C1(C)=C(O)C(CO)=C(CO)C=N1,0.0394259673725590 +C2(OC)=CC=C(CN(CCN(C)C)C1=NC=CC=C1)C=C2,0.0043800633532363 +NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl,0.0050259055274507 +C3=C(Cl)C=CC(CC(=CCN1CCCC1)C2=CC=CC=C2)=C3,0.0048100297971726 +[O-]C(=O)c4cc1ccccc1c(Cc2c3ccccc3cc(C([O-])=O)c2O)c4O.CN(C)c1ccc2[n+](C)c(ccc2c1)/C=C/c4cc(C)n(c3ccccc3)c4C.CN(C)c1ccc2[n+](C)c(ccc2c1)/C=C/c4cc(C)n(c3ccccc3)c4C,0.0043425587519973 +S2C4=C(N=C(N1CCN(CCOCCO)CC1)C3=C2C=CC=C3)C=CC=C4,0.0346799316101319 +N2(C([C@@H](N[C@H](C(=O)OCC)CCc1ccccc1)C)=O)[C@@H](Cc3c(C2)cccc3)C(=O)O,0.0030329559165559 +C1(Cl)=C(S(N)(=O)=O)C=C2C(=C1)NC(CC)NC2=O,0.0114931182797183 +[H][C@]([C@@H](O)C1=C(C=C(OC)C=C4)C4=NC=C1)(C[C@@H]2CC3)N3C[C@@H]2C=C,0.0308245442282890 +Oc1ccc(cc1)c3sc2cc(O)ccc2c3C(=O)c5ccc(OCCN4CCCCC4)cc5,0.0211156103315134 +N1([C@@H](C[C@H]2[C@@H]1CCC2)C(=O)O)C([C@@H](N[C@H](C(=O)OCC)CCc3ccccc3)C)=O,0.0007994994989083 +O=C(CC3=CC(OCC)=C(C(O)=O)C=C3)N[C@@H](CC(C)C)C1=C(N2CCCCC2)C=CC=C1,0.0005899434657398 +N1(C)C(=O)N(C)C3=C(C1=O)N(CCCNCC(O)C2=CC(O)=CC(O)=C2)C=N3,0.0025680156932466 +COc1cc(cc(OC)c1OC)/C=C/C(=O)O[C@@H]4C[C@@H]5CN6CC\C3=C(\Nc2cc(OC)ccc23)[C@H]6C[C@@H]5[C@H](C(=O)OC)[C@H]4OC,0.0000263109800289 +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC,0.0000164290289770 +C1CCC(C)=C(C=CC(C)=CC=CC(C)=CCO)C1(C)C,0.0032012388829387 +n2([C@H]1[C@@H]([C@H](O)[C@H](O1)CO)O)nc(C(=O)N)nc2,0.8189850563891690 +O=C2C1=NC3=C(C=C(C)C(C)=C3)N(C[C@H](O)[C@H](O)[C@H](O)CO)C1=NC(N2)=O,0.0013285014848661 +O=C2C1=NC3=C(C=C(C)C(C)=C3)N(C[C@H](O)[C@H](O)[C@H](O)COP(O)(O)=O)C1=NC(N2)=O,0.0010956651518095 +O=C1C(C2=C(C(O)=C3C)C(O)=C(NC(\C(C)=C/C=C/[C@@H]5C)=O)C(/C=N/N4CCN(C)CC4)=C2O)=C3O[C@@](C)1O/C=C/[C@H](OC)[C@@H](C)[C@@H](OC(C)=O)[C@H](C)[C@H](O)[C@H](C)[C@H]5O,0.0243031024611509 +C1C2CC3CC1CC(C(N)C)(C2)C3,0.0185720347320474 +O=C(CN=C2C3=CC=CC=C3)NC1=C2N(N=C1C)CC,0.0049568123745889 +N1=CC(CC(O)(P(O)(O)=O)P(O)(=O)O)=CC=C1,0.0002942295731437 +O=C(N(CC)C)OC1=CC([C@H](C)N(C)C)=CC=C1,0.0007989240729724 +CN(C)CC\C2=C\Nc1ccc(cc12)Cn3cncn3,0.0018563561970331 +[Br-].C=CC[N+]1(CCCC1)[C@H]6C[C@@H]5[C@](C)(CC[C@H]2[C@H]5CC[C@H]3C[C@H](O)[C@H](C[C@]23C)N4CCOCC4)[C@H]6OC(C)=O,0.0019682513834921 +C3(=O)C(C1=CC=CC=C1)=C(C2C=CC(S(=O)(=O)C)=CC=2)CO3,0.0026498648059971 +[C@]43(\C(=C2\C(c1c(O)cccc1[C@](C2C[C@H]3[C@@H](/C(=C(\C4=O)C(NCN5CCCC5)=O)O)N(C)C)(O)C)=O)O)O,0.0110507454400701 +O=C3NC(=O)SC3Cc2ccc(OCCN(C)c1ccccn1)cc2.OC(=O)/C=C\C(O)=O,0.0002808876522886 +C1(O)=CC=CC=C1C(=O)N,0.3157449539143620 +C2(CO)=C(O)C=CC(C(O)CNCCCCCCOCCCCC1=CC=CC=C1)=C2,0.0000033689026892 +C2=CC=CC(OC(=O)C1=C(O)C=CC=C1)=C2C(=O)O,0.2583006681738720 +[C@H]1(C[C@@H]2[C@@H]3[C@H]([C@H](C1)N2C)O3)OC([C@H](CO)c4ccccc4)=O,0.0000010878417727 +[O-]C(N1)=NC(C(C(CCC)C)(CC=C)C1=O)=O.[Na+],0.0127945203489930 +C#CCN(C)[C@H](C)CC1=CC=CC=C1,0.0008917092293187 +c12C(c7c([C@H](c1cc(cc2O)C(=O)O)[C@H]4c3c(c(O)cc(c3)C(=O)O)C(c5c4cccc5O[C@H]6[C@@H]([C@H]([C@H](O)[C@H](O6)CO)O)O)=O)cccc7O[C@H]8[C@@H]([C@H]([C@H](O)[C@H](O8)CO)O)O)=O,0.0193569523079004 +c23[C@H](c1cc(Cl)c(cc1)Cl)CC[C@@H](c2cccc3)NC,0.0108741944524105 +C2=C(Cl)C=CC(C1(C(N(C)C)CC(C)C)CCC1)=C2,0.0008933419723075 +N3C(C2=CC(S(=O)(=O)N1CCN(C)CC1)=CC=C2OCC)=NC4=C(C3=O)N(C)N=C4CCC,0.0035189276162911 +O=C1C(C(O)=CC(O)=C2)=C2O[C@H]([C@](C=C5)=CC3=C5O[C@@H](CO)[C@H]([C@]4=CC(OC)=C(O)C=C4)O3)[C@H]1O,0.0145096906077944 +O=C(C(C)(C)CC)O[C@@H]1[C@@]2([H])C(C=C[C@H](C)[C@@H]2CC[C@H]3OC(C[C@H](O)C3)=O)=C[C@H](C)C1,0.0015935352639559 +C3([C@@H]1CCCCN1C(=O)C([C@@]2(O[C@@H](CC[C@H]2C)C[C@@H](/C(C)=C/C=C/C=C/[C@H](C[C@H](C([C@@H]([C@@H](/C(=C/[C@H](C(C[C@H](O3)[C@@H](C[C@@H]4CC[C@H]([C@@H](C4)OC)O)C)=O)C)C)O)OC)=O)C)C)OC)O)=O)=O,0.0001476746396460 +C1[C@@]([C@@H]([C@H]([C@H](O1)O[C@H]3[C@@H](C[C@@H]([C@@H](OC2O\C(CN)=C/CC2N)[C@@H]3O)N)N)O)NC)(O)C,0.0067035154441622 +O[C@@H]3[C@@H](C)[C@@]1([H])[C@@](CC3)(C)[C@]2([H])C([C@@](CC4)([H])[C@@](CC2)(C)[C@@]4([H])[C@H](C)CC/C(C(C)C)=C/C)=CC1,0.2343471346610190 +CC(C)[C@H](CC)CC[C@@H](C)[C@H]3CC[C@H]2[C@@H]4C\C=C1\C[C@@H](O)CC[C@]1(C)[C@H]4CC[C@@]23C,0.2411342763451860 +CC(C)=CCOC2=CC=C(C=CC(=O)C1=CC=C(OCC=C(C)C)C=C1OCC(O)=O)C=C2,0.0110982002048728 +O=[C@@](NC2=O)[C@](N2)3C1=C(OCC3)C=CC(F)=C1,0.0176545926052629 +[C@H]([C@@H]([C@@H](O)CO)O)([C@H](O)CO)O,4.5726067371569000 +S(=O)(C)(=O)NC1=CC=C(C(O)CNC(C)C)C=C1,0.0195694141438767 +c13c(C(\C(=C/N1C2CC2)C(O)=O)=O)c(c(c(c3F)N4C[C@@H](N[C@@H](C4)C)C)F)N,0.0169979705167342 +C3CCCN4C[C@@H]2C[C@@H](CN1CCCC[C@H]12)[C@@H]34,0.0426657018529288 +[C@@]13([C@H](O[C@H]2[C@H](O1)[C@H]([C@H]([C@H]([C@@H]2O)NC)O)NC)O[C@@H](CC3=O)C)O,0.2006923072201450 +Cl.Clc4ccc5Sc1ccccc1N(CCCN2CCC3(CC2)NC(=O)CS3)c5c4,0.0155443829439569 +[C@H]1(C[C@@H]([C@@H]([C@@H](OC)[C@@H](CC(=O)O[C@@H](C/C=C/C=C/[C@@H]1O[C@@H]2CC[C@@H]([C@H](O2)C)N(C)C)C)O)O[C@H]3[C@@H]([C@H]([C@@H]([C@H](O3)C)O[C@H]4C[C@@]([C@H]([C@@H](O4)C)O)(C)O)N(C)C)O)CC=O)C,0.0791172404343046 +[C@H]1(C[C@@H]([C@@H]([C@@H](OC)[C@@H](CC(=O)O[C@@H](C/C=C/C=C/[C@@H]1O[C@@H]2CC[C@@H]([C@H](O2)C)N(C)C)C)OC(=O)C)O[C@H]3[C@@H]([C@H]([C@@H]([C@H](O3)C)O[C@H]4C[C@@]([C@H]([C@@H](O4)C)O)(C)O)N(C)C)O)CC=O)C,0.0753596241482244 +[C@H]1(C[C@@H]([C@@H]([C@@H](OC)[C@@H](CC(=O)O[C@@H](C/C=C/C=C/[C@@H]1O[C@@H]2CC[C@@H]([C@H](O2)C)N(C)C)C)OC(=O)CC)O[C@H]3[C@@H]([C@H]([C@@H]([C@H](O3)C)O[C@H]4C[C@@]([C@H]([C@@H](O4)C)O)(C)O)N(C)C)O)CC=O)C,0.0741839828617427 +NC(=N)N[C@@H]3[C@@H](O[C@@H]2O[C@@H](C)[C@](O)(C=O)[C@H]2O[C@@H]1O[C@@H](CO)[C@H](O)[C@@H](O)[C@@H]1NC)[C@H](O)[C@@H](O)[C@H](NC(N)=N)[C@H]3O,0.0343894269019202 +O[C@@H]1[C@@H](O)[C@H](O[C@@H]2O[C@@H](C)[C@](O)(C=O)[C@H]2O[C@H]3[C@@H](NC)[C@H](O)[C@@H](O[C@H]4[C@@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O4)[C@H](CO)O3)[C@@H](NC(N)=N)[C@H](O)[C@H]1NC(N)=N,0.0268920341035095 +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O,0.4072081882025760 +[C@@H]12C=6CN7[C@@H](C1)[C@@]4([C@@H]3[C@@H]2[C@H](CC(N3c5ccccc45)=O)OCC=6)CC7,0.0020932288234021 +OC(=O)C(S)C(S)C(O)=O,0.0548793083275399 +C(O)(=O)CCC(O)=O,0.8468260957929680 +C[N+](C)(C)CCOC(=O)CCC(=O)OCC[N+](C)(C)C.[Cl-].[Cl-],0.0030445191735514 +C3=CC=CC(N(C(=O)CC)C2(COC)CCN(CCC1SC=CC=1)CC2)=C3,0.0000646745524780 +C1C(=O)N2C1S(=O)(=O)C(C)(C)C2C(=O)O,0.2859695207082230 +C2=CC(NS(=O)(=O)C1=CC=C(N)C=C1)=NC(=O)N2CC,0.0567391192376328 +C2=C(N)C=CC(S(=O)(=O)NC1=CC(OC)=NC(OC)=N1)=C2,0.1073054864102920 +C2=C(N)C=CC(S(=O)(=O)NC1=C(OC)C(OC)=NC=N1)=C2,0.0805596744822011 +C1=C(N)C=CC(S(=O)(=O)NC(N)=N)=C1,0.0933511136087720 +C2=C(N)C=CC(S(=O)(=O)NC(=N)NC1OC(C)=C(C)N=1)=C2,0.1293058024039240 +O=S(=O)(Nc1ccc(OC)nn1)c2ccc(N)cc2,0.0891892051950357 +N(S(=O)(=O)C1=CC=C(N)C=C1)C2=NC(C)=CC=N2,0.2523613187532310 +N(S(=O)(=O)C1=CC=C(N)C=C1)C2=NC=C(OC)C=N2,0.0891892051950357 +O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C,0.1796427408883410 +N(S(=O)(=O)C1=CC=C(N)C=C1)C2=NN=C(C)S2,0.2467342849311200 +C2=C(N)C=CC(S(=O)(=O)NC1=CC(OC)=NC(C)=N1)=C2,0.1131384832702500 +C2=C(N)C=CC(S(=O)(=O)NC1OC(C)=C(C)N=1)=C2,0.1245771578166630 +C4=CC=C(N3C(=O)C(CCS(=O)C1=CC=CC=C1)C(=O)N3C2=CC=CC=C2)C=C4,0.0328816027432651 +C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2,0.2495284398823510 +C2=C(N)C=CC(S(=O)(=O)N(C1ON=C(C)C=1C)C(=O)C)=C2,0.2156197256812790 +[Na+].[Na+].[O-]S(=O)(=O)c1cc(ccc1O)C3(OC(=O)c2c(Br)c(Br)c(Br)c(Br)c23)c4ccc(O)c(c4)S([O-])(=O)=O,0.0059666080451404 +O=S(C1=CC=C(N)C=C1)(NC2=C(OC)N=NC(OC)=C2)=O,0.1611193281968490 +[Na+].[Na+].[O-]S(=O)CNc1ccc(cc1)S(=O)(=O)c2ccc(NCS([O-])=O)cc2,0.0111496318503059 +C3=C(S(C)=O)C=CC(C=C1C(C)=C(CC(O)=O)C2=C1C=CC(F)=C2)=C3,0.0187143713301497 +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3,0.3338415422374810 +C2CCCN(C1=CC=C(S(N)(=O)=O)C=C1)S2(=O)=O,0.0344401051442634 +C2(C(=O)NCC1CCCN1CC)=CC(S(=O)(=O)CC)=CC=C2OC,0.0564231651623969 +C1=C(CS(=O)(=O)NC)C=C2C(=C1)NC=C2CCN(C)C,0.0006770470619475 +CCOC(=O)Oc1c(OC)cc(cc1OC)C(=O)O[C@@H]4C[C@@H]5CN6CC\C3=C(\Nc2cc(OC)ccc23)[C@H]6C[C@@H]5[C@H](C(=O)OC)[C@H]4OC,0.0000749945876406 +C1(=O)C(CC=C)(C(C)CC)C(=O)NC(=O)N1,0.0148490785143466 +NS(=O)(=O)c1cc(ccc1OC)C[C@@H](C)NCCOc2ccccc2OCC,0.0000325572054579 +C(O)(=O)C(O)C(O)C(O)=O,0.1998842803273090 +O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+],0.0140353923940150 +O=S([C@](CN1C=CN=N1)(C)[C@H]([C@](O)=O)N2C3=O)([C@@]([H])2C3)=O,0.0832525561531831 +O=C1\C=C/NC(=O)N1.F\C1=C\N(C(=O)NC1=O)C2CCCO2,0.0640504567567453 +C1=CC=C6C(=C1)N=C(C2=CC5=C(C(C)=C2)N=C(CCC)N5CC4=CC=C(C3=CC=CC=C3C(O)=O)C=C4)N6C,0.0025844467991626 +CN1C2=CC=C(C=C2C(=NC(C1=O)O)C3=CC=CC=C3)Cl,0.0008312720557258 +C23C(c1cc5c(cc1[C@H]([C@H]2C(=O)OC3)c4cc(c(c(c4)OC)O)OC)OCO5)O[C@H]6[C@@H]([C@H]([C@H]7[C@H](O6)COC(O7)c8sccc8)O)O,0.0106601092984052 +C1(OC)=C(OC)C=C4C(=C1)C(N)=NC(N3CCN(C(=O)C2CCCO2)CC3)=N4,0.0008595036714745 +C1=CC=C2C(=C1)C(CN(C)CC=CC#CC(C)(C)C)=CC=C2,0.0926466364638632 +CC(C)(C)NCC(O)C1=CC(O)=CC(=C1)O,0.0011097094248065 +C4=CC=CC(C(O)(C1=CC=CC=C1)C3CCN(CCCC(O)C2=CC=C(C(C)(C)C)C=C2)CC3)=C4,0.0042402217941294 +C1CC(C(C)(C)O)CCC1(O)C,0.1161004640535550 +[C@@]2\1(\C(=C/C(/C=C/1)=O)CC[C@@H]4[C@@H]2CC[C@@]3(OC(=O)CC[C@H]34)C)C,0.0138818582621658 +[C@]43(\C(=C2\C(c1c(O)cccc1[C@]([C@H]2C[C@H]3[C@@H](/C(=C(\C4=O)C(=O)N)O)N(C)C)(O)C)=O)O)O,0.0749266663690600 +N1(C(C2=CC=CC=C(C1=O)2)=O)C3C(NC(CC3)=O)=O,0.0258297367264391 +O=C2C=1/N=C\NC=1N(C)C(=O)N2C,0.0481228214293644 +S2C(CCO)=C(C)[N+](CC1=CN=C(C)N=C1N)=C2.[Cl-],0.0055517218016913 +OC[C@@H](NC(C(Cl)Cl)=O)[C@H](O)C1=CC=C(S(=O)(C)=O)C=C1,0.1403618303407260 +O[C@H](C1=CC=C(S(=O)(C)=O)C=C1)[C@H](NC(C(Cl)Cl)=O)COC(CN)=O.Cl,0.1111767152554870 +C1=CC=C3C(=C1)N(CCCN2CCN(C)CC2)C4=C(S3)C=CC(SCC)=C4,0.0012512019045495 +S=C1C2=C(N=CN2)N=C(N)N1,0.0323580656216786 +C1(=O)C(CC)(C(C)CCC)C(=O)N=C(S)N1,0.0172073843034488 +C1=CC=C3C(=C1)N(CCCN2CCN(CCOC(C)=O)CC2)C4=C(S3)C=CC(Cl)=C4,0.0033631885825936 +C1=CC=C3C(=C1)N(CCCN2CCN(C)CC2)C4=C(S3)C=CC(S(=O)(=O)N(C)C)=C4,0.0014934088501155 +C1=CC=C3C(=C1)N(CCC2CCCCN2C)C4=C(S3)C=CC(SC)=C4,0.0358902152317318 +S=P(N1CC1)(N1CC1)N1CC1,0.0021139604361735 +C1=CC=C3C(=C1)C(=CCCN2CCN(C)CC2)C4=C(S3)C=CC(S(=O)(=O)N(C)C)=C4,0.0011270773895968 +O=C1NC(=S)NC=C1,0.0259854980631830 +C2=CC=C(C(C(=O)SCCN(CC)CC)C1=CC=CC=C1)C=C2,0.0152679401350174 +N\1(C(NC(/C(=C/1)C)=O)=O)[C@@H]2O[C@H](CO)[C@H](C2)O,0.4128332348588460 +C2(I)=C(O)C(I)=CC(OC1=C(I)C=C(CC(N)C(O)=O)C=C1I)=C2,0.0000064360830915 +Cc3ccsc3C(=C\CCN1C[C@@H](CCC1)C(O)=O)\c2sccc2C,0.0028491697466103 +C1(S(=O)(=O)C)=CC=C(OC)C(C(=O)NCCN(CC)CC)=C1,0.0203089233877379 +C2=CC=CC(C(=O)C1SC(C(C)C(=O)O)=CC=1)=C2,0.0384159889189848 +C1=C(Cl)C=C3C(=C1)SC(=O)N3CC(=O)N2CCN(CCO)CC2,0.0140512700493357 +C/14=C(/C[C@H]([C@H]2[C@H]3[C@](CC[C@H]\12)([C@@](C#C)(O)CC3)C)C)CC(CC4)=O,0.0001334631393052 +O=C2N1[C@]([C@@]([H])2NC([C@H]([C@](O)=O)C3=CSC=C3)=O)([H])SC(C)(C)[C@@H]1[C@@](O)=O,0.7803815410215100 +C3=CC=C(CN1CC2=C(CC1)SC=C2)C(Cl)=C3,0.0158082891996479 +C2C=CSC=2C(=O)C1=C(Cl)C(Cl)=C(OCC(O)=O)C=C1,0.0251531518952643 +[C@]1([C@H](N(C)C)\C=C/CC1)(C(=O)OCC)c2ccccc2,0.0121812918622166 +[Br-].C3C(OC)CC(=C(C1=CC=CS1)C2SC=CC=2)C[N+]3(C)C,0.0037462848093546 +C(=O)(CCCN3CCC(N1C(=S)NC2=C1C=CC=C2)CC3)C4=CC=C(F)C=C4,0.0005031334355415 +O[C@H](COc1nsnc1N2CCOCC2)CNC(C)(C)C,0.0031603598840856 +N1C(C(=O)O)CSC1,0.0750926192365664 +N1C=C(N(=O)=O)N(CCS(=O)(=O)CC)C=1C,0.1346697751524320 +C3=CC=CC(CN1CCC2=C(C1)SC(N)=C2C(=O)OCC)=C3,0.0158018873142133 +CC(S)C(=O)NCC(O)=O,0.2040505442389550 +C2C(Cl)=C(NC1=NCCN1)C3C(C=2)=NSN=3,0.0023648925085408 +N[C@@H]3C[C@H](O)[C@@H](CN)O[C@@H]3O[C@H]2[C@H](O)[C@@H](O[C@H]1O[C@H](CO)[C@@H](O)[C@H](N)[C@H]1O)[C@H](N)C[C@@H]2N,0.0192507406401616 +C1(OC)=C(OC)C=C3C(=C1)C(CC)C(C)=NN=C3C2=CC=C(OC)C(OC)=C2,0.0065367536556926 +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2,0.0536288077256312 +C2=CC=CC(CC1=NCCN1)=C2,0.0124831726832230 +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC,0.1231746205537380 +C2(O)=C(O)C=C(C(=O)C1=CC=C(C)C=C1)C=C2N(=O)=O,0.0121870508083638 +C2CCCN(CC(C)C(=O)C1=CC=C(C)C=C1)C2,0.0203782264030735 +OC(C=C2)=C(C=C2C)[C@@](CCN(C(C)C)C(C)C)([H])C1=CC=CC=C1,0.0245785062683179 +[C@]32([C@H]([C@@H]1OC(C)(C)O[C@@H]1CO2)OC(O3)(C)C)COS(=O)(=O)N,0.0196545258862777 +CN(C)CCOc1ccc(cc1)/C(c2ccccc2)=C(/CCCl)c3ccccc3,0.0082027862771179 +C2=CC=C(C)C=C2NC1=C(S(=O)(=O)NC(=O)NC(C)C)C=NC=C1,0.0095574306871018 +[C@@]1([C@@H](CN(C)C)CCCC1)(c2cc(OC)ccc2)O,0.0253250875557000 +O=[C@](O)[C@H]2N(C([C@H](C)N[C@H]([C@@](OCC)=O)CCC3=CC=CC=C3)=O)[C@@]1([H])CCCC[C@@]([H])1C2,0.0012379883771241 +C2=CC=CC(NC(=O)C=CC1=CC=C(OC)C(OC)=C1)=C2C(O)=O,0.0152750449025220 +[C@H]1(C[C@H]1N)c2ccccc2,0.0075080520103785 +COc1cc(cc(OC)c1OC)C[C@@H]2NCCc3cc(O)c(O)cc23,0.0008685842961928 +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N,0.0131484080160276 +O[C@@H]2[C@@H](OCc1ccccc1)[C@H](O[C@H]2OCC)C(COCc3ccccc3)OCc4ccccc4,0.0277907409859896 +C(Br)(Br)(Br)CO,0.3536610389528630 +C1(S(=O)(=O)N)=C(Cl)C=C2C(=C1)S(=O)(=O)NC(C(Cl)Cl)N2,0.0001752239069929 +C(C(Cl)(Cl)Cl)OP(O)(=O)O,0.1451717187652730 +C2=CC=C(C(O)(CC[N+](CC)(CC)CC)C1CCCCC1)C=C2.[Cl-],0.0094075864811457 +NCCNCCNCCN,0.2277173760666990 +C3=C(F)C=CC(C(=O)CCCN2CCC(O)(C1=CC(C(F)(F)F)=CC=C1)CC2)=C3,0.0003248520624685 +C1=CC=C2C(=C1)N(CCCN(C)C)C3=C(S2)C=CC(C(F)(F)F)=C3,0.0070938675099862 +C3CC(C(O)(CCN1CCCCC1)C2=CC=CC=C2)CCC3,0.0008292802537359 +[C@@]153[C@@H](\C(O)=C(/C[C@@]1([C@H]2CC[C@]4([C@H]([C@@H]2CC3)CC[C@@H]4O)C)C)C#N)O5,0.0242841281852277 +C2(OC)=C(OC)C(OC)=CC(C(=O)OCC(CC)(N(C)C)C1=CC=CC=C1)=C2,0.0258084923153666 +C1=CC=C2C(=C1)N(CC(C)CN(C)C)C3=C(S2)C=CC=C3,0.0055956581445575 +CC1(C(=O)N(C)C(=O)O1)C,0.2794427910745970 +[O-]S(=O)(=O)CC12CCC(CC1=O)C2(C)C.O=C5N(Cc1ccccc1)C3C[S+]2CCCC2C3N5Cc4ccccc4,0.0001117626596765 +C2=C(OCCN(C)C)C=CC(CNC(=O)C1=CC(OC)=C(OC)C(OC)=C1)=C2,0.0429905547949116 +C2(OC)=C(OC)C=C(CC1=C(N)N=C(N)N=C1)C=C2OC,0.0183591975273984 +C2OCCN(C(=O)C1=CC(OC)=C(OC)C(OC)=C1)C2,0.1777434235288780 +C2=C(CNC1=CC(OC)=C(OC)C(OC)=C1)C(C)=C3C(=C2)N=C(N)N=C3N,0.0033024954250964 +N1(CC(C)CN(C)C)C3=C(CCC2=C1C=CC=C2)C=CC=C3,0.0113098412872651 +C1(=O)C=C(C)C2=C(O1)C(C)=C3C(=C2)C=C(C)O3,0.0007316754298308 +C2=CC=CC(CN(CCN(C)C)C1=NC=CC=C1)=C2,0.0391607015780666 +C3=CC=NC(C(=CCN1CCCC1)C2=CC=C(C)C=C2)=C3,0.0005998748524559 +C1(C)=C(O)C(C)=C4C(=C1C)OC(C)(COC3=CC=C(CC2SC(=O)NC2=O)C=C3)CC4,0.0226480098401073 +OCCN(CCO)CCO,0.0670294299415101 +[C@@]14(C[C@@H]([C@@H]([C@@H](C)[C@@H]([C@H](C(O[C@@H]([C@@H]([C@H](OC(=O)C)[C@H](C1=O)C)C)C)=O)C)O[C@H]2C[C@@H]([C@H]([C@@H](O2)C)OC(=O)C)OC)O[C@@H]3O[C@@H](C[C@@H]([C@H]3OC(=O)C)N(C)C)C)C)OC4,0.0409106790877877 +O=[N+]([O-])OCCN(CCO[N+]([O-])=O)CCO[N+]([O-])=O,0.0009395424491613 +NC(CO)(CO)CO,2.4765757213026800 +[Cl-].OC(c1ccccc1)(c2ccccc2)C(=O)O[C@@H]3C[C@@H]5CC[C@H](C3)[N+]45CCCC4,0.0004673294644685 +C2(C(=O)NC1CNCCC1)=CC(OC)=C(OC)C(OC)=C2,0.0169868010517412 +O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2,0.4896555371227450 +[Cl-].[Cl-].Oc7ccc1cc7Oc6cc5c(CC[NH+](C)[C@H]5Cc4ccc(Oc3c2c(CC[N+](C)(C)[C@@H]2C1)cc(OC)c3O)cc4)cc6OC,0.0009785149511363 +CCCCNC(=O)OCC(C)(COC(N)=O)CCC,0.1822446076918740 +[Na+].Ic1c(NC(=O)CCC)c(I)cc(I)c1CC(CC)C([O-])=O,0.0754143763571948 +Oc1ccc(C[C@H](N)C(O)=O)cc1,0.5519112853384660 +[C@@]43([C@H]([C@H]2[C@@H]([C@@]1([C@@H](C[C@@H](CC1)O)C[C@@H]2O)C)CC3)CC[C@@H]4[C@@H](CCC(=O)O)C)C,0.0254730342459472 +CC(C)[C@H](N)C(=O)OCCOCn2cnc1c2\N=C(\N)NC1=O,0.1541612594604910 +C(=O)(O)C(CCC)CCC,0.2891588321034260 +CCCC(C(N)=O)CCC,0.2324985819681080 +OC(=O)[C@@H](C(C)C)N(Cc1ccc(cc1)c2ccccc2C\3=N\N=N/N/3)C(=O)CCCC,0.0122382787827555 +[C@@]54([C@H]([C@H]3[C@@H]([C@]2(CC(N1CCCCC1)[C@H](C[C@@H]2CC3)OC(=O)C)C)CC4)CC(C5OC(=O)C)[N+]6(C)CCCCC6)C.[Br-],0.0001568058325748 +C(C1(O)CCCCC1)(C2C=CC(OC)=CC=2)CN(C)C,0.0225304971006314 +C1(=O)C(CC)(C(C)=CCC)C(=O)NC(=O)N1,0.0148490785143466 +O[C@@H]([C@](O)(C(N)=O)[C@@]([H])3N(C)C5=C4C=C([C@@]6([C@](OC)=O)C[C@H](C9)C[C@](CC)(O)CN9CCC7=C6NC8=C7C=CC=C8)C(OC)=C5)[C@]1(CC)C=CCN2[C@@]([H])1[C@]34CC2,0.0001432501143017 +n\24c1c(CCN3[C@H]1[C@](/C=C/2C(=O)OCC)(CCC3)CC)c5c4cccc5,0.0014267206050756 +C1(/NC(C(NC(C(NC(C(CNC(C(NC1=O)[C@@H]2NC(=N)N[C@H](C2)O)=O)NC(CC(CCCN)N)=O)=O)CO)=O)CO)=O)=C/NC(=O)N,0.0972742756267621 +C1=CC=C3C(=C1)OC(=O)C(C(CC(C)=O)C2=CC=CC=C2)=C3O,0.0005416311660411 +OC(=O)c1cccnc1.OCCN(C)CC(O)Cn2cnc1N(C)C(=O)N(C)C(=O)c12,0.0575445059567080 +C2(S(N)(=O)=O)=C(Cl)C=C(O)C(C(=O)NC1=C(C)C=CC=C1C)=C2,0.0018798867896663 +C1([C@@H]([C@H]([C@@H](CO1)O)O)O)O,2.7775946030737400 +C5=CC=CC(C)=C5S(=O)(=O)NC(=O)C4=CC=C(CC1=CN(C)C3=C1C=C(NC(=O)OC2CCCC2)C=C3)C(OC)=C4,0.0011586394147728 +N\1(C(\N=C(/C=C/1)N)=O)[C@@H]2O[C@@H](CC2)CO,0.0001775418549005 +C3=CC(C1=CC=NC2N1N=CC=2C#N)=CC(N(CC)C(=O)C)=C3,0.0016375515460288 +O[C@@H]([C@@H]1O\C(=C/[C@H](NC(N)=N)[C@H]1NC(C)=O)C(O)=O)[C@H](O)CO,0.0010020769775673 +Oc1cc(O)cc2CCCCC[C@@H](O)CCC[C@H](C)OC(=O)c12,0.0000015508877281 +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2,0.0374193659438118 +C1(C(C)N(O)C(=O)N)SC2=C(C=1)C=CC=C2,0.1692833785982980 +C1=CC=C5C(=C1)SN=C5N4CCN(CCC2=C(Cl)C=C3C(=C2)CC(=O)N3)CC4,0.0064658986567495 +C2=C(Cl)C=CC(C(=O)C1N(C)C(CC(O)=O)=CC=1C)=C2,0.0342783227040825 +O=C1C(C(O)=C(C[C@](/C(C)=N/NC(C6=CC=CC=C6)=O)(O)C5)C([C@H]5O[C@H]4C[C@H](N)[C@H](O)[C@H](C)O4)=C3O)=C3C(C2=C1C=CC=C2OC)=O.Cl,0.0102621736134008 +C1(Cl)=CC=C2C(=C1)C(OCCN(C)C)=CC3=C(S2)C=CC=C3,0.0225999173988086 diff --git a/test/data/ISSCAN-multi.csv b/test/data/ISSCAN-multi.csv new file mode 100644 index 0000000..b404683 --- /dev/null +++ b/test/data/ISSCAN-multi.csv @@ -0,0 +1,59 @@ +SMILES,ISSCAN +CC(CCl)Cl,1 +C(Br)(Br)Br,1 +C=C(C)CCl,1 +O=Cc1ccco1,1 +COC34(C(COC(N)=O)C=1C(=O)C(N)=C(C)C(=O)C=1N4(CC2NC23)),1 +CC(N)Cc1ccccc1.CC(N)Cc1ccccc1,1 +Cc1cc(ccc1(N))C(=C2C=CC(=N)C=C2)c3ccc(N)cc3,1 +Oc1ccc(cc1)c2ccccc2,1 +CC(C)C=O,1 +N#CC(C#N)=Cc1ccccc1Cl,1 +Nc1ccc(cc1(N))[N+](=O)[O-],2 +NC(CCC(=O)NNc1ccc(CO)cc1)C(O)=O,2 +c1ccc2c(c1)nc(s2)SSc4nc3ccccc3s4,2 +C=CC=O,2 +CC(=O)Nc3cccc2Cc1ccccc1c23,2 +Cc1cccc2cccnc12,2 +Cc1ccc2ncccc2(c1),2 +CBr,2 +Nc1cc(ccc1(C(=O)O))[N+](=O)[O-],2 +C1N2CN3CN1CN(C2)C3,2 +O=[N+]([O-])c2cccc1ccccc12,2 +Oc1cccc2cccnc12,2 +O=CC(=C(C(=O)O)Cl)Cl,2 +CC1CN(N=O)C(=O)NC1(=O),2 +O1C2C1C3C4C2C5C3C6(C4(C(C5(C6(Cl)Cl)Cl)Cl)Cl)Cl,2 +OCCNc1ccc(cc1[N+](=O)[O-])N(CCO)CCO,2 +Cc1cc(N)ccc1(N).OS(=O)(=O)O,2 +CC(O)CCl,2 +O=[N+]([O-])C(Cl)(Cl)Cl,2 +Cc1ccc(cc1)S(=O)(=O)NC(=O)NN2CCCCCC2,2 +c1cc2ccc3cccc4ccc(c1)c2c34,2 +CC(=O)Nc1ccc(cc1)C(=O)CCl,2 +FC(F)Cl,2 +CN(N=O)c1ccc(cc1)[N+](=O)[O-],2 +C=CC,2 +Oc4c(cc1cc(ccc1c4(N=Nc2ccc(c3ccccc23)S(=O)(=O)[O-]))S(=O)(=O)[O-])S(=O)(=O)[O-],0 +CC=NN(C)C=O,0 +Nc2ccc(N=Nc1ccccc1)c(N)n2,0 +Cc3cc(C)c(N=Nc1cc(c2ccccc2(c1(O)))S(=O)(=O)[O-])c(c3)S(=O)(=O)[O-],0 +[O-]c1ccccc1c2ccccc2,0 +NNC(N)=O,0 +CNNCc1ccc(cc1)C(=O)NC(C)C,0 +c1cc(c(cc1c2ccc(c(c2Cl)Cl)Cl)Cl)Cl,0 +CCN(Cc1cccc(c1)S(=O)(=O)[O-])c2ccc(cc2)C(=C3C=CC(C=C3)=[N+](CC)Cc4cccc(c4)S(=O)(=O)[O-])c5ccc(cc5)S(=O)(=O)[O-],0 +COC(=O)C(c1ccccc1)C2CCCCN2,0 +CCCCC(CC)COS(=O)(=O)[O-],0 +Nc1ccccc1,0 +Cc1cccc(N)c1,0 +CN(C)CCN(Cc1cccs1)c2ccccn2,0 +CN(C)CCOC(C)(c1ccccc1)c2ccccn2,0 +Cc1cc(C)c(cc1(C))N=Nc3c(O)c(cc2cc(ccc23)S(=O)(=O)[O-])S(=O)(=O)[O-],0 +Cc1ccccc1(N),0 +CCC1(C(=O)N=C([O-])NC1(=O))c2ccccc2,0 +Nc5cc(cc6cc(c(N=Nc1ccc(cc1(O))c4ccc(N=Nc2c(O)c3c(N)cc(cc3(cc2S(=O)(=O)[O-]))S(=O)(=O)[O-])c(O)[c-]4)c(O)c56)S(=O)(=O)[O-])S(=O)(=O)[O-],0 +O=C1[N-]S(=O)(=O)c2ccccc12,0 +CN(C)c1ccc(cc1)C(c2ccc(cc2)N(C)C)=C3C=CC(C=C3)=[N+](C)C,0 +C13(C4(C2(C5(C(C1(C2(Cl)Cl)Cl)(C3(C(C45Cl)(Cl)Cl)Cl)Cl)Cl)Cl)Cl)Cl,0 +CCOCCc1c(nc(N)[n+]2[nH]cnc12)c3ccccc3,0 diff --git a/test/data/LOAEL_log_mg_corrected_smiles.csv b/test/data/LOAEL_log_mg_corrected_smiles.csv new file mode 100644 index 0000000..e7dde1f --- /dev/null +++ b/test/data/LOAEL_log_mg_corrected_smiles.csv @@ -0,0 +1,568 @@ +SMILES,LOAEL_log_mg_kg_bw_day +'C1=C(C(=CC(=C1NN=C3C2=C(C=C([S]([O-])(=O)=O)C=C2)C=CC3=O)OC)[S]([O-])(=O)=O)C.[Na+].[Na+]',3.57275546515422 +'O1C(=O)C(O)=C(O)C1C(O)CO',3.48444220764241 +'C1(C)=C(C=CC(C)=CC=CC(C)=CC=CC=C(C)C=CC=C(C)C(=O)OC)C(C)(C)CCC1',2.69897000433602 +'c(cccc1)(c1)C(C)C',2.66464197555613 +'O=C(OCCCC)c(c(ccc1)C(=O)OCCCC)c1',2.77815125038364 +'O=C(OCC)c(c(ccc1)C(=O)OCC)c1',3.64689362416774 +'O=C(OC(OC(OC1C)C)C1)C',2.09691001300806 +'Oc(c(ccc1)C)c1C',0.778151250383644 +'Oc(ccc(c1C)C)c1',1.14612803567824 +'O=C(OCC)C=C',2.39445168082622 +'c(cccc1)(c1)CC',2.61066016308988 +'OCCO',2.39794000867204 +'c(ccc1C(=O)OCC(=O)OCC)cc1C(=O)OCC',3.39794000867204 +'O=C',1.91381385238372 +'O=C(O)C=CC(=O)O',3.03382569395331 +'OCC(O)CO',3.83777776955373 +'O=C(OC)c(ccc(O)c1)c1',3.17609125905568 +'O=C(OCCC)c(ccc(O)c1)c1',3.17609125905568 +'CC(CCC(=O)(O))C3CCC4C2CCC1CC(O)CCC1(C)C2CCC34C',2.69897000433602 +'OC(C(CCC1C)C(C)C)C1',2.77305469336426 +'O=C(O)C(=C)C',2.39445168082622 +'O=C(OC)c(c(O)ccc1)c1',2.55630250076729 +'Oc(cccc1)c1',2.53655844257153 +'O=C(OCCC)c(cc(O)c(O)c1O)c1',2.93651374247889 +'OCC(O)C1C(O)=C(O)C(=O)O1',3.19145101446490 +'c(cccc1)(c1)C=C',1.32221929473392 +'O=Cc(occ1)c1',1.77815125038364 +'NCCNc1cccc2ccccc12',1.89762709129044 +'CN(C)(C)CCCl',2.43933269383026 +'O=C(Nc(ccc(c1)C(=O)CCl)c1)C',3.19865708695442 +'c(ccc(c1)Cl)(c1)C(c(ccc(c2)Cl)c2)C(Cl)(Cl)Cl',1.50514997831991 +'CC(Oc1cc(Cl)c(Cl)cc1Cl)C(=O)(O)',0.939519252618618 +'O=N(=O)C(=CC=C1OC)C=C1N=NC(C(O)=C2C(=O)NC(=CC=C4)C=C4N(=O)=O)=C(C=C3)C(=C2)C=C3',3.32221929473392 +'O=N(=O)C(C=C1)=CC(OCCO)=C1NCCO',2.35983548233989 +'Cc1cccc(CC)c1N(C(=O)CCl)COCC',1.69897000433602 +'C1=C(C(=CC=C1OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-])C(=O)[O-].[Na+]',2.25527250510331 +'CCc1cccc(CC)c1N(COC)C(=O)CCl',1.17609125905568 +'O=C(Nc(ccc(OCC)c1N)c1)C',3.07371835034612 +'Oc(ccc(N)c1)c1',2.83632411570675 +'CC(N)CC(=CC=C1)C=C1',0.698970004336019 +'O(c(ccc(c1)C=CC)c1)C',2.53655844257153 +'COc1ccc(N)cc1',2.67577834167409 +'O=C(O)c(c(N)ccc1)c1',3.43949059038968 +'Clc2cccc(c2)c1ccccc1',0.602059991327962 +'O=C(NC(C(=O)OC)Cc(cccc1)c1)C(N)CC(=O)O',2.16731733474818 +'n1c2ccc(Cl)cc2ncc1Oc3ccc(OC(C)C(=O)OCC)cc3',0.568201724066995 +'COC(=O)NS(=O)(=O)c1ccc(N)cc1',2.25527250510331 +'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',-0.443697499232713 +'CNC(=O)Oc1ccccc1OC(C)C',1.69897000433602 +'CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n2cncn2',1.39794000867204 +'O=S(O)(=O)C(=CC=C1)C=C1CN(CC)=C(C=C2)C=CC2=C(C(C=C3)=CC=C3N(C)C)C(C=C4)=CC=C4N(CC)CC(C=C5)=CC(=C5)S(=O)(=O)O',2.85733249643127 +'c(c(cccc1)c1)(cccc2)c2',2.39794000867204 +'BrC(Cl)Cl',2.11394335230684 +'ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O)',1.07918124604762 +'O=C(Oc(c(c(ccc1)cc2)c1)c2)NC',1.19312459835446 +'CC1=C(SCCO1)C(=O)Nc2ccccc2',1.47712125471966 +'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',-0.568636235841013 +'O=C(O)CCl',1.47712125471966 +'ClC(=CC=C1N)C=C1',0.778151250383644 +'CC(C)OC(=O)C(O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2',0.954242509439325 +'n1c(OC)nc(C)nc1NC(=O)NS(=O)(=O)c2ccccc2Cl',1.39794000867204 +'OS(=O)(=O)C(C(=CC=C2)C1=C2)=CC=C1N=NC(C(O)=C3N=NC(C(C=C5)=C4C=C5)=CC=C4S(O)(=O)=O)=CC(=C3O)CO',2.8668778143375 +'S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1',-0.0969100130080564 +'CNP(=O)(OC)Oc1ccc(cc1Cl)C(C)(C)C',0.602059991327962 +'C(C1C2C(C(O)C(O1)OC8C(OC(OC7C(OC(OC6C(OC(OC5C(C(C(OC4C(C(C(OC3C(C(C(O2)OC3CO)O)O)OC4CO)O)O)OC5CO)O)O)C(C6O)O)CO)C(C7O)O)CO)C(C8O)O)CO)O)O',3.20411998265593 +'n1c(N)nc(N)nc1NC2CC2',1.17609125905568 +'COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl',2.69897000433602 +'O=C(O)C(Cl)(Cl)C',1.44978684698577 +'Nc1cc(N)c(O)cc1',1.39794000867204 +'FC(F)(Cl)Cl',2.17609125905568 +'ClCCl',1.69897000433602 +'O=P(OC)(OC)OC=C(Cl)Cl',0.361727836017593 +'OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl',1.30102999566398 +'ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl',-1.30102999566398 +'CN(=C1C(C=C2)=CC=C2)N(C)C(=C1)C(C=C3)=CC=C3',2.09691001300806 +'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',0.903089986991944 +'CC1=C(C)S(=O)(=O)CCS1(=O)=O',1 +'O=C(NC)CSP(OC)(OC)=S',-0.602059991327962 +'COc1ccc(N)c(OC)c1',2.44090908206522 +'COP(=O)OC',2 +'CC(=C(N(=O)=O)C=C1N(=O)=O)C=C1',1.53147891704226 +'CN(C)C(=O)C(c1ccccc1)c2ccccc2',1.47712125471966 +'N(c(cccc1)c1)c(cccc2)c2',1.49136169383427 +'C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3',-0.236572006437063 +'CCOP(=S)(OCC)SCCSCC',-1 +'NC(=S)NNC(N)=S',2.97634997900327 +'O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1',0.778151250383644 +'O=P(O)(O)CCCl',2.17609125905568 +'O=C(OCC)C(O1)C1(c(cccc2)c2)C',2.24303804868629 +'COC(=O)NC(=NC1=C2)NC1=CC(=C2)SC(C=C3)=CC=C3',1.17609125905568 +'CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1',1.39794000867204 +'c1cc(C(F)(F)F)cc(Cl)c1NC(C(C)C)C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',0.397940008672038 +'S=P(OCC)(Sc1ccccc1)CC',0.198657086954423 +'n1c(C)nc(OC)nc1NC(=O)NS(=O)(=O)c2ccsc2C(=O)OC',1.39794000867204 +'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',0.698970004336019 +'O=N(=O)N(CN1N(=O)=O)CN(C1)N(=O)=O',0.176091259055681 +'O=C(N=C(N(C1(=O))C)N(C)C)N1C(CCCC2)C2',1.69897000433602 +'n(c(c(ccc1)cc2)c1O)c2',2.15533603746506 +'c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2',1.60205999132796 +'COc1cccc(OC)c1C(=O)Nc2onc(C(C)(CC)CC)c2',1.70500795933334 +'n1c(OC)cc(OC)nc1NC(=O)NS(=O)(=O)Cc2ccccc2C(=O)OC',2.48995847942483 +'CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC',1.69897000433602 +'CN(C)(CCC1)CC1',2.17609125905568 +'O=P(SCCCC)(SCCCC)SCCCC',0.0969100130080564 +'COCC(=O)N(C(C)C(=O)OC)c1c(C)cccc1C',1.79588001734408 +'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',0.301029995663981 +'CNC(=O)ON=C(C)SC',1 +'COP(=S)(OC)Oc1ccc(cc1)N(=O)(=O)',-0.602059991327962 +'O=C1N(N)C(SC)=NN=C1C(C)(C)C',1.17609125905568 +'COP(=O)(OC)OC(Br)C(Cl)(Cl)Br',0.301029995663981 +'OC(C(N)C1O)C(C)OC1(C)OC(CC(C)(C(C2O)C(O)=O)OC(O)(C2)CC(O)CC(C)(O3)C3C=C4)C=CC=CC=CC=CCC(C)OC4=O',1.85733249643127 +'O=N(=O)c(ccc(c1N)C)c1',0.903089986991944 +'O=N(=O)c(c(N)ccc1N)c1',1.93951925261862 +'O=C(O)C(=C(N)C=C1N(=O)=O)C=C1',3.07371835034612 +'O=N(=O)c(c(c(ccc1)cc2)c1)c2',2.21748394421391 +'c12c(N=Nc3ccccc3)c(O)ccc1cc(S(=O)(=O)O)cc2',2.25527250510331 +'CC(C)Oc1cc(c(Cl)cc1Cl)N2N=C(OC2(=O))C(C)(C)C',0.698970004336019 +'CNC(=O)ON=C(SC)C(=O)N(C)C',0.698970004336019 +'CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O',0.544068044350276 +'Oc(c(c(c(c1Cl)Cl)Cl)Cl)c1Cl',1 +'NC(=N)NC(=N)NCCc1ccccc1',1.86332286012046 +'COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O)',1.30102999566398 +'CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC',1.08990511143940 +'ClC3C6(Cl)C4C2C1OC1C5C2C3(Cl)C(Cl)(C45)C6(Cl)Cl',-0.154901959985743 +'O=C(OC(=O)c1cccc2)c12',3.07371835034612 +'Nc1c(Cl)c(Cl)nc(C(=O)(O))c1Cl',1.77815125038364 +'CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1',0.397940008672038 +'Nc3ccc2cc1ccc(N)cc1nc2c3',1.67209785793572 +'CCC(=O)Nc1ccc(Cl)c(Cl)c1',1.30102999566398 +'Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2',1.39794000867204 +'O=C(N)c(nccn1)c1',2.89707700320942 +'Oc1cc(O)c2C(=O)C(O)=C(c3cc(O)c(O)cc3)Oc2c1',3.30835094858673 +'CCC(O)(C)C#C',1.66275783168157 +'CC(C(NCC)=C1)=CC(C1=O2)=C(C(C2=C3)=CC(C)=C3NCC)C(=CC=C4)C(=C4)C(=O)OCC',1.07918124604762 +'O=C(NS(=O)(=O)c1cccc2)c12',3.55654370848351 +'c1cc(Cl)ccc1C2SC(=O)N(C(=O)NC3CCCCC3)C2C',2.20411998265593 +'n(c(nc(n1)NCC)NCC)c1Cl',0.698970004336019 +'O=[S](NC1CCCCC1)(=O)[O-].[Na+]',3.55654370848351 +'O=C(OCC(C1OCC(C1O)O)O)CCCCCCCCCCC',3.83777776955373 +'O(CC1O)C(C1O)C(O)COC(=O)CCCCCCCCCCCCCCCCC',3.85751341477669 +'O=S(=O)(Nc(nc(cc1C)C)n1)c(ccc(N)c2)c2',1.51851393987789 +'CCNc1nc(NC(C)(C)C)nc(SC)n1',1.17609125905568 +'Oc(c(cc(c1)C(C)(C)C)Cl)c1',2.33445375115093 +'C(C(Cl)Cl)(Cl)Cl',2.03342375548695 +'COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl',2 +'CCN(CC)C(=O)SCc1ccc(Cl)cc1',0.698970004336019 +'COC(=O)NC(=S)Nc1ccccc1NC(=S)NC(=O)OC',1.50514997831991 +'N(C(=S)SSC(N(C)C)=S)(C)C',1.17609125905568 +'c12OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CCc1c(C)c(OC(=O)C)c(C)c2C',3.30102999566398 +'Cc1cc(N)ccc1NOS(O)(=O)=O',2.26481782300954 +'C(Br)(C(Br)(Br)Br)C1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',0.477121254719662 +'O=C(O)COc(c(cc(c1Cl)Cl)Cl)c1',1 +'FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O',1.60205999132796 +'Cc1cc(C)c(N)cc1C',1.79934054945358 +'CC(O)(C(O)C(O1)C)CC1(C)OC(C(C)O2)C(C(O)C2(C)OC(C(C)C(O)CC(=O)OC(CC)C3COC(C(OC)C4OC)OC(C)C4O)C(CC=O)CC(C)C(=O)C=CC(=C3)C)N(C)C',2.69897000433602 +'c1c(Cl)cc(Cl)cc1N2C(=O)C(C)(C=C)OC2(=O)',1.86272752831797 +'O=C(OC(CCCC(O)CCCCCc1cc(O)cc2O)C)c12',-0.698970004336019 +'COC(=O)C1(C2=CC=CC=C2C3=C1C=C(C=C3)Cl)O',2.17609125905568 +'CC(C(=O)O)OC1=CC(=CC=C1)Cl',2 +'P12P3P1P23',3.16790781000148 +'C(CO)O',2.60205999132796 +'CCCCOCC(C)OCC(C)O',2.10720996964787 +'C(CO)O',3.30102999566398 +'C(CO)O',2.96378782734556 +'[O-][As](=O)([O-])[O-]',0.795880017344075 +'[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F',0.361727836017593 +'N(C(=S)SSC(N(C)C)=S)(C)C',1.06069784035361 +'COP(=O)(N)SC',-0.0457574905606751 +'N(C(=S)SSC(N(C)C)=S)(C)C',0.737987326333431 +'COP(=O)(NC(=O)(C))SC',1.54406804435028 +'C1=CC=C(C=C1)NC(=O)NC2=CN=NS2',1.47712125471966 +'CCOP(=S)(NC(C)C)OC1=CC=CC=C1C(=O)OC(C)C',-0.301029995663981 +'CC(=NOC(=O)N(C)SN(C)C(=O)ON=C(C)SC)SC',1 +'CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C',0.176091259055681 +'NC(CCCC1)C1',1.76715586608218 +'CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1',1.51188336097887 +'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',-0.301029995663981 +'CCCCC(CC)COC(=O)C1=CC=CC=C1C(=O)OCC(CC)CCCC',2.30102999566398 +'OC(=O)CNCP(O)(O)=O',3 +'C1CNC(=S)N1',-0.638272163982407 +'O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1',0.795880017344075 +'C1=CC=C2C(=C1)NC(=S)S2',2.8750612633917 +'CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl',1 +'c(c(c(c(c1Cl)Cl)Cl)Cl)(c1Cl)Cl',-0.537602002101044 +'COc1ccc(cc1)C(c2ccc(OC)cc2)C(Cl)(Cl)Cl',2.09691001300806 +'C1=CC(=CC=C1Cl)Cl',2.47712125471966 +'CC(C)OC(=O)NC1=CC(=CC=C1)Cl',2.69897000433602 +'COP(=O)(OC)OC=C(Cl)Cl',0.332438459915605 +'CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O',-0.376750709602100 +'CNC(=O)N(C)c1nnc(s1)C(C)(C)C',1.60205999132796 +'CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2',2.39794000867204 +'CC(C(=O)O)OC1=C(C=C(C=C1)Cl)Cl',0.954242509439325 +'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',1.09691001300806 +'C(#N)c(c(c(c(c1C(#N))Cl)Cl)Cl)c1Cl',0.602059991327962 +'O=C(OCC)C(O)(c(ccc(c1)Cl)c1)c(ccc(c2)Cl)c2',1.26481782300954 +'O=C(N(C)C)Nc(ccc(c1)Cl)c1',2.09691001300806 +'O=C(N(SC(Cl)(Cl)Cl)C(=O)C1CC=CC2)C12',2 +'CCc1cccc(C)c1N(C(C)COC)C(=O)CCl',2.17609125905568 +'C1=CC(=C(C=C1Cl)Cl)OCC(=O)O',0.698970004336019 +'CCNC1=NC(=NC(=N1)Cl)NC(C)(C)C#N',0.0969100130080564 +'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',0.662757831681574 +'COP(=S)(OC)OC1=CC(=C(C=C1Cl)Cl)Cl',1.69897000433602 +'C1C2C=CC1C3C2C4(C(=C(C3(C4(Cl)Cl)Cl)Cl)Cl)Cl',-2 +'CC1(C(C1C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Cl)Cl)C',1.39794000867204 +'CCN(CC)C(=O)C(C)OC1=CC=CC2=CC=CC=C21',2 +'ClC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',-0.602059991327962 +'CC(=CC(=O)NC)OP(=O)(OC)OC',-0.346787486224656 +'CC(C)C1(C)N=C(NC1(=O))c3nc2ccccc2cc3C(=O)(O)',1.30102999566398 +'CC(C)Nc1nc(Cl)nc(NC(C)C)n1',1.69897000433602 +'CC(C(=O)O)(Cl)Cl',1.69897000433602 +'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',0.8750612633917 +'O=C(NC)CSP(OC)(OC)=S',0.698970004336019 +'C12C3(C4(C5(C3(C(C1(C5(C2(C4(Cl)Cl)Cl)Cl)Cl)(Cl)Cl)Cl)Cl)Cl)Cl',-2 +'COC(=O)C1=CC=CC=C1C(=O)OC',3.30102999566398 +'CCOP(=S)(OCC)SCSC(C)(C)C',-1.30102999566398 +'CCC(C)SP(=O)(OCC)SC(C)CC',-0.602059991327962 +'CCOP(=S)(OCC)SCSC(C)(C)C',0.301029995663981 +'C1C(C(C(=O)N1C2=CC=CC(=C2)C(F)(F)F)Cl)CCl',0.698970004336019 +'O=C(O)C(C(C(=O)O)C(O1)CC2)C12',2.06069784035361 +'O=C(Oc(c(OC(C1)(C)C)c1cc2)c2)NC',0.698970004336019 +'Oc(c(c(c(c1)Cl)Cl)Cc(c(c(cc2Cl)Cl)Cl)c2O)c1Cl',0.698970004336019 +'CC1(CON(C1=O)CC2=CC=CC=C2Cl)C',1.33243845991561 +'CCC(C)N1C(=O)C(=C(NC1=O)C)Br',1.79588001734408 +'CC1=CC(=CC(=C1N(C)C)C)OC(=O)NC',0.176091259055681 +'CNC(=O)OC1=CC=CC(=C1)N=CN(C)C',1.09691001300806 +'CC1=NN(C(=O)N1C(F)F)C2=CC(=C(C=C2Cl)Cl)NS(=O)(=O)C',1.82607480270083 +'CCOP(=S)(CC)SC1=CC=CC=C1',0.698970004336019 +'CCOP(=S)(OCC)SC(CCl)N1C(=O)C2=CC=CC=C2C1=O',0.397940008672038 +'N1CC(C)(C)CNC1=NN=C(C=Cc2ccc(C(F)(F)F)cc2)C=Cc3ccc(C(F)(F)F)cc3',0.698970004336019 +'CC1=C(C(=C(C(=C1F)F)COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)F)F',0.662757831681574 +'CC1=CC(=C(C=C1)N=CN(C)C=NC2=C(C=C(C=C2)C)C)C',1.00860017176192 +'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',-0.0969100130080564 +'CC(C)N(C(C)C)C(=O)SCC(Cl)=C(Cl)Cl',1.09691001300806 +'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',0.352182518111362 +'CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2CCC(F)(F)F',1.90254677931399 +'O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12',1.60205999132796 +'CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1',1.13987908640124 +'O=C(ON=CC(SC)(C)C)NC',-1 +'ClC(Cl)(Cl)CC1(OC1)c2cc(Cl)cc(Cl)c2',1.47712125471966 +'CCC1CCCC(C(C(=O)C2CC3C(C2CC(=O)O1)CCC4C3CC(C4)OC5CC(C(C(C5OC)OC)OC)C)C)OC6CCC(C(O6)C)N(C)C',1.38021124171161 +'CC(C)(C)C(=NOC(=O)NC)CSC',0.778151250383644 +'CON=C(CC1=CN=CC=C1)C2=C(C=C(C=C2)Cl)Cl',1.65321251377534 +'CC(=CC1C(C1(C)C)C(=O)OCN2C(=O)C3=C(C2=O)CCCC3)C',2.39794000867204 +'C1COC(O1)(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl',1 +'CCCOC(=O)C1=CN=C(C=C1)C(=O)OCCC',2.39794000867204 +'CC1=CC(=NC(=N1)NC(=O)NS(=O)(=O)C2=CC=CC=C2C(=O)OC3COC3)C',1.91907809237607 +'C1=C(C(=NC(=C1Cl)Cl)OCC(=O)O)Cl',1.55630250076729 +'CCOCN1C(=C(C(=C1C(F)(F)F)Br)C#N)C2=CC=C(C=C2)Cl',1.13353890837022 +'CC(C)CC1=C(C(=NC(=C1C(=O)SC)C(F)(F)F)C(F)F)C(=O)SC',0.559906625036112 +'CC12CC1(C(=O)N(C2=O)C3=CC(=CC(=C3)Cl)Cl)C',1.17609125905568 +'CC1=CC(=C(C=C1)C(=O)OC)C2=NC(C(=O)N2)(C)C(C)C',1.69897000433602 +'COP(=S)(OC)OC1=NC(=C(C=C1Cl)Cl)Cl',0.477121254719662 +'CC(C)CC1=C(C(=NC(=C1C(=O)OC)C(F)F)C(F)(F)F)C2=NCCS2',1.64542226934909 +'CCOC(=O)C(CC1=CC(=C(C=C1Cl)F)N2C(=O)N(C(=N2)C)C(F)F)Cl',1.07918124604762 +'CC(C)=CC3C(C(=O)OCc2coc(Cc1ccccc1)c2)C3(C)C',2.09691001300806 +'CCCSP(=S)(OCC)OC1=CC=C(C=C1)SC',1.06069784035361 +'CC1=CC(=C(C(=C1)OC(=O)NC)C)C',1.77232170672292 +'CC1=CC=CC=C1COC2CC3(CCC2(O3)C)C(C)C',2.17609125905568 +'CC1=C2C(=CC=C1)SC3=NN=CN23',1.49136169383427 +'CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl',2 +'CCCN(CCC)C(=O)SCC',0.954242509439325 +'CC(C)OC(=O)C=C(C)C=CCC(C)CCCC(C)(C)OC',1.66275783168157 +'COP(=S)(OC)Oc1ccc(SC)c(C)c1',0.574031267727719 +'COC1=C(C=C(C=C1)C(=CC(=O)N2CCOCC2)C3=CC=C(C=C3)Cl)OC',1.66558099101795 +'CCSC(=O)N(CC(C)C)CC(C)C',2 +'CC(C)OP(=S)(OC(C)C)SCCNS(=O)(=O)C1=CC=CC=C1',1.17609125905568 +'CC(=CC1C(C1(C)C)C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C',2.17609125905568 +'CC1=CC(=CC(=C1C)C)OC(=O)NC',1 +'CCOP(=S)(OCC)SCSC1=CC=C(C=C1)Cl',0 +'C1CN(CCN1C(C(Cl)(Cl)Cl)NC=O)C(C(Cl)(Cl)Cl)NC=O',2 +'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',0.301029995663981 +'C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-]',2.09691001300806 +'CCCC(=NOCC)C1C(=O)CC(CC1=O)CC(C)SCC',1.21906033244886 +'ClC2(Cl)C4(Cl)C1(Cl)C5(Cl)C(Cl)(Cl)C3(Cl)C1(Cl)C2(Cl)C3(Cl)C45Cl',-0.154901959985743 +'CCN(C1CCCCC1)C(=O)SCC',0.477121254719662 +'CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2OCCCl',2.34399906905716 +'C(C(=O)O)OC1=NC(=C(C(=C1Cl)N)Cl)F',2.69897000433602 +'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC#C',1.97772360528885 +'C1C(COC1(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl)Br',0.811575005870593 +'C1=NNC(=N1)N',0.397940008672038 +'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F',1.41497334797082 +'C1=CC(=CC=C1OS(=O)(=O)C2=CC=C(C=C2)Cl)Cl',0.397940008672038 +'FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O',3 +'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',1.8750612633917 +'C1=CC(=C(C(=C1)Cl)C#N)Cl',0.397940008672038 +'C1C(O1)COC2=CC=CC=C2C3=CC=CC=C3',2.69897000433602 +'CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC',2.57403126772772 +'O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N',1.56655533088306 +'C1=CC(=C(C2=NC=C(C=C21)Cl)C(=O)O)Cl',2.87909587950007 +'CC(C)NC(=O)N1CC(=O)N(C1=O)C2=CC(=CC(=C2)Cl)Cl',1.66275783168157 +'CCCN(CCCl)C1=C(C=C(C=C1[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',2.30621050816776 +'C1=CC=C(C=C1)C2=CC=CC=C2O',3 +'O=C(N(C)C)Nc(cccc1C(F)(F)F)c1',1.17609125905568 +'C1=CC(=NC(=C1)Cl)C(Cl)(Cl)Cl',0 +'Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2',0.8750612633917 +'CC1=CC(=C(C=C1NC(=O)C)NS(=O)(=O)C(F)(F)F)C',1.44090908206522 +'C(=C(I)I)(I)I',1.69897000433602 +'C1=C(C=C(C(=C1Cl)N2C(=C(C(=N2)C#N)S(=O)C(F)(F)F)N)Cl)C(F)(F)F',-1.22184874961636 +'O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1',0.795880017344075 +'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',1.38916608436453 +'CC1=CC2=C(C=C1)N=C3C(=N2)SC(=O)S3',0.8750612633917 +'CC(C)N(C(=O)CCl)c1ccccc1',1.36172783601759 +'CC(C)C1(C(=O)NC(=N1)C2=C(C=CC=N2)C(=O)O)C',2.69897000433602 +'CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C',1.28891960566173 +'CN1CN(C(=S)SC1)C',1.47712125471966 +'ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',1.8750612633917 +'ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl',-0.698970004336019 +'CCOC(=O)CN1C2=C(C=CC=C2Cl)SC1=O',1.09691001300806 +'CCCN(CCC)C1=C(C=C(C(=C1[N+](=O)[O-])N)C(F)(F)F)[N+](=O)[O-]',1.46834733041216 +'C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N',1.60205999132796 +'CC(C)(C)C(CCC1=CC=C(C=C1)Cl)(CN2C=NC=N2)O',1.20139712432045 +'CC1=C(C=CC=C1COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)C3=CC=CC=C3',0.698970004336019 +'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',1.60205999132796 +'C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-]',2.17609125905568 +'CC1=C(C=C(C=C1C(=O)N)[N+](=O)[O-])[N+](=O)[O-]',0.795880017344075 +'CC(C)OC1=CC=CC(=C1)NC(=O)C2=CC=CC=C2C(F)(F)F',2.69897000433602 +'OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl',0.397940008672038 +'O=P(O)(O)CCCl',2.64933485871214 +'CN(C(=O)NC1=CC=C(C=C1)Br)OC',1.09691001300806 +'CC1=CC(=CC=C1)NC(=O)OC2=CC=CC(=C2)NC(=O)OC',1.39794000867204 +'CC(C)(C)C1=NN=C(S1)N2C(CN(C2=O)C)O',1.69897000433602 +'S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1',0.230448921378274 +'COC(=O)c1ccccc1S(=O)(=O)NC(=O)N(C)c2nc(OC)nc(C)n2',1.09691001300806 +'C1=CC=C(C(=C1)NC2=NC(=NC(=N2)Cl)Cl)Cl',0.0606978403536116 +'CC1=C(C=CC(=C1)OP(=S)(OC)OC)[N+](=O)[O-]',-0.337242168318426 +'COc1c(Cl)ccc(Cl)c1C(=O)(O)',2.06069784035361 +'CC1(C(C1C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Br)Br)C',0.397940008672038 +'C1=CC=C(C(=C1)C(C2=CC=C(C=C2)F)(C3=CN=CN=C3)O)Cl',0.397940008672038 +'c1ccc2nc(NC(=O)OC)n(C(=O)NCCCC)c2c1',2.06069784035361 +'CCOC(=O)COC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',1.39794000867204 +'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)C3=CC=CC=C3)O',1.39794000867204 +'CCNC(=O)NC(=O)C(=NOC)C#N',1.48144262850231 +'CCOC1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',1.60205999132796 +'CC1=NC=C(N1CCO)[N+](=O)[O-]',2.17609125905568 +'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',2.69897000433602 +'CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2',2 +'CCCCC(CN1C=NC=N1)(C2=C(C=C(C=C2)Cl)Cl)O',0.672097857935718 +'CC(C)(C)C(C(=CC1=C(C=C(C=C1)Cl)Cl)N2C=NC=N2)O',1.69897000433602 +'C1=CC(C2C1C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl)Cl',-0.42021640338319 +'C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N',1 +'CC1=NN(C(=C1C=NOCC2=CC=C(C=C2)C(=O)OC(C)(C)C)OC3=CC=CC=C3)C',0.488550716500444 +'CS(=O)(=O)C1=C(C=CC(=C1)C(F)(F)F)C(=O)C2=C(ON=C2)C3CC3',1.30102999566398 +'CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C',1.09691001300806 +'CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC',0.176091259055681 +'C1=CC(=CC=C1C(CN)O)O',2.39794000867204 +'CC1=C(C(=CC=C1)C)N(C(=O)COC)N2CCOC2=O',1.69897000433602 +'c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2',1.27300127206374 +'CCC(C)NC1=C(C=C(C=C1[N+](=O)[O-])C(C)(C)C)[N+](=O)[O-]',1.69897000433602 +'C1=CC(=CC=C1S(=O)(=O)C2=CC(=C(C=C2Cl)Cl)Cl)Cl',2.36172783601759 +'CCCCC1=C(NC(=NC1=O)NCC)C',1.39794000867204 +'n(c(nc(n1)NCC)NCC)c1Cl',0.724275869600789 +'FC(F)(F)C(C=C1N(=O)=O)=CC(N(=O)=O)=C1N(CC)CC(C)=C',1.09691001300806 +'C1CCC(C1)N(CC2=CC=C(C=C2)Cl)C(=O)NC3=CC=CC=C3',1.39794000867204 +'CS(=O)(=O)NC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',1.69897000433602 +'CCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC3=C(O2)C=C(C=C3)Cl',0.954242509439325 +'CCC1=C(C(=CC=C1)CC)N(CNC(=O)C)C(=O)CCl',1.79588001734408 +'NC(=N)NCCCCCCCCCCCC(OC(=O)C)',1.46239799789896 +'C1=CC(=CC(=C1)Cl)NC(=O)OCC#CCCl',2.65321251377534 +'CC(C)C(C(=O)OC(C(#N))c2cccc(Oc1ccccc1)c2)c3ccc(Cl)cc3',1.39794000867204 +'CC(C)C1=C(C=CC(=C1)C(C)(C)C2=CC(=C(C=C2)O)C(C)C)O',1.39794000867204 +'CCN(CC1=C(C=CC=C1Cl)F)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',1.69897000433602 +'CCCCCCCCSC(=O)OC1=CC(=NN=C1C2=CC=CC=C2)Cl',1.82930377283102 +'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',1.13987908640124 +'CCCCNC(=O)N1C2=CC=CC=C2N=C1NC(=O)OC',2.39794000867204 +'CC1=C(C(=CC=C1)C)N(C(C)C(=O)OC)C(=O)CC2=CC=CC=C2',1.66275783168157 +'CC(C)C(C1=CC=C(C=C1)OC(F)F)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3',0.778151250383644 +'Clc1ccccc1c2nnc(c3ccccc3Cl)nn2',1.30102999566398 +'CCOC(=O)NCCOC1=CC=C(C=C1)OC2=CC=CC=C2',1 +'CCC1=C(C(=CC=C1)CC)N(CC(=O)OCC)C(=O)CCl',1.69897000433602 +'c1(O2)c(CC2(C)C)cccc1OC(=O)N(C)SN(CCCC)CCCC',1.39794000867204 +'CCCCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC=C(C=C2)C(F)(F)F',0.477121254719662 +'COC1=CC(=C(C=C1Cl)OC)Cl',2.09691001300806 +'CCOP(=S)(OCC)OC1=NN(C(=N1)Cl)C(C)C',1.09691001300806 +'n(c(nc(n1)NC(C)C)NCC)c1Cl',1.39794000867204 +'CC(C)(C)C(C(=CC1=CC=C(C=C1)Cl)N2C=NC=N2)O',1.59560643486560 +'CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O)',1.69897000433602 +'c1cc(OC(F)(F)F)ccc1C(O)(C(C)C)c2cncnc2',1.08278537031645 +'COP(=O)(C(C(Cl)(Cl)Cl)O)OC',1.30102999566398 +'C1=CC(=C(C=C1C(F)(F)F)Cl)OC2=CC(=C(C=C2)[N+](=O)[O-])C(=O)O',2.09691001300806 +'CCCN(CC1CC1)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',0.698970004336019 +'CCOC(=O)C(C)OC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',1.69897000433602 +'CCSC(=O)N1CCCCCC1',1.17055505852121 +'CCC1=CC=C(C=C1)C(=O)NN(C(=O)C2=CC(=CC(=C2)C)C)C(C)(C)C',1.68124123737559 +'ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O)',1.17609125905568 +'COC(=O)C1=CC=CC=C1S(=O)(=O)NC(=O)NC2=NC(=CC(=N2)OC(F)F)OC(F)F',2.14612803567824 +'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O',1.39794000867204 +'CC1=C(C=CC(=C1)Cl)OCC(=O)O',0.602059991327962 +'COC=C(C1=CC=CC=C1OC2=NC=NC(=C2)OC3=CC=CC=C3C#N)C(=O)OC',1.79413935576777 +'C1=CC=C(C(=C1)C(C2=CC=C(C=C2)Cl)(C3=CN=CN=C3)O)Cl',0.361727836017593 +'[O-]Br(=O)=O',0.785329835010767 +'OP(=O)OCC',2.60205999132796 +'COP(N)(=O)SC',-1 +'CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1',0.176091259055681 +'CCOP(=S)(OCC)SCCSCC',-1.39794000867204 +'CCOP(=S)(OCC)SCSP(=S)(OCC)OCC',0.301029995663981 +'O=C(OCC(CCCC)CC)CCCCC(=O)OCC(CCCC)CC',3.17609125905568 +'CN(C=Nc1ccc(C)cc1C)C=Nc2ccc(C)cc2C',1 +'[C@@]14([C@@H]5OCC1=CC=C[C@@H]([C@H](O[C@H]2C[C@@H]([C@H]([C@@H](O2)C)O[C@H]3C[C@@H]([C@H]([C@@H](O3)C)O)OC)OC)C(=CC[C@@H]6C[C@H](OC([C@@H]4C=C([C@H]5O)C)=O)C[C@]7(O6)O[C@@H]([C@H](C=C7)C)[C@H](CC)C)C)C)O',0.301029995663981 +'O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12',1.54406804435028 +'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',0.0969100130080564 +'C(#N)Cl',1.84509804001426 +'C(#N)Br',2.08635983067475 +'C1=CC(=CC=C1C(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl)Cl',-0.602059991327962 +'c(cccc1)(c1)C(C)C',2.51982799377572 +'CCCN(CCC)C(=O)SCC',1.39794000867204 +'NC(CCCC1)C1',1.77815125038364 +'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',0.778151250383644 +'CC(C)OC(=O)NC1=CC(=CC=C1)Cl',3 +'COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl',1 +'COC(=O)C1=CC=C(C=C1)C(=O)OC',2.09691001300806 +'N(C(=S)NC1)C1',-0.602059991327962 +'O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1',0.397940008672038 +'c(cccc1)(c1)C=C',2.45484486000851 +'COC(=O)c1ccccc1S(=O)(=O)NC(=O)Nc2nc(OC)nc(C)n2',2.39794000867204 +'C1=CC(=CC=C1N)Cl',1.09691001300806 +'FC(F)(F)C(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cc(Oc3ccccc3)ccc2',1.09691001300806 +'C(Cl)(Br)Br',1.45484486000851 +'C=C(Cl)Cl',1.14612803567824 +'C(C=CCl)Cl',0.707570176097936 +'COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl',1.69897000433602 +'Oc(ccc(c1)C(c(ccc(O)c2)c2)(C)C)c1',1.69897000433602 +'O=C(OCc(cccc1)c1)c(c(ccc2)C(=O)OCCCC)c2',2.67209785793572 +'O=C(NCCCC1)C1',2.09691001300806 +'c(cccc1)(c1)Cl',2.07918124604762 +'C(Cl)(Cl)Cl',1.77815125038364 +'ClCCl',1.72082058177034 +'C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl',-0.903089986991944 +'OCCO',3 +'O=C(C=C(CC1(C)C)C)C1',2.25285303097989 +'C(F)(Cl)(Cl)Cl',2.54282542695918 +'CCc1cccc(CC)c1N(COC)C(=O)CCl',1.14612803567824 +'c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2',0.698970004336019 +'n1c(Cl)cc(OC)nc1NC(=O)NS(=O)(=O)c2ccccc2C(=O)OCC',2.09691001300806 +'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',0.89209460269048 +'c(cccc1)(c1)CC',2.46389298898591 +'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',1.60205999132796 +'Clc1cc(C(F)(F)F)cnc1Oc2ccc(OC(C)C(=O)OC)cc2',0 +'C#N',1.49136169383427 +'ClC(C(OC(C=C2C(=O)OC(C)C(=O)OCC)=CC=C2N(=O)=O)=C1)=CC=C1C(F)(F)F',1.69897000433602 +'c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2',1.70969386972779 +'O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N',1.65321251377534 +'CN(=CC=C1C(C=C2)=CC=N2C)C=C1',0.574031267727719 +'C1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-]',1.12417805547468 +'C(=C)Cl',0.113943352306837 +'C1CCC(=O)CC1',2.95904139232109 +'CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C',1.39794000867204 +'C1=CC(=O)NNC1(=O)',2.69897000433602 +'CCSC(=O)N1CCCCCC1',0.301029995663981 +'C(C(Cl)(Cl)Cl)(O)O',2.13033376849501 +'ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl',-1.60205999132796 +'Clc1cc(C(F)(F)F)ccc1Oc2cc(OCC)c(N(=O)(=O))cc2',1 +'c1cc(Cl)ccc1C(C(#N))(CCCC)Cn2ncnc2',0.992995098431341 +'CC1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-]',0.301029995663981 +'CC(C)OC(=O)C(C1=CC=C(C=C1)Br)(C2=CC=C(C=C2)Br)O',1.41497334797082 +'C[N+](C)(C)CCCl',2.11394335230684 +'CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl',1.93449845124357 +'CC1=NC(=NC(=C1)C2CC2)NC3=CC=CC=C3',1.55144999797288 +'N(c(cccc1)c1)c(cccc2)c2',1.39794000867204 +'CC1(C(=O)N(C(=O)O1)NC2=CC=CC=C2)C3=CC=C(C=C3)OC4=CC=CC=C4',1.22530928172586 +'CC1(CCCCC1)C(=O)NC2=C(C(=C(C=C2)O)Cl)Cl',2.46538285144842 +'C1=CC(=C2C(=C1)OC(O2)(F)F)C3=CNC=C3C#N',2.04139268515822 +'C(F)(F)(F)c1ccccc1C(=O)Nc2cccc(OC(C)C)c2',1.93951925261862 +'C(CCCCN=C(N)N)CCCNCCCCCCCCN=C(N)N',1.27875360095283 +'C1CN(C(=N1)N[N+](=O)[O-])CC2=CN=C(C=C2)Cl',1.23044892137827 +'COC(=O)C12CC3=C(C1=NN(CO2)C(=O)N(C4=CC=C(C=C4)OC(F)(F)F)C(=O)OC)C=CC(=C3)Cl',0.556302500767287 +'CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC',2.56820172406699 +'CC1=CC(=CC(=C1)C(=O)N(C(C)(C)C)NC(=O)C2=C(C(=CC=C2)OC)C)C',2.61384182187607 +'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C=C2)OC(C(OC(F)(F)F)F)(F)F)Cl)F',1.55630250076729 +'CC1=CC=C(C=C1)N(SC(F)(Cl)Cl)S(=O)(=O)N(C)C',1.25527250510331 +'CC(C)(C)C1=C(C=CC(=C1)O)O',2.35218251811136 +'CC(=NOCC1=CC=CC=C1C(=NOC)C(=O)OC)C2=CC(=CC=C2)C(F)(F)F',1.77815125038364 +'COC(=O)N(C1=CC=CC=C1COC2=NN(C=C2)C3=CC=C(C=C3)Cl)OC',0.954242509439325 +'CC(C)N1C(=NC(C)(C)C)SCN(C1=O)C2=CC=CC=C2',0.939519252618618 +'C1=CC=C(C(=C1)C2=NN=C(N=N2)C3=CC=CC=C3Cl)Cl',1.23804610312880 +'CCCC(=C1C(=O)CC(CC1=O)C2CCCSC2)NOCC',1.44715803134222 +'C1CC1NC2=NC(=C(C(=N2)N)C#N)N',1.34242268082221 +'C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3',-0.244125144327509 +'C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N',0.778151250383644 +'CCOC1=CC2=C(C=C1)NC(C=C2C)(C)C',1.07918124604762 +'C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N',1.47712125471966 +'CC1CN(CC(O1)C)CC(C)CC2=CC=C(C=C2)C(C)(C)C',0.230448921378274 +'C[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F',0.301029995663981 +'c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2',1.17609125905568 +'CN(=CC=C1C(C=C2)=CC=N2C)C=C1',0.406540180433955 +'CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2',2 +'Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2',1.98227123303957 +'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',1.47712125471966 +'CCOC1=CC=C(C=C1)C(C)(C)COCC2=CC(=CC=C2)OC3=CC=CC=C3',1.41497334797082 +'CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2',1.27875360095283 +'CC(COC1=CC=C(C=C1)OC2=CC=CC=C2)OC3=CC=CC=N3',2.14612803567824 +'CC(C)(C)C(=O)C(N1C=NC=N1)OC2=CC=C(C=C2)Cl',2.05690485133647 +'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O',2.02118929906994 +'c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2',0.903089986991944 +'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',0.778151250383644 +'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',1.07918124604762 +'ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',1.69897000433602 +'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',-0.602059991327962 +'ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl',-1 +'C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl',-0.602059991327962 +'C1(C(C(C(C(C1Cl)Cl)Cl)Cl)Cl)Cl',0.672097857935718 +'CCC(=O)Nc1ccc(Cl)c(Cl)c1',1.88081359228079 +'C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-]',2.14612803567824 +'C1C2C(COS(=O)O1)C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl',0.462397997898956 +'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',1.69897000433602 +'CC(C(=O)O)OC1=CC=C(C=C1)OC2=C(C=C(C=N2)C(F)(F)F)Cl',-1 +'CCCCC(CN1C=NC=N1)(C#N)C2=CC=C(C=C2)Cl',0.991226075692495 +'Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2',0.707570176097936 +'COP(=O)(NC(=O)(C))SC',0.397940008672038 +'CCOP(=O)(OCC)OC(=CCl)C1=C(C=C(C=C1)Cl)Cl',0.176091259055681 +'CCOP(=S)(OCC)SCCSCC',-0.657577319177794 +'O=P(O)(O)CCCl',1.07918124604762 +'CCCSP(=O)(OCC)SCCC',0.431363764158987 +'CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1',0.230448921378274 +'COP(=S)(OC)Oc1ccc(SC)c(C)c1',-0.142667503568732 +'OC(=O)C(N)CCP(C)(=O)O',0.544068044350276 +'OC(=O)CNCP(O)(O)=O',2.47712125471966 +'CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC',2.55630250076729 +'COP(N)(=O)SC',-0.537602002101044 +'CC(=CC(=O)OC)OP(=O)(OC)OC',-0.455931955649724 +'CCOP(=S)(OCC)SCSCC',-0.795880017344075 +'CCOP(=S)(OCC)SCSC(C)(C)C',-1.22184874961636 +'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',0.41161970596323 +'CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl',0 +'CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C',0.763427993562937 +'CCC1=NC(=CC(=N1)OP(=S)(OC)OC)OCC',-0.346787486224656 +'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',0.204119982655925 +'CCOP(=S)(OCC)SCN1C2=C(C=C(C=C2)Cl)OC1=O',0.301029995663981 +'COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O)',0.954242509439325 +'CCOC(=O)C1=CN2C(=CC(=N2)OP(=S)(OCC)OCC)N=C1C',0.602059991327962 +'CCOP(=S)(OCC)OC1=NN(C=N1)C2=CC=CC=C2',0.113943352306837 +'O=C(Oc(c(c(ccc1)cc2)c1)c2)NC',1.77815125038364 +'CC1=CC(=CC(=C1SC)C)OC(=O)NC',0.968482948553935 +'CNC(=O)ON=C(C)SC',1.30102999566398 +'CCCOC(=O)NCCCN(C)C',2.83250891270624 +'COC(=O)NC1=NC2=CC=CC=C2N1',1.8750612633917 +'CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C',1.08990511143940 +'CNC(=O)CCSCCSP(=O)(OC)OC',-0.267606240177031 +'N(C(=S)SSC(N(C)C)=S)(C)C',1.07918124604762 +'C1=NNC(=N1)N',0.698970004336019 +'CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O)',1.80617997398389 +'C1=CC=C(C=C1)[Sn](C2=CC=CC=C2)C3=CC=CC=C3',-0.522878745280338 +'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',0.845098040014257 +'N(C(=S)NC1)C1',0.0969100130080564 +'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F',1.39794000867204 +'CCCSC1=CC2=C(C=C1)N=C(N2)NC(=O)OC',1.30102999566398 +'C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3',2.06069784035361 +'CC1(C2C(C3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C(C=CC(=C41)Cl)O)O)O)N(C)C)O)O',3.7160033436348 +'CC1=CC(=C(C=C1NC(=O)C2=CC(=CC(=C2O)I)I)Cl)C(C#N)C3=CC=C(C=C3)Cl',1 +'CN1CC2CC1CN2C3=C(C=C4C(=C3)N(C=C(C4=O)C(=O)O)C5CC5)F',1.69897000433602 +'C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl',1.17609125905568 +'CC1=NC=C(N1C)[N+](=O)[O-]',1.17609125905568 +'CCN1CCN(CC1)C2=C(C=C3C(=C2)N(C=C(C3=O)C(=O)O)C4CC4)F',1.41497334797082 +'CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O',0 +'COCC(=O)NC1=C(C=CC(=C1)SC2=CC=CC=C2)NC(=NC(=O)OC)NC(=O)OC',1.60205999132796 +'CC1CCC2=C3N1C=C(C(=O)C3=CC(=C2)F)C(=O)O',2.60205999132796 +'COC(=O)NC1=NC2=C(N1)C=C(C=C2)S(=O)C3=CC=CC=C3',0.301029995663981 +'CC1(C2CC3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C1C=CC=C4O)O)O)N(C)C)O',2.17609125905568 +'C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3',1.47712125471966 +'CC(C)NCC(COC1=CC=CC2=C1C3=CC=CC=C3N2)O',0.845098040014257 +'C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl',1.36172783601759 +'CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O',0.397940008672038 +'COP(=S)(OC)Oc1ccc(SC)c(C)c1',-0.346787486224656 +'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',0.903089986991944 +'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',0.602059991327962 +'CC(N(C)C)CN(C(=CC=C3)C1=C3)C(=CC=C2)C(=C2)S1',1.22010808804006 +'C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-]',2.38021124171161 +'c(cccc1)(c1)C=C',2.60205999132796 diff --git a/test/data/LOAEL_log_mmol_corrected_smiles.csv b/test/data/LOAEL_log_mmol_corrected_smiles.csv new file mode 100644 index 0000000..237830e --- /dev/null +++ b/test/data/LOAEL_log_mmol_corrected_smiles.csv @@ -0,0 +1,568 @@ +SMILES,LOAEL_log_mmol_kg_bw_day +'C1=C(C(=CC(=C1NN=C3C2=C(C=C([S]([O-])(=O)=O)C=C2)C=CC3=O)OC)[S]([O-])(=O)=O)C.[Na+].[Na+]',2.12309380508316 +'O1C(=O)C(O)=C(O)C1C(O)CO',1.76137662853832 +'C1(C)=C(C=CC(C)=CC=CC(C)=CC=CC=C(C)C=CC=C(C)C(=O)OC)C(C)(C)CCC1',2.95101092705237 +'c(cccc1)(c1)C(C)C',2.41523206875268 +'O=C(OCCCC)c(c(ccc1)C(=O)OCCCC)c1',2.66642980233607 +'O=C(OCC)c(c(ccc1)C(=O)OCC)c1',1.69992305435084 +'O=C(OC(OC(OC1C)C)C1)C',3.14412407646651 +'Oc(c(ccc1)C)c1C',4.30879341594785 +'Oc(ccc(c1C)C)c1',3.94081663065326 +'O=C(OCC)C=C',2.60605102798022 +'c(cccc1)(c1)CC',2.41532120099855 +'OCCO',2.39492662325430 +'c(ccc1C(=O)OCC(=O)OCC)cc1C(=O)OCC',2.04964162538818 +'O=C',2.56368333860036 +'O=C(O)C=CC(=O)O',2.03090237239810 +'OCC(O)CO',1.12645271808123 +'O=C(OC)c(ccc(O)c1)c1',2.00617304782278 +'O=C(OCCC)c(ccc(O)c1)c1',2.07966468441907 +'CC(CCC(=O)(O))C3CCC4C2CCC1CC(O)CCC1(C)C2CCC34C',2.87687871256153 +'OC(C(CCC1C)C(C)C)C1',2.42080757876423 +'O=C(O)C(=C)C',2.54049719303574 +'O=C(OC)c(c(O)ccc1)c1',2.62596180611118 +'Oc(cccc1)c1',2.43708305310291 +'O=C(OCCC)c(cc(O)c(O)c1O)c1',2.3902301635117 +'OCC(O)C1C(O)=C(O)C(=O)O1',2.05436782171583 +'c(cccc1)(c1)C=C',3.69543631002744 +'O=Cc(occ1)c1',3.20450009536782 +'NCCNc1cccc2ccccc12',3.37247609215110 +'CN(C)(C)CCCl',2.64921593816204 +'O=C(Nc(ccc(c1)C(=O)CCl)c1)C',2.12695072080225 +'c(ccc(c1)Cl)(c1)C(c(ccc(c2)Cl)c2)C(Cl)(Cl)Cl',4.04444942813338 +'CC(Oc1cc(Cl)c(Cl)cc1Cl)C(=O)(O)',4.491054148917 +'O=N(=O)C(=CC=C1OC)C=C1N=NC(C(O)=C2C(=O)NC(=CC=C4)C=C4N(=O)=O)=C(C=C3)C(=C2)C=C3',2.36568501290040 +'O=N(=O)C(C=C1)=CC(OCCO)=C1NCCO',3.02438986505162 +'Cc1cccc(CC)c1N(C(=O)CCl)COCC',3.73201897895503 +'C1=C(C(=CC=C1OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-])C(=O)[O-].[Na+]',3.32865137721601 +'CCc1cccc(CC)c1N(COC)C(=O)CCl',4.25489772423536 +'O=C(Nc(ccc(OCC)c1N)c1)C',2.21459876477238 +'Oc(ccc(N)c1)c1',2.20160364320713 +'CC(N)CC(=CC=C1)C=C1',4.43202666692597 +'O(c(ccc(c1)C=CC)c1)C',2.63429468422019 +'COc1ccc(N)cc1',2.41466474972438 +'O=C(O)c(c(N)ccc1)c1',1.69766082403086 +'Clc2cccc(c2)c1ccccc1',4.67360340221543 +'O=C(NC(C(=O)OC)Cc(cccc1)c1)C(N)CC(=O)O',3.30147753146833 +'n1c2ccc(Cl)cc2ncc1Oc3ccc(OC(C)C(=O)OCC)cc3',5.00327683569969 +'COC(=O)NS(=O)(=O)c1ccc(N)cc1',3.10691015775373 +'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',5.94520088604013 +'CNC(=O)Oc1ccccc1OC(C)C',3.62167823549204 +'CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n2cncn2',4.07003600375764 +'O=S(O)(=O)C(=CC=C1)C=C1CN(CC)=C(C=C2)C=CC2=C(C(C=C3)=CC=C3N(C)C)C(C=C4)=CC=C4N(CC)CC(C=C5)=CC(=C5)S(=O)(=O)O',2.99569446127058 +'c(c(cccc1)c1)(cccc2)c2',2.79016633269067 +'BrC(Cl)Cl',3.10044647372987 +'ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O)',4.46372003271591 +'O=C(Oc(c(c(ccc1)cc2)c1)c2)NC',4.11054922260167 +'CC1=C(SCCO1)C(=O)Nc2ccccc2',3.89450458533419 +'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',6.18118555259066 +'O=C(O)CCl',3.49829685836143 +'ClC(=CC=C1N)C=C1',4.32760254782945 +'CC(C)OC(=O)C(O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2',4.57623015760927 +'n1c(OC)nc(C)nc1NC(=O)NS(=O)(=O)c2ccccc2Cl',4.15566728690676 +'OS(=O)(=O)C(C(=CC=C2)C1=C2)=CC=C1N=NC(C(O)=C3N=NC(C(C=C5)=C4C=C5)=CC=C4S(O)(=O)=O)=CC(=C3O)CO',2.91745349144784 +'S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1',5.65653611167129 +'CNP(=O)(OC)Oc1ccc(cc1Cl)C(C)(C)C',4.86289269710557 +'C(C1C2C(C(O)C(O1)OC8C(OC(OC7C(OC(OC6C(OC(OC5C(C(C(OC4C(C(C(OC3C(C(C(O2)OC3CO)O)O)OC4CO)O)O)OC5CO)O)O)C(C6O)O)CO)C(C7O)O)CO)C(C8O)O)CO)O)O',2.85087205247326 +'n1c(N)nc(N)nc1NC2CC2',4.04449742637606 +'COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl',2.82212129862366 +'O=C(O)C(Cl)(Cl)C',3.70545399970477 +'Nc1cc(N)c(O)cc1',3.69597355155454 +'FC(F)(Cl)Cl',2.90638355650622 +'ClCCl',3.23010431252803 +'O=P(OC)(OC)OC=C(Cl)Cl',4.98261676287965 +'OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl',4.26774140719551 +'ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl',6.88185159467056 +'CN(=C1C(C=C2)=CC=C2)N(C)C(=C1)C(C=C3)=CC=C3',3.2998650117386 +'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',4.58922787551359 +'CC1=C(C)S(=O)(=O)CCS1(=O)=O',4.32277979319225 +'O=C(NC)CSP(OC)(OC)=S',5.96238343177818 +'COc1ccc(N)c(OC)c1',2.74428856020296 +'COP(=O)OC',3.04158586769746 +'CC(=C(N(=O)=O)C=C1N(=O)=O)C=C1',3.72891101170516 +'CN(C)C(=O)C(c1ccccc1)c2ccccc2',3.90184372972497 +'N(c(cccc1)c1)c(cccc2)c2',3.73709625897028 +'C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3',5.50194904825203 +'CCOP(=S)(OCC)SCCSCC',6.43839047104826 +'NC(=S)NNC(N)=S',2.20039466208170 +'O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1',4.58938077582749 +'O=P(O)(O)CCCl',2.98375855767924 +'O=C(OCC)C(O1)C1(c(cccc2)c2)C',3.07133013436744 +'COC(=O)NC(=NC1=C2)NC1=CC(=C2)SC(C=C3)=CC=C3',4.30008455052816 +'CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1',4.11967251914367 +'c1cc(C(F)(F)F)cc(Cl)c1NC(C(C)C)C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',5.30355258529792 +'S=P(OCC)(Sc1ccccc1)CC',5.192858916992 +'n1c(C)nc(OC)nc1NC(=O)NS(=O)(=O)c2ccsc2C(=O)OC',4.19021010110931 +'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',4.76466896003284 +'O=N(=O)N(CN1N(=O)=O)CN(C1)N(=O)=O',5.17048924956396 +'O=C(N=C(N(C1(=O))C)N(C)C)N1C(CCCC2)C2',3.70296927879496 +'n(c(c(ccc1)cc2)c1O)c2',3.00650487851870 +'c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2',3.87095923630552 +'COc1cccc(OC)c1C(=O)Nc2onc(C(C)(CC)CC)c2',3.81664542550781 +'n1c(OC)cc(OC)nc1NC(=O)NS(=O)(=O)Cc2ccccc2C(=O)OC',3.12325069281768 +'CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC',3.82001485148442 +'CN(C)(CCC1)CC1',2.88160770091708 +'O=P(SCCCC)(SCCCC)SCCCC',5.40072574498715 +'COCC(=O)N(C(C)C(=O)OC)c1c(C)cccc1C',3.65023995836629 +'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',5.17945311726922 +'CNC(=O)ON=C(C)SC',4.21007789203115 +'COP(=S)(OC)Oc1ccc(cc1)N(=O)(=O)',6.02235818715591 +'O=C1N(N)C(SC)=NN=C1C(C)(C)C',4.15490651136806 +'COP(=O)(OC)OC(Br)C(Cl)(Cl)Br',5.27964840060116 +'OC(C(N)C1O)C(C)OC1(C)OC(CC(C)(C(C2O)C(O)=O)OC(O)(C2)CC(O)CC(C)(O3)C3C=C4)C=CC=CC=CC=CCC(C)OC4=O',3.99258108069112 +'O=N(=O)c(ccc(c1N)C)c1',4.27918373941654 +'O=N(=O)c(c(N)ccc1N)c1',3.24556564669417 +'O=C(O)C(=C(N)C=C1N(=O)=O)C=C1',2.18667157840130 +'O=N(=O)c(c(c(ccc1)cc2)c1)c2',3.0209838975238 +'c12c(N=Nc3ccccc3)c(O)ccc1cc(S(=O)(=O)O)cc2',3.26105456902449 +'CC(C)Oc1cc(c(Cl)cc1Cl)N2N=C(OC2(=O))C(C)(C)C',4.83912722706429 +'CNC(=O)ON=C(SC)C(=O)N(C)C',4.64199221806157 +'CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O',4.92021372679140 +'Oc(c(c(c(c1Cl)Cl)Cl)Cl)c1Cl',4.42543075349016 +'NC(=N)NC(=N)NCCc1ccccc1',3.44898061811695 +'COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O)',4.20046887469431 +'CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC',4.38676470716829 +'ClC3C6(Cl)C4C2C1OC1C5C2C3(Cl)C(Cl)(C45)C6(Cl)Cl',5.73572355899233 +'O=C(OC(=O)c1cccc2)c12',2.09688233455707 +'Nc1c(Cl)c(Cl)nc(C(=O)(O))c1Cl',3.60469254298773 +'CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1',5.08683453410041 +'Nc3ccc2cc1ccc(N)cc1nc2c3',3.64856042750458 +'CCC(=O)Nc1ccc(Cl)c(Cl)c1',4.03758556402413 +'Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2',4.13636586052483 +'O=C(N)c(nccn1)c1',2.19322585277166 +'Oc1cc(O)c2C(=O)C(O)=C(c3cc(O)c(O)cc3)Oc2c1',2.17199481319419 +'CCC(O)(C)C#C',3.32910149752408 +'CC(C(NCC)=C1)=CC(C1=O2)=C(C(C2=C3)=CC(C)=C3NCC)C(=CC=C4)C(=C4)C(=O)OCC',4.56776852431159 +'O=C(NS(=O)(=O)c1cccc2)c12',1.70634501494627 +'c1cc(Cl)ccc1C2SC(=O)N(C(=O)NC3CCCCC3)C2C',3.34350563448343 +'n(c(nc(n1)NCC)NCC)c1Cl',4.60564260851438 +'O=[S](NC1CCCCC1)(=O)[O-].[Na+]',1.74712743618051 +'O=C(OCC(C1OCC(C1O)O)O)CCCCCCCCCCC',1.70187402783236 +'O(CC1O)C(C1O)C(O)COC(=O)CCCCCCCCCCCCCCCCC',1.77657920852493 +'O=S(=O)(Nc(nc(cc1C)C)n1)c(ccc(N)c2)c2',3.92604632938062 +'CCNc1nc(NC(C)(C)C)nc(SC)n1',4.2065674883771 +'Oc(c(cc(c1)C(C)(C)C)Cl)c1',2.93192524190336 +'C(C(Cl)Cl)(Cl)Cl',3.19149572716769 +'COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl',3.5634357799466 +'CCN(CC)C(=O)SCc1ccc(Cl)cc1',4.71227844003234 +'COC(=O)NC(=S)Nc1ccccc1NC(=S)NC(=O)OC',4.0293761165818 +'N(C(=S)SSC(N(C)C)=S)(C)C',4.20490259955842 +'c12OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CCc1c(C)c(OC(=O)C)c(C)c2C',2.37359490910830 +'Cc1cc(N)ccc1NOS(O)(=O)=O',3.07409722667645 +'C(Br)(C(Br)(Br)Br)C1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',5.34570506657104 +'O=C(O)COc(c(cc(c1Cl)Cl)Cl)c1',4.40736115725459 +'FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O',3.92334642542511 +'Cc1cc(C)c(N)cc1C',3.33165612180841 +'CC(O)(C(O)C(O1)C)CC1(C)OC(C(C)O2)C(C(O)C2(C)OC(C(C)C(O)CC(=O)OC(CC)C3COC(C(OC)C4OC)OC(C)C4O)C(CC=O)CC(C)C(=O)C=CC(=C3)C)N(C)C',3.27607248348466 +'c1c(Cl)cc(Cl)cc1N2C(=O)C(C)(C=C)OC2(=O)',3.59380666266014 +'O=C(OC(CCCC(O)CCCCCc1cc(O)cc2O)C)c12',6.20735970305 +'COC(=O)C1(C2=CC=CC=C2C3=C1C=C(C=C3)Cl)O',3.26276588262396 +'CC(C(=O)O)OC1=CC(=CC=C1)Cl',3.30237197471763 +'P12P3P1P23',1.92514612424786 +'C(CO)O',2.19080664059838 +'CCCCOCC(C)OCC(C)O',3.17218289921228 +'C(CO)O',1.49183663626236 +'C(CO)O',1.82907880458079 +'[O-][As](=O)([O-])[O-]',4.34688225631145 +'[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F',5.1159116373222 +'N(C(=S)SSC(N(C)C)=S)(C)C',4.32029601826049 +'COP(=O)(N)SC',5.19537431180606 +'N(C(=S)SSC(N(C)C)=S)(C)C',4.64300653228067 +'COP(=O)(NC(=O)(C))SC',3.71877648742193 +'C1=CC=C(C=C1)NC(=O)NC2=CN=NS2',3.86579667362138 +'CCOP(=S)(NC(C)C)OC1=CC=CC=C1C(=O)OC(C)C',5.83934493677328 +'CC(=NOC(=O)N(C)SN(C)C(=O)ON=C(C)SC)SC',4.54957865212472 +'CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C',5.3072756271046 +'NC(CCCC1)C1',3.22924248946341 +'CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1',4.00572916683684 +'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',5.91357931241363 +'CCCCC(CC)COC(=O)C1=CC=CC=C1C(=O)OCC(CC)CCCC',3.29065345190954 +'OC(=O)CNCP(O)(O)=O',2.22807446683025 +'C1CNC(=S)N1',5.64754514108144 +'O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1',4.6004830749906 +'C1=CC=C2C(=C1)NC(=S)S2',2.34830823871711 +'CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl',4.54479494223028 +'c(c(c(c(c1Cl)Cl)Cl)Cl)(c1Cl)Cl',5.99211484281248 +'COc1ccc(cc1)C(c2ccc(OC)cc2)C(Cl)(Cl)Cl',3.44172416093488 +'C1=CC(=CC=C1Cl)Cl',2.690201870583 +'CC(C)OC(=O)NC1=CC(=CC=C1)Cl',2.63075480518045 +'COP(=O)(OC)OC=C(Cl)Cl',5.01190613898164 +'CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O',5.84103248074378 +'CNC(=O)N(C)c1nnc(s1)C(C)(C)C',3.75647357868479 +'CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2',3.13153975286541 +'CC(C(=O)O)OC1=C(C=C(C=C1)Cl)Cl',4.41694364962485 +'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',4.54086743953507 +'C(#N)c(c(c(c(c1C(#N))Cl)Cl)Cl)c1Cl',4.82267631193248 +'O=C(OCC)C(O)(c(ccc(c1)Cl)c1)c(ccc(c2)Cl)c2',4.24731476483975 +'O=C(N(C)C)Nc(ccc(c1)Cl)c1',3.2011773320931 +'O=C(N(SC(Cl)(Cl)Cl)C(=O)C1CC=CC2)C12',3.47797354595327 +'CCc1cccc(C)c1N(C(C)COC)C(=O)CCl',3.27691146056582 +'C1=CC(=C(C=C1Cl)Cl)OCC(=O)O',4.64549583771218 +'CCNC1=NC(=NC(=N1)Cl)NC(C)(C)C#N',5.2845529417803 +'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',4.80088113268728 +'COP(=S)(OC)OC1=CC(=C(C=C1Cl)Cl)Cl',3.80827186579208 +'C1C2C=CC1C3C2C4(C(=C(C3(C4(Cl)Cl)Cl)Cl)Cl)Cl',7.56218566972996 +'CC1(C(C1C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Cl)Cl)C',4.19455618753918 +'CCN(CC)C(=O)C(C)OC1=CC=CC2=CC=CC=C21',3.43353645191675 +'ClC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',6.17413857281627 +'CC(=CC(=O)NC)OP(=O)(OC)OC',5.6954106911713 +'CC(C)C1(C)N=C(NC1(=O))c3nc2ccccc2cc3C(=O)(O)',4.19219820184676 +'CC(C)Nc1nc(Cl)nc(NC(C)C)n1',3.66220959497816 +'CC(C(=O)O)(Cl)Cl',3.45627084235452 +'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',4.76271618915143 +'O=C(NC)CSP(OC)(OC)=S',4.6613534361142 +'C12C3(C4(C5(C3(C(C1(C5(C2(C4(Cl)Cl)Cl)Cl)Cl)(Cl)Cl)Cl)Cl)Cl)Cl',7.70850413051807 +'COC(=O)C1=CC=CC=C1C(=O)OC',1.98718344722018 +'CCOP(=S)(OCC)SCSC(C)(C)C',6.76107133056166 +'CCC(C)SP(=O)(OCC)SC(C)CC',6.0340541201743 +'CCOP(=S)(OCC)SCSC(C)(C)C',5.1590113392337 +'C1C(C(C(=O)N1C2=CC=CC(=C2)C(F)(F)F)Cl)CCl',4.79534478918374 +'O=C(O)C(C(C(=O)O)C(O1)CC2)C12',3.20919319571953 +'O=C(Oc(c(OC(C1)(C)C)c1cc2)c2)NC',4.64591798599928 +'Oc(c(c(c(c1)Cl)Cl)Cc(c(c(cc2Cl)Cl)Cl)c2O)c1Cl',4.9105214638308 +'CC1(CON(C1=O)CC2=CC=CC=C2Cl)C',4.04722605916309 +'CCC(C)N1C(=O)C(=C(NC1=O)C)Br',3.6209530011803 +'CC1=CC(=CC(=C1N(C)C)C)OC(=O)NC',5.17081600643967 +'CNC(=O)OC1=CC=CC(=C1)N=CN(C)C',4.24798445482129 +'CC1=NN(C(=O)N1C(F)F)C2=CC(=C(C=C2Cl)Cl)NS(=O)(=O)C',3.76184922452045 +'CCOP(=S)(CC)SC1=CC=CC=C1',4.6925459996104 +'CCOP(=S)(OCC)SC(CCl)N1C(=O)C2=CC=CC=C2C1=O',5.19738625502110 +'N1CC(C)(C)CNC1=NN=C(C=Cc2ccc(C(F)(F)F)cc2)C=Cc3ccc(C(F)(F)F)cc3',4.99517458001903 +'CC1=C(C(=C(C(=C1F)F)COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)F)F',4.9591800647055 +'CC1=CC(=C(C=C1)N=CN(C)C=NC2=C(C=C(C=C2)C)C)C',4.45886884853594 +'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',5.57739312594126 +'CC(C)N(C(C)C)C(=O)SCC(Cl)=C(Cl)Cl',4.38691132629296 +'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',5.14932086869605 +'CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2CCC(F)(F)F',3.72005974473228 +'O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12',3.77865560759679 +'CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1',4.34489545637121 +'O=C(ON=CC(SC)(C)C)NC',6.27935493374302 +'ClC(Cl)(Cl)CC1(OC1)c2cc(Cl)cc(Cl)c2',4.02860782189294 +'CCC1CCCC(C(C(=O)C2CC3C(C2CC(=O)O1)CCC4C3CC(C4)OC5CC(C(C(C5OC)OC)OC)C)C)OC6CCC(C(O6)C)N(C)C',4.48549336200642 +'CC(C)(C)C(=NOC(=O)NC)CSC',4.56093515068149 +'CON=C(CC1=CN=CC=C1)C2=C(C=C(C=C2)Cl)Cl',3.81685069684023 +'CC(=CC1C(C1(C)C)C(=O)OCN2C(=O)C3=C(C2=O)CCCC3)C',3.12242048929166 +'C1COC(O1)(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl',4.47732480426449 +'CCCOC(=O)C1=CN=C(C=C1)C(=O)OCCC',3.00221511481659 +'CC1=CC(=NC(=N1)NC(=O)NS(=O)(=O)C2=CC=CC=C2C(=O)OC3COC3)C',3.68988952034363 +'C1=C(C(=NC(=C1Cl)Cl)OCC(=O)O)Cl',3.85273501931079 +'CCOCN1C(=C(C(=C1C(F)(F)F)Br)C#N)C2=CC=C(C=C2)Cl',4.47670895789257 +'CC(C)CC1=C(C(=NC(=C1C(=O)SC)C(F)(F)F)C(F)F)C(=O)SC',5.04368703263975 +'CC12CC1(C(=O)N(C2=O)C3=CC(=CC(=C3)Cl)Cl)C',4.27743796844594 +'CC1=CC(=C(C=C1)C(=O)OC)C2=NC(C(=O)N2)(C)C(C)C',3.76093729967937 +'COP(=S)(OC)OC1=NC(=C(C=C1Cl)Cl)Cl',5.03145309127161 +'CC(C)CC1=C(C(=NC(=C1C(=O)OC)C(F)F)C(F)(F)F)C2=NCCS2',3.95268441956944 +'CCOC(=O)C(CC1=CC(=C(C=C1Cl)F)N2C(=O)N(C(=N2)C)C(F)F)Cl',4.53591743757444 +'CC(C)=CC3C(C(=O)OCc2coc(Cc1ccccc1)c2)C3(C)C',3.4325717246993 +'CCCSP(=S)(OCC)OC1=CC=C(C=C1)SC',4.44776025923588 +'CC1=CC(=C(C(=C1)OC(=O)NC)C)C',3.513780491163 +'CC1=CC=CC=C1COC2CC3(CCC2(O3)C)C(C)C',3.26228942932097 +'CC1=C2C(=CC=C1)SC3=NN=CN23',3.78564431476757 +'CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl',3.55619540984755 +'CCCN(CCC)C(=O)SCC',4.32294999482974 +'CC(C)OC(=O)C=C(C)C=CCC(C)CCCC(C)(C)OC',3.82926385227003 +'COP(=S)(OC)Oc1ccc(SC)c(C)c1',4.87052572632858 +'COC1=C(C=C(C=C1)C(=CC(=O)N2CCOCC2)C3=CC=C(C=C3)Cl)OC',3.92309028461827 +'CCSC(=O)N(CC(C)C)CC(C)C',3.33720244245390 +'CC(C)OP(=S)(OC(C)C)SCCNS(=O)(=O)C1=CC=CC=C1',4.42326053700057 +'CC(=CC1C(C1(C)C)C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C',3.36853572230648 +'CC1=CC(=CC(=C1C)C)OC(=O)NC',4.28610219788592 +'CCOP(=S)(OCC)SCSC1=CC=C(C=C1)Cl',5.53512353543065 +'C1CN(CCN1C(C(Cl)(Cl)Cl)NC=O)C(C(Cl)(Cl)Cl)NC=O',3.63845107729718 +'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',5.00270088682186 +'C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-]',3.37340446386955 +'CCCC(=NOCC)C1C(=O)CC(CC1=O)CC(C)SCC',4.29612718117234 +'ClC2(Cl)C4(Cl)C1(Cl)C5(Cl)C(Cl)(Cl)C3(Cl)C1(Cl)C2(Cl)C3(Cl)C45Cl',5.89173094758972 +'CCN(C1CCCCC1)C(=O)SCC',4.85603479370532 +'CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2OCCCl',3.260038251795 +'C(C(=O)O)OC1=NC(=C(C(=C1Cl)N)Cl)F',2.70762229375841 +'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC#C',3.49996484386965 +'C1C(COC1(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl)Br',4.76483992624863 +'C1=NNC(=N1)N',4.52675248773797 +'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F',4.16607614499238 +'C1=CC(=CC=C1OS(=O)(=O)C2=CC=C(C=C2)Cl)Cl',5.08373349418451 +'FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O',2.52540641675307 +'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',3.60553192639024 +'C1=CC(=C(C(=C1)Cl)C#N)Cl',4.83761727241192 +'C1C(O1)COC2=CC=CC=C2C3=CC=CC=C3',2.65565785542345 +'CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC',2.92199532671878 +'O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N',3.97297179822463 +'C1=CC(=C(C2=NC=C(C=C21)Cl)C(=O)O)Cl',2.50482391995124 +'CC(C)NC(=O)N1CC(=O)N(C1=O)C2=CC(=CC(=C2)Cl)Cl',3.85597533208895 +'CCCN(CCCl)C1=C(C=C(C=C1[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',3.24487034075484 +'C1=CC=C(C=C1)C2=CC=CC=C2O',2.23097792739447 +'O=C(N(C)C)Nc(cccc1C(F)(F)F)c1',4.18977535089103 +'C1=CC(=NC(=C1)Cl)C(Cl)(Cl)Cl',5.36343657222619 +'Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2',4.7008945110302 +'CC1=CC(=C(C=C1NC(=O)C)NS(=O)(=O)C(F)(F)F)C',4.05086251778066 +'C(=C(I)I)(I)I',4.02664705683052 +'C1=C(C=C(C(=C1Cl)N2C(=C(C(=N2)C#N)S(=O)C(F)(F)F)N)Cl)C(F)(F)F',6.8624770260417 +'O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1',4.57165200886706 +'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',4.09142710541740 +'CC1=CC2=C(C=C1)N=C3C(=N2)SC(=O)S3',4.49470628000702 +'CC(C)N(C(=O)CCl)c1ccccc1',3.96396832169828 +'CC(C)C1(C(=O)NC(=N1)C2=C(C=CC=N2)C(=O)O)C',2.71813034538638 +'CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C',4.25443178297333 +'CN1CN(C(=S)SC1)C',3.73313384224274 +'ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',3.74434218472656 +'ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl',6.28927348401756 +'CCOC(=O)CN1C2=C(C=CC=C2Cl)SC1=O',4.33721159291063 +'CCCN(CCC)C1=C(C=C(C(=C1[N+](=O)[O-])N)C(F)(F)F)[N+](=O)[O-]',4.0760849833355 +'C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N',3.92533540454444 +'CC(C)(C)C(CCC1=CC=C(C=C1)Cl)(CN2C=NC=N2)O',4.28689742390489 +'CC1=C(C=CC=C1COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)C3=CC=CC=C3',4.92723460128442 +'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',3.70167089115788 +'C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-]',3.13990879364539 +'CC1=C(C=C(C=C1C(=O)N)[N+](=O)[O-])[N+](=O)[O-]',4.55660790505055 +'CC(C)OC1=CC=CC(=C1)NC(=O)C2=CC=CC=C2C(F)(F)F',2.81064866255668 +'OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl',5.17083139418745 +'O=P(O)(O)CCCl',2.51051495802278 +'CN(C(=O)NC1=CC=C(C=C1)Br)OC',4.31655713179121 +'CC1=CC(=CC=C1)NC(=O)OC2=CC=CC(=C2)NC(=O)OC',4.0796286862285 +'CC(C)(C)C1=NN=C(S1)N2C(CN(C2=O)C)O',3.70982035175725 +'S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1',5.32917717728496 +'COC(=O)c1ccccc1S(=O)(=O)NC(=O)N(C)c2nc(OC)nc(C)n2',4.50011608554638 +'C1=CC=C(C(=C1)NC2=NC(=NC(=N2)Cl)Cl)Cl',5.37945812670042 +'CC1=C(C=CC(=C1)OP(=S)(OC)OC)[N+](=O)[O-]',5.78008872366218 +'COc1c(Cl)ccc(Cl)c1C(=O)(O)',3.28376800169458 +'CC1(C(C1C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Br)Br)C',5.30552261110582 +'C1=CC=C(C(=C1)C(C2=CC=C(C=C2)F)(C3=CN=CN=C3)O)Cl',5.10001384041789 +'c1ccc2nc(NC(=O)OC)n(C(=O)NCCCC)c2c1',3.40217570413585 +'CCOC(=O)COC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',4.25309221972639 +'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)C3=CC=CC=C3)O',4.13022504615292 +'CCNC(=O)NC(=O)C(=NOC)C#N',3.81561566158005 +'CCOC1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',3.95628893719942 +'CC1=NC=C(N1CCO)[N+](=O)[O-]',3.05729569283336 +'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',2.77313899543591 +'CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2',3.54465374823881 +'CCCCC(CN1C=NC=N1)(C2=C(C=C(C=C2)Cl)Cl)O',4.82512253178873 +'CC(C)(C)C(C(=CC1=C(C=C(C=C1)Cl)Cl)N2C=NC=N2)O',3.81454188371475 +'C1=CC(C2C1C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl)Cl',5.9922949848715 +'C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N',4.47176647572299 +'CC1=NN(C(=C1C=NOCC2=CC=C(C=C2)C(=O)OC(C)(C)C)OC3=CC=CC=C3)C',5.13623540476555 +'CS(=O)(=O)C1=C(C=CC(=C1)C(F)(F)F)C(=O)C2=C(ON=C2)C3CC3',4.25445174537182 +'CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C',4.28018891498254 +'CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC',5.30057855955201 +'C1=CC(=CC=C1C(CN)O)O',2.78725763359614 +'CC1=C(C(=CC=C1)C)N(C(=O)COC)N2CCOC2=O',3.74554900711723 +'c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2',4.20939714153443 +'CCC(C)NC1=C(C=C(C=C1[N+](=O)[O-])C(C)(C)C)[N+](=O)[O-]',3.77134379610358 +'C1=CC(=CC=C1S(=O)(=O)C2=CC(=C(C=C2Cl)Cl)Cl)Cl',3.18978539843532 +'CCCCC1=C(NC(=NC1=O)NCC)C',3.92280444363211 +'n(c(nc(n1)NCC)NCC)c1Cl',4.58033674324961 +'FC(F)(F)C(C=C1N(=O)=O)=CC(N(=O)=O)=C1N(CC)CC(C)=C',4.42587730748324 +'C1CCC(C1)N(CC2=CC=C(C=C2)Cl)C(=O)NC3=CC=CC=C3',4.11903913677133 +'CS(=O)(=O)NC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',3.94325990345253 +'CCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC3=C(O2)C=C(C=C3)Cl',4.60419765136131 +'CCC1=C(C(=CC=C1)CC)N(CNC(=O)C)C(=O)CCl',3.67657281690409 +'NC(=N)NCCCCCCCCCCCC(OC(=O)C)',3.99309483347533 +'C1=CC(=CC(=C1)Cl)NC(=O)OCC#CCCl',2.75857660132254 +'CC(C)C(C(=O)OC(C(#N))c2cccc(Oc1ccccc1)c2)c3ccc(Cl)cc3',4.22520594870835 +'CC(C)C1=C(C=CC(=C1)C(C)(C)C2=CC(=C(C=C2)O)C(C)C)O',4.09683471023993 +'CCN(CC1=C(C=CC=C1Cl)F)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',3.92606530797808 +'CCCCCCCCSC(=O)OC1=CC(=NN=C1C2=CC=CC=C2)Cl',3.74923930876524 +'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',4.3407141033807 +'CCCCNC(=O)N1C2=CC=CC=C2N=C1NC(=O)OC',3.06493353581742 +'CC1=C(C(=CC=C1)C)N(C(C)C(=O)OC)C(=O)CC2=CC=CC=C2',3.84966174557959 +'CC(C)C(C1=CC=C(C=C1)OC(F)F)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3',4.87646988000983 +'Clc1ccccc1c2nnc(c3ccccc3Cl)nn2',4.1806220183605 +'CCOC(=O)NCCOC1=CC=C(C=C1)OC2=CC=CC=C2',4.4790525467538 +'CCC1=C(C(=CC=C1)CC)N(CC(=O)OCC)C(=O)CCl',3.79491137150459 +'c1(O2)c(CC2(C)C)cccc1OC(=O)N(C)SN(CCCC)CCCC',4.18246564622765 +'CCCCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC=C(C=C2)C(F)(F)F',5.10648736510651 +'COC1=CC(=C(C=C1Cl)OC)Cl',3.21917344408706 +'CCOP(=S)(OCC)OC1=NN(C(=N1)Cl)C(C)C',4.39966173548004 +'n(c(nc(n1)NC(C)C)NCC)c1Cl',3.93587643048823 +'CC(C)(C)C(C(=CC1=CC=C(C=C1)Cl)N2C=NC=N2)O',3.8694430122441 +'CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O)',3.8625999735624 +'c1cc(OC(F)(F)F)ccc1C(O)(C(C)C)c2cncnc2',4.41176854866759 +'COP(=O)(C(C(Cl)(Cl)Cl)O)OC',4.10964043198952 +'C1=CC(=C(C=C1C(F)(F)F)Cl)OC2=CC(=C(C=C2)[N+](=O)[O-])C(=O)O',3.46138721019571 +'CCCN(CC1CC1)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',4.8417219607834 +'CCOC(=O)C(C)OC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',3.96545863474241 +'CCSC(=O)N1CCCCCC1',4.10198823735002 +'CCC1=CC=C(C=C1)C(=O)NN(C(=O)C2=CC(=CC(=C2)C)C)C(C)(C)C',3.86588082257473 +'ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O)',4.36681001970786 +'COC(=O)C1=CC=CC=C1S(=O)(=O)NC(=O)NC2=NC(=CC(=N2)OC(F)F)OC(F)F',3.52443042732356 +'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O',4.07300621285581 +'CC1=C(C=CC(=C1)Cl)OCC(=O)O',4.70031198338967 +'COC=C(C1=CC=CC=C1OC2=NC=NC(=C2)OC3=CC=CC=C3C#N)C(=O)OC',3.81158305905272 +'C1=CC=C(C(=C1)C(C2=CC=C(C=C2)Cl)(C3=CN=CN=C3)O)Cl',5.15835722073531 +'[O-]Br(=O)=O',4.3215481796762 +'OP(=O)OCC',2.4395258763695 +'COP(N)(=O)SC',6.14961682124539 +'CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1',5.30586339308612 +'CCOP(=S)(OCC)SCCSCC',6.8363304797203 +'CCOP(=S)(OCC)SCSP(=S)(OCC)OCC',5.28383935473594 +'O=C(OCC(CCCC)CC)CCCCC(=O)OCC(CCCC)CC',2.39277487311710 +'CN(C=Nc1ccc(C)cc1C)C=Nc2ccc(C)cc2C',4.46746902029786 +[C@@]14([C@@H]5OCC1=CC=C[C@@H]([C@H](O[C@H]2C[C@@H]([C@H]([C@@H](O2)C)O[C@H]3C[C@@H]([C@H]([C@@H](O3)C)O)OC)OC)C(=CC[C@@H]6C[C@H](OC([C@@H]4C=C([C@H]5O)C)=O)C[C@]7(O6)O[C@@H]([C@H](C=C7)C)[C@H](CC)C)C)C)O,5.64002822248439 +'O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12',3.83664755457448 +'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',5.38357309992515 +'C(#N)Cl',2.94356799915553 +'C(#N)Br',2.93862388168010 +'C1=CC(=CC=C1C(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl)Cl',6.15165939778125 +'c(cccc1)(c1)C(C)C',2.56004605053309 +'CCCN(CCC)C(=O)SCC',3.87925249559703 +'NC(CCCC1)C1',3.21824710516194 +'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',4.83439806636601 +'CC(C)OC(=O)NC1=CC(=CC=C1)Cl',2.32972480951647 +'COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl',4.52109130295968 +'COC(=O)C1=CC=C(C=C1)C(=O)OC',3.19130342987610 +'N(C(=S)NC1)C1',5.611332968427 +'O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1',4.99842308366263 +'c(cccc1)(c1)C=C',2.56281074475285 +'COC(=O)c1ccccc1S(=O)(=O)NC(=O)Nc2nc(OC)nc(C)n2',3.18339945768247 +'C1=CC(=CC=C1N)Cl',4.00884378520503 +'FC(F)(F)C(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cc(Oc3ccccc3)ccc2',4.55615777900042 +'C(Cl)(Br)Br',3.86380195834146 +'C=C(Cl)Cl',3.84038967397096 +'C(C=CCl)Cl',4.33763486202989 +'COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl',3.86446577561058 +'Oc(ccc(c1)C(c(ccc(O)c2)c2)(C)C)c1',3.65950992099517 +'O=C(OCc(cccc1)c1)c(c(ccc2)C(=O)OCCCC)c2',2.82255713911138 +'O=C(NCCCC1)C1',2.95677386828604 +'c(cccc1)(c1)Cl',2.97219087736775 +'C(Cl)(Cl)Cl',3.29877173860401 +'ClCCl',3.20825373509371 +'C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl',6.48391158599853 +'OCCO',1.79286663192634 +'O=C(C=C(CC1(C)C)C)C1',2.88767656912200 +'C(F)(Cl)(Cl)Cl',2.59506047452425 +'CCc1cccc(CC)c1N(COC)C(=O)CCl',4.28486094761281 +'c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2',4.92723460128442 +'n1c(Cl)cc(OC)nc1NC(=O)NS(=O)(=O)c2ccccc2C(=O)OCC',3.52095051170688 +'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',4.60022325981506 +'c(cccc1)(c1)CC',2.56208837510252 +'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',3.87004900844397 +'Clc1cc(C(F)(F)F)cnc1Oc2ccc(OC(C)C(=O)OC)cc2',5.57487232351041 +'C#N',2.94040947259108 +'ClC(C(OC(C=C2C(=O)OC(C)C(=O)OCC)=CC=C2N(=O)=O)=C1)=CC=C1C(F)(F)F',3.96545863474241 +'c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2',3.77270454387038 +'O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N',3.88631461533234 +'CN(=CC=C1C(C=C2)=CC=N2C)C=C1',4.69607191571383 +'C1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-]',4.20441460583146 +'C(=C)Cl',4.68192429615426 +'C1CCC(=O)CC1',2.03281793688456 +'CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C',4.14541137996302 +'C1=CC(=O)NNC1(=O)',2.35058431121584 +'CCSC(=O)N1CCCCCC1',4.97151330020725 +'C(C(Cl)(Cl)Cl)(O)O',3.08555504738041 +'ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl',7.1923634710095 +'Clc1cc(C(F)(F)F)ccc1Oc2cc(OCC)c(N(=O)(=O))cc2',4.55834892852739 +'c1cc(Cl)ccc1C(C(#N))(CCCC)Cn2ncnc2',4.46756491519242 +'CC1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-]',5.055246608541 +'CC(C)OC(=O)C(C1=CC=C(C=C1)Br)(C2=CC=C(C=C2)Br)O',4.21658723866328 +'C[N+](C)(C)CCCl',2.97460527968547 +'CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl',3.62169695860399 +'CC1=NC(=NC(=C1)C2CC2)NC3=CC=CC=C3',3.80128998933051 +'N(c(cccc1)c1)c(cccc2)c2',3.83051794413252 +'CC1(C(=O)N(C(=O)O1)NC2=CC=CC=C2)C3=CC=C(C=C3)OC4=CC=CC=C4',4.34801416963502 +'CC1(CCCCC1)C(=O)NC2=C(C(=C(C=C2)O)Cl)Cl',3.01490626247445 +'C1=CC(=C2C(=C1)OC(O2)(F)F)C3=CNC=C3C#N',3.35338292576111 +'C(F)(F)(F)c1ccccc1C(=O)Nc2cccc(OC(C)C)c2',3.57009941427408 +'C(CCCCN=C(N)N)CCCNCCCCCCCCN=C(N)N',4.27216545257855 +'C1CN(C(=N1)N[N+](=O)[O-])CC2=CN=C(C=C2)Cl',4.17721556192143 +'COC(=O)C12CC3=C(C1=NN(CO2)C(=O)N(C4=CC=C(C=C4)OC(F)(F)F)C(=O)OC)C=CC(=C3)Cl',5.16619526358129 +'CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC',2.92782487037951 +'CC1=CC(=CC(=C1)C(=O)N(C(C)(C)C)NC(=O)C2=C(C(=CC=C2)OC)C)C',2.95255951099906 +'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C=C2)OC(C(OC(F)(F)F)F)(F)F)Cl)F',4.13628410350378 +'CC1=CC=C(C=C1)N(SC(F)(Cl)Cl)S(=O)(=O)N(C)C',4.28537828278078 +'CC(C)(C)C1=C(C=CC(=C1)O)O',2.86849281697225 +'CC(=NOCC1=CC=CC=C1C(=NOC)C(=O)OC)C2=CC(=CC=C2)C(F)(F)F',3.83290371721801 +'COC(=O)N(C1=CC=CC=C1COC2=NN(C=C2)C3=CC=C(C=C3)Cl)OC',4.63438424347854 +'CC(C)N1C(=NC(C)(C)C)SCN(C1=O)C2=CC=CC=C2',4.54540426969100 +'C1=CC=C(C(=C1)C2=NN=C(N=N2)C3=CC=CC=C3Cl)Cl',4.24360591089568 +'CCCC(=C1C(=O)CC(CC1=O)C2CCCSC2)NOCC',4.0653478352871 +'C1CC1NC2=NC(=C(C(=N2)N)C#N)N',3.93679970507275 +'C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3',5.50950218614247 +'C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N',4.69361522533935 +'CCOC1=CC2=C(C=C1)NC(C=C2C)(C)C',4.25789199055837 +'C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N',4.05027414115274 +'CC1CN(CC(O1)C)CC(C)CC2=CC=C(C=C2)C(C)(C)C',5.25168418782516 +'C[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F',5.19782165018731 +'c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2',4.29692796857781 +'CN(=CC=C1C(C=C2)=CC=N2C)C=C1',4.86356300300759 +'CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2',3.52947976153744 +'Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2',3.5520346361573 +'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',3.82660962776618 +'CCOC1=CC=C(C=C1)C(C)(C)COCC2=CC(=CC=C2)OC3=CC=CC=C3',4.16077781336093 +'CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2',4.26590014728598 +'CC(COC1=CC=C(C=C1)OC2=CC=CC=C2)OC3=CC=CC=N3',3.36087697276960 +'CC(C)(C)C(=O)C(N1C=NC=N1)OC2=CC=C(C=C2)Cl',3.41107116109321 +'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O',3.44975692245790 +'c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2',4.7231146186285 +'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',4.85962620215948 +'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',4.5585962064955 +'ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',3.92043344378224 +'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',6.21460930807761 +'ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl',6.58082159900658 +'C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl',6.18288159033454 +'C1(C(C(C(C(C1Cl)Cl)Cl)Cl)Cl)Cl',4.79154110643314 +'CCC(=O)Nc1ccc(Cl)c(Cl)c1',3.45780196740732 +'C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-]',3.32418644119937 +'C1C2C(COS(=O)O1)C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl',5.14711652367221 +'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',3.77313899543591 +'CC(C(=O)O)OC1=CC=C(C=C1)OC2=C(C=C(C=N2)C(F)(F)F)Cl',6.55834892852739 +'CCCCC(CN1C=NC=N1)(C#N)C2=CC=C(C=C2)Cl',4.46933393793126 +'Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2',4.86838559832397 +'COP(=O)(NC(=O)(C))SC',4.86490452310016 +'CCOP(=O)(OCC)OC(=CCl)C1=C(C=C(C=C1)Cl)Cl',5.3796920956126 +'CCOP(=S)(OCC)SCCSCC',6.09596779022605 +'O=P(O)(O)CCCl',4.0806685706873 +'CCCSP(=O)(OCC)SCCC',4.95305958493745 +'CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1',5.25150573076352 +'COP(=S)(OC)Oc1ccc(SC)c(C)c1',5.58722449762503 +'OC(=O)C(N)CCP(C)(=O)O',4.71391476838473 +'OC(=O)CNCP(O)(O)=O',2.75095321211059 +'CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC',2.96268235505315 +'COP(N)(=O)SC',5.68721882334643 +'CC(=CC(=O)OC)OP(=O)(OC)OC',5.80646736824669 +'CCOP(=S)(OCC)SCSCC',6.2114833717655 +'CCOP(=S)(OCC)SCSC(C)(C)C',6.68189008451404 +'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',5.08988368084419 +'CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl',5.54479494223028 +'CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C',4.71993889259734 +'CCC1=NC(=CC(=N1)OP(=S)(OC)OC)OCC',5.8126040303238 +'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',5.27636313027728 +'CCOP(=S)(OCC)SCN1C2=C(C=C(C=C2)Cl)OC1=O',5.26459183786176 +'COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O)',4.54725636091897 +'CCOC(=O)C1=CN2C(=CC(=N2)OP(=S)(OCC)OCC)N=C1C',4.97007298557879 +'CCOP(=S)(OCC)OC1=NN(C=N1)C2=CC=CC=C2',5.38203437103643 +'O=C(Oc(c(c(ccc1)cc2)c1)c2)NC',3.52552257057249 +'CC1=CC(=CC(=C1SC)C)OC(=O)NC',4.38429231462288 +'CNC(=O)ON=C(C)SC',3.90904789636717 +'CCCOC(=O)NCCCN(C)C',2.44226598159187 +'COC(=O)NC1=NC2=CC=CC=C2N1',3.40639632281981 +'CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C',4.2871938165512 +'CNC(=O)CCSCCSP(=O)(OC)OC',5.72599715999116 +'N(C(=S)SSC(N(C)C)=S)(C)C',4.30181261256647 +'C1=NNC(=N1)N',4.22572249207399 +'CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O)',3.75539000391453 +'C1=CC=C(C=C1)[Sn](C2=CC=CC=C2)C3=CC=CC=C3',6.0669625480302 +'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',4.64721982249128 +'N(C(=S)NC1)C1',4.91236296409098 +'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F',4.18310948429116 +'CCCSC1=CC2=C(C=C1)N=C(N2)NC(=O)OC',4.12275865288522 +'C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3',3.45437537377312 +'CC1(C2C(C3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C(C=CC(=C41)Cl)O)O)O)N(C)C)O)O',1.97849569899962 +'CC1=CC(=C(C=C1NC(=O)C2=CC(=CC(=C2O)I)I)Cl)C(C#N)C3=CC=C(C=C3)Cl',4.82156180249896 +'CN1CC2CC1CN2C3=C(C=C4C(=C3)N(C=C(C4=O)C(=O)O)C5CC5)F',3.85415878578584 +'C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl',4.43418336046643 +'CC1=NC=C(N1C)[N+](=O)[O-]',3.97352186635665 +'CCN1CCN(CC1)C2=C(C=C3C(=C2)N(C=C(C3=O)C(=O)O)C4CC4)F',4.14059829999974 +'CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O',5.95429183284051 +'COCC(=O)NC1=C(C=CC(=C1)SC2=CC=CC=C2)NC(=NC(=O)OC)NC(=O)OC',4.04773898332238 +'CC1CCC2=C3N1C=C(C(=O)C3=CC(=C2)F)C(=O)O',2.81499362006104 +'COC(=O)NC1=NC2=C(N1)C=C(C=C2)S(=O)C3=CC=CC=C3',5.1977587356423 +'CC1(C2CC3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C1C=CC=C4O)O)O)N(C)C)O',3.47171656401627 +'C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3',4.03795195940707 +'CC(C)NCC(COC1=CC=CC2=C1C3=CC=CC=C3N2)O',4.62967091273678 +'C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl',4.24854678350451 +'CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O',5.55635182416848 +'COP(=S)(OC)Oc1ccc(SC)c(C)c1',5.79134448028095 +'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',4.56054897737691 +'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',4.86157897304089 +'CC(N(C)C)CN(C(=CC=C3)C1=C3)C(=CC=C2)C(=C2)S1',4.23385066979149 +'C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-]',2.93578881098946 +'c(cccc1)(c1)C=C',2.41559561343340 diff --git a/test/data/acetaldehyde.sdf b/test/data/acetaldehyde.sdf new file mode 100644 index 0000000..de8dbd1 --- /dev/null +++ b/test/data/acetaldehyde.sdf @@ -0,0 +1,14 @@ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 +M END +> +active + +$$$$ diff --git a/test/data/boiling_points.ext.sdf b/test/data/boiling_points.ext.sdf new file mode 100644 index 0000000..e83ba77 --- /dev/null +++ b/test/data/boiling_points.ext.sdf @@ -0,0 +1,11460 @@ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 1.4782 1.4782 1.4782 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3904 1.4782 1.4782 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0268 3.1273 1.4782 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0268 0.6534 0.0500 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0277 0.6528 2.9061 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +378 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 1.1275 1.1275 1.1275 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9513 1.1275 1.1275 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4559 2.3710 1.1275 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4559 0.5051 2.2040 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4551 0.5060 0.0500 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M END +> +191.7 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 1.4761 1.4761 1.4761 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2227 1.4761 1.4761 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8939 3.1226 1.4761 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8942 0.6529 0.0500 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8939 0.6526 2.9018 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +349.8 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 1.1423 1.1423 1.1423 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4791 1.1423 1.1423 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6964 2.4025 1.1423 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6970 0.5135 0.0500 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6968 0.5112 2.2332 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +145.1 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 0.7815 0.7815 0.7815 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6535 0.7815 0.7815 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9274 2.6334 0.7815 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9282 0.4651 2.6061 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1840 0.1642 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M END +> +422.3 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 1.1977 1.1977 1.1977 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0199 1.1977 1.1977 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7337 2.4613 1.1977 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7339 0.6689 0.0500 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8210 0.6357 2.0750 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +232.3 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 1.1428 1.1428 1.1428 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9308 1.1428 1.1428 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6360 2.8567 1.1428 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6712 0.5103 0.0500 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7553 0.6233 2.0411 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +282 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 1.5189 1.5189 1.5189 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2721 1.5189 1.5189 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9635 3.1814 1.5189 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9615 0.7444 0.0500 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1321 0.9815 2.4114 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +334.3 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 1.2538 1.2538 1.2538 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6000 1.2538 1.2538 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8899 2.5498 1.2538 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8899 0.7740 0.0500 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8198 0.6805 2.0998 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +191 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 0.9542 0.9542 0.9542 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8656 0.9542 0.9542 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8062 2.8600 0.9542 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5351 0.5016 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5348 0.5014 1.8582 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +370.1 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 0.9443 0.9443 0.9443 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7022 0.9443 0.9443 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4033 2.6165 0.9443 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5650 0.4228 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5648 0.4225 1.8384 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +312.9 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 0.9607 0.9607 0.9607 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3100 0.9607 0.9607 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6238 2.2670 0.9607 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5856 0.4744 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5854 0.4742 1.8712 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +221.5 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 0.9524 0.9524 0.9524 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9467 0.9524 0.9524 I 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7986 2.9407 0.9524 I 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5253 0.4910 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5250 0.4907 1.8546 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +455.2 + +$$$$ + + CDK 0203121541 + + 4 3 0 0 0 0 0 0 0 0999 V2000 + 0.9777 0.9777 0.9777 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1799 0.9777 0.9777 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7548 1.9052 0.9777 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7546 0.0500 0.9773 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 +M END +> +254 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 1.4825 1.4825 1.4825 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6894 1.4825 1.4825 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9981 2.7436 1.4825 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8185 0.6054 1.4824 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.7377 1.4832 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 3 5 1 0 0 0 0 +M END +> +373.7 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 0.9467 0.9467 0.9467 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8976 0.9467 0.9467 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6014 1.9810 0.9467 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6021 0.4308 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6009 0.4285 1.8416 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +276.7 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 0.9417 0.9417 0.9417 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7064 0.9417 0.9417 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5686 1.9702 0.9417 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5696 0.4283 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5685 0.4266 1.8319 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +248.9 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 0.9465 0.9465 0.9465 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2974 0.9465 0.9465 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5983 1.9813 0.9465 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5988 0.4294 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5977 0.4286 1.8422 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +194.8 + +$$$$ + + CDK 0203121541 + + 5 4 0 0 0 0 0 0 0 0999 V2000 + 0.9446 0.9446 0.9446 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9720 0.9446 0.9446 I 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5875 1.9778 0.9446 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5868 0.4284 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5887 0.4291 1.8406 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 +M END +> +315.6 + +$$$$ + + CDK 0203121541 + + 6 5 0 0 0 0 0 0 0 0999 V2000 + 0.9552 0.9552 0.9552 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3502 0.9552 0.9552 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6811 2.0137 0.9552 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5416 0.4724 0.0612 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5410 0.4718 1.8486 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6341 0.0500 0.9573 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 6 1 0 0 0 0 +M END +> +337.8 + +$$$$ + + CDK 0203121541 + + 6 5 0 0 0 0 0 0 0 0999 V2000 + 1.3369 1.3369 1.3369 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1374 1.3369 1.3369 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0104 2.3844 1.3369 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9039 0.8554 0.4534 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9035 0.8551 2.2200 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3622 0.0500 1.3382 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 6 1 0 0 0 0 +M END +> +279.1 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.5490 1.5490 1.5490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1271 1.5490 1.5490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9987 3.2379 1.5490 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9938 0.7761 0.0500 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1072 0.8871 2.6397 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6410 0.3057 1.5694 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6430 2.1548 0.4640 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6369 2.1850 2.6194 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +276.2 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.2985 1.2985 1.2985 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9060 1.2985 1.2985 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3961 2.5469 1.2985 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3956 0.6736 2.3795 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3956 0.6745 0.2171 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8089 0.0500 1.3030 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8083 1.9265 2.3774 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8087 1.9185 0.2148 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M END +> +194.9 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.2873 1.2873 1.2873 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8424 1.2873 1.2873 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3887 2.9512 1.2873 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3905 0.5046 2.7550 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7514 0.0500 1.2470 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7631 1.8706 2.3843 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7531 1.9478 0.2392 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2295 0.7514 0.3924 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +301 + +$$$$ + + CDK 0203121541 + + 6 5 0 0 0 0 0 0 0 0999 V2000 + 1.4829 1.4829 1.4829 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8214 1.4829 1.4829 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7063 2.9079 1.4829 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7237 0.0734 1.4830 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6221 0.0500 1.4829 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9041 2.4137 1.4830 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 +M END +> +360.1 + +$$$$ + + CDK 0203121541 + + 7 6 0 0 0 0 0 0 0 0999 V2000 + 1.6990 1.6990 1.6990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2196 1.6990 1.6990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8553 2.7202 1.6990 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0949 0.0500 1.7018 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0855 2.5138 3.1242 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0825 2.5097 0.2740 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6994 0.7067 1.6992 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 +M END +> +370.8 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.7089 1.7089 1.7089 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2187 1.7089 1.7089 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8249 3.3576 1.7089 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8423 0.8817 3.1202 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8217 0.8983 0.2710 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1204 0.0500 1.7435 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1206 2.5194 3.1574 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3153 2.2266 0.8047 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M END +> +433 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.3227 1.3227 1.3227 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9205 1.3227 1.3227 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4331 2.5656 1.3227 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4249 0.7020 2.4027 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4311 0.6935 0.2497 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8827 0.0500 1.3695 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8814 1.8853 2.4648 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9104 1.8502 0.4383 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M END +> +225.1 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.8391 1.8391 1.8391 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3024 1.8391 1.8391 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2120 3.6435 1.8391 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1997 1.4455 0.0892 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9281 0.1095 2.3559 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9421 1.7145 0.0500 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3642 1.2239 2.6258 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7773 2.6534 2.4173 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +516.7 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.7205 1.7205 1.7205 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2265 1.7205 1.7205 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1145 3.3735 1.7205 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0965 0.9060 0.2967 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0958 0.9059 3.1438 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8045 0.0500 1.7250 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6192 2.2410 0.8278 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6200 2.2475 2.6091 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +403.7 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.7031 1.7031 1.7031 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2111 1.7031 1.7031 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1141 3.3674 1.7031 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0913 0.9228 0.2485 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7998 0.0500 1.8985 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8227 2.3064 0.1666 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3084 1.1738 2.5999 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6067 2.3349 2.5307 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +418.3 + +$$$$ + + CDK 0203121541 + + 6 5 0 0 0 0 0 0 0 0999 V2000 + 1.1190 1.1190 1.1190 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4557 1.1190 1.1190 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2515 2.1876 1.1190 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2510 0.0500 1.1194 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5441 0.1991 1.1191 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5437 2.0387 1.1191 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 +M END +> +187.5 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.3024 1.3024 1.3024 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8855 1.3024 1.3024 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3535 2.5697 1.3024 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3540 0.7766 2.4538 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8348 0.0500 1.4964 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8340 1.9978 2.3601 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8906 1.7226 0.3625 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2971 0.7432 0.4378 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +250.1 + +$$$$ + + CDK 0203121541 + + 6 5 0 0 0 0 0 0 0 0999 V2000 + 0.9636 0.9636 0.9636 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2789 0.9636 0.9636 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1157 2.6644 0.9636 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3754 0.0500 0.9637 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3774 1.8789 0.9635 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9708 0.1228 0.9637 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 +M END +> +288.9 + +$$$$ + + CDK 0203121541 + + 7 6 0 0 0 0 0 0 0 0999 V2000 + 1.6868 1.6868 1.6868 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1805 1.6868 1.6868 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9110 2.6419 1.6868 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8735 0.0500 1.6872 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2782 0.6677 1.6875 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2970 2.2070 2.5724 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2966 2.2054 0.8006 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 +M END +> +323.9 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.4735 1.4735 1.4735 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9748 1.4735 1.4735 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6025 3.1168 1.4735 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6024 0.6515 2.8971 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6024 0.6514 0.0500 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0790 0.4489 1.4797 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0782 1.9908 2.3576 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0788 1.9806 0.5832 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M END +> +347.2 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.7144 1.7144 1.7144 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2199 1.7144 1.7144 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7941 3.3906 1.7144 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1298 0.0500 1.5891 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1106 2.3650 3.2391 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3014 2.3128 0.8718 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6257 1.1938 2.6011 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6152 1.1980 0.8210 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +387 + +$$$$ + + CDK 0203121541 + + 6 5 0 0 0 0 0 0 0 0999 V2000 + 0.9776 0.9776 0.9776 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3103 0.9776 0.9776 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0205 2.1118 0.9776 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4157 0.0500 0.9775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3734 1.8797 0.9777 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9557 0.0957 0.9775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 +M END +> +200.9 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.1210 1.1210 1.1210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6646 1.1210 1.1210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2146 2.3565 1.1210 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2164 0.5021 2.1892 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2133 0.5038 0.0500 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7368 0.0944 1.1246 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7367 1.6371 2.0083 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7370 1.6311 0.2300 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M END +> +225.8 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.0607 1.0607 1.0607 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5355 1.0607 1.0607 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1603 2.8679 1.0607 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1616 0.6881 2.8289 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6613 0.0500 1.2191 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6688 1.7057 1.8591 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6637 1.4314 0.1061 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0390 0.4424 0.2984 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +381.1 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.9472 1.9472 1.9472 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4280 1.9472 1.9472 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8987 3.8438 1.9472 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4777 0.0500 1.9382 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5050 2.4076 2.8440 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5062 2.4156 1.0539 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8697 1.4824 2.8420 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8689 1.4827 1.0519 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +404.5 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.5271 1.5271 1.5271 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0284 1.5271 1.5271 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9248 3.1918 1.5271 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9233 0.7628 0.0500 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1055 0.9938 2.4071 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4234 0.5036 1.5617 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4323 2.0086 0.6265 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4225 2.0666 2.3983 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +330.4 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.7329 1.7329 1.7329 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2377 1.7329 1.7329 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8055 3.4161 1.7329 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1650 0.0500 1.7472 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3237 2.2530 2.6176 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3245 2.2381 0.8394 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6465 1.2201 2.6221 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6464 1.2199 0.8438 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +356.6 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.0775 1.0775 1.0775 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6119 1.0775 1.0775 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1281 2.3331 1.0775 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1275 0.5393 2.2122 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6972 0.0500 1.1080 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6683 1.6158 1.9413 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6975 1.5586 0.1688 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0359 0.5282 0.2113 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +247.4 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.3196 1.3196 1.3196 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8650 1.3196 1.3196 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3437 2.5891 1.3196 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8412 0.0500 1.3278 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9153 1.8278 2.2101 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9151 1.8160 0.4227 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2694 0.8171 2.2133 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2692 0.8172 0.4258 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +283.6 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.2730 1.2730 1.2730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7702 1.2730 1.2730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5356 2.2208 1.2730 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3515 0.0500 1.2731 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8493 0.2601 1.2738 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8946 1.7993 2.1590 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8944 1.7974 0.3859 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2995 0.1399 1.2732 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 8 1 0 0 0 0 +M END +> +391.1 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.1125 1.1125 1.1125 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5213 1.1125 1.1125 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1334 2.3326 1.1125 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3316 2.1964 1.1126 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8576 0.0500 1.1127 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7055 1.5959 2.0076 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7053 1.5959 0.2174 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5593 3.2705 1.1124 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 +M END +> +304.9 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.0732 1.0732 1.0732 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5624 1.0732 1.0732 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0499 2.9708 1.0732 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6741 0.0500 1.0780 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6728 1.5892 1.9556 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6740 1.5835 0.1868 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0131 0.6188 1.9684 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0130 0.6191 0.1778 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +311.5 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.0754 1.0754 1.0754 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5779 1.0754 1.0754 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1605 2.7588 1.0754 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6831 0.0500 1.0769 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6705 1.5856 1.9591 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6708 1.5830 0.1900 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9917 0.5683 1.9646 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9914 0.5685 0.1860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +285.4 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.0785 1.0785 1.0785 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5989 1.0785 1.0785 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1079 2.3398 1.0785 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6992 0.0500 1.0785 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6731 1.5866 1.9626 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6725 1.5869 0.1949 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0063 0.5765 1.9716 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0061 0.5768 0.1852 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +235.4 + +$$$$ + + CDK 0203121541 + + 8 7 0 0 0 0 0 0 0 0999 V2000 + 1.0751 1.0751 1.0751 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5667 1.0751 1.0751 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1402 3.0295 1.0751 I 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6788 0.0500 1.0772 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6757 1.5904 1.9582 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6767 1.5861 0.1890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0057 0.6016 1.9697 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0054 0.6017 0.1803 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 +M END +> +345.4 + +$$$$ + + CDK 0203121541 + + 9 8 0 0 0 0 0 0 0 0999 V2000 + 1.1123 1.1123 1.1123 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5179 1.1123 1.1123 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0922 2.3952 1.1123 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8578 0.0500 1.1123 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7017 1.5980 2.0056 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7039 1.5980 0.2178 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1657 2.1931 1.1194 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8208 2.9626 0.2139 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8095 2.9711 2.0017 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 7 1 0 0 0 0 + 3 8 1 0 0 0 0 + 3 9 1 0 0 0 0 +M END +> +248.3 + +$$$$ + + CDK 0203121541 + + 9 8 0 0 0 0 0 0 0 0999 V2000 + 1.0779 1.0779 1.0779 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5959 1.0779 1.0779 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0252 2.4206 1.0779 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6944 0.0500 1.0778 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6693 1.5860 1.9612 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6689 1.5853 0.1944 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9911 0.5516 1.9691 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9912 0.5524 0.1863 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9722 2.4016 1.0888 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 9 1 0 0 0 0 +M END +> +351.4 + +$$$$ + + CDK 0203121541 + + 10 9 0 0 0 0 0 0 0 0999 V2000 + 0.9596 0.9596 0.9596 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3693 0.9596 0.9596 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8111 2.4313 0.9596 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2200 2.4310 1.0043 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6925 0.0510 0.9821 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7568 0.4240 1.8480 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7498 0.4330 0.0625 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4546 2.9529 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3961 2.9717 1.8329 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4860 3.3401 1.0159 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 4 10 1 0 0 0 0 +M END +> +470.5 + +$$$$ + + CDK 0203121541 + + 9 8 0 0 0 0 0 0 0 0999 V2000 + 1.0957 1.0957 1.0957 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8964 1.0957 1.0957 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2862 2.8540 1.0957 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7644 0.0500 1.0929 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6687 1.5802 1.9810 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6671 1.5847 0.2138 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3779 2.9552 1.1047 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9047 3.3752 0.2104 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8936 3.3768 1.9755 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 7 1 0 0 0 0 + 3 8 1 0 0 0 0 + 3 9 1 0 0 0 0 +M END +> +310.5 + +$$$$ + + CDK 0203121541 + + 9 8 0 0 0 0 0 0 0 0999 V2000 + 1.0778 1.0778 1.0778 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5858 1.0778 1.0778 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1838 2.8027 1.0778 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6898 0.0500 1.0793 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6688 1.5846 1.9624 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6691 1.5819 0.1914 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9706 0.5349 1.9597 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9697 0.5360 0.1948 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4710 2.5778 1.0951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 9 1 0 0 0 0 +M END +> +308.2 + +$$$$ + + CDK 0203121541 + + 10 9 0 0 0 0 0 0 0 0999 V2000 + 2.4092 2.4092 2.4092 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2127 2.4092 2.4092 S 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8806 4.3174 2.4092 S 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9875 4.9034 0.7066 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1083 1.3527 2.4312 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9699 2.9018 3.2832 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9698 2.8644 1.5153 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4946 5.8769 0.7530 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5733 4.2510 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0101 5.0568 0.2367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 8 1 0 0 0 0 + 4 9 1 0 0 0 0 + 4 10 1 0 0 0 0 +M END +> +382.9 + +$$$$ + + CDK 0203121541 + + 10 9 0 0 0 0 0 0 0 0999 V2000 + 1.3410 1.3410 1.3410 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1681 1.3410 1.3410 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6393 2.7760 1.3410 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4653 2.7747 1.4057 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1328 0.0500 1.3447 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5597 0.8029 2.2246 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5581 0.8041 0.4560 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2811 3.3037 0.4373 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2182 3.3243 2.2048 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6753 4.0652 1.3862 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 4 10 1 0 0 0 0 +M END +> +419.2 + +$$$$ + + CDK 0203121541 + + 9 8 0 0 0 0 0 0 0 0999 V2000 + 1.5819 1.5819 1.5819 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0634 1.5819 1.5819 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8172 2.6782 1.5819 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7933 0.0500 1.5819 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1721 0.5632 1.5829 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1897 2.0999 2.4672 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1894 2.0982 0.6957 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9026 2.6467 1.5819 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3892 3.6760 1.5819 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 3 9 1 0 0 0 0 +M END +> +295.8 + +$$$$ + + CDK 0203121541 + + 11 10 0 0 0 0 0 0 0 0999 V2000 + 1.7193 1.7193 1.7193 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2309 1.7193 1.7193 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7898 3.1240 1.7193 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1444 0.0500 1.5689 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7901 0.8955 3.1992 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5555 3.0391 1.5990 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3121 2.1551 2.6497 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3196 2.3103 0.8755 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6208 1.1426 0.8475 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4028 3.7078 0.8647 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5201 3.6694 2.6419 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 +M END +> +430 + +$$$$ + + CDK 0203121541 + + 11 10 0 0 0 0 0 0 0 0999 V2000 + 1.7182 1.7182 1.7182 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2293 1.7182 1.7182 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7958 3.1173 1.7182 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1369 0.0500 1.5632 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7837 0.8924 3.2052 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3103 2.1531 2.6487 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3215 2.3109 0.8745 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6168 1.1325 0.8527 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8920 3.0977 1.7706 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5156 3.6594 0.8056 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4355 3.7006 2.5762 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 +M END +> +369.5 + +$$$$ + + CDK 0203121541 + + 10 9 0 0 0 0 0 0 0 0999 V2000 + 1.0787 1.0787 1.0787 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5836 1.0787 1.0787 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2310 2.4375 1.0787 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2329 0.0500 1.0782 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6516 0.0676 1.0812 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6971 1.6056 1.9629 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6980 1.6004 0.1909 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3274 2.3878 1.0946 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9343 3.0000 0.1839 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9095 3.0143 1.9556 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 +M END +> +329.4 + +$$$$ + + CDK 0203121541 + + 10 9 0 0 0 0 0 0 0 0999 V2000 + 1.0736 1.0736 1.0736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5844 1.0736 1.0736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1430 2.4761 1.0736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3303 2.7084 1.0886 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6779 0.0500 1.0745 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6680 1.5835 1.9577 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6673 1.5819 0.1890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9691 0.5210 1.9540 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9682 0.5237 0.1910 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4192 3.3081 1.0584 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 +M END +> +321.1 + +$$$$ + + CDK 0203121541 + + 10 10 0 0 0 0 0 0 0 0999 V2000 + 1.2355 1.2355 1.2355 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7359 1.2355 1.2355 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5027 2.5116 1.2355 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3939 1.7193 0.0500 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8110 2.1314 0.7634 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8426 0.3633 0.6976 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8615 1.1914 2.2662 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1845 0.3217 1.6702 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4998 2.5843 1.6854 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9951 3.4840 1.2145 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 +M END +> +307.6 + +$$$$ + + CDK 0203121541 + + 11 10 0 0 0 0 0 0 0 0999 V2000 + 1.0799 1.0799 1.0799 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5957 1.0799 1.0799 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0186 2.4422 1.0799 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3625 2.6559 1.0711 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5945 3.8402 1.0722 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7014 0.0500 1.0800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6694 1.5852 1.9641 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6697 1.5859 0.1959 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0007 0.5664 1.9724 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0002 0.5663 0.1872 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0865 1.8283 1.0639 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 11 1 0 0 0 0 +M END +> +327.5 + +$$$$ + + CDK 0203121541 + + 11 10 0 0 0 0 0 0 0 0999 V2000 + 2.5265 2.5265 2.5265 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0276 2.5265 2.5265 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7700 3.4890 2.5265 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5686 1.2700 2.5265 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9734 1.1345 2.5248 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0980 1.5156 2.5279 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1491 3.0532 3.4128 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1489 3.0514 1.6392 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1070 0.0500 2.5375 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4195 1.5665 1.6227 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4280 1.5866 3.4129 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 9 1 0 0 0 0 + 5 10 1 0 0 0 0 + 5 11 1 0 0 0 0 +M END +> +330.1 + +$$$$ + + CDK 0203121541 + + 11 10 0 0 0 0 0 0 0 0999 V2000 + 1.0783 1.0783 1.0783 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5896 1.0783 1.0783 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2248 2.4443 1.0783 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4154 2.7102 1.0657 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4026 3.5182 1.0930 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6939 0.0500 1.0777 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6677 1.5820 1.9631 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5831 0.1941 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9726 0.5289 1.9621 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9723 0.5289 0.1944 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9243 4.3154 1.0917 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 5 11 1 0 0 0 0 +M END +> +414.3 + +$$$$ + + CDK 0203121541 + + 11 10 0 0 0 0 0 0 0 0999 V2000 + 1.9464 1.9464 1.9464 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4453 1.9464 1.9464 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9962 3.3551 1.9464 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4656 0.0500 1.9323 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4991 2.3976 2.8451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4985 2.4103 1.0547 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8144 1.3861 2.8281 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8144 1.3868 1.0642 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0934 3.3496 1.9503 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6731 3.9161 1.0595 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6669 3.9188 2.8293 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 +M END +> +344.1 + +$$$$ + + CDK 0203121541 + + 11 10 0 0 0 0 0 0 0 0999 V2000 + 1.0723 1.0723 1.0723 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5811 1.0723 1.0723 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1630 2.4644 1.0723 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1325 0.2421 2.5647 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6737 0.0500 1.0620 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6679 1.5763 1.9602 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6799 1.5923 0.1887 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9736 0.4825 0.2126 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2587 2.4377 1.1281 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8889 3.0044 0.1567 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8024 3.0539 1.9257 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 +M END +> +308.8 + +$$$$ + + CDK 0203121541 + + 11 10 0 0 0 0 0 0 0 0999 V2000 + 1.0736 1.0736 1.0736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5854 1.0736 1.0736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1309 2.4833 1.0736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9092 2.4099 1.1283 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6781 0.0500 1.0735 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5821 1.9582 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6682 1.5822 0.1888 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9693 0.5223 1.9547 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9663 0.5248 0.1896 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8362 3.0401 0.1667 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7803 3.0613 1.9468 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 +M END +> +319.7 + +$$$$ + + CDK 0203121541 + + 11 10 0 0 0 0 0 0 0 0999 V2000 + 1.0699 1.0699 1.0699 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5682 1.0699 1.0699 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1874 2.4343 1.0699 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1159 0.2199 2.8463 I 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6757 0.0500 1.1622 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6688 1.6553 1.9078 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6753 1.5006 0.1391 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9889 0.4172 0.2722 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2789 2.3728 1.1638 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9574 2.9716 0.1393 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8177 3.0417 1.9068 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 +M END +> +362.6 + +$$$$ + + CDK 0203121541 + + 11 10 0 0 0 0 0 0 0 0999 V2000 + 1.0746 1.0746 1.0746 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5885 1.0746 1.0746 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1318 2.4742 1.0746 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1594 2.3029 1.0910 I 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6818 0.0500 1.0745 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6684 1.5825 1.9594 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6686 1.5824 0.1897 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9741 0.5261 1.9566 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9740 0.5280 0.1915 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8517 3.0494 0.1753 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8365 3.0561 1.9646 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 +M END +> +375.6 + +$$$$ + + CDK 0203121541 + + 12 11 0 0 0 0 0 0 0 0999 V2000 + 1.0705 1.0705 1.0705 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5957 1.0705 1.0705 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1382 2.4985 1.0705 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0017 0.3483 2.2201 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6665 0.0500 1.0850 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6623 1.5968 1.9435 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6863 1.5686 0.1714 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9707 0.5298 0.1665 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2361 2.5181 1.0493 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7837 3.0467 0.1886 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8143 3.0584 1.9579 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9447 0.4275 2.2719 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 +M END +> +355.4 + +$$$$ + + CDK 0203121541 + + 12 11 0 0 0 0 0 0 0 0999 V2000 + 1.0791 1.0791 1.0791 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5956 1.0791 1.0791 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0176 2.4385 1.0791 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4111 2.5950 1.0748 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6985 0.0500 1.0789 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6692 1.5851 1.9631 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6689 1.5852 0.1954 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9986 0.5601 1.9709 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9981 0.5599 0.1873 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5419 3.6799 1.0807 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8794 2.1556 1.9641 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8715 2.1664 0.1762 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 10 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 12 1 0 0 0 0 +M END +> +280.5 + +$$$$ + + CDK 0203121541 + + 12 11 0 0 0 0 0 0 0 0999 V2000 + 1.0732 1.0732 1.0732 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5849 1.0732 1.0732 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1244 2.5020 1.0732 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5315 2.4297 1.1045 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6765 0.0500 1.0726 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6668 1.5812 1.9580 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6666 1.5824 0.1892 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9682 0.5196 1.9531 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9644 0.5238 0.1889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7900 3.0473 0.1682 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7485 3.0631 1.9519 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8466 3.3230 1.1146 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 +M END +> +370.4 + +$$$$ + + CDK 0203121541 + + 13 12 0 0 0 0 0 0 0 0999 V2000 + 1.7976 1.7976 1.7976 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3224 1.7976 1.7976 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7326 3.1520 1.7976 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8464 1.0432 3.0418 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2380 0.8834 2.8876 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4092 0.7716 1.7630 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3866 2.2805 2.6942 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3981 2.3332 0.9265 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6979 1.3036 0.8672 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6803 3.1466 1.8091 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6123 1.5991 3.9709 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3625 0.0500 3.1151 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5634 0.5413 3.7088 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 13 1 0 0 0 0 +M END +> +460.8 + +$$$$ + + CDK 0203121541 + + 13 12 0 0 0 0 0 0 0 0999 V2000 + 1.4215 1.4215 1.4215 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9483 1.4215 1.4215 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4657 2.8581 1.4215 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9971 0.0783 1.4077 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8720 2.7991 1.4852 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0268 1.9395 2.3185 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0278 1.9575 0.5347 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3344 0.8696 2.3019 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3336 0.8735 0.5385 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1456 3.3930 0.5050 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0665 3.4235 2.2873 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 0.0951 1.4081 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1809 3.6945 1.4679 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 13 1 0 0 0 0 +M END +> +487.6 + +$$$$ + + CDK 0203121541 + + 12 11 0 0 0 0 0 0 0 0999 V2000 + 1.0715 1.0715 1.0715 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5869 1.0715 1.0715 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1320 2.4849 1.0715 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1249 0.0924 2.5367 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6679 0.0500 1.0681 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6637 1.5872 1.9521 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6822 1.5842 0.1814 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9521 0.5453 0.1595 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2300 2.4976 1.0577 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7876 3.0359 0.1854 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8041 3.0506 1.9545 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4139 0.3041 2.4778 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 +M END +> +325.7 + +$$$$ + + CDK 0203121541 + + 12 11 0 0 0 0 0 0 0 0999 V2000 + 1.0744 1.0744 1.0744 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5878 1.0744 1.0744 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1319 2.4903 1.0744 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9556 2.4192 1.1304 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6802 0.0500 1.0747 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5829 1.9588 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6679 1.5829 0.1899 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9680 0.5218 1.9571 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9635 0.5231 0.1890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7911 3.0329 0.1742 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7394 3.0535 1.9403 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2135 3.7007 1.1032 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 +M END +> +340.9 + +$$$$ + + CDK 0203121541 + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 0.9074 0.9074 0.9074 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2799 0.9074 0.9074 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6851 2.2904 0.9074 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5299 3.0317 0.9068 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4308 2.2004 0.9073 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1498 0.1302 0.9091 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9460 0.0500 0.9076 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7085 2.6531 0.9081 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3100 4.0945 0.9073 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 1 0 0 0 0 +M END +> +304.5 + +$$$$ + + CDK 0203121541 + + 9 9 0 0 0 0 0 0 0 0999 V2000 + 0.9427 0.9427 0.9427 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3084 0.9427 0.9427 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8511 2.2725 0.9427 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8755 3.2283 0.9447 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2936 2.5409 0.9454 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3078 0.0586 0.9416 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9339 0.0500 0.9406 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9227 2.4717 0.9405 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0410 4.3041 0.9468 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 1 0 0 0 0 +M END +> +357.3 + +$$$$ + + CDK 0203121541 + + 11 11 0 0 0 0 0 0 0 0999 V2000 + 0.9687 0.9687 0.9687 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4709 0.9687 0.9687 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9110 2.2332 0.9687 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7353 3.1672 0.9716 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5616 2.3437 0.9779 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5356 0.4856 1.8609 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5375 0.4972 0.0692 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0534 0.0500 0.9668 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9385 2.5905 0.9689 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6902 3.8078 0.0744 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6965 3.8113 1.8664 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 10 1 0 0 0 0 + 4 11 1 0 0 0 0 +M END +> +339 + +$$$$ + + CDK 0203121541 + + 12 11 0 0 0 0 0 0 0 0999 V2000 + 3.2223 3.2223 3.2223 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7112 3.2223 3.2223 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3954 4.3712 3.2223 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4526 1.9377 3.2224 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6613 1.7638 3.2057 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7246 0.7956 3.2439 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7807 2.2181 3.2213 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8372 3.7457 4.1084 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8374 3.7473 2.3371 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4818 4.4194 3.2221 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8973 5.3372 3.2224 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3173 0.0500 3.2427 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 12 1 0 0 0 0 +M END +> +434.2 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.7187 1.7187 1.7187 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2303 1.7187 1.7187 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7983 3.1268 1.7187 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3045 3.1206 1.5909 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1381 0.0500 1.5688 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7744 0.8838 3.2058 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3111 2.1559 2.6486 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3196 2.3093 0.8742 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6160 1.1336 0.8513 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3516 3.7018 0.8829 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4942 3.6530 2.6455 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7088 4.1398 1.6334 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7719 2.5441 2.4015 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6309 2.6766 0.6410 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 +M END +> +397.1 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.5360 1.5360 1.5360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0450 1.5360 1.5360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6338 2.9372 1.5360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1427 2.9337 1.5137 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5866 0.7129 3.0355 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0723 3.7712 0.0500 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1429 0.5123 1.5781 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1300 2.0816 2.3982 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1438 2.0108 0.6261 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4415 0.9496 0.6751 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2503 3.5182 2.4063 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5403 3.9563 1.5183 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5460 2.4104 2.3918 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5337 2.4307 0.6191 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 +M END +> +392.6 + +$$$$ + + CDK 0203121541 + + 13 12 0 0 0 0 0 0 0 0999 V2000 + 0.9555 0.9555 0.9555 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4639 0.9555 0.9555 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0088 2.3741 0.9555 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5209 2.3803 0.9412 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2959 0.1630 1.5877 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4570 1.7184 0.3342 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8718 0.3872 1.8155 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8059 0.4106 0.0520 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6197 2.9298 0.0790 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6366 2.9194 1.8452 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9143 3.4049 0.9435 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9366 1.8670 1.8188 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9197 1.8773 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 2 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 +M END +> +348 + +$$$$ + + CDK 0203121541 + + 13 12 0 0 0 0 0 0 0 0999 V2000 + 2.0555 2.0555 2.0555 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5681 2.0555 2.0555 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1100 3.4723 2.0555 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4815 4.0165 3.0777 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1657 4.1578 0.7177 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6633 1.0311 2.0910 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6499 2.5917 2.9234 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6478 2.5323 1.1535 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9447 1.4974 2.9355 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9542 1.5168 1.1682 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4915 5.2037 0.7869 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8621 3.6337 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1762 4.1449 0.2404 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 5 11 1 0 0 0 0 + 5 12 1 0 0 0 0 + 5 13 1 0 0 0 0 +M END +> +352.8 + +$$$$ + + CDK 0203121541 + + 13 12 0 0 0 0 0 0 0 0999 V2000 + 1.9082 1.9082 1.9082 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4280 1.9082 1.9082 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9619 3.3278 1.9082 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9238 1.0669 3.0690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7317 1.4352 3.8884 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5029 0.8887 1.8596 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5041 2.3827 2.8123 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5141 2.4613 1.0456 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7873 1.3936 0.9822 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0594 3.3436 1.9062 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6197 3.8765 1.0208 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6273 3.8867 2.7922 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5004 0.0500 3.1358 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 13 1 0 0 0 0 +M END +> +337.3 + +$$$$ + + CDK 0203121541 + + 13 13 0 0 0 0 0 0 0 0999 V2000 + 1.4141 1.4141 1.4141 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8355 1.4141 1.4141 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3286 2.8624 1.4141 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0838 3.7076 1.1568 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9311 2.7048 1.0657 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1729 0.8490 0.5277 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1246 0.8443 2.3116 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1028 3.0265 0.6435 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8044 3.1260 2.3760 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1740 4.3004 0.2289 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9171 4.4432 1.9642 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5037 2.6389 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1082 2.9078 1.7695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 10 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 12 1 0 0 0 0 + 5 13 1 0 0 0 0 +M END +> +339.1 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.0739 1.0739 1.0739 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5866 1.0739 1.0739 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1277 2.4944 1.0739 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6291 2.5976 1.1065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3009 3.6089 1.2262 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3433 1.4549 0.9842 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6792 0.0500 1.0737 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6662 1.5817 1.9583 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6669 1.5818 0.1893 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9659 0.5212 1.9558 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9644 0.5221 0.1906 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7711 3.0377 0.1747 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7266 3.0561 1.9426 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2732 1.6589 1.0174 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 14 1 0 0 0 0 +M END +> +436.4 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.0801 1.0801 1.0801 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5964 1.0801 1.0801 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0122 2.4419 1.0801 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3481 2.7200 1.0606 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4920 3.9248 1.0684 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4240 1.6748 1.0337 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7023 0.0500 1.0800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6694 1.5855 1.9641 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6695 1.5857 0.1962 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0000 0.5657 1.9733 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9991 0.5645 0.1871 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4198 2.1370 1.0355 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3581 1.0170 1.9108 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3463 1.0491 0.1344 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 12 1 0 0 0 0 + 6 13 1 0 0 0 0 + 6 14 1 0 0 0 0 +M END +> +350.2 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 2.3978 2.3978 2.3978 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9182 2.3978 2.3978 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4643 3.8162 2.3978 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4216 1.6489 3.6185 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3669 1.9523 4.7962 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0172 0.4614 3.3520 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 1.3770 2.3957 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9899 2.9151 3.2765 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0108 2.9080 1.5061 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2769 1.8753 1.4758 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5613 3.8249 2.3721 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1089 4.3674 1.5171 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1476 4.3764 3.2878 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2998 0.0500 4.1629 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 14 1 0 0 0 0 +M END +> +427.7 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.1144 1.1144 1.1144 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5197 1.1144 1.1144 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1942 2.3078 1.1144 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3823 2.0673 1.1121 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4995 3.6473 1.1172 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4644 4.8096 1.1449 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8660 0.0500 1.1174 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7014 1.5970 2.0078 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7036 1.5915 0.2172 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8480 3.7095 0.2216 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8204 3.6925 1.9933 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9233 5.7643 1.1343 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0951 4.7947 2.0433 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1365 4.8008 0.2767 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 10 1 0 0 0 0 + 5 11 1 0 0 0 0 + 6 12 1 0 0 0 0 + 6 13 1 0 0 0 0 + 6 14 1 0 0 0 0 +M END +> +352.6 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.0740 1.0740 1.0740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5859 1.0740 1.0740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1197 2.5028 1.0740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5430 2.4172 1.1143 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2174 3.5993 1.1097 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4066 3.3977 1.1460 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6792 0.0500 1.0735 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6664 1.5811 1.9588 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6671 1.5819 0.1893 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9681 0.5213 1.9552 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9663 0.5241 0.1903 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8067 3.0492 0.1640 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7568 3.0687 1.9531 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6995 4.5687 1.0768 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 14 1 0 0 0 0 +M END +> +354 + +$$$$ + + CDK 0203121541 + + 13 13 0 0 0 0 0 0 0 0999 V2000 + 1.8327 1.8327 1.8327 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6565 1.8327 1.8327 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1248 3.2806 1.8327 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0697 4.1454 1.1482 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6880 3.6219 1.5088 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0267 1.2886 0.9461 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0320 1.2802 2.7107 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1031 3.3797 1.3264 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2900 3.6307 2.8707 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2138 4.1248 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1806 5.2059 1.4426 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9585 3.7984 0.7002 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2843 4.1290 2.4027 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 10 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 12 1 0 0 0 0 + 5 13 1 0 0 0 0 +M END +> +394.3 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.9471 1.9471 1.9471 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4453 1.9471 1.9471 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9976 3.3647 1.9471 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5096 3.3626 1.9562 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4697 0.0500 1.9336 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4987 2.3963 2.8464 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4978 2.4103 1.0556 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8190 1.3853 2.8264 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8146 1.3926 1.0610 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6275 3.9130 1.0583 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6149 3.9195 2.8264 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9085 4.3850 1.9615 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9091 2.8496 2.8413 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9192 2.8548 1.0728 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 +M END +> +374.8 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.1468 1.1468 1.1468 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6426 1.1468 1.1468 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2734 2.5122 1.1468 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7773 2.4407 1.0079 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1072 0.3787 2.8937 Br 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7564 0.1274 1.2614 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7467 1.7484 1.9741 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7457 1.5574 0.2104 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0768 0.4710 0.3797 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8406 3.1133 0.3214 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9993 3.0448 2.0800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2271 3.4398 1.0630 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2177 1.8302 1.8085 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0778 1.9960 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 +M END +> +364.4 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.0733 1.0733 1.0733 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5852 1.0733 1.0733 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1394 2.4888 1.0733 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6509 2.4805 1.0858 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2347 4.1613 1.0813 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6765 0.0500 1.0733 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6670 1.5832 1.9570 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6685 1.5825 0.1885 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9657 0.5157 1.9521 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9602 0.5238 0.1865 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7751 3.0434 0.1856 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7593 3.0477 1.9517 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0537 1.9740 1.9809 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0671 1.9650 0.2020 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 +M END +> +351.6 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.1119 1.1119 1.1119 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6213 1.1119 1.1119 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2007 2.5147 1.1119 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7077 2.5027 0.9946 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1625 0.2752 2.6068 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7148 0.0889 1.1112 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7077 1.6229 1.9959 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7169 1.6232 0.2241 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0181 0.5236 0.2527 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7589 3.0887 0.2729 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8930 3.0450 2.0353 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1151 3.5210 1.0329 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1670 1.9297 1.8120 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0387 2.0510 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 +M END +> +341.3 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.9171 1.9171 1.9171 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4319 1.9171 1.9171 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9950 3.3232 1.9171 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9954 1.0854 3.0508 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9610 1.1368 0.3774 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5179 0.8947 1.8945 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5232 2.4090 2.8160 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5190 2.4485 1.0428 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0918 3.3147 1.8716 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6298 3.8986 1.0565 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7031 3.8630 2.8276 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0924 1.0565 3.0177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7016 1.4987 4.0246 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6339 0.0500 3.0042 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 +M END +> +323.8 + +$$$$ + + CDK 0203121541 + + 14 13 0 0 0 0 0 0 0 0999 V2000 + 1.8290 1.8290 1.8290 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3493 1.8290 1.8290 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8796 3.2526 1.8290 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8654 1.0591 3.0334 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6314 0.8758 2.9108 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4260 0.8084 1.7898 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4238 2.3104 2.7293 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4351 2.3730 0.9607 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7071 1.3137 0.9038 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9779 3.2645 1.8532 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5597 3.7948 0.9299 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5225 3.8184 2.7001 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6310 1.5749 3.9820 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4191 0.0500 3.0892 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 +M END +> +342 + +$$$$ + + CDK 0203121541 + + 15 14 0 0 0 0 0 0 0 0999 V2000 + 1.0724 1.0724 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5844 1.0724 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1382 2.4878 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6650 2.4675 1.0850 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1109 3.8043 1.0863 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6740 0.0500 1.0726 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6672 1.5829 1.9562 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6680 1.5824 0.1880 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9636 0.5158 1.9523 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9581 0.5219 0.1860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7728 3.0397 0.1833 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7558 3.0475 1.9493 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0439 1.9355 1.9807 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0586 1.9314 0.1982 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0575 3.7716 1.0890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 +M END +> +390.8 + +$$$$ + + CDK 0203121541 + + 15 14 0 0 0 0 0 0 0 0999 V2000 + 1.0909 1.0909 1.0909 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6155 1.0909 1.0909 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1580 2.5307 1.0909 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6686 2.5534 1.0171 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0306 0.3604 2.2322 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6888 0.0698 1.1138 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6821 1.6227 1.9604 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7046 1.5806 0.1880 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9953 0.5518 0.1877 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7238 3.0810 0.2341 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8123 3.0664 1.9976 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0647 3.5662 1.1579 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1097 1.9124 1.7987 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0358 2.1856 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9479 0.5793 2.3659 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 +M END +> +372.7 + +$$$$ + + CDK 0203121541 + + 15 14 0 0 0 0 0 0 0 0999 V2000 + 1.0787 1.0787 1.0787 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5958 1.0787 1.0787 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0123 2.4361 1.0787 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4236 2.5891 1.0832 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7139 4.0778 1.0662 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6978 0.0500 1.0791 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6695 1.5846 1.9629 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6690 1.5852 0.1951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9978 0.5584 1.9704 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9977 0.5590 0.1865 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8547 2.1062 1.9825 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8628 2.0855 0.1993 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7963 4.2545 1.0826 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3094 4.5628 0.1683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2794 4.5893 1.9351 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 +M END +> +307.6 + +$$$$ + + CDK 0203121541 + + 15 14 0 0 0 0 0 0 0 0999 V2000 + 1.8434 1.8434 1.8434 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3793 1.8434 1.8434 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8870 3.2765 1.8434 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9267 1.0895 3.0437 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4010 0.5574 1.4734 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4507 2.1217 2.8419 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4549 2.5878 1.1195 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7410 1.3386 0.9139 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9843 3.3078 1.8558 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5530 3.8239 0.9520 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5341 3.8316 2.7231 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0244 1.0665 3.0301 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6192 1.5552 3.9900 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5744 0.0500 3.0577 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4632 0.5500 1.6066 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 +M END +> +380.8 + +$$$$ + + CDK 0203121541 + + 15 14 0 0 0 0 0 0 0 0999 V2000 + 1.8380 1.8380 1.8380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3692 1.8380 1.8380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8968 3.2790 1.8380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8980 1.0925 3.0705 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7535 1.1654 0.6431 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4350 0.8171 1.8070 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4511 2.3224 2.7437 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4354 2.3790 0.9716 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9947 3.3106 1.8499 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5588 3.8303 0.9507 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5429 3.8236 2.7226 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9960 1.0797 3.0987 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5503 1.5715 3.9946 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5541 0.0500 3.0874 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7012 1.1558 0.6330 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 +M END +> +355.6 + +$$$$ + + CDK 0203121541 + + 15 14 0 0 0 0 0 0 0 0999 V2000 + 1.0737 1.0737 1.0737 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5855 1.0737 1.0737 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1211 2.5024 1.0737 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5406 2.4169 1.1208 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1776 3.6661 1.1190 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6776 0.0500 1.0734 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6662 1.5820 1.9580 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 1.5823 0.1890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9665 0.5205 1.9550 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9659 0.5235 0.1904 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8051 3.0492 0.1636 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7478 3.0711 1.9482 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2385 3.4063 1.1612 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9669 4.2378 0.2070 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9055 4.2702 1.9934 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 +M END +> +312.2 + +$$$$ + + CDK 0203121541 + + 16 15 0 0 0 0 0 0 0 0999 V2000 + 1.4057 1.4057 1.4057 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8163 1.4057 1.4057 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2748 2.8623 1.4057 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7926 2.9757 1.2125 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1866 4.4314 0.9598 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4038 2.4634 2.3845 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1386 0.5170 1.5951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2085 0.8651 2.2885 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1820 0.8753 0.5035 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7701 3.4201 0.5911 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9688 3.3609 2.3471 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1130 2.3469 0.3444 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2714 4.5424 0.8295 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7068 4.8136 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8869 5.0836 1.7908 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3336 2.6252 2.2982 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 +M END +> +480.2 + +$$$$ + + CDK 0203121541 + + 16 15 0 0 0 0 0 0 0 0999 V2000 + 0.9588 0.9588 0.9588 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3684 0.9588 0.9588 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8261 2.4159 0.9588 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3423 2.4959 1.0185 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8017 3.9521 0.9939 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2063 3.9546 1.1115 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6893 0.0512 0.9901 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7552 0.4232 1.8485 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7475 0.4273 0.0633 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4523 2.9330 0.0524 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3799 2.9580 1.8167 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7172 1.9908 1.9314 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7875 1.9415 0.1681 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4958 4.4455 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3469 4.5241 1.8271 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4773 4.8616 1.0759 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 +M END +> +501.2 + +$$$$ + + CDK 0203121541 + + 16 15 0 0 0 0 0 0 0 0999 V2000 + 1.8549 1.8549 1.8549 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3800 1.8549 1.8549 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7944 3.2065 1.8549 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9308 1.0518 3.0696 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3120 0.8576 2.8141 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6889 1.7475 4.4055 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4668 0.8295 1.8027 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4429 2.3215 2.7611 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4561 2.4057 0.9931 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7487 1.3795 0.9110 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7399 3.1986 1.9245 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4344 0.0500 3.0753 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6863 0.4833 3.6002 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9825 1.1124 5.2519 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2469 2.6902 4.4874 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6233 1.9872 4.5257 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 6 14 1 0 0 0 0 + 6 15 1 0 0 0 0 + 6 16 1 0 0 0 0 +M END +> +453.9 + +$$$$ + + CDK 0203121541 + + 16 15 0 0 0 0 0 0 0 0999 V2000 + 1.8494 1.8494 1.8494 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3860 1.8494 1.8494 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8790 3.3055 1.8494 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9298 1.0982 3.0537 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4119 0.5390 1.5725 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2262 3.3109 1.4360 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4560 2.1951 2.8265 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4567 2.5389 1.0747 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7478 1.3408 0.9210 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2816 3.9249 1.1503 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7767 3.7551 2.8572 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0275 1.1028 3.0602 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5922 1.5441 3.9995 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6038 0.0500 3.0495 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4688 0.5473 1.6624 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5437 4.1937 1.5677 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 +M END +> +487.2 + +$$$$ + + CDK 0203121541 + + 15 14 0 0 0 0 0 0 0 0999 V2000 + 1.0733 1.0733 1.0733 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5853 1.0733 1.0733 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1372 2.4911 1.0733 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6536 2.4811 1.0838 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2547 4.2047 1.0734 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6763 0.0500 1.0734 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6670 1.5831 1.9570 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6684 1.5824 0.1884 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9657 0.5153 1.9519 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9593 0.5232 0.1864 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7682 3.0426 0.1846 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7544 3.0458 1.9541 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0296 1.9426 1.9729 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0408 1.9284 0.2082 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5411 3.9759 1.0886 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 +M END +> +371.6 + +$$$$ + + CDK 0203121541 + + 15 14 0 0 0 0 0 0 0 0999 V2000 + 2.1429 2.1429 2.1429 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6561 2.1429 2.1429 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2287 3.5576 2.1429 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9191 3.4376 2.8702 S 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2267 4.1657 0.7561 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7511 1.1177 2.1498 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7354 2.6551 3.0250 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7323 2.6434 1.2556 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0253 1.5972 3.0369 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0382 1.5755 1.2703 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6181 4.1997 2.8203 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3682 4.6323 2.5871 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6168 5.1924 0.7627 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8365 3.5854 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2063 4.2074 0.3493 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 +M END +> +358.1 + +$$$$ + + CDK 0203121541 + + 15 14 0 0 0 0 0 0 0 0999 V2000 + 1.8268 1.8268 1.8268 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3496 1.8268 1.8268 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8742 3.2564 1.8268 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8722 1.0901 3.0536 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8366 0.9415 0.2696 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4240 0.8046 1.8225 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4366 2.3332 2.7204 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4240 2.3492 0.9484 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9722 3.2846 1.8262 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5247 3.8150 0.9480 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5330 3.7986 2.7195 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9702 1.0726 3.0778 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5319 1.5775 3.9776 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5204 0.0500 3.0805 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1389 1.0070 0.3769 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 +M END +> +337.4 + +$$$$ + + CDK 0203121541 + + 15 14 0 0 0 0 0 0 0 0999 V2000 + 1.9826 1.9826 1.9826 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5044 1.9826 1.9826 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0283 3.4103 1.9826 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0253 1.2035 3.1878 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7085 0.5825 2.8360 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5763 0.9644 1.9210 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5766 2.4455 2.8920 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5903 2.5445 1.1248 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8578 1.4706 1.0522 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1261 3.4319 2.0026 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7011 3.9497 1.0842 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6692 3.9755 2.8535 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0196 1.8396 4.0917 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3566 0.3517 3.4113 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9795 0.0500 3.9983 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 +M END +> +361.6 + +$$$$ + + CDK 0203121541 + + 15 14 0 0 0 0 0 0 0 0999 V2000 + 1.0947 1.0947 1.0947 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8957 1.0947 1.0947 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2673 2.8822 1.0947 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7699 3.0828 1.1320 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1200 4.5549 1.1282 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7612 0.0500 1.0972 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5853 1.9765 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6694 1.5796 0.2087 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8345 3.3638 0.1981 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7890 3.3739 1.9622 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1961 2.5941 2.0312 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2416 2.5790 0.2644 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2073 4.7019 1.1581 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7452 5.0595 0.2277 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6941 5.0763 1.9959 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 +M END +> +368.7 + +$$$$ + + CDK 0203121541 + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 1.6268 1.6268 1.6268 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0617 1.6268 1.6268 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1088 2.8893 1.6268 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3356 4.1013 1.6253 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5896 2.8907 1.6230 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0298 3.2075 1.6101 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0381 0.7093 1.6278 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6517 0.7094 1.6298 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.1421 1.6280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3433 3.5642 0.6189 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2805 3.9885 2.3401 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6332 2.3212 1.8483 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 1 7 1 0 0 0 0 + 2 5 2 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 10 1 0 0 0 0 + 6 11 1 0 0 0 0 + 6 12 1 0 0 0 0 +M END +> +385.7 + +$$$$ + + CDK 0203121541 + + 16 15 0 0 0 0 0 0 0 0999 V2000 + 2.8688 2.8688 2.8688 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3886 2.8688 2.8688 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9298 4.2869 2.8688 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8875 2.0658 4.0677 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9856 2.5383 5.1830 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2341 0.6304 3.7734 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4662 1.8476 2.8411 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4606 3.3559 3.7643 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4762 3.4036 1.9940 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7441 2.3610 1.9382 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0270 4.2945 2.8442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5745 4.8423 1.9909 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6151 4.8429 3.7622 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4564 0.0500 4.6782 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4011 0.1354 3.2566 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1137 0.5782 3.1187 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 14 1 0 0 0 0 + 6 15 1 0 0 0 0 + 6 16 1 0 0 0 0 +M END +> +367.5 + +$$$$ + + CDK 0203121541 + + 16 15 0 0 0 0 0 0 0 0999 V2000 + 1.0730 1.0730 1.0730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5848 1.0730 1.0730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1404 2.4880 1.0730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6590 2.4841 1.0754 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2184 3.8855 1.0517 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4059 4.1166 1.0571 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6757 0.0500 1.0731 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 1.5824 1.9574 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6670 1.5823 0.1888 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9633 0.5190 1.9552 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9633 0.5190 0.1909 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7628 3.0408 0.1893 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7612 3.0429 1.9546 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0400 1.9470 1.9677 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0437 1.9161 0.2041 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4956 4.7182 1.0294 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 16 1 0 0 0 0 +M END +> +376.1 + +$$$$ + + CDK 0203121541 + + 16 15 0 0 0 0 0 0 0 0999 V2000 + 2.0900 2.0900 2.0900 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6021 2.0900 2.0900 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1519 3.5084 2.0900 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6680 3.5008 2.0613 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3295 3.6550 3.0702 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3023 3.3030 0.7111 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6938 1.0666 2.0934 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6847 2.6017 2.9732 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6836 2.5966 1.2045 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9810 1.5400 2.9739 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9798 1.5356 1.2073 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7725 4.0674 1.2116 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7794 4.0547 2.9798 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3968 3.2385 0.7592 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9308 2.3848 0.2372 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0471 4.1419 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 14 1 0 0 0 0 + 6 15 1 0 0 0 0 + 6 16 1 0 0 0 0 +M END +> +375.5 + +$$$$ + + CDK 0203121541 + + 16 15 0 0 0 0 0 0 0 0999 V2000 + 1.0754 1.0754 1.0754 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5853 1.0754 1.0754 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2141 2.4556 1.0754 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7304 2.4400 1.0456 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3717 3.8069 1.0282 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5620 3.4803 1.0979 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6840 0.0500 1.0767 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6687 1.5852 1.9584 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6688 1.5832 0.1912 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9657 0.5251 1.9594 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9645 0.5235 0.1919 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0848 1.8632 1.9237 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0508 1.8589 0.1575 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4662 3.7246 1.0132 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0735 4.3839 0.1433 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0975 4.3974 1.9118 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 2 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 +M END +> +375.1 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 1.0728 1.0728 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5848 1.0728 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1376 2.4891 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6621 2.4643 1.0878 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1055 3.8194 1.0649 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4524 4.0107 1.1048 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7041 5.1905 1.0742 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6753 0.0500 1.0738 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5837 1.9564 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6682 1.5818 0.1879 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9637 0.5179 1.9541 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9598 0.5202 0.1881 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7708 3.0417 0.1844 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7533 3.0482 1.9495 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0469 1.9561 1.9932 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0648 1.9251 0.2087 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1616 3.1720 1.1574 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 17 1 0 0 0 0 +M END +> +379.3 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 2.0198 2.0198 2.0198 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5448 2.0198 2.0198 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0965 3.4533 2.0198 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5393 3.5183 1.5742 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9438 1.3354 3.2183 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0532 0.5538 3.1517 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2699 0.0500 4.2275 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6156 0.9994 2.0411 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6116 2.5525 2.8892 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6336 2.5115 1.1176 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9177 1.4724 1.1177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4728 4.0742 1.3464 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9862 3.9022 3.0273 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9132 4.5499 1.5957 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1939 2.9206 2.2235 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6679 3.1451 0.5490 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6324 0.4300 2.2238 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 17 1 0 0 0 0 +M END +> +366.5 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 2.6193 2.6193 2.6193 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1522 2.6193 2.6193 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6711 4.0604 2.6193 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6707 1.8661 3.8480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5030 1.9346 1.3961 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8178 1.7666 1.1003 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9285 1.1799 0.0500 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2166 1.5978 2.6052 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2339 3.1182 3.5178 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2153 3.1479 1.7458 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7681 4.1061 2.6474 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3372 4.6089 1.7286 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2987 4.6013 3.4991 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7674 1.8774 3.9083 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2875 2.3259 4.7683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3480 0.8166 3.8426 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6277 2.1281 1.7508 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 17 1 0 0 0 0 +M END +> +356 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 1.0801 1.0801 1.0801 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5967 1.0801 1.0801 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0124 2.4412 1.0801 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3483 2.7292 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4720 3.9358 1.0753 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4274 1.6735 1.0634 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8200 2.2592 1.0288 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7022 0.0500 1.0803 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6694 1.5857 1.9640 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6697 1.5857 0.1961 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9991 0.5654 1.9739 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9988 0.5626 0.1877 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3040 1.0334 1.9610 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2712 1.0086 0.1894 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5756 1.4630 1.0264 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9817 2.8715 0.1320 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0149 2.8988 1.8995 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 13 1 0 0 0 0 + 6 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 +M END +> +372.3 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 1.9498 1.9498 1.9498 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4701 1.9498 1.9498 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9993 3.3743 1.9498 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9748 1.1742 3.1744 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3388 0.8303 2.9424 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0182 0.3115 4.0013 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1512 0.0500 3.6786 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5447 0.9300 1.9109 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5441 2.4338 2.8485 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5565 2.4928 1.0804 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8281 1.4369 1.0229 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0966 3.3950 1.9398 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6514 3.9241 1.0655 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6655 3.9327 2.8351 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8740 1.7766 4.0988 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3956 0.2421 3.3201 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5506 0.1733 4.9870 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 17 1 0 0 0 0 +M END +> +371.2 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 3.6725 3.6725 3.6725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1761 3.6725 3.6725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9127 4.6396 3.6725 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6931 2.4109 3.6825 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1202 2.2231 3.6683 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3457 0.8278 4.2420 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6597 2.3215 2.2460 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2805 3.1612 4.5615 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2777 4.6965 3.6675 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2806 3.1534 2.7881 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6129 2.9836 4.3213 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4192 0.6015 4.2741 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9552 0.7377 5.2640 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8610 0.0500 3.6364 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7360 2.1071 2.2319 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1705 1.6071 1.5706 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5172 3.3256 1.8259 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 11 1 0 0 0 0 + 6 12 1 0 0 0 0 + 6 13 1 0 0 0 0 + 6 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 +M END +> +361.6 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 1.0740 1.0740 1.0740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5870 1.0740 1.0740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1268 2.4947 1.0740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6333 2.6156 1.0876 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2652 3.6556 1.0910 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3226 1.4363 1.0963 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7337 1.4756 1.1094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6793 0.0500 1.0740 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6664 1.5823 1.9581 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6672 1.5821 0.1893 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9643 0.5186 1.9550 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9617 0.5240 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7544 3.0413 0.1833 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7361 3.0492 1.9520 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9952 0.4143 1.1143 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1375 1.9643 0.2162 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1196 1.9693 2.0078 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 15 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 +M END +> +375.9 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 2.1089 2.1089 2.1089 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6298 2.1089 2.1089 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1540 3.5356 2.1089 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1440 1.3321 3.3229 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6245 1.0601 3.2404 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5252 1.5282 3.9138 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0057 0.1564 2.3062 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7032 1.0893 2.0768 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7036 2.5964 3.0059 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7144 2.6463 1.2368 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9820 1.5967 1.1801 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2515 3.5602 2.1036 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8058 4.0842 1.2242 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8165 4.0916 2.9944 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9267 1.8942 4.2539 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6084 0.3655 3.4126 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9517 0.0500 2.3268 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 7 17 1 0 0 0 0 +M END +> +448.3 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 2.8972 2.8972 2.8972 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4243 2.8972 2.8972 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9300 4.3399 2.8972 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9287 2.1686 4.1435 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0020 2.1946 1.6708 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1729 2.0069 1.3876 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1234 1.7089 0.7634 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4914 1.8770 2.9004 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5116 3.4086 3.7897 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4907 3.4158 2.0191 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0271 4.3837 2.9092 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5812 4.8861 2.0113 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5670 4.8781 3.7831 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0257 2.1536 4.1869 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5681 2.6632 5.0553 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5772 1.1293 4.1701 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6027 1.2978 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 7 17 1 0 0 0 0 +M END +> +437 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 1.0729 1.0729 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5849 1.0729 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1359 2.4907 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6557 2.4771 1.0840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2989 3.8386 1.0906 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4922 4.0927 1.1001 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4899 4.9228 1.0857 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6755 0.0500 1.0731 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6671 1.5828 1.9568 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6681 1.5824 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9648 0.5159 1.9523 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9586 0.5229 0.1860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7664 3.0389 0.1835 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7514 3.0462 1.9513 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0273 1.9221 1.9701 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0402 1.9237 0.2024 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0225 5.7126 1.0907 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 7 17 1 0 0 0 0 +M END +> +458.9 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 1.0740 1.0740 1.0740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5859 1.0740 1.0740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1185 2.5039 1.0740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5384 2.4164 1.1216 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2658 3.5714 1.1183 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4439 3.2842 1.1641 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6630 4.9433 1.0650 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6795 0.0500 1.0735 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6664 1.5816 1.9585 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6673 1.5821 0.1894 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9684 0.5218 1.9554 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9675 0.5243 0.1908 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8046 3.0487 0.1625 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7470 3.0712 1.9495 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4414 5.7172 1.0864 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0789 5.0816 0.1450 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9946 5.1168 1.9192 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 7 15 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 +M END +> +374.6 + +$$$$ + + CDK 0203121541 + + 17 16 0 0 0 0 0 0 0 0999 V2000 + 1.0731 1.0731 1.0731 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5851 1.0731 1.0731 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1407 2.4880 1.0731 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6604 2.4824 1.1105 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2092 3.8905 1.0957 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9850 3.8141 1.1982 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6756 0.0500 1.0731 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6667 1.5825 1.9569 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5823 0.1885 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9644 0.5180 1.9543 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9629 0.5208 0.1894 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7875 3.0330 0.1745 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7425 3.0517 1.9409 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0195 1.9492 2.0137 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0625 1.9126 0.2488 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9381 4.4312 0.1715 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8387 4.4875 1.9480 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 +M END +> +381.5 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 2.2134 2.2134 2.2134 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7587 2.2134 2.2134 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2226 3.6707 2.2134 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7377 0.8873 2.2026 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2931 1.5168 3.4613 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2946 1.5180 0.9654 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8347 2.7407 3.1121 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8351 2.7569 1.3242 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3188 3.7370 2.2187 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8651 4.2074 1.3244 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8562 4.2103 3.0970 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7922 0.9463 2.1948 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3900 1.5590 3.4986 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9123 1.9891 4.3766 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0017 0.4586 3.4879 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3915 1.5607 0.9294 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0047 0.4594 0.9379 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9145 1.9906 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 6 1 0 0 0 0 + 3 9 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +386.3 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 1.0792 1.0792 1.0792 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5956 1.0792 1.0792 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0231 2.4331 1.0792 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4193 2.5907 1.3438 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7227 4.0683 1.1237 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7863 2.1632 2.7630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6990 0.0500 1.0734 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6687 1.5808 1.9652 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6693 1.5894 0.1976 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0009 0.5514 1.9715 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9998 0.5691 0.1834 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9933 1.9755 0.6073 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7866 4.2694 1.3019 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4910 4.3815 0.0976 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1456 4.7119 1.8011 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8741 2.1463 2.8980 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3653 2.8410 3.5169 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4001 1.1532 2.9793 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +326.1 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 1.0794 1.0794 1.0794 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5962 1.0794 1.0794 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0157 2.4355 1.0794 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4275 2.5831 1.0804 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7218 4.0803 1.0944 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2130 4.3278 1.1194 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6997 0.0500 1.0792 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6684 1.5853 1.9630 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6689 1.5848 0.1954 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9969 0.5576 1.9709 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9966 0.5580 0.1875 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8647 2.0799 1.9660 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8601 2.0980 0.1827 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2702 4.5671 0.2073 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2414 4.5568 1.9718 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4363 5.4022 1.1292 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6831 3.8872 2.0087 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7110 3.8972 0.2403 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +337 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 1.8762 1.8762 1.8762 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4114 1.8762 1.8762 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9245 3.3186 1.8762 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4219 3.3682 1.6670 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9648 1.1237 3.0758 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4339 0.5702 1.5843 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4834 2.2144 2.8560 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4883 2.5747 1.1075 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7732 1.3726 0.9454 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4121 3.9049 1.0878 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6574 3.8087 2.8338 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8196 4.3773 1.8276 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9310 2.6852 2.3687 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7018 3.0597 0.6514 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0592 1.2535 3.1294 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5437 1.4927 4.0205 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7512 0.0500 3.0144 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4922 0.5783 1.6866 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +401.9 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 1.8735 1.8735 1.8735 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4058 1.8735 1.8735 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9228 3.3315 1.8735 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4318 3.4352 1.8543 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9320 1.1274 3.1077 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7824 1.1944 0.6805 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4741 0.8516 1.8392 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4833 2.3541 2.7799 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4692 2.4150 1.0083 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4958 3.8756 1.0080 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5243 3.8377 2.7749 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7646 4.4503 2.1024 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8827 2.7457 2.5883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8538 3.1884 0.8709 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0201 1.2711 3.2179 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4574 1.5005 4.0236 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7353 0.0500 3.0453 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7304 1.1943 0.6618 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 5 1 0 0 0 0 + 2 6 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +375.1 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 2.2051 2.2051 2.2051 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7336 2.2051 2.2051 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2738 3.6361 2.2051 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7793 3.6329 2.4074 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9125 4.3455 0.9092 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7753 0.8787 2.0041 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8086 2.5966 3.1625 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8294 2.8732 1.3960 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1151 1.6551 3.0878 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1180 1.6557 1.3221 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8016 4.1890 3.0546 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1826 4.6537 2.4067 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0551 3.1676 3.3627 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2927 3.0759 1.6119 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1534 5.4145 0.9532 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4472 3.9197 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8329 4.2463 0.7069 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8286 0.9036 1.9845 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +404.4 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 2.2066 2.2066 2.2066 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7333 2.2066 2.2066 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2852 3.6564 2.2066 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8022 3.6660 2.3062 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8439 4.3858 0.9493 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1342 1.4656 3.3445 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8035 1.1972 2.0592 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7957 2.5902 3.1499 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8317 2.8496 1.3937 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1110 1.6734 1.2989 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8629 4.1851 3.0964 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1856 4.6881 2.4169 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1513 3.0840 3.1744 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2714 3.2327 1.4123 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0986 5.4516 0.9956 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3184 3.9700 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7531 4.3004 0.8115 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0439 1.6918 3.5101 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +384.6 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 1.0726 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5847 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1390 2.4878 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6645 2.4620 1.0848 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1074 3.8141 1.0903 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5036 3.9468 1.0877 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6744 0.0500 1.0721 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 1.5825 1.9569 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5834 0.1887 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9639 0.5149 1.9519 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9586 0.5223 0.1860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7733 3.0401 0.1840 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7569 3.0470 1.9500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0501 1.9332 1.9792 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0639 1.9338 0.1962 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6529 5.0291 1.0965 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9626 3.4970 1.9766 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9583 3.5127 0.1889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +343.4 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 2.5434 2.5434 2.5434 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0550 2.5434 2.5434 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6397 3.9639 2.5434 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1167 3.9335 2.9314 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4793 4.4706 1.2123 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4406 5.8688 1.1231 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1490 1.5204 2.5914 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1357 3.0924 3.4028 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1369 3.0089 1.6362 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4271 2.0091 3.4408 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4397 1.9716 1.6752 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0763 4.6033 3.2677 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5638 4.9360 2.9049 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2446 3.5432 3.9493 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7005 3.2961 2.2549 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3359 6.0462 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5817 6.2938 1.6576 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3613 6.3374 1.4915 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +332.1 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 2.5646 2.5646 2.5646 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0969 2.5646 2.5646 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6218 4.0053 2.5646 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6137 1.8180 3.7993 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4543 1.8848 1.3437 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8299 1.7540 1.1074 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1608 1.5438 2.5574 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1800 3.0699 3.4599 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1586 3.0867 1.6881 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7028 4.0284 2.3480 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1224 4.6167 1.8023 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4586 4.4841 3.5374 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7071 1.8774 3.8832 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1894 2.2467 4.7165 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3397 0.7554 3.7709 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8792 1.4834 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3772 2.6930 1.2855 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2670 0.9569 1.7199 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +328.4 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 1.4219 1.4219 1.4219 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9491 1.4219 1.4219 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4827 2.8447 1.4219 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0029 2.8628 1.4577 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5389 4.2771 1.4499 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9972 0.0783 1.4083 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0275 1.9397 2.3191 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0279 1.9585 0.5357 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3318 0.8691 2.3032 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3307 0.8717 0.5383 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1228 3.3862 0.5239 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0799 3.4033 2.2907 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3652 2.3262 2.3571 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4066 2.3006 0.5923 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6360 4.2873 1.4809 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2315 4.8219 0.5472 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1806 4.8514 2.3148 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 0.0960 1.4087 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +410.9 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 1.1108 1.1108 1.1108 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6355 1.1108 1.1108 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1788 2.5498 1.1108 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6960 2.5733 1.0180 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2430 3.9728 1.1761 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0509 0.3769 2.2495 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7089 0.0896 1.1343 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7017 1.6433 1.9796 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7245 1.5998 0.2077 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0121 0.5715 0.2062 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7362 3.1079 0.2630 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8421 3.0779 2.0262 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1218 1.9027 1.7978 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0222 2.1440 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3378 3.9832 1.1020 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8543 4.6464 0.4009 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9754 4.4061 2.1490 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9677 0.5962 2.3857 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +392.1 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 1.3960 1.3960 1.3960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9077 1.3960 1.3960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4896 2.8167 1.3960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9989 2.7786 1.6987 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5908 4.1693 1.7510 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2162 3.3863 0.1272 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0020 0.3721 1.4289 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9895 1.9337 2.2632 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9890 1.8747 0.4959 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2827 0.8586 2.2899 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2853 0.8302 0.5211 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9719 3.4386 2.1686 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1660 2.2590 2.6620 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5199 2.1690 0.9338 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6842 4.1377 1.8326 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3411 4.7396 0.8407 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2118 4.7411 2.6083 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7876 4.1443 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +388.4 + +$$$$ + + CDK 0203121541 + + 19 18 0 0 0 0 0 0 0 0999 V2000 + 0.9581 0.9581 0.9581 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3674 0.9581 0.9581 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8275 2.4147 0.9581 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3450 2.4942 0.9850 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8179 3.9386 0.9891 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3430 4.0036 1.0341 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7105 5.3640 1.0385 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6887 0.0500 0.9664 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7529 0.4209 1.8473 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7484 0.4291 0.0618 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4368 2.9379 0.0624 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3997 2.9539 1.8268 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7374 1.9630 1.8759 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7680 1.9589 0.1109 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4375 4.4662 0.0914 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3853 4.4807 1.8539 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7330 3.4983 1.9402 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7848 3.4899 0.1570 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6571 5.3870 1.0642 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 7 19 1 0 0 0 0 +M END +> +512.2 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 1.0943 1.0943 1.0943 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8953 1.0943 1.0943 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2670 2.8817 1.0943 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7702 3.0784 1.1093 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1259 4.5580 1.1163 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6236 4.7623 1.1455 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7600 0.0500 1.0929 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6677 1.5816 1.9783 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6691 1.5838 0.2108 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8205 3.3663 0.2060 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8019 3.3707 1.9706 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2119 2.5795 1.9958 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2267 2.5844 0.2275 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6934 5.0546 0.2248 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6578 5.0552 1.9893 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8791 5.8294 1.1622 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0782 4.3015 2.0326 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1093 4.3217 0.2647 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 4 13 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +396.6 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 2.2131 2.2131 2.2131 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0142 2.2131 2.2131 S 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4939 4.0132 2.2131 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0176 4.0027 2.2130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9807 4.7212 0.9671 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9807 4.7218 3.4587 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8884 1.1653 2.2144 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7823 2.6988 3.0964 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7826 2.6965 1.3284 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4146 5.0276 2.2161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4179 3.4910 3.0990 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4179 3.4964 1.3240 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3328 5.7620 0.9366 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3301 4.2286 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8826 4.7472 0.9363 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3312 5.7630 3.4891 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8824 4.7465 3.4890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3290 4.2287 4.3761 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 10 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +372 + +$$$$ + + CDK 0203121541 + + 18 17 0 0 0 0 0 0 0 0999 V2000 + 1.0730 1.0730 1.0730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5851 1.0730 1.0730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1406 2.4882 1.0730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6616 2.4829 1.1111 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2073 3.8976 1.0986 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0299 3.8236 1.1705 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6756 0.0500 1.0726 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6663 1.5825 1.9569 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6679 1.5825 0.1884 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9632 0.5183 1.9547 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9631 0.5209 0.1896 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7838 3.0323 0.1752 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7399 3.0520 1.9395 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0164 1.9447 2.0137 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0592 1.9126 0.2469 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8755 4.4323 0.1902 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8073 4.4715 1.9544 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2912 5.1038 1.1519 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 +M END +> +399.8 + +$$$$ + + CDK 0203121541 + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 2.4209 2.4209 2.4209 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8176 2.4209 2.4209 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5154 3.6299 2.4209 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8170 4.8392 2.4256 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4207 4.8394 2.4294 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7227 3.6299 2.4261 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.6296 2.4284 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5838 6.2877 2.4368 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6534 6.2879 2.4269 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1883 3.6304 2.4166 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6537 0.9720 2.4181 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5847 0.9721 2.4168 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 1 0 0 0 0 +M END +> +582.6 + +$$$$ + + CDK 0203121541 + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 2.0889 2.0889 2.0889 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4980 2.0889 2.0889 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3846 3.3089 2.0889 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0891 4.5293 2.0899 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4978 4.5292 2.0899 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2022 3.3089 2.0893 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1650 0.9329 2.0885 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4218 0.9331 2.0886 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.3089 2.0886 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4215 5.6849 2.0906 F 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1655 5.6848 2.0903 F 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5369 3.3092 2.0890 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 3 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 10 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 11 1 0 0 0 0 + 6 12 1 0 0 0 0 +M END +> +353.4 + +$$$$ + + CDK 0203121541 + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 2.4237 2.4237 2.4237 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8128 2.4237 2.4237 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5048 3.6341 2.4237 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8062 4.8431 2.4209 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4137 4.8504 2.4191 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7338 3.6357 2.4207 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1836 3.6392 2.4260 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6487 6.2953 2.4200 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.6304 2.4193 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8678 1.4796 2.4252 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3694 1.4799 2.4249 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8633 5.7983 2.4166 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 9 1 0 0 0 0 +M END +> +486.2 + +$$$$ + + CDK 0203121541 + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 2.4015 2.4015 2.4015 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7938 2.4015 2.4015 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5123 3.5950 2.4015 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8285 4.8063 2.4021 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4378 4.8264 2.4036 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7345 3.6233 2.4034 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6206 0.9336 2.4007 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.6464 2.4049 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8424 1.4590 2.4007 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6076 3.5724 2.4011 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3875 5.7480 2.4016 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8930 5.7767 2.4048 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 8 1 0 0 0 0 +M END +> +446.2 + +$$$$ + + CDK 0203121541 + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 2.4316 2.4316 2.4316 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8246 2.4316 2.4316 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5113 3.6403 2.4316 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8104 4.8440 2.4298 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4204 4.8474 2.4291 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7298 3.6374 2.4302 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5931 0.9756 2.4327 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.6294 2.4299 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3670 1.4797 2.4321 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6063 3.6447 2.4320 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3561 5.7935 2.4296 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8627 5.7903 2.4277 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 8 1 0 0 0 0 +M END +> +453.6 + +$$$$ + + CDK 0203121541 + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 1.8651 1.8651 1.8651 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2589 1.8651 1.8651 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9419 3.0750 1.8651 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2220 4.2682 1.8651 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8286 4.2682 1.8650 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1452 3.0581 1.8650 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0372 0.3975 1.8653 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0508 5.7353 1.8645 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8061 0.9161 1.8652 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0373 3.0964 1.8651 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2809 5.2169 1.8642 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.0368 1.8650 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 11 1 0 0 0 0 + 6 12 1 0 0 0 0 +M END +> +447.2 + +$$$$ + + CDK 0203121541 + + 13 13 0 0 0 0 0 0 0 0999 V2000 + 2.4500 2.4500 2.4500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8403 2.4500 2.4500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5474 3.6467 2.4500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8506 4.8541 2.4501 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4612 4.8902 2.4503 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7656 3.6734 2.4503 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4011 3.7637 2.4504 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7119 6.3034 2.4501 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9033 1.5001 2.4498 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3820 1.4983 2.4499 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6424 3.6485 2.4499 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9267 5.8473 2.4505 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8819 2.4511 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 13 1 0 0 0 0 +M END +> +487 + +$$$$ + + CDK 0203121541 + + 13 13 0 0 0 0 0 0 0 0999 V2000 + 2.4510 2.4510 2.4510 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8405 2.4510 2.4510 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5463 3.6504 2.4510 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8670 4.8633 2.4502 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4750 4.8826 2.4498 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7636 3.6723 2.4503 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4006 3.7643 2.4500 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6666 6.3574 2.4487 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9033 1.5015 2.4513 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3814 1.4989 2.4514 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6410 3.6403 2.4515 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4183 5.8102 2.4500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8824 2.4503 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 13 1 0 0 0 0 +M END +> +447.5 + +$$$$ + + CDK 0203121541 + + 13 13 0 0 0 0 0 0 0 0999 V2000 + 2.4498 2.4498 2.4498 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8386 2.4498 2.4498 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5284 3.6593 2.4498 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8484 4.8764 2.4497 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4613 4.8918 2.4498 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7655 3.6733 2.4498 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4009 3.7622 2.4498 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2154 3.6521 2.4499 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9048 1.4988 2.4497 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3928 1.5049 2.4498 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4132 5.8153 2.4497 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9153 5.8420 2.4498 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8803 2.4498 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 13 1 0 0 0 0 +M END +> +493.1 + +$$$$ + + CDK 0203121541 + + 13 13 0 0 0 0 0 0 0 0999 V2000 + 1.8660 1.8660 1.8660 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2681 1.8660 1.8660 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9397 3.0811 1.8660 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2322 4.2805 1.8666 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8419 4.2707 1.8684 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1458 3.0677 1.8681 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2642 0.6369 1.8644 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8222 0.9208 1.8645 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0346 3.0943 1.8666 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7723 5.2325 1.8660 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2885 5.2156 1.8695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.0681 1.8692 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3249 0.7728 1.8654 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 10 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 11 1 0 0 0 0 + 6 12 1 0 0 0 0 + 7 13 1 0 0 0 0 +M END +> +455 + +$$$$ + + CDK 0203121541 + + 14 14 0 0 0 0 0 0 0 0999 V2000 + 2.4862 2.4862 2.4862 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8853 2.4862 2.4862 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5694 3.6955 2.4862 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8751 4.9016 2.4852 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4860 4.9183 2.4863 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7820 3.7093 2.4883 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8890 1.2488 2.4953 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4123 3.8148 2.4794 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4333 1.5370 2.4858 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6643 3.6967 2.4869 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4264 5.8475 2.4839 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9411 5.8693 2.4852 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9491 1.3761 2.4307 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.9381 2.5424 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 13 1 0 0 0 0 + 8 14 1 0 0 0 0 +M END +> +518.7 + +$$$$ + + CDK 0203121541 + + 14 14 0 0 0 0 0 0 0 0999 V2000 + 1.8757 1.8757 1.8757 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2772 1.8757 1.8757 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9529 3.0898 1.8757 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2607 4.2944 1.8753 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8593 4.2776 1.8755 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1468 3.0717 1.8751 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2764 0.6471 1.8768 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2431 5.4978 1.8760 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8301 0.9300 1.8815 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0481 3.0974 1.8737 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8015 5.2471 1.8749 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.0636 1.8746 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3364 0.7780 1.8746 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3050 5.3537 1.8765 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 8 1 0 0 0 0 + 6 12 1 0 0 0 0 + 7 13 1 0 0 0 0 + 8 14 1 0 0 0 0 +M END +> +549.7 + +$$$$ + + CDK 0203121541 + + 14 14 0 0 0 0 0 0 0 0999 V2000 + 2.4520 2.4520 2.4520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8395 2.4520 2.4520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5257 3.6736 2.4520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8328 4.8917 2.4517 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4450 4.8915 2.4521 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7587 3.6701 2.4522 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3898 3.7494 2.4528 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8944 3.5934 2.4530 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9106 1.4989 2.4519 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3930 1.5063 2.4520 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3742 5.8449 2.4509 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8921 5.8376 2.4518 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8634 2.4524 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2354 4.4789 2.4489 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 13 1 0 0 0 0 + 8 14 1 0 0 0 0 +M END +> +558.2 + +$$$$ + + CDK 0203121541 + + 17 17 0 0 0 0 0 0 0 0999 V2000 + 1.7000 1.7000 1.7000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2205 1.7000 1.7000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7715 3.1166 1.7000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1673 3.9382 2.8194 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6573 3.8909 2.9245 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1570 2.4557 2.9019 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8484 4.6058 3.5734 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3226 0.6595 1.7055 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3216 2.1550 0.7629 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6014 1.1519 0.8168 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5987 1.1476 2.5831 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5362 3.6222 0.7421 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8769 3.0960 1.7684 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2372 4.4604 2.0716 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3008 4.4053 3.8385 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.4464 2.8892 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4512 1.9395 3.8374 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 7 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 +M END +> +428.9 + +$$$$ + + CDK 0203121541 + + 19 18 0 0 0 0 0 0 0 0999 V2000 + 3.4824 3.4824 3.4824 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9892 3.4824 3.4824 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6346 4.5108 3.4824 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6220 2.1053 3.4801 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1353 2.1258 3.4750 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8682 2.0341 4.4389 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6580 2.2279 2.2220 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0789 2.3133 2.0836 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3590 2.4093 0.5966 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0647 2.4675 3.4869 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0906 4.0063 4.3645 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0917 4.0002 2.5962 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2720 1.5539 4.3766 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2410 1.5412 2.6043 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4500 3.2015 2.6287 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5520 1.4175 2.5284 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4401 2.4864 0.4251 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9984 1.5281 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8869 3.2911 0.1438 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 15 1 0 0 0 0 + 8 16 1 0 0 0 0 + 9 17 1 0 0 0 0 + 9 18 1 0 0 0 0 + 9 19 1 0 0 0 0 +M END +> +454 + +$$$$ + + CDK 0203121541 + + 20 19 0 0 0 0 0 0 0 0999 V2000 + 3.5251 3.5251 3.5251 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0425 3.5251 3.5251 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4406 4.8924 3.5251 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7419 5.2713 3.5272 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7825 6.4816 3.5266 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9981 4.3987 3.5303 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1308 4.8259 3.5318 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7886 3.0565 3.5306 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9257 2.1842 3.5365 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3736 0.7725 3.5515 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1512 2.4934 3.5276 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1124 4.0309 4.4080 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1125 4.0254 2.6389 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4411 3.0155 4.4223 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4418 3.0157 2.6282 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5413 2.3751 2.6375 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5488 2.3909 4.4271 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1996 0.0500 3.5667 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7496 0.5810 4.4346 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7607 0.5582 2.6659 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 16 1 0 0 0 0 + 9 17 1 0 0 0 0 + 10 18 1 0 0 0 0 + 10 19 1 0 0 0 0 + 10 20 1 0 0 0 0 +M END +> +458.9 + +$$$$ + + CDK 0203121541 + + 19 19 0 0 0 0 0 0 0 0999 V2000 + 1.6985 1.6985 1.6985 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2185 1.6985 1.6985 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7699 3.1148 1.6985 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2260 3.9602 2.8610 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6903 3.9045 2.8951 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1566 2.4814 2.8836 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8085 3.6213 4.0979 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3214 2.1370 0.7531 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3177 0.6595 1.7229 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5965 1.1380 2.5776 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5971 1.1500 0.8144 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8764 3.0891 1.7340 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5060 3.6168 0.7470 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5646 5.0166 2.7514 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3123 4.4415 3.7868 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2999 4.4565 2.0177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4184 1.9646 3.8293 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.4978 2.8526 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5758 2.7189 4.2823 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 7 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 7 19 1 0 0 0 0 +M END +> +434 + +$$$$ + + CDK 0203121541 + + 19 18 0 0 0 0 0 0 0 0999 V2000 + 3.1943 3.1943 3.1943 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7035 3.1943 3.1943 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3258 4.2384 3.1943 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4008 1.8230 3.1986 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9208 1.9688 3.1910 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9817 1.0652 4.4569 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9697 1.0491 1.9550 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7808 2.1751 3.1929 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8024 3.7134 4.0787 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8026 3.7132 2.3096 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4083 0.9848 3.1954 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2686 2.5076 2.3000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2770 2.5201 4.0709 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4433 0.0692 4.4870 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2883 1.5991 5.3656 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8923 0.9252 4.5010 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4249 0.0500 1.9367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8788 0.9157 1.9214 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2723 1.5679 1.0363 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 1 0 0 0 0 + 5 11 1 0 0 0 0 + 5 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 6 14 1 0 0 0 0 + 6 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 7 18 1 0 0 0 0 + 7 19 1 0 0 0 0 +M END +> +379.4 + +$$$$ + + CDK 0203121541 + + 19 18 0 0 0 0 0 0 0 0999 V2000 + 4.0632 4.0632 4.0632 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5828 4.0632 4.0632 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1269 5.4804 4.0632 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0853 3.2665 5.2687 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1193 3.7358 6.3885 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5144 1.8493 4.9511 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0219 1.0657 6.1382 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6652 3.0400 4.0646 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6566 4.5795 4.9430 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6697 4.5715 3.1735 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9358 3.5527 3.1326 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2240 5.4862 4.0384 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7735 6.0360 3.1847 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8130 6.0383 4.9555 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6465 1.3323 4.4931 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2943 1.8909 4.1643 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3128 0.0500 5.8412 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9005 1.5412 6.5930 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2594 0.9741 6.9224 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 7 18 1 0 0 0 0 + 7 19 1 0 0 0 0 +M END +> +386.5 + +$$$$ + + CDK 0203121541 + + 19 18 0 0 0 0 0 0 0 0999 V2000 + 1.0729 1.0729 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5851 1.0729 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1406 2.4881 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6603 2.4860 1.1098 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2129 3.9007 1.0985 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7200 3.9097 1.1734 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3678 4.9313 1.2012 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6750 0.0500 1.0729 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6667 1.5829 1.9567 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5824 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9635 0.5178 1.9543 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9624 0.5205 0.1893 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7844 3.0332 0.1756 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7418 3.0510 1.9409 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0158 1.9455 2.0104 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0581 1.9167 0.2455 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8840 4.4338 0.1833 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7926 4.4835 1.9433 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2309 2.9327 1.2027 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 17 1 0 0 0 0 + 5 18 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 19 1 0 0 0 0 +M END +> +401.5 + +$$$$ + + CDK 0203121541 + + 19 18 0 0 0 0 0 0 0 0999 V2000 + 3.8303 3.8303 3.8303 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3387 3.8303 3.8303 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9721 4.8686 3.8303 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9796 2.4608 3.8303 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4968 2.4760 3.8147 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0587 1.0629 3.8402 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5700 1.0704 3.8087 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4152 2.8141 3.8319 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4366 4.3517 4.7128 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4375 4.3481 2.9453 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6118 1.9101 4.7205 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5943 1.9019 2.9527 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8620 3.0130 2.9164 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8812 3.0522 4.6801 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7014 0.5304 4.7442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6650 0.4841 2.9808 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9734 0.0500 3.8308 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9538 1.5561 2.9017 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9899 1.6085 4.6690 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 7 18 1 0 0 0 0 + 7 19 1 0 0 0 0 +M END +> +400.9 + +$$$$ + + CDK 0203121541 + + 19 18 0 0 0 0 0 0 0 0999 V2000 + 3.5066 3.5066 3.5066 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0188 3.5066 3.5066 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5733 4.9216 3.5066 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0795 5.3985 4.5037 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4523 5.6662 2.1954 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0862 7.0456 2.1948 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9371 7.7140 0.8462 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1147 2.4815 3.5184 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1016 4.0229 4.3867 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0956 4.0029 2.6166 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3941 2.9438 4.3847 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4047 2.9687 2.6183 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9025 5.0418 1.3968 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3741 5.7418 1.9430 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6260 7.6731 2.9832 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1580 6.9696 2.4645 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3770 8.7193 0.8520 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4332 7.1427 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8821 7.8221 0.5608 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 7 18 1 0 0 0 0 + 7 19 1 0 0 0 0 +M END +> +396.6 + +$$$$ + + CDK 0203121541 + + 19 18 0 0 0 0 0 0 0 0999 V2000 + 3.6705 3.6705 3.6705 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1771 3.6705 3.6705 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8163 4.7052 3.6705 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8111 2.2952 3.7050 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1970 2.2151 3.0666 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9099 0.9564 3.5373 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0937 2.2244 1.5501 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2853 3.0757 4.5088 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2446 4.6791 3.7512 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2908 3.2227 2.7425 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8637 1.9865 4.7693 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1316 1.5657 3.2182 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7968 3.1016 3.3887 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9011 0.8681 3.0732 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0563 0.9576 4.6255 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3451 0.0500 3.2807 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0886 2.2077 1.0860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5420 1.3522 1.1734 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5770 3.1235 1.1903 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 13 1 0 0 0 0 + 6 14 1 0 0 0 0 + 6 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 7 18 1 0 0 0 0 + 7 19 1 0 0 0 0 +M END +> +389.6 + +$$$$ + + CDK 0203121541 + + 19 18 0 0 0 0 0 0 0 0999 V2000 + 3.9979 3.9979 3.9979 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5042 3.9979 3.9979 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1462 5.0296 3.9979 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1484 2.6147 4.0059 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4538 2.5754 3.2308 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3685 2.1705 5.4546 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7690 0.7131 5.5237 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6187 3.5824 3.0548 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6129 3.3734 4.8154 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5715 5.0027 4.1137 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4340 1.9036 3.5205 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9509 1.6027 3.3861 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2892 2.7069 2.1548 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1513 3.3580 3.5575 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1507 2.8012 5.9219 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4462 2.3407 6.0448 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0720 0.4261 6.5376 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9472 0.0500 5.2239 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6147 0.5132 4.8439 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 7 18 1 0 0 0 0 + 7 19 1 0 0 0 0 +M END +> +390.6 + +$$$$ + + CDK 0203121541 + + 20 19 0 0 0 0 0 0 0 0999 V2000 + 5.1910 5.1910 5.1910 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6937 5.1910 5.1910 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4338 6.1557 5.1910 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2265 3.9358 5.1913 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6478 3.7978 5.1918 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9325 2.2983 5.2048 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4321 2.0481 5.2136 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7426 0.5687 5.2441 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7614 4.1804 5.1927 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8124 5.7185 6.0764 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8130 5.7152 4.3035 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0735 4.2856 4.2941 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0765 4.3001 6.0803 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4626 1.8217 6.0884 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4721 1.8094 4.3229 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8976 2.5144 4.3224 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8939 2.5503 6.0871 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.8253 0.3895 5.2471 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3257 0.0856 6.1379 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3301 0.0500 4.3685 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 14 1 0 0 0 0 + 6 15 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 8 19 1 0 0 0 0 + 8 20 1 0 0 0 0 +M END +> +399.1 + +$$$$ + + CDK 0203121541 + + 20 19 0 0 0 0 0 0 0 0999 V2000 + 3.6523 3.6523 3.6523 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1563 3.6523 3.6523 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8927 4.6194 3.6523 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6718 2.3895 3.6592 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0963 2.1981 3.6615 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3272 0.8415 4.3213 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6376 2.2021 2.2240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1470 2.1026 2.2307 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2605 3.1472 4.5448 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2570 4.6760 3.6419 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2595 3.1278 2.7715 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6014 2.9968 4.2588 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3829 0.5534 4.1833 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1142 0.8647 5.3965 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7082 0.0500 3.8785 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2027 1.3572 1.6539 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3182 3.1217 1.6962 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5444 1.9706 1.2172 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6131 3.0031 2.6515 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4755 1.2443 2.8409 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 12 1 0 0 0 0 + 6 13 1 0 0 0 0 + 6 14 1 0 0 0 0 + 6 15 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 8 19 1 0 0 0 0 + 8 20 1 0 0 0 0 +M END +> +385.1 + +$$$$ + + CDK 0203121541 + + 20 19 0 0 0 0 0 0 0 0999 V2000 + 3.5527 3.5527 3.5527 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0597 3.5527 3.5527 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7786 4.5331 3.5527 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5655 2.2903 3.5530 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9856 2.0054 3.5544 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0176 0.4687 3.5506 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6796 2.5315 2.2963 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6750 2.5255 4.8173 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1209 2.5431 3.5537 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1762 4.0803 4.4387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1760 4.0778 2.6654 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0542 0.1076 3.5557 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5131 0.0500 4.4316 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5268 0.0547 2.6596 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6910 2.1114 2.2178 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1337 2.2511 1.3861 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7810 3.6246 2.3020 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6955 2.1257 4.8837 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7544 3.6205 4.8283 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1400 2.2195 5.7256 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 12 1 0 0 0 0 + 6 13 1 0 0 0 0 + 6 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 8 19 1 0 0 0 0 + 8 20 1 0 0 0 0 +M END +> +369.1 + +$$$$ + + CDK 0203121541 + + 20 19 0 0 0 0 0 0 0 0999 V2000 + 1.6968 1.6968 1.6968 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2096 1.6968 1.6968 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7485 3.1176 1.6968 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2557 3.2405 1.7277 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8815 4.2799 1.8296 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9408 2.0686 1.6236 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3699 2.1091 1.6399 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8392 0.6721 1.5171 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3024 0.6727 1.6966 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2892 2.2050 2.5810 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2902 2.2049 0.8121 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5870 1.1441 2.5795 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5850 1.1443 0.8130 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3872 3.6595 0.7984 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3449 3.6768 2.5658 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7327 2.7291 0.7982 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7218 2.5739 2.5800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9357 0.6347 1.5169 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4846 0.0500 2.3496 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4913 0.2009 0.5885 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 8 19 1 0 0 0 0 + 8 20 1 0 0 0 0 +M END +> +394.6 + +$$$$ + + CDK 0203121541 + + 20 19 0 0 0 0 0 0 0 0999 V2000 + 3.2090 3.2090 3.2090 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7212 3.2090 3.2090 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3067 4.6228 3.2090 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8281 4.5792 3.3715 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4110 5.9411 3.6758 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9212 5.3692 1.9439 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2661 6.3917 1.8421 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3518 4.8468 0.7708 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8159 2.1851 3.2486 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8025 3.7512 4.0734 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8005 3.6818 2.3058 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0911 2.6702 4.1048 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1055 2.6390 2.3397 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8717 5.1894 4.0719 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0816 3.8758 4.1904 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2977 4.1539 2.4621 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5000 5.8845 3.7997 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2099 6.6596 2.8700 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9960 6.3643 4.6005 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0517 5.3920 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 5 18 1 0 0 0 0 + 5 19 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 20 1 0 0 0 0 +M END +> +466.9 + +$$$$ + + CDK 0203121541 + + 20 19 0 0 0 0 0 0 0 0999 V2000 + 3.0010 3.0010 3.0010 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5166 3.0010 3.0010 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9460 4.3582 3.0010 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2020 4.6616 2.5572 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3739 5.8532 2.7026 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1720 3.6367 1.9892 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0039 4.2376 0.8707 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0577 3.1142 3.1090 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6229 1.9710 2.9979 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5913 3.5026 3.8876 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5900 3.5107 2.1197 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9260 2.5149 3.9069 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9226 2.4538 2.1219 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5731 2.7827 1.5706 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6936 3.4909 0.4559 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3718 4.5995 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6066 5.0861 1.2221 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7508 2.3500 2.7339 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6615 3.9148 3.5566 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4620 2.6571 3.9107 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 6 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 8 19 1 0 0 0 0 + 8 20 1 0 0 0 0 +M END +> +383 + +$$$$ + + CDK 0203121541 + + 20 19 0 0 0 0 0 0 0 0999 V2000 + 1.0729 1.0729 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5849 1.0729 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1409 2.4879 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6616 2.4807 1.1100 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2059 3.8996 1.0964 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7069 4.0002 1.1578 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3818 5.0164 1.1736 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4160 2.8487 1.2008 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6753 0.0500 1.0724 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6670 1.5821 1.9572 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5830 0.1889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9635 0.5182 1.9545 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9624 0.5205 0.1894 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7857 3.0325 0.1748 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7418 3.0509 1.9407 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0149 1.9419 2.0118 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0574 1.9100 0.2463 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8686 4.4296 0.1819 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7919 4.4771 1.9486 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3460 3.0521 1.2372 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 16 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 18 1 0 0 0 0 + 5 19 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 20 1 0 0 0 0 +M END +> +478.8 + +$$$$ + + CDK 0203121541 + + 20 19 0 0 0 0 0 0 0 0999 V2000 + 4.6160 4.6160 4.6160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1183 4.6160 4.6160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8617 5.5779 4.6160 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6435 3.3566 4.6131 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0646 3.2131 4.6162 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3620 1.7062 4.6474 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7998 1.4746 4.2103 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1325 1.1287 6.0340 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2241 4.0989 5.5016 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2212 5.6400 4.6183 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2242 4.1027 3.7281 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4799 3.6808 3.7031 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5020 3.7287 5.4926 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6855 1.1831 3.9271 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0531 0.4067 4.2371 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9732 1.8285 3.1854 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5109 1.9967 4.8648 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3366 0.0500 6.0523 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7846 1.5994 6.7825 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0955 1.2739 6.3625 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 12 1 0 0 0 0 + 5 13 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 6 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 8 19 1 0 0 0 0 + 8 20 1 0 0 0 0 +M END +> +389.8 + +$$$$ + + CDK 0203121541 + + 20 19 0 0 0 0 0 0 0 0999 V2000 + 1.0728 1.0728 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5850 1.0728 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1405 2.4881 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6605 2.4811 1.1082 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1973 3.9085 1.0934 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6193 3.8207 1.1641 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2959 5.0015 1.1603 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4835 4.7980 1.2233 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6749 0.0500 1.0730 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6668 1.5824 1.9568 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 1.5822 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9641 0.5184 1.9543 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9619 0.5209 0.1888 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7853 3.0323 0.1746 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7435 3.0504 1.9418 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0203 1.9439 2.0087 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0590 1.9132 0.2435 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9045 4.4398 0.1677 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8176 4.4918 1.9540 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7810 5.9715 1.1059 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 16 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 18 1 0 0 0 0 + 5 19 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 20 1 0 0 0 0 +M END +> +405.5 + +$$$$ + + CDK 0203121541 + + 20 19 0 0 0 0 0 0 0 0999 V2000 + 1.0741 1.0741 1.0741 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5857 1.0741 1.0741 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1185 2.5046 1.0741 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5383 2.4148 1.0915 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2769 3.5652 1.0970 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4493 3.2543 1.1112 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6688 4.9465 1.0856 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7074 6.0437 1.1211 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6795 0.0500 1.0738 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6666 1.5814 1.9589 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6670 1.5822 0.1896 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9705 0.5208 1.9536 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9634 0.5267 0.1878 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7859 3.0551 0.1726 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7606 3.0643 1.9603 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0358 5.0475 0.1802 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9823 5.0427 1.9516 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2295 7.0317 1.1196 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3352 5.9804 2.0197 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3777 5.9981 0.2528 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 8 19 1 0 0 0 0 + 8 20 1 0 0 0 0 +M END +> +395.6 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 1.0797 1.0797 1.0797 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5968 1.0797 1.0797 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0153 2.4364 1.0797 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4268 2.5843 1.0874 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7175 4.0825 1.0727 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2160 4.3337 1.1207 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5281 5.8129 1.0906 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7004 0.0500 1.0790 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6692 1.5849 1.9637 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6692 1.5853 0.1959 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9977 0.5580 1.9712 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9973 0.5586 0.1877 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8570 2.1010 1.9873 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8676 2.0827 0.2026 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2835 4.5498 0.1662 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2212 4.5807 1.9296 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6467 3.8745 2.0330 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7115 3.8252 0.2695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6101 5.9924 1.1307 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1503 6.2878 0.1754 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0756 6.3395 1.9416 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 7 19 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +365.3 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 1.5811 1.5811 1.5811 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0983 1.5811 1.5811 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5214 2.9354 1.5811 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8739 3.1566 2.0177 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0620 4.6741 1.9106 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0728 2.7077 3.4707 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8858 2.4479 1.1095 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2016 0.5516 1.5783 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1702 2.0856 2.4653 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1712 2.0883 0.6979 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5024 1.0413 2.4665 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5004 1.0822 0.6786 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0581 4.9632 2.2698 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9665 5.0211 0.8734 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3216 5.2191 2.5111 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1241 2.7989 3.7698 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4736 3.3097 4.1653 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7712 1.6553 3.6010 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9081 2.7756 1.3393 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8552 1.3573 1.2363 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6974 2.6652 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 7 19 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +346 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 3.1641 3.1641 3.1641 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6866 3.1641 3.1641 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2464 4.5842 3.1641 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0940 2.4490 4.3343 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4783 2.0883 4.3135 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8207 1.6190 5.7212 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7536 0.9959 3.2833 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7587 2.1444 3.1464 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7540 3.6650 4.0514 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7840 3.6912 2.2799 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0701 2.6083 2.2651 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3384 4.5647 3.3163 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0420 5.0875 2.2120 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8137 5.1963 3.9657 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0694 3.0093 4.0570 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8810 1.3427 5.7823 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6378 2.4041 6.4660 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2299 0.7414 6.0157 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8286 0.8010 3.1946 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2638 0.0500 3.5482 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3745 1.2975 2.2928 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 7 19 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +341.5 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 2.1692 2.1692 2.1692 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6819 2.1692 2.1692 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2618 3.5885 2.1692 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7759 3.5184 2.3837 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3801 4.8469 2.7778 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8939 4.2866 0.8475 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8350 5.6774 1.0678 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7680 1.1546 2.0573 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7612 2.5874 3.0985 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7801 2.7784 1.3358 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0539 1.6138 3.0533 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0601 1.6134 1.2877 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8053 4.1530 3.0203 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9966 2.7715 3.1740 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2685 3.1324 1.4684 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4557 4.7477 2.9745 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2587 5.6013 1.9891 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9152 5.2499 3.6876 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6231 4.0425 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8947 3.9334 0.5022 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7475 6.0794 0.2145 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 5 18 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 19 1 0 0 0 0 + 6 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +419.7 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5846 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1404 2.4877 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6608 2.4852 1.0841 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2127 3.9012 1.0903 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7392 3.8802 1.1133 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1876 5.2160 1.1197 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6740 0.0500 1.0726 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 1.5828 1.9566 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6677 1.5827 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9645 0.5171 1.9529 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9592 0.5218 0.1867 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7731 3.0372 0.1824 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7553 3.0459 1.9494 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0321 1.9290 1.9684 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0421 1.9339 0.2009 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8540 4.4537 0.1987 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8238 4.4606 1.9646 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1113 3.3445 2.0097 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1371 3.3451 0.2278 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1342 5.1810 1.1346 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 17 1 0 0 0 0 + 5 18 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 19 1 0 0 0 0 + 6 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +430.6 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 1.0876 1.0876 1.0876 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6123 1.0876 1.0876 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1557 2.5263 1.0876 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6745 2.5437 1.0153 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2281 3.9475 1.1892 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7389 3.9577 1.1326 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0269 0.3539 2.2270 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6850 0.0668 1.1155 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6784 1.6238 1.9541 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7012 1.5728 0.1824 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9901 0.5476 0.1838 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7256 3.0789 0.2299 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8086 3.0613 1.9949 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0871 1.8677 1.7985 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0143 2.1182 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8139 4.6114 0.4046 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8828 4.3737 2.1523 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1345 4.9735 1.2595 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1782 3.3331 1.9218 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1109 3.5777 0.1717 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9396 0.5851 2.3714 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 6 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +413 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 1.8756 1.8756 1.8756 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4118 1.8756 1.8756 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9219 3.3184 1.8756 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4268 3.3739 1.6616 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9664 4.7735 1.8437 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9627 1.1229 3.0764 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4346 0.5659 1.5987 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4835 2.2232 2.8523 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4877 2.5661 1.0999 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7735 1.3715 0.9451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4090 3.9053 1.0871 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6571 3.8106 2.8336 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9173 2.6673 2.3698 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6775 2.9981 0.6498 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0508 4.8062 1.6780 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5043 5.4791 1.1407 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7785 5.1529 2.8571 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0575 1.2465 3.1310 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5433 1.4953 4.0206 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7437 0.0500 3.0171 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4910 0.5790 1.6812 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 6 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +421.2 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 1.9062 1.9062 1.9062 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4331 1.9062 1.9062 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9645 3.3518 1.9062 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4114 3.4755 1.4215 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6661 4.8828 0.9014 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4100 3.1504 2.5216 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8308 1.1722 3.0504 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5033 0.8890 1.9972 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4997 2.4944 2.7395 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5159 2.3337 0.9738 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8097 1.3627 1.0039 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3119 3.9549 1.2421 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8591 3.8025 2.9139 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5671 2.7592 0.5764 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7042 5.0014 0.5636 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0156 5.1230 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4839 5.6379 1.6779 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4430 3.2600 2.1654 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2899 3.8138 3.3888 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2998 2.1157 2.8810 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7658 1.3169 3.1529 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 6 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +404.9 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 1.0729 1.0729 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5851 1.0729 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1412 2.4878 1.0729 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6607 2.4829 1.1125 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1987 3.9104 1.0945 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6163 3.8229 1.1783 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2559 5.0706 1.1664 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6746 0.0500 1.0722 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6669 1.5823 1.9573 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5830 0.1888 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9636 0.5177 1.9543 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9628 0.5204 0.1895 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7872 3.0316 0.1740 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7406 3.0512 1.9396 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0164 1.9481 2.0161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0621 1.9109 0.2520 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9067 4.4380 0.1651 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8055 4.4993 1.9467 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3149 4.8098 1.2385 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0677 5.6242 0.2384 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9645 5.6919 2.0224 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 17 1 0 0 0 0 + 5 18 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 19 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +372 + +$$$$ + + CDK 0203121541 + + 22 21 0 0 0 0 0 0 0 0999 V2000 + 0.9577 0.9577 0.9577 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3672 0.9577 0.9577 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8277 2.4139 0.9577 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3444 2.4929 1.0177 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8209 3.9363 0.9999 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3356 4.0159 1.0963 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7992 5.4707 1.0599 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2005 5.4713 1.2126 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6882 0.0500 0.9817 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7547 0.4216 1.8470 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7455 0.4255 0.0621 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4554 2.9324 0.0515 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3829 2.9576 1.8153 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7163 1.9835 1.9297 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7868 1.9387 0.1653 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4737 4.4374 0.0738 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3569 4.4984 1.8356 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6862 3.5247 2.0262 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8003 3.4461 0.2668 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5191 5.9499 0.1008 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3254 6.0574 1.8720 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4732 6.3779 1.1837 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 + 8 22 1 0 0 0 0 +M END +> +516.2 + +$$$$ + + CDK 0203121541 + + 22 21 0 0 0 0 0 0 0 0999 V2000 + 2.0645 2.0645 2.0645 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5986 2.0645 2.0645 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0990 3.5296 2.0645 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6169 3.6860 1.8762 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9372 4.9355 1.0553 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1140 1.3050 3.2924 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9793 1.3896 0.8700 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1959 3.7478 3.1680 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6646 1.0425 2.1019 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6772 2.6068 2.9366 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6567 2.5423 1.1637 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5755 4.0788 1.2547 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7729 4.0160 3.0066 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0315 2.7849 1.3476 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0200 5.0753 0.9329 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5021 4.8663 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5398 5.8444 1.5262 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2117 1.2689 3.3189 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7787 1.7906 4.2178 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7491 0.2696 3.3060 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9256 1.4759 0.8136 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1159 3.9417 3.0478 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 6 20 1 0 0 0 0 + 7 21 1 0 0 0 0 + 8 22 1 0 0 0 0 +M END +> +470.6 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 1.0745 1.0745 1.0745 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5877 1.0745 1.0745 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1306 2.4901 1.0745 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9554 2.4398 1.1285 S 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3557 4.2199 1.0779 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8598 4.3984 1.1545 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2331 5.8645 1.1105 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6809 0.0500 1.0746 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5832 1.9587 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6681 1.5828 0.1900 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9671 0.5215 1.9574 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9640 0.5228 0.1895 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7910 3.0359 0.1745 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7398 3.0558 1.9408 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9582 4.6762 0.1520 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8595 4.7490 1.9130 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2505 3.9352 2.0830 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3495 3.8570 0.3200 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3210 5.9965 1.1692 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8941 6.3422 0.1816 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7887 6.4226 1.9455 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 7 19 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +416 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 1.1384 1.1384 1.1384 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6448 1.1384 1.1384 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2810 2.8523 1.1384 S 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9546 2.6688 1.9380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4838 4.0872 2.0969 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8305 1.9953 3.2979 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8867 1.8606 1.0453 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7504 0.1108 1.1277 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7281 1.6361 2.0274 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7304 1.6516 0.2569 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0437 0.5999 2.0260 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0332 0.5994 0.2553 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4740 4.0804 2.5729 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5865 4.5901 1.1257 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8196 4.6995 2.7221 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8180 1.8027 3.7376 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2636 2.6131 4.0069 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3087 1.0261 3.2118 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8930 1.7952 1.4830 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5220 0.8325 0.9107 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9877 2.3138 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 4 7 1 0 0 0 0 + 5 13 1 0 0 0 0 + 5 14 1 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 7 19 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +393.6 + +$$$$ + + CDK 0203121541 + + 21 20 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5845 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1413 2.4869 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6614 2.4822 1.0872 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2146 3.8993 1.0933 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7306 3.8878 1.1218 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3330 5.6106 1.1309 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6743 0.0500 1.0719 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5821 1.9568 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5833 0.1888 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9642 0.5165 1.9527 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9605 0.5220 0.1870 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7734 3.0373 0.1830 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7548 3.0469 1.9481 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0289 1.9260 1.9732 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0457 1.9266 0.2079 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8550 4.4508 0.2007 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8214 4.4555 1.9689 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0943 3.3429 2.0121 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1280 3.3402 0.2479 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6193 5.3808 1.1524 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 17 1 0 0 0 0 + 5 18 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 19 1 0 0 0 0 + 6 20 1 0 0 0 0 + 7 21 1 0 0 0 0 +M END +> +425.8 + +$$$$ + + CDK 0203121541 + + 22 21 0 0 0 0 0 0 0 0999 V2000 + 3.5223 3.5223 3.5223 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0357 3.5223 3.5223 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5746 4.9399 3.5223 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4063 4.8372 3.5480 S 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1356 6.7194 3.6607 S 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3132 7.3619 1.9509 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8997 8.7580 2.0429 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0923 9.3516 0.6639 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1290 2.4977 3.5226 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1156 4.0307 4.4066 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1159 4.0298 2.6373 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4142 2.9720 4.4074 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4154 2.9694 2.6396 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2255 5.4924 2.6315 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2032 5.5013 4.3988 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9659 6.7005 1.3527 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3357 7.3813 1.4358 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2364 9.4106 2.6462 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8676 8.7321 2.5833 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5278 10.3571 0.7246 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7663 8.7393 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1422 9.4367 0.1200 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 18 1 0 0 0 0 + 7 19 1 0 0 0 0 + 8 20 1 0 0 0 0 + 8 21 1 0 0 0 0 + 8 22 1 0 0 0 0 +M END +> +469 + +$$$$ + + CDK 0203121541 + + 15 15 0 0 0 0 0 0 0 0999 V2000 + 3.0147 3.0147 3.0147 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4061 3.0147 3.0147 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1083 4.2137 3.0147 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4165 5.4218 3.0176 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0283 5.4291 3.0185 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3195 4.2231 3.0165 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8354 4.2806 3.0165 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.7080 3.0204 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2534 5.1576 4.4387 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2550 5.1500 1.5890 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4712 2.0614 3.0135 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9470 2.0623 3.0134 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2034 4.2092 3.0146 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9661 6.3691 3.0187 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4765 6.3772 3.0210 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 15 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 10 1 0 0 0 0 +M END +> +486.7 + +$$$$ + + CDK 0203121541 + + 15 15 0 0 0 0 0 0 0 0999 V2000 + 2.2170 2.2170 2.2170 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6128 2.2170 2.2170 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3067 3.4220 2.2170 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6115 4.6267 2.2171 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2198 4.6295 2.2151 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5220 3.4282 2.2148 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4723 0.9341 2.2170 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3996 0.8510 3.6276 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4284 0.8370 0.7850 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1638 1.2693 2.2176 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4017 3.4206 2.2172 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1601 5.5745 2.2180 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6722 5.5778 2.2141 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4253 3.4183 2.2134 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1482 0.0500 2.2280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 13 1 0 0 0 0 + 6 14 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 15 1 0 0 0 0 +M END +> +487 + +$$$$ + + CDK 0203121541 + + 15 15 0 0 0 0 0 0 0 0999 V2000 + 3.8088 3.8088 3.8088 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1990 3.8088 3.8088 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8989 5.0105 3.8088 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2072 6.2175 3.8086 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8169 6.2279 3.8091 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1120 5.0211 3.8092 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6317 4.9874 3.8085 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8940 4.0151 3.8020 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9902 6.1818 3.8159 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2582 2.8596 3.8085 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7424 2.8579 3.8087 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9940 5.0068 3.8088 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7582 7.1640 3.8082 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2846 7.1864 3.8092 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 6.0298 3.8148 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 14 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 9 15 1 0 0 0 0 +M END +> +522.4 + +$$$$ + + CDK 0203121541 + + 15 15 0 0 0 0 0 0 0 0999 V2000 + 2.4494 2.4494 2.4494 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8367 2.4494 2.4494 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5474 3.6521 2.4494 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8556 4.8670 2.4493 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4689 4.8895 2.4493 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7669 3.6752 2.4492 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4057 3.7669 2.4491 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0280 3.6057 2.4486 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7345 4.5892 2.4486 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9017 1.5000 2.4496 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3774 1.4950 2.4494 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4170 5.8099 2.4491 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9273 5.8424 2.4494 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8867 2.4491 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4848 2.6011 2.4479 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 13 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 14 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 15 1 0 0 0 0 +M END +> +583.2 + +$$$$ + + CDK 0203121541 + + 15 15 0 0 0 0 0 0 0 0999 V2000 + 2.4515 2.4515 2.4515 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8526 2.4515 2.4515 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5539 3.6430 2.4515 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8696 4.8633 2.4511 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4877 4.8965 2.4507 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7683 3.6844 2.4512 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7232 1.1730 2.4519 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5041 1.1279 2.4552 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4177 3.7850 2.4512 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3891 1.4952 2.4520 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6485 3.6356 2.4528 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4368 5.8005 2.4500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9493 5.8514 2.4504 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3118 0.2422 2.4486 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8944 2.4526 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 13 1 0 0 0 0 + 6 9 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 14 1 0 0 0 0 + 9 15 1 0 0 0 0 +M END +> +469.7 + +$$$$ + + CDK 0203121541 + + 15 15 0 0 0 0 0 0 0 0999 V2000 + 3.0087 3.0087 3.0087 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4005 3.0087 3.0087 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1023 4.2082 3.0087 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4082 5.4149 3.0081 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0199 5.4195 3.0077 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3102 4.2141 3.0078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8238 4.2870 3.0070 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.6867 3.0061 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4653 2.0554 3.0090 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9420 2.0570 3.0090 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1970 4.2051 3.0091 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9571 6.3622 3.0080 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4753 6.3704 3.0070 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4663 4.8349 3.8984 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4671 4.8355 2.1155 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 13 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 +M END +> +452.6 + +$$$$ + + CDK 0203121541 + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 2.4980 2.4980 2.4980 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8968 2.4980 2.4980 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5981 3.6960 2.4980 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9098 4.9057 2.4990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5210 4.9103 2.4986 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8130 3.7112 2.4975 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8091 1.1634 2.4893 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4119 1.3209 2.5716 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4401 1.5464 2.4978 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6928 3.6886 2.4981 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4625 5.8506 2.4997 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9772 5.8606 2.4987 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7171 3.7336 2.4962 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0746 0.6199 1.5598 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1720 0.5572 3.3444 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 0.4455 2.5708 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 13 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 +M END +> +477.9 + +$$$$ + + CDK 0203121541 + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 2.4447 2.4447 2.4447 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8346 2.4447 2.4447 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5426 3.6396 2.4447 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8645 4.8618 2.4422 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4717 4.8842 2.4447 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7693 3.6717 2.4455 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6312 6.1345 2.4253 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4039 3.7698 2.4471 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8953 1.4968 2.4452 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3745 1.4921 2.4461 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6379 3.6270 2.4474 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9300 5.8380 2.4462 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0391 6.9769 2.8071 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5418 6.0654 3.0353 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9374 6.3826 1.3998 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8892 2.4470 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 7 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 +M END +> +475.4 + +$$$$ + + CDK 0203121541 + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 2.4375 2.4375 2.4375 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8266 2.4375 2.4375 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5259 3.6389 2.4375 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8393 4.8484 2.4372 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4453 4.8817 2.4368 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7489 3.6578 2.4372 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3811 3.7232 2.4375 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7235 6.1793 2.4354 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8919 1.4868 2.4378 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3693 1.4867 2.4377 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6204 3.6342 2.4375 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4010 5.7899 2.4372 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8338 2.4388 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0717 6.2678 3.3153 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4127 7.0343 2.4447 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0881 6.2739 1.5443 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 13 1 0 0 0 0 + 8 14 1 0 0 0 0 + 8 15 1 0 0 0 0 + 8 16 1 0 0 0 0 +M END +> +464.2 + +$$$$ + + CDK 0203121541 + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 2.4496 2.4496 2.4496 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8388 2.4496 2.4496 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5478 3.6509 2.4496 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8535 4.8636 2.4502 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4665 4.8855 2.4492 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7655 3.6714 2.4485 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0334 3.6451 2.4348 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3996 3.7628 2.4489 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9041 1.4992 2.4506 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3798 1.4966 2.4512 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4111 5.8071 2.4521 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9250 5.8379 2.4498 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4476 4.4909 2.9996 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4444 2.7240 2.8690 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4078 3.7207 1.4046 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8805 2.4484 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 +M END +> +475.1 + +$$$$ + + CDK 0203121541 + + 23 22 0 0 0 0 0 0 0 0999 V2000 + 1.1936 1.1936 1.1936 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7097 1.1936 1.1936 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1235 2.5561 1.1936 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4549 2.8485 1.1298 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5886 4.0524 1.1435 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5288 1.7896 1.0463 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9195 2.3572 1.2523 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7441 2.5805 0.3904 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2094 2.5737 2.5639 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4669 3.1732 2.8907 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4962 3.3070 4.4005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8163 0.1633 1.1951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7833 1.7004 2.0771 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7827 1.6978 0.3089 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1106 0.6810 2.0897 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1139 0.6761 0.3022 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3334 0.9900 1.7918 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4759 1.3025 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2909 2.5357 2.5185 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5469 4.1566 2.3902 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4387 3.7724 4.7160 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6759 3.9331 4.7756 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4220 2.3336 4.9028 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 2 16 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 19 1 0 0 0 0 + 10 20 1 0 0 0 0 + 11 21 1 0 0 0 0 + 11 22 1 0 0 0 0 + 11 23 1 0 0 0 0 +M END +> +472 + +$$$$ + + CDK 0203121541 + + 22 21 0 0 0 0 0 0 0 0999 V2000 + 2.3883 2.3883 2.3883 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9070 2.3883 2.3883 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4623 3.8041 2.3883 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4564 1.6289 3.6007 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3112 0.7781 3.4539 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8997 2.0010 4.9746 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7265 0.7836 5.8642 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8099 3.0277 5.6279 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9893 1.3703 2.2951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9874 2.8136 3.3238 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9901 2.9802 1.5546 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2520 1.8796 1.4535 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5404 3.8082 2.1816 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9756 4.4229 1.6240 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3184 4.2989 3.3643 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8902 2.4690 4.8128 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3047 1.0679 6.8370 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0488 0.0500 5.4100 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6829 0.2778 6.0534 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4124 3.3438 6.6008 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8194 2.6303 5.7968 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9006 3.9256 4.9940 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 6 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 7 18 1 0 0 0 0 + 7 19 1 0 0 0 0 + 8 20 1 0 0 0 0 + 8 21 1 0 0 0 0 + 8 22 1 0 0 0 0 +M END +> +397.6 + +$$$$ + + CDK 0203121541 + + 22 21 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5846 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1396 2.4878 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6598 2.4853 1.0863 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2137 3.9008 1.0920 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7321 3.8975 1.1216 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2924 5.2983 1.1279 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4801 5.5286 1.1392 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6742 0.0500 1.0727 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5825 1.9566 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5825 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9646 0.5176 1.9532 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9604 0.5218 0.1872 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7714 3.0366 0.1821 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7520 3.0464 1.9482 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0299 1.9299 1.9717 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0440 1.9315 0.2059 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8543 4.4508 0.1988 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8177 4.4590 1.9644 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0973 3.3453 2.0117 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1304 3.3384 0.2502 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5702 6.1319 1.1227 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 16 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 18 1 0 0 0 0 + 5 19 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 20 1 0 0 0 0 + 6 21 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 22 1 0 0 0 0 +M END +> +426 + +$$$$ + + CDK 0203121541 + + 22 21 0 0 0 0 0 0 0 0999 V2000 + 1.0848 1.0848 1.0848 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5923 1.0848 1.0848 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2235 2.4598 1.0848 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7407 2.4535 1.1224 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2922 3.8706 1.1133 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8109 3.8709 1.1860 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3658 5.2773 1.1881 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2307 0.0500 1.0839 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6598 0.0727 1.0868 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7009 1.6096 1.9693 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7022 1.6051 0.1970 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8659 3.0011 0.1850 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8221 3.0239 1.9515 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0955 1.9121 2.0223 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1396 1.8851 0.2584 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9597 4.4026 0.1991 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8744 4.4483 1.9625 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1439 3.3306 2.0947 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2280 3.2992 0.3329 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4618 5.2725 1.2451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0871 5.8246 0.2777 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9950 5.8580 2.0435 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 + 7 22 1 0 0 0 0 +M END +> +424 + +$$$$ + + CDK 0203121541 + + 22 21 0 0 0 0 0 0 0 0999 V2000 + 1.0738 1.0738 1.0738 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5863 1.0738 1.0738 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1344 2.4896 1.0738 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6471 2.5751 1.1275 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1836 3.9909 1.0694 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6939 4.0957 1.1806 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1502 5.5351 1.0955 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3626 1.5963 1.2101 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6782 0.0500 1.0737 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6659 1.5816 1.9582 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6668 1.5819 0.1892 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9656 0.5194 1.9550 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9658 0.5226 0.1908 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7856 3.0305 0.1707 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7274 3.0534 1.9379 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8400 4.4512 0.1204 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7021 4.5795 1.8770 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0338 3.6436 2.1334 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1740 3.4970 0.3814 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2417 5.6096 1.1834 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8661 5.9964 0.1401 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7142 6.1480 1.8959 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 16 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 + 7 22 1 0 0 0 0 +M END +> +417.2 + +$$$$ + + CDK 0203121541 + + 22 22 0 0 0 0 0 0 0 0999 V2000 + 2.2129 2.2129 2.2129 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7554 2.2129 2.2129 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3318 3.6187 2.2129 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8000 4.4373 3.3779 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2823 4.4990 3.3375 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6749 3.1071 3.3537 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6565 2.6593 0.8544 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8456 0.8550 2.4575 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1237 1.6620 3.1025 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1285 1.6515 1.3338 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4367 3.5658 2.2607 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0981 4.1291 1.2562 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1365 3.9944 4.3365 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2245 5.4592 3.3519 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9029 5.0816 4.1993 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9509 5.0506 2.4342 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8902 2.6216 4.3274 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5709 3.1788 3.2884 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5581 2.6769 0.8515 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0008 3.6696 0.5953 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9792 1.9852 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8982 0.8281 2.4533 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 15 1 0 0 0 0 + 5 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 7 19 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 + 8 22 1 0 0 0 0 +M END +> +441.2 + +$$$$ + + CDK 0203121541 + + 22 21 0 0 0 0 0 0 0 0999 V2000 + 2.3889 2.3889 2.3889 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8963 2.3889 2.3889 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5260 3.7629 2.3889 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0451 3.7648 2.4026 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5943 5.1815 2.2200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0967 5.1964 2.4437 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2573 5.7120 0.8351 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5355 1.3545 2.3897 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9639 1.3768 2.3895 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0050 2.9118 3.2745 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0055 2.9108 1.5025 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1739 4.3200 1.4890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1347 4.3261 3.2602 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4175 3.3336 3.3526 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4352 3.1061 1.6007 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1154 5.8468 2.9803 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5084 6.2044 2.3046 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3556 4.8694 3.4592 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6153 4.5295 1.7417 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4781 6.7827 0.7484 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8196 5.1896 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1839 5.5696 0.6233 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 4 15 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 16 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 + 7 22 1 0 0 0 0 +M END +> +418 + +$$$$ + + CDK 0203121541 + + 23 22 0 0 0 0 0 0 0 0999 V2000 + 1.0728 1.0728 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5848 1.0728 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1363 2.4895 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6620 2.4637 1.0847 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0964 3.8182 1.0889 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4366 4.0849 1.1183 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5772 5.2896 1.1167 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4989 3.0131 1.1474 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9005 3.5781 1.1454 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6753 0.0500 1.0730 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 1.5832 1.9567 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6681 1.5825 0.1882 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9638 0.5170 1.9534 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9593 0.5220 0.1870 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7691 3.0411 0.1840 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7536 3.0491 1.9499 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0461 1.9370 1.9806 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0613 1.9397 0.1945 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3427 2.3815 2.0459 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3546 2.3443 0.2743 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6443 2.7715 1.1723 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0953 4.1793 0.2477 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0803 4.2242 2.0146 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 13 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 16 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 19 1 0 0 0 0 + 8 20 1 0 0 0 0 + 9 21 1 0 0 0 0 + 9 22 1 0 0 0 0 + 9 23 1 0 0 0 0 +M END +> +419.8 + +$$$$ + + CDK 0203121541 + + 23 22 0 0 0 0 0 0 0 0999 V2000 + 4.5018 4.5018 4.5018 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0226 4.5018 4.5018 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5469 5.9283 4.5018 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5359 3.7234 5.7158 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0182 3.4350 5.6165 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9229 3.9872 6.2117 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3078 2.4142 4.7588 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6763 2.0532 4.5639 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6849 0.9259 3.5496 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0977 3.4822 4.4498 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0966 4.9733 5.4074 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1071 5.0561 3.6403 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3748 3.9894 3.5731 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6446 5.9530 4.5040 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2047 6.4748 3.6133 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2035 6.4863 5.3837 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3379 4.2916 6.6471 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9839 2.7669 5.8151 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2470 2.9294 4.2026 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1173 1.7372 5.5280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7163 0.6031 3.3587 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1229 0.0500 3.8996 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2491 1.2314 2.5892 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 16 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 19 1 0 0 0 0 + 8 20 1 0 0 0 0 + 9 21 1 0 0 0 0 + 9 22 1 0 0 0 0 + 9 23 1 0 0 0 0 +M END +> +407.5 + +$$$$ + + CDK 0203121541 + + 23 22 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5845 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1398 2.4877 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6601 2.4857 1.0867 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2103 3.9037 1.0926 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7293 3.8903 1.1208 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3728 5.2523 1.1333 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5658 5.5056 1.1558 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5635 6.3362 1.1183 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6742 0.0500 1.0725 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5827 1.9566 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6677 1.5826 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9641 0.5167 1.9528 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9601 0.5221 0.1870 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7713 3.0376 0.1830 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7532 3.0468 1.9484 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0288 1.9295 1.9722 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0442 1.9321 0.2061 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8487 4.4516 0.1995 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8142 4.4600 1.9657 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0910 3.3345 2.0106 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1231 3.3354 0.2443 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0956 7.1263 1.1285 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 13 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 16 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 19 1 0 0 0 0 + 5 20 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 21 1 0 0 0 0 + 6 22 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 9 23 1 0 0 0 0 +M END +> +496.2 + +$$$$ + + CDK 0203121541 + + 23 22 0 0 0 0 0 0 0 0999 V2000 + 1.0726 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5847 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1406 2.4878 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6607 2.4824 1.0887 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2142 3.8982 1.0957 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7387 3.8702 1.1246 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1849 5.2241 1.1084 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5330 5.4120 1.1302 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7865 6.5915 1.1129 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6744 0.0500 1.0718 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6673 1.5819 1.9571 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5834 0.1887 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9635 0.5177 1.9539 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9605 0.5195 0.1888 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7727 3.0390 0.1837 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7537 3.0469 1.9485 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0281 1.9262 1.9748 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0427 1.9276 0.2079 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8585 4.4520 0.2036 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8234 4.4567 1.9699 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1149 3.3610 2.0331 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1478 3.3294 0.2492 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2407 4.5709 1.1588 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 13 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 16 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 19 1 0 0 0 0 + 5 20 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 21 1 0 0 0 0 + 6 22 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 23 1 0 0 0 0 +M END +> +428.6 + +$$$$ + + CDK 0203121541 + + 23 22 0 0 0 0 0 0 0 0999 V2000 + 2.2039 2.2039 2.2039 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7168 2.2039 2.2039 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2571 3.6243 2.2039 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7643 3.7451 2.2150 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3946 4.7867 2.2167 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4465 2.5662 2.2223 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8745 2.6056 2.2334 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3424 1.1528 2.2609 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8527 1.0891 2.2588 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8093 1.1799 2.2039 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7961 2.7120 3.0881 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7970 2.7117 1.3192 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0956 1.6477 3.0836 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0889 1.6544 1.3168 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8854 4.1708 1.3129 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8683 4.1785 3.0828 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2420 3.1331 1.3326 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2314 3.1621 3.1210 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9406 0.6351 3.1544 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9365 0.6000 1.3904 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2046 0.0500 2.2820 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2780 1.5599 1.3623 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2818 1.6004 3.1309 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 13 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 16 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 17 1 0 0 0 0 + 7 18 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 19 1 0 0 0 0 + 8 20 1 0 0 0 0 + 9 21 1 0 0 0 0 + 9 22 1 0 0 0 0 + 9 23 1 0 0 0 0 +M END +> +416.5 + +$$$$ + + CDK 0203121541 + + 24 23 0 0 0 0 0 0 0 0999 V2000 + 1.0726 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5845 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1414 2.4874 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6610 2.4857 1.1091 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2163 3.9006 1.0981 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7345 3.8969 1.1707 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2758 5.3241 1.1479 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6799 5.2494 1.2465 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6745 0.0500 1.0726 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6670 1.5829 1.9564 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6679 1.5827 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9627 0.5184 1.9546 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9620 0.5199 0.1894 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7841 3.0324 0.1756 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7412 3.0505 1.9398 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0170 1.9449 2.0094 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0590 1.9158 0.2453 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8818 4.4300 0.1831 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7956 4.4785 1.9458 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0727 3.3720 2.0866 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1505 3.3150 0.3238 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9863 5.8392 0.2101 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8618 5.9170 1.9878 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9979 6.1416 1.2518 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 16 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 18 1 0 0 0 0 + 5 19 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 20 1 0 0 0 0 + 6 21 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 22 1 0 0 0 0 + 7 23 1 0 0 0 0 + 8 24 1 0 0 0 0 +M END +> +449.5 + +$$$$ + + CDK 0203121541 + + 24 23 0 0 0 0 0 0 0 0999 V2000 + 1.1502 1.1502 1.1502 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6744 1.1502 1.1502 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2192 2.5885 1.1502 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7344 2.6071 1.0303 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2916 4.0091 1.2031 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8083 4.0196 1.0972 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3642 5.4163 1.2592 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0899 0.4178 2.2905 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7482 0.1289 1.1712 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7409 1.6808 2.0201 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7636 1.6413 0.2481 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0538 0.6103 0.2468 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7612 3.1547 0.3161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9002 3.1099 2.0759 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1716 1.9217 1.7922 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0433 2.1917 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8539 4.6848 0.4410 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9802 4.4246 2.1830 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2438 3.3478 1.8637 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1214 3.5986 0.1211 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4592 5.4199 1.1863 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9812 6.0962 0.4868 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0988 5.8474 2.2338 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0085 0.6337 2.4204 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 17 1 0 0 0 0 + 5 18 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 19 1 0 0 0 0 + 6 20 1 0 0 0 0 + 7 21 1 0 0 0 0 + 7 22 1 0 0 0 0 + 7 23 1 0 0 0 0 + 8 24 1 0 0 0 0 +M END +> +432.4 + +$$$$ + + CDK 0203121541 + + 24 23 0 0 0 0 0 0 0 0999 V2000 + 2.3959 2.3959 2.3959 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9229 2.3959 2.3959 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4563 3.8178 2.3959 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9767 3.8439 2.3920 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5095 5.2677 2.2226 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0145 5.2995 2.4253 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1441 5.8125 0.8505 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9702 1.0524 2.3954 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0016 2.9233 3.2873 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0027 2.9223 1.5033 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3056 1.8482 3.2805 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3080 1.8409 1.5170 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0821 4.3782 1.5080 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0682 4.3690 3.2760 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3652 3.4044 3.3323 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3666 3.2000 1.5776 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0328 5.9157 2.9990 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4099 6.3162 2.3031 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2923 4.9549 3.4300 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5337 4.6561 1.7021 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3665 6.8834 0.7693 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6916 5.2975 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0675 5.6703 0.6577 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0232 1.0707 2.4065 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 6 20 1 0 0 0 0 + 7 21 1 0 0 0 0 + 7 22 1 0 0 0 0 + 7 23 1 0 0 0 0 + 8 24 1 0 0 0 0 +M END +> +445.2 + +$$$$ + + CDK 0203121541 + + 24 23 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5844 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1418 2.4868 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6625 2.4811 1.0850 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2192 3.8956 1.0714 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7399 3.8862 1.1225 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2909 5.2989 1.0947 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1106 5.2228 1.2104 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6742 0.0500 1.0726 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6665 1.5827 1.9563 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5820 0.1879 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9642 0.5145 1.9512 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9581 0.5224 0.1857 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7757 3.0375 0.1829 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7580 3.0449 1.9499 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0314 1.9371 1.9779 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0459 1.9146 0.2125 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8719 4.4290 0.1635 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8138 4.4707 1.9282 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0846 3.3595 2.0359 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1447 3.3031 0.2705 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9810 5.8148 0.1678 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8721 5.8920 1.9281 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3777 6.5004 1.1567 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 16 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 18 1 0 0 0 0 + 5 19 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 20 1 0 0 0 0 + 6 21 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 22 1 0 0 0 0 + 7 23 1 0 0 0 0 + 8 24 1 0 0 0 0 +M END +> +450.1 + +$$$$ + + CDK 0203121541 + + 19 19 0 0 0 0 0 0 0 0999 V2000 + 2.9304 2.9304 2.9304 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3166 2.9304 2.9304 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0208 4.1429 2.9304 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3082 5.3616 2.9312 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9133 5.3514 2.9215 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2245 4.1379 2.9242 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7422 4.1653 2.9192 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.1723 2.9446 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0159 6.5580 2.8293 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0158 7.3169 4.0202 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3793 4.0500 2.9302 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3820 1.9801 2.9327 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8671 1.9818 2.9298 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3606 6.3002 2.9133 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2718 5.1631 2.8908 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5813 8.2079 3.7370 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0020 7.5933 4.3311 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5194 6.7907 4.8384 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7412 4.9272 2.8905 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 14 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 15 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 16 1 0 0 0 0 + 10 17 1 0 0 0 0 + 10 18 1 0 0 0 0 + 11 19 1 0 0 0 0 +M END +> +558 + +$$$$ + + CDK 0203121541 + + 19 19 0 0 0 0 0 0 0 0999 V2000 + 4.0658 4.0658 4.0658 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4549 4.0658 4.0658 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1392 5.2870 4.0658 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4357 6.4993 4.0647 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0489 6.4743 4.0652 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3490 5.2630 4.0655 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8545 5.3265 4.0655 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1383 3.9956 4.0487 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5063 5.2163 4.0660 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5373 3.1051 4.0660 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0087 3.1204 4.0660 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9659 7.4584 4.0640 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4936 7.4194 4.0648 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5341 5.9052 4.9562 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5346 5.9264 3.1887 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 4.1422 4.0477 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3868 3.4047 3.1569 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3821 3.3843 4.9281 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8423 6.1039 4.0649 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 13 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 + 8 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 9 19 1 0 0 0 0 +M END +> +491.1 + +$$$$ + + CDK 0203121541 + + 19 19 0 0 0 0 0 0 0 0999 V2000 + 2.6901 2.6901 2.6901 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1010 2.6901 2.6901 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8326 3.8827 2.6901 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1516 5.0940 2.6905 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7655 5.1143 2.6895 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0294 3.9240 2.6879 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9592 1.3956 2.6897 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5455 4.0326 2.6758 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7159 1.4655 2.6882 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9286 3.8708 2.6900 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7140 6.0334 2.6914 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2340 6.0725 2.6898 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8693 1.5319 2.7735 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1535 0.8395 1.7626 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2778 0.7626 3.5291 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.0638 2.8471 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1945 4.7260 3.4516 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1972 4.4137 1.7064 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6533 1.6138 2.6953 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 + 8 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 9 19 1 0 0 0 0 +M END +> +490.1 + +$$$$ + + CDK 0203121541 + + 19 19 0 0 0 0 0 0 0 0999 V2000 + 2.4394 2.4394 2.4394 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8278 2.4394 2.4394 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5332 3.6422 2.4394 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8361 4.8519 2.4435 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4433 4.8809 2.4415 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7475 3.6569 2.4381 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0189 3.6407 2.4226 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7203 6.1780 2.4435 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3792 3.7203 2.4348 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8964 1.4871 2.4401 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3704 1.4875 2.4405 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3958 5.7956 2.4482 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4322 4.4903 2.9822 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4324 2.7226 2.8603 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3911 3.7121 1.3914 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0749 6.2659 3.3281 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4079 7.0340 2.4465 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0778 6.2705 1.5572 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8301 2.4387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 8 1 0 0 0 0 + 6 9 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 + 8 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 9 19 1 0 0 0 0 +M END +> +484.1 + +$$$$ + + CDK 0203121541 + + 19 19 0 0 0 0 0 0 0 0999 V2000 + 2.4371 2.4371 2.4371 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8309 2.4371 2.4371 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5195 3.6507 2.4371 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8244 4.8540 2.4340 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4306 4.8816 2.4317 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7431 3.6534 2.4334 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5769 1.1525 2.4240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7021 6.1753 2.4282 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3746 3.7086 2.4330 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8947 1.4834 2.4402 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6150 3.6546 2.4405 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3813 5.7985 2.4338 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5436 1.2384 2.9378 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0132 0.3455 2.9104 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7785 0.8389 1.3905 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0524 6.2637 3.3095 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3869 7.0339 2.4319 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0638 6.2635 1.5385 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8167 2.4238 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 12 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 8 1 0 0 0 0 + 6 9 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 + 8 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 9 19 1 0 0 0 0 +M END +> +484.3 + +$$$$ + + CDK 0203121541 + + 19 19 0 0 0 0 0 0 0 0999 V2000 + 2.0187 2.0187 2.0187 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4165 2.0187 2.0187 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1138 3.2377 2.0187 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3896 4.4479 2.0250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9949 4.4200 2.0186 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3103 3.2124 2.0148 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1083 0.7000 2.0111 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0818 5.7657 2.0357 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4818 3.1723 2.0147 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4853 1.0616 2.0199 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4338 5.3616 2.0173 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2161 3.2027 2.0108 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1924 0.7727 2.1661 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7097 0.0500 2.8024 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9411 0.1872 1.0533 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3669 6.5997 2.0478 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7209 5.8816 2.9223 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7154 5.8969 1.1470 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8176 4.0609 2.0269 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 11 1 0 0 0 0 + 6 12 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 + 8 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 9 19 1 0 0 0 0 +M END +> +474.2 + +$$$$ + + CDK 0203121541 + + 19 19 0 0 0 0 0 0 0 0999 V2000 + 2.6686 2.6686 2.6686 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0631 2.6686 2.6686 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7564 3.8835 2.6686 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0671 5.1030 2.6747 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6799 5.0882 2.6769 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9702 3.8857 2.6719 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9559 1.3637 2.6576 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4841 3.9301 2.6620 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1232 3.7985 2.6657 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6131 1.7196 2.6689 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6058 6.0572 2.6787 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1302 6.0366 2.6833 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9347 1.4572 3.0632 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8690 0.9837 1.6307 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4851 0.6061 3.2498 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 3.0012 3.0677 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0981 4.7679 3.2569 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1087 4.0482 1.6365 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4679 4.6827 2.6672 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 9 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 + 8 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 9 19 1 0 0 0 0 +M END +> +500.2 + +$$$$ + + CDK 0203121541 + + 19 19 0 0 0 0 0 0 0 0999 V2000 + 2.4454 2.4454 2.4454 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8401 2.4454 2.4454 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5377 3.6525 2.4454 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8509 4.8684 2.4423 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4582 4.8854 2.4412 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7646 3.6684 2.4426 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5802 1.1566 2.4320 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6123 6.1447 2.4280 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3982 3.7568 2.4423 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8990 1.4946 2.4489 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6340 3.6486 2.4500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9113 5.8358 2.4409 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5594 1.2428 2.9215 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0236 0.3598 2.9428 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7548 0.8281 1.3983 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0093 6.9892 2.7871 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5101 6.0848 3.0574 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9394 6.3823 1.4064 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 2.8739 2.4429 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 9 1 0 0 0 0 + 7 13 1 0 0 0 0 + 7 14 1 0 0 0 0 + 7 15 1 0 0 0 0 + 8 16 1 0 0 0 0 + 8 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 9 19 1 0 0 0 0 +M END +> +494.9 + +$$$$ + + CDK 0203121541 + + 24 23 0 0 0 0 0 0 0 0999 V2000 + 3.0787 3.0787 3.0787 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5953 3.0787 3.0787 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0373 4.4310 3.0787 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1118 4.8104 2.3276 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3430 5.9811 2.5470 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8386 3.9154 1.3985 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9369 4.2557 0.7217 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6585 5.5592 0.7529 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6884 5.7707 0.1340 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1044 6.5334 1.5190 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7819 7.7986 1.5647 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9665 8.7042 2.4656 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7000 2.0490 3.0996 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6694 3.5998 3.9544 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6665 3.5682 2.1867 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0024 2.6226 3.9993 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9929 2.5026 2.2154 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4136 2.9053 1.2751 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4012 3.5184 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8078 7.6560 1.9544 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8647 8.2131 0.5419 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4447 9.6892 2.5366 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9472 8.8532 2.0856 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8766 8.3009 3.4829 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 1 15 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 16 1 0 0 0 0 + 2 17 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 18 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 19 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 20 1 0 0 0 0 + 11 21 1 0 0 0 0 + 12 22 1 0 0 0 0 + 12 23 1 0 0 0 0 + 12 24 1 0 0 0 0 +M END +> +498.2 + +$$$$ + + CDK 0203121541 + + 25 24 0 0 0 0 0 0 0 0999 V2000 + 1.0727 1.0727 1.0727 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5847 1.0727 1.0727 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1414 2.4875 1.0727 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6612 2.4840 1.1056 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2172 3.8988 1.0944 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7361 3.8945 1.1581 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2916 5.3078 1.1362 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7970 5.3155 1.2380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4466 6.3361 1.2564 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6745 0.0500 1.0726 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6668 1.5829 1.9565 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5825 0.1882 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9627 0.5173 1.9540 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9615 0.5202 0.1890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7837 3.0330 0.1763 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7442 3.0503 1.9413 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0187 1.9423 2.0046 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0558 1.9150 0.2396 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8785 4.4311 0.1827 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8040 4.4758 1.9463 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0744 3.3665 2.0726 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1472 3.3117 0.3092 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9795 5.8273 0.2074 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8582 5.9041 1.9648 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3049 4.3383 1.2975 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 13 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 16 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 19 1 0 0 0 0 + 5 20 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 21 1 0 0 0 0 + 6 22 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 23 1 0 0 0 0 + 7 24 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 25 1 0 0 0 0 +M END +> +447.2 + +$$$$ + + CDK 0203121541 + + 25 24 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5847 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1400 2.4877 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6603 2.4867 1.0855 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2100 3.9044 1.0923 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7278 3.8998 1.1179 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3581 5.2750 1.1316 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8649 5.2752 1.0953 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7180 6.3080 1.1696 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6740 0.0500 1.0726 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5829 1.9564 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5827 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9646 0.5163 1.9524 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9596 0.5221 0.1865 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7716 3.0379 0.1832 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7547 3.0465 1.9492 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0307 1.9303 1.9700 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0434 1.9346 0.2035 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8492 4.4555 0.2008 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8166 4.4621 1.9657 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0918 3.3437 2.0062 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1212 3.3452 0.2413 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2906 6.2854 1.1543 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2714 4.6936 1.9329 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2247 4.8143 0.1660 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 13 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 16 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 19 1 0 0 0 0 + 5 20 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 21 1 0 0 0 0 + 6 22 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 2 0 0 0 0 + 8 23 1 0 0 0 0 + 8 24 1 0 0 0 0 + 8 25 1 0 0 0 0 +M END +> +445.8 + +$$$$ + + CDK 0203121541 + + 26 25 0 0 0 0 0 0 0 0999 V2000 + 1.0728 1.0728 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5848 1.0728 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1366 2.4896 1.0728 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6625 2.4658 1.0838 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0955 3.8209 1.0895 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4354 4.0899 1.0964 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5748 5.2949 1.1013 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4984 3.0193 1.0962 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9068 3.5900 1.1111 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9384 2.4843 1.1296 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6751 0.0500 1.0731 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 1.5831 1.9567 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6681 1.5826 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9641 0.5169 1.9532 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9589 0.5221 0.1866 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7697 3.0415 0.1842 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7546 3.0486 1.9505 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0495 1.9420 1.9798 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0632 1.9421 0.1938 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3448 2.3580 1.9742 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3577 2.3765 0.2023 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0604 4.2401 0.2270 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0377 4.2494 1.9920 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9559 2.8952 1.1428 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8329 1.8430 2.0149 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8572 1.8369 0.2463 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 20 1 0 0 0 0 + 8 21 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 22 1 0 0 0 0 + 9 23 1 0 0 0 0 + 10 24 1 0 0 0 0 + 10 25 1 0 0 0 0 + 10 26 1 0 0 0 0 +M END +> +438.2 + +$$$$ + + CDK 0203121541 + + 26 25 0 0 0 0 0 0 0 0999 V2000 + 1.0727 1.0727 1.0727 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5847 1.0727 1.0727 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1410 2.4876 1.0727 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6609 2.4835 1.1093 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2163 3.8987 1.0999 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7349 3.8911 1.1707 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2734 5.3176 1.1507 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6932 5.2303 1.2542 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3679 6.4121 1.2838 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5541 6.2091 1.3712 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6747 0.0500 1.0721 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6671 1.5822 1.9569 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5833 0.1887 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9631 0.5180 1.9543 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9618 0.5202 0.1891 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7868 3.0322 0.1745 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7423 3.0506 1.9405 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0170 1.9428 2.0094 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0586 1.9164 0.2437 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8824 4.4298 0.1858 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7995 4.4749 1.9505 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0727 3.3645 2.0861 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1533 3.3114 0.3233 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0022 5.8379 0.2122 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8718 5.9118 1.9940 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8526 7.3821 1.2321 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 20 1 0 0 0 0 + 5 21 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 22 1 0 0 0 0 + 6 23 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 24 1 0 0 0 0 + 7 25 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 26 1 0 0 0 0 +M END +> +451.3 + +$$$$ + + CDK 0203121541 + + 26 25 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5845 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1406 2.4874 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6612 2.4823 1.0844 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2138 3.8983 1.0917 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7392 3.8693 1.1139 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1792 5.2223 1.1257 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5208 5.4743 1.1312 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6868 6.6762 1.1424 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5758 4.4083 1.1232 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6742 0.0500 1.0719 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6673 1.5822 1.9568 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6677 1.5832 0.1886 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9643 0.5156 1.9520 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9584 0.5222 0.1860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7733 3.0382 0.1833 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7575 3.0461 1.9500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0308 1.9254 1.9689 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0412 1.9307 0.2009 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8554 4.4531 0.2012 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8268 4.4574 1.9673 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1169 3.3394 2.0105 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1429 3.3442 0.2260 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5827 4.8448 1.1487 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4759 3.7450 1.9931 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5025 3.7914 0.2170 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 20 1 0 0 0 0 + 5 21 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 22 1 0 0 0 0 + 6 23 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 + 10 24 1 0 0 0 0 + 10 25 1 0 0 0 0 + 10 26 1 0 0 0 0 +M END +> +444.7 + +$$$$ + + CDK 0203121541 + + 26 25 0 0 0 0 0 0 0 0999 V2000 + 5.1337 5.1337 5.1337 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6541 5.1337 5.1337 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1829 6.5583 5.1337 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1594 4.3566 6.3565 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5361 4.0601 6.1514 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1063 3.0345 6.8520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2864 3.0018 6.5757 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3393 2.1242 7.7995 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8794 0.7066 7.7457 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4223 2.6868 9.2096 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7279 4.1148 5.0807 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7283 5.6046 6.0394 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7400 5.6877 4.2715 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0109 4.6222 4.2057 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2801 6.5790 5.1220 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8324 7.1088 4.2509 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8508 7.1145 6.0209 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0691 4.9539 7.2843 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5752 3.4215 6.5046 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2632 2.1103 7.4752 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3132 0.0500 8.4193 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8075 0.2878 6.7341 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9346 0.6611 8.0475 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8558 2.0624 9.9125 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4589 2.7296 9.5695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0088 3.7030 9.2608 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 1 0 0 0 0 + 8 20 1 0 0 0 0 + 9 21 1 0 0 0 0 + 9 22 1 0 0 0 0 + 9 23 1 0 0 0 0 + 10 24 1 0 0 0 0 + 10 25 1 0 0 0 0 + 10 26 1 0 0 0 0 +M END +> +420.6 + +$$$$ + + CDK 0203121541 + + 27 26 0 0 0 0 0 0 0 0999 V2000 + 3.4273 3.4273 3.4273 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9390 3.4273 3.4273 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5212 4.8486 3.4273 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0171 4.8184 3.7306 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2907 5.3918 2.1245 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1264 6.8098 2.1022 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1094 7.2121 0.6312 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8250 7.2414 2.7994 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7325 8.7468 2.8852 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0316 2.4042 3.4569 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0205 3.9625 4.2964 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0212 3.9119 2.5291 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3161 2.8918 4.3212 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3204 2.8594 2.5553 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9851 5.4704 4.1956 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4524 5.8267 3.7204 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2049 4.3891 4.7230 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5688 4.2161 2.9972 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9960 7.2926 2.6146 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8211 8.2737 0.5511 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0911 7.0847 0.1602 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3849 6.6265 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9510 6.8308 2.2559 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7892 6.7825 3.8135 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7462 9.0709 3.2380 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4823 9.1661 3.5684 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9033 9.1970 1.8922 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 13 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 4 17 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 6 19 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 + 7 22 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 23 1 0 0 0 0 + 8 24 1 0 0 0 0 + 9 25 1 0 0 0 0 + 9 26 1 0 0 0 0 + 9 27 1 0 0 0 0 +M END +> +394.2 + +$$$$ + + CDK 0203121541 + + 27 26 0 0 0 0 0 0 0 0999 V2000 + 2.2864 2.2864 2.2864 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8257 2.2864 2.2864 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3158 3.7387 2.2864 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7016 3.8897 1.6803 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1749 5.3334 1.7312 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5428 5.4892 1.1060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3525 1.5003 3.4927 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7295 0.9207 3.2562 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8431 1.0155 1.8662 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8926 2.5250 3.2942 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8976 3.0568 1.5896 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1793 1.7845 1.3507 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6036 4.3734 1.7178 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3079 4.1436 3.3191 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4229 3.2324 2.2168 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6997 3.5297 0.6317 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4454 5.9881 1.2139 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1961 5.6862 2.7816 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8847 6.5311 1.1499 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2951 4.8752 1.6188 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5423 5.1881 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3637 2.1482 4.3925 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6548 0.6725 3.7316 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0926 0.3863 4.1431 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7341 0.2114 2.4180 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4659 1.7067 3.0197 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9043 1.0058 1.9922 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 1 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 15 1 0 0 0 0 + 4 16 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 17 1 0 0 0 0 + 5 18 1 0 0 0 0 + 6 19 1 0 0 0 0 + 6 20 1 0 0 0 0 + 6 21 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 22 1 0 0 0 0 + 7 23 1 0 0 0 0 + 8 24 1 0 0 0 0 + 8 25 1 0 0 0 0 + 8 26 1 0 0 0 0 + 9 27 1 0 0 0 0 +M END +> +457.8 + +$$$$ + + CDK 0203121541 + + 27 26 0 0 0 0 0 0 0 0999 V2000 + 1.4229 1.4229 1.4229 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9494 1.4229 1.4229 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4827 2.8460 1.4229 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0030 2.8628 1.4360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5393 4.2847 1.4420 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0593 4.3019 1.4681 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5984 5.7233 1.4799 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1094 5.7434 1.5268 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9972 0.0792 1.4138 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0285 1.9440 2.3183 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0282 1.9558 0.5347 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3335 0.8697 2.3034 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3305 0.8743 0.5380 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1079 3.3915 0.5331 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0908 3.4007 2.2994 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3793 2.3108 2.3208 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3922 2.3143 0.5544 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1727 4.8308 0.5494 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1405 4.8391 2.3154 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4283 3.7499 2.3561 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4591 3.7527 0.5918 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2382 6.2692 0.5849 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1837 6.2756 2.3470 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4945 6.7711 1.5330 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4935 5.2437 2.4262 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5476 5.2318 0.6595 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 0.0954 1.4202 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 16 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 18 1 0 0 0 0 + 5 19 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 20 1 0 0 0 0 + 6 21 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 22 1 0 0 0 0 + 7 23 1 0 0 0 0 + 8 24 1 0 0 0 0 + 8 25 1 0 0 0 0 + 8 26 1 0 0 0 0 + 9 27 1 0 0 0 0 +M END +> +468.3 + +$$$$ + + CDK 0203121541 + + 27 26 0 0 0 0 0 0 0 0999 V2000 + 1.0935 1.0935 1.0935 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6181 1.0935 1.0935 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1573 2.5339 1.0935 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6755 2.5610 1.0137 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2149 3.9728 1.1673 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7329 3.9942 1.0977 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2744 5.4065 1.2511 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7844 5.4309 1.1776 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0350 0.3596 2.2322 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6918 0.0724 1.1253 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6843 1.6322 1.9586 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7069 1.5755 0.1867 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9947 0.5547 0.1888 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7221 3.0854 0.2374 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8106 3.0675 2.0017 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0995 1.8987 1.8020 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0142 2.1304 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7892 4.6253 0.3782 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8725 4.4087 2.1278 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1589 3.3396 1.8847 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0732 3.5619 0.1350 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8477 6.0608 0.4651 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9356 5.8376 2.2142 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1722 6.4510 1.2930 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2385 4.8159 1.9660 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1494 5.0479 0.2153 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9478 0.5903 2.3762 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 16 1 0 0 0 0 + 4 17 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 18 1 0 0 0 0 + 5 19 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 20 1 0 0 0 0 + 6 21 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 22 1 0 0 0 0 + 7 23 1 0 0 0 0 + 8 24 1 0 0 0 0 + 8 25 1 0 0 0 0 + 8 26 1 0 0 0 0 + 9 27 1 0 0 0 0 +M END +> +453 + +$$$$ + + CDK 0203121541 + + 27 26 0 0 0 0 0 0 0 0999 V2000 + 1.0722 1.0722 1.0722 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5844 1.0722 1.0722 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1404 2.4871 1.0722 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6610 2.4860 1.0873 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2153 3.9011 1.0933 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7357 3.8962 1.1215 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2879 5.3136 1.1335 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8040 5.3027 1.1734 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4057 7.0251 1.1921 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6733 0.0500 1.0713 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6672 1.5820 1.9565 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5834 0.1885 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9636 0.5166 1.9527 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9601 0.5216 0.1868 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7724 3.0374 0.1828 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7536 3.0469 1.9476 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0291 1.9310 1.9736 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0441 1.9318 0.2069 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8570 4.4515 0.2000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8236 4.4614 1.9661 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0940 3.3388 2.0105 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1285 3.3426 0.2448 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9356 5.8631 0.2367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8877 5.8714 2.0046 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1600 4.7533 2.0641 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2064 4.7570 0.3004 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6924 6.7967 1.2174 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 10 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 13 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 16 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 19 1 0 0 0 0 + 5 20 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 21 1 0 0 0 0 + 6 22 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 23 1 0 0 0 0 + 7 24 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 25 1 0 0 0 0 + 8 26 1 0 0 0 0 + 9 27 1 0 0 0 0 +M END +> +472.2 + +$$$$ + + CDK 0203121541 + + 21 21 0 0 0 0 0 0 0 0999 V2000 + 5.7711 5.7711 5.7711 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1684 5.7711 5.7711 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8617 6.9767 5.7711 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1704 8.1837 5.7709 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7796 8.1864 5.7706 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0787 6.9860 5.7707 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9815 4.5102 5.7715 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7678 4.4083 5.7745 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7325 3.3710 5.7682 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0568 2.1115 5.7677 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1379 1.0476 5.7596 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7298 4.8295 5.7716 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9568 6.9736 5.7714 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7209 9.1304 5.7714 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2327 9.1352 5.7698 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9813 6.9925 5.7707 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4142 2.0319 6.6647 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4056 2.0366 4.8766 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6808 0.0500 5.7626 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7785 1.1161 4.8705 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7921 1.1155 6.6388 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 15 1 0 0 0 0 + 6 16 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 17 1 0 0 0 0 + 10 18 1 0 0 0 0 + 11 19 1 0 0 0 0 + 11 20 1 0 0 0 0 + 11 21 1 0 0 0 0 +M END +> +486.6 + +$$$$ + + CDK 0203121541 + + 22 22 0 0 0 0 0 0 0 0999 V2000 + 4.9265 4.9265 4.9265 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3156 4.9265 4.9265 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0060 6.1351 4.9265 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3083 7.3350 4.9194 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9093 7.3394 4.9246 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2217 6.1272 4.9292 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2307 8.6785 4.9248 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8219 8.5166 4.9113 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1234 9.7534 4.9234 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6425 9.4267 4.8917 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3801 3.9777 4.9258 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8660 3.9804 4.9270 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1007 6.1406 4.9308 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8547 8.2848 4.9119 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1260 6.1040 4.9337 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5363 9.2519 5.8239 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5504 9.2594 4.0355 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3884 10.3297 5.8319 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4179 10.3663 4.0486 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 10.3501 4.9041 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3655 8.8660 3.9893 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3363 8.8237 5.7566 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 14 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 6 15 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 18 1 0 0 0 0 + 9 19 1 0 0 0 0 + 10 20 1 0 0 0 0 + 10 21 1 0 0 0 0 + 10 22 1 0 0 0 0 +M END +> +458.1 + +$$$$ + + CDK 0203121541 + + 24 24 0 0 0 0 0 0 0 0999 V2000 + 2.2242 2.2242 2.2242 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7575 2.2242 2.2242 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3411 3.6198 2.2242 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5871 4.6599 2.9570 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3747 4.4231 3.4782 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7038 3.0940 3.3781 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6226 5.4747 4.2114 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7279 0.7911 2.4211 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6979 2.7493 0.8899 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3936 3.8739 1.6643 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1330 1.6382 1.3610 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1335 1.7041 3.1293 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0635 5.6445 3.0507 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6083 3.2341 3.2713 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8503 2.5699 4.3457 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7200 5.7598 3.6535 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3028 5.1084 5.1963 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2166 6.3843 4.3702 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0944 0.3590 3.3621 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6309 0.7523 2.4452 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0656 0.1385 1.6052 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0667 2.1458 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6003 2.7273 0.8572 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0134 3.7871 0.7179 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 2 0 0 0 0 + 4 5 2 0 0 0 0 + 4 13 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 6 14 1 0 0 0 0 + 6 15 1 0 0 0 0 + 7 16 1 0 0 0 0 + 7 17 1 0 0 0 0 + 7 18 1 0 0 0 0 + 8 19 1 0 0 0 0 + 8 20 1 0 0 0 0 + 8 21 1 0 0 0 0 + 9 22 1 0 0 0 0 + 9 23 1 0 0 0 0 + 9 24 1 0 0 0 0 +M END +> +488.4 + +$$$$ + + CDK 0203121541 + + 28 27 0 0 0 0 0 0 0 0999 V2000 + 3.3106 3.3106 3.3106 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8299 3.3106 3.3106 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3617 4.7340 3.3106 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3556 2.5275 4.5139 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8456 2.2496 4.4181 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6033 2.5692 5.3143 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3061 1.5104 3.1764 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6298 2.0227 2.6097 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2112 1.0046 1.6418 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4338 3.3580 1.9095 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9066 2.2901 3.2816 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9074 3.7996 4.2076 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9143 3.8466 2.4383 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1944 2.7925 2.3811 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4608 4.7447 3.2090 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9493 5.3116 2.4733 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1072 5.2653 4.2370 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1142 3.0688 5.4512 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8358 1.5508 4.5855 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3923 0.4363 3.4341 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5119 1.5829 2.3980 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3517 2.1638 3.4516 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1518 1.3673 1.2071 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4252 0.0500 2.1401 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5239 0.7954 0.8109 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3944 3.7927 1.6061 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8174 3.2562 1.0055 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9289 4.0870 2.5666 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 20 1 0 0 0 0 + 7 21 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 1 0 0 0 0 + 8 22 1 0 0 0 0 + 9 23 1 0 0 0 0 + 9 24 1 0 0 0 0 + 9 25 1 0 0 0 0 + 10 26 1 0 0 0 0 + 10 27 1 0 0 0 0 + 10 28 1 0 0 0 0 +M END +> +441.4 + +$$$$ + + CDK 0203121541 + + 28 27 0 0 0 0 0 0 0 0999 V2000 + 2.0299 2.0299 2.0299 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5418 2.0299 2.0299 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0989 3.4445 2.0299 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6184 3.4423 2.0457 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1738 4.8573 2.0338 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6935 4.8538 2.0658 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2451 6.2703 2.0195 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7606 6.2597 2.0684 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3708 6.4477 3.1033 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4603 6.0131 0.7589 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6322 1.0069 2.0291 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6242 2.5390 2.9144 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6247 2.5402 1.1459 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9211 1.4738 2.9102 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9189 1.4781 1.1457 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7283 3.9955 1.1420 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7117 4.0027 2.9062 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9876 2.8981 2.9385 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0053 2.8768 1.1738 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8142 5.3976 1.1346 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7775 5.4274 2.8985 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0535 4.3372 2.9779 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0864 4.2649 1.2115 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9127 6.7839 1.0955 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8316 6.8633 2.8602 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5509 5.9520 0.8618 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1113 5.0733 0.3096 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2347 6.8206 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 20 1 0 0 0 0 + 5 21 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 22 1 0 0 0 0 + 6 23 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 24 1 0 0 0 0 + 7 25 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 + 10 26 1 0 0 0 0 + 10 27 1 0 0 0 0 + 10 28 1 0 0 0 0 +M END +> +467.5 + +$$$$ + + CDK 0203121541 + + 28 27 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5846 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1376 2.4893 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6562 2.4824 1.0843 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2869 3.8605 1.0832 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8027 3.8354 1.0976 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4506 5.2081 1.0836 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9673 5.0993 1.1128 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6181 6.4635 1.0859 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6395 4.8886 1.0720 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6742 0.0500 1.0720 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5826 1.9567 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5833 0.1884 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9641 0.5154 1.9519 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9579 0.5222 0.1858 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7705 3.0399 0.1836 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7537 3.0466 1.9500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0259 1.9314 1.9731 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0390 1.9237 0.2060 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1321 3.2698 1.9930 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1467 3.2433 0.2251 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1286 5.7704 0.1843 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0969 5.8049 1.9480 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2896 4.5440 2.0161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3197 4.4955 0.2528 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7122 6.3835 1.1106 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3497 7.0224 0.1794 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3137 7.0739 1.9465 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 10 2 0 0 0 0 + 6 7 1 0 0 0 0 + 6 20 1 0 0 0 0 + 6 21 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 22 1 0 0 0 0 + 7 23 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 24 1 0 0 0 0 + 8 25 1 0 0 0 0 + 9 26 1 0 0 0 0 + 9 27 1 0 0 0 0 + 9 28 1 0 0 0 0 +M END +> +461.6 + +$$$$ + + CDK 0203121541 + + 29 28 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5846 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1409 2.4874 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6610 2.4835 1.1082 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2158 3.8990 1.1001 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7345 3.8920 1.1716 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2716 5.3200 1.1538 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6880 5.2269 1.2653 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4215 6.3781 1.2691 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5947 6.0856 1.3719 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8302 7.7522 1.1611 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6741 0.0500 1.0719 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6668 1.5820 1.9567 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5828 0.1884 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9632 0.5177 1.9539 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9615 0.5201 0.1888 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7871 3.0322 0.1743 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7431 3.0503 1.9407 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0178 1.9432 2.0082 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0581 1.9169 0.2420 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8816 4.4308 0.1865 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7995 4.4742 1.9517 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0719 3.3648 2.0868 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1536 3.3137 0.3238 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0031 5.8396 0.2138 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8677 5.9136 1.9968 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6156 8.5189 1.1954 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2865 7.8752 0.2147 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1312 7.9507 1.9845 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 2 16 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 17 1 0 0 0 0 + 3 18 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 19 1 0 0 0 0 + 4 20 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 21 1 0 0 0 0 + 5 22 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 23 1 0 0 0 0 + 6 24 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 25 1 0 0 0 0 + 7 26 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 27 1 0 0 0 0 + 11 28 1 0 0 0 0 + 11 29 1 0 0 0 0 +M END +> +465.6 + +$$$$ + + CDK 0203121541 + + 29 28 0 0 0 0 0 0 0 0999 V2000 + 1.0724 1.0724 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5845 1.0724 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1395 2.4879 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6597 2.4887 1.0872 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2107 3.9051 1.0930 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7308 3.9059 1.1208 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2776 5.3253 1.1325 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7964 5.3173 1.1755 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4353 6.6806 1.1943 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6267 6.9402 1.2278 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6198 7.7601 1.1724 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6739 0.0500 1.0716 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6672 1.5820 1.9568 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6679 1.5832 0.1884 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9640 0.5176 1.9534 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9611 0.5215 0.1876 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7706 3.0370 0.1825 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7510 3.0471 1.9473 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0295 1.9337 1.9730 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0445 1.9349 0.2071 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8504 4.4544 0.1997 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8164 4.4643 1.9654 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0923 3.3494 2.0093 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1249 3.3528 0.2442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9219 5.8723 0.2363 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8706 5.8794 2.0019 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1514 4.7617 2.0683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2003 4.7647 0.3021 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1456 8.5543 1.1873 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 2 16 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 17 1 0 0 0 0 + 3 18 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 19 1 0 0 0 0 + 4 20 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 21 1 0 0 0 0 + 5 22 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 23 1 0 0 0 0 + 6 24 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 25 1 0 0 0 0 + 7 26 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 27 1 0 0 0 0 + 8 28 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 29 1 0 0 0 0 +M END +> +528.8 + +$$$$ + + CDK 0203121541 + + 29 28 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5844 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1412 2.4872 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6613 2.4833 1.0874 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2170 3.8981 1.0926 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7371 3.8919 1.1202 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2923 5.3068 1.1308 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8164 5.2781 1.1740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2629 6.6321 1.1768 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6103 6.8210 1.2193 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8635 8.0007 1.2145 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6742 0.0500 1.0724 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6672 1.5823 1.9566 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5825 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9638 0.5166 1.9528 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9600 0.5215 0.1872 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7734 3.0372 0.1828 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7550 3.0467 1.9483 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0306 1.9274 1.9728 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0438 1.9291 0.2065 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8591 4.4489 0.1993 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8257 4.4586 1.9654 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0974 3.3352 2.0090 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1273 3.3366 0.2432 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9436 5.8609 0.2359 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8938 5.8681 1.9999 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1837 4.7578 2.0800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2335 4.7452 0.2974 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3181 5.9800 1.2525 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 2 16 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 17 1 0 0 0 0 + 3 18 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 19 1 0 0 0 0 + 4 20 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 21 1 0 0 0 0 + 5 22 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 23 1 0 0 0 0 + 6 24 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 25 1 0 0 0 0 + 7 26 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 27 1 0 0 0 0 + 8 28 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 29 1 0 0 0 0 +M END +> +472 + +$$$$ + + CDK 0203121541 + + 30 29 0 0 0 0 0 0 0 0999 V2000 + 2.5092 2.5092 2.5092 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0265 2.5092 2.5092 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5698 3.9296 2.5092 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5712 1.7301 3.7063 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0821 1.4821 3.5567 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6823 0.9383 4.8594 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6732 2.0164 5.9453 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0524 1.4225 7.2898 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6102 3.1565 5.5801 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3733 0.5505 2.5309 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1068 1.4894 2.4521 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1065 2.9720 3.4202 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1130 3.0703 1.6530 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3873 1.9900 1.5802 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6652 3.9185 2.6460 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3478 4.4474 1.5684 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1435 4.5274 3.3256 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4047 2.2913 4.6539 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0304 0.7701 3.8211 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5812 2.4681 3.3067 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1137 0.0500 5.2001 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7176 0.5829 4.6837 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6252 2.4209 6.0021 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0508 2.1885 8.0760 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3508 0.6347 7.5936 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0564 0.9777 7.2656 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5066 4.0006 6.2728 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6615 2.8402 5.5973 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3910 3.5212 4.5617 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8199 0.7994 1.7969 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 10 1 0 0 0 0 + 5 20 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 21 1 0 0 0 0 + 6 22 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 23 1 0 0 0 0 + 8 24 1 0 0 0 0 + 8 25 1 0 0 0 0 + 8 26 1 0 0 0 0 + 9 27 1 0 0 0 0 + 9 28 1 0 0 0 0 + 9 29 1 0 0 0 0 + 10 30 1 0 0 0 0 +M END +> +451 + +$$$$ + + CDK 0203121541 + + 30 29 0 0 0 0 0 0 0 0999 V2000 + 1.0724 1.0724 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5843 1.0724 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1414 2.4870 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6611 2.4835 1.1110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2173 3.8982 1.0943 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7358 3.8947 1.1700 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2938 5.3083 1.1368 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8097 5.3033 1.2465 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3559 6.7283 1.1922 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7533 6.6534 1.3588 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6740 0.0500 1.0724 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6667 1.5826 1.9562 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6677 1.5821 0.1880 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9625 0.5177 1.9541 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9615 0.5197 0.1890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7873 3.0313 0.1739 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7416 3.0508 1.9392 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0156 1.9479 2.0147 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0596 1.9100 0.2498 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8856 4.4239 0.1763 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7979 4.4805 1.9394 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0678 3.3770 2.0925 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1550 3.3039 0.3306 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9848 5.8144 0.2000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8540 5.9082 1.9590 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1227 4.8071 2.1871 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2482 4.6947 0.4304 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1099 7.2076 0.2237 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9087 7.3537 1.9905 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0769 7.5420 1.3054 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 20 1 0 0 0 0 + 5 21 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 22 1 0 0 0 0 + 6 23 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 24 1 0 0 0 0 + 7 25 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 26 1 0 0 0 0 + 8 27 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 28 1 0 0 0 0 + 9 29 1 0 0 0 0 + 10 30 1 0 0 0 0 +M END +> +486.3 + +$$$$ + + CDK 0203121541 + + 30 29 0 0 0 0 0 0 0 0999 V2000 + 1.4360 1.4360 1.4360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9481 1.4360 1.4360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5056 2.8504 1.4360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0256 2.8472 1.4223 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5817 4.2621 1.4306 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1021 4.2556 1.4163 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6557 5.6717 1.4302 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1875 5.6929 1.3341 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6825 7.1053 1.0195 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6930 5.2293 2.5745 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0372 0.4137 1.4390 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0316 1.9490 2.3188 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0311 1.9439 0.5506 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3266 0.8824 2.3184 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3264 0.8822 0.5537 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1199 3.4079 0.5586 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1357 3.4022 2.3236 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4113 2.2838 2.2960 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3945 2.3007 0.5309 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1952 4.8264 0.5579 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2148 4.8069 2.3238 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4872 3.6904 2.2884 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4680 3.7123 0.5215 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2407 6.2447 0.5765 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3245 6.2046 2.3440 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5250 4.9937 0.5286 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7789 7.1512 0.9727 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2994 7.4479 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3557 7.8288 1.7782 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6371 5.2920 2.5211 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 20 1 0 0 0 0 + 5 21 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 22 1 0 0 0 0 + 6 23 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 24 1 0 0 0 0 + 7 25 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 1 0 0 0 0 + 8 26 1 0 0 0 0 + 9 27 1 0 0 0 0 + 9 28 1 0 0 0 0 + 9 29 1 0 0 0 0 + 10 30 1 0 0 0 0 +M END +> +471.7 + +$$$$ + + CDK 0203121541 + + 30 29 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5844 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1410 2.4871 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6607 2.4838 1.1114 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2162 3.8985 1.0917 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7346 3.8954 1.1674 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2910 5.3094 1.1293 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8084 5.3036 1.2414 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3599 6.7150 1.1875 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1738 6.6453 1.3819 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6740 0.0500 1.0724 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6666 1.5824 1.9563 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5820 0.1880 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9629 0.5173 1.9539 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9618 0.5198 0.1890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7874 3.0313 0.1737 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7412 3.0510 1.9393 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0150 1.9499 2.0163 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0596 1.9090 0.2514 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8851 4.4222 0.1722 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7965 4.4829 1.9353 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0666 3.3819 2.0924 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1539 3.3014 0.3303 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9817 5.8125 0.1909 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8519 5.9121 1.9500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1168 4.8100 2.1858 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2466 4.6919 0.4265 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0892 7.1986 0.2314 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9079 7.3364 1.9821 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4404 7.9209 1.2903 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 11 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 4 19 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 20 1 0 0 0 0 + 5 21 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 22 1 0 0 0 0 + 6 23 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 24 1 0 0 0 0 + 7 25 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 26 1 0 0 0 0 + 8 27 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 28 1 0 0 0 0 + 9 29 1 0 0 0 0 + 10 30 1 0 0 0 0 +M END +> +493 + +$$$$ + + CDK 0203121541 + + 24 24 0 0 0 0 0 0 0 0999 V2000 + 4.6936 4.6936 4.6936 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0837 4.6936 4.6936 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7803 5.8973 4.6936 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0873 7.1022 4.6955 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6912 7.1106 4.6963 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9906 5.9004 4.6953 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4999 5.8270 4.6723 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8081 5.3044 3.8234 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9139 6.3901 5.7726 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5042 6.3967 5.8547 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9905 8.4276 4.6664 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2835 8.8700 3.7846 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2352 9.1811 5.7813 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6297 10.4525 5.8808 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1460 3.7437 4.6834 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6288 3.7435 4.6901 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8756 5.8980 4.6914 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6392 8.0494 4.6979 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3292 6.9142 6.8013 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 6.9489 5.0251 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0957 5.3813 5.8920 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9908 10.8073 6.8494 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9576 11.1235 5.0798 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5367 10.3837 5.8812 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 15 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 16 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 17 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 11 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 19 1 0 0 0 0 + 10 20 1 0 0 0 0 + 10 21 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 22 1 0 0 0 0 + 14 23 1 0 0 0 0 + 14 24 1 0 0 0 0 +M END +> +556.8 + +$$$$ + + CDK 0203121541 + + 23 23 0 0 0 0 0 0 0 0999 V2000 + 1.0678 1.0678 1.0678 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5464 1.0678 1.0678 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2716 2.1928 1.0678 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7303 2.1955 1.0583 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4212 3.4143 1.0650 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8063 3.4394 1.0564 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5190 2.2290 1.0364 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8427 1.0052 1.0290 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4539 1.0010 1.0404 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8908 2.3858 1.0212 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6761 1.2201 0.9969 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6615 0.0644 1.2448 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6607 1.7305 1.8434 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6768 1.4163 0.1017 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0584 0.0922 1.0585 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7819 3.1752 1.0779 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8627 4.3574 1.0773 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3416 4.3959 1.0630 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3829 0.0519 1.0129 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8987 0.0500 1.0361 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6922 1.6241 0.9925 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5238 0.5960 1.8851 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5061 0.6228 0.0937 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 16 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 17 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 18 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 19 1 0 0 0 0 + 9 20 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 21 1 0 0 0 0 + 11 22 1 0 0 0 0 + 11 23 1 0 0 0 0 +M END +> +508.5 + +$$$$ + + CDK 0203121541 + + 25 25 0 0 0 0 0 0 0 0999 V2000 + 2.2129 2.2129 2.2129 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6150 2.2129 2.2129 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2897 3.4229 2.2129 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5986 4.6427 2.2134 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2045 4.6205 2.2098 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5049 3.4186 2.2096 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3926 5.9351 2.2165 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5075 7.1827 2.2230 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2768 5.9759 3.4664 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2702 5.9844 0.9621 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6067 0.9860 2.2148 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1682 1.2670 2.2131 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3875 3.4199 2.2139 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6289 5.5539 2.2075 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4089 3.4283 2.2073 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1210 8.0945 2.2268 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8622 7.2301 1.3355 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8635 7.2219 3.1119 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8774 6.8949 3.4974 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6718 5.9428 4.3815 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9736 5.1273 3.4996 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8697 6.9042 0.9337 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9680 5.1370 0.9202 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6605 5.9561 0.0500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6680 1.1264 2.2143 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 12 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 13 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 7 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 14 1 0 0 0 0 + 6 15 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 16 1 0 0 0 0 + 8 17 1 0 0 0 0 + 8 18 1 0 0 0 0 + 9 19 1 0 0 0 0 + 9 20 1 0 0 0 0 + 9 21 1 0 0 0 0 + 10 22 1 0 0 0 0 + 10 23 1 0 0 0 0 + 10 24 1 0 0 0 0 + 11 25 1 0 0 0 0 +M END +> +512.9 + +$$$$ + + CDK 0203121541 + + 32 31 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5846 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1415 2.4870 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6615 2.4824 1.1091 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2183 3.8968 1.0964 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7371 3.8907 1.1676 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2957 5.3043 1.1428 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8133 5.2948 1.2497 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3629 6.7114 1.2123 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8593 6.8110 1.3396 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5379 7.8250 1.3397 O 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5597 5.6608 1.4707 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6738 0.0500 1.0727 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6666 1.5826 1.9563 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5821 0.1879 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9629 0.5171 1.9538 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9617 0.5198 0.1889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7882 3.0318 0.1740 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7431 3.0506 1.9401 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0169 1.9432 2.0104 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0587 1.9128 0.2449 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8859 4.4263 0.1808 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8020 4.4764 1.9449 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0712 3.3675 2.0863 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1530 3.3052 0.3230 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9839 5.8179 0.2109 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8609 5.8987 1.9717 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1227 4.7876 2.1853 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2459 4.6929 0.4257 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0704 7.2091 0.2647 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9111 7.3175 2.0245 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4880 5.8628 1.5417 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 1 15 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 16 1 0 0 0 0 + 2 17 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 18 1 0 0 0 0 + 3 19 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 20 1 0 0 0 0 + 4 21 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 22 1 0 0 0 0 + 5 23 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 24 1 0 0 0 0 + 6 25 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 26 1 0 0 0 0 + 7 27 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 28 1 0 0 0 0 + 8 29 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 30 1 0 0 0 0 + 9 31 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 12 32 1 0 0 0 0 +M END +> +543.2 + +$$$$ + + CDK 0203121541 + + 32 31 0 0 0 0 0 0 0 0999 V2000 + 3.2439 3.2439 3.2439 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7627 3.2439 3.2439 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2978 4.6672 3.2439 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2946 2.4685 4.4503 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8055 2.2796 4.3392 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2524 1.7603 5.5848 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5598 1.3855 5.7202 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7097 0.9625 6.8475 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5728 1.4856 4.6050 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0186 1.3308 5.0781 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.9124 0.9975 3.8932 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5045 2.5988 5.7615 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8412 2.2242 3.1885 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8393 3.7079 4.1537 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8484 3.8029 2.3860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1106 2.7298 2.3139 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3949 4.6645 3.3577 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0545 5.1913 2.3118 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8837 5.2558 4.0733 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0338 3.0047 5.3855 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7913 1.4838 4.5196 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0656 1.5872 3.5152 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2967 3.2565 4.1250 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3299 0.6972 3.8623 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4538 2.4528 4.0734 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0705 0.4882 5.8110 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9604 0.9011 4.2058 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6222 0.0500 3.4205 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.8712 1.7779 3.1214 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5318 2.4791 6.1296 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5002 3.4581 5.0770 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8739 2.8562 6.6223 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 1 15 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 16 1 0 0 0 0 + 3 17 1 0 0 0 0 + 3 18 1 0 0 0 0 + 3 19 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 20 1 0 0 0 0 + 4 21 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 22 1 0 0 0 0 + 5 23 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 24 1 0 0 0 0 + 9 25 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 26 1 0 0 0 0 + 11 27 1 0 0 0 0 + 11 28 1 0 0 0 0 + 11 29 1 0 0 0 0 + 12 30 1 0 0 0 0 + 12 31 1 0 0 0 0 + 12 32 1 0 0 0 0 +M END +> +467.2 + +$$$$ + + CDK 0203121541 + + 32 31 0 0 0 0 0 0 0 0999 V2000 + 1.0726 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5847 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1413 2.4876 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6613 2.4845 1.0859 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2182 3.8990 1.0921 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7382 3.8912 1.1169 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2935 5.3062 1.1295 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8185 5.2772 1.1668 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2570 6.6308 1.1831 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5984 6.8840 1.1945 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7637 8.0859 1.2112 O 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6548 5.8181 1.1857 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6742 0.0500 1.0724 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6673 1.5824 1.9568 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5828 0.1886 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9638 0.5175 1.9535 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9608 0.5212 0.1879 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7730 3.0372 0.1829 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7545 3.0464 1.9484 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0321 1.9276 1.9700 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0439 1.9317 0.2041 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8597 4.4509 0.1997 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8275 4.4584 1.9659 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0997 3.3319 2.0036 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1263 3.3381 0.2377 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9420 5.8618 0.2367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8980 5.8652 2.0014 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1898 4.7470 2.0656 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2312 4.7529 0.2823 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6584 6.2616 1.2190 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5524 5.1520 2.0528 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5877 5.2055 0.2766 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 1 15 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 16 1 0 0 0 0 + 2 17 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 18 1 0 0 0 0 + 3 19 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 20 1 0 0 0 0 + 4 21 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 22 1 0 0 0 0 + 5 23 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 24 1 0 0 0 0 + 6 25 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 26 1 0 0 0 0 + 7 27 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 28 1 0 0 0 0 + 8 29 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 12 30 1 0 0 0 0 + 12 31 1 0 0 0 0 + 12 32 1 0 0 0 0 +M END +> +484.5 + +$$$$ + + CDK 0203121541 + + 33 32 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5845 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1414 2.4873 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6615 2.4842 1.0885 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2175 3.8990 1.0907 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7374 3.8955 1.1227 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2931 5.3105 1.1267 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8127 5.3066 1.1668 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3669 6.7216 1.1716 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8931 6.6998 1.2136 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3394 8.0363 1.1832 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6741 0.0500 1.0725 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6672 1.5826 1.9565 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5825 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9635 0.5176 1.9537 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9607 0.5207 0.1881 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7739 3.0372 0.1827 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7535 3.0459 1.9481 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0296 1.9313 1.9763 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0463 1.9271 0.2105 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8597 4.4476 0.1961 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8220 4.4601 1.9614 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0960 3.3448 2.0157 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1316 3.3363 0.2501 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9406 5.8587 0.2298 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8926 5.8726 1.9944 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1661 4.7572 2.0628 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2110 4.7446 0.2979 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0154 7.2719 0.2757 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9674 7.2846 2.0389 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2554 6.1948 2.1313 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3024 6.1391 0.3495 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.2858 8.0043 1.2090 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 2 16 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 17 1 0 0 0 0 + 3 18 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 19 1 0 0 0 0 + 4 20 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 21 1 0 0 0 0 + 5 22 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 23 1 0 0 0 0 + 6 24 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 25 1 0 0 0 0 + 7 26 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 27 1 0 0 0 0 + 8 28 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 29 1 0 0 0 0 + 9 30 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 10 32 1 0 0 0 0 + 11 33 1 0 0 0 0 +M END +> +504.1 + +$$$$ + + CDK 0203121541 + + 33 32 0 0 0 0 0 0 0 0999 V2000 + 1.0726 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5847 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1409 2.4878 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6607 2.4863 1.0882 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2150 3.9015 1.0935 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7350 3.8985 1.1231 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2902 5.3134 1.1341 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8097 5.3089 1.1771 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3615 6.7268 1.1939 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8766 6.7168 1.2497 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4772 8.4403 1.2746 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6742 0.0500 1.0725 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 1.5825 1.9569 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5828 0.1885 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9639 0.5184 1.9541 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9619 0.5208 0.1886 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7725 3.0364 0.1821 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7513 3.0473 1.9469 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0304 1.9303 1.9735 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0455 1.9320 0.2084 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8566 4.4511 0.1996 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8210 4.4619 1.9653 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0957 3.3420 2.0118 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1277 3.3443 0.2466 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9403 5.8635 0.2371 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8886 5.8735 2.0026 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1616 4.7516 2.0690 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2118 4.7546 0.3050 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0174 7.2767 0.2940 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9516 7.2835 2.0613 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2248 6.1685 2.1442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2892 6.1722 0.3808 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7631 8.2114 1.3205 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 12 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 2 16 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 17 1 0 0 0 0 + 3 18 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 19 1 0 0 0 0 + 4 20 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 21 1 0 0 0 0 + 5 22 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 23 1 0 0 0 0 + 6 24 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 25 1 0 0 0 0 + 7 26 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 27 1 0 0 0 0 + 8 28 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 29 1 0 0 0 0 + 9 30 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 10 32 1 0 0 0 0 + 11 33 1 0 0 0 0 +M END +> +512.3 + +$$$$ + + CDK 0203121541 + + 33 32 0 0 0 0 0 0 0 0999 V2000 + 1.8414 1.8414 1.8414 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1696 1.8414 1.8414 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9860 3.0802 1.8414 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0194 3.2661 1.2274 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4882 4.0662 2.6418 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1785 5.3161 2.6897 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3190 6.2716 3.5381 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2092 7.4425 3.9693 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6430 8.2149 5.1495 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5381 9.3846 5.5259 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9698 10.1609 6.6925 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0948 6.7313 2.7381 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9128 7.0818 3.6144 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2643 0.9213 1.8175 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2378 2.7454 1.8646 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7506 0.9112 1.8080 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1728 5.1526 3.1480 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3355 5.7147 1.6689 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9775 5.7278 4.4544 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2131 7.0584 4.2487 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3824 8.1272 3.1143 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6180 8.5784 4.9118 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5186 7.5388 6.0196 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5533 9.0171 5.7754 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6692 10.0558 4.6538 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6180 11.0039 6.9639 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9774 10.5706 6.4616 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8614 9.5298 7.5847 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3633 7.5980 2.1009 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7867 5.9328 2.0330 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 7.3911 3.0110 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5949 6.2292 4.2293 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1480 7.9104 4.3025 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 14 1 0 0 0 0 + 1 15 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 16 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 17 1 0 0 0 0 + 6 18 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 12 1 0 0 0 0 + 7 19 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 20 1 0 0 0 0 + 8 21 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 22 1 0 0 0 0 + 9 23 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 24 1 0 0 0 0 + 10 25 1 0 0 0 0 + 11 26 1 0 0 0 0 + 11 27 1 0 0 0 0 + 11 28 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 29 1 0 0 0 0 + 12 30 1 0 0 0 0 + 13 31 1 0 0 0 0 + 13 32 1 0 0 0 0 + 13 33 1 0 0 0 0 +M END +> +489.2 + +$$$$ + + CDK 0203121541 + + 35 34 0 0 0 0 0 0 0 0999 V2000 + 1.0724 1.0724 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5845 1.0724 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1407 2.4874 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6608 2.4866 1.0875 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2134 3.9024 1.0932 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7337 3.9022 1.1215 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2858 5.3183 1.1331 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8055 5.3164 1.1745 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3570 6.7338 1.1919 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8752 6.7191 1.2509 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5199 8.0798 1.2817 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7118 8.3349 1.3273 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7085 9.1623 1.2570 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6738 0.0500 1.0716 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6672 1.5820 1.9568 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6679 1.5833 0.1885 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9639 0.5178 1.9535 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9611 0.5213 0.1878 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7725 3.0367 0.1823 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7521 3.0471 1.9470 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0300 1.9310 1.9732 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0448 1.9327 0.2072 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8537 4.4521 0.2000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8201 4.4619 1.9658 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0954 3.3462 2.0099 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1263 3.3496 0.2442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9340 5.8683 0.2369 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8838 5.8772 2.0022 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1580 4.7588 2.0660 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2069 4.7625 0.3018 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0118 7.2834 0.2933 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9431 7.2891 2.0573 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2183 6.1596 2.1457 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2856 6.1687 0.3790 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2369 9.9545 1.2799 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 14 1 0 0 0 0 + 1 15 1 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 17 1 0 0 0 0 + 2 18 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 19 1 0 0 0 0 + 3 20 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 21 1 0 0 0 0 + 4 22 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 23 1 0 0 0 0 + 5 24 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 25 1 0 0 0 0 + 6 26 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 27 1 0 0 0 0 + 7 28 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 29 1 0 0 0 0 + 8 30 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 31 1 0 0 0 0 + 9 32 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 33 1 0 0 0 0 + 10 34 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 13 1 0 0 0 0 + 13 35 1 0 0 0 0 +M END +> +557.4 + +$$$$ + + CDK 0203121541 + + 35 34 0 0 0 0 0 0 0 0999 V2000 + 1.0726 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5846 1.0726 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1421 2.4871 1.0726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6619 2.4835 1.1098 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2192 3.8977 1.0951 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7378 3.8926 1.1665 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2972 5.3058 1.1367 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8150 5.2969 1.2414 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3633 6.7133 1.1985 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8665 6.8278 1.3081 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5048 7.8637 1.2981 O 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5437 5.6475 1.4278 O 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9509 5.6809 1.5349 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6744 0.0500 1.0727 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6669 1.5829 1.9564 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6678 1.5825 0.1882 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9628 0.5179 1.9543 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9618 0.5199 0.1892 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7866 3.0323 0.1751 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7434 3.0508 1.9400 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0168 1.9454 2.0120 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0594 1.9112 0.2474 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8859 4.4259 0.1790 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8016 4.4787 1.9420 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0717 3.3716 2.0866 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1538 3.3036 0.3243 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9851 5.8162 0.2031 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8614 5.9035 1.9628 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1248 4.7909 2.1775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2437 4.6932 0.4168 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0577 7.2105 0.2550 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9194 7.3181 2.0159 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2027 4.6204 1.6170 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.4183 6.1169 0.6456 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2795 6.2223 2.4285 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 14 1 0 0 0 0 + 1 15 1 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 17 1 0 0 0 0 + 2 18 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 19 1 0 0 0 0 + 3 20 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 21 1 0 0 0 0 + 4 22 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 23 1 0 0 0 0 + 5 24 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 25 1 0 0 0 0 + 6 26 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 27 1 0 0 0 0 + 7 28 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 29 1 0 0 0 0 + 8 30 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 31 1 0 0 0 0 + 9 32 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 33 1 0 0 0 0 + 13 34 1 0 0 0 0 + 13 35 1 0 0 0 0 +M END +> +505 + +$$$$ + + CDK 0203121541 + + 36 35 0 0 0 0 0 0 0 0999 V2000 + 1.0724 1.0724 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5845 1.0724 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1416 2.4871 1.0724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6615 2.4839 1.1117 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2178 3.8986 1.0940 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7362 3.8957 1.1713 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2940 5.3095 1.1366 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8101 5.3075 1.2512 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3701 6.7198 1.1984 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8826 6.7175 1.3480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4316 8.1402 1.2714 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8241 8.0705 1.4777 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6737 0.0500 1.0717 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6669 1.5820 1.9567 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5831 0.1885 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9625 0.5178 1.9542 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9618 0.5197 0.1891 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7874 3.0312 0.1739 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7414 3.0509 1.9389 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0152 1.9490 2.0161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0604 1.9093 0.2516 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8868 4.4231 0.1751 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7972 4.4820 1.9377 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0669 3.3805 2.0957 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1561 3.3023 0.3343 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9861 5.8140 0.1986 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8531 5.9110 1.9569 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1176 4.8119 2.1942 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2502 4.6964 0.4376 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0855 7.2031 0.2420 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9093 7.3394 1.9941 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1699 6.2455 2.3091 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3421 6.0880 0.5599 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2115 8.5942 0.2847 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9634 8.7861 2.0409 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.1508 8.9566 1.4043 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 13 1 0 0 0 0 + 1 14 1 0 0 0 0 + 1 15 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 16 1 0 0 0 0 + 2 17 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 18 1 0 0 0 0 + 3 19 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 20 1 0 0 0 0 + 4 21 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 22 1 0 0 0 0 + 5 23 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 24 1 0 0 0 0 + 6 25 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 26 1 0 0 0 0 + 7 27 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 28 1 0 0 0 0 + 8 29 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 30 1 0 0 0 0 + 9 31 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 32 1 0 0 0 0 + 10 33 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 34 1 0 0 0 0 + 11 35 1 0 0 0 0 + 12 36 1 0 0 0 0 +M END +> +518.2 + +$$$$ + + CDK 0203121541 + + 30 30 0 0 0 0 0 0 0 0999 V2000 + 5.6911 5.6911 5.6911 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0813 5.6911 5.6911 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7774 6.8950 5.6911 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0863 8.1012 5.6844 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6907 8.1067 5.6826 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9874 6.8975 5.6872 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4960 6.8262 5.6627 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8112 6.1811 4.8944 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9068 7.5514 6.6547 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4798 7.6401 6.6803 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1383 8.6714 7.7387 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9872 9.4239 5.6476 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3540 9.8952 4.7245 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1370 10.1260 6.8059 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4285 11.3600 6.9449 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7782 11.9028 8.3170 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1432 4.7410 5.6842 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6265 4.7411 5.6917 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8728 6.8948 5.6933 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6371 9.0488 5.6830 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0949 7.9371 5.6861 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0613 6.6459 6.9235 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 8.7973 7.8012 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4960 8.3778 8.7343 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5746 9.6546 7.5112 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7269 12.0593 6.1414 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3415 11.1714 6.8464 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2568 12.8533 8.4868 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4840 11.2143 9.1202 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8546 12.0903 8.4254 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 17 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 18 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 19 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 20 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 21 1 0 0 0 0 + 10 22 1 0 0 0 0 + 11 23 1 0 0 0 0 + 11 24 1 0 0 0 0 + 11 25 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 26 1 0 0 0 0 + 15 27 1 0 0 0 0 + 16 28 1 0 0 0 0 + 16 29 1 0 0 0 0 + 16 30 1 0 0 0 0 +M END +> +567.2 + +$$$$ + + CDK 0203121541 + + 38 37 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5844 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1418 2.4872 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6616 2.4830 1.0853 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2184 3.8976 1.0911 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7385 3.8908 1.1150 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2969 5.3047 1.1272 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8167 5.2967 1.1620 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3732 6.7111 1.1804 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8978 6.6805 1.2275 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3384 8.0334 1.2496 O 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6800 8.2847 1.2469 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8470 9.4861 1.2749 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.7347 7.2178 1.2123 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6741 0.0500 1.0716 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6668 1.5818 1.9568 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 1.5831 0.1887 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9631 0.5175 1.9537 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9608 0.5208 0.1882 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7733 3.0370 0.1830 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7548 3.0462 1.9481 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0319 1.9250 1.9690 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0435 1.9299 0.2034 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8584 4.4495 0.1994 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8283 4.4566 1.9653 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1012 3.3311 2.0008 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1261 3.3386 0.2351 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9444 5.8584 0.2335 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9011 5.8630 1.9993 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1720 4.7360 2.0503 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2109 4.7440 0.2852 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0284 7.2685 0.2862 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9718 7.2694 2.0501 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2631 6.1494 2.1282 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3161 6.1568 0.3451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7387 7.6606 1.2421 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6400 6.5395 2.0707 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6600 6.6191 0.2946 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 15 1 0 0 0 0 + 1 16 1 0 0 0 0 + 1 17 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 18 1 0 0 0 0 + 2 19 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 20 1 0 0 0 0 + 3 21 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 22 1 0 0 0 0 + 4 23 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 24 1 0 0 0 0 + 5 25 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 26 1 0 0 0 0 + 6 27 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 28 1 0 0 0 0 + 7 29 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 30 1 0 0 0 0 + 8 31 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 32 1 0 0 0 0 + 9 33 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 34 1 0 0 0 0 + 10 35 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 36 1 0 0 0 0 + 14 37 1 0 0 0 0 + 14 38 1 0 0 0 0 +M END +> +517.2 + +$$$$ + + CDK 0203121541 + + 38 37 0 0 0 0 0 0 0 0999 V2000 + 1.0723 1.0723 1.0723 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5843 1.0723 1.0723 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1413 2.4870 1.0723 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6613 2.4836 1.1097 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2172 3.8985 1.0990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7359 3.8942 1.1709 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2936 5.3083 1.1494 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8102 5.3033 1.2567 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3700 6.7162 1.2235 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8847 6.7081 1.3648 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4359 8.1235 1.3165 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9300 8.2244 1.4742 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6093 9.2378 1.4722 O 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6265 7.0761 1.6384 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6735 0.0500 1.0717 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6667 1.5817 1.9566 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6674 1.5826 0.1882 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9626 0.5171 1.9537 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9614 0.5198 0.1886 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7873 3.0321 0.1744 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7433 3.0503 1.9401 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0166 1.9440 2.0107 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0594 1.9150 0.2452 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8844 4.4290 0.1841 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8001 4.4766 1.9480 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0699 3.3694 2.0887 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1529 3.3108 0.3254 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9822 5.8236 0.2185 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8578 5.9008 1.9790 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1221 4.7938 2.1908 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2459 4.7049 0.4313 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0801 7.2156 0.2770 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9156 7.3229 2.0328 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1727 6.2153 2.3148 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3356 6.0935 0.5603 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1639 8.6064 0.3554 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9685 8.7448 2.1082 H 0 0 0 0 0 0 0 0 0 0 0 0 + 14.5531 7.2789 1.7258 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 15 1 0 0 0 0 + 1 16 1 0 0 0 0 + 1 17 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 18 1 0 0 0 0 + 2 19 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 20 1 0 0 0 0 + 3 21 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 22 1 0 0 0 0 + 4 23 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 24 1 0 0 0 0 + 5 25 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 26 1 0 0 0 0 + 6 27 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 28 1 0 0 0 0 + 7 29 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 30 1 0 0 0 0 + 8 31 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 32 1 0 0 0 0 + 9 33 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 34 1 0 0 0 0 + 10 35 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 36 1 0 0 0 0 + 11 37 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 38 1 0 0 0 0 +M END +> +571.9 + +$$$$ + + CDK 0203121541 + + 39 38 0 0 0 0 0 0 0 0999 V2000 + 1.0725 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5846 1.0725 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1391 2.4881 1.0725 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6595 2.4868 1.0856 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2113 3.9031 1.0914 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7370 3.8786 1.1186 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1746 5.2285 1.1157 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5882 5.3551 1.1435 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9020 6.8485 1.1259 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4042 7.0750 1.1774 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7380 8.5577 1.1531 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.2390 8.7895 1.2221 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5726 10.2640 1.1904 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6740 0.0500 1.0727 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6675 1.5830 1.9564 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6677 1.5827 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9642 0.5168 1.9528 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9596 0.5218 0.1868 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7710 3.0375 0.1827 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7530 3.0464 1.9489 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0299 1.9314 1.9707 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0425 1.9341 0.2040 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8529 4.4548 0.1992 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8190 4.4616 1.9648 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1123 3.3545 2.0206 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1438 3.3409 0.2386 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9958 4.8705 2.0532 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0359 4.8413 0.2695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4764 7.3197 0.2172 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4105 7.3555 1.9805 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8278 6.6064 2.0887 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8940 6.5633 0.3244 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3260 9.0233 0.2350 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2368 9.0732 1.9971 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6497 8.3283 2.1423 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7395 8.2705 0.3805 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.6562 10.4289 1.2445 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.2135 10.7404 0.2684 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.1161 10.8008 2.0328 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 14 1 0 0 0 0 + 1 15 1 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 17 1 0 0 0 0 + 2 18 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 19 1 0 0 0 0 + 3 20 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 21 1 0 0 0 0 + 4 22 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 23 1 0 0 0 0 + 5 24 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 25 1 0 0 0 0 + 6 26 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 27 1 0 0 0 0 + 8 28 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 29 1 0 0 0 0 + 9 30 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 10 32 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 33 1 0 0 0 0 + 11 34 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 35 1 0 0 0 0 + 12 36 1 0 0 0 0 + 13 37 1 0 0 0 0 + 13 38 1 0 0 0 0 + 13 39 1 0 0 0 0 +M END +> +498.9 + +$$$$ + + CDK 0203121541 + + 41 40 0 0 0 0 0 0 0 0999 V2000 + 1.0723 1.0723 1.0723 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5845 1.0723 1.0723 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1407 2.4875 1.0723 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6609 2.4870 1.0871 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2148 3.9026 1.0927 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7352 3.9011 1.1204 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2900 5.3163 1.1321 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8100 5.3134 1.1724 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3646 6.7287 1.1899 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8836 6.7259 1.2450 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4337 8.1439 1.2572 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9513 8.1318 1.3313 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5942 9.4934 1.3558 C 0 0 0 0 0 0 0 0 0 0 0 0 + 14.7852 9.7512 1.4091 O 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7808 10.5739 1.3151 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6735 0.0500 1.0715 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6669 1.5818 1.9567 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6676 1.5831 0.1883 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9637 0.5178 1.9536 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9611 0.5210 0.1878 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7724 3.0365 0.1822 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7521 3.0467 1.9471 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0309 1.9308 1.9719 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0450 1.9343 0.2061 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8553 4.4526 0.1997 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8220 4.4619 1.9656 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0973 3.3442 2.0081 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1266 3.3492 0.2422 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9388 5.8673 0.2364 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8899 5.8751 2.0020 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1640 4.7551 2.0626 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2093 4.7611 0.2978 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0202 7.2804 0.2919 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9546 7.2854 2.0567 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2275 6.1738 2.1433 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2936 6.1651 0.3806 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0951 8.6869 0.3521 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0116 8.7051 2.1149 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2860 7.5824 2.2354 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.3713 7.5734 0.4692 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.3072 11.3675 1.3365 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 16 1 0 0 0 0 + 1 17 1 0 0 0 0 + 1 18 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 19 1 0 0 0 0 + 2 20 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 21 1 0 0 0 0 + 3 22 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 23 1 0 0 0 0 + 4 24 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 25 1 0 0 0 0 + 5 26 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 27 1 0 0 0 0 + 6 28 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 29 1 0 0 0 0 + 7 30 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 31 1 0 0 0 0 + 8 32 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 33 1 0 0 0 0 + 9 34 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 35 1 0 0 0 0 + 10 36 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 37 1 0 0 0 0 + 11 38 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 39 1 0 0 0 0 + 12 40 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 15 1 0 0 0 0 + 15 41 1 0 0 0 0 +M END +> +585.3 + +$$$$ + + CDK 0203121541 + + 24 26 0 0 0 0 0 0 0 0999 V2000 + 6.1582 6.1582 6.1582 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5493 6.1582 6.1582 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2432 7.3607 6.1582 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5458 8.5648 6.1578 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1496 8.5756 6.1582 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4493 7.3611 6.1584 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9600 7.3296 6.1578 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2399 8.6335 6.1713 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9395 9.8482 6.1718 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4288 9.8795 6.1572 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8437 8.6444 6.1839 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1453 9.8473 6.1973 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8385 11.0505 6.1980 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2296 11.0508 6.1851 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3511 6.2724 6.1466 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0377 10.9368 6.1452 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6165 5.2033 6.1579 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0941 5.2079 6.1580 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3386 7.3651 6.1582 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1005 9.5123 6.1573 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2895 7.6967 6.1832 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 9.8420 6.2071 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2927 12.0002 6.2086 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7709 12.0059 6.1853 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 17 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 18 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 19 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 20 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 15 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 11 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 14 1 0 0 0 0 + 10 16 2 0 0 0 0 + 11 12 2 0 0 0 0 + 11 21 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 22 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 23 1 0 0 0 0 + 14 24 1 0 0 0 0 +M END +> +653.1 + +$$$$ + + CDK 0203121541 + + 37 37 0 0 0 0 0 0 0 0999 V2000 + 6.0673 6.0673 6.0673 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4536 6.0673 6.0673 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1323 7.2938 6.0673 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4242 8.5020 6.0610 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0361 8.4733 6.0599 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3419 7.2624 6.0731 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8166 7.2444 6.0367 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2987 6.0029 6.7583 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2817 8.4734 6.7743 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4621 7.2635 4.5299 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0231 7.0867 4.0037 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0817 7.3124 2.4841 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4878 5.6761 4.2410 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0484 8.1016 4.5901 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4994 7.2286 6.0707 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5162 5.1137 6.0619 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0106 5.1239 6.0666 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9499 9.4635 6.0555 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4644 9.4145 6.0487 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2007 5.9367 6.7068 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7140 5.0826 6.3158 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5820 6.0129 7.8191 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1818 8.5023 6.7671 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6038 8.4753 7.8242 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6516 9.4055 6.3172 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8448 8.2285 4.1331 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0768 6.4735 4.0462 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0901 7.1983 2.0256 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4408 8.3207 2.2375 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7533 6.5933 1.9966 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5476 5.5114 3.6975 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2023 4.9128 3.9057 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2828 5.4939 5.3076 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0500 7.9973 4.1450 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9390 7.9745 5.6791 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3876 9.1307 4.4107 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8322 8.1174 6.0704 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 1 16 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 17 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 15 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 18 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 19 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 20 1 0 0 0 0 + 8 21 1 0 0 0 0 + 8 22 1 0 0 0 0 + 9 23 1 0 0 0 0 + 9 24 1 0 0 0 0 + 9 25 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 26 1 0 0 0 0 + 10 27 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 11 14 1 0 0 0 0 + 12 28 1 0 0 0 0 + 12 29 1 0 0 0 0 + 12 30 1 0 0 0 0 + 13 31 1 0 0 0 0 + 13 32 1 0 0 0 0 + 13 33 1 0 0 0 0 + 14 34 1 0 0 0 0 + 14 35 1 0 0 0 0 + 14 36 1 0 0 0 0 + 15 37 1 0 0 0 0 +M END +> +563.6 + +$$$$ diff --git a/test/data/cpdb_100.csv b/test/data/cpdb_100.csv new file mode 100644 index 0000000..e691ccc --- /dev/null +++ b/test/data/cpdb_100.csv @@ -0,0 +1,101 @@ +"STRUCTURE_Parent_SMILES ","STRUCTURE_InChI ","ActivityOutcome_CPDBAS_MultiCellCall ","STRUCTURE_Shown ","TestSubstance_ChemicalName ","ActivityScore_CPDBAS_Rat ","TD50_Hamster_mg mg","TD50_Rat_mmol mmol","ActivityOutcome_CPDBAS_SingleCellCall ","TD50_Rat_Note ","STRUCTURE_MolecularWeight ","TD50_Dog_mg mg","TargetSites_Mouse_BothSexes ","DSSTox_CID ","STRUCTURE_ChemicalName_IUPAC ","NTP_TechnicalReport ","TD50_Cynomolgus_mg mg","ActivityOutcome_CPDBAS_Rat ","ActivityOutcome_CPDBAS_Mutagenicity ","ActivityScore_CPDBAS_Mouse ","STRUCTURE_InChIKey ","ChemicalNote ","ActivityOutcome_CPDBAS_MultiCellCall_Details ","TestSubstance_CASRN ","DSSTox_RID ","TargetSites_Mouse_Male ","TD50_Dog_Primates_Note ","STRUCTURE_Formula ","TD50_Rat_mg mg","TestSubstance_Description ","ActivityScore_CPDBAS_Hamster ","Endpoint ","TargetSites_Cynomolgus ","STRUCTURE_TestedForm_DefinedOrganic ","StudyType ","Note_CPDBAS ","TargetSites_Rhesus ","DSSTox_FileID ","TD50_Mouse_mmol mmol","ActivityOutcome_CPDBAS_Dog_Primates ","ChemicalPage_URL ","TD50_Mouse_Note ","ActivityOutcome_CPDBAS_Hamster ","TD50_Mouse_mg mg","STRUCTURE_ChemicalType ","TargetSites_Rat_Male ","TargetSites_Hamster_Female ","TargetSites_Dog ","TargetSites_Mouse_Female ","TargetSites_Hamster_BothSexes ","STRUCTURE_SMILES ","ActivityOutcome_CPDBAS_Mouse ","TargetSites_Rat_BothSexes ","TargetSites_Hamster_Male ","TD50_Hamster_mmol mmol","TD50_Hamster_Note ","Species ","TargetSites_Rat_Female ","DSSTox_Generic_SID ","TD50_Rhesus_mg mg" +"NC1C=CC2=C(N=1)NC3=CC=CC=C23","InChI=1/C11H9N3/c12-10-6-5-8-7-3-1-2-4-9(7)13-11(8)14-10/h1-6H,(H3,12,13,14)/f/h13H,12H2","active","tested chemical","A-alpha-C",blank,blank,blank,"active","blank",183.2122039794922,blank,"blank",1.0,"9H-pyrido[2,3-b]indol-2-amine","blank",blank,"blank","active",35.0,"FJTNLJLPLJDTRM-DXMPFREMCP","blank","multisite active; multisex active","26148-68-5",20001.0,"liver; vascular system","blank","C11H9N3",blank,"single chemical compound",blank,"TD50; Tumor Target Sites","blank","parent","Carcinogenicity","blank","blank","1_CPDBAS_v5d",0.2720000147819519,"blank","http://potency.berkeley.edu/chempages/A-alpha-C.html","TD50 is harmonic mean of more than one positive test","blank",49.79999923706055,"defined organic","blank","blank","blank","liver; vascular system","blank","NC1C=CC2=C(N=1)NC3=CC=CC=C23","active","blank","blank",blank,"blank","mouse","blank",20001.0,blank +"O=S(NC1=O)(OC(C)=C1)=O","InChI=1/C4H5NO4S.K/c1-3-2-4(6)5-10(7,8)9-3;/h2H,1H3,(H,5,6);/q;+1/p-1/fC4H4NO4S.K/q-1;m","inactive","tested chemical","Acesulfame-K",,,,"inactive","",201.24220275878906,,"",10606.0,"potassium 6-methyl-4-oxo-4H-1,2,3-oxathiazin-3-ide 2,2-dioxide","",,"","",0.0,"WBZFUFAFFUEMEI-COHKJUPYCC","parent [33665-90-6]","multisex inactive","55589-62-3",40770.0,"no positive results","","C4H4KNO4S",,"single chemical compound",,"TD50; Tumor Target Sites","","salt K","Carcinogenicity","Mouse added v5a; chemical added v5a","","2_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACESULFAME-K.html","no positive results","",,"defined organic","","","","no positive results","","O=S([N-]C1=O)(OC(C)=C1)=O.[K+]","inactive","","",,"","mouse","",30606.0, +"CC=O","InChI=1/C2H4O/c1-2-3/h2H,1H3","active","tested chemical","Acetaldehyde",20.0,565.0,3.4700000286102295,"active","TD50 is harmonic mean of more than one positive test",44.0526008605957,,"",2.0,"acetaldehyde","",,"active","inactive",,"IKHGUXGNUITLKF-UHFFFAOYAB","","multisite active; multisex active; multispecies active","75-07-0",20002.0,"","","C2H4O",153.0,"single chemical compound",1.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","3_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETALDEHYDE.html","","active",,"defined organic","nasal cavity","oral cavity","","","","CC=O","","","nasal cavity; oral cavity",12.800000190734863,"TD50 is harmonic mean of more than one positive test","rat; hamster","nasal cavity",39224.0, +"CC=NN(C)C=O","InChI=1/C4H8N2O/c1-3-5-6(2)4-7/h3-4H,1-2H3/b5-3+","active","tested chemical","Acetaldehyde methylformylhydrazone",,,,"active","",100.12000274658203,,"",3.0,"N'-[(1E)-ethylidene]-N-methylformic hydrazide","",,"","inactive",46.0,"IMAGWKUTFZRWSB-HWKANZROBR","","multisite active; multisex active","16568-02-8",20003.0,"lung; preputial gland","","C4H8N2O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","4_CPDBAS_v5d",0.025100000202655792,"","http://potency.berkeley.edu/chempages/ACETALDEHYDE%20METHYLFORMYLHYDRAZONE.html","TD50 is harmonic mean of more than one positive test","",2.509999990463257,"defined organic","","","","clitoral gland; lung; stomach","","CC=NN(C)C=O","active","","",,"","mouse","",39225.0, +"CC=NO","InChI=1/C2H5NO/c1-2-3-4/h2,4H,1H3/b3-2+","","tested chemical","Acetaldoxime",0.0,,,"inactive","no positive results",59.06719970703125,,"",4.0,"(1E)-acetaldehyde oxime","",,"inactive","inactive",,"FZENGILVLUJGJX-NSCUHMNNBP","","","107-29-9",20004.0,"","","C2H5NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","5_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETALDOXIME.html","","",,"defined organic","no positive results","","","","","CC=NO","","","",,"","rat","",20004.0, +"CC(=O)N","InChI=1/C2H5NO/c1-2(3)4/h1H3,(H2,3,4)/f/h3H2","active","tested chemical","Acetamide",21.0,,3.049999952316284,"active","TD50 is harmonic mean of more than one positive test",59.06719970703125,,"",5.0,"acetamide","",,"active","inactive",9.0,"DLFVBJFMPXGRIB-ZZOWFUDICC","","multisite active; multisex active; multispecies active","60-35-5",20005.0,"hematopoietic system","","C2H5NO",180.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","6_CPDBAS_v5d",51.0,"","http://potency.berkeley.edu/chempages/ACETAMIDE.html","","",3010.0,"defined organic","liver","","","no positive results","","CC(=O)N","active","","",,"","rat; mouse","liver",20005.0, +"C1(=CC=C(C=C1)O)NC(C)=O","InChI=1/C8H9NO2/c1-6(10)9-7-2-4-8(11)5-3-7/h2-5,11H,1H3,(H,9,10)/f/h9H","active","tested chemical","Acetaminophen",20.0,,3.2699999809265137,"active","TD50 is harmonic mean of more than one positive test",151.16259765625,,"",6.0,"N-(4-hydroxyphenyl)acetamide","TR 394; final call in CPDB differs due to additional data",,"active","inactive",17.0,"RZVAJINKPMORJF-BGGKNDAXCW","","multisite active; multisex active; multispecies active","103-90-2",20006.0,"liver","","C8H9NO2",495.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","7_CPDBAS_v5d",10.699999809265137,"","http://potency.berkeley.edu/chempages/ACETAMINOPHEN.html","TD50 is harmonic mean of more than one positive test","",1620.0,"defined organic","liver; urinary bladder","","","liver","","C1(=CC=C(C=C1)O)NC(C)=O","active","","",,"","rat; mouse","liver; urinary bladder",20006.0, +"O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2","InChI=1/C15H20N2O4S/c1-11(18)12-7-9-14(10-8-12)22(20,21)17-15(19)16-13-5-3-2-4-6-13/h7-10,13H,2-6H2,1H3,(H2,16,17,19)/f/h16-17H","inactive","tested chemical","Acetohexamide",0.0,,,"inactive","no positive results",324.3952941894531,,"",7.0,"4-acetyl-N-[(cyclohexylamino)carbonyl]benzenesulfonamide","TR 050",,"inactive","inactive",0.0,"VGZSUPCWNCWDAN-XQMQJMAZCC","","multisex inactive; multispecies inactive","968-81-0",20007.0,"no positive results","","C15H20N2O4S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","8_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETOHEXAMIDE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2","inactive","","",,"","rat; mouse","no positive results",20007.0, +"C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-]","InChI=1/C10H10N4O3S/c1-6(2)12-13-10-11-5-8(18-10)7-3-4-9(17-7)14(15)16/h3-5H,1-2H3,(H,11,13)/f/h13H","","tested chemical","Acetone[4-(5-nitro-2-furyl)-2-thiazolyl] hydrazone",43.0,,0.022700000554323196,"active","",266.27398681640625,,"",8.0,"propan-2-one [5-(5-nitrofuran-2-yl)-1,3-thiazol-2-yl]hydrazone","",,"active","",,"CUWVNOSSZYUJAE-NDKGDYFDCK","","","18523-69-8",20008.0,"","","C10H10N4O3S",6.050000190734863,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","9_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETONE[4-(5-NITRO-2-FURYL)-2-THIAZOLYL]HYDRAZONE.html","","",,"defined organic","","","","","","C(/C)(C)=N\NC1=NC=C(S1)C2=CC=C(O2)[N+](=O)[O-]","","","",,"","rat","stomach",20008.0, +"CC#N","InChI=1/C2H3N/c1-2-3/h1H3","inactive","tested chemical","Acetonitrile ",0.0,,,"inactive","no positive results",41.05189895629883,,"",9.0,"acetonitrile","TR 447",,"inactive","inactive",0.0,"WEVYAHXRMPXWCK-UHFFFAOYAJ","","multisex inactive; multispecies inactive","75-05-8",20009.0,"no positive results","","C2H3N",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","10_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETONITRILE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","CC#N","inactive","","",,"","rat; mouse","no positive results",20009.0, +"CC(=NO)C","InChI=1/C3H7NO/c1-3(2)4-5/h5H,1-2H3","","tested chemical","Acetoxime",34.0,,0.16599999368190765,"active","",73.09380340576172,,"",10.0,"propan-2-one oxime","",,"active","",,"PXAJQJMDEXJWFB-UHFFFAOYAK","","","127-06-0",20010.0,"","","C3H7NO",12.100000381469727,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","11_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACETOXIME.html","","",,"defined organic","liver","","","","","CC(=NO)C","","","",,"","rat","no positive results",20010.0, +"O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C","InChI=1/C12H12O4/c1-3-10(16-8(2)13)9-4-5-11-12(6-9)15-7-14-11/h3-6,10H,1,7H2,2H3","","tested chemical","1'-Acetoxysafrole",35.0,,0.11400000005960464,"active","TD50 is harmonic mean of more than one positive test",220.22129821777344,,"",11.0,"1-(1,3-benzodioxol-5-yl)prop-2-en-1-yl acetate","",,"active","active",0.0,"TXUCQVJZBXYDKH-UHFFFAOYAY","","","34627-78-6",20011.0,"no positive results","","C12H12O4",25.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","12_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1'-ACETOXYSAFROLE.html","no positive results","",,"defined organic","stomach","","","","","O=C(C)OC(C2=CC1=C(C=C2)OCO1)C=C","inactive","","",,"","rat; mouse","",39226.0, +"N(NC(C)=O)C1=CC=C(C=C1)CO","InChI=1/C9H12N2O2/c1-7(13)10-11-9-4-2-8(6-12)3-5-9/h2-5,11-12H,6H2,1H3,(H,10,13)/f/h10H","active","tested chemical","N'-Acetyl-4-(hydroxymethyl) phenylhydrazine",,,,"active","",180.20599365234375,,"",12.0,"N'-[4-(hydroxymethyl)phenyl]acetohydrazide","",,"","",27.0,"UFFJUAYKLIGSJF-KZFATGLACR","","multisite active; multisex active","65734-38-5",20012.0,"lung; vascular system","","C9H12N2O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","13_CPDBAS_v5d",1.340000033378601,"","http://potency.berkeley.edu/chempages/N'-ACETYL-4-(HYDROXYMETHYL)PHENYLHYDRAZINE.html","TD50 is harmonic mean of more than one positive test","",241.0,"defined organic","","","","lung; vascular system","","N(NC(C)=O)C1=CC=C(C=C1)CO","active","","",,"","mouse","",20012.0, +"N(NC(C)=O)C(C1=CC=NC=C1)=O","InChI=1/C8H9N3O2/c1-6(12)10-11-8(13)7-2-4-9-5-3-7/h2-5H,1H3,(H,10,12)(H,11,13)/f/h10-11H","active","tested chemical","1-Acetyl-2-isonicotinoylhydrazine",,,,"active","",179.17799377441406,,"",13.0,"N'-acetylpyridine-4-carbohydrazide","",,"","",25.0,"CVBGNAKQQUWBQV-PZWAIHAUCF","","multisex active","1078-38-2",20013.0,"lung","","C8H9N3O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","14_CPDBAS_v5d",1.840000033378601,"","http://potency.berkeley.edu/chempages/1-ACETYL-2-ISONICOTINOYLHYDRAZINE.html","TD50 is harmonic mean of more than one positive test","",330.0,"defined organic","","","","lung","","N(NC(C)=O)C(C1=CC=NC=C1)=O","active","","",,"","mouse","",20013.0, +"O=C1C(C(=O)OC(=C1)C)C(=O)C","InChI=1/C8H8O4/c1-4-3-6(10)7(5(2)9)8(11)12-4/h3,7H,1-2H3","inactive","tested chemical","3-Acetyl-6-methyl-2,4-pyrandione",,,,"inactive","",168.1488037109375,,"",14.0,"3-acetyl-6-methyl-2H-pyran-2,4(3H)-dione","",,"","",0.0,"PGRHXDWITVMQBC-UHFFFAOYAH","tautomers","multisex inactive","520-45-6",20014.0,"no positive results","","C8H8O4",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","15_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/3-ACETYL-6-METHYL-2,4-PYRANDIONE.html","no positive results","",,"defined organic","","","","no positive results","","O=C1C(C(=O)OC(=C1)C)C(=O)C","inactive","","",,"","mouse","",20014.0, +"C1(NNC(C)=O)=CC=CC=C1","InChI=1/C8H10N2O/c1-7(11)9-10-8-5-3-2-4-6-8/h2-6,10H,1H3,(H,9,11)/f/h9H","active","tested chemical","1-Acetyl-2-phenylhydrazine",,,,"active","",150.17779541015625,,"",15.0,"N'-phenylacetohydrazide","",,"","active",34.0,"UICBCXONCUFSOI-BGGKNDAXCP","","multisex active","114-83-0",20015.0,"vascular system","","C8H10N2O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","16_CPDBAS_v5d",0.3409999907016754,"","http://potency.berkeley.edu/chempages/1-ACETYL-2-PHENYLHYDRAZINE.html","TD50 is harmonic mean of more than one positive test","",51.20000076293945,"defined organic","","","","vascular system","","C1(NNC(C)=O)=CC=CC=C1","active","","",,"","mouse","",20015.0, +"CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2","InChI=1/C14H13NO/c1-11(16)15-14-9-7-13(8-10-14)12-5-3-2-4-6-12/h2-10H,1H3,(H,15,16)/f/h15H","","tested chemical","4-Acetylaminobiphenyl",49.0,,0.00559999980032444,"active","",211.26280212402344,,"",16.0,"N-biphenyl-4-ylacetamide","",,"active","",,"SVLDILRDQOVJED-YAQRNVERCM","","","4075-79-0",20016.0,"","","C14H13NO",1.1799999475479126,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","17_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-ACETYLAMINOBIPHENYL.html","","",,"defined organic","","","","","","CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2","","","",,"","rat","mammary gland",39243.0, +"CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1","InChI=1/C15H13NO/c1-10(17)16-15-8-4-7-13-12-6-3-2-5-11(12)9-14(13)15/h2-8H,9H2,1H3,(H,16,17)/f/h16H","","tested chemical","1-Acetylaminofluorene",0.0,,,"inactive","no positive results",223.2738037109375,,"",17.0,"N-9H-fluoren-1-ylacetamide","",,"inactive","",,"POECHIXSIXBYKI-WYUMXYHSCQ","","","28314-03-6",20017.0,"","","C15H13NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","18_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-ACETYLAMINOFLUORENE.html","","",,"defined organic","","","","","","CC(=O)NC1=C2CC3=CC=CC=C3C2=CC=C1","","","",,"","rat","no positive results",20017.0, +"C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O","InChI=1/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17)/f/h16H","active","tested chemical","2-Acetylaminofluorene",49.0,17.399999618530273,0.005499999970197678,"active","TD50 is harmonic mean of more than one positive test",223.26980590820312,,"",18.0,"N-9H-fluoren-2-ylacetamide","",,"active","active",45.0,"CZIHNRWJTSTCEX-WYUMXYHSCF","","multisite active; multisex active; multispecies active","53-96-3",20018.0,"liver; urinary bladder","no positive results for Rhesus","C15H13NO",1.2200000286102295,"single chemical compound",53.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","no positive results","19_CPDBAS_v5d",0.03400000184774399,"inactive","http://potency.berkeley.edu/chempages/2-ACETYLAMINOFLUORENE.html","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results","active",7.590000152587891,"defined organic","liver; mammary gland; skin","no positive results","","liver; urinary bladder","","C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O","active","","liver",0.0778999999165535,"","rat; mouse; hamster; rhesus","liver; mammary gland; skin",39227.0, +"C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O","InChI=1/C15H13NO/c1-10(17)16-14-8-4-6-12-9-11-5-2-3-7-13(11)15(12)14/h2-8H,9H2,1H3,(H,16,17)/f/h16H","","tested chemical","4-Acetylaminofluorene",0.0,,,"inactive","no positive results",223.26980590820312,,"",19.0,"N-9H-fluoren-4-ylacetamide","",,"inactive","active",,"PHPWISAFHNEMSR-WYUMXYHSCU","","","28322-02-3",20019.0,"","","C15H13NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","20_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-ACETYLAMINOFLUORENE.html","","",,"defined organic","","","","","","C12C3=C(C=CC=C3)CC1=CC=CC=2NC(C)=O","","","",,"","rat","no positive results",20019.0, +"O=C(O)Cc1ccc(cc1)NC(C)=O","InChI=1/C10H11NO3/c1-7(12)11-9-4-2-8(3-5-9)6-10(13)14/h2-5H,6H2,1H3,(H,11,12)(H,13,14)/f/h11,13H","inactive","tested chemical","4-Acetylaminophenylacetic acid",0.0,,,"inactive","no positive results",193.19920349121094,,"",20.0,"[4-(acetylamino)phenyl]acetic acid","",,"inactive","",0.0,"MROJXXOCABQVEF-KZZMUEETCP","","multisex inactive; multispecies inactive","18699-02-0",20020.0,"no positive results","","C10H11NO3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a; Mouse added v2a","","21_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-ACETYLAMINOPHENYLACETIC%20ACID.html","no positive results","",,"defined organic","no positive results","","","no positive results","","O=C(O)Cc1ccc(cc1)NC(C)=O","inactive","","",,"","rat; mouse","no positive results",20020.0, +"CC(=O)N[C@@H](CS)C(=O)O","InChI=1/C5H9NO3S/c1-3(7)6-4(2-10)5(8)9/h4,10H,2H2,1H3,(H,6,7)(H,8,9)/t4-/m0/s1/f/h6,8H","","tested chemical","N-acetylcysteine",0.0,,,"inactive","no positive results",163.1949005126953,,"",21.0,"N-acetyl-L-cysteine","",,"inactive","",,"PWKSKIMOESPYIA-JVBVHTJODB","stereochem","","616-91-1",20021.0,"","","C5H9NO3S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a","","22_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/N-ACETYLCYSTEINE.html","","",,"defined organic","no positive results","","","","","CC(=O)N[C@@H](CS)C(=O)O","","","",,"","rat","",20021.0, +"OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-]","InChI=1/C14H7ClF3NO5/c15-10-5-7(14(16,17)18)1-4-12(10)24-8-2-3-11(19(22)23)9(6-8)13(20)21/h1-6H,(H,20,21)/f/h20H","active","tested chemical","Acifluorfen",,,,"active","",361.65728759765625,,"",22.0,"5-{[2-chloro-4-(trifluoromethyl)phenyl]oxy}-2-nitrobenzoic acid","",,"","",33.0,"NUFNQYOELLVIPL-UYBDAZJACV","","multisite active; multisex active","50594-66-6",20022.0,"liver; stomach","","C14H7ClF3NO5",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","23_CPDBAS_v5d",0.38999998569488525,"","http://potency.berkeley.edu/chempages/ACIFLUORFEN.html","TD50 is harmonic mean of more than one positive test","",141.0,"defined organic","","","","liver; stomach","","OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-]","active","","",,"","mouse","",20022.0, +"C=CC=O","InChI=1/C3H4O/c1-2-3-4/h2-3H,1H2","inactive","tested chemical","Acrolein ",0.0,,,"inactive","no positive results",56.06330108642578,,"",23.0,"acrylaldehyde","",,"inactive","active",0.0,"HGINCPLSRVDWNT-UHFFFAOYAQ","","multisex inactive; multispecies inactive","107-02-8",20023.0,"no positive results","","C3H4O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","24_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACROLEIN.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C=CC=O","inactive","","",,"","rat; mouse","no positive results",20023.0, +"C=CC(OCC)OCC","InChI=1/C7H14O2/c1-4-7(8-5-2)9-6-3/h4,7H,1,5-6H2,2-3H3","inactive","tested chemical","Acrolein diethylacetal",0.0,,,"inactive","no positive results",130.1864013671875,,"",24.0,"3,3-bis(ethyloxy)prop-1-ene","",,"inactive","",,"MCIPQLOKVXSHTD-UHFFFAOYAI","","multisex inactive","3054-95-3",20024.0,"","","C7H14O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","25_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACROLEIN%20DIETHYLACETAL.html","","",,"defined organic","no positive results","","","","","C=CC(OCC)OCC","","","",,"","rat","no positive results",20024.0, +"C=C/C=N/O","InChI=1/C3H5NO/c1-2-3-4-5/h2-3,5H,1H2/b4-3+","inactive","tested chemical","Acrolein oxime",0.0,,,"inactive","no positive results",71.07859802246094,,"",25.0,"(1E)-prop-2-enal oxime","",,"inactive","",,"KMNIXISXZFPRDC-ONEGZZNKBI","","multisex inactive","5314-33-0",20025.0,"","","C3H5NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","26_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACROLEIN%20OXIME.html","","",,"defined organic","no positive results","","","","","C=C/C=N/O","","","",,"","rat","no positive results",20025.0, +"CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O","InChI=1/C20H19NO3/c1-20(2)10-9-13-15(24-20)11-16(23-4)17-18(13)21(3)14-8-6-5-7-12(14)19(17)22/h5-11H,1-4H3","active","tested chemical","Acronycine",55.0,,0.0015999999595806003,"active","positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test",321.36981201171875,,"",26.0,"3,3,12-trimethyl-6-(methyloxy)-3,12-dihydro-7H-pyrano[2,3-c]acridin-7-one","TR 49",,"active","",0.0,"SMPZPKRDRQOOHT-UHFFFAOYAD","","multisite active; multisex active","7008-42-6",20026.0,"NTP bioassay inadequate","","C20H19NO3",0.5049999952316284,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","ActivityOutcome_CPDBAS_Mouse modified v5d","","27_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACRONYCINE.html","only experiment is NCI NTP bioassay inadequate","",,"defined organic","bone; peritoneal cavity","","","NTP bioassay inadequate","","CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O","unspecified","","",,"","rat; mouse","mammary gland; peritoneal cavity",20026.0, +"NC(=O)C=C","InChI=1/C3H5NO/c1-2-3(4)5/h2H,1H2,(H2,4,5)/f/h4H2","active","tested chemical","Acrylamide ",39.0,,0.052799999713897705,"active","TD50 is harmonic mean of more than one positive test",71.0779037475586,,"",27.0,"acrylamide","",,"active","inactive",,"HRPVXLWXLXDGHG-LGEMBHMGCJ","","multisite active; multisex active","79-06-1",20027.0,"","","C3H5NO",3.75,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat modified v3a","","28_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACRYLAMIDE.html","","",,"defined organic","nervous system; peritoneal cavity; thyroid gland","","","","","NC(=O)C=C","","","",,"","rat","clitoral gland; mammary gland; nervous system; oral cavity; thyroid gland; uterus",20027.0, +"OC(=O)C=C","InChI=1/C3H4O2/c1-2-3(4)5/h2H,1H2,(H,4,5)/f/h4H","inactive","tested chemical","Acrylic acid",0.0,,,"inactive","no positive results",72.06269836425781,,"",28.0,"acrylic acid","",,"inactive","inactive",,"NIXOWILDQLNWCW-JLSKMEETCA","","multisex inactive","79-10-7",20028.0,"","","C3H4O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","29_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACRYLIC%20ACID.html","","",,"defined organic","no positive results","","","","","OC(=O)C=C","","","",,"","rat","no positive results",39229.0, +"C=CC#N","InChI=1/C3H3N/c1-2-3-4/h2H,1H2","active","tested chemical","Acrylonitrile ",31.0,,0.3179999887943268,"active","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results",53.062599182128906,,"",29.0,"acrylonitrile","",,"active","active",39.0,"NLHHRLWOUZZQLW-UHFFFAOYAG","","multisite active; multisex active","107-13-1",20029.0,"harderian gland; stomach","","C3H3N",16.899999618530273,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Mouse added v5a","","30_CPDBAS_v5d",0.11900000274181366,"","http://potency.berkeley.edu/chempages/ACRYLONITRILE.html","TD50 is harmonic mean of more than one positive test","",6.320000171661377,"defined organic","ear Zymbals gland; nervous system; oral cavity; small intestine; stomach","","","harderian gland; stomach","","C=CC#N","active","","",,"","rat; mouse","ear Zymbals gland; mammary gland; nasal cavity; nervous system; oral cavity; small intestine; stomach",20029.0, +"O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N","InChI=1/C63H88N12O16/c1-17-31(8)44-61(86)75-25-19-21-38(75)59(84)71(14)27-40(77)73(16)50(30(6)7)63(88)90-35(12)46(57(82)67-44)69-55(80)41-42(64)51(78)33(10)53-48(41)65-47-36(23-22-32(9)52(47)91-53)54(79)68-45-34(11)89-62(87)49(29(4)5)72(15)39(76)26-70(13)58(83)37-20-18-24-74(37)60(85)43(28(2)3)66-56(45)81/h22-23,28-31,34-35,37-38,43-46,49-50H,17-21,24-27,64H2,1-16H3,(H,66,81)(H,67,82)(H,68,79)(H,69,80)/t31-,34+,35+,37-,38-,43+,44+,45-,46-,49-,50-/m0/s1/f/h66-69H","","representative component in mixture","Actinomycin C",0.0,,,"inactive","no positive results",1269.443603515625,,"",30.0,"2-amino-4,6-dimethyl-3-oxo-N~9~-[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-N~1~-{(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6-(1-methylethyl)","",,"inactive","",,"QCXJFISCRQIYID-IFORFJDKDU","mixture of actinomycin C1 [50-76-0] (10%), actinomycin C2 [2612-14-8] (45%), and actinomycin C3 [6156-47-4] (45%), structure shown C2, stereochem","","8052-16-2",20030.0,"","","C63H88N12O16",,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","31_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACTINOMYCIN%20C.html","","",,"defined organic","no positive results","","","","","O=C(N[C@@H]([C@H](OC([C@@H]5[C@@H](C)C)=O)C)C(N[C@H]([C@@H](C)CC)C(N4CCC[C@@](C(N(C)CC(N5C)=O)=O)4[H])=O)=O)C(C(C(OC2=C(C)C=C3)=C(C)C1=O)=NC2=C3C(N[C@@H]([C@H](OC([C@@H]7[C@H](C)C)=O)C)C(N[C@H](C(C)C)C(N6CCC[C@@](C(N(C)CC(N7C)=O)=O)6[H])=O)=O)=O)=C1N","","","",,"","rat","",20030.0, +"C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C","InChI=1/C62H86N12O16/c1-27(2)42-59(84)73-23-17-19-36(73)57(82)69(13)25-38(75)71(15)48(29(5)6)61(86)88-33(11)44(55(80)65-42)67-53(78)35-22-21-31(9)51-46(35)64-47-40(41(63)50(77)32(10)52(47)90-51)54(79)68-45-34(12)89-62(87)49(30(7)8)72(16)39(76)26-70(14)58(83)37-20-18-24-74(37)60(85)43(28(3)4)66-56(45)81/h21-22,27-30,33-34,36-37,42-45,48-49H,17-20,23-26,63H2,1-16H3,(H,65,80)(H,66,81)(H,67,78)(H,68,79)/t33-,34-,36+,37+,42-,43-,44+,45+,48+,49+/m1/s1/f/h65-68H","active","tested chemical","Actinomycin D",88.0,,0.0,"active","positive test results only by intraperitoneal or intravenous injection; TD50 is harmonic mean of more than one positive test",1255.4169921875,,"",31.0,"2-amino-4,6-dimethyl-3-oxo-N,N'-bis[(6S,9R,10S,13R,18aS)-2,5,9-trimethyl-6,13-bis(1-methylethyl)-1,4,7,11,14-pentaoxohexadecahydro-1H-pyrrolo[2,1-i][1,4,7,10,13]oxatetraazacyclohexadecin-10-yl]-3H-phenoxazine-1,9-dicarboxamide","",,"active","inactive",,"RJURFGZVJUQBHK-HQANWYOLDQ","stereochem","multisex active","50-76-0",20031.0,"","","C62H86N12O16",0.0010999999940395355,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat_Note modified v5a","","32_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ACTINOMYCIN%20D.html","","",,"defined organic","peritoneal cavity","","","","","C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C","","","",,"","rat","peritoneal cavity",20031.0, +"NC(=O)CCCCC(=O)N","InChI=1/C6H12N2O2/c7-5(9)3-1-2-4-6(8)10/h1-4H2,(H2,7,9)(H2,8,10)/f/h7-8H2","inactive","tested chemical","Adipamide",0.0,,,"inactive","no positive results",144.1717071533203,,"",32.0,"hexanediamide","",,"inactive","inactive",0.0,"GVNWZKBFMFUVNX-UNXFWZPKCL","","multisex inactive; multispecies inactive","628-94-4",20032.0,"no positive results","","C6H12N2O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","33_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ADIPAMIDE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","NC(=O)CCCCC(=O)N","inactive","","",,"","rat; mouse","no positive results",20032.0, +"O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1","InChI=1/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14)/b8-6-/f/h12H2","active","tested chemical","AF-2",35.0,164.0,0.11800000071525574,"active","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results",248.1916046142578,,"",33.0,"(2Z)-2-(furan-2-yl)-3-(5-nitrofuran-2-yl)prop-2-enamide","",,"active","active",31.0,"LYAHJFZLDZDIOH-SDXKRDFODJ","stereochem","multisite active; multisex active; multispecies active","3688-53-7",20033.0,"stomach","","C11H8N2O5",29.399999618530273,"single chemical compound",30.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","structure modified v5b","","34_CPDBAS_v5d",0.527999997138977,"","http://potency.berkeley.edu/chempages/AF-2.html","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results","active",131.0,"defined organic","mammary gland","stomach","","stomach","","O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1","active","","esophagus; stomach",0.6610000133514404,"TD50 is harmonic mean of more than one positive test","rat; mouse; hamster","mammary gland",20033.0, +"O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC","InChI=1/C17H14O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8-9,17-18H,2-3H2,1H3/t8-,9+,17-/m0/s1","","tested chemical","Aflatoxicol",78.0,,0.0,"active","",314.29400634765625,,"",34.0,"(1R,6aS,9aS)-1-hydroxy-4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromen-11(1H)-one","",,"active","active",,"WYIWLDSPNDMZIT-BTKFHORUBM","stereochem","","29611-03-8",20034.0,"","","C17H14O6",0.0024999999441206455,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","35_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AFLATOXICOL.html","","",,"defined organic","liver","","","","","O=C(O2)C([C@@H](CC3)O)=C3C1=C2C4=C(O[C@@]5([H])[C@]([H])4C=CO5)C=C1OC","","","",,"","rat","",20034.0, +"C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC","InChI=1/C17H12O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8,17H,2-3H2,1H3","active","tested chemical","Aflatoxin B1",77.0,,0.0,"active","TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable; greater than ten-fold variation among TD50 values for positive results",312.2735900878906,,"",35.0,"4-(methyloxy)-2,3,6a,9a-tetrahydrocyclopenta[c]furo[3',2':4,5]furo[2,3-h]chromene-1,11-dione","",0.020099999383091927,"active","active",0.0,"OQIQSTLJSLGHID-UHFFFAOYAB","","multisite active; multisex active; multispecies active","1162-65-8",20035.0,"no positive results","Tree Shrew (TD50=0.0269; Target Sites=liver)","C17H12O6",0.0031999999191612005,"single chemical compound",,"TD50; Tumor Target Sites","gall bladder; liver; vascular system","parent","Carcinogenicity","TD50_Rat_Note modified v5a","gall bladder; liver; vascular system","36_CPDBAS_v5d",,"active","http://potency.berkeley.edu/chempages/AFLATOXIN%20B1.html","no positive results","",,"defined organic","kidney; large intestine; liver","","","no positive results","","C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC","inactive","","",,"","rat; mouse; rhesus; cynomolgus; tree shrew","large intestine; liver",20035.0,0.008200000040233135 +"O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1","InChI=1/C17H12O7/c1-20-9-6-10-12(8-3-5-22-17(8)23-10)14-11(9)7-2-4-21-15(18)13(7)16(19)24-14/h3,5-6,8,17H,2,4H2,1H3","active","representative component in mixture","Aflatoxin, crude",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",328.27301025390625,,"",36.0,"5-(methyloxy)-3,4,7a,10a-tetrahydro-1H,12H-furo[3',2':4,5]furo[2,3-h]pyrano[3,4-c]chromene-1,12-dione","",,"active","",50.0,"XWIYFDMXXLINPU-UHFFFAOYAD","mixture of aflatoxins, structure shown G1 [1165-39-5]","multisite active; multispecies active","1402-68-2",20036.0,"hematopoietic system","","C17H12O7",0.003000000026077032,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture","","37_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AFLATOXIN,%20CRUDE.html","","",0.34299999475479126,"defined organic","liver","","","","","O=C1C(C(OCC5)=O)=C5C(C(OC)=C4)=C(C2=C4OC3C2C=CO3)O1","active","","",,"","rat; mouse","",20036.0, +"","InChI=1//","inactive","no structure","Agar",0.0,,,"inactive","no positive results",,,"",,"","TR 230",,"inactive","",0.0,"MOSFIJXAXDLOML-UHFFFAOYAM","","multisex inactive; multispecies inactive","9002-18-0",20037.0,"no positive results","","",,"mixture or formulation",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","38_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AGAR.html","no positive results","",,"no structure","no positive results","","","no positive results","","","inactive","","",,"","rat; mouse","no positive results",20037.0, +"C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl","InChI=1/C11H11ClO3/c1-2-5-15-10-4-3-8(6-9(10)12)7-11(13)14/h2-4,6H,1,5,7H2,(H,13,14)/f/h13H","inactive","tested chemical","Alclofenac",0.0,,,"inactive","no positive results",226.6562042236328,,"",38.0,"[3-chloro-4-(prop-2-en-1-yloxy)phenyl]acetic acid","",,"inactive","",,"ARHWPKZXBHOEEE-NDKGDYFDCL","","multisex inactive","22131-79-9",20038.0,"","","C11H11ClO3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a","","39_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALCLOFENAC.html","","",,"defined organic","no positive results","","","","","C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl","","","",,"","rat","no positive results",20038.0, +"CC(C=NOC(=O)NC)(SC)C","InChI=1/C7H14N2O2S/c1-7(2,12-4)5-9-11-6(10)8-3/h5H,1-4H3,(H,8,10)/b9-5+/f/h8H","inactive","tested chemical","Aldicarb",0.0,,,"inactive","no positive results",190.2633056640625,,"",39.0,"(1E)-2-methyl-2-(methylthio)propanal O-[(methylamino)carbonyl]oxime","TR 136",,"inactive","inactive",0.0,"QGLZXHRNAYXIBU-RVKZGWQMDN","","multisex inactive; multispecies inactive","116-06-3",20039.0,"no positive results","","C7H14N2O2S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","40_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALDICARB.html","no positive results","",,"defined organic","no positive results","","","no positive results","","CC(C=NOC(=O)NC)(SC)C","inactive","","",,"","rat; mouse","no positive results",39223.0, +"ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2","InChI=1/C12H8Cl6/c13-8-9(14)11(16)7-5-2-1-4(3-5)6(7)10(8,15)12(11,17)18/h1-2,4-7H,3H2","","tested chemical","Aldrin",0.0,,,"active","no positive results",364.909912109375,,"liver",40.0,"1,2,3,4,10,10-hexachloro-1,4,4a,5,8,8a-hexahydro-1,4:5,8-dimethanonaphthalene","TR 21; final call in CPDB differs due to additional data",,"inactive","inactive",56.0,"QBYJBZPUGVGKQQ-UHFFFAOYAT","stereochem","","309-00-2",20040.0,"liver","","C12H8Cl6",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","41_CPDBAS_v5d",0.0035000001080334187,"","http://potency.berkeley.edu/chempages/ALDRIN.html","TD50 is harmonic mean of more than one positive test","",1.2699999809265137,"defined organic","no positive results","","","","","ClC(C(Cl)(Cl)C43Cl)(C(Cl)=C4Cl)C1C3C2C=CC1C2","active","","",,"","rat; mouse","no positive results",20040.0, +"O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)(O)=O","InChI=1/C18H30O3S.Na/c1-3-4-5-6-7-8-9-10-11-16(2)17-12-14-18(15-13-17)22(19,20)21;/h12-16H,3-11H2,1-2H3,(H,19,20,21);/q;+1/p-1/fC18H29O3S.Na/q-1;m","inactive","representative isomer in mixture","Alkylbenzenesulfonate, linear",0.0,,,"inactive","no positive results",348.4757995605469,,"",41.0,"sodium 4-(dodecan-2-yl)benzenesulfonate","",,"inactive","",,"GHRHULTYHYEOQB-MFZBKVKLCJ","mixture of C10-13 alkylbenzenesulfonates average 11.6; with phenyl attachment varying in apprpx equal amounts between C-2,3,4,5 or 6; structure shown C12 attached at C2","multisex inactive","42615-29-2",20041.0,"","","C18H29NaO3S",,"mixture or formulation",,"TD50; Tumor Target Sites","","salt Na","Carcinogenicity","structure modified v5b","","42_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALKYLBENZENESULFONATE,%20LINEAR.html","","",,"defined organic","no positive results","","","","","O=S(C1=CC=C(C(C)CCCCCCCCCC)C=C1)([O-])=O.[Na+]","","","",,"","rat","no positive results",20041.0, +"[O-][N+](C)(C)CCCCCCCCCC","InChI=1/C12H27NO/c1-4-5-6-7-8-9-10-11-12-13(2,3)14/h4-12H2,1-3H3","inactive","representative isomer in mixture","Alkyldimethylamine oxides, commercial grade",0.0,,,"inactive","no positive results",201.34890747070312,,"",42.0,"decyl(dimethyl)amine oxide","",,"inactive","",,"ZRKZFNZPJKEWPC-UHFFFAOYAU","mixture, C10-16 [70592-80-2], C12-18 [68955-55-5], C12-16 [68439-70-3], C14-18 [68390-99-8], structure shown C-12","multisex inactive","NOCAS",20042.0,"","","C12H27NO",,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","43_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALKYLDIMETHYLAMINE%20OXIDES,%20COMMERCIAL%20GRADE.html","","",,"defined organic","no positive results","","","","","[O-][N+](C)(C)CCCCCCCCCC","","","",,"","rat","no positive results",20042.0, +"O=C1C(NC(=O)N1)NC(=O)N","InChI=1/C4H6N4O3/c5-3(10)6-1-2(9)8-4(11)7-1/h1H,(H3,5,6,10)(H2,7,8,9,11)/f/h6-8H,5H2","inactive","tested chemical","Allantoin",0.0,,,"inactive","no positive results",158.11639404296875,,"",43.0,"1-(2,5-dioxoimidazolidin-4-yl)urea","",,"inactive","",,"POJWUDADGALRAB-BANUENCFCI","","multisex inactive","97-59-6",20043.0,"","","C4H6N4O3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","44_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLANTOIN.html","","",,"defined organic","no positive results","","","","","O=C1C(NC(=O)N1)NC(=O)N","","","",,"","rat","no positive results",20043.0, +"C=CCO","InChI=1/C3H6O/c1-2-3-4/h2,4H,1,3H2","inactive","tested chemical","Allyl alcohol",0.0,,,"inactive","no positive results",58.0791015625,,"",44.0,"prop-2-en-1-ol","",,"inactive","inactive",,"XXROGKLTLUQVRX-UHFFFAOYAC","","multisex inactive","107-18-6",20044.0,"","","C3H6O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Mutagenicity_SAL_CPDB added v3a","","45_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLYL%20ALCOHOL.html","","",,"defined organic","no positive results","","","","","C=CCO","","","",,"","rat","no positive results",20044.0, +"C=CCCl","InChI=1/C3H5Cl/c1-2-3-4/h2H,1,3H2","inactive","tested chemical","Allyl chloride",0.0,,,"inactive","only experiment is NCI NTP bioassay inadequate",76.5248031616211,,"",45.0,"3-chloroprop-1-ene","TR 73",,"unspecified","active",0.0,"OSDWBNJEKMUWAV-UHFFFAOYAQ","","multisex inactive","107-05-1",20045.0,"no positive results","","C3H5Cl",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","ActivityOutcome_CPDBAS_Mouse modified v5d","","46_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLYL%20CHLORIDE.html","no positive results","",,"defined organic","NTP bioassay inadequate","","","no positive results","","C=CCCl","inactive","","",,"","rat; mouse","NTP bioassay inadequate",39231.0, +"C=CCOCC1CO1","InChI=1/C6H10O2/c1-2-3-7-4-6-5-8-6/h2,6H,1,3-5H2","","tested chemical","Allyl glycidyl ether",0.0,,,"active","no positive results",114.14240264892578,,"",46.0,"2-[(allyloxy)methyl]oxirane","TR 376",,"inactive","active",26.0,"LSWYGACWGAICNM-UHFFFAOYAR","","","106-92-3",20046.0,"nasal cavity","","C6H10O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","47_CPDBAS_v5d",1.590000033378601,"","http://potency.berkeley.edu/chempages/ALLYL%20GLYCIDYL%20ETHER.html","","",182.0,"defined organic","no positive results","","","no positive results","","C=CCOCC1CO1","active","","",,"","rat; mouse","no positive results",39232.0, +"C=CCN=C=S","InChI=1/C4H5NS/c1-2-3-5-4-6/h2H,1,3H2","","tested chemical","Allyl isothiocyanate",26.0,,0.9679999947547913,"active","",99.1541976928711,,"",47.0,"3-isothiocyanatoprop-1-ene","TR 234",,"active","active",0.0,"ZOJBYZNEUISWFT-UHFFFAOYAS","","","57-06-7",20047.0,"no positive results","","C4H5NS",96.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","48_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALLYL%20ISOTHIOCYANATE.html","no positive results","",,"defined organic","urinary bladder","","","no positive results","","C=CCN=C=S","inactive","","",,"","rat; mouse","no positive results",20047.0, +"O=C(CC(C)C)OCC=C","InChI=1/C8H14O2/c1-4-5-10-8(9)6-7(2)3/h4,7H,1,5-6H2,2-3H3","active","tested chemical","Allyl isovalerate",26.0,,0.8650000095367432,"active","",142.1956024169922,,"",48.0,"allyl 3-methylbutanoate","TR 253",,"active","inactive",32.0,"HOMAGVUCNZNWBC-UHFFFAOYAF","","multisex active; multispecies active","2835-39-4",20048.0,"no positive results","","C8H14O2",123.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","49_CPDBAS_v5d",0.44200000166893005,"","http://potency.berkeley.edu/chempages/ALLYL%20ISOVALERATE.html","","",62.79999923706055,"defined organic","hematopoietic system","","","hematopoietic system","","O=C(CC(C)C)OCC=C","active","","",,"","rat; mouse","no positive results",39233.0, +"NC(=O)N(CC=C)N=O","InChI=1/C4H7N3O2/c1-2-3-7(6-9)4(5)8/h2H,1,3H2,(H2,5,8)/f/h5H2","active","tested chemical","1-Allyl-1-nitrosourea",52.0,,0.0026000000070780516,"active","TD50 is harmonic mean of more than one positive test",129.11819458007812,,"",49.0,"1-nitroso-1-prop-2-en-1-ylurea","",,"active","",,"WBBDVRPSJSJSPC-GLFQYTTQCA","","multisite active; multisex active","760-56-5",20049.0,"","","C4H7N3O2",0.3409999907016754,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","50_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-ALLYL-1-NITROSOUREA.html","","",,"defined organic","large intestine; lung; stomach","","","","","NC(=O)N(CC=C)N=O","","","",,"","rat","mammary gland; stomach; uterus",20049.0, +"C=CCNN","InChI=1/C3H8N2.ClH/c1-2-3-5-4;/h2,5H,1,3-4H2;1H","active","tested chemical","Allylhydrazine.HCl",,,,"active","",108.57050323486328,,"",50.0,"prop-2-en-1-ylhydrazine hydrochloride","",,"","",34.0,"PWGPATVPEGLIAN-UHFFFAOYAO","parent [7422-78-8]","multisite active; multisex active","52207-83-7",20050.0,"lung","","C3H9ClN2",,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","51_CPDBAS_v5d",0.3149999976158142,"","http://potency.berkeley.edu/chempages/ALLYLHYDRAZINE.HCl.html","TD50 is harmonic mean of more than one positive test","",34.20000076293945,"defined organic","","","","lung; vascular system","","C=CCNN.HCl","active","","",,"","mouse","",20050.0, +"","InChI=1/Al.K.2H2O4S/c;;2*1-5(2,3)4/h;;2*(H2,1,2,3,4)/q+3;+1;;/p-4/fAl.K.2O4S/q2m;2*-2","inactive","tested chemical","Aluminum potassium sulfate",0.0,,,"inactive","no positive results",258.18670654296875,,"",51.0,"aluminum potassium sulfate","",,"inactive","",0.0,"GRLPQNLYRHEGIJ-MHPHYJPNCZ","","multisex inactive; multispecies inactive","10043-67-1",20051.0,"no positive results","","AlKO8S2",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","52_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ALUMINUM%20POTASSIUM%20SULFATE.html","no positive results","",,"inorganic","no positive results","","","no positive results","","O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+]","inactive","","",,"","rat; mouse","no positive results",39234.0, +"O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N","InChI=1/C14H7Br2NO2/c15-8-5-9(16)12(17)11-10(8)13(18)6-3-1-2-4-7(6)14(11)19/h1-5H,17H2","active","tested chemical","1-Amino-2,4-dibromoanthraquinone",35.0,,0.12099999934434891,"active","TD50 is harmonic mean of more than one positive test",381.0188903808594,,"",52.0,"1-amino-2,4-dibromo-9,10-anthraquinone","TR 383",,"active","active",27.0,"ZINRVIQBCHAZMM-UHFFFAOYAC","","multisite active; multisex active; multispecies active","81-49-2",20052.0,"liver; lung; stomach","","C14H7Br2NO2",46.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","53_CPDBAS_v5d",1.25,"","http://potency.berkeley.edu/chempages/1-AMINO-2,4-DIBROMOANTHRAQUINONE.html","TD50 is harmonic mean of more than one positive test","",477.0,"defined organic","kidney; large intestine; liver; urinary bladder","","","liver; lung; stomach","","O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N","active","","",,"","rat; mouse","kidney; large intestine; liver; urinary bladder",39235.0, +"NC1=C(C=CC(=C1)NC(=O)C)OCC","InChI=1/C10H14N2O2/c1-3-14-10-5-4-8(6-9(10)11)12-7(2)13/h4-6H,3,11H2,1-2H3,(H,12,13)/f/h12H","","tested chemical","3-Amino-4-ethoxyacetanilide",0.0,,,"active","no positive results",194.2303924560547,,"",53.0,"N-[3-amino-4-(ethyloxy)phenyl]acetamide","TR 112",,"inactive","active",17.0,"XTXFAVHDQCHWCS-XWKXFZRBCV","","","17026-81-2",20053.0,"thyroid gland","","C10H14N2O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","54_CPDBAS_v5d",10.699999809265137,"","http://potency.berkeley.edu/chempages/3-AMINO-4-ETHOXYACETANILIDE.html","","",2070.0,"defined organic","no positive results","","","no positive results","","NC1=C(C=CC(=C1)NC(=O)C)OCC","active","","",,"","rat; mouse","no positive results",20053.0, +"CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N)","InChI=1/C14H14N2.ClH/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16;/h3-9H,2,15H2,1H3;1H","active","tested chemical","3-Amino-9-ethylcarbazole.HCl",32.0,,0.23199999332427979,"active","TD50 is harmonic mean of more than one positive test",246.7353057861328,,"",54.0,"9-ethyl-9H-carbazol-3-amine hydrochloride","TR 93",,"active","active",37.0,"UUYSTZWIFZYHRM-UHFFFAOYAB","parent [132-32-1]","multisite active; multisex active; multispecies active","6109-97-3",20054.0,"liver","","C14H15ClN2",57.20000076293945,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","55_CPDBAS_v5d",0.15600000321865082,"","http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE.HCl.html","TD50 is harmonic mean of more than one positive test","",38.599998474121094,"defined organic","ear Zymbals gland; liver; skin","","","liver","","CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl","active","","",,"","rat; mouse","ear Zymbals gland; liver; uterus",20054.0, +"CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N)","InChI=1/C14H14N2/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16/h3-9H,2,15H2,1H3","active","representative component in mixture","3-Amino-9-ethylcarbazole mixture",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",210.27439880371094,,"",55.0,"9-ethyl-9H-carbazol-3-amine","TR 93",,"active","active",50.0,"OXEUETBFKVCRNP-UHFFFAOYAV","mixture, structure shown 3-Amino-9-ethylcarbazole [132-32-1]","multisite active; multisex active; multispecies active","NOCAS",20055.0,"liver","","C14H15N2",26.399999618530273,"mixture or formulation",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture","","56_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/3-AMINO-9-ETHYLCARBAZOLE%20MIXTURE.html","TD50 is harmonic mean of more than one positive test","",38.0,"defined organic","ear Zymbals gland; liver; skin","","","liver","","CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N)","active","","",,"","rat; mouse","ear Zymbals gland",20055.0, +"N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1","InChI=1/C9H14N8S3/c10-6-7(17-20-16-6)13-1-2-18-3-5-4-19-9(14-5)15-8(11)12/h4H,1-3H2,(H2,10,16)(H,13,17)(H4,11,12,14,15)/f/h11,13,15H,10,12H2","active","tested chemical","3-Amino-4-[2-[(2-guanidinothiazol-4-yl)methylthio], ethylamino]-1,2,5-thiadiazole",14.0,,15.100000381469727,"active","TD50 is harmonic mean of more than one positive test",330.4560852050781,,"",56.0,"1-{4-[({2-[(4-amino-1,2,5-thiadiazol-3-yl)amino]ethyl}sulfanyl)methyl]-1,3-thiazol-2-yl}guanidine","",,"active","",,"MOMKQYRYLQUFMV-GVMYFUFNCD","BL-6341","multisex active","78441-84-6",20056.0,"","","C9H14N8S3",4990.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v2a; CPDB lists HCl complex in some instances in tables but referenced study for this chemical does not specify HCl complex - parent is assumed correct","","57_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/3-AMINO-4-[2-[(2-GUANIDINOTHIAZOL-4-YL)METHYLTHIO].html","","",,"defined organic","stomach","","","","","N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1","","","",,"","rat","stomach",39236.0, +"O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N","InChI=1/C15H11NO2/c1-8-6-7-11-12(13(8)16)15(18)10-5-3-2-4-9(10)14(11)17/h2-7H,16H2,1H3","active","tested chemical","1-Amino-2-methylanthraquinone",32.0,,0.25,"active","TD50 is harmonic mean of more than one positive test",237.2532958984375,,"",57.0,"1-amino-2-methylanthracene-9,10-dione","TR 111",,"active","active",30.0,"ZLCUIOWQYBYEBG-UHFFFAOYAP","C.I. 60700","multisite active; multisex active; multispecies active","82-28-0",20057.0,"no positive results","","C15H11NO2",59.20000076293945,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","58_CPDBAS_v5d",0.7329999804496765,"","http://potency.berkeley.edu/chempages/1-AMINO-2-METHYLANTHRAQUINONE.html","","",174.0,"defined organic","kidney; liver","","","liver","","O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N","active","","",,"","rat; mouse","liver",20057.0, +"O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N","InChI=1/C6H4N4O4/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2","active","tested chemical","2-Amino-5-(5-nitro-2-furyl)-1,3,4-oxadiazole",44.0,,0.018699999898672104,"active","",196.1219940185547,,"",58.0,"5-(5-nitrofuran-2-yl)-1,3,4-oxadiazol-2-amine","",,"active","",,"VTWQUFUBSCXPOW-IAUQMDSZCD","","multisite active","3775-55-1",20058.0,"","","C6H4N4O4",3.6700000762939453,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","59_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-OXADIAZOLE.html","","",,"defined organic","","","","","","O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N","","","",,"","rat","kidney; lung; mammary gland; stomach",20058.0, +"NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1","InChI=1/C6H4N4O3S/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)/f/h7H2","active","tested chemical","2-Amino-5-(5-nitro-2-furyl)-1,3,4-thiadiazole",52.0,,0.003100000089034438,"active","",212.18260192871094,,"",59.0,"5-(5-nitrofuran-2-yl)-1,3,4-thiadiazol-2-amine","",,"active","",,"SXZZHGJWUBJKHH-IAUQMDSZCG","","multisite active","712-68-5",20059.0,"","","C6H4N4O3S",0.6620000004768372,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","60_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-(5-NITRO-2-FURYL)-1,3,4-THIADIAZOLE.html","","",,"defined organic","","","","","","NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1","","","",,"","rat","kidney; lung; mammary gland; stomach",20059.0, +"NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1","InChI=1/C7H5N3O3S/c8-7-9-4(3-14-7)5-1-2-6(13-5)10(11)12/h1-3H,(H2,8,9)/f/h8H2","active","tested chemical","2-Amino-4-(5-nitro-2-furyl)thiazole",42.0,,0.027699999511241913,"active","",211.19479370117188,,"",60.0,"4-(5-nitrofuran-2-yl)-1,3-thiazol-2-amine","",,"active","active",44.0,"ZAVLMIGIVYJYMU-FSHFIPFOCT","","multisite active; multispecies active","38514-71-5",20060.0,"","","C7H5N3O3S",5.849999904632568,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","61_CPDBAS_v5d",0.037300001829862595,"","http://potency.berkeley.edu/chempages/2-AMINO-4-(5-NITRO-2-FURYL)THIAZOLE.html","","",7.869999885559082,"defined organic","","","","stomach","","NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1","active","","",,"","rat; mouse","stomach; urinary bladder",39237.0, +"NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1","InChI=1/C8H6N4O4/c9-8-10-6(11-16-8)3-1-5-2-4-7(15-5)12(13)14/h1-4H,(H2,9,10,11)/b3-1+/f/h9H2","active","tested chemical","trans-5-Amino-3[2-(5-nitro-2-furyl)vinyl]-1,2,4-oxadiazole",,,,"active","",222.15980529785156,,"",61.0,"3-[(E)-2-(5-nitrofuran-2-yl)ethenyl]-1,2,4-oxadiazol-5-amine","",,"","",32.0,"RMZNNIOKNRDECR-OYGOROAMDP","stereochem","multisite active; multisex active","28754-68-9",20061.0,"hematopoietic system; stomach","","C8H6N4O4",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","62_CPDBAS_v5d",0.5040000081062317,"","http://potency.berkeley.edu/chempages/trans-5-AMINO-3[2-(5-NITRO-2-FURYL)VINYL]-1,2,4-OX.html","TD50 is harmonic mean of more than one positive test","",112.0,"defined organic","","","","hematopoietic system; stomach","","NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1","active","","",,"","mouse","",20061.0, +"O=[N+](C1=CC(=C(C=C1)O)N)[O-]","InChI=1/C6H6N2O3/c7-5-3-4(8(10)11)1-2-6(5)9/h1-3,9H,7H2","","tested chemical","2-Amino-4-nitrophenol",18.0,,5.440000057220459,"active","",154.12339782714844,,"",62.0,"2-amino-4-nitrophenol","TR 339",,"active","active",0.0,"VLZVIIYRNMWPSN-UHFFFAOYAN","","","99-57-0",20062.0,"no positive results","","C6H6N2O3",839.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","63_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-4-NITROPHENOL.html","no positive results","",,"defined organic","kidney","","","no positive results","","O=[N+](C1=CC(=C(C=C1)O)N)[O-]","inactive","","",,"","rat; mouse","no positive results",20062.0, +"O=[N+](C1=CC(=C(C=C1)N)O)[O-]","InChI=1/C6H6N2O3/c7-5-2-1-4(8(10)11)3-6(5)9/h1-3,9H,7H2","","tested chemical","2-Amino-5-nitrophenol",27.0,,0.7200000286102295,"active","",154.12339782714844,,"",63.0,"2-amino-5-nitrophenol","TR 334",,"active","active",0.0,"DOPJTDJKZNWLRB-UHFFFAOYAU","","","121-88-0",20063.0,"no positive results","","C6H6N2O3",111.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","64_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-NITROPHENOL.html","no positive results","",,"defined organic","pancreas","","","no positive results","","O=[N+](C1=CC(=C(C=C1)N)O)[O-]","inactive","","",,"","rat; mouse","no positive results",20063.0, +"OC1=C(C=C(C=C1)N)[N+](=O)[O-]","InChI=1/C6H6N2O3/c7-4-1-2-6(9)5(3-4)8(10)11/h1-3,9H,7H2","","tested chemical","4-Amino-2-nitrophenol",23.0,,2.0,"active","",154.12339782714844,,"",64.0,"4-amino-2-nitrophenol","TR 94",,"active","active",0.0,"WHODQVWERNSQEO-UHFFFAOYAM","","","119-34-6",20064.0,"no positive results","","C6H6N2O3",309.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","65_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-AMINO-2-NITROPHENOL.html","no positive results","",,"defined organic","urinary bladder","","","no positive results","","OC1=C(C=C(C=C1)N)[N+](=O)[O-]","inactive","","",,"","rat; mouse","no positive results",20064.0, +"NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1","InChI=1/C9H7N3O2S/c10-9-11-8(5-15-9)6-1-3-7(4-2-6)12(13)14/h1-5H,(H2,10,11)/f/h10H2","","tested chemical","2-Amino-4-(p-nitrophenyl)thiazole",,,,"active","",221.2332000732422,,"",65.0,"4-(4-nitrophenyl)-1,3-thiazol-2-amine","",,"","",43.0,"RIKJWJIWXCUKQV-GIMVELNWCN","","","2104-09-8",20065.0,"","","C9H7N3O2S",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","66_CPDBAS_v5d",0.04500000178813934,"","http://potency.berkeley.edu/chempages/2-AMINO-4-(p-NITROPHENYL)THIAZOLE.html","","",9.949999809265137,"defined organic","","","","hematopoietic system","","NC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1","active","","",,"","mouse","",39238.0, +"O=[N+](C1=CN=C(S1)N)[O-]","InChI=1/C3H3N3O2S/c4-3-5-1-2(9-3)6(7)8/h1H,(H2,4,5)/f/h4H2","active","tested chemical","2-Amino-5-nitrothiazole",31.0,,0.3070000112056732,"active","",145.13980102539062,,"",66.0,"5-nitro-1,3-thiazol-2-amine","TR 53; final call in CPDB differs due to additional data; NTP-assigned level of evidence of carcinogenicity is "positive" in male rat; noting that "these experiments were particularly difficult to evaluate".",,"active","active",0.0,"MIHADVKEHAFNPG-LGEMBHMGCP","","multisite active","121-66-4",20066.0,"no positive results","","C3H3N3O2S",44.599998474121094,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TargetSites_Rat_Male modified v5d","","67_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-NITROTHIAZOLE.html","no positive results","",,"defined organic","no positive results - CPDB evaluation based on NCI Technical Report","","","no positive results","","O=[N+](C1=CN=C(S1)N)[O-]","inactive","","",,"","rat; mouse","kidney; lung; mammary gland",20066.0, +"NC1=NC(C(C2=CC=CC=C2)O1)=O","InChI=1/C9H8N2O2.Mg.2H2O/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;;;/h1-5,7H,(H2,10,11,12);;2*1H2/q;+2;;/p-2/fC9H8N2O2.Mg.2HO/h10H2;;2*1h/q;m;2*-1/rC9H8N2O2.H2MgO2/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;2-1-3/h1-5,7H,(H2,10,11,12);2-3H/f/h10H2;","","tested chemical","2-Amino-5-phenyl-2-oxazolin-4-one + Mg(OH)2",0.0,,,"inactive","no positive results",234.49400329589844,,"",67.0,"2-amino-5-phenyl-1,3-oxazol-4(5H)-one - dihydroxymagnesium (1:1)","",,"inactive","",,"JOPOQPCBCUIPFX-VWMXNRJTCY","parent [2152-34-3]","","18968-99-5",20067.0,"","","C9H10MgN2O4",,"single chemical compound",,"TD50; Tumor Target Sites","","complex Mg(OH)2","Carcinogenicity","","","68_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2-AMINO-5-PHENYL-2-OXAZOLIN-4-ONE%20+%20Mg(OH)2.html","","",,"defined organic","","","","","","NC1=NC(C(C2=CC=CC=C2)O1)=O.O[Mg]O","","","",,"","rat","no positive results",20067.0, +"O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N","InChI=1/C14H9NO2/c15-8-5-6-11-12(7-8)14(17)10-4-2-1-3-9(10)13(11)16/h1-7H,15H2","active","tested chemical","2-Aminoanthraquinone ",29.0,,0.4519999921321869,"active","",223.226806640625,,"",68.0,"2-amino-9,10-anthraquinone","TR 144",,"active","active",20.0,"XOGPDSATLSAZEK-UHFFFAOYAH","","multisite active; multisex active; multispecies active","117-79-3",20068.0,"liver","","C14H9NO2",101.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","69_CPDBAS_v5d",5.329999923706055,"","http://potency.berkeley.edu/chempages/2-AMINOANTHRAQUINONE.html","TD50 is harmonic mean of more than one positive test","",1190.0,"defined organic","liver","","","hematopoietic system; liver","","O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N","active","","",,"","rat; mouse","no positive results",20068.0, +"CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C","InChI=1/C14H15N3/c1-10-5-3-4-6-14(10)17-16-12-7-8-13(15)11(2)9-12/h3-9H,15H2,1-2H3/b17-16+","active","tested chemical","o-Aminoazotoluene",44.0,,0.017899999395012856,"active","TD50 is harmonic mean of more than one positive test",225.28900146484375,,"",69.0,"2-methyl-4-[(E)-(2-methylphenyl)diazenyl]aniline","",,"active","active",0.0,"PFRYFZZSECNQOL-WUKNDPDIBU","","multisex active","97-56-3",20069.0,"no positive results","","C14H15N3",4.039999961853027,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","70_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/o-AMINOAZOTOLUENE.html","no positive results","",,"defined organic","liver","","","","","CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C","inactive","","",,"","rat; mouse","liver",20069.0, +"OC(=O)CCCCCN","InChI=1/C6H13NO2/c7-5-3-1-2-4-6(8)9/h1-5,7H2,(H,8,9)/f/h8H","","tested chemical","6-Aminocaproic acid",0.0,,,"inactive","no positive results",131.1741943359375,,"",70.0,"6-aminohexanoic acid","",,"inactive","",,"SLXKOJJOQWFEFD-FZOZFQFYCD","","","60-32-2",20070.0,"","","C6H13NO2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","71_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/6-AMINOCAPROIC%20ACID.html","","",,"defined organic","no positive results","","","","","OC(=O)CCCCCN","","","",,"","rat","",20070.0, +"NC1=CC=C(C=C1)C2=CC=CC=C2","InChI=1/C12H11N/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10/h1-9H,13H2","active","tested chemical","4-Aminodiphenyl",,,,"active","",169.22239685058594,,"",71.0,"biphenyl-4-amine","",,"","active",50.0,"DMVOXQPQNTYEKQ-UHFFFAOYAX","","multisite active; multisex active","92-67-1",20071.0,"liver; urinary bladder","","C12H11N",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","72_CPDBAS_v5d",0.012400000356137753,"","http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.html","TD50 is harmonic mean of more than one positive test","",2.0999999046325684,"defined organic","","","","liver; urinary bladder","","NC1=CC=C(C=C1)C2=CC=CC=C2","active","","",,"","mouse","",20071.0, +"NC1(=CC=C(C=C1)C2=CC=CC=C2)","InChI=1/C12H11N.ClH/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10;/h1-9H,13H2;1H","","tested chemical","4-Aminodiphenyl.HCl",50.0,,0.004800000227987766,"active","",205.68649291992188,,"",72.0,"biphenyl-4-amine hydrochloride","",,"active","active",,"GUHXYHYUBFCYGJ-UHFFFAOYAT","parent [92-67-1]","","2113-61-3",20072.0,"","","C12H12ClN",0.9800000190734863,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","73_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/4-AMINODIPHENYL.HCl.html","","",,"defined organic","","","","","","NC1(=CC=C(C=C1)C2=CC=CC=C2).[H]Cl","","","",,"","rat","mammary gland",20072.0, +"NC3=CC1=C(C=C3)OC2=C1C=CC=C2","InChI=1/C12H9NO/c13-8-5-6-12-10(7-8)9-3-1-2-4-11(9)14-12/h1-7H,13H2","active","tested chemical","2-Aminodiphenylene oxide",,,,"active","",183.20919799804688,,"",73.0,"dibenzo[b,d]furan-2-amine","",,"","",47.0,"FFYZMBQLAYDJIG-UHFFFAOYAK","","multisite active; multisex active","3693-22-9",20073.0,"liver; urinary bladder","","C12H9NO",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","74_CPDBAS_v5d",0.023099999874830246,"","http://potency.berkeley.edu/chempages/2-AMINODIPHENYLENE%20OXIDE.html","TD50 is harmonic mean of more than one positive test; harmonic mean of TD50 includes a value for upper 99% confidence limit from study with 100% tumor incidence but no lifetable","",4.239999771118164,"defined organic","","","","liver","","NC3=CC1=C(C=C3)OC2=C1C=CC=C2","active","","",,"","mouse","",39239.0, +"NCC1(CC(=O)O)CCCCC1","InChI=1/C9H17NO2/c10-7-9(6-8(11)12)4-2-1-3-5-9/h1-7,10H2,(H,11,12)/f/h11H","","tested chemical","1-(Aminomethyl)cyclohexaneacetic acid",10.0,,34.20000076293945,"active","",171.23880004882812,,"",74.0,"[1-(aminomethyl)cyclohexyl]acetic acid","",,"active","",,"UGJMXCAKCUNAIE-WXRBYKJCCG","","","60142-96-3",20074.0,"","","C9H17NO2",5850.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","Rat added v3a","","75_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-(AMINOMETHYL)CYCLOHEXANEACETIC%20ACID.html","","",,"defined organic","pancreas","","","","","NCC1(CC(=O)O)CCCCC1","","","",,"","rat","no positive results",20074.0, +"OCCN(CCO)c1ccc(N)cc1","InChI=1/C10H16N2O2.H2O4S/c11-9-1-3-10(4-2-9)12(5-7-13)6-8-14;1-5(2,3)4/h1-4,13-14H,5-8,11H2;(H2,1,2,3,4)/f/h;1-2H","inactive","tested chemical","2,2'-[(4-Aminophenyl)imino]bisethanol sulfate",0.0,,,"inactive","no positive results",294.32470703125,,"",75.0,"2,2'-[(4-aminophenyl)imino]diethanol sulfate (salt)","",,"inactive","",,"KMCFMEHSEWDYKG-ATDHBCBACR","parent [7575-35-1]","multisex inactive","54381-16-7",20075.0,"","","C10H18N2O6S",,"single chemical compound",,"TD50; Tumor Target Sites","","complex H2SO4","Carcinogenicity","Rat added v2a","","76_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/2,2'-[(4-AMINOPHENYL)IMINO]BISETHANOL%20SULFATE.html","","",,"defined organic","no positive results","","","","","OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1","","","",,"","rat","no positive results",20075.0, +"C1(N=CNN=1)N","InChI=1/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6)/f/h5H,3H2","active","tested chemical","3-Aminotriazole",35.0,,0.11800000071525574,"active","TD50 is harmonic mean of more than one positive test",84.08000183105469,,"",76.0,"1H-1,2,4-triazol-3-amine","",,"active","inactive",34.0,"KLSJWNVTNUYHDU-YPUDGCQOCD","tautomers","multisite active; multisex active; multispecies active","61-82-5",20076.0,"liver","","C2H4N4",9.9399995803833,"single chemical compound",0.0,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","77_CPDBAS_v5d",0.3009999990463257,"","http://potency.berkeley.edu/chempages/3-AMINOTRIAZOLE.html","TD50 is harmonic mean of more than one positive test","inactive",25.299999237060547,"defined organic","thyroid gland","no positive results","","liver","","C1(N=CNN=1)N","active","","no positive results",,"no positive results","rat; mouse; hamster","pituitary gland; thyroid gland",20076.0, +"OC(=O)CCCCCCCCCCN","InChI=1/C11H23NO2/c12-10-8-6-4-2-1-3-5-7-9-11(13)14/h1-10,12H2,(H,13,14)/f/h13H","active","tested chemical","11-Aminoundecanoic acid",18.0,,5.460000038146973,"active","",201.30580139160156,,"",77.0,"11-aminoundecanoic acid","TR 216",,"active","inactive",0.0,"GUOSQNAUYHMCRU-NDKGDYFDCZ","","multisite active","2432-99-7",20077.0,"no positive results","","C11H23NO2",1100.0,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","78_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/11-AMINOUNDECANOIC%20ACID.html","no positive results","",,"defined organic","liver; urinary bladder","","","no positive results","","OC(=O)CCCCCCCCCCN","inactive","","",,"","rat; mouse","no positive results",20077.0, +"","InChI=1/ClH.H3N/h1H;1H3/fCl.H4N/h1h;1H/q-1;+1","","tested chemical","Ammonium chloride",,,,"inactive","",53.49150085449219,,"",78.0,"ammonium chloride","",,"","",0.0,"NLXLAEXVIDQMFP-DWOZJLMICO","","","12125-02-9",20078.0,"","","H4ClN",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","79_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMMONIUM%20CHLORIDE.html","no positive results","",,"inorganic","","","","no positive results","","[H][N+]([H])([H])[H].[Cl-]","inactive","","",,"","mouse","",20078.0, +"C(CC(O)=O)(CC(O)=O)(C(O)=O)O","InChI=1/C6H8O7.2H3N/c7-3(8)1-6(13,5(11)12)2-4(9)10;;/h13H,1-2H2,(H,7,8)(H,9,10)(H,11,12);2*1H3/fC6H6O7.2H4N/h7H;2*1H/q-2;2*+1","","tested chemical","Ammonium citrate",0.0,,,"inactive","no positive results",226.18580627441406,,"",79.0,"diammonium 2-(carboxymethyl)-2-hydroxybutanedioate","",,"inactive","",,"YXVFQADLFFNVDS-JYGIMERMCP","parent [77-92-9]","","3012-65-5",20079.0,"","","C6H14N2O7",,"single chemical compound",,"TD50; Tumor Target Sites","","complex 2NH4","Carcinogenicity","","","80_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMMONIUM%20CITRATE.html","","",,"defined organic","no positive results","","","","","C(CC([O-])=O)(CC(O)=O)(C([O-])=O)O.[N+].[N+]","","","",,"","rat","",20079.0, +"","InChI=1/H3N.H2O/h1H3;1H2/fH4N.HO/h1H;1h/q+1;-1","inactive","tested chemical","Ammonium hydroxide",,,,"inactive","",35.045799255371094,,"",80.0,"ammonium hydroxide","",,"","",0.0,"VHUUQVKOLVNVRT-QBBVKLOVCT","","multisex inactive","1336-21-6",20080.0,"no positive results","","H5NO",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","81_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMMONIUM%20HYDROXIDE.html","no positive results","",,"inorganic","","","","no positive results","","[N+].[O-]","inactive","","",,"","mouse","",20080.0, +"N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O","InChI=1/C11H18N2O3/c1-4-11(6-5-7(2)3)8(14)12-10(16)13-9(11)15/h7H,4-6H2,1-3H3,(H2,12,13,14,15,16)/f/h12-13H","","tested chemical","Amobarbital",0.0,,,"inactive","no positive results",226.27479553222656,,"",81.0,"5-ethyl-5-(3-methylbutyl)pyrimidine-2,4,6(1H,3H,5H)-trione","",,"inactive","",,"VIROVYVQCGLCII-BAINRFMOCW","","","57-43-2",20081.0,"","","C11H18N2O3",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","82_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMOBARBITAL.html","","",,"defined organic","no positive results","","","","","N1C(=O)C(CC)(CCC(C)C)C(=O)NC1=O","","","",,"","rat","",20081.0, +"C1=CC=CC=C1CC(N)C","InChI=1/2C9H13N.H2O4S/c2*1-8(10)7-9-5-3-2-4-6-9;1-5(2,3)4/h2*2-6,8H,7,10H2,1H3;(H2,1,2,3,4)/f/h;;1-2H","inactive","tested chemical","dl-Amphetamine sulfate",0.0,,,"inactive","no positive results",368.49090576171875,,"",82.0,"1-phenylpropan-2-amine sulfate (2:1)","TR 387",,"inactive","inactive",0.0,"PYHRZPFZZDCOPH-IPLSSONACD","racemic mixture of L- [51-62-7] and D- [51-63-8], parent [300-62-9], structure shown without stereochem","multisex inactive; multispecies inactive","60-13-9",20082.0,"no positive results","","C18H28N2O4S",,"single chemical compound",,"TD50; Tumor Target Sites","","complex bis H2SO4","Carcinogenicity","","","83_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/dl-AMPHETAMINE%20SULFATE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C","inactive","","",,"","rat; mouse","no positive results",20082.0, +"[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O","InChI=1/C16H19N3O4S.3H2O/c1-16(2)11(15(22)23)19-13(21)10(14(19)24-16)18-12(20)9(17)8-6-4-3-5-7-8;;;/h3-7,9-11,14H,17H2,1-2H3,(H,18,20)(H,22,23);3*1H2/t9-,10-,11+,14-;;;/m1.../s1/f/h18,22H;;;","inactive","tested chemical","Ampicillin trihydrate",0.0,,,"inactive","no positive results",403.4505920410156,,"",83.0,"(2S,5R,6R)-6-{[(2R)-2-amino-2-phenylacetyl]amino}-3,3-dimethyl-7-oxo-4-thia-1-azabicyclo[3.2.0]heptane-2-carboxylic acid trihydrate","TR 318",,"inactive","inactive",0.0,"RXDALBZNGVATNY-FQLIROBNDT","stereochem; parent [69-53-4]","multisex inactive; multispecies inactive","7177-48-2",20083.0,"no positive results","","C16H25N3O7S",,"single chemical compound",,"TD50; Tumor Target Sites","","complex 3H2O","Carcinogenicity","structure modified v5b","","84_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMPICILLIN%20TRIHYDRATE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O","inactive","","",,"","rat; mouse","no positive results",20083.0, +"O=C(N(CCCCC)N=O)N","InChI=1/C6H13N3O2/c1-2-3-4-5-9(8-11)6(7)10/h2-5H2,1H3,(H2,7,10)/f/h7H2","active","tested chemical","1-Amyl-1-nitrosourea",51.0,,0.0035000001080334187,"active","TD50 is harmonic mean of more than one positive test",159.18760681152344,,"",84.0,"1-nitroso-1-pentylurea","",,"active","",,"YYTNAQDGJQPZFU-IAUQMDSZCI","","multisite active; multisex active","10589-74-9",20084.0,"","","C6H13N3O2",0.5550000071525574,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","TD50_Rat modified v5a","","85_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/1-AMYL-1-NITROSOUREA.html","","",,"defined organic","hematopoietic system; lung; stomach","","","","","O=C(N(CCCCC)N=O)N","","","",,"","rat","hematopoietic system; lung; mammary gland; stomach; uterus",20084.0, +"","InChI=1//","","no structure","Amylopectin sulfate",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",,,"",,"","",,"active","",,"MOSFIJXAXDLOML-UHFFFAOYAM","non-linear polymer of glucose (Merck - amylopectic)","","9047-13-6",20085.0,"","","",283.0,"macromolecule",,"TD50; Tumor Target Sites","","","Carcinogenicity","TD50_Rat_mmol and TD50_Mouse_mmol conversions from mg values not provided due substance being a mixture","","86_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/AMYLOPECTIN%20SULFATE.html","","",,"no structure","large intestine","","","","","","","","",,"","rat","",20085.0, +"C/C=C/C1=CC=C(C=C1)OC","InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3+","inactive","tested chemical","trans-Anethole",0.0,,,"inactive","no positive results",148.2017059326172,,"",87.0,"1-(methyloxy)-4-[(1E)-prop-1-en-1-yl]benzene","",,"inactive","inactive",0.0,"RUVINXPYWBROJD-ONEGZZNKBR","stereochem","multisex inactive","4180-23-8",20087.0,"","","C10H12O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","88_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/trans-ANETHOLE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C/C=C/C1=CC=C(C=C1)OC","inactive","","",,"","rat","no positive results",20087.0, +"C/C=C/C1=CC=C(C=C1)OC","InChI=1/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3+","inactive","tested chemical","trans-Anethole",0.0,,,"inactive","no positive results",148.2017059326172,,"",87.0,"1-(methyloxy)-4-[(1E)-prop-1-en-1-yl]benzene","",,"inactive","inactive",0.0,"RUVINXPYWBROJD-ONEGZZNKBR","stereochem","multisex inactive","4180-23-8",20087.0,"","","C10H12O",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","88_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/trans-ANETHOLE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C/C=C/C1=CC=C(C=C1)OC","inactive","","",,"","rat","no positive results",20087.0, +"O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2","InChI=1/C8H11Cl3O6/c9-8(10,11)7-16-5-3(14)4(2(13)1-12)15-6(5)17-7/h2-7,12-14H,1H2/t2-,3+,4-,5-,6-,7-/m1/s1","inactive","tested chemical","Anhydroglucochloral",,,,"inactive","",309.5282897949219,,"",88.0,"1,2-O-[(1R)-2,2,2-trichloroethylidene]-alpha-D-glucofuranose","",,"","",0.0,"OJYGBLRPYBAHRT-IPQSZEQABF","Chlorlose-alpha, stereochem","multisex inactive","15879-93-3",20088.0,"no positive results","","C8H11Cl3O6",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","structure modified v5b","","89_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANHYDROGLUCOCHLORAL.html","no positive results","",,"defined organic","","","","no positive results","","O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2","inactive","","",,"","mouse","",20088.0, +"ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl","InChI=1/C9H5Cl3N4/c10-5-3-1-2-4-6(5)13-9-15-7(11)14-8(12)16-9/h1-4H,(H,13,14,15,16)/f/h13H","inactive","tested chemical","Anilazine",0.0,,,"inactive","no positive results",275.52178955078125,,"",89.0,"4,6-dichloro-N-(2-chlorophenyl)-1,3,5-triazin-2-amine","TR 104",,"inactive","inactive",0.0,"IMHBYKMAHXWHRP-NDKGDYFDCD","","multisex inactive; multispecies inactive","101-05-3",20089.0,"no positive results","","C9H5Cl3N4",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","90_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANILAZINE.html","no positive results","",,"defined organic","no positive results","","","no positive results","","ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl","inactive","","",,"","rat; mouse","no positive results",20089.0, +"NC1=CC=CC=C1","InChI=1/C6H7N/c7-6-4-2-1-3-5-6/h1-5H,7H2","","tested chemical","Aniline",0.0,,,"inactive","no positive results",93.12650299072266,,"",90.0,"aniline","",,"inactive","inactive",,"PAYRUJLWNCNPSJ-UHFFFAOYAP","","","62-53-3",20090.0,"","","C6H7N",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","91_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANILINE.html","","",,"defined organic","no positive results","","","","","NC1=CC=CC=C1","","","",,"","rat","",20090.0, +"NC1=CC=CC=C1","InChI=1/C6H7N.ClH/c7-6-4-2-1-3-5-6;/h1-5H,7H2;1H","active","tested chemical","Aniline.HCl",22.0,,2.0799999237060547,"active","TD50 is harmonic mean of more than one positive test; greater than ten-fold variation among TD50 values for positive results",129.58740234375,,"",91.0,"aniline hydrochloride","TR 130",,"active","inactive",0.0,"MMCPOSDMTGQNKG-UHFFFAOYAJ","parent [62-53-3]","multisite active; multisex active","142-04-1",20091.0,"no positive results","","C6H8ClN",269.0,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","92_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANILINE.HCl.html","no positive results","",,"defined organic","peritoneal cavity; spleen; vascular system","","","no positive results","","NC1=CC=CC=C1[H]Cl","inactive","","",,"","rat; mouse","peritoneal cavity",20091.0, +"C1(=C(C=CC=C1)N)OC","InChI=1/C7H9NO.ClH/c1-9-7-5-3-2-4-6(7)8;/h2-5H,8H2,1H3;1H","active","tested chemical","o-Anisidine.HCl",33.0,,0.1860000044107437,"active","TD50 is harmonic mean of more than one positive test",159.6134033203125,,"",92.0,"2-methoxyaniline hydrochloride","TR 89",,"active","active",19.0,"XCZCWGVXRBJCCD-UHFFFAOYAX","parent [90-04-0]","multisite active; multisex active; multispecies active","134-29-2",20092.0,"urinary bladder","","C7H10ClNO",29.700000762939453,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","93_CPDBAS_v5d",6.050000190734863,"","http://potency.berkeley.edu/chempages/o-ANISIDINE.HCl.html","TD50 is harmonic mean of more than one positive test","",966.0,"defined organic","kidney; thyroid gland; urinary bladder","","","urinary bladder","","C1(=C(C=CC=C1)N)OC.[H]Cl","active","","",,"","rat; mouse","urinary bladder",20092.0, +"C1(=CC=C(N)C=C1)OC","InChI=1/C7H9NO.ClH/c1-9-7-4-2-6(8)3-5-7;/h2-5H,8H2,1H3;1H","inactive","tested chemical","p-Anisidine.HCl",0.0,,,"inactive","no positive results",159.6134033203125,,"",93.0,"4-(methyloxy)aniline hydrochloride","TR 116",,"inactive","active",0.0,"VQYJLACQFYZHCO-UHFFFAOYAH","parent [104-94-9]","multisex inactive; multispecies inactive","20265-97-8",20093.0,"no positive results","","C7H10ClNO",,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","94_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/p-ANISIDINE.HCl.html","no positive results","",,"defined organic","no positive results","","","no positive results","","C1(=CC=C(N)C=C1)OC.[H]Cl","inactive","","",,"","rat; mouse","no positive results",20093.0, +"NC1=C(C=CC=C1)C(=O)O","InChI=1/C7H7NO2/c8-6-4-2-1-3-5(6)7(9)10/h1-4H,8H2,(H,9,10)/f/h9H","inactive","tested chemical","Anthranilic acid",0.0,,,"inactive","no positive results",137.13600158691406,,"",94.0,"2-aminobenzoic acid","TR 36",,"inactive","inactive",0.0,"RWZYAGGXGHYGMB-BGGKNDAXCO","","multisex inactive; multispecies inactive","118-92-3",20094.0,"no positive results","","C7H7NO2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","95_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANTHRANILIC%20ACID.html","no positive results","",,"defined organic","no positive results","","","no positive results","","NC1=C(C=CC=C1)C(=O)O","inactive","","",,"","rat; mouse","no positive results",20094.0, +"O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3","InChI=1/C14H8O2/c15-13-9-5-1-2-6-10(9)14(16)12-8-4-3-7-11(12)13/h1-8H","inactive","tested chemical","9,10-Anthraquinone",,,,"inactive","",208.21209716796875,,"",95.0,"9,10-anthraquinone","",,"","active",0.0,"RZVHIXYEVGDQDX-UHFFFAOYAA","","multisex inactive","84-65-1",20095.0,"no positive results","","C14H8O2",,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","96_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/9,10-ANTHRAQUINONE.html","no positive results","",,"defined organic","","","","no positive results","","O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3","inactive","","",,"","mouse","",20095.0, +"","InChI=1/2C4H4O6.2K.3H2O.2Sb/c2*5-1(3(7)8)2(6)4(9)10;;;;;;;/h2*1-2H,(H,7,8)(H,9,10);;;3*1H2;;/q2*-2;2*+1;;;;2*+3/p-4/f2C4H2O6.2K.3H2O.2Sb/q2*-4;2m;;;;2m/rC8H6O12Sb2.2K.3H2O/c9-5(10)1-3-7(13)19-22(17-3)16-2(6(11)12)4-8(14)20-21(15-1)18-4;;;;;/h1-4H,(H,9,10)(H,11,12);;;3*1H2/q;2*+1;;;/p-2/fC8H4O12Sb2.2K.3H2O/q-2;2m;;;","","tested chemical","Antimony potassium tartrate",,,,"inactive","",667.8726196289062,,"no positive results",96.0,"dipotassium 5,11-dioxo-2,6,8,12,13,14-hexaoxa-1,7-distibatricyclo[8.2.1.1~4,7~]tetradecane-3,9-dicarboxylate trihydrate","",,"","inactive",0.0,"WBTCZEPSIIFINA-DYFLWLNICK","","","28300-74-5",20096.0,"","","C8H10K2O15Sb2",,"single chemical compound",,"TD50; Tumor Target Sites","","","Carcinogenicity","","","97_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ANTIMONY%20POTASSIUM%20TARTRATE.html","","",,"organometallic","","","","","","[K+].[K+].[O-]C(=O)C2O[Sb]3OC(C(O[Sb]1OC(=O)C2O1)C([O-])=O)C(=O)O3.O.O.O","inactive","","",,"","mouse","",39240.0, +"CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl","InChI=1/C15H23ClO4S/c1-12(20-21(17)19-10-9-16)11-18-14-7-5-13(6-8-14)15(2,3)4/h5-8,12H,9-11H2,1-4H3","active","tested chemical","Aramite",31.0,,0.289000004529953,"active","TD50 is harmonic mean of more than one positive test",334.85870361328125,,"",97.0,"2-chloroethyl 2-{[4-(1,1-dimethylethyl)phenyl]oxy}-1-methylethyl sulfite","",,"active","",32.0,"YKFRAOGHWKADFJ-UHFFFAOYAL","","multispecies active","140-57-8",20097.0,"liver","","C15H23ClO4S",96.69999694824219,"single chemical compound",,"TD50; Tumor Target Sites","","parent","Carcinogenicity","","","98_CPDBAS_v5d",0.47200000286102295,"","http://potency.berkeley.edu/chempages/ARAMITE.html","","",158.0,"defined organic","","","","no positive results","","CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl","active","liver","",,"","rat; mouse","",20097.0, +"O=C(OC)C1=CCCN(C)C1","InChI=1/C8H13NO2.ClH/c1-9-5-3-4-7(6-9)8(10)11-2;/h4H,3,5-6H2,1-2H3;1H","active","tested chemical","Arecoline.HCl",,,,"active","",191.6571044921875,,"",98.0,"methyl 1-methyl-1,2,5,6-tetrahydropyridine-3-carboxylate hydrochloride","",,"","",36.0,"LQSWCSYIDIBGRR-UHFFFAOYAO","parent [63-75-2]","multisite active; multisex active","61-94-9",20098.0,"lung; stomach; vascular system","","C8H14ClNO2",,"single chemical compound",,"TD50; Tumor Target Sites","","complex HCl","Carcinogenicity","","","99_CPDBAS_v5d",0.20600000023841858,"","http://potency.berkeley.edu/chempages/ARECOLINE.HCl.html","TD50 is harmonic mean of more than one positive test","",39.5,"defined organic","","","","lung; vascular system","","O=C(OC)C1=CCCN(C)C1.[H]Cl","active","","",,"","mouse","",20098.0, +"[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C(O)=O)=CC3=C2OCO3)=O","InChI=1/C17H11NO7.Na/c1-23-12-4-2-3-8-9(12)5-11(18(21)22)14-10(17(19)20)6-13-16(15(8)14)25-7-24-13;/h2-6H,7H2,1H3,(H,19,20);/q;+1/p-1/fC17H10NO7.Na/q-1;m","active","representative component in mixture","Aristolochic acid, sodium salt (77% AA I, 21% AA II)",50.0,,,"active","TD50 is harmonic mean of more than one positive test; TD50_Rat_mmol was not calculated for this mixture, but Activiity Score is assigned value of "50" to indicate active",363.25360107421875,,"",99.0,"sodium 8-(methyloxy)-6-nitrophenanthro[3,4-d][1,3]dioxole-5-carboxylate","",,"active","active",,"BQVOPWJSBBMGBR-KEMNOBITCY","structure shown AA I, parent [313-67-7]; AA II 6-Nitrophenanthro(3,4-d)-1,3-dioxole-5-carboxylic acid, sodium salt, AA II parent [475-80-9]","multisex active","10190-99-5",20099.0,"","","C17H10NNaO7",0.014100000262260437,"mixture or formulation",,"TD50; Tumor Target Sites","","salt Na","Carcinogenicity","kidney and urinary bladder were additional target sites but experiments too short to meet the inclusion rules of the CPDB; Rat added v2a; Mutagenicity_SAL_CPDB added v3a; TD50_Rat_mmol conversion from mg value not provided due to substance being a mixture","","100_CPDBAS_v5d",,"","http://potency.berkeley.edu/chempages/ARISTOLOCHIC%20ACID,%20SODIUM%20SALT%20(77%25%20AA%20I,%2021%25%20AA%20I.html","","",,"defined organic","stomach","","","","","[O-][N+](C1=CC(C(OC)=CC=C4)=C4C2=C1C(C([O-])=O)=CC3=C2OCO3)=O.[Na+]","","","",,"","rat","stomach",20099.0, diff --git a/test/data/hamster_carcinogenicity.csv b/test/data/hamster_carcinogenicity.csv new file mode 100644 index 0000000..52d89a3 --- /dev/null +++ b/test/data/hamster_carcinogenicity.csv @@ -0,0 +1,86 @@ +SMILES, Hamster Carcinogenicity +CC=O,true +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,true +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,true +C1(N=CNN=1)N,false +Br(=O)(=O)[O-].[K+],true +[Cl-].[Cd+2].[Cl-],false +O=S(=O)([O-])[O-].[Cd+2],false +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,false +ClCOC,true +C=C(Cl)C=C,false +Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,false +O=C1OC2=C(C=CC=C2)C=C1,false +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,true +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,false +C=CCN(CC=C)N=O,true +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45,false +O=C(N(C)C)Cl,true +CN(C)N,true +N(NC)C.[H]Cl.[H]Cl,true +CCO,false +O=C(N(CC)N=O)NCCO,true +O=C(N(CC)N=O)NCC(=O)C,true +C=O,false +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O,true +O=CC1=CC=CO1,false +OCC1CO1,true +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,false +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,true +NN,true +OS(=O)(=O)O.NN,true +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,true +OCCNN,false +O=C(C1=CC=NC=C1)NN,false +OC(=O)C1=CC=NC=C1,false +O=C(NC1=CC=CC(=C1)Cl)OC(C)C,false +O=C(NC1=CC=CC=C1)OC(C)C,false +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],false +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,false +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,false +CN(N)C=O,true +O=C(C(=C)C)OC,false +CNN,true +O=C(C1=CC=CN=C1)CCCN(N=O)C,false +CC1=CC(=O)NC(=S)N1,true +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,false +O=N[O-].[Na+],false +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,true +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,true +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],false +N(CC(CO)O)(CC(O)C)N=O,true +N(CC(CO)O)(CC(C)=O)N=O,true +N(CC(CO)O)(CCO)N=O,false +O=C(C)CN(N=O)CCO,true +C1C(N(C(CN1N=O)C)C)C,true +N(CC(C)=O)(CC=C)N=O,true +N(CC(CO)O)(C)N=O,true +O=NN1CCOCC1,true +N1C=CC=C(C=1)C2N(N=O)CCC2,true +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,false +O=NN1CCCCC1,true +O=NN1CCCC1,true +O=C(N(CC(C)=O)N=O)NCCCl,true +N(C(=O)N)(N=O)CC(C)=O,true +C1(CCN=C=S)=CC=CC=C1,false +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,false +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,false +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,false +C1(=CC(=C(O)C=C1)O)C(O)=O,false +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,false +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,false +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,false +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,false +ClC(=CCl)Cl,false +NC(=O)OCC,true +C=CCl,true +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,false +C1(CN(CC(N1N=O)C)N=O)C,true +N(CCN(C)C)(C)N=O,true +C1(CN(N=O)CC(O1)C)C,true +O1C(N(CC1C)N=O)=O,true +CCOC(=O)N(C)N=O,true +C1N(COC1)N=O,true +O=C(N(CCC1=CC=CC=C1)N=O)N,true +O=NN1CCC1,true +F[B-](F)(F)F.[Na+],false diff --git a/test/data/hamster_carcinogenicity.mini.bool_float.csv b/test/data/hamster_carcinogenicity.mini.bool_float.csv new file mode 100644 index 0000000..85bf66b --- /dev/null +++ b/test/data/hamster_carcinogenicity.mini.bool_float.csv @@ -0,0 +1,11 @@ +SMILES, Hamster Carcinogenicity +CC=O,1.0 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,1.0 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,1.0 +C1(N=CNN=1)N,0.0 +Br(=O)(=O)[O-].[K+],1.0 +[Cl-].[Cd+2].[Cl-],0.0 +O=S(=O)([O-])[O-].[Cd+2],0.0 +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,0.0 +ClCOC,1.0 +C=C(Cl)C=C,0.0 diff --git a/test/data/hamster_carcinogenicity.mini.bool_int.csv b/test/data/hamster_carcinogenicity.mini.bool_int.csv new file mode 100644 index 0000000..4267235 --- /dev/null +++ b/test/data/hamster_carcinogenicity.mini.bool_int.csv @@ -0,0 +1,11 @@ +SMILES, Hamster Carcinogenicity +CC=O,1 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,1 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,1 +C1(N=CNN=1)N,0 +Br(=O)(=O)[O-].[K+],1 +[Cl-].[Cd+2].[Cl-],0 +O=S(=O)([O-])[O-].[Cd+2],0 +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,0 +ClCOC,1 +C=C(Cl)C=C,0 diff --git a/test/data/hamster_carcinogenicity.mini.bool_string.csv b/test/data/hamster_carcinogenicity.mini.bool_string.csv new file mode 100644 index 0000000..514cdfc --- /dev/null +++ b/test/data/hamster_carcinogenicity.mini.bool_string.csv @@ -0,0 +1,11 @@ +SMILES, Hamster Carcinogenicity +CC=O,true +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,true +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,true +C1(N=CNN=1)N,false +Br(=O)(=O)[O-].[K+],true +[Cl-].[Cd+2].[Cl-],false +O=S(=O)([O-])[O-].[Cd+2],false +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,false +ClCOC,true +C=C(Cl)C=C,false diff --git a/test/data/hamster_carcinogenicity.mini.csv b/test/data/hamster_carcinogenicity.mini.csv new file mode 100644 index 0000000..4267235 --- /dev/null +++ b/test/data/hamster_carcinogenicity.mini.csv @@ -0,0 +1,11 @@ +SMILES, Hamster Carcinogenicity +CC=O,1 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,1 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,1 +C1(N=CNN=1)N,0 +Br(=O)(=O)[O-].[K+],1 +[Cl-].[Cd+2].[Cl-],0 +O=S(=O)([O-])[O-].[Cd+2],0 +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,0 +ClCOC,1 +C=C(Cl)C=C,0 diff --git a/test/data/hamster_carcinogenicity.ntriples b/test/data/hamster_carcinogenicity.ntriples new file mode 100644 index 0000000..a59e7d6 --- /dev/null +++ b/test/data/hamster_carcinogenicity.ntriples @@ -0,0 +1,618 @@ + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "Hamster Carcinogenicity"^^ . + "false"^^ . + "true"^^ . + . + . + . + . + "Hamster Carcinogenicity"^^ . + _:dataentry0 . + _:dataentry1 . + _:dataentry10 . + _:dataentry11 . + _:dataentry12 . + _:dataentry13 . + _:dataentry14 . + _:dataentry15 . + _:dataentry16 . + _:dataentry17 . + _:dataentry18 . + _:dataentry19 . + _:dataentry2 . + _:dataentry20 . + _:dataentry21 . + _:dataentry22 . + _:dataentry23 . + _:dataentry24 . + _:dataentry25 . + _:dataentry26 . + _:dataentry27 . + _:dataentry28 . + _:dataentry29 . + _:dataentry3 . + _:dataentry30 . + _:dataentry31 . + _:dataentry32 . + _:dataentry33 . + _:dataentry34 . + _:dataentry35 . + _:dataentry36 . + _:dataentry37 . + _:dataentry38 . + _:dataentry39 . + _:dataentry4 . + _:dataentry40 . + _:dataentry41 . + _:dataentry42 . + _:dataentry43 . + _:dataentry44 . + _:dataentry45 . + _:dataentry46 . + _:dataentry47 . + _:dataentry48 . + _:dataentry49 . + _:dataentry5 . + _:dataentry50 . + _:dataentry51 . + _:dataentry52 . + _:dataentry53 . + _:dataentry54 . + _:dataentry55 . + _:dataentry56 . + _:dataentry57 . + _:dataentry58 . + _:dataentry59 . + _:dataentry6 . + _:dataentry60 . + _:dataentry61 . + _:dataentry62 . + _:dataentry63 . + _:dataentry64 . + _:dataentry65 . + _:dataentry66 . + _:dataentry67 . + _:dataentry68 . + _:dataentry69 . + _:dataentry7 . + _:dataentry70 . + _:dataentry71 . + _:dataentry72 . + _:dataentry73 . + _:dataentry74 . + _:dataentry75 . + _:dataentry8 . + _:dataentry9 . + . + . +_:dataentry0 . +_:dataentry0 _:values0 . +_:dataentry0 . +_:dataentry1 . +_:dataentry1 _:values1 . +_:dataentry1 . +_:dataentry10 . +_:dataentry10 _:values10 . +_:dataentry10 . +_:dataentry11 . +_:dataentry11 _:values11 . +_:dataentry11 . +_:dataentry12 . +_:dataentry12 _:values12 . +_:dataentry12 . +_:dataentry13 . +_:dataentry13 _:values13 . +_:dataentry13 . +_:dataentry14 . +_:dataentry14 _:values14 . +_:dataentry14 . +_:dataentry15 . +_:dataentry15 _:values15 . +_:dataentry15 . +_:dataentry16 . +_:dataentry16 _:values16 . +_:dataentry16 . +_:dataentry17 . +_:dataentry17 _:values17 . +_:dataentry17 . +_:dataentry18 . +_:dataentry18 _:values18 . +_:dataentry18 . +_:dataentry19 . +_:dataentry19 _:values19 . +_:dataentry19 . +_:dataentry2 . +_:dataentry2 _:values2 . +_:dataentry2 . +_:dataentry20 . +_:dataentry20 _:values20 . +_:dataentry20 . +_:dataentry21 . +_:dataentry21 _:values21 . +_:dataentry21 . +_:dataentry22 . +_:dataentry22 _:values22 . +_:dataentry22 . +_:dataentry23 . +_:dataentry23 _:values23 . +_:dataentry23 . +_:dataentry24 . +_:dataentry24 _:values24 . +_:dataentry24 . +_:dataentry25 . +_:dataentry25 _:values25 . +_:dataentry25 . +_:dataentry26 . +_:dataentry26 _:values26 . +_:dataentry26 . +_:dataentry27 . +_:dataentry27 _:values27 . +_:dataentry27 . +_:dataentry28 . +_:dataentry28 _:values28 . +_:dataentry28 . +_:dataentry29 . +_:dataentry29 _:values29 . +_:dataentry29 . +_:dataentry3 . +_:dataentry3 _:values3 . +_:dataentry3 . +_:dataentry30 . +_:dataentry30 _:values30 . +_:dataentry30 . +_:dataentry31 . +_:dataentry31 _:values31 . +_:dataentry31 . +_:dataentry32 . +_:dataentry32 _:values32 . +_:dataentry32 . +_:dataentry33 . +_:dataentry33 _:values33 . +_:dataentry33 . +_:dataentry34 . +_:dataentry34 _:values34 . +_:dataentry34 . +_:dataentry35 . +_:dataentry35 _:values35 . +_:dataentry35 . +_:dataentry36 . +_:dataentry36 _:values36 . +_:dataentry36 . +_:dataentry37 . +_:dataentry37 _:values37 . +_:dataentry37 . +_:dataentry38 . +_:dataentry38 _:values38 . +_:dataentry38 . +_:dataentry39 . +_:dataentry39 _:values39 . +_:dataentry39 . +_:dataentry4 . +_:dataentry4 _:values4 . +_:dataentry4 . +_:dataentry40 . +_:dataentry40 _:values40 . +_:dataentry40 . +_:dataentry41 . +_:dataentry41 _:values41 . +_:dataentry41 . +_:dataentry42 . +_:dataentry42 _:values42 . +_:dataentry42 . +_:dataentry43 . +_:dataentry43 _:values43 . +_:dataentry43 . +_:dataentry44 . +_:dataentry44 _:values44 . +_:dataentry44 . +_:dataentry45 . +_:dataentry45 _:values45 . +_:dataentry45 . +_:dataentry46 . +_:dataentry46 _:values46 . +_:dataentry46 . +_:dataentry47 . +_:dataentry47 _:values47 . +_:dataentry47 . +_:dataentry48 . +_:dataentry48 _:values48 . +_:dataentry48 . +_:dataentry49 . +_:dataentry49 _:values49 . +_:dataentry49 . +_:dataentry5 . +_:dataentry5 _:values5 . +_:dataentry5 . +_:dataentry50 . +_:dataentry50 _:values50 . +_:dataentry50 . +_:dataentry51 . +_:dataentry51 _:values51 . +_:dataentry51 . +_:dataentry52 . +_:dataentry52 _:values52 . +_:dataentry52 . +_:dataentry53 . +_:dataentry53 _:values53 . +_:dataentry53 . +_:dataentry54 . +_:dataentry54 _:values54 . +_:dataentry54 . +_:dataentry55 . +_:dataentry55 _:values55 . +_:dataentry55 . +_:dataentry56 . +_:dataentry56 _:values56 . +_:dataentry56 . +_:dataentry57 . +_:dataentry57 _:values57 . +_:dataentry57 . +_:dataentry58 . +_:dataentry58 _:values58 . +_:dataentry58 . +_:dataentry59 . +_:dataentry59 _:values59 . +_:dataentry59 . +_:dataentry6 . +_:dataentry6 _:values6 . +_:dataentry6 . +_:dataentry60 . +_:dataentry60 _:values60 . +_:dataentry60 . +_:dataentry61 . +_:dataentry61 _:values61 . +_:dataentry61 . +_:dataentry62 . +_:dataentry62 _:values62 . +_:dataentry62 . +_:dataentry63 . +_:dataentry63 _:values63 . +_:dataentry63 . +_:dataentry64 . +_:dataentry64 _:values64 . +_:dataentry64 . +_:dataentry65 . +_:dataentry65 _:values65 . +_:dataentry65 . +_:dataentry66 . +_:dataentry66 _:values66 . +_:dataentry66 . +_:dataentry67 . +_:dataentry67 _:values67 . +_:dataentry67 . +_:dataentry68 . +_:dataentry68 _:values68 . +_:dataentry68 . +_:dataentry69 . +_:dataentry69 _:values69 . +_:dataentry69 . +_:dataentry7 . +_:dataentry7 _:values7 . +_:dataentry7 . +_:dataentry70 . +_:dataentry70 _:values70 . +_:dataentry70 . +_:dataentry71 . +_:dataentry71 _:values71 . +_:dataentry71 . +_:dataentry72 . +_:dataentry72 _:values72 . +_:dataentry72 . +_:dataentry73 . +_:dataentry73 _:values73 . +_:dataentry73 . +_:dataentry74 . +_:dataentry74 _:values74 . +_:dataentry74 . +_:dataentry75 . +_:dataentry75 _:values75 . +_:dataentry75 . +_:dataentry8 . +_:dataentry8 _:values8 . +_:dataentry8 . +_:dataentry9 . +_:dataentry9 _:values9 . +_:dataentry9 . +_:values0 . +_:values0 "false"^^ . +_:values0 . +_:values1 . +_:values1 "true"^^ . +_:values1 . +_:values10 . +_:values10 "false"^^ . +_:values10 . +_:values11 . +_:values11 "true"^^ . +_:values11 . +_:values12 . +_:values12 "false"^^ . +_:values12 . +_:values13 . +_:values13 "false"^^ . +_:values13 . +_:values14 . +_:values14 "true"^^ . +_:values14 . +_:values15 . +_:values15 "true"^^ . +_:values15 . +_:values16 . +_:values16 "true"^^ . +_:values16 . +_:values17 . +_:values17 "true"^^ . +_:values17 . +_:values18 . +_:values18 "false"^^ . +_:values18 . +_:values19 . +_:values19 "true"^^ . +_:values19 . +_:values2 . +_:values2 "false"^^ . +_:values2 . +_:values20 . +_:values20 "true"^^ . +_:values20 . +_:values21 . +_:values21 "false"^^ . +_:values21 . +_:values22 . +_:values22 "false"^^ . +_:values22 . +_:values23 . +_:values23 "false"^^ . +_:values23 . +_:values24 . +_:values24 "false"^^ . +_:values24 . +_:values25 . +_:values25 "false"^^ . +_:values25 . +_:values26 . +_:values26 "true"^^ . +_:values26 . +_:values27 . +_:values27 "false"^^ . +_:values27 . +_:values28 . +_:values28 "true"^^ . +_:values28 . +_:values29 . +_:values29 "false"^^ . +_:values29 . +_:values3 . +_:values3 "false"^^ . +_:values3 . +_:values30 . +_:values30 "false"^^ . +_:values30 . +_:values31 . +_:values31 "true"^^ . +_:values31 . +_:values32 . +_:values32 "false"^^ . +_:values32 . +_:values33 . +_:values33 "true"^^ . +_:values33 . +_:values34 . +_:values34 "false"^^ . +_:values34 . +_:values35 . +_:values35 "true"^^ . +_:values35 . +_:values36 . +_:values36 "true"^^ . +_:values36 . +_:values37 . +_:values37 "true"^^ . +_:values37 . +_:values38 . +_:values38 "true"^^ . +_:values38 . +_:values39 . +_:values39 "false"^^ . +_:values39 . +_:values4 . +_:values4 "true"^^ . +_:values4 . +_:values40 . +_:values40 "true"^^ . +_:values40 . +_:values41 . +_:values41 "true"^^ . +_:values41 . +_:values42 . +_:values42 "true"^^ . +_:values42 . +_:values43 . +_:values43 "true"^^ . +_:values43 . +_:values44 . +_:values44 "true"^^ . +_:values44 . +_:values45 . +_:values45 "true"^^ . +_:values45 . +_:values46 . +_:values46 "false"^^ . +_:values46 . +_:values47 . +_:values47 "true"^^ . +_:values47 . +_:values48 . +_:values48 "true"^^ . +_:values48 . +_:values49 . +_:values49 "true"^^ . +_:values49 . +_:values5 . +_:values5 "false"^^ . +_:values5 . +_:values50 . +_:values50 "false"^^ . +_:values50 . +_:values51 . +_:values51 "true"^^ . +_:values51 . +_:values52 . +_:values52 "true"^^ . +_:values52 . +_:values53 . +_:values53 "true"^^ . +_:values53 . +_:values54 . +_:values54 "false"^^ . +_:values54 . +_:values55 . +_:values55 "true"^^ . +_:values55 . +_:values56 . +_:values56 "false"^^ . +_:values56 . +_:values57 . +_:values57 "true"^^ . +_:values57 . +_:values58 . +_:values58 "true"^^ . +_:values58 . +_:values59 . +_:values59 "true"^^ . +_:values59 . +_:values6 . +_:values6 "true"^^ . +_:values6 . +_:values60 . +_:values60 "false"^^ . +_:values60 . +_:values61 . +_:values61 "false"^^ . +_:values61 . +_:values62 . +_:values62 "false"^^ . +_:values62 . +_:values63 . +_:values63 "false"^^ . +_:values63 . +_:values64 . +_:values64 "false"^^ . +_:values64 . +_:values65 . +_:values65 "false"^^ . +_:values65 . +_:values66 . +_:values66 "true"^^ . +_:values66 . +_:values67 . +_:values67 "true"^^ . +_:values67 . +_:values68 . +_:values68 "true"^^ . +_:values68 . +_:values69 . +_:values69 "false"^^ . +_:values69 . +_:values7 . +_:values7 "false"^^ . +_:values7 . +_:values70 . +_:values70 "false"^^ . +_:values70 . +_:values71 . +_:values71 "false"^^ . +_:values71 . +_:values72 . +_:values72 "true"^^ . +_:values72 . +_:values73 . +_:values73 "false"^^ . +_:values73 . +_:values74 . +_:values74 "true"^^ . +_:values74 . +_:values75 . +_:values75 "false"^^ . +_:values75 . +_:values8 . +_:values8 "false"^^ . +_:values8 . +_:values9 . +_:values9 "true"^^ . +_:values9 . diff --git a/test/data/hamster_carcinogenicity.sdf b/test/data/hamster_carcinogenicity.sdf new file mode 100644 index 0000000..df230d5 --- /dev/null +++ b/test/data/hamster_carcinogenicity.sdf @@ -0,0 +1,2805 @@ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 5.7640 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0213 -1.3540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8046 -2.4275 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1296 -2.2921 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6712 -1.0735 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8878 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5629 -0.1451 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0213 -3.5106 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7640 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6035 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4526 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4526 -1.7698 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6035 -1.1025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3017 -3.7621 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 -3.0948 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.7621 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 -1.7698 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 13 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 14 1 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 17 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 18 19 0 0 0 0 0 0 0 0 2 V2000 + 3.2537 -3.5906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2537 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4062 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4062 -4.2555 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1011 -4.2555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9682 -0.2748 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6649 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1011 -1.5958 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8866 -2.1366 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7006 -3.5817 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0038 -3.8654 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5587 -2.2607 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6687 -2.7129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7733 -1.7199 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5446 -5.0800 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 6.7644 -6.1527 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 8.8656 -5.2130 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 4 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 8 1 0 0 0 0 + 3 13 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 7 9 2 0 0 0 0 + 8 10 2 0 0 0 0 + 9 10 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 12 14 2 0 0 0 0 + 12 16 1 0 0 0 0 + 13 15 2 0 0 0 0 + 14 15 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 18 2 0 0 0 0 +M CHG 2 16 1 17 -1 +M END +> +active + +$$$$ + + + + 6 6 0 0 0 0 0 0 0 0 1 V2000 + 1.3304 -1.0738 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1104 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3767 -0.4086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3767 -1.7390 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1104 -2.1509 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.0738 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 2 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 13 13 0 0 0 0 0 0 0 0 1 V2000 + 1.1541 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 -0.6703 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4553 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6094 -0.6703 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6094 -1.9972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4553 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3012 -1.9972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1541 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4837 -1.5134 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8175 -3.8147 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.3309 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7566 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9107 -1.9972 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 12 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 1 0 0 0 0 + 8 11 1 0 0 0 0 + 12 13 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 3 0 0 0 0 0 0 0 0 0 2 V2000 + 10.0000 -0.0700 0.0000 Cl 0 5 0 0 0 0 0 0 0 0 0 0 + 4.5200 0.0000 0.0000 Cd 0 2 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.3400 0.0000 Cl 0 5 0 0 0 0 0 0 0 0 0 0 +M CHG 3 1 -1 2 2 3 -1 +M END +> +inactive + +$$$$ + + + + 6 4 0 0 0 0 0 0 0 0 2 V2000 + 2.6600 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 -1.3320 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3280 -1.3320 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 3.9880 -1.3320 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3320 0.0000 Cd 0 2 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M CHG 3 4 -1 5 -1 6 2 +M END +> +inactive + +$$$$ + + + + 0 0 0 0 0 0 0 0 0 0 1 V2000 +M END +> +inactive + +$$$$ + + + + 21 22 0 0 0 0 0 0 0 0 1 V2000 + 5.7698 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7698 -1.3315 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9111 -2.0036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9111 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7698 -3.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6158 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6158 -2.0036 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4619 -3.9945 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3079 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1540 -3.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1540 -5.3260 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.3351 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0650 -3.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2190 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2190 -2.0036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3730 -1.3315 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5269 -2.0036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5269 -3.3351 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3730 -3.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3730 -5.3260 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6809 -3.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 13 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 2 0 0 0 0 + 18 21 1 0 0 0 0 + 19 20 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 3.4575 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3061 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 2.2415 -0.6520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1191 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3606 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2415 -2.0836 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 1 5 1 0 0 0 0 + 2 4 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 21 22 0 0 0 0 0 0 0 0 1 V2000 + 12.5806 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2668 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9397 -1.3138 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3083 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9945 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2574 -0.1592 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3177 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9718 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3177 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9585 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2707 -2.4683 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2762 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3403 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9359 -2.4683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9906 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9906 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2989 -3.6229 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2989 -1.3138 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.4683 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2668 -2.6674 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2668 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 2 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 20 1 0 0 0 0 + 2 21 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 8 2 0 0 0 0 + 4 5 1 0 0 0 0 + 4 10 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 9 2 0 0 0 0 + 7 15 2 0 0 0 0 + 8 18 1 0 0 0 0 + 9 16 1 0 0 0 0 + 10 17 2 0 0 0 0 + 12 14 1 0 0 0 0 + 13 16 2 0 0 0 0 + 13 19 1 0 0 0 0 + 13 15 1 0 0 0 0 + 14 17 1 0 0 0 0 + 14 18 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 11 12 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1518 -1.9983 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3036 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4554 -1.9983 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4554 -0.6680 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6071 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7589 -0.6680 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7589 -1.9983 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6071 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3036 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1518 -0.6680 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 18 19 0 0 0 0 0 0 0 0 1 V2000 + 3.4540 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6054 -0.6632 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6054 -1.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7567 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9080 -1.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0594 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0594 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9080 -4.6514 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7567 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2107 -4.6514 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4540 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4540 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3027 -4.6514 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1513 -2.6527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3027 -1.9895 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.6514 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7567 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 18 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 9 2 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 17 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 19 20 0 0 0 0 0 0 0 0 1 V2000 + 3.2800 -1.3268 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6068 -1.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6068 -2.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7585 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9102 -2.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0619 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0619 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9102 -5.3162 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7585 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2136 -5.3162 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4551 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4551 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3034 -5.3162 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1517 -4.6529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1517 -3.3169 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3034 -2.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -5.3162 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6068 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9336 -1.3268 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 18 1 0 0 0 0 + 2 19 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 11 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 10 1 0 0 0 0 + 8 9 2 0 0 0 0 + 11 12 2 0 0 0 0 + 11 16 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 14 15 1 0 0 0 0 + 14 17 1 0 0 0 0 + 15 16 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 2.6588 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9976 -1.1548 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6588 -2.3049 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9976 -3.4597 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6588 -4.6098 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9905 -4.6098 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6563 -3.4597 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6659 -3.4597 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3049 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 19 23 0 0 0 0 0 0 0 0 1 V2000 + 1.2310 -2.6401 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6401 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6007 -3.6931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2470 -2.9219 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4113 -2.7068 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7946 -3.9008 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1061 -5.0280 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3001 -3.6931 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8500 -2.0023 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3902 -3.1295 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6954 -3.7599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3258 -2.7068 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4159 -2.4250 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1478 -4.8203 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9749 -4.3235 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3902 -0.7787 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1318 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5522 -0.0742 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6583 -1.1643 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 1 0 0 0 0 + 1 4 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 7 1 0 0 0 0 + 5 9 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 8 10 1 0 0 0 0 + 9 12 1 0 0 0 0 + 9 16 1 0 0 0 0 + 9 19 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 16 1 0 0 0 0 + 10 15 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 14 1 0 0 0 0 + 12 13 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 18 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 6 5 0 0 0 0 0 0 0 0 1 V2000 + 1.3307 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9943 -1.1509 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3307 -2.3053 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9943 -3.4563 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3053 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3250 -1.1509 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 4 3 0 0 0 0 0 0 0 0 1 V2000 + 1.9950 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3292 -1.1518 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1518 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 8 5 0 0 0 0 0 0 0 0 1 V2000 + 2.7482 -0.6668 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9000 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0518 -0.6668 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5964 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6623 -1.9955 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9909 -1.9955 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9955 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3286 -1.9955 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 4 1 0 0 0 0 + 2 3 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 1 V2000 + 2.2999 -3.9852 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2999 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1534 -1.9891 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1534 -0.6630 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 -2.6591 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9852 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4534 -1.9891 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6068 -2.6591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7533 -1.9891 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9067 -2.6591 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 12 11 0 0 0 0 0 0 0 0 1 V2000 + 2.3006 -3.9862 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3006 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1537 -1.9897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1537 -0.6632 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 -2.6598 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9862 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4543 -1.9897 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6080 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7548 -1.9897 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7548 -0.6632 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9086 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 8 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 2 1 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 17 18 0 0 0 0 0 0 0 0 2 V2000 + 11.3714 -1.9900 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 10.2229 -1.3304 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 10.2229 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0743 -1.9900 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9265 -3.3204 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6302 -3.5933 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9706 -2.4448 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8576 -1.4555 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6402 -2.3084 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7532 -3.2863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5365 -2.7519 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6729 -1.4328 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -1.1485 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6950 -0.5345 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4442 -1.0121 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2395 -2.3311 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.8087 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 13 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 +M CHG 2 1 -1 2 1 +M END +> +active + +$$$$ + + + + 7 7 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.5998 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -2.2653 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -1.5998 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4416 -0.2777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7417 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4072 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5169 -2.1419 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 5 5 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1519 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1519 -1.8168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3037 -1.1519 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9687 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6336 -1.1519 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 24 26 0 0 1 0 0 0 0 0 1 V2000 + 6.2320 -1.0924 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8471 -2.3097 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6298 -2.7050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6298 -3.9743 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8471 -4.3593 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5857 -3.3293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2308 -2.2369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5001 -2.2369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1347 -3.3293 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4040 -3.3293 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5001 -4.4321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2308 -4.4321 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5857 -5.5453 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0019 -0.9780 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9799 -0.1665 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5374 -4.6090 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5374 -5.8783 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4241 -3.9743 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3213 -4.6090 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.1316 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4241 -2.7050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5374 -2.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5374 -0.7907 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6334 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 6 2 1 1 0 0 0 + 3 4 2 0 0 0 0 + 3 22 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 16 1 0 0 0 0 + 6 5 1 6 0 0 0 + 6 7 1 0 0 0 0 + 6 12 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 14 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 1 0 0 0 + 14 15 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 18 2 0 0 0 0 + 18 19 1 0 0 0 0 + 18 21 1 0 0 0 0 + 19 20 1 0 0 0 0 + 21 22 2 0 0 0 0 + 22 23 1 0 0 0 0 + 23 24 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 12 12 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.3036 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 -2.3036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3250 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9901 -2.3036 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3250 -3.4581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -3.4581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 -4.6072 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9901 -4.6072 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3201 -2.3036 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9901 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 9 1 0 0 0 0 + 7 8 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 2 1 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 7 5 0 0 0 0 0 0 0 0 1 V2000 + 3.9900 -2.6600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9900 -1.3300 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 -1.3300 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3200 -1.3300 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9900 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3300 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3300 -1.3300 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 2 0 0 0 0 + 2 5 1 0 0 0 0 + 6 7 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 18 20 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3313 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9920 -3.4593 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9920 -1.1564 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3313 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3233 -1.1564 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9938 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3251 -2.3030 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9858 -1.1564 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3251 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9938 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2880 -1.4284 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3666 -0.6511 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5812 -1.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7173 -2.5168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6387 -3.2942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4240 -2.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2093 -3.2942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 18 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 12 1 0 0 0 0 + 10 11 2 0 0 0 0 + 12 13 2 0 0 0 0 + 12 17 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 17 18 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -0.6638 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1525 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -0.6638 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4575 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6099 -0.6638 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 10 10 0 0 0 0 0 0 0 0 1 V2000 + 4.6545 -3.4536 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9889 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6577 -2.3040 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9968 -3.4536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6656 -3.4536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6656 -1.1497 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9968 -1.1497 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6545 -1.1497 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9889 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 9 10 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 9 9 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6655 -1.1542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9965 -1.1542 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6574 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9884 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6539 -1.1542 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9884 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6574 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 14 14 0 0 0 0 0 0 0 0 1 V2000 + 3.4524 -0.6629 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4524 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6031 -2.6606 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7539 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7539 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9047 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0555 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0555 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9047 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2063 -2.6606 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3016 -2.6606 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1508 -1.9978 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1508 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 10 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 14 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 13 13 0 0 0 0 0 0 0 0 1 V2000 + 3.4601 -0.6694 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4601 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6054 -2.6616 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7587 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7587 -0.6694 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9121 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0654 -0.6694 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0654 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9121 -2.6616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3067 -2.6616 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1534 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6616 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1534 -0.6694 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 15 6 0 0 0 0 0 0 0 0 3 V2000 + 5.7806 -4.7517 0.0000 Pb 0 2 0 0 0 2 0 0 0 0 0 0 + 5.1849 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 4.5351 -1.1507 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1849 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1949 -1.1507 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0036 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.3267 -1.1507 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0036 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1507 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6759 -4.9413 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 5.8754 -5.6452 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 11.4935 -1.8817 0.0000 Pb 0 2 0 0 0 2 0 0 0 0 0 0 + 13.5377 -1.9900 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 11.7778 -2.7075 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 3.6281 -3.4792 0.0000 Pb 0 2 0 0 0 2 0 0 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 2 0 0 0 0 +M CHG 8 1 2 2 -1 6 -1 10 -1 11 -1 12 2 13 -1 14 -1 +M CHG 1 15 2 +M END +> +inactive + +$$$$ + + + + 20 20 0 0 0 0 0 0 0 0 1 V2000 + 4.4090 -3.9937 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5672 -4.6567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7174 -3.9937 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8676 -4.6567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8676 -5.9906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7174 -6.6535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5672 -5.9906 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2589 -4.6567 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1087 -3.9937 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8946 -4.5368 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.5464 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6630 -2.3962 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9649 -2.6678 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4090 -2.6598 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2589 -1.9969 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2589 -0.6630 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1087 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4090 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3307 -7.9874 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6567 -7.9874 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 14 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 7 2 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 13 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 18 1 0 0 0 0 + 19 20 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 33 35 0 0 1 0 0 0 0 0 1 V2000 + 14.9725 -5.3302 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 13.8197 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6668 -5.3302 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5139 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5139 -7.3216 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6668 -7.9804 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.8197 -7.3216 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6668 -9.3129 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3610 -5.3302 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3610 -3.9977 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5139 -3.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6668 -3.9977 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5139 -1.9913 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3610 -1.3326 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2081 -1.9913 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2081 -3.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0552 -3.9977 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9173 -3.3239 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9173 -1.9913 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0552 -1.3326 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -3.9977 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6115 -3.3239 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -5.3302 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6115 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4587 -5.3302 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3058 -5.9890 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -5.3302 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1529 -3.9977 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -5.9890 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6115 -7.3216 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4587 -7.9804 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -7.9804 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3610 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 8 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 11 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 33 1 0 0 0 0 + 15 16 2 0 0 0 0 + 15 20 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 19 1 0 0 0 0 + 18 21 1 0 0 0 0 + 19 20 2 0 0 0 0 + 21 22 2 0 0 0 0 + 21 23 1 0 0 0 0 + 24 23 1 6 0 0 0 + 24 25 1 0 0 0 0 + 24 30 1 0 0 0 0 + 25 26 1 0 0 0 0 + 26 27 1 0 0 0 0 + 27 28 2 0 0 0 0 + 27 29 1 0 0 0 0 + 30 31 2 0 0 0 0 + 30 32 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 2.3056 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 -1.3308 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4567 -1.9945 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3308 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 7 6 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.3052 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3306 -2.3052 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9941 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3247 -1.1508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3306 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9941 -3.4560 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3247 -3.4560 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 5 1 0 0 0 0 + 6 7 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 15 15 0 0 0 0 0 0 0 0 1 V2000 + 3.4524 -3.9915 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4524 -2.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3016 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1508 -2.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1508 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3016 -0.6635 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6032 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7643 -2.6644 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9151 -2.0009 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0659 -2.6644 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2167 -2.0009 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3675 -2.6644 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0659 -3.9915 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 12 15 1 0 0 0 0 + 13 14 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 9 9 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3315 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -1.1518 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3265 -1.1518 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9899 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9899 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3265 -3.4555 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9899 -4.6073 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9950 -3.4555 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 9 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 23 25 0 0 0 0 0 0 0 0 1 V2000 + 1.6416 -5.7565 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2982 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1491 -3.9398 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.6074 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1491 -2.6156 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9658 -3.4583 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3010 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9576 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2928 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9604 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2928 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9576 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2846 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9522 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2764 -4.6074 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9440 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2764 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9522 -2.2982 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2846 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9522 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2764 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9440 -1.1491 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4583 -5.2750 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 2 23 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 12 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 10 13 1 0 0 0 0 + 11 12 2 0 0 0 0 + 13 14 1 0 0 0 0 + 13 18 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 17 22 1 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 2 0 0 0 0 + 20 21 1 0 0 0 0 + 21 22 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 4 2 0 0 0 0 0 0 0 0 2 V2000 + 2.3030 -0.6656 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.1975 -1.9944 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M CHG 2 3 -1 4 1 +M END +> +inactive + +$$$$ + + + + 17 18 0 0 0 0 0 0 0 0 2 V2000 + 1.2652 -1.2985 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.7091 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1.5426 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2529 -2.1863 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5514 -1.9089 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2173 -3.0631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3294 -4.0508 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1086 -3.5070 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5380 -3.1963 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4258 -2.2085 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6466 -2.7523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5023 -4.0730 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2039 -4.3505 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8008 -2.0865 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9439 -2.7523 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9439 -4.0841 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0981 -2.0865 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 1 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 2 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 9 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 13 2 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 11 14 1 0 0 0 0 + 12 13 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 + 15 17 1 0 0 0 0 +M CHG 2 1 1 2 -1 +M END +> +active + +$$$$ + + + + 16 17 0 0 0 0 0 0 0 0 2 V2000 + 10.9589 -1.9945 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 9.8082 -1.3260 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 9.8082 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6575 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5151 -3.3205 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2110 -3.5945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5534 -2.4438 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4411 -1.4575 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2274 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3397 -3.2877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1233 -2.7507 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2658 -1.4247 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5589 -1.1507 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2795 -0.5370 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0301 -1.0192 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.1753 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 13 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 2 0 0 0 0 +M CHG 2 1 -1 2 1 +M END +> +active + +$$$$ + + + + 15 17 0 0 0 0 0 0 0 0 2 V2000 + 4.2842 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2842 -1.3283 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 3.1294 -1.9925 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9805 -1.3283 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8257 -1.9925 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8257 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9805 -3.9910 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1294 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2842 -3.9910 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2842 -5.3193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1294 -5.9835 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9805 -5.3193 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6642 -5.5168 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.3620 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4330 -1.9925 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 6 14 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 12 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 +M CHG 2 2 1 15 -1 +M END +> +inactive + +$$$$ + + + + 12 11 0 0 0 0 0 0 0 0 1 V2000 + 3.3277 -1.1482 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9859 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3169 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9825 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3135 -1.1482 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9825 -3.4520 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9966 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3311 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9966 -3.4520 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9859 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3169 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 1 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 12 11 0 0 0 0 0 0 0 0 1 V2000 + 3.3277 -1.1482 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9859 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3169 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9825 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3135 -1.1482 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9825 -3.4520 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9966 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3311 -2.3038 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9966 -3.4520 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3038 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9859 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3169 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 2 0 0 0 0 + 11 12 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 11 10 0 0 0 0 0 0 0 0 1 V2000 + 3.9901 -2.3031 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3261 -1.1486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9921 -1.1486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3280 -2.3031 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3031 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3280 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3182 -2.3031 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9822 -1.1486 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3182 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3261 -3.4517 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9921 -3.4517 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 10 11 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 10 9 0 0 0 0 0 0 0 0 1 V2000 + 1.9973 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9973 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6658 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9899 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6557 -3.4592 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6658 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3046 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 10 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 3.3269 -3.4585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9925 -3.4585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3283 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9925 -1.1548 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3269 -1.1548 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3194 -2.3037 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9835 -1.1548 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3283 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3283 -4.6073 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 10 9 0 0 0 0 0 0 0 0 1 V2000 + 1.9973 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 -2.3046 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9973 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6658 -1.1546 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6584 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9899 -4.6091 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6557 -3.4592 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6658 -3.4592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3046 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 9 10 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 2.3046 -1.9992 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4569 -2.6618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6092 -1.9992 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6092 -0.6683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4569 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7615 -2.6618 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3046 -0.6683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1523 -2.6618 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9992 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 1 0 0 0 0 + 8 9 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 8 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6654 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9962 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9877 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6531 -1.1540 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9877 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 13 14 0 0 0 0 0 0 0 0 1 V2000 + 2.2670 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5961 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2606 -1.1490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5961 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2670 -2.3042 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5962 -1.1490 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5962 -3.4532 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1427 -4.6705 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4408 -4.9438 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8507 -6.2108 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1490 -5.5587 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.8941 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2795 -3.5961 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 2 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 13 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 11 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 14 15 0 0 0 0 0 0 0 0 2 V2000 + 5.5085 -1.1540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1727 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5085 -3.4554 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1800 -3.4554 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5091 -2.3014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1800 -1.1540 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 3.5091 0.0000 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0 + 3.5091 -4.6027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0525 -5.8171 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0662 -6.7095 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9122 -6.0453 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1873 -4.7436 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3016 -3.7573 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.0324 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 4 8 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 12 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 +M CHG 2 6 1 7 -1 +M END +> +inactive + +$$$$ + + + + 8 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6654 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9962 -1.1540 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9877 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6531 -1.1540 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9877 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6569 -2.3033 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 7 7 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.5998 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -2.2653 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -1.5998 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4416 -0.2777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7417 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4072 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5169 -2.1419 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 13 12 0 0 0 0 0 0 0 0 1 V2000 + 3.3259 -3.4535 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9879 -2.2970 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3259 -1.1485 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9939 -1.1485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3320 -2.2970 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9939 -3.4535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.2970 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9879 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3199 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3199 -2.2970 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9818 -3.4535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3138 -3.4535 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9758 -4.6020 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 10 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 2 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 10 9 0 0 0 0 0 0 0 0 1 V2000 + 2.3042 -1.9989 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3042 -0.6682 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1521 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1521 -2.6614 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9989 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 -2.6614 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6084 -1.9989 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7605 -2.6614 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6084 -0.6682 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 1 7 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 10 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 5.7578 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6046 -2.6612 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4595 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3063 -2.6612 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1532 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3306 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7578 -0.6693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9109 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0641 -0.6693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0641 -1.9999 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9109 -2.6612 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 2 0 0 0 0 + 1 11 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 17 18 0 0 0 0 0 0 0 0 1 V2000 + 2.3044 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3044 -1.3295 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4567 -1.9942 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7640 -2.2232 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6208 -1.2039 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9281 -1.4329 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3860 -2.6885 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5292 -3.7078 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2219 -3.4714 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4567 -3.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6089 -3.9884 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3044 -3.9884 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1522 -3.3237 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9884 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1522 -1.9942 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9146 -0.7460 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2219 -0.5096 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 3 16 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 9 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 10 11 2 0 0 0 0 + 10 12 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 15 1 0 0 0 0 + 16 17 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 17 19 0 0 0 0 0 0 0 0 1 V2000 + 5.7546 -2.6609 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9055 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9055 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7546 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6037 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6037 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4528 -2.6609 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3018 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 -2.6609 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1509 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3018 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0564 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2074 -0.6629 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2074 -1.9980 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0564 -2.6609 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 17 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 14 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 8 13 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 14 15 2 0 0 0 0 + 15 16 1 0 0 0 0 + 16 17 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 23 26 0 0 0 0 0 0 0 0 1 V2000 + 4.6025 -7.9798 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6025 -6.6499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4579 -5.9889 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4579 -4.6589 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3053 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1526 -4.6589 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.6599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1526 -1.9990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3053 -2.6599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1526 -5.9889 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3053 -6.6499 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6025 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7552 -4.6589 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7552 -5.9889 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9078 -3.9899 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0604 -4.6589 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9078 -2.6599 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7552 -1.9990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7552 -0.6690 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9078 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0604 -0.6690 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0604 -1.9990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 13 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 10 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 2 0 0 0 0 + 11 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 16 1 0 0 0 0 + 16 17 2 0 0 0 0 + 16 18 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 23 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 11 11 0 0 0 0 0 0 0 0 1 V2000 + 1.9925 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -1.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9835 -2.3037 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9910 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6567 -3.4525 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6552 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6642 -2.3037 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.4525 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.1488 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 7 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 11 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 24 24 0 0 0 0 0 0 0 0 1 V2000 + 4.6016 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6016 -1.3369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4512 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4512 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3008 -3.9901 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1504 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1504 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3008 -1.3369 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3008 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -3.9901 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6016 -3.9901 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7623 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7623 -2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9127 -1.3369 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9127 -3.9901 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0631 -3.3268 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2135 -3.9901 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2135 -5.3270 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0631 -5.9903 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9127 -5.3270 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3639 -5.9903 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3639 -3.3268 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1819 -7.3169 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8554 -7.3169 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 13 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 11 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 6 10 1 0 0 0 0 + 7 8 2 0 0 0 0 + 8 9 1 0 0 0 0 + 11 12 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 15 1 0 0 0 0 + 13 14 1 0 0 0 0 + 15 16 2 0 0 0 0 + 15 20 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 2 0 0 0 0 + 17 22 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 21 1 0 0 0 0 + 19 20 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 25 26 0 0 0 0 0 0 0 0 1 V2000 + 10.6420 -6.9191 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9717 -8.0683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6429 -8.0683 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9845 -6.9191 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6429 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9717 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9845 -4.6088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6429 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9845 -2.3104 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6429 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9717 -1.1492 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6420 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6420 -2.3104 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9717 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.9708 -2.3104 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6558 -4.6088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9854 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6566 -5.7580 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9863 -4.6088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6575 -4.6088 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6566 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9854 -3.4596 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6420 -9.2175 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.5609 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3288 -4.5609 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 23 1 0 0 0 0 + 3 4 2 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 16 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 14 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 11 12 1 0 0 0 0 + 11 13 1 0 0 0 0 + 13 14 2 0 0 0 0 + 13 15 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 22 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 2 0 0 0 0 + 19 21 1 0 0 0 0 + 21 22 2 0 0 0 0 + 24 25 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 24 25 0 0 0 0 0 0 0 0 1 V2000 + 7.9826 -4.6086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6532 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9826 -2.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6532 -1.1495 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9730 -1.1495 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6435 -2.2990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9730 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6435 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6532 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9730 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6435 -6.9076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9730 -8.0678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6532 -8.0678 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9826 -6.9076 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6435 -9.2173 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6522 -4.6086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9923 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6619 -5.7581 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9913 -4.6086 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6619 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9923 -3.4591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6609 -4.6086 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.5554 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3304 -4.5554 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 1 16 2 0 0 0 0 + 2 3 2 0 0 0 0 + 2 7 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 8 1 0 0 0 0 + 6 7 2 0 0 0 0 + 9 10 2 0 0 0 0 + 9 14 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 2 0 0 0 0 + 12 13 1 0 0 0 0 + 12 15 1 0 0 0 0 + 13 14 2 0 0 0 0 + 16 17 1 0 0 0 0 + 16 21 1 0 0 0 0 + 17 18 2 0 0 0 0 + 18 19 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 22 2 0 0 0 0 + 20 21 2 0 0 0 0 + 23 24 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 43 47 0 0 1 0 0 0 0 0 1 V2000 + 4.6024 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6024 -9.9693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -9.3118 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9112 -9.9693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 -9.3118 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2048 -9.9693 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2048 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 -11.9723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9112 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -11.9723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3668 -11.9723 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 -7.9815 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -7.9815 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -9.3118 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -7.9815 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6024 -7.3088 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6024 -5.9785 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -5.3210 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -3.9908 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9112 -3.3180 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9112 -1.9877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 -1.3303 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2048 -1.9877 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3668 -1.3303 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2048 -3.3180 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 -3.9908 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3668 -3.9908 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0580 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7644 -1.3303 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -5.3210 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -3.9908 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 -5.9785 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 -7.3088 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1468 -7.9815 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1468 -5.3210 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -11.9723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4556 -13.3026 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 -13.9600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1468 -13.3026 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -13.9600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1468 -11.9723 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 -11.2995 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3088 -15.2903 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 1 10 1 0 0 0 0 + 1 36 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 13 2 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 12 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 11 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 15 14 1 1 0 0 0 + 15 16 1 0 0 0 0 + 15 33 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 18 1 1 0 0 0 + 17 30 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 19 1 1 0 0 0 + 20 21 1 0 0 0 0 + 20 26 1 0 0 0 0 + 21 22 1 0 0 0 0 + 21 29 1 6 0 0 0 + 22 23 1 0 0 0 0 + 22 28 1 6 0 0 0 + 23 24 1 1 0 0 0 + 23 25 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 27 1 6 0 0 0 + 30 31 1 6 0 0 0 + 30 32 1 0 0 0 0 + 32 33 1 0 0 0 0 + 32 35 1 1 0 0 0 + 33 34 1 6 0 0 0 + 36 37 2 0 0 0 0 + 36 42 1 0 0 0 0 + 37 38 1 0 0 0 0 + 38 39 2 0 0 0 0 + 38 43 1 0 0 0 0 + 39 40 1 0 0 0 0 + 39 41 1 0 0 0 0 + 41 42 2 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 5 4 0 0 0 0 0 0 0 0 1 V2000 + 3.4567 -1.9945 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 -1.3308 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1511 -1.9945 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3308 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3056 0.0000 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 5 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END +> +inactive + +$$$$ + + + + 6 5 0 0 0 0 0 0 0 0 1 V2000 + 4.6084 -1.9954 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4563 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3042 -1.9954 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1521 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 3 2 0 0 0 0 0 0 0 0 1 V2000 + 2.3030 -0.6656 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1515 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -0.6656 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 13 12 0 0 0 0 0 0 0 0 2 V2000 + 0.0000 -1.1513 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3274 -1.1513 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0 + 2.6611 -1.1513 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3217 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6554 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3159 -1.1513 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6554 -2.3025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3217 -2.3025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6611 -6.2911 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6611 -4.9636 0.0000 B 0 5 0 0 0 0 0 0 0 0 0 0 + 1.3274 -4.9636 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6611 -3.6299 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9885 -4.9636 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 3 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 2 0 0 0 0 + 3 8 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 13 1 0 0 0 0 +M CHG 2 2 1 10 -1 +M END +> +inactive + +$$$$ + + + + 12 12 0 0 0 0 0 0 0 0 1 V2000 + 3.4560 -1.3271 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6103 -1.9906 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6103 -3.3247 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4560 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3017 -3.3247 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3017 -1.9906 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1543 -1.3271 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9906 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1543 -3.9882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7577 -3.9882 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9120 -3.3247 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4560 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 10 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 9 1 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 2 0 0 0 0 + 10 11 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 4.6053 -1.9954 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4522 -1.3257 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2992 -1.9954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1530 -1.3257 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.9954 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1530 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6053 -3.3210 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7514 -1.3257 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9045 -1.9954 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 7 1 0 0 0 0 + 1 8 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 1 0 0 0 0 + 8 9 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 10 10 0 0 0 0 0 0 0 0 1 V2000 + 0.6656 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9968 -1.1543 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6577 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9889 -2.3040 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6545 -1.1543 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9968 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6656 -3.4583 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3040 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -4.6079 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 1 0 0 0 0 + 1 8 1 0 0 0 0 + 1 10 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 2 0 0 0 0 + 6 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 +M END +> +active + +$$$$ + + + + 9 9 0 0 0 0 0 0 0 0 1 V2000 + 2.1136 -0.3740 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3772 -0.7820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3772 -2.1136 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1136 -2.5272 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3316 -1.4506 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.4506 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4538 -2.8956 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6665 -2.3572 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4538 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 9 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 9 8 0 0 0 0 0 0 0 0 1 V2000 + 0.0000 -1.1552 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6644 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9932 -2.3044 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6576 -1.1552 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9932 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9924 -1.1552 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6568 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6568 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9855 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 2 0 0 0 0 + 4 6 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 8 9 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 7 7 0 0 0 0 0 0 0 0 1 V2000 + 3.5169 -2.1419 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3050 -1.5998 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4416 -0.2777 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7417 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4072 -1.1547 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1503 -2.2653 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.5998 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 5 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 6 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 7 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 14 14 0 0 0 0 0 0 0 0 1 V2000 + 1.9935 -3.4527 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3316 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9935 -1.1482 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3251 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9869 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3186 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9804 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3120 -1.1482 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9739 -2.3044 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3120 -3.4527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9804 -3.4527 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3316 0.0000 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.3044 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 12 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 0 0 0 0 + 12 13 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 6 6 0 0 0 0 0 0 0 0 1 V2000 + 2.2694 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2694 -1.3318 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9376 -1.3318 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.2694 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3409 -3.5516 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9376 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 6 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 6 1 0 0 0 0 + 4 5 2 0 0 0 0 +M END +> +active + +$$$$ + + + + 6 4 0 0 0 0 0 0 0 0 2 V2000 + 2.6600 -2.6600 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 -1.3320 0.0000 B 0 5 0 0 0 0 0 0 0 0 0 0 + 1.3280 -1.3320 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6600 0.0000 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9880 -1.3320 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.3320 0.0000 Na 0 3 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 +M CHG 2 2 -1 6 1 +M END +> +inactive + diff --git a/test/data/hamster_carcinogenicity.xls b/test/data/hamster_carcinogenicity.xls new file mode 100644 index 0000000..680c30e Binary files /dev/null and b/test/data/hamster_carcinogenicity.xls differ diff --git a/test/data/hamster_carcinogenicity.yaml b/test/data/hamster_carcinogenicity.yaml new file mode 100644 index 0000000..108edd9 --- /dev/null +++ b/test/data/hamster_carcinogenicity.yaml @@ -0,0 +1,352 @@ +--- !ruby/object:OpenTox::Dataset +compounds: +- http://localhost/compound/InChI=1S/C2H4O/c1-2-3/h2H,1H3 +- http://localhost/compound/InChI=1S/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17) +- http://localhost/compound/InChI=1S/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14) +- http://localhost/compound/InChI=1S/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6) +- http://localhost/compound/InChI=1S/BrHO3.K/c2-1(3)4;/h(H,2,3,4);/q;+1/p-1 +- http://localhost/compound/InChI=1S/Cd.2ClH/h;2*1H/q+2;;/p-2 +- http://localhost/compound/InChI=1S/Cd.H2O4S/c;1-5(2,3)4/h;(H2,1,2,3,4)/q+2;/p-2 +- http://localhost/compound/InChI=1S/C14H14ClN3O2S/c1-8-4-3-5-10(9(8)2)16-12-6-11(15)17-14(18-12)21-7-13(19)20/h3-6H,7H2,1-2H3,(H,19,20)(H,16,17,18) +- http://localhost/compound/InChI=1S/C2H5ClO/c1-4-2-3/h2H2,1H3 +- http://localhost/compound/InChI=1S/C4H5Cl/c1-3-4(2)5/h3H,1-2H2 +- http://localhost/compound/InChI=1S/C17H17ClO3/c1-17(2,16(19)20)21-11-12-3-5-13(6-4-12)14-7-9-15(18)10-8-14/h3-10H,11H2,1-2H3,(H,19,20) +- http://localhost/compound/InChI=1S/C9H6O2/c10-9-6-5-7-3-1-2-4-8(7)11-9/h1-6H +- http://localhost/compound/InChI=1S/C14H8Cl4/c15-11-5-1-9(2-6-11)13(14(17)18)10-3-7-12(16)8-4-10/h1-8H +- http://localhost/compound/InChI=1S/C14H9Cl5/c15-11-5-1-9(2-6-11)13(14(17,18)19)10-3-7-12(16)8-4-10/h1-8,13H +- http://localhost/compound/InChI=1S/C6H10N2O/c1-3-5-8(7-9)6-4-2/h3-4H,1-2,5-6H2 +- http://localhost/compound/InChI=1S/C12H8Cl6O/c13-8-9(14)11(16)5-3-1-2(6-7(3)19-6)4(5)10(8,15)12(11,17)18/h2-7H,1H2 +- http://localhost/compound/InChI=1S/C3H6ClNO/c1-5(2)3(4)6/h1-2H3 +- http://localhost/compound/InChI=1S/C2H8N2/c1-4(2)3/h3H2,1-2H3 +- http://localhost/compound/InChI=1S/C2H8N2.2ClH/c1-3-4-2;;/h3-4H,1-2H3;2*1H +- http://localhost/compound/InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3 +- http://localhost/compound/InChI=1S/C5H11N3O3/c1-2-8(7-11)5(10)6-3-4-9/h9H,2-4H2,1H3,(H,6,10) +- http://localhost/compound/InChI=1S/C6H11N3O3/c1-3-9(8-12)6(11)7-4-5(2)10/h3-4H2,1-2H3,(H,7,11) +- http://localhost/compound/InChI=1S/CH2O/c1-2/h1H2 +- http://localhost/compound/InChI=1S/C8H6N4O4S/c13-4-9-11-8-10-5(3-17-8)6-1-2-7(16-6)12(14)15/h1-4H,(H,9,13)(H,10,11) +- http://localhost/compound/InChI=1S/C5H4O2/c6-4-5-2-1-3-7-5/h1-4H +- http://localhost/compound/InChI=1S/C3H6O2/c4-1-3-2-5-3/h3-4H,1-2H2 +- http://localhost/compound/InChI=1S/C17H17ClO6/c1-8-5-9(19)6-12(23-4)17(8)16(20)13-10(21-2)7-11(22-3)14(18)15(13)24-17/h6-8H,5H2,1-4H3/t8-,17?/m1/s1 +- http://localhost/compound/InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9 +- http://localhost/compound/InChI=1S/H4N2/c1-2/h1-2H2 +- http://localhost/compound/InChI=1S/H4N2.H2O4S/c1-2;1-5(2,3)4/h1-2H2;(H2,1,2,3,4) +- http://localhost/compound/InChI=1S/C15H13NO2/c1-10(17)16(18)13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9,18H,8H2,1H3 +- http://localhost/compound/InChI=1S/C2H8N2O/c3-4-1-2-5/h4-5H,1-3H2 +- http://localhost/compound/InChI=1S/C6H7N3O/c7-9-6(10)5-1-3-8-4-2-5/h1-4H,7H2,(H,9,10) +- http://localhost/compound/InChI=1S/C6H5NO2/c8-6(9)5-1-3-7-4-2-5/h1-4H,(H,8,9) +- http://localhost/compound/InChI=1S/C10H12ClNO2/c1-7(2)14-10(13)12-9-5-3-4-8(11)6-9/h3-7H,1-2H3,(H,12,13) +- http://localhost/compound/InChI=1S/C10H13NO2/c1-8(2)13-10(12)11-9-6-4-3-5-7-9/h3-8H,1-2H3,(H,11,12) +- http://localhost/compound/InChI=1S/2C2H4O2.4H2O.3Pb/c2*1-2(3)4;;;;;;;/h2*1H3,(H,3,4);4*1H2;;;/q;;;;;;3*+2/p-6 +- http://localhost/compound/InChI=1S/C14H19N3S.ClH/c1-16(2)9-10-17(12-13-6-5-11-18-13)14-7-3-4-8-15-14;/h3-8,11H,9-10,12H2,1-2H3;1H +- http://localhost/compound/InChI=1S/C20H22N8O5/c1-28(9-11-8-23-17-15(24-11)16(21)26-20(22)27-17)12-4-2-10(3-5-12)18(31)25-13(19(32)33)6-7-14(29)30/h2-5,8,13H,6-7,9H2,1H3,(H,25,31)(H,29,30)(H,32,33)(H4,21,22,23,26,27)/t13-/m0/s1 +- http://localhost/compound/InChI=1S/C2H6N2O/c1-4(3)2-5/h2H,3H2,1H3 +- http://localhost/compound/InChI=1S/C5H8O2/c1-4(2)5(6)7-3/h1H2,2-3H3 +- http://localhost/compound/InChI=1S/CH6N2/c1-3-2/h3H,2H2,1H3 +- http://localhost/compound/InChI=1S/C10H13N3O2/c1-13(12-15)7-3-5-10(14)9-4-2-6-11-8-9/h2,4,6,8H,3,5,7H2,1H3 +- http://localhost/compound/InChI=1S/C5H6N2OS/c1-3-2-4(8)7-5(9)6-3/h2H,1H3,(H2,6,7,8,9) +- http://localhost/compound/InChI=1S/C20H22O3/c1-20(2,19(21)22)23-16-12-10-15(11-13-16)18-9-5-7-14-6-3-4-8-17(14)18/h3-4,6,8,10-13,18H,5,7,9H2,1-2H3,(H,21,22) +- http://localhost/compound/InChI=1S/HNO2.Na/c2-1-3;/h(H,2,3);/q;+1/p-1 +- http://localhost/compound/InChI=1S/C9H7N3O4S/c1-5(13)10-9-11-6(4-17-9)7-2-3-8(16-7)12(14)15/h2-4H,1H3,(H,10,11,13) +- http://localhost/compound/InChI=1S/C8H5N3O4S/c12-4-9-8-10-5(3-16-8)6-1-2-7(15-6)11(13)14/h1-4H,(H,9,10,12) +- http://localhost/compound/InChI=1S/C12H9NO2/c14-13(15)11-7-6-9-5-4-8-2-1-3-10(11)12(8)9/h1-3,6-7H,4-5H2 +- http://localhost/compound/InChI=1S/C6H14N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h5-6,9-11H,2-4H2,1H3 +- http://localhost/compound/InChI=1S/C6H12N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h6,9,11H,2-4H2,1H3 +- http://localhost/compound/InChI=1S/C5H12N2O4/c8-2-1-7(6-11)3-5(10)4-9/h5,8-10H,1-4H2 +- http://localhost/compound/InChI=1S/C5H10N2O3/c1-5(9)4-7(6-10)2-3-8/h8H,2-4H2,1H3 +- http://localhost/compound/InChI=1S/C7H15N3O/c1-6-4-10(8-11)5-7(2)9(6)3/h6-7H,4-5H2,1-3H3 +- http://localhost/compound/InChI=1S/C6H10N2O2/c1-3-4-8(7-10)5-6(2)9/h3H,1,4-5H2,2H3 +- http://localhost/compound/InChI=1S/C4H10N2O3/c1-6(5-9)2-4(8)3-7/h4,7-8H,2-3H2,1H3 +- http://localhost/compound/InChI=1S/C4H8N2O2/c7-5-6-1-3-8-4-2-6/h1-4H2 +- http://localhost/compound/InChI=1S/C9H11N3O/c13-11-12-6-2-4-9(12)8-3-1-5-10-7-8/h1,3,5,7,9H,2,4,6H2 +- http://localhost/compound/InChI=1S/C9H11N3O2/c13-10-12-6-2-4-9(12)8-3-1-5-11(14)7-8/h1,3,5,7,9H,2,4,6H2 +- http://localhost/compound/InChI=1S/C5H10N2O/c8-6-7-4-2-1-3-5-7/h1-5H2 +- http://localhost/compound/InChI=1S/C4H8N2O/c7-5-6-3-1-2-4-6/h1-4H2 +- http://localhost/compound/InChI=1S/C6H10ClN3O3/c1-5(11)4-10(9-13)6(12)8-3-2-7/h2-4H2,1H3,(H,8,12) +- http://localhost/compound/InChI=1S/C4H7N3O3/c1-3(8)2-7(6-10)4(5)9/h2H2,1H3,(H2,5,9) +- http://localhost/compound/InChI=1S/C9H9NS/c11-8-10-7-6-9-4-2-1-3-5-9/h1-5H,6-7H2 +- http://localhost/compound/InChI=1S/C12H12N2O3/c1-2-12(8-6-4-3-5-7-8)9(15)13-11(17)14-10(12)16/h3-7H,2H2,1H3,(H2,13,14,15,16,17) +- http://localhost/compound/InChI=1S/C16H13N/c1-2-8-15(9-3-1)17-16-11-10-13-6-4-5-7-14(13)12-16/h1-12,17H +- http://localhost/compound/InChI=1S/C19H24N2O2/c22-18-13-20(19(23)15-7-2-1-3-8-15)12-17-16-9-5-4-6-14(16)10-11-21(17)18/h4-6,9,15,17H,1-3,7-8,10-13H2 +- http://localhost/compound/InChI=1S/C7H6O4/c8-5-2-1-4(7(10)11)3-6(5)9/h1-3,8-9H,(H,10,11) +- http://localhost/compound/InChI=1S/C15H10O7.2H2O/c16-7-4-10(19)12-11(5-7)22-15(14(21)13(12)20)6-1-2-8(17)9(18)3-6;;/h1-5,16-19,21H;2*1H2 +- http://localhost/compound/InChI=1S/C20H19N3.ClH/c1-13-12-16(6-11-19(13)23)20(14-2-7-17(21)8-3-14)15-4-9-18(22)10-5-15;/h2-12,21H,22-23H2,1H3;1H +- http://localhost/compound/InChI=1S/C19H17N3.ClH/c20-16-7-1-13(2-8-16)19(14-3-9-17(21)10-4-14)15-5-11-18(22)12-6-15;/h1-12,20H,21-22H2;1H +- http://localhost/compound/InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27?/m0/s1 +- http://localhost/compound/InChI=1S/C2HCl3/c3-1-2(4)5/h1H +- http://localhost/compound/InChI=1S/C3H7NO2/c1-2-6-3(4)5/h2H2,1H3,(H2,4,5) +- http://localhost/compound/InChI=1S/C2H3Cl/c1-2-3/h2H,1H2 +- http://localhost/compound/InChI=1S/C6H5N2.BF4/c7-8-6-4-2-1-3-5-6;2-1(3,4)5/h1-5H;/q+1;-1 +- http://localhost/compound/InChI=1S/C6H12N4O2/c1-5-3-9(7-11)4-6(2)10(5)8-12/h5-6H,3-4H2,1-2H3 +- http://localhost/compound/InChI=1S/C5H13N3O/c1-7(2)4-5-8(3)6-9/h4-5H2,1-3H3 +- http://localhost/compound/InChI=1S/C6H12N2O2/c1-5-3-8(7-9)4-6(2)10-5/h5-6H,3-4H2,1-2H3 +- http://localhost/compound/InChI=1S/C4H6N2O3/c1-3-2-6(5-8)4(7)9-3/h3H,2H2,1H3 +- http://localhost/compound/InChI=1S/C4H8N2O3/c1-3-9-4(7)6(2)5-8/h3H2,1-2H3 +- http://localhost/compound/InChI=1S/C3H6N2O2/c6-4-5-1-2-7-3-5/h1-3H2 +- http://localhost/compound/InChI=1S/C9H11N3O2/c10-9(13)12(11-14)7-6-8-4-2-1-3-5-8/h1-5H,6-7H2,(H2,10,13) +- http://localhost/compound/InChI=1S/C3H6N2O/c6-4-5-2-1-3-5/h1-3H2 +- http://localhost/compound/InChI=1S/BF4.Na/c2-1(3,4)5;/q-1;+1 +data_entries: + http://localhost/compound/InChI=1S/C14H8Cl4/c15-11-5-1-9(2-6-11)13(14(17)18)10-3-7-12(16)8-4-10/h1-8H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C3H6ClNO/c1-5(2)3(4)6/h1-2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C2H8N2O/c3-4-1-2-5/h4-5H,1-3H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C4H10N2O3/c1-6(5-9)2-4(8)3-7/h4,7-8H,2-3H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/CH2O/c1-2/h1H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C5H12N2O4/c8-2-1-7(6-11)3-5(10)4-9/h5,8-10H,1-4H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C7H15N3O/c1-6-4-10(8-11)5-7(2)9(6)3/h6-7H,4-5H2,1-3H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C4H8N2O2/c7-5-6-1-3-8-4-2-6/h1-4H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C16H13N/c1-2-8-15(9-3-1)17-16-11-10-13-6-4-5-7-14(13)12-16/h1-12,17H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C3H6O2/c4-1-3-2-5-3/h3-4H,1-2H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C4H6N2O3/c1-3-2-6(5-8)4(7)9-3/h3H,2H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H5NO2/c8-6(9)5-1-3-7-4-2-5/h1-4H,(H,8,9): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/2C2H4O2.4H2O.3Pb/c2*1-2(3)4;;;;;;;/h2*1H3,(H,3,4);4*1H2;;;/q;;;;;;3*+2/p-6: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C17H17ClO6/c1-8-5-9(19)6-12(23-4)17(8)16(20)13-10(21-2)7-11(22-3)14(18)15(13)24-17/h6-8H,5H2,1-4H3/t8-,17?/m1/s1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C3H6N2O2/c6-4-5-1-2-7-3-5/h1-3H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C3H7NO2/c1-2-6-3(4)5/h2H2,1H3,(H2,4,5): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C5H8O2/c1-4(2)5(6)7-3/h1H2,2-3H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C2H6N2O/c1-4(3)2-5/h2H,3H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H12N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h6,9,11H,2-4H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C5H4O2/c6-4-5-2-1-3-7-5/h1-4H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C4H8N2O/c7-5-6-3-1-2-4-6/h1-4H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C9H11N3O2/c10-9(13)12(11-14)7-6-8-4-2-1-3-5-8/h1-5H,6-7H2,(H2,10,13): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C14H14ClN3O2S/c1-8-4-3-5-10(9(8)2)16-12-6-11(15)17-14(18-12)21-7-13(19)20/h3-6H,7H2,1-2H3,(H,19,20)(H,16,17,18): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/H4N2.H2O4S/c1-2;1-5(2,3)4/h1-2H2;(H2,1,2,3,4): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C5H10N2O/c8-6-7-4-2-1-3-5-7/h1-5H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C10H13N3O2/c1-13(12-15)7-3-5-10(14)9-4-2-6-11-8-9/h2,4,6,8H,3,5,7H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C3H6N2O/c6-4-5-2-1-3-5/h1-3H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C4H8N2O3/c1-3-9-4(7)6(2)5-8/h3H2,1-2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H10N2O2/c1-3-4-8(7-10)5-6(2)9/h3H,1,4-5H2,2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C14H9Cl5/c15-11-5-1-9(2-6-11)13(14(17,18)19)10-3-7-12(16)8-4-10/h1-8,13H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/BrHO3.K/c2-1(3)4;/h(H,2,3,4);/q;+1/p-1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C2H5ClO/c1-4-2-3/h2H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C10H12ClNO2/c1-7(2)14-10(13)12-9-5-3-4-8(11)6-9/h3-7H,1-2H3,(H,12,13): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C8H5N3O4S/c12-4-9-8-10-5(3-16-8)6-1-2-7(15-6)11(13)14/h1-4H,(H,9,10,12): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/Cd.2ClH/h;2*1H/q+2;;/p-2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C20H19N3.ClH/c1-13-12-16(6-11-19(13)23)20(14-2-7-17(21)8-3-14)15-4-9-18(22)10-5-15;/h2-12,21H,22-23H2,1H3;1H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/BF4.Na/c2-1(3,4)5;/q-1;+1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C6H5N2.BF4/c7-8-6-4-2-1-3-5-6;2-1(3,4)5/h1-5H;/q+1;-1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C9H6O2/c10-9-6-5-7-3-1-2-4-8(7)11-9/h1-6H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C2HCl3/c3-1-2(4)5/h1H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C2H8N2/c1-4(2)3/h3H2,1-2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H7N3O/c7-9-6(10)5-1-3-8-4-2-5/h1-4H,7H2,(H,9,10): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C12H8Cl6O/c13-8-9(14)11(16)5-3-1-2(6-7(3)19-6)4(5)10(8,15)12(11,17)18/h2-7H,1H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/Cd.H2O4S/c;1-5(2,3)4/h;(H2,1,2,3,4)/q+2;/p-2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C5H10N2O3/c1-5(9)4-7(6-10)2-3-8/h8H,2-4H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27?/m0/s1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C12H12N2O3/c1-2-12(8-6-4-3-5-7-8)9(15)13-11(17)14-10(12)16/h3-7H,2H2,1H3,(H2,13,14,15,16,17): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C8H6N4O4S/c13-4-9-11-8-10-5(3-17-8)6-1-2-7(16-6)12(14)15/h1-4H,(H,9,13)(H,10,11): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C9H7N3O4S/c1-5(13)10-9-11-6(4-17-9)7-2-3-8(16-7)12(14)15/h2-4H,1H3,(H,10,11,13): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/CH6N2/c1-3-2/h3H,2H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C12H9NO2/c14-13(15)11-7-6-9-5-4-8-2-1-3-10(11)12(8)9/h1-3,6-7H,4-5H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C15H10O7.2H2O/c16-7-4-10(19)12-11(5-7)22-15(14(21)13(12)20)6-1-2-8(17)9(18)3-6;;/h1-5,16-19,21H;2*1H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C7H6O4/c8-5-2-1-4(7(10)11)3-6(5)9/h1-3,8-9H,(H,10,11): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C9H9NS/c11-8-10-7-6-9-4-2-1-3-5-9/h1-5H,6-7H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C20H22O3/c1-20(2,19(21)22)23-16-12-10-15(11-13-16)18-9-5-7-14-6-3-4-8-17(14)18/h3-4,6,8,10-13,18H,5,7,9H2,1-2H3,(H,21,22): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C6H12N2O2/c1-5-3-8(7-9)4-6(2)10-5/h5-6H,3-4H2,1-2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C10H13NO2/c1-8(2)13-10(12)11-9-6-4-3-5-7-9/h3-8H,1-2H3,(H,11,12): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C6H14N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h5-6,9-11H,2-4H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C19H24N2O2/c22-18-13-20(19(23)15-7-2-1-3-8-15)12-17-16-9-5-4-6-14(16)10-11-21(17)18/h4-6,9,15,17H,1-3,7-8,10-13H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C5H11N3O3/c1-2-8(7-11)5(10)6-3-4-9/h9H,2-4H2,1H3,(H,6,10): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C14H19N3S.ClH/c1-16(2)9-10-17(12-13-6-5-11-18-13)14-7-3-4-8-15-14;/h3-8,11H,9-10,12H2,1-2H3;1H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/H4N2/c1-2/h1-2H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C4H5Cl/c1-3-4(2)5/h3H,1-2H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C17H17ClO3/c1-17(2,16(19)20)21-11-12-3-5-13(6-4-12)14-7-9-15(18)10-8-14/h3-10H,11H2,1-2H3,(H,19,20): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C2H8N2.2ClH/c1-3-4-2;;/h3-4H,1-2H3;2*1H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H10ClN3O3/c1-5(11)4-10(9-13)6(12)8-3-2-7/h2-4H2,1H3,(H,8,12): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H11N3O3/c1-3-9(8-12)6(11)7-4-5(2)10/h3-4H2,1-2H3,(H,7,11): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C5H13N3O/c1-7(2)4-5-8(3)6-9/h4-5H2,1-3H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C5H6N2OS/c1-3-2-4(8)7-5(9)6-3/h2H,1H3,(H2,6,7,8,9): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C9H11N3O/c13-11-12-6-2-4-9(12)8-3-1-5-10-7-8/h1,3,5,7,9H,2,4,6H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H12N4O2/c1-5-3-9(7-11)4-6(2)10(5)8-12/h5-6H,3-4H2,1-2H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C19H17N3.ClH/c20-16-7-1-13(2-8-16)19(14-3-9-17(21)10-4-14)15-5-11-18(22)12-6-15;/h1-12,20H,21-22H2;1H: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/HNO2.Na/c2-1-3;/h(H,2,3);/q;+1/p-1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C2H3Cl/c1-2-3/h2H,1H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C6H10N2O/c1-3-5-8(7-9)6-4-2/h3-4H,1-2,5-6H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C9H11N3O2/c13-10-12-6-2-4-9(12)8-3-1-5-11(14)7-8/h1,3,5,7,9H,2,4,6H2: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C15H13NO2/c1-10(17)16(18)13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9,18H,8H2,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C20H22N8O5/c1-28(9-11-8-23-17-15(24-11)16(21)26-20(22)27-17)12-4-2-10(3-5-12)18(31)25-13(19(32)33)6-7-14(29)30/h2-5,8,13H,6-7,9H2,1H3,(H,25,31)(H,29,30)(H,32,33)(H4,21,22,23,26,27)/t13-/m0/s1: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - false + http://localhost/compound/InChI=1S/C4H7N3O3/c1-3(8)2-7(6-10)4(5)9/h2H2,1H3,(H2,5,9): + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true + http://localhost/compound/InChI=1S/C2H4O/c1-2-3/h2H,1H3: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + - true +features: + http://localhost/dataset/1/feature/hamster_carcinogenicity: + http://www.opentox.org/api/1.1#hasSource: hamster_carcinogenicity.csv + http://purl.org/dc/elements/1.1/title: hamster_carcinogenicity +metadata: + http://www.opentox.org/api/1.1#hasSource: hamster_carcinogenicity.csv + http://purl.org/dc/elements/1.1/title: hamster_carcinogenicity + http://www.w3.org/2001/XMLSchema#anyUri: http://localhost/dataset/1 +uri: http://localhost/dataset/1 diff --git a/test/data/hamster_carcinogenicity_with_errors.csv b/test/data/hamster_carcinogenicity_with_errors.csv new file mode 100644 index 0000000..e4f97e5 --- /dev/null +++ b/test/data/hamster_carcinogenicity_with_errors.csv @@ -0,0 +1,88 @@ +SMILES,Hamster Carcinogenicity +CC=O,1 +CC=O,1 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O,1 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1,1 +C1(N#C#N#N=1)N,0 +Br(=O)(=O)[O-].[K+],1 +[Cl-].[Cd+2].[Cl-],0 +O=S(=O)([O-])[O-].[Cd+2],0 +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C,0 +ClCOC,1 +C=C(Cl)C=C,0 +Clc1ccc(cc1)c2ccc(COC(C)(C)C(O)=O)cc2,0 +O=C1OC2=C(C=CC=C2)C=C1,0 +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl,1 +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl,0 +C=CCN(CC=C)N=O,1 +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45, +O=C(N(C)C)Cl,1 +CN(C)N,1 +N(NC)C.[H]Cl.[H]Cl,1 +CCO,0 +O=C(N(CC)N=O)NCCO,1 +O=C(N(CC)N=O)NCC(=O)C,1 +C#O,0 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O, +O=CC1=CC=CO1,0 +OCC1CO1,1 +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,0 +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O,1 +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,1 +NN,1 +OS(=O)(=O)O.NN,1 +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2,1 +OccNN,0 +O=C(C1=CC=NC=C1)NN,0 +OC(=O)C1=CC=NC=C1,0 +O=C(NC1=CC=CC(=C1)Cl)OC(C)C,0 +O=C(NC1=CC=CC=C1)OC(C)C,0 +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2],0 +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl,0 +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C,0 +CN(N)C=O,TRUE +O=C(C(=C)C)OC,0 +CNN,1 +O=C(C1=CC=CN=C1)CCCN(N=O)C,NA +CC1=CC(=O)NC(=S)N1,1 +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C,0 +O=N[O-].[Na+],0 +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O,1 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,1 +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-],0 +stupid error,1 +N(CC(CO)O)(CC(C)=O)N=O,1 +N(CC(CO)O)(CCO)N=O,0 +O=C(C)CN(N=O)CCO,1 +C1C(N(C(CN1N=O)C)C)C,1 +N(CC(C)=O)(CC=C)N=O,1 +N(CC(CO)O)(C)N=O,1 +O=NN1CCOCC1,1 +N1C=CC=C(C=1)C2N(N=O)CCC2,1 +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O,0 +O=NN1CCCCC1,1 +O=NN1CCCC1,1 +O=C(N(CC(C)=O)N=O)NCCCl,1 +N(C(=O)N)(N=O)CC(C)=O,1 +C1(CCN=C=S)=CC=CC=C1,0 +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC,0 +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2,0 +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4,0 +C1(=CC(=C(O)C=C1)O)C(O)=O,0 +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O,0 +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl,0 +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl,0 +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O,0 +ClC(=CCl)Cl,0 +NC(=O)OCC,1 +C=CCl,1 +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F,0 +C1(CN(CC(N1N=O)C)N=O)C,1 +N(CCN(C)C)(C)N=O,1 +C1(CN(N=O)CC(O1)C)C,1 +O1C(N(CC1C)N=O)=O,1 +CCOC(=O)N(C)N=O,1 +C1N(COC1)N=O,1 +O=C(N(CCC1=CC=CC=C1)N=O)N,1 +O=NN1CCC1,1 +F[B-](F)(F)F.[Na+],0 diff --git a/test/data/kazius.csv b/test/data/kazius.csv new file mode 100644 index 0000000..1a05f63 --- /dev/null +++ b/test/data/kazius.csv @@ -0,0 +1,4070 @@ +SMILES,Mutagenicity +COC1=CC=C(C=C1)C2=NC(=C([NH]2)C3=CC=CC=C3)C4=CC=CC=C4,1 +CC1=C(C=CC=C1N=C=O)N=C=O,1 +OCCC1=C[N](N=O)C2=CC=CC=C12,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)Br,1 +CN(N=O)C1=CC=CC=C1,1 +CN2C1=C(C=CC=C1)C(=O)C3=C2C4=C(C=C3O)OC(C4)C5(C)CO5,1 +CS(=O)(=O)NC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +[O-][N+](=O)C1=CC=C(C=C1)OC2=C(C=C(C=C2)Cl)Cl,1 +OC1=C(C=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +C[N]2C(=NC3=C1N=CC=NC1=C(C)C(=C23)C)N,1 +CSC1=C(C(=C(C(=C1)SC)N)C)N,1 +OC1=CC4=C(C=C1)C3=CC2=CC=CC=C2C=C3C5=CC=CC=C45,1 +CC(=O)C(Br)=C,1 +NCCNCCNCCN,1 +CN(C)C1=CC=C(C=C1)CCO,1 +COC4=CC(=O)C3=C2[NH]C1=CC=NC=C1C2=CN=C3C4=O,1 +N1C3C1C2=CSC=C2C4=CSC=C34,1 +CC1=C(C=C(C(=C1)N=NC2=CC=CC=C2)N)N,1 +NC3=CC2=NC1=CC(=CC=C1C=C2C=C3)N,1 +[O-][N+](=O)C3=C1CCC2=CC=CC(=C12)C=C3,1 +NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +COC(=O)C1(OC1(C)C(O)C(C)C)C(N)=O,1 +CC(I)C1OCC(CO)O1,1 +CN(C)CCNC(=O)C3=C2N=C1C=CC=CC1=NC2=CC=C3,1 +CC1=C(C=C(C=C1)N)C,1 +CC1=C3C(=CC=N1)C2=CC=CC=C2[NH]3,1 +OC1CN(CCO1)N=O,1 +[O-][N+](=O)C1=C(C=CC=C1)C(Cl)=O,1 +ClCCOP(OCCCl)OCCCl,1 +COC(=O)NC2=NC1=CC=CC=C1[NH]2,1 +CCOC(=O)N(CCCC(=O)C1=CN=CC=C1)N=O,1 +C1CSCCS1,1 +NC1=CC=C(C=C1)C2=CC=C(C=C2)Cl,1 +NNC2=C1C=CC=CC1=C(N=N2)NN,1 +C[N]3C(=NC4=CC=C2C=CC1=CC=C(O)C=C1C2=C34)C,1 +CC(=O)OC1=CC=C(C=C1)CCl,1 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +COC1=C(C=CC=C1)[N+]([O-])=O,1 +C1=CC2=C(C=C1)C4=C(C=C2)C3=NC=CC=C3C=C4,1 +OC2=C3C=CC4=CC=C(C5=C1C=CC=CC1=C(C=C2)C3=C45)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC(=C(C(=C1)[N+]([O-])=O)Cl)[N+]([O-])=O,1 +[O-][N+](=O)C1=C3C(=CC=C1)C2=CC=CC=C2C(O3)=O,1 +CC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)CO,1 +CC3=C2C=CC1=CC=CC=C1C2=CC4=CC=CC=C34,1 +CC1=CC=C(C=C1)S(=O)(=O)OCC2=CC=C(C=C2)[N+]([O-])=O,1 +CN1CCN(CC1)C5=CC(=O)C2=C(C4=C(C(=N2)C)C3=CC=CC=C3[NH]4)C5=O,1 +CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)O,1 +CC2C1=C(C=CC(=C1)F)C3=C2C=C(C=C3)F,1 +O=NC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +OC3C1OC1C2=C4C(=C(C=C2)O)C7=C5C(=C34)C(=CC=C5C6OC6C7=O)O,1 +OC(=O)C1=CC(=C(C=C1)Cl)[N+]([O-])=O,1 +N(C1=CC=CC=C1)C2=CC=C(C=C2)NC3=CC=CC=C3,1 +C[N+]3=C2C=CC1OC1C2=CC=C3,1 +COC1=C(C=C(C=C1)N)N,1 +CC(=O)NC1=CC=C(C=C1)C(=O)C2OC2C3=CC=CC=C3,1 +C[N]1C(=NC2=C1C=C(C)C3=NC(=CN=C23)C4=CC=CC=C4)N,1 +[O-][N+]([O-])=C1CCCC1,1 +COC2=C1OC(=CC1=C(C=C2)N(CCCl)CCCl)[N+]([O-])=O,1 +COC3=C(C=C2N=C1C=C(C(=CC1=NC2=C3)N)OC)N,1 +C[N]2C(=NC3=NC1=CC=CC=C1C=C23)N,1 +OC5C(O)C4=C(C3=NC2=C1C=CC=CC1=CC=C2C=C3C=C4)C6OC56,1 +NC3=C2C=C1C=CC=CC1=NC2=CC=C3,1 +[O-][N+](=O)C1=CC4=C2C(=C1)CCC3=C2C(=CC(=C3)[N+]([O-])=O)CC4,1 +[O-][N+](=O)C3=CC2=NC1=CC=CC=C1N=C2C=C3,1 +CCOP(=O)(OC1=CC=C(C=C1)[N+]([O-])=O)C2=CC=CC=C2,1 +[O-][N+](=O)C3=C2C=CC1=CC=CC4=C1C2=C(C=C3)C(=O)C4=O,1 +CC(C)S(Cl)(=O)=O,1 +CC3=C2C1=CC=CC=C1[NH]C2=CC(=N3)N,1 +ClCC(Cl)CBr,1 +CC2=C(N=C1C(=C(C=CC1=N2)N)C)C,1 +CC1=CC4=C(C=C1)C5=C2C=CC=CC2=CC6=C3C=CC=CC3=CC4=C56,1 +NC1=CC(=CC=C1)[N+]([O-])=O,1 +[O-][N+](=O)C2=C1SN=C(C1=CC=C2)Cl,1 +[O-][N+](=O)C4=C2C=CC=C3C1=CC=CC=C1C(=C23)C(=C4)[N+]([O-])=O,1 +[O-][N+](=O)C1=C(C=CC=C1)SSC(Cl)=C(Cl)Cl,1 +CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)Cl)[N+]([O-])=O,1 +COC4=CC(=O)C3=C2[NH]C1=C(CCCC1)C2=C(C)N=C3C4=O,1 +CC=CC=O,1 +C[N+]2=C1C=CC(=CC1=CC3=CC=CC=C23)N,1 +CC(=O)ON(C(C)=O)C1=CC=C(C=C1)SC2=CC=CC=C2,1 +CC1C=C(C=O)C(=CC2(O)CC(C)(C)CC12)C=O,1 +C1=CC2=C(C=C1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 +ClC2=C1C=CC=CC1=CC=C2,1 +C2C1=C(C=CC=C1)C3=C2C4=C(C=C3)C=CC5=C4C=CC=C5,1 +CC1=C(C=CC(=C1)N)N,1 +COC1=CC(=C(C=C1)OC)N=NC3=C2C=CC=CC2=CC=C3O,1 +CN(C)C1=CC=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3,1 +COP(=O)(OC)OC,1 +ClC(Cl)C#N,1 +[O-][N+](=O)C1=CC2=C(C=C1)NCC2,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)F,1 +C[N]1C(=NC=C1[N+]([O-])=O)C2NC(CO)(CO)CO2,1 +COC1=C(C=CC(=C1)O)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +COC(=O)C1=C(C=CC=C1)O,1 +O1C4C1C2=C(C=CC3=CC=CC=C23)C5=C4C=CC=C5,1 +CC1=CC(=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +O=C5C=C3C2=C(C=C1C=CC=CC1=C2)C4=C3C(=CC=C4)C5=O,1 +[O-][N+](=O)C1=CC=C(O1)C=CC=NN2CC(=O)NC2=O,1 +C[N]1C(=NC2=NC=C(C=C12)C3=CC=CC=C3)N,1 +BrC(=C)C=O,1 +CC(=O)NC(CSC(Cl)=C(Cl)C(Cl)=C(Cl)Cl)C(O)=O,1 +[O-][N+](=O)C2=C1C(=CC=CC1=CC=C2)[N+]([O-])=O,1 +COC4=C1C5=C(C(OC1=C3C2C=COC2OC3=C4)=O)C(CC5)O,1 +CC(=C)C2=CC=C(C)C1=CC=C(C=O)C1=C2,1 +CC1=CC=C[N]2C1=NC3=CC=C(N)N=C23,1 +C1=CC2=C(C=C1)C3=CN=C4C=CC=C5C=CC(=C2)C3=C45,1 +COC(=O)C(=CC1=CC=C(O1)[N+]([O-])=O)[N+]([O-])=O,1 +ClCC4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 +[O-][N+](=O)C1=CC(=C(C=C1)Cl)[N+]([O-])=O,1 +COC(=O)C(=CC1=CC=C(O1)[N+]([O-])=O)C#N,1 +C(N1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4)C5=CC=CC=C5,1 +OC1C(O)C5=C4C2=C1C=CC=C2C3=CC=CC=C3C4=C(C=C5)[N+]([O-])=O,1 +CN(C)C1=CC=C(C=C1)C=CC2=CC(C=C(C)O2)=C(C#N)C#N,1 +CCCCOCC1CO1,1 +OC(=O)C=CC1=CC(=CC=C1)[N+]([O-])=O,1 +NC(O)=NO,1 +FCC1CO1,1 +ClC(C(=O)NCC1=CC=CC=C1)C2=CC=CC=C2,1 +CC1(C)CC(O)CC(C)(C)N1O,1 +CC(=O)NC1=CC=C(C=C1)SC2=CC=CC=C2,1 +OC1=C(C=CC=C1)NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +CCC(=O)N(O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +O=CC1CC(=O)C(=O)CO1,1 +C(COCC1CO1)OCC2CO2,1 +C1CN1,1 +OCC(CBr)(CBr)CBr,1 +CCCCCCCCCCCCCCCCCC(=O)OCC1=CC=C2C(=CCC(C=C12)C(C)=C)C,1 +OC(=O)C1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +ONC1=CC=C(C=C1)SC2=CC=CC=C2,1 +CC1=CC=C[N]2C1=NC3=CC=C(NO)N=C23,1 +ClC1=NC=CC=C1,1 +FC2=CC1=NC=CC=C1C=C2,1 +CN(C)CCNC(=O)C2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3)=O,1 +NC1=CC=C(C=C1)N,1 +[O-][N+](=O)C3=CC2=C(C=C1C=CC=CC1=C2C=C3)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC4=C3C(=C1[N+]([O-])=O)C2=CC=CC=C2C3=CC=C4,1 +[O-][N+](=O)C1=CC=C(C=C1)C=C,1 +CN(CS(O)(=O)=O)C1=C(C)N(C)N(C1=O)C2=CC=CC=C2,1 +N1C5C1C3=C(C2=CC=CC=C2C4=CC=CC=C34)C6=C5C=CC=C6,1 +NC(=O)C(=CC1=CC=C(O1)[N+]([O-])=O)C2=CC=CO2,1 +NC2=CC=C1SN=C(Cl)C1=C2,1 +ClC1OC1CBr,1 +OC2=C1C=CC=NC1=CC=C2,1 +NC3=CC2=NC1=CC=CC(=C1N=C2C=C3)N,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)Br,1 +C1=CN=C(C=C1)C2=CC=NC=C2,1 +CC(C)C1CCC(C)CC1=O,1 +CCOS(C)(=O)=O,1 +O=NN1CCOCC1,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)C#N,1 +CCCC=CCC=O,1 +NNC(=O)CNC(=O)C=[N+]=[N-],1 +C=CCCCCC1CO1,1 +CC(=O)NC1=CC(=CC=C1)N,1 +CC1=C(C=CC=C1N)N,1 +OC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +CC1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 +[O-][N+](=O)C1=C(C=CC(=C1)N=[N+]=[N-])F,1 +COC4=CC(=O)C3=C2[NH]C1=CC=NC=C1C2=C(C)N=C3C4=O,1 +CCC=CC=CC=CC=CC=COCC(O)CO,1 +CNC(=O)ON(C(C)=O)C(=O)NC,1 +[O-][N+](=O)C1=CC(=C(C=C1)I)[N+]([O-])=O,1 +CC4=C2C=C1C=CC=CC1=CC2=C3C=CC=CC3=C4,1 +C1OC1C2=CC=CC=C2,1 +[O-][N+](=O)C1=CC(=CC(=C1)CCl)[N+]([O-])=O,1 +CC(=O)OCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +ClCC=CCl,1 +COC1=CC=C(C=C1)N=O,1 +NC1=C(C=CC=C1)C2=CC=CC=C2,1 +CNC3CC2=C1C(=CC=CC1=CC=C2)C3,1 +CC(=O)OCC1=COC=C2C(=CC=[C]12)C=O,1 +OCC[N]1C(=NC=C1[N+]([O-])=O)CO,1 +CCN1C=C(C(O)=O)C(=O)C3=C1C=C2OCOC2=C3,1 +CC3=C2[NH]C1=CC=CC=C1C2=C(C)C4=CN=CC=C34,1 +O=C2NC1(CCCCC1)C(=O)N2CCN3CC3,1 +NC1=CC3=C(C=C1)C2=CC=C(C=C2C3)N,1 +CCN(N)C1=CC=CC=C1,1 +CC(=O)NC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,1 +CCC[N]3C=C2CC1C(C=C(C)CN1C)C4=C2C3=CC=C4,1 +C[N]1C=CN=C1N=O,1 +[O-][N+](=O)C2=C1[NH]N=CC1=CC=C2,1 +ClCC2=C4C1=CC=CC=C1C=C5C=CC3=CC=CC(=C2)C3=C45,1 +NC1=C(C=CC=C1)SCCSC2=C(C=CC=C2)N,1 +C1=CC4=C(C=C1)C3=CC2=CC=CC5=C2C(=C3C=C4)C=C5,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC4=C(C=C2CC3)CCCC4,1 +[O-][N+](=O)C2=C1N=CC=CC1=CC=C2,1 +S=C1NCCN1,1 +C2=CC1=CC3=C(C=C1C=C2)C5=C4C(=C3)C=CC=C4C=C5,1 +NC1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +O=NC1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)CCCC5,1 +CC(C)N(C(C)C)C(=O)SCC(Cl)=CCl,1 +COC1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,1 +CC1CNCC(C)O1,1 +CC(C)=C(Cl)C=O,1 +[O-][N+](=O)C3=CC2=C1C=CC(=CC1=CC=C2O3)N(CCCl)CCCl,1 +ClC(=O)CC1=CC=CC=C1,1 +NC3=CC2=NC1=CC=CC=C1C(=C2C=C3)N,1 +C1=CC5=C(C=C1)C4=CC3=C2C=CC=CC2=CC=C3N=C4C=C5,1 +OC1=C4C(=CC=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +C1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)Cl,1 +NC1=CC=C(C=C1)NC2=CC=C(C=C2)[N+]([O-])=O,1 +OC1=CC=C(C=C1)C(=O)NN=CC2=CC=C(O2)[N+]([O-])=O,1 +NC3=C2C(C1=CC=CC(=C1C(C2=C(C=C3)N)=O)[N+]([O-])=O)=O,1 +[O-][N+](=O)C1=CC(=C(C=C1)C2=C(C=CC=C2)[N+]([O-])=O)[N+]([O-])=O,1 +OC2=C3C1=CC=CC=C1C4=C(C=CC5=CC=C(C=C2)C3=C45)[N+]([O-])=O,1 +CC1=CC(=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3O)C,1 +OC1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +C1=CC2=C(C=C1)C3=CC=CC4=CC=CC2=C34,1 +CC2C1=C(C=CC=C1)C3=C2C=C(C=C3)F,1 +OC4C=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C4O,1 +CCN(CC)N=O,1 +OC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +[O-][N+](=O)C1=CC=C2C=CC3=C(C=CC4=CC=C1C2=C34)[N+]([O-])=O,1 +OC2C=CC1=C3C=CC4=CC=C(C5=CC=C(C=C1C2O)C3=C45)[N+]([O-])=O,1 +OCC4OC(OC2=C1C(C3=C(OC1=CC(=C2)O)C(=CC=C3O)O)=O)C(O)C(O)C4O,1 +ClCCN(CCCl)P1(=O)OCCCN1CCCl,1 +NC1=C(C=C(C=C1Cl)[N+]([O-])=O)[N+]([O-])=O,1 +OC2C=CC1=C4C(=CC=C1C2O)C3=CC(=CC=C3C=C4)O,1 +OCCN(CCO)C1=CC=C(C=C1)N=NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +NC2=NC(=C1[NH]C=NC1=N2)NO,1 +CN(C)N,1 +CN2N(C1=CC=CC=C1)C(=O)C(=C2C)N=O,1 +ClCCNC(=O)N(CCCl)N=O,1 +C1=CC2=C(C=C1)C4=C3C(=C2)C=CC=C3C=C4,1 +OCC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +CC3=CC2=C(C1=CC=CC=C1C(=C2C=C3)C)C,1 +COC3=C(C=C2N=C1C=CC(=CC1=NC2=C3)N)N,1 +BrCC1CO1,1 +CN(C)N=O,1 +[O-][N+](=O)C1=C(C=CC=C1)[N+]([O-])=O,1 +CC(=O)C1=C(C(=C(O1)[N+]([O-])=O)C2=CC=CC=C2)C3=CC=CC=C3,1 +OS(=O)(=O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +C1OC1C2CO2,1 +[O-][N+](=O)C1=CC(=C(C=C1)Br)[N+]([O-])=O,1 +NC1=C(C=C(C(=C1)[N+]([O-])=O)N)Cl,1 +[O-][N+](=O)C1=CC2=CC=C3C=CC=C4CCC(=C1)C2=C34,1 +[O-][N+](=O)C1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)N=O,1 +CCN(CC)C3=CC=C2N=C1C=CC(=CC1=[O+]C2=C3)N(CC)CC,1 +CCN1CCOCC1,1 +OCCCBr,1 +C1=CC3=C(C=C1)C2=NC=CC=C2C=C3,1 +NC3=C(C=C2N=C1C=CC=CC1=NC2=C3)O,1 +CN(C)C2=C(C1=NC(=C(N=C1C=C2)C)C)C,1 +CC1=CC(=C(C=C1)N)N,1 +NC1=C(C(=CC=C1)N)C(O)=O,1 +OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +[O-][N+](=O)C1=C(C=CC=C1)SSC(F)=C(Cl)Cl,1 +ONC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +COC(=O)NC2=NC1=CC(=CC=C1[NH]2)C(=NO)C3=CC=C(C=C3)F,1 +C1=CC2=CC=C3N=CC=C4C=CC(=C1)C2=C34,1 +NC1=C(C=CC(=C1)[N+]([O-])=O)C(O)=O,1 +CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)F)[N+]([O-])=O,1 +CC4=C1C=CC=CC1=C3N=C2C=CC=CC2=C(C3=C4C)N,1 +NC4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 +CCC1=C3C(=CC2=CC=CC=C12)C4=C(C=C3)C(O)C(O)C5OC45,1 +ON(C=O)C1=CC=C(C=C1)[N+]([O-])=O,1 +CN(N=O)C(C)=O,1 +BrC(C=O)=CC1=CC=CC=C1,1 +C1OC1COC2=CC(=CC=C2)OCC3CO3,1 +CC1=C(C=C(C=C1)N=C=O)N=C=O,1 +N1C4C1C2=C(C=CC3=CC=CC=C23)C5=C4C=CC=C5,1 +OC(=O)CCCC1=CC=C(C=C1)N(CCCl)CCCl,1 +NCCNCCNCCNCCNCCN,1 +CC(C)NCC2CCC1=C(C=C(C(=C1)CO)[N+]([O-])=O)N2,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)Cl,1 +CC1=CC=C(C=C1)N=NNCC2=CC=CC=C2,1 +CNC(=O)OC2=C1C=CC=CC1=CC=C2,1 +CCOC(=O)N(C)C,1 +ClC(=O)C1=C(C=C(C=C1)Cl)Cl,1 +[O-][N+](=O)C2=CC(=C1C(=CC(=CC1=C2)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +COS(=O)(=O)C(F)(F)F,1 +CC1=CC(=C(C=C1)NO)C,1 +ClC(=O)C1=C(C=CC=C1)C(Cl)=O,1 +CC(=O)C=O,1 +O=C1OC5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 +ClCC1=CC=CC=C1,1 +C[N]1C(=NC2=C1C=CC3=NC(=C(C)N=C23)C)N,1 +ClC(CBr)CBr,1 +CC(=O)OC1=C2C=CC3=CC=CC4=CC=C(C(=C1)[N+]([O-])=O)C2=C34,1 +CC1=CC=C[N]2C1=NC3=C(C)C(=CN=C23)N,1 +OC1=C([NH]C2=CC=CC=C12)C4=NC3=C(C=CC=C3)C4=O,1 +OCC1=C4C(=C(C2=CC=CC=C12)CO)C3=CC=CC=C3C=C4,1 +NC1=CC3=C(C=C1)C2=CC=CC=C2O3,1 +CC4=C3C=C2C1=CC=CC=C1C=CC2=CC3=CC=C4,1 +C1CCC(CC1)N2C4C2C3=C(C=CC=C3)C5=C4C=CC=C5,1 +COC1=C(C=CC=C1)N,1 +ONC1=CC=C(C=C1)C2=CC=CC=C2,1 +CN1CC(CBr)CC2C1CC3=C[NH]C4=CC=CC2=C34,1 +CCN(CC)CCNC2=C1C(C3=C(SC1=C(C=C2)C)C=CC=C3)=O,1 +OCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +C1=CC5=C4C(=C1)C2=CC=CC3=CC=CC(=C23)C4=CC=C5,1 +C[N]2C(=NC3=C1N=C(C)C=NC1=CC(=C23)C)N,1 +CNN=O,1 +COC(=O)C(=C)C#N,1 +CN(C)C1=CC=C(C=C1)N=NC3=CC=C2N=CSC2=C3,1 +COP(=S)(OC)SCN2N=NC1=C(C=CC=C1)C2=O,1 +OCC1SCCN1N=O,1 +[O-][N+](=O)C1=C(C(=CC=C1)[N+]([O-])=O)C=O,1 +CC1=CC2=C(C=C1)C(=CC=C2)[N+]([O-])=O,1 +OC1=C(C(=CC=C1)[N+]([O-])=O)[N+]([O-])=O,1 +OC3=C(C2=CC1=CC=CC=C1C(=C2C=C3)O)O,1 +OC1=C4C(=CC=C1)C3=CC2=CC=CC5=C2C(=C3C=C4)C=C5,1 +CN2C(=O)CN=C(C1=C(C=CC=C1)F)C3=C2C=CC(=C3)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC2=C(C=C1)C(=O)OC2=O,1 +COC(=O)C1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +ClCC2=C1C3=CC=C4C=CC=C5C=CC(=CC1=CC=C2)C3=C45,1 +NC1=NC(=CC=C1)N,1 +[O-][N+](=O)C1=CC=C(O1)C=CC(=O)NN=CC2=CC=C(O2)[N+]([O-])=O,1 +OOC1CCCC2=C1C=CC=C2,1 +[O-][N+](=O)C2=CC=C1SN=C(Cl)C1=C2,1 +[O-][N+](=O)C1=CC(=CC=C1)CCl,1 +CC(O)=NO,1 +CN(C)CCNC(=O)C2=C1SC3=C(C(C1=CC=C2)=O)C=CC=C3,1 +COC1=CC=C(C=C1)CNC(=O)C(C)Br,1 +NC3=CC2=NC1=CC=C(C=C1N=C2C=C3)N,1 +OCCC1=C[NH]C2=CC(=CC=C12)[N+]([O-])=O,1 +CC1=C(C=CC=C1)N=NC2=CC(=C(C=C2)N)C,1 +CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)N,1 +[O-][N+](=O)C3=CC2=C1C(=CC=CC1=CC=C2C=C3)[N+]([O-])=O,1 +C2=CC1=NC=CN=C1C=C2,1 +[O-][N+](=O)C1=CC=C(C=C1)CCl,1 +OC(=O)C1=CC=C(C=C1)NC3=C2C=CC(=CC2=NC4=CC=CC=C34)N=[N+]=[N-],1 +COC1=C4C(=CC=C1)C3=C2OCOC2=CC(=C3C=C4)C(O)=O,1 +CC2=[N+](C1=CC=CC=C1[N+](=C2C(=O)NCCO)[O-])[O-],1 +CC(C)(C)C1=CC(=O)C=CC1=O,1 +CN(C)CCCNC2=C1C=C(C=CC1=NC3=CC=CC=C23)[N+]([O-])=O,1 +O=NC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +CC1(CO1)C2=CC=CC=C2,1 +NC2=C1SN=C(C1=CC=C2)Cl,1 +CC2C1=C(C=CC=C1)C3=C2C=C(C(=C3)C)C,1 +CC(O)C1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)[N+]([O-])=O,1 +C1=CC2=C(C=C1)C4=CC=C5C=CC6=CC3=CC=CC2=C3C4=C56,1 +[O-][N+](=O)C2=CC3=CC=C4C1=CC=CC=C1C=C5C=CC(=C2)C3=C45,1 +CC1=C(C=CC(=C1)[N+]([O-])=O)N,1 +OC1=CC=C(C=C1)N=O,1 +NC2=CC=C1SN=CC1=C2,1 +[N-]=[N+]=C1C=CC(=O)C=C1,1 +O=C2CC(=NC1=CC=CC=C1)C(=O)C3=C2C=CC=C3,1 +[O-][N+](=O)C2=CC1=CC(=CC=C1O2)N(CCCl)CCCl,1 +OC(=O)C(Br)=C(Br)C=O,1 +COC1=C4C(=CC=C1)C3=C2OCOC2=CC5=C3C(=C4)NC5=O,1 +CN(C)N=NC1=CC=C(C=C1)[N+]([O-])=O,1 +C1=CC2=C(C=C1)C5=C(C=C2)C4=C3C=CC=CC3=CC=C4C=C5,1 +COC1=C(C3=C(C(=C1)N)C(=O)C2=C(C=CC=C2)C3=O)N,1 +NC1=CC=C(C=C1)OC2=CC(=C(C=C2)N)N,1 +CC(=O)N1CCCC1C(=O)N(CC(O)=O)N=O,1 +COC1=C(C=CC(=C1)CC2CO2)O,1 +CN(C)CCCNC2=C1C=CC=CC1=NC3=CC=CC=C23,1 +CCC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)[N+]([O-])=O,1 +OC5C(O)C2=C1C6(C4=C(C1=CC=C2)C3=C(C=CC=C3)C=C4)OC56,1 +NC(CSC(Cl)=C(Cl)C(Cl)(Cl)Cl)C(O)=O,1 +C[N]2C1=CC=CC=C1C3=CC(=CC=C23)N,1 +NC1=CC=C(C=C1)OC2=C(C=C(C=C2)Cl)Cl,1 +C1=CC3=C(C=C1)C2=CC5=C(C=C2C=C3)C4=CC=CC=C4C=C5,1 +OC1C=CC=CC1O,1 +CCNN=O,1 +S3C1=CC=CC=C1C4=CC=C2C=CC=CC2=C34,1 +CC(=O)OCC1=CC=C(C=C1)N=NC2=CC=C(C=C2)COC(C)=O,1 +CCC4(O)CC(O)C2=C(C=C1C(C3=C(C(C1=C2O)=O)C(=CC=C3)O)=O)C4C(=O)OC,1 +OC5C=CC1=C(C2=CC=C3C=CC(=C4C=CC(=C1)C2=C34)[N+]([O-])=O)C5O,1 +O[N+]([O-])=C=CC1=CC=C(O1)[N+]([O-])=O,1 +NC(CS)C(O)=O,1 +CCC3=C1C4=C(C=CC1=C2C=CC=CC2=C3)C(O)C(O)C5OC45,1 +O=C3[N]2C1=CC=CC=C1N=C2C8=C6C3=CC=C7C5=NC4=CC=CC=C4[N]5C(C(=C67)C=C8)=O,1 +OCCCCl,1 +CCOC1=CC=C(C=C1)NC(=O)CC(C)O,1 +CC1=C(C(=C(C=C1[N+]([O-])=O)[N+]([O-])=O)N)[N+]([O-])=O,1 +ClCC1CO1,1 +CC(C)=CC2C(C(=O)OC1=C(C)C(CC=C)C(=O)C1)C2(C)C,1 +O=NC1=CC=C(C=C1)OC2=CC=CC=C2,1 +[O-][N+](=O)C2=C4C=CC=C5C1=CC=CC=C1C3=CC=CC(=C2)C3=C45,1 +CC(C)N(C(C)C)C(=O)SCC(Cl)=C(Cl)Cl,1 +COC(=O)NC1=CC(=CC=C1)OC(=O)NC2=CC(=CC=C2)C,1 +FC5=C3C=CC=C4C2=C1C=CC=CC1=CC=C2C(=C34)C=C5,1 +ClC(=O)OCC2C1=C(C=CC=C1)C3=C2C=CC=C3,1 +COC4=CC(=O)C1=C(C3=C(C(=N1)C)C2=CC=CC=C2[NH]3)C4=O,1 +CC1=CC(=C(C=C1)N)O,1 +CCOP(=S)(OCC)OC1=N[N](C(C)C)C(=N1)Cl,1 +[O-][N+](=O)C1=CC5=C2C(=C1)CCC4=C2C(=C3CCCCC3=C4)CC5,1 +S=P(N1CC1)(N2CC2)N3CC3,1 +C1=CC4=C(C=C1)C3=CC=C2C=NC=CC2=C3C=C4,1 +CN(C)CCNC(=O)C2=C1NC3=C(OC1=CC=C2)C=CC=C3,1 +CC1=CC=C(C=C1)CCC2CO2,1 +OC4=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C=C4,1 +NC2=C1N=C[N](C1=NC=N2)CC3=CC=CC=C3,1 +OCC(O)CI,1 +NC3=C2N=C1CCCCC1=CC2=CC=C3,1 +CN1CCN(CC1)C4=C2OCN(N3C=C(C(C(=C23)C=C4F)=O)C(O)=O)C,1 +C1=CC4=C(C=C1)C3=CC2=CC=NC=C2C=C3C=C4,1 +CCN(CC)N(O)N=O,1 +COC1=CC4=C(C=C1)C2=NC=CC3=CC(=C(C(=C23)C4=O)OC)OC,1 +ClC(=O)C1=CC=C(C=C1)C(Cl)=O,1 +NC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +[O-][N+](=O)C2=CC1=C[NH]N=C1C=C2,1 +OCC1OC(C(O)C1O)N(N=O)C2=CC=C(C=C2)[N+]([O-])=O,1 +CCCCCCCCCCSC[N]1C=C[N+](=C1)C,1 +OC4C=CC3=C(C2=CC=C1C=CC=CC1=C2C=C3)C4O,1 +CC2=C1N=CC=CC1=CC=C2,1 +OC1=C(C3=C(C(=C1)O)C(=O)C2=C(C=CC=C2)C3=O)O,1 +NC2=C1C=CC=CC1=NC3=CC=CC=C23,1 +[O-][N+](=O)C1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 +BrCC1=CC=CC=C1,1 +ClCN2C(=O)C1=C(C=CC=C1)C2=O,1 +CN(C)C1=CC=C(C=C1)C=CC2=CC=CC=C2,1 +C5=CC4=CC3=C1C=CC=CC1=C2C=CC=CC2=C3N=C4C=C5,1 +ClCC4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,1 +[O-][N+](=O)C4=CC=C3C2=C1C(=C(C=CC1=CC=C2)[N+]([O-])=O)C5=C3C4=CC=C5,1 +COC1=CC4=C(C=C1)C2=C(C(=CC3=CC=NC(=C23)C4=O)OC)OC,1 +CC1=CC(=C(C(=C1)C)N)C,1 +CC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +COP(=S)(OC)OC1=CC=C(C=C1)[N+]([O-])=O,1 +COC1=C(C4=C(C=C1)C3=C2OCOC2=CC5=C3C(=C4)N(C)C(=O)C5=O)OC,1 +ON=C1C=CC(C=C1)=NO,1 +CN(C1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +ONC2=CC1=CC=CC=C1C=C2,1 +[O-][N+](=O)C1=CC2=CC=C3C=C(C=C4C=CC(=C1)C2=C34)[N+]([O-])=O,1 +COC5=C2[C]1=CC=C(C1=C(OC2=C4C3CCOC3OC4=C5)O)O,1 +OCC(Cl)CCl,1 +O=NN1CCCCC1,1 +C1=CN=C(C=C1)C2=NC=CC=C2,1 +CC3=C(C1=CC=CC=C1C4=CC=C2C=CC=CC2=C34)[N+]([O-])=O,1 +C[N]1C(=NC2=CC=CC=C12)N,1 +CC(=O)OC1CC5=C4C1=C3C=CC2=CC=CC=C2C3=CC4=CC=C5C,1 +[O-][N+](=O)C1=C(N=C2SC=C[N]12)C3=CC=C(C=C3)Cl,1 +CN2C1=C(C=CC=C1)C(=O)C3=C2C4=C(C=C3O)OC(C4)C(C)=C,1 +[O-][N+](=O)C1=C(C=CC=C1)SSC(Cl)=C(Cl)C(F)(F)F,1 +CC(=O)N(O)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +COC1=C(C=C(C=C1)C(=O)NC2=CC=CC=C2)[N+]([O-])=O,1 +CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)N(C)C)[N+]([O-])=O,1 +NC1=CC=C(C=C1)Cl,1 +ClC3=CC2=CC1=CC=CC=C1C=C2C=C3,1 +OC(=O)C(Cl)=C(C(Cl)Cl)C(O)=O,1 +ClC(Br)C#N,1 +[O-][N+](=O)C3=C1C=CC=CC1=C2C=CC=CC2=C3,1 +NC1=CC=C(C=C1)OC2=C(C=C(C=C2Cl)Cl)Cl,1 +[O-][N+](=O)C2=CC1=C3C(=CC=C1C=C2)C(=CC=C3)[N+]([O-])=O,1 +FC2=C1N=CC=CC1=CC=C2,1 +CCC(Cl)=[N+](O)[O-],1 +CC(C)(C)CCCCCC(=O)OCC1CO1,1 +CC(=O)NNC1=CC=CC=C1,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)Cl,1 +OC2=C(C1=CC=CC=C1C=C2)[N+]([O-])=O,1 +CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC,1 +CCC2=C1[NH]C3=C(C1=CC(=C2)O)CCOC3(CC)CC(O)=O,1 +OC3C=CC2=C(C=C1C=CC(=CC1=C2)[N+]([O-])=O)C3O,1 +NC1=CC=C(C=C1)C=CC2=CC=CC=C2,1 +COCC1CO1,1 +O=NN1CCCC1C2=CN=CC=C2,1 +CCN(CC)C(=S)SCC(Cl)=C,1 +NC(=O)NCC=C,1 +O1C5C1C3=C(C2=CC=CC=C2C4=CC=CC=C34)C6=C5C=CC=C6,1 +OC5C(O)C2=C(C1=NC4=C(C=C1C=C2)C3=CC=CC=C3C=C4)C6OC56,1 +CC4=C3C1=CC=CC2=CC=CC(=C12)C3=C(C5=CC=CC=C45)C,1 +O=CCC=O,1 +NC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CC1=NSC(=C1)N,1 +N(C1=CC=C(C=C1)NC3=CC2=CC=CC=C2C=C3)C5=CC4=CC=CC=C4C=C5,1 +CCCCN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +FC5=CC=C4C=C3C2=C1C(=CC=CC1=CC=C2)C3=CC4=C5,1 +CC(=O)OCC1=CC=C(C=C1)[N+]([O-])=O,1 +CN(C)C1=CC=C(C=C1)CC2=CC=C(C=C2)N(C)C,1 +NCCNCCNCCNCCN,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=CC=C2)C3=O,1 +CC(=O)N(O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +[O-][N+](=O)C1=CC=C(C=C1)OCC2CO2,1 +C1OC1COC3=CC2=CC=CC=C2C=C3,1 +O=C2C1=C(C=CC=C1)C4=C2C=C3C=CC=CC3=C4,1 +CNC1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +CC2=C1C3=CC=C4C=CC=C5C=CC(=CC1=CC=C2)C3=C45,1 +ClC1=C(N=CC=C1)Cl,1 +[O-][N+](=O)C1=CC(=CC=C1)C#N,1 +CN(C)CCNC(=O)C2=C1OC3=C(C(C1=CC=C2)=O)C=CC=C3,1 +ClCC(CCl)OP(=O)(OC(CCl)CCl)OC(CCl)CCl,1 +COC1=C(C=CC(=C1)CNC(=O)C(C)Br)O,1 +CCN1C=C(C(O)=O)C(=O)C2=C1N=C(N=C2)N3CCNCC3,1 +COP(=O)(OC)OC1=CC(=C(C=C1)[N+]([O-])=O)C,1 +[O-][N+](=O)C1=CC2=C(C=C1)C(=CC3=CC=CC=C23)[N+]([O-])=O,1 +O[N+]([O-])=C=CC1=CC=CC=C1,1 +COC(=O)C4=C2C=CC1=C(C=CC=C1C2=C3OCOC3=C4)OC,1 +COC1=NSC2=CC(=CC=C12)[N+]([O-])=O,1 +ClCCOCC(Cl)=CCl,1 +NC2=C1C(C3=C(C(C1=C(C=C2Br)Br)=O)C=CC=C3)=O,1 +C[N]1C=NC2=C(N)N=CN=C12,1 +C[N]1C=NC2=C1C=CC3=NC=CC=C23,1 +CC2C1=C(C=CC=C1)C3=C2C=CC(=C3)C,1 +[O-][N+](=O)C2=CC=C1C(=NSC1=C2)Cl,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)[N+]([O-])=O,1 +ClC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +COC1=C(C=C(C(=C1)Cl)OC)Cl,1 +[O-][N+](=O)C1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +OC(=O)C4=C2C(=CC1=C(C=CC=C1C2=C3OCOC3=C4)O)[N+]([O-])=O,1 +NC(CCC(=O)NNC1=CC=CC=C1)C(O)=O,1 +[O-][N+](=O)C1=CC=C(C=C1)OC=C,1 +CC2(OO)C1=C(C=CC=C1)C3=C2C=CC=C3,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC(=CC=C2)C#N,1 +[O-][N+](=O)C1=CC4=C2C(=C1)CCC3=C2C(=CC=C3)CC4,1 +CC2=C1C=C4C(=CC1=CC=C2)C3=CC=CC=C3C=C4,1 +CC2=CC=C1N=C(SC1=C2)C3=CC=C(C=C3)N,1 +N1C2C1C4=C3C2=CC=CC3=CC=C4,1 +CC(C)(C)OC(=O)C(N)CN=[N+]=[N-],1 +[O-][N+](=O)C2=CC1=CC=C(C=C1O2)N(CCCl)CCCl,1 +ON(C=O)C1=CC=C(C=C1)C=CC2=CC=CC=C2,1 +CN(CCCl)CCCl,1 +CC(=O)NC1=CC=C(C=C1)C2=CC=CC=C2,1 +COS(C)(=O)=O,1 +CC2=C4C=CC=C5C=CC3=CC1=CC=CC=C1C(=C2)C3=C45,1 +ClNC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +CC(=O)NC2=CC1=CC=CN=C1C=C2,1 +[O-][N+](=O)C5=C3C=CC=C4C2=CC1=CC=CC=C1C=C2C(=C34)C=C5,1 +C1OC1CC2=CC=C(C=C2)C3=CC=CC=C3,1 +C[N]2C1=CC=CC=C1C3=CC(=CC=C23)[N+]([O-])=O,1 +CCCCCCOCC1CO1,1 +OCC1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +CCOS(=O)(=O)OCC,1 +BrCC(Br)C1=CC=CC=C1,1 +CCCNN=O,1 +OC2=CC1=CC=CC(=C1C=C2)O,1 +CC1=C(N=C3C(=C1)C2=CC=CC=C2[NH]3)N,1 +OC4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 +ClC(Cl)(Cl)C1=CC=CC=C1,1 +C=CC=O,1 +CCC(=O)C2=C1C=CC=C(C1=C(C3=C(C=CC=C23)O)O)O,1 +NC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +CN(CC(O)CO)N=O,1 +C1OC1COC3=C2C=CC=CC2=CC=C3,1 +C1OC1COC2=CC=CC=C2,1 +OCC1OC(CC1O)N2C=C(COO)C(=O)NC2=O,1 +CC(Cl)C(Br)CBr,1 +NC2=C1SN=CC1=CC=C2,1 +OC(=O)C=CCl,1 +[O-][N+](=O)C3=CC2=C1C=C(C=CC1=CC=C2C=C3)[N+]([O-])=O,1 +CC1OC1C,1 +CC1=C(C=C(C=C1)C(O)(P(O)(O)=O)P(O)(O)=O)N(CCCl)CCCl,1 +OC(=O)C(Cl)=C(Cl)C=O,1 +COC4=CC(=O)C3=C2[NH]C1=C(CCCC1)C2=CN=C3C4=O,1 +CCN(CC)CCNC2=C1C(C3=C(SC1=C(C=C2)CO)C=CC=C3)=O,1 +CC(=O)OC2=C(OC(C)=O)C4=C(C=CC5=C1C=CC=CC1=C3C=CC=C2C3=C45)[N+]([O-])=O,1 +O[N+]([O-])=CCl,1 +COC1=C(C=CC(=C1)N)NC(C)=O,1 +COC(=O)C(CSCC(C)Br)NC(C)=O,1 +ClCC(=O)NCC1=CC=CC=C1,1 +FC1=CC=C2C(=C1)C=CC3=C2C4=CC=CC5=CC=CC3=C45,1 +CC4=C2C1=CC=CC=C1[NH]C2=C3C(C(=CC(C3=N4)=O)N5CC5)=O,1 +CC(Br)C(=O)NCC1=CC=C(C=C1)Cl,1 +CC1CCCCN1CCCNCC(=O)NC2=C(C(=N[N]2C)C)C(=O)C3=C(C=CC=C3)F,1 +[O-][N+](=O)C1=CC4=C(C=C1)C3=CC=C2CCCCC2=C3CC4,1 +NC1=CC=C(C=C1)C=CC2=CC(=CC=C2)C#N,1 +CCC(=O)OCC1=CC=C(C=C1)[N+]([O-])=O,1 +CC(Br)CBr,1 +CC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CCCCOC1=CC=C(C=C1)C=NC2=CC=C(C=C2)CC,1 +OCC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +OC1COC(C(O)C1O)N(N=O)C2=CC=C(C=C2)[N+]([O-])=O,1 +CN(CC1=CC=CC=C1)N=O,1 +NC(=O)C1=CSC(=C1)[N+]([O-])=O,1 +OC2=C1C(C3=C(C(C1=C(C=C2)[N+]([O-])=O)=O)C(=CC=C3O)[N+]([O-])=O)=O,1 +OC2C1=C(C=CC=C1)OC3=C2C=CC=C3,1 +OC1=C(C=C(C=C1)Cl)C(=O)NC2=C(C=C(C=C2)[N+]([O-])=O)Cl,1 +ClC2=C1N=CC=CC1=CC=C2,1 +COC1=CC3=C(C(=C1)O)C(=O)C2=C(C=C(C=C2O)C)C3=O,1 +CC(C)(C)OC(=O)NN=CC2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 +CC(=O)N(O)C2=CC1=CC=CC=C1C=C2,1 +CCOC1=CC(=O)C(CC1=O)=NC(C)=O,1 +O1C5C1C2=C(C=C4C(=C2)C3=CC=CC=C3C=C4)C6=C5C=CC=C6,1 +C1=CC4=C(C=C1)C3=CC2=CC=NC=C2C=C3C5=CC=CC=C45,1 +CC1=CC=C(C=C1)CC2CO2,1 +OC(=O)CC1=C(C=CC=C1)[N+]([O-])=O,1 +COC1=C(C=CC(=C1)N)N,1 +NC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +COC1=C(C4=C(C=C1)C3=C2OCOC2=CC5=C3C(=C4)N(C)CC5)OC,1 +CC2=CC1=CC=CN=C1C=C2,1 +C[N]2C(=NC3=C1N=C(C)C(=NC1=CC(=C23)C)C)N,1 +OC(=O)CC=[N+](O)[O-],1 +OC1=CC(=C(C=C1)O)O,1 +OC3C=CC2=C1N=CC=CC1=CC=C2C3O,1 +COC1=CC5=C(C=C1)C3=C2OCOC2=CC4=CC=NC(=C34)C5=O,1 +OC(=O)C(Cl)=C(C(Cl)Cl)C(Cl)Cl,1 +CC2=C[N]1C(=C(N=C1S2)C3=CC=C(C=C3)[N+]([O-])=O)[N+]([O-])=O,1 +COC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)OC)OC)C3=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC=O,1 +OCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 +NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)Cl,1 +NC1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 +CC(=O)N(O)C1=CC=C(C=C1)OC2=CC=C(C=C2)Cl,1 +CCCN(N=O)C(N)=O,1 +NC1=CC=C(C=C1)C2=CC=C(C=C2)C3=CC=C(C=C3)N,1 +CC(=O)NC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +O=NC1=CC(=CC=C1)C2=CC=CC=C2,1 +C5CC4=C(C3=CC2=C1C=CC=CC1=CC=C2N=C3C=C4)C=C5,1 +O=C2C1=C(C=CC=C1)C4=C3C2=CC=CC3=CC=C4,1 +COC1=CC=C(C=C1)N,1 +NC(CCC(=O)NNC1=CC=C(C=C1)CO)C(O)=O,1 +ClC1=CC(=C(C=C1)C(Cl)(Cl)Cl)Cl,1 +[O-][N+](=O)C2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +OC1=C(C=C(C=C1)C2=CC(=CC=C2)[N+]([O-])=O)[N+]([O-])=O,1 +CC(C)CNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +FC2=C1C=CC=NC1=CC=C2,1 +CC(C)CC(=O)OC2OC=C(COC(C)=O)C3=CC(OC(=O)CC(C)C)C1(CO1)C23,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=CC=C2,1 +[O-][N+](=O)C2=C1SN=CC1=CC=C2,1 +[O-][N+](=O)C1=CC=C(C=C1)[N+]#N,1 +CC3=C2C1OC1C5=C(C2=CC4=CC=CC=C34)C=CC=C5,1 +CC1=C(C(=C(C=C1)[N+]([O-])=O)C)[N+]([O-])=O,1 +NC2=C1N=C[NH]C1=NC=N2,1 +OC2=C1N=CC=CC1=CC=C2,1 +[O-][N+](=O)C1=CC=C(C=C1)C=O,1 +NC(NC1=CC=CC=C1)=NC2=CC=CC=C2,1 +CCC2=C1[NH]C3=C(C1=CC=C2O)CCOC3(CC)CC(O)=O,1 +OC2=C(C1=C(C3=C(C(=C1C=C2)O)C(=O)C=CC3=O)O)O,1 +CC(=O)OCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +NC1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O,1 +CC(O)CN(CC(C)=O)N=O,1 +OC6C1OC1C5=C4C=C2C=CC=C3C=CC(=C23)C4=CC=C5C6O,1 +CC1=CC5=C4C(=C1)C3=CC2=CC=CC=C2C=C3C4=CC=C5,1 +ClCC2=C4C=C1C=CC=CC1=C5C=CC3=CC=CC(=C2)C3=C45,1 +[O-][N+](=O)C3=CC=C2OC1=CC=CC=C1C2=C3,1 +C2=CC1=CC4=C(C=C1C=C2)C3=NC=CC=C3C=C4,1 +NC2=C(C=C1C=CC=CC1=C2)N,1 +ClC2=C1C=CC=NC1=CC=C2,1 +COC(=O)NC2=NC1=CC=C(C=C1[NH]2)C(=O)C3=CC=CC=C3,1 +OC(CCl)CCl,1 +NC1=CC=C(C=C1)C2=CC=CC=C2,1 +OC(=O)C(Cl)=C(C=O)C(Cl)Cl,1 +[O-][N+](=O)C4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 +COP(=S)(OC)SCN2C(=O)C1=C(C=CC=C1)C2=O,1 +CNC(=O)N(O)C(C)=O,1 +CC(=O)NNC1=CC=C(C=C1)CO,1 +[NH]2C1=CC=CC=C1N=C2C3=CSC=N3,1 +CCOCC1CO1,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C(C)=O,1 +CC(C)(OO)C1=CC=CC=C1,1 +C(SSCC1=CC=CC=C1)C2=CC=CC=C2,1 +CCC(=O)C(=O)CC,1 +ClCCSCC1=CC=CC=C1,1 +ClCCNCCCNC1=C4C(=NC2=CC=CC=C12)C3=NC=CC=C3C=C4,1 +CC(C)(O)CCC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=C4C(=C3)OC5OC=CC45O)O,1 +NC(=N)NC#N,1 +BrCBr,1 +CN(C)N=NC1=CC=C(C=C1)C,1 +CN(C)CCNC(=O)C2=CC=CN3C(=O)C1=C(C=CC=C1)N=C23,1 +COC1=CC=C(C=C1)CC2CO2,1 +COC1=C(C=C(C=C1)CNC(=O)C(C)Br)OC,1 +ClC1=C(C=C(C=C1)C(Cl)(Cl)Cl)Cl,1 +[O-][N+](=O)C1=CC(=C(C=C1)SC#N)[N+]([O-])=O,1 +C1=NC=CC(=C1)C2=CC=NC=C2,1 +NNC1=CC=C(C=C1)[N+]([O-])=O,1 +OC1OC(=O)C=C1CCl,1 +NC3=C2C(=C1C(C=CC(C1=C(C2=C(C=C3)N)O)=N)=N)O,1 +CN(C)CCCNC2=C1C=CC(=CC1=NC3=CC=CC=C23)[N+]([O-])=O,1 +COC5=C2[C]1=CC=C(C1=C(OC2=C4C3C=COC3OC4=C5)O)O,1 +COC1=NSC2=CC(=CC=C12)N,1 +ClCCl,1 +OC1=CC(=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +C1CS1,1 +C1OCC2=C1C=CC=C2,1 +OCCNCCNC3=C2C(=C1C(C=CC(C1=C(C2=C(C=C3)NCCNCCO)O)=O)=O)O,1 +CC2C1=C(C=CC=C1)C3=C2C=CC=C3C,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC(=C(C=C1)Cl)Cl,1 +O=C2N(N=CC1=CC=CC=C1)N=NC3=C2[NH]C4=CC=CC=C34,1 +CC4=CC3=C(C2=CC=C1C=CC=CC1=C2N=C3C=C4)C,1 +C5=CC4=CC3=C1C=CC=CC1=C2C=CC=CC2=C3C=C4C=C5,1 +COC(=O)C2=C1C(C5=C(OC1=CC=C2)C3=C(OC4OC=CC34)C=C5OC)=O,1 +CC3=CC2=C(C1=CC=CC=C1C=C2C=C3)C,1 +C[N]2C1=CC(=CN=C1N=C2[N+]([O-])=O)C3=CC=CC=C3,1 +NC3=C(C=C2N=C1C=CC=CC1=NC2=C3)N,1 +COC2=C1C=C(OC1=C(C=C2)N(CCCl)CCCl)[N+]([O-])=O,1 +C2CCC1OC1C2,1 +OC6C1OC1C5=C4C2=CC=CC3=CC=CC(=C23)C4=CC=C5C6O,1 +OCCNC1=CC=C(C=C1)N=NC2=CC=C(C=C2)NCCO,1 +O=C(NC1=CC3=C(C=C1)C2=CC=CC=C2C3)C4=CC=CC=C4,1 +CC2=CC(=O)C1=C(C=CC=C1)C2=O,1 +CC(C)=CC3C(C(=O)OCC1=CC(=CC=C1)OC2=CC=CC=C2)C3(C)C,1 +CC(=C)C2=CC=C(C)C1=CC=C(CO)C1=C2,1 +O=C2C1=C(C=CC=C1)C3=C2C=CC4=C3C=CC=C4,1 +CCC(C)OS(C)(=O)=O,1 +CCCC(=O)C2=C1C=CC=C(C1=C(C3=C(C=CC=C23)O)O)O,1 +OC3C=CC2=C1C=C5C(=CC1=CC=C2C3O)C4=CC=CC=C4C=C5,1 +O=C2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3[N+]#N,1 +C1OC1COC2=C(C=CC=C2)CC3=CC=CC=C3,1 +NC4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,1 +CC(O)C(=O)NCCO,1 +CC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)CCl,1 +COC3=C2N=C1OC=CC1=C(C2=CC4=C3OCO4)OC,1 +ClC(Cl)C(=O)C(Cl)(Cl)Cl,1 +C[N]2C(=NC3=C1N=C(C)C=NC1=CC(=C23)CO)N,1 +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O,1 +CC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +CCCCN(CCO[N+]([O-])=O)[N+]([O-])=O,1 +ClC(=C)C=O,1 +COC4=C(C=C3C2=C1OCOC1=CC5=C2C(CC3=C4)N(C)CC5)OC,1 +CC(=O)N(O)C1=CC=C(C=C1)OC2=CC=CC=C2,1 +OC(=O)C1=C(C=CC=C1)[N+]([O-])=O,1 +[O-][N+](=O)C1=C3C=CC=C4C5=C(C2=CC=CC(=C1)C2=C34)CCCC5,1 +CC(C)OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +OC1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 +CC1=CC(=C(C=C1)N)C,1 +OC1=CC=C(C=C1)NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +CC2=C(C1=CC=CC=C1C=C2)[N+]([O-])=O,1 +OC5C=CC4=C(C=C3C1=CC=CC2=CC=CC(=C12)C3=C4)C5O,1 +[O-][N+](=O)C1=C(C=CC=C1)C=CC=O,1 +NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)C#N,1 +OC(=O)C1=CC=C(C=C1)[N+]([O-])=O,1 +CN(CC1=CC(=CC=C1)C#N)N=O,1 +CC1=C(C(=CC(=C1)N)[N+]([O-])=O)N,1 +OS(=O)(=O)C1=CC(=O)C(=O)C2=C1C=CC=C2,1 +COC1=CC(=CC=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +CC(=O)NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,1 +CC1=CC3=C(C(=C1)O)C(=O)C2=C(C=C(C=C2O)O)C3=O,1 +ONC2=C1N=C[NH]C1=NC=N2,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=CC=C2C=C3[N+]([O-])=O)[N+]([O-])=O,1 +CCN1N=C(C(O)=O)C(=O)C3=C1C=C2OCOC2=C3,1 +CN(C)C1=CC=C(C=C1)N(C)C,1 +[O-][N+](=O)C1=CC(=CC=C1)C2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +CCNC1=CC(=CC=C1)O,1 +NC1=CC(=C(C=C1)CC2=C(C=C(C=C2)N)[N+]([O-])=O)[N+]([O-])=O,1 +NC2=C1C=CC=NC1=CC=C2,1 +FC2=C1C=CC=NC1=C(C=C2)F,1 +NC1=CC3=C(C=C1)C2=CC=C(C=C2C3)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC4=C2C1=CC=CC2=CC5=C3C=CC=CC3=CC=C45,1 +COC1=CC=C(C=C1)CCC2CO2,1 +NC3=CC=C2[NH]C1=CC=CC=C1C2=C3[N+]([O-])=O,1 +COC3=CC=C2[NH]C1=C(C)C=C(N)C(=C1C2=C3)C,1 +O=NC1=C(C=CC=C1)C2=CC=CC=C2,1 +CC2=NC1=CC=CC=C1C=C2,1 +OC3C(O)C2=C(C1=NC=CC=C1C=C2)C4OC34,1 +ClCC(Cl)CCl,1 +COC1OC(=O)C(=C1C(Cl)Cl)Cl,1 +CC1=CC(=CC=C1)C(Cl)=O,1 +CC2=C[N]1C(=C(N=C1S2)C3=CC=C(C=C3)[N+]([O-])=O)N=O,1 +COC1=C(C=C(C=C1)C)N,1 +COC1=CC=C(C=C1)C=CC2=CC=C(C=C2)N,1 +OC(=O)CCOP(O)(=N)N(CCCl)CCCl,1 +S=C=NC2=C1C=CC=CC1=CC=C2,1 +COC1=CC=C(C=C1)C(Br)=CC(O)=O,1 +CCOC1=C(C=C(C=C1)N)N,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)NC(C)=O,1 +CC(=O)N(O)C1=CC=C(C=C1)OC2=C(C=C(C=C2)Cl)Cl,1 +C[N]2C(=NC3=C1N=CC=NC1=CC(=C23)C)N,1 +[O-][N+](=O)C(Br)(Br)Br,1 +OCCN(CCO)C2=C1C=CC=CC1=NC(=N2)C3=CC=C(S3)[N+]([O-])=O,1 +CC1(C)CC2C(O)(C1)C=C(C=O)C34CC23C(=O)OC4O,1 +NC3=C2N=C1C=CC=C(C1=NC2=CC=C3)N,1 +OC4C=CC3=C2C=C1C=CC=CC1=C(C2=CC=C3C4O)Cl,1 +[O-][N+](=O)C2=CC=C1SN=CC1=C2,1 +OC2C=CC1=C3C=CC4=CC=CC5=CC=C(C=C1C2O)C3=C45,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC(=CC=C2C=C3)[N+]([O-])=O,1 +[O-][N+](=O)C2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2[NH]3,1 +NC1=C(C=C(C=C1Cl)[N+]([O-])=O)Cl,1 +S=C=NCCC1=CC=CC=C1,1 +CCC=CC=CC=CC=COCC(O)CO,1 +[O-][N+](=O)C1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)CCC=C5,1 +[O-][N+](=O)C2=C3C=CC4=CC=CC5=C1CCCCC1=C(C(=C2)[N+]([O-])=O)C3=C45,1 +C1CO1,1 +CN2C1=C(C=C(C(=C1)C)C)N=C3C(=O)NC(=O)N=C23,1 +OC(=O)CC1=CC=C(C=C1)[N+]([O-])=O,1 +CC1=C(C=CC2=CC=CC=C12)[N+]([O-])=O,1 +CC(=O)ON(C(C)=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +O5C6C=CC4=C3C=C1C=CC=C2C=CC(=C12)C3=CC=C4C56,1 +NC(=O)C1=C(C=C(C(=C1)N2CC2)[N+]([O-])=O)[N+]([O-])=O,1 +OCC(Br)=C(Br)CO,1 +OC1=CC3=C(C(=C1)O)C(=O)C2=C(C(=CC=C2O)O)O3,1 +[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=CC(=C2)[N+]([O-])=O)O3,1 +OC2C=CC1OC1C2O,1 +[O-][N+](=O)C1=CC(=CC=C1)S(=O)(=O)OCC2CO2,1 +[O-][N+](=O)C1=CC=C(O1)C=NN2CC(=O)NC2=O,1 +CC1(CO1)C2=CC=C(C=C2)C#N,1 +FC5=C4C=C3C1=CC=CC2=CC=CC(=C12)C3=CC4=CC=C5,1 +OCC(O)CCl,1 +CC1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +CCC1(C(=O)NC(=O)NC1=O)C2=CC=CC=C2,1 +[O-][N+](=O)OCC(CO[N+]([O-])=O)O[N+]([O-])=O,1 +CC(=C)C(=O)OCC(Br)CBr,1 +CN(C)CCNC(=O)C3=C2C=C1C=CC=CC1=NC2=CC=C3,1 +NC1=CC=C(C=C1)C=CC2=CC(=CC=C2)N,1 +CC1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +CCCCOC3=NC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCN(CC)CCCl,1 +OCC=CCl,1 +OCC(O)C(O)C(O)C(O)C1SCCN1N=O,1 +C1OC1COC2=NSC3=CC=CC=C23,1 +C1OC1COC2=CC=C(C=C2)CC3=CC=CC=C3,1 +CN(CCC#N)C1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +[O-][N+](=O)C1=CC(=C(C(=C1)[N+]([O-])=O)NC2=C(C=C(C=C2[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +C5CC1=C(C2=CC=C3C=CC=C4C=CC(=C1)C2=C34)C=C5,1 +CCCCOC1=CC=C(C=C1)N=O,1 +CC(C)(C)OCC1CO1,1 +OC6C=CC5=C3C1=CC=CC=C1C4=CC2=CC=CC=C2C(=C34)C=C5C6O,1 +CC1=CC4=C(C=C1)C3=CC2=CC=CC=C2C=C3C=C4,1 +[O-][N+](=O)C3=CC=C2[NH]C1=CC=C(C=C1C2=C3)[N+]([O-])=O,1 +NC1=C3C=CC=C4C=CC2=CC=CC(=C1)C2=C34,1 +CCBr,1 +C1COC1,1 +[O-][N+](=O)C1=C3C=CC=C4C=CC2=CC=CC(=C1)C2=C34,1 +C(CC1=CC=C(C=C1)C2=CC=CC=C2)C3CO3,1 +ClC(=O)C1=CC(=CC=C1)Cl,1 +CC(C)=CCC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=C4C(=C3)OC5OC=CC45O)O,1 +COC1=CC=C(C=C1)[N+]([O-])=O,1 +CC1(C)CC3=C(C1)C(C=O)C2(CC2(C)C3O)C=O,1 +[O-][N+](=O)C2=CC1=NC3=C(N=C1C=C2)C(=CC=C3)[N+]([O-])=O,1 +CC1=C(C=C(C=C1)N)N,1 +OC(=O)C1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CNC2=C1C(C3=C(C(C1=C(C=C2)NCCO)=O)C=CC=C3)=O,1 +[O-][N+](=O)C4=C3C1=CC=CC=C1C2=CC=CC5=C2C3=C(C=C4)C6OC56,1 +COC2=NSC3=CC=C(OCC1CO1)C=C23,1 +CCCC(=C)C=O,1 +C1=CC3=C(C=C1)C2=CC5=C(N=C2C=C3)C4=CC=CC=C4C=C5,1 +NC1=C(C=C(C=C1Br)[N+]([O-])=O)[N+]([O-])=O,1 +OCC1CO1,1 +ClC1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +O[N+]([O-])=C(Cl)Cl,1 +NC(=O)CNC(=O)C=[N+]=[N-],1 +OC2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3)=O,1 +CC1=C(C=C(C=C1)[N+]([O-])=O)N,1 +CC1=NC(=CN=C1)C,1 +NC3=C2C=C1C=CC=CC1=CC2=CC=C3,1 +NC1=CC=C(C=C1)C2=CC(=C(C(=C2)Cl)N)Cl,1 +BrCC(Br)COC(=O)C=C,1 +O=NC1=CC=C(C=C1)SC2=CC=CC=C2,1 +ClC(=O)C1=C(C=CC=C1)Cl,1 +NC1=CC=C(C=C1)OC2=CC=CC=C2,1 +O=CCCCC=O,1 +COC2=CC=C1OC(=CC1=C2N(CCCl)CCCl)[N+]([O-])=O,1 +C=CC(=O)OCC1CO1,1 +[NH]1N=NC2=CC=CC=C12,1 +OC3C=CC2=C(C1=CC=CC=C1C=C2C3O)[N+]([O-])=O,1 +COC1=C(C=C(C=C1)CC2=C(N=C(N=C2)N)N)OC,1 +CC(=O)NC3=C2C1=CC=CC=C1CC2=CC=C3,1 +CC1(CO1)C2CO2,1 +NC(=O)C1CO1,1 +NC(=S)NN=C1C=CC(C=C1)=NN=C(N)N,1 +ClC(C(Cl)=O)C1=CC=CC=C1,1 +NC1=CC=C(C=C1)N=NC2=CC=C(C=C2)N,1 +[O-][N+](=O)C1=CC=C(O1)C=NN2CCOC2=O,1 +[O-][N+](=O)C3=C2C=CC1=CC=CC4=C1C2=C(C=C3)C5OC45,1 +[O-][N+](=O)C3=CC2=NC1=CC=C(C=C1N=C2C=C3)[N+]([O-])=O,1 +NC2=C1N=C[N](C1=NC=N2)C3=CC=C(C=C3)[N+]([O-])=O,1 +C1=CN=C(C=C1)C2=NC(=CC=C2)C3=NC=CC=C3,1 +NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)Cl)Cl,1 +C[N]3C2=CC=C1N=CC=CC1=C2N=C3[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC(=CC=C2)[N+]([O-])=O,1 +CC2=C1C=CC=CC1=C(C3=CC=CC=C23)CBr,1 +NC1=CC=C(C=C1)C=C,1 +CC1=C(C=CC(=C1)Cl)N,1 +NC(CSC(Cl)=C(Cl)Cl)C(O)=O,1 +OCC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,1 +NC2=NC1=CC=CC=C1C=C2,1 +CCCCON=O,1 +[O-][N+](=O)C1=CC=C(C=C1)Br,1 +C[N]2C1=CC=CC=C1C(=C2C3=CC=CC=C3)N=NC4=[N+](C=CS4)C,1 +CC1=C(C(=C(C(=C1)N)C)[N+]([O-])=O)N,1 +OC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC=C2)C3=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC(=CC=C2C(=C3)[N+]([O-])=O)[N+]([O-])=O,1 +OCC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)COS(O)(=O)=O,1 +ClP(=O)(N1CCOC1=O)N2CCOC2=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=C(C=C2C3)[N+]([O-])=O,1 +OCCCCCl,1 +CC1=C(C=C(C=C1[N+]([O-])=O)N)[N+]([O-])=O,1 +CC(C)CON=O,1 +ClC2=C1C=CC=CC1=NC=C2,1 +[O-][N+](=O)C3=CC2=NC1=CC(=CC=C1N=C2C=C3)[N+]([O-])=O,1 +C1=C2C=CC3=CC=C4C=CC5=CC=C6C=CC(=C1)C7=C2C3=C4C5=C67,1 +NC(CS)C(=O)NCC(O)=O,1 +[O-][N+](=O)C1=CC(=CC=C1)C=O,1 +C[N]1C(=NC2=NC=C(C=C12)C3=CC=CC=C3)NO,1 +[O-][N+](=O)C5=CC=C4C3=C2C(=CC1=CC=CC=C1C2=CC=C3)C4=C5,1 +OS(=O)(=O)C1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2C3=O)[N+]([O-])=O,1 +ClCCNCCCl,1 +BrCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 +CC(C)(C1=CC=C(C=C1)OCC2CO2)C3=CC=C(C=C3)OCC4CO4,1 +CC(=O)NC1=CC=C(C=C1)C(=O)CCl,1 +CC3=C2[NH]C1=CC=C(N)C=C1C2=C(C)C4=CN=CC=C34,1 +NC1=CC=C(C=C1)SC2=CC=C(C=C2)N,1 +COC4=CC3=C1N=CC=C2C=C(C(C(=C12)C(=C3C=C4)O)=O)OC,1 +CC1(C)CC(N)CC(C)(C)N1O,1 +ClCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +[O-][N+](=O)C4=C2C=CC=C3C1=C(C=CC=C1C(=C23)C=C4)[N+]([O-])=O,1 +COC5=C2[C]1=C(C=C(C1=C(OC2=C4C3C=COC3OC4=C5)O)O)O,1 +CCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +COCC(O)C[N]1C=C(N=C1Cl)[N+]([O-])=O,1 +ClC1=CC=C(C=C1)CCC2CO2,1 +O=C2OC1=C(C=CC=C1)C=C2,1 +CC(O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +C1=CC2=CC=C3C=NC=C4C=CC(=C1)C2=C34,1 +CC2=C1C=CC=CC1=C(C3=CC=CC=C23)CCl,1 +OC5=CC4=C2C=C1C=CC=CC1=CC2=C3C=CC=CC3=C4C=C5,1 +[O-][N+](=O)C1=CC=C(C=C1)COC(=O)C2=CC=CC=C2,1 +CC(Br)C(N)=O,1 +[O-][N+](=O)C3=C2C(C(C1=CC=CC4=C1C2=C(C=C3)C=C4)=O)=O,1 +C[N]1C(=NC2=C1C=CC3=NC(=CN=C23)C)N,1 +NC4=C2C1=CC=CC=C1C3=CC=CC(=C23)C=C4,1 +C[N]2C=C1C=CC(=CC1=N2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O,1 +O=C3C2=C(C1=CC=CC=C1C=C2)C4=C3C=CC5=C4C=CC=C5,1 +OC2=C1N=CC=CC1=C(C=C2)S(O)(=O)=O,1 +OC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)O)O)C3=O,1 +CN(CCCC(=O)C1=CN=CC=C1)N=O,1 +CN(C)C3CC2=C1C(=CC=CC1=CC=C2)C3,1 +CC4=C3C2=CC=C1C=CC=CC1=C2C=CC3=CC=C4,1 +CCN(N=O)C(N)=O,1 +CN(C)C1=CC=C(C=C1)N=NC3=CC=C2[NH]N=CC2=C3,1 +CC1=C(C=CC=C1)C2=CC(=C(C=C2)N)C,1 +C1OC1COC3=C2SN=CC2=CC=C3,1 +ONC1=CC=C(C=C1)[N+]([O-])=O,1 +COC1=C(C=C(C(=C1)N)[N+]([O-])=O)N,1 +CN(C)C(=O)N(C)C=O,1 +ClC(Cl)C(C=O)=C(Cl)Cl,1 +NC1=CC(=CC=C1)N,1 +CC4=CC3=C(C2=CC=C1C=CC=CC1=C2N=C3C(=C4)C)C,1 +CC(=O)NC1=C(C=C(C=C1)CC2=CC(=C(C=C2)N)Cl)Cl,1 +CC(=O)NC1=CC=C(C=C1)NC2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(C=C1)OC2=CC=C(C=C2)N=C=S,1 +CC1=CC=C(C=C1)N(CCO)CCO,1 +CC1=CC=C(C=C1)C=CC2=CC=C(C=C2)N,1 +[O-][N+](=O)C2=C3C=CC4=CC=C(C5=C1CCCCC1=C(C=C2)C3=C45)[N+]([O-])=O,1 +CC(=O)OCC1=CC=CO1,1 +NC1=C(C(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O)O,1 +NC3=C2C(=C1C=CC=CC1=C(C2=C(C=C3)N)O)O,1 +CC(=O)C1=CC=CO1,1 +CN(N=O)C(N)=O,1 +C1C5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 +[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=C(C=C2)[N+]([O-])=O)O3,1 +OC(=O)C1=C(C(=C(O1)[N+]([O-])=O)C2=CC=CC=C2)C3=CC=CC=C3,1 +CC4=C(C=C3C(=C2C=CC1=CC=CC=C1C2=NC3=C4)C)C,1 +NC2=C1[NH]C=NC1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O,1 +BrCC(Br)C=O,1 +[O-][N+](=O)C2=C1C=CC=CC1=CC3=CC=CC=C23,1 +OC1=CC=C(C=C1)C2=CC=CC=C2,1 +CC(=O)C=CC1=CC=CC=C1,1 +CC2=C4C1=CC=CC=C1C=C5C=CC3=CC=CC(=C2)C3=C45,1 +CC1=CC=C(C=C1)N(N)C2=CC=C(C=C2)C,1 +COC1=C(C=C(C=C1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +CC1=C4C(=CC=C1)C3=CC2=CC=CC=C2C=C3C=C4,1 +CCC1(C(=O)NCNC1=O)C2=CC=CC=C2,1 +C2=CC1=CC4=C(C=C1C=C2)C3=CN=CC=C3C=C4,1 +O=S1(=O)CCCO1,1 +CNC(=O)NOC(=O)NC,1 +OC1=CC4=C(C=C1)C5=C2C=CC=CC2=CC6=C3C=CC=CC3=CC4=C56,1 +COC2=C1C(C5=C(OC1=CC4=C2C3C=COC3O4)C(=CC=C5O)CCC(C)(C)O)=O,1 +[O-][N+](=O)C4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4,1 +CC3=C1C4=C(C=CC1=C2C=CC=CC2=C3)C(O)C(O)C5OC45,1 +NC2=CC1=CC=CC=C1N=C2,1 +CC4=CC3=C2C=C1C=CC=CC1=CC2=CC=C3C=C4,1 +ClCBr,1 +ClC(Cl)(Cl)C1CO1,1 +[O-][N+](=O)C1=CC(=C(C=C1)C=O)[N+]([O-])=O,1 +CC(C)=CCOC2=C1OC=CC1=CC3=C2OC(C=C3)=O,1 +CC1CC(=O)O1,1 +OCC1=C(C3=C(C=C1O)C(=O)C2=C(C=CC=C2)C3=O)O,1 +[O-][N+](=O)C1=C3C(=CC=C1)C2=C(C=CC=C2C(=C3)[N+]([O-])=O)[N+]([O-])=O,1 +CCC(C)COC(=O)C=CC1=CC=C(C=C1)N=CC2=CC=C(C=C2)OC,1 +C3=CC2=CC1=CC=CC=C1C=C2C=C3,1 +CCCC(=O)C1=C(C=C(C(=C1)O)O)O,1 +CCN(CCCl)C1=CC=C(C=C1)OCCCCCNC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +CC(=O)N(O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +O1C=CC2=CC3=CC=C4C=CC=C5C=CC(=C12)C3=C45,1 +OC1OC(=O)C(=C1CCl)Cl,1 +NC1=CC=C(C=C1)C=CC2=CC(=CC=C2)Cl,1 +CCOC(=O)C(C)Br,1 +COC1=NSC2=CC(=CC=C12)OCC3CO3,1 +COC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,1 +COC1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +CC1CN(CC(C)O1)N=O,1 +O=CC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +CN(C(=O)C1=CSC(=C1)[N+]([O-])=O)C2=CC=CC=C2,1 +NC2=C1C(C3=C(C(C1=CC=C2)=O)C(=CC=C3)N)=O,1 +NC1=C(C=C(C=C1)[N+]([O-])=O)N,1 +O1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +NC1=C(C=C(C=C1)C2=CC(=C(C(=C2)Cl)N)Cl)Cl,1 +C1OC1COC2=CC=C(C=C2)C3=CC=CC=C3,1 +CCCSC(Cl)=O,1 +CC3(C)CC2C=C(C=O)C14CC1(C2C3)C(=O)OC4O,1 +NC2=C1C=C(C=CC1=NC3=CC=CC=C23)O,1 +CC(=O)NC1=CC(=C(C=C1)C)N,1 +CN(CC1=CC=C(C=C1)F)N=O,1 +CC(=C)C(=O)OCC1CO1,1 +CC1=C(C(=CC=C1N)N=NC2=CC=CC=C2)N,1 +CC1=C(C=C(C=C1)[N+]([O-])=O)N=O,1 +ClCC2=C1C=CC=CC1=C(C3=CC=CC=C23)CCl,1 +CCC(COC(=O)C=C)(COC(=O)C=C)COC(=O)C=C,1 +NC2=CC1=CC=CC=C1C=C2,1 +CCCON=O,1 +COC1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +NC3=CC=C2[NH]C1=CC=CC=C1C2=C3,1 +CNC(=O)OC1=C(C=CC=C1)OC(C)C,1 +CC1=C3C(=C(C(=C1)[N+]([O-])=O)C)C2=CC=CC=C2[NH]3,1 +COC1=CC(=C(C=C1)N)C,1 +C1=CC=C4C(=C1)C=C3C2=C(C=CC=C2)C5=C3C4=CC=C5,1 +ClCC=C,1 +CC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)CBr,1 +O=C1C=CC4=C2C1=CC=C3C=CC(C(=C23)C=C4)=O,1 +CC(=O)C(Cl)(Cl)Cl,1 +OC(=O)C1=CC(=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +COC3=C1C=COC1=NC4=CC2=C(OCO2)C=C34,1 +[O-][N+](=O)C4=C3C1OC1C2=CC=CC5=C2C3=C(C=C4)C=C5,1 +NC(CCC(=O)NC(CSN=O)C(=O)NCC(O)=O)C(O)=O,1 +OC1CCOP(=O)(N1)N(CCCl)CCCl,1 +C[N]3C2=CC=C1C=CC=CC1=C2C4=C3C=CC5=CC=CC=C45,1 +NC2=C1C=C(C=CC1=NC3=CC=CC=C23)Cl,1 +NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)N)N,1 +CC1=C(C(=CC=C1)N)C,1 +OC5=C4C=C3C1=CC=CC=C1C2=CC=CC=C2C3=CC4=CC=C5,1 +OCC(C(Cl)Cl)=C(Cl)C(O)=O,1 +N(N=NC1=CC=CC=C1)C2=CC=CC=C2,1 +C[N]1C=NC(=C1C(=O)N(C)N=O)N(C)N=O,1 +CCCCN(CC(O)C1=CC(=[N+]=[N-])C(=O)C=C1)N=O,1 +CN1CC(O)C4=C2C1CC5=C(C2=C3OCOC3=C4)C=CC=C5,1 +[O-][N+](=O)C1=CC(=C(C=C1)C2=CC=CC=C2)[N+]([O-])=O,1 +OC2=C1C(C=CC(C1=C(C=C2)O)=O)=O,1 +OC2C=CC1=CC5=C4C(=C1C2O)C3=CC=CC=C3C4=CC6=CC=CC=C56,1 +COC2=C1C=COC1=NC3=CC=CC=C23,1 +CCCCCCN(N=O)C(N)=N[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C2=CC=C(C=C2)[N+]([O-])=O,1 +NC1=CC3=C(C=C1)C(=O)C2=C(C=CC(=C2)N)C3=O,1 +CC(=O)NC3=C(C=C2C1=CC=CC=C1CC2=C3)Cl,1 +C1=CC5=C(C=C1)C4=C2C=CC3=CC=CC(=C23)C=C4C=C5,1 +[O-][N+](=O)C1=CC3=C2C1=CC=CC2=CC=C3,1 +COC2=CC=C1[N](C)C(=NC1=C2)N,1 +COC1=CC(=C(C=C1)N)OC,1 +CCNC1=C(C=CC(=C1)O)C,1 +OC5C1OC1C4=C(C3=CC=C2C=CC=CC2=C3C=C4)C5O,1 +[O-][N+](=O)C1=CC3=C2C1=CC=CC2=CC5=C3C4=CC=CC=C4C=C5,1 +OC1OC(=O)C(=C1Cl)Cl,1 +CC(=O)NC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +CN(C)CCNC(=O)C3=C2N=C1C=CC=CC1=CC2=CC=C3,1 +NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CC(CC1=CC(=C(C=C1)O)O)(NN)C(O)=O,1 +ClCC(Br)CCl,1 +CC4=CC3=NC2=C1C=CC=CC1=CC=C2C(=C3C=C4)C,1 +CC(=O)OCC2=C1C=CC=CC1=C(C3=CC=CC=C23)C,1 +CCCCC(CC)COCC1CO1,1 +COC4=CC=C3C(=O)C2=C1C(=NC=CC1=CC(=C2OC)OC)C3=C4,1 +CC(O)CBr,1 +COC(=O)C12CC1(C=O)C(C=O)C=C3CC(C)(C)CC23,1 +[O-][N+](=O)C3=CC=C2OC1=CC=C(C=C1C2=C3)[N+]([O-])=O,1 +NC2=C1N=C[N](C1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4CC(O)C(CO)O4,1 +C3CC2=C(C1=NC=CC=C1C=C2)C4OC34,1 +CCOP(=O)(OCC)N1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +NC1=CC=C(C=C1)SC2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C3=C([N]2CCSC2=N3)[N+]([O-])=O,1 +OC5=C4C1=CC=CC=C1C3=CC2=CC=CC=C2C=C3C4=CC=C5,1 +CC1=C(C=CC=C1)N,1 +O1C4C1C3=C(C=C2C=CC=CC2=C3)C5=C4C=CC=C5,1 +N1C4C1C3=C(C=C2C=CC=CC2=C3)C5=C4C=CC=C5,1 +OC1CC(=O)C5=C4C1(C2CCC(C3=C(C=CC(=C23)C4=CC=C5O)O)=O)O,1 +OC(=O)C1=CC=C(O1)[N+]([O-])=O,1 +O=C(OCC1CO1)C2=CC(=CC=C2)C(=O)OCC3CO3,1 +ClC(Cl)=C1OC(=O)C=C1,1 +[O-][N+](=O)C3=C1C=CC2=CC=CC(=C12)C=C3,1 +C[N]1C(=NC2=C1C=CC3=NC=CC=C23)NO,1 +OC1=CC=C(C=C1)C3OC2=C(C(=CC(=C2)O)O)C(=O)C3=O,1 +OCC(CO)(CBr)CBr,1 +FC5=C3C=CC=C4C2=CC1=CC=CC=C1C=C2C(=C34)C=C5,1 +BrCCOC(=O)C=C,1 +[O-][N+](=O)C3=C2C=CC1=CC=CC4=C1C2=C(C=C3)OC4=O,1 +[O-][N+](=O)C1=CC2=C(C=C1)CCN2,1 +COC3=C2N=C1C=CC=CC1=C(C2=CC=C3)NCCCNCCCl,1 +[O-][N+](=O)C2=NC1=CC=CC=C1[NH]2,1 +COC(=O)C4=C2C(=CC1=C(C=CC=C1C2=C3OCOC3=C4)OC)[N+]([O-])=O,1 +CCOCC1=C(C3=C(C=C1O)C(=O)C2=C(C=CC=C2)C3=O)O,1 +NC1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,1 +COC3=CC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCNCCCl,1 +C1CN1C2=NC(=NC(=N2)N3CC3)N4CC4,1 +CC3=C(C=C2C(=C1C=CC=CC1=C(C2=C3)C)C)C,1 +CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)C)[N+]([O-])=O,1 +CC(=O)OCC1=C4C(=C(C2=CC=CC=C12)C)C3=CC=CC=C3C=C4,1 +CC4=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C=C4,1 +OC4C=CC3=C(C2=CC=C1C=CC=CC1=C2C=C3[N+]([O-])=O)C4O,1 +OC(=O)C4=CN(C1CC1)C2=C(C=C(C(=C2)N3CCNCC3)F)C4=O,1 +CC1=C(C=CC=C1)OCC2CO2,1 +[O-][N+](=O)C1=C(C=C(C=C1)Cl)Cl,1 +COC1=CC2=C(C(=C1)O)C(C(C(O2)C3=CC(=C(C=C3)O)O)=O)=O,1 +CCCCC1C(=O)N(N(C1=O)C2=CC=C(C=C2)O)C3=CC=CC=C3,1 +CCN(CC)C1=CC=C(C=C1)C2=CC=C(C=C2)C3=CC=C(C=C3)N(CC)CC,1 +NC3=CC2=CC1=CC=CC=C1N=C2C=C3,1 +[O-][N+](=O)C1=C(C=CC(=C1)Cl)Cl,1 +ONC1=C(C=CC=C1)C2=CC=CC=C2,1 +NC2=NC1=CC(=CC=C1[NH]2)C#N,1 +CC1=CC=C2C(=C1)C=CC3=C2C4=C([NH]3)C=CC5=C4C=CC=C5,1 +CC1=C(C=C(C=C1N)[N+]([O-])=O)N,1 +CC(=O)NC1=C(C=C(C=C1)CC2=CC(=C(C=C2)NC(C)=O)Cl)Cl,1 +C=CC1CO1,1 +C1=CC5=C(C=C1)C4=NC3=C2C=CC=CC2=CC=C3C=C4C=C5,1 +CC(=O)NC1=CC3=C(C=C1)C2=CC=C(C=C2C3)NC(C)=O,1 +[O-][N+](=O)C2=C3C=CC4=C1C=CCCC1=CC5=CC=C(C=C2)C3=C45,1 +CCN1CCN(CC1)C3=C(C=C2C(C(=CN(C2=C3)C4CC4)C(O)=O)=O)F,1 +OC3C=CC2=C1C=CC=CC1=CC=C2C3O,1 +CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)C(O)=O,1 +[O-][N+](=O)C1=C2C5=C(C3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O)CCCC5,1 +OC2=C1C(C3=C(C(C1=C(C=C2)O)=O)C=CC=C3)=O,1 +CC(C)CCON=O,1 +OC3=C2C(=C1C=CC=CC1=C(C2=C(C=C3)O)O)O,1 +CCN(CC)CCCC(C)NC2=C1N=CC=CC1=CC(=C2)OC,1 +COC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,1 +CN(C)C1=CC=C(C=C1)N=NS(O)(=O)=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC(=CC=C2O3)[N+]([O-])=O,1 +CCN(CCO[N+]([O-])=O)[N+]([O-])=O,1 +OC(=O)C4=C2C(=CC1=CC=CC=C1C2=C3OCOC3=C4)[N+]([O-])=O,1 +CCC(=O)C=C,1 +ClCCOC(=O)C=C,1 +CCC(O)C=CC=CC=CC=CC=O,1 +NC2=C1C(C3=C(C(C1=C(C=C2)N)=O)C=CC=C3)=O,1 +[O-][N+](=O)C1=CC=C(O1)C=N[N]2C=CC=N2,1 +[O-][N+](=O)C3=CC=C2C(=O)C1=CC=CC=C1C2=C3,1 +CC(C)OCC1CO1,1 +CC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +N1C2C1C6=C4C3=C2C=CC=C3C=CC4=C5C=CC=CC5=C6,1 +ClC1CN(CC1Cl)N=O,1 +NNC(=O)C1=CC=NC=C1,1 +CCCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +O=NC1=CC=C(C=C1)C2=CC=CC=C2,1 +CC2=CC1=C3C=CC4=CC=CC5=CC=C(C=C1C=C2)C3=C45,1 +[O-][N+](=O)C4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 +C[N]1C(=NC2=CC(=CC=C12)C#N)N,1 +[N-]=[N+]=NCCC1=CC=CC=C1,1 +CC4=C3C2=CC1=CC=CC=C1C=C2C=CC3=CC=C4,1 +CC1=C(C=C(C(=C1)S(O)(=O)=O)N)Cl,1 +OCC1OC(CC1O)N2C=C(CO)C(=O)NC2=O,1 +C1=CC2=C(C=C1)C5=C(C=C2)C4=CC=C3C=CC=CC3=C4C=C5,1 +C1=CC2=C(C=C1)C3=CC5=CC=CC6=CC=C4C=CC2=C3C4=C56,1 +COC1=CC4=C3C(=C1OC)C2=CC5=C(C=C2CC3N(CC4)C)OCO5,1 +NC1=C(C(=CC(=C1)[N+]([O-])=O)Cl)O,1 +[O-][N+](=O)C1=CC=C(O1)C=C(C#N)C#N,1 +CCCCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CC(=O)C1=CC=C(C=C1)[N+]([O-])=O,1 +CCCC=CC=O,1 +CC1=CC(=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +CN(N=O)N(C1=CC=CC=C1)C(=O)C(=NO)C(C)=O,1 +O=NN1CCCCCC1,1 +CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)COC(C)=O,1 +CC(C)(COCC1CO1)COCC2CO2,1 +ClC1=C(Cl)C(=O)OC1,1 +COC2=NSC3=C(OCC1CO1)C=CC=C23,1 +O=C1NC4=C2C1=CC5=C(C2=C3C=CC=CC3=C4)OCO5,1 +NC1=C(C=CC(=C1)[N+]([O-])=O)O,1 +CC3=CC2=C(C1=CC=CC=C1N=C2C=C3)N,1 +CC=CCC=O,1 +OS(=O)(=O)C3=C2C(C1=CC=CC(=C1C(C2=CC=C3)=O)[N+]([O-])=O)=O,1 +OCCNC(=O)N(CCCl)N=O,1 +CN(CC1=CC=C(C=C1)Cl)N=O,1 +[N-]=[N+]=NC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +CC(=O)CN(COC(C)=O)N=O,1 +C=CCOCC1CO1,1 +NC1=CC=C(C=C1)CC2=CC(=C(C=C2)N)CC3=CC=C(C=C3)N,1 +O=NC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +CCOC(N)=O,1 +OC(=O)C2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 +NC1=CC=C(C=C1)F,1 +CC4=C1C=CC=CC1=C3C=C2C=CC=CC2=CC3=C4,1 +C=CCN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +CCCN(CCC)N=O,1 +CC(C)CN(N)CC(C)C,1 +NC1=C(C=CC=C1)S(O)(=O)=O,1 +ClC1=CC=C(C=C1)CC2CO2,1 +O=C2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3,1 +CN(C=O)N=O,1 +CC(O)CCl,1 +CC(=O)NC3=C2C=CC1=CC=CC4=C1C2=C(C=C3)C(=O)C4=O,1 +[O-][N+](=O)C2=CC1=CC=CC=C1C=C2,1 +[O-][N+](=O)C3=C2C=CC1=CC=CC=C1C2=CC=C3,1 +OCC1=CC=C(O1)C=O,1 +NC1=C3C(=CC=C1)C2=CC=CC=C2C3,1 +ClC3=C2C=CC1=CC=CC=C1C2=CC4=CC=CC=C34,1 +O1C2C1C5=C3C2=CC=CC3=CC6=C4C=CC=CC4=CC=C56,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +CC1=CC3=C(C(=C1)C)C2=CC=CC=C2C=C3,1 +CC1=C(C(=CC=C1)NO)C,1 +BrCCC(=O)N1CCN(CC1)C(=O)CCBr,1 +CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)[N+]([O-])=O,1 +CC2C1=C(C=CC=C1)C3=C2C(=CC=C3)C,1 +CC1=C(C(=CC=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CC1=CC(=O)OC2=C1C=C3CCCN4CCCC2=C34,1 +NC1=CC=C(C=C1)C2=CC=C(C=C2)[N+]([O-])=O,1 +COC2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3)=O,1 +[O-][N+](=O)C1=CC=C(C=C1)[N+]([O-])=O,1 +NC1=CC=C(C=C1)CCC2=CC=CC=C2,1 +C1=CC3=C(C=C1)C4=CC=C5C=CC=C6C2=CC=CC=C2C(=C3)C4=C56,1 +COC(=O)NC(=S)NC1=C(C=CC=C1)NC(=S)NC(=O)OC,1 +O=N[N]1C=C(CC#N)C2=CC=CC=C12,1 +COC(=O)C1=NC(=C3C(=C1)C2=CC=CC=C2[NH]3)C4=NC5=C(C=C4)C(=O)C=CC5=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +COCC=O,1 +CC1=C(C=CC=C1)C(Cl)=O,1 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)OC3=CC=C(C=C3)N,1 +OC1=NSC2=CC(=CC=C12)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC5=C2C1=CC=CC2=C4C=C3C=CC=CC3=CC4=C5,1 +NC3=C2C1=CC=CC=C1CC2=CC=C3,1 +C3C=CC4=C2C1=CC=CC=C1C=CC2=CC=C34,1 +CC(=O)C1=CC=C[N]1[N+]([O-])=O,1 +NC1=CC(=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)N)[N+]([O-])=O,1 +O=C2C1=C(C=CC=C1)C4=C3C2=NC=CC3=CC5=C4OCO5,1 +COC6=C2[C]1=CC=C(C1=C(OC2=C5C4C3OC3OC4OC5=C6)O)O,1 +CC1=C(C=CC=C1)N=NC3=C2C=CC=CC2=CC=C3O,1 +OC(=O)C=CC1=CC=C(C=C1)[N+]([O-])=O,1 +[O-][N+](=O)C1=C([NH]C=N1)C2=CC=CC=C2,1 +ClCCNP1(=O)OCCCN1CCCl,1 +NC(CSCCCl)C(O)=O,1 +[O-][N+](=O)C1=C(N=C2SCC[N]12)C3=CC=C(C=C3)Cl,1 +CC1=CC=C[N]2C1=NC3=C(C)C(=CN=C23)NO,1 +CC3=C2C1NC1C5=C(C2=CC4=CC=CC=C34)C=CC=C5,1 +[O-][N+](=O)C3=C1C=CC=C2C=CC(=C12)C=C3,1 +CC1=CC=C(C=C1)[N+]#N,1 +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)OC)N,1 +CC1=C(C=CC=C1)OP(=O)(OC2=C(C=CC=C2)C)OC3=C(C=CC=C3)C,1 +[O-][N+](=O)C3=C2OC(C1=CC=CC4=C1C2=C(C=C3)C=C4)=O,1 +NC4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4,1 +CC[N+](CC)=C4C=CC3=NC2=C1C=CC=CC1=C(C=C2OC3=C4)N,1 +C[N]2C1=CC=CC=C1N=C2[N+]([O-])=O,1 +ClCCN(N=O)C(=O)NC1CCCCC1,1 +CC1=C3C(=C(C(=C1)[N+]([O-])=O)C)C2=CC(=CC=C2[NH]3)O,1 +NC1=CC=C(C=C1)C2=CC(=C(C=C2)N)[N+]([O-])=O,1 +OC1=C(C(=CC=C1)O)O,1 +C=CC(=O)N(CC1CO1)CC2CO2,1 +NC3=C1C=CC=CC1=C2C=CC4=C(C2=C3)C=CC(O)C4O,1 +CC1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +OC1C(O)C4=C3C2=C1C=CC=C2C=CC3=C(C=C4)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC(=CC=C1)C(Cl)=O,1 +CC=CC=CC=O,1 +OC2=CC1=CC=CC=C1C(=C2)O,1 +CCCOC=CC=CC=CC=CC=CCC,1 +[O-][N+](=O)C1=CC(=CC(=C1)C(Cl)=O)[N+]([O-])=O,1 +OCC4=CC=C3C2=C1C(=CC=CC1=CC=C2)C3=C4,1 +CC(C)=CC(C)=NNC2=C1C=CC=CC1=CN=N2,1 +C1CSCSC1,1 +CC2=C1C=CC=CC1=C(C3=CC=CC=C23)C,1 +NC1=C(C=C(C=C1)OC2=CC(=C(C=C2)N)Cl)Cl,1 +NC3=CC2=NC1=CC=CC=C1C=C2C=C3,1 +CC(=O)C1=C(C(=C(C=C1)Cl)Cl)Cl,1 +[O-][N+](=O)C2=C3C1=CC=CC=C1C4=CC=CC5=CC=C(C=C2)C3=C45,1 +COC4=C1C5=C(C(OC1=C3C2C=COC2OC3=C4)=O)C(OCC5)=O,1 +O4C5=C1C=CC=CC1=C3C=C2C=CC=CC2=CC3=C45,1 +NC(CN=[N+]=[N-])C(O)=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C(Cl)=O,1 +O=C4OC1=C(C=C2CCCN3CCCC1=C23)C=C4,1 +CC(=C)C=O,1 +[O-][N+](=O)C1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)C=CCC5,1 +OC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)O,1 +[O-][N+](=O)C1=C(C(=C(O1)C(=O)CBr)Cl)Cl,1 +CC1=C(C=C(C(=C1)N)C)N,1 +[O-][N+](=O)C1=C(C=CC=C1)CCl,1 +OC1=C(C=C(C=C1Cl)Cl)S(=O)C2=C(C(=CC(=C2)Cl)Cl)O,1 +OC(=O)CNC(=O)C1=CC=C(C=C1)[N+]([O-])=O,1 +O1C4C1C3=C(C2=CC=CC=C2C=C3)C5=C4C=CC=C5,1 +BrCCOC(=O)C(=O)OCCBr,1 +C2CC1OC1CC2C3CO3,1 +OC6=CC=C5C1=C2C(=CC3=CC=CC4=CC=C(C=C1)C2=C34)C5=C6,1 +NC1=C(C=C3C(=C1)C2=CC=CC=C2[NH]3)[N+]([O-])=O,1 +[O-][N+](=O)C3=CC(=C2C1=C(C=C(C=C1C(C2=C3)=O)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +[O-][N+](=O)C1=C(C(=C(O1)C(=O)CBr)C2=CC=CC=C2)C3=CC=CC=C3,1 +[O-][N+](=O)C2=C3C=CC4=C1CCCCC1=CC5=CC=C(C=C2)C3=C45,1 +CC1=C3C(=CC=C1)C2=CC=CC=C2C=C3,1 +CC1=C2C(=C(C=C1)C)C3=C(C=C2)C(O)C(O)C4OC34,1 +COC1=CC3=C(C(=C1)O)C(=O)C2=C(C(=CC=C2O)O)O3,1 +CC[N]1C(=NC2=C1C=CC3=NC(=CN=C23)C)N,1 +CC(C)COC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CC5=C3CCC4=C2C1OC1C6=C(C2=CC(=C34)C=C5)C=CC=C6,1 +OCN1C(O)C(O)N(CO)C1=O,1 +CCC(C)NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CC1(CO1)C(=O)NCC2=CC=CC=C2,1 +NC1=CC=C(C=C1)CC(O)=O,1 +[O-][N+](=O)C2=CC(=C1C=CC=CC1=C2)[N+]([O-])=O,1 +CC2=CC3=CC=C4C1=CC=CC=C1C=C5C=CC(=C2)C3=C45,1 +NC(CCC(=O)NC(CSC(=O)NCCCl)C(=O)NCC(O)=O)C(O)=O,1 +NC1=CC=C(C=C1)CCC2=CC=C(C=C2)N,1 +CC(C)(O)CCC2=C1OC5=C(C(C1=C(C=C2)O)=O)C(=C4C3C=COC3OC4=C5)O,1 +CCOP(=O)(OCC)OC1=NC(=NC(=C1)C)C(C)C,1 +CCCCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +ClCCN(CCCl)C2=CC1=CC=CC=C1C=C2,1 +CC(=O)OCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 +C[N]1C(=NC2=CC=C(C=C12)C#N)N,1 +COC(=O)C12OC1(C)C(O)(NC2=O)C(C)C,1 +NC2=CC1=NC=CC=C1C=C2,1 +CC1=CC=C(C=C1)OCC2CO2,1 +CC1CNC(=O)N1C2=NC=C(S2)[N+]([O-])=O,1 +ClC(Cl)(Cl)CC1CO1,1 +NC1=CC=C(C=C1)[N+]([O-])=O,1 +ClCCNC(=O)SC2=C1[NH]C=NC1=NC=N2,1 +CC(=O)C1=C(C(=C(O1)[N+]([O-])=O)Cl)Cl,1 +CC(=O)N(O)C1=CC=C(C=C1)SC2=CC=CC=C2,1 +OC1CC=CC2=C3C=CC4=CC=CC5=CC=C(C=C12)C3=C45,1 +COC(=O)C(Cl)Cl,1 +COC5=C2[C]1=CC=C(C1=C(OC2=C4C3(C=COC3OC4=C5)O)O)O,1 +[O-][N+](=O)C1=CC2=C(C=C1)C(=CC3=C(C=CC=C23)[N+]([O-])=O)[N+]([O-])=O,1 +OC2=C1C=CC(C(C1=C(C3=CC=CC=C23)O)=N)=N,1 +NC1=C(C=C(C=C1)Cl)N,1 +CC(=O)NC1=C2C=CC3=CC=C(C4=CC=C(C=C1)C2=C34)O,1 +CC1=C(C=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC2=C(O1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2S3,1 +CC(=O)C1=CC=C(C=C1)NO,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)COC(C)=O,1 +CN(COC(C)=O)N=O,1 +CC(Br)C(=O)NCC1=CC=CC=C1,1 +OC5C=CC4=C(C3=CC2=C1C=CC=CC1=CC=C2N=C3C=C4)C5O,1 +CC(=O)NC1=CC=C(C=C1)C=N[N]3N=N[C]2=CC=NC2=C3O,1 +[O-][N+](=O)C1=CC=C(C=C1)SC2=CC=CC=C2,1 +ClC(Cl)(Cl)SN2C(=O)C1CC=CCC1C2=O,1 +O=CNC1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +BrCCBr,1 +CCOC(=O)CNC(=O)C=[N+]=[N-],1 +O1C2C1C7=C5C3=C2C=CC=C3C=C6C4=CC=CC=C4C(=C56)C=C7,1 +CC(=O)NC2=CC1=NC=CC=C1C=C2,1 +NC3=CC2=NC1=CC(=CC=C1N=C2C=C3)N,1 +C[N]2C(=NC3=NC1=CN=CC=C1C=C23)N,1 +C1=CC=C2C(=C1)C=CC3=C2C4=CC=CC5=CC=CC3=C45,1 +ClC3=C1C=CC=CC1=C2C=CC=CC2=C3,1 +CC1CCC(CC1)NC(=O)N(CCCl)N=O,1 +COC(=O)C12OC1(C)C(C)(O)NC2=O,1 +CC1=C3C(=C(C(=C1)[N+]([O-])=O)C)C2=CC(=CC=C2[NH]3)[N+]([O-])=O,1 +[O-][N+](=O)C2=C3C=CC4=CC=CC5=C1C=CC=CC1=C(C=C2)C3=C45,1 +OCCCl,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 +NC1=C(C(=CC=C1)[N+]([O-])=O)N,1 +CCN(CCCl)CCCNC3=C2C=CC1=CC=CC=C1C2=NC4=CC=CC=C34,1 +CC2=C1C=CC=CC1=C(C=C2)[N+]([O-])=O,1 +O1C2C1C5=C4C2=CC3=CC=CC=C3C4=CC6=CC=CC=C56,1 +CN(C)CCCNC1=C3C(=NC2=CC=CC=C12)C(=CC=C3)[N+]([O-])=O,1 +CC1=C(C=C(C(=C1)C)N)C,1 +OC4C=CC3=C2C=C(C1=CC=CC=C1C2=CC=C3C4O)[N+]([O-])=O,1 +CC1=C(C(=CC=C1)C)NO,1 +[O-][N+](=O)C3=C1C=CC=C2CCC(=C12)C=C3,1 +COC(=O)C1=C(C=CC(=C1)C2=CC(=C(C=C2)N)C(=O)OC)N,1 +CC(=O)N(OC1OC(CO)C(O)C(O)C1O)C2=CC=C(C=C2)OC3=CC=C(C=C3)Cl,1 +CCCC(=O)OCC1=CC=C(C=C1)[N+]([O-])=O,1 +CC(C)NC(OCC1=CC=C(C=C1)[N+]([O-])=O)=NC(C)C,1 +C1=CC4=C(C=C1)C3=CC=C2N=CC=CC2=C3C=C4,1 +C[N+](C)(C)CCNCCC1=CC=C(C=C1)N=NC2=C(C=C(C=C2)[N+]([O-])=O)Cl,1 +[O-][N+](=O)C1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +O=C(OCC1CO1)C2CCCCC2C(=O)OCC3CO3,1 +[O-][N+](=O)C3=CC2=C1C=C(C=CC1=C(C=C2C=C3)[N+]([O-])=O)[N+]([O-])=O,1 +CCN(CC)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C2=CC=C3C1=C(C=CC=C1)C4=C(C=CC5=CC=C2C3=C45)[N+]([O-])=O,1 +NC(CSC(Cl)=CCl)C(O)=O,1 +CCOP(=O)(OCC)C(C)NC(=O)N(CCCl)N=O,1 +OCC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC=C2O)C3=O,1 +CC1=C(Cl)C(=O)OC1O,1 +C1=CC3=C(C=C1)C2=CC5=C4C(=C2C=C3)C=CC=C4C=C5,1 +NC2=C1N=C[N](C1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4=CC=C(C=C4)[N+]([O-])=O,1 +O=C3C(C2=NC1=CC=CC=C1C=C2)C(=O)C4=C3C=CC=C4,1 +O=C2C=CC1=C(C=CC=C1)C2=O,1 +CC(C)(C)ON=O,1 +COC1=C(C=CC(=C1)[N+]([O-])=O)NC(C)=O,1 +OC1=C3C(=CC=C4C=CC2=CC=CC(=C1)C2=C34)[N+]([O-])=O,1 +CC1CC(OC(C)O1)OC(C)=O,1 +CC1=C(C3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O)NC4=CC=CC=C4,1 +CC(=O)C1=C(C=C([N]1[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +ClC1=C(Cl)C(=O)C(=C(Cl)C1=O)Cl,1 +NC1=C(C=CC(=C1)[N+]([O-])=O)C2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C2C=CC3=[N+](C5=C(C4=CC=C1C2=C34)C=CC=C5)[O-],1 +OC1=CC3=C(C=C1)C2=CC=C(C=C2C3)[N+]([O-])=O,1 +C[N]1C=NC(=C1[N+]([O-])=O)C2=CC=CC=C2,1 +CN(CC(C)=O)N=O,1 +ClN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +SC2=C1[NH]C=NC1=NC=N2,1 +CC1CN1,1 +ONC3=CN=C2[N]1C=CC=CC1=NC2=C3,1 +COC1=C(C=C(C=C1)CC2CO2)OC,1 +C1=CC2=CC=C3C6=C5C(=C4C=CC(=C1)C2=C34)C=CC=C5C=C6,1 +CCCCOC3=NC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCNCCCl,1 +C[N]2C(=NC3=C1C=CC=NC1=CC(=C23)C)N,1 +OC(=O)CN(CC(O)=O)N=O,1 +CCOC1=CC=C(C=C1)N=O,1 +OS(=O)(=O)OCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +COC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +C[N+]2=C1C=CC=C(C1=CC3=CC=CC=C23)N,1 +C[N]1C(=NC2=C1C=CC3=NC=CC=C23)NC(C)=O,1 +OC2=C1C(C3=C(C(C1=CC=C2)=O)C=CC=C3O)=O,1 +COC1=CC4=C(C(=C1)OC2OC(CO)C(O)C(O)C2O)C(=O)C3=C(C(=CC=C3O)O)O4,1 +CCC[N]3C=C2CC1C(CC(C)CN1C#N)C4=C2C3=CC=C4,1 +[O-][N+](=O)C4=C2C1=CC=CC=C1C3=CC=CC(=C23)C=C4,1 +C[N]2C(=NC3=CC=C1N=CC=CC1=C23)N,1 +O=C1CCO1,1 +NC4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 +[O-][N+](=O)C1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,1 +O=NC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)F)F,1 +C(OCC2=C1C=CC=CC1=CC=C2)C3CO3,1 +[O-][N+](=O)C1=CC(=C(C=C1)F)[N+]([O-])=O,1 +CC2=CC(=O)C1=C(C=CC=C1O)C2=O,1 +NC(=O)NC2=NC1=CC=CC=C1[NH]2,1 +COC1=NSC2=C1C=CC=C2[N+]([O-])=O,1 +CC(C)(C)OO,1 +O=C4C=CC3=C(C2=CC=C1C=CC=CC1=C2C=C3)C4=O,1 +CCCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +OC(=O)C1=CC(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CN(C)C1=CC=C(C=C1)C=CC2=CC=C(C=C2)[N+]([O-])=O,1 +[O-][N+](=O)C2=CC=C1[NH]C=CC1=C2,1 +CC1=CC(=C(C=C1)C)N,1 +CNC(=O)ONC(C)=O,1 +COC1=CC=C(C=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +CC1=CC=C(C=C1)S(=O)(=O)N2C4C2C3=C(C=CC=C3)C5=C4C=CC=C5,1 +CC1=CC(=CC=C1)NO,1 +OC(=O)C1=C(C=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CCN(CCCl)CCCNC2=C1C=C(C=CC1=NC3=CC(=CC=C23)Cl)OC,1 +[O-][N+](=O)C1=C3C(=CC=C1)C2=CC=CC=C2O3,1 +C[N]1C=NC(=C1C(=O)N(C)N=O)N(C)C(=O)OC(C)(C)C,1 +NC1=CC(=CC=C1)O,1 +[O-][N+](=O)C1=CC=C(C=C1)OC2CO2,1 +NC1=C(C=C(C=C1)Cl)[N+]([O-])=O,1 +CC1=CC=C(C=C1)NN=NCC2=CC=C(C=C2)[N+]([O-])=O,1 +CNN=NC,1 +CC(=O)C1=C(C=CC(=C1)NC(N)=O)OCC(O)CNC(C)(C)C,1 +CCN1C=C(C(O)=O)C(=O)C2=C1C=C(C(=C2)F)N3CCN(C)CC3,1 +CCC1=C(C(=CC=C1)CC)N,1 +NC1=CC3=C(C=C1)C2=CC=CC=C2[NH]3,1 +CS(=O)(=O)NC1=CC=C(C=C1)NC3=C2C=C(C=CC2=NC4=CC=CC=C34)N=[N+]=[N-],1 +NC2=C1C(C3=C(C(C1=C(C=C2)O)=O)C=CC=C3)=O,1 +CCC1CO1,1 +CC1=C(C=C(C=C1)N=[N+]([O-])C2=CC(=C(C=C2)C)N)N,1 +OC1=CC2=C(C=C1)C3=CC5=CC=CC6=CC=C4C=CC2=C3C4=C56,1 +NC3=C(C=C2N=C1C=C(C=CC1=NC2=C3)Cl)N,1 +ClCCSCCCl,1 +NC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=C(C=C3)[N+]([O-])=O,1 +C[N]2C(=NC3=C1N=C(C)C=NC1=C(C)C(=C23)C)N,1 +CC(=O)OC1CC4=C2C1=C(C=CC2=CC5=C3C=CC=CC3=CC=C45)C,1 +CN1CCN(CC1)C2=C(C3=C(C=C2F)C(=O)C(=CN3CCF)C(O)=O)F,1 +[O-][N+](=O)C1=C2C=CC3=CC5=C(C4=CC=C(C=C1)C2=C34)CCCC5,1 +COC(=O)C12OC1(C)C(C)(O)OC2=O,1 +CC[N]1C(=NC2=C1C=CC3=NC=C(C)N=C23)N,1 +NC3=C2N=C1C=CC=CC1=NC2=CC=C3,1 +CC2=CC1=NC=CC=C1C=C2,1 +CC(C)(C)CNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +O=C1CCCCC1=O,1 +[O-][N+](=O)C1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +[O-][N+](=O)C1=CC=C(O1)C=NN2C(=O)C=C(C=C2C3=CC=CC=C3)C4=CC=CC=C4,1 +CCCCCCCC(Cl)=O,1 +CN(CC1=CC(=CC=C1)C)N=O,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,1 +CC1=C(C=C(C=C1N)N)[N+]([O-])=O,1 +CC1(CO1)C(=O)NC2=CC=CC=C2,1 +OCCN(CC(O)=O)N=O,1 +[O-][N+](=O)C2=C1C=CC=CC1=CC=C2,1 +N=C1CC(=O)C(=O)C2=C1C=CC=C2,1 +O=C3CN(CCN2CC(=O)N(CN1CCOCC1)C(=O)C2)CC(=O)N3CN4CCOCC4,1 +CC2=C4C=CC=C5C=CC3=C1C=CC=CC1=CC(=C2)C3=C45,1 +COP(=S)(OC)OC1=CC(=C(C=C1)N=O)C,1 +ClC(Cl)C(Cl)=O,1 +CC3=CC2=C(C(=C1C(=CC(=CC1=C2O)O)O)O)C(=O)C3=O,1 +NC1=CC=C(C=C1)C=CC2=CC=C(C=C2)N,1 +COC2=C1C(C5=C(OC1=CC=C2Cl)C=C4OC3OC=CC3C4=C5OC)=O,1 +C[N]1C=CC3=C1C=CC4=CC=C2C=CC(=CC2=C34)O,1 +O=C(NC1CCCCC1)OC(C#C)(C2=CC=CC=C2)C3=CC=CC=C3,1 +NC3=C2C(=C1C(C=CC(C1=C(C2=C(C=C3)O)O)=N)=O)O,1 +CC(C)NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +NC1=C(C=CC=C1)SCSC2=C(C=CC=C2)N,1 +ON=C(O)C1=CC(=C(C=C1)O)O,1 +NC1=CC(=C(C=C1)NCCO)[N+]([O-])=O,1 +O=C3N(CC1CO1)C(=O)N(CC2CO2)C(=O)N3CC4CO4,1 +BrCC(Br)=C,1 +OCCNC1=C(C=C(C=C1)N(CCO)CCO)[N+]([O-])=O,1 +NC(=O)CNC(=O)N(CCCl)N=O,1 +C1=CC2=C(C=C1)C5=C4C(=C2)C=C3C=CC=CC3=C4C=C5,1 +NC(CCC(=O)NC(CSCCCl)C(=O)NCC(O)=O)C(O)=O,1 +[O-][N+](=O)C3=CC=C2SC1=CC=CC=C1C2=C3,1 +COC1=C(C=C(C(=C1)OC)C=CC)OC,1 +OC5CC1=C(C2=CC=C3C=CC=C4C=CC(=C1)C2=C34)C=C5,1 +[O-][N+](=O)C3=CC2=C(C=C1C(=CC=CC1=C2C=C3)[N+]([O-])=O)[N+]([O-])=O,1 +CC1=CC(=C(C=C1)O)N,1 +CC4=NC3=C2C1=CC(=CC=C1C=CC2=C(C=C3[NH]4)C)O,1 +CCC1=CC(=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +NC1=CC(=CC=C1)C2=CC=CC=C2,1 +[O-][N+](=O)C3=CC2=C1C(=CC=CC1=CC=C2)O3,1 +O=C2N(CC1CO1)SC3=C2C=CC(=C3)OCC4CO4,1 +COC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)O)O)C3=O,1 +NC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +CC1=C(C=CC=C1)C2=CC=C(C=C2)N,1 +CC(CN(CC(C)OC(C)=O)N=O)OC(C)=O,1 +CN1CCC4=C2C1C(C5=C(C2=C3OCOC3=C4)C=CC=C5)O,1 +COC4=C1C(C5=C(OC1=C3C2C=COC2OC3=C4)C=CC=C5O)=O,1 +ClC(Cl)(Cl)SN2C(=O)C1=C(C=CC=C1)C2=O,1 +CC(C)CCCC(C)C3CCC4C2C=CC1(CC(O)CCC1(C)C2CCC34C)OO,1 +CN(CC1=CC=C(C=C1)[N+]([O-])=O)N=O,1 +NC2=C1C(=CC=CC1=CC=C2)N,1 +C1=CC3=C(C=C1)C2=CC=CC4=C2C(=C3)C=C4,1 +CCCCC(CC)COC(=O)C1=CC(=C(C=C1)N(C)C)[N+]([O-])=O,1 +CC1COC3=C2N1C=CC(C2=C(C(=C3N4CCN(C)CC4)F)C(O)=O)=O,1 +NC2=C1C(C3=C(C(C1=C(C=C2C(O)=O)[N+]([O-])=O)=O)C=CC=C3)=O,1 +[O-][N+](=O)C1=CC=C(S1)C3NC(=O)C2=C(C=CC=C2)N3,1 +CC1=C(C=CC=C1)N=NC2=C(C(=C(C=C2)N)C)N,1 +C1=CC3=C(C=C1)C2=CC=CC=C2C4=CC=CC=C34,1 +CCN(CCCl)CCCNC2=C1C=CC=C(C1=NC3=CC=CC=C23)OC,1 +C1=CC2=C(C=C1)C4=CC=CC5=CC=C3C=CC=C2C3=C45,1 +NC1=C(C3=C(C=C1)C2=CC=CC=C2[NH]3)[N+]([O-])=O,1 +CC1=C(C=C(C=C1)C(OC(=O)NC2CCCCC2)(C#C)C3=CC=CC=C3)C,1 +ClCCCBr,1 +NC2=C1N=C[N](C1=NC(=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4OC(CO)C(O)C4O,1 +NC3=C1C=CC=CC1=C2C=CC=CC2=C3,1 +CN(C)CCCNC2=C1C(=CC=CC1=NC3=CC=CC=C23)[N+]([O-])=O,1 +CCOC1=C(C=C(C=C1)NC(C)=O)N,1 +C1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +ClC4=C1C=CC=CC1=C3C=CC2=CC=CC=C2C3=C4,1 +CCC12OC1(C(=O)NC2(C)O)C(=O)OC,1 +OC5C(O)C4=C(C3=CC2=C1C=CC=CC1=CC=C2N=C3C=C4)C6OC56,1 +O=S1(=O)C5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2CC3,1 +CCN(CCCl)C1=CC=C(C=C1)CCCNC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +CN1CC(=CC2C1CC3=C[N](CC=C)C4=CC=CC2=C34)CO,1 +CCCCC=CC=CC=CC=CC=COCC(O)CO,1 +CC(C)(C)OOC(=O)C1=CC=CC=C1,1 +ClC2=C1C(C3=C(C(C1=CC=C2)=O)C(=CC=C3)NC(=O)C4=CC=CC=C4)=O,1 +[O-][N+](=O)C3=CC2=C1C=CC=CC1=CC=C2C=C3,1 +CN(C)C(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CN(C)C1=CC=C(C=C1)N=NC3=CC2=CC=CC=C2C=C3,1 +O1C5C1C4=C3C2=CC=CC=C2C=CC3=CC6=C4C5=CC=C6,1 +N(NC1=CC=CC=C1)C2=CC=CC=C2,1 +CCOC(=O)CNC(=O)C(C)Br,1 +OC5=CC4=CC3=C1C=CC=CC1=C2C=CC=CC2=C3C=C4C=C5,1 +C1OC1CC2=CC=C(C=C2)CC3=CC=CC=C3,1 +[O-][N+](=O)C4=CC=C3C1=CC=CC2=C(C=CC(=C12)C3=C4)[N+]([O-])=O,1 +NC1=C(C=CC=C1)N,1 +CC1=CC(=C(C=C1)C)NO,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC(=O)C2=CC=C(C=C2)[N+]([O-])=O,1 +CCC=C1OC(=O)C2=C1C=CC=C2,1 +OC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=CC=C3,1 +C[N]1C(=NC2=CC(=CC=C12)Cl)N,1 +NC3=CC2=C1C=CC=CC1=CC=C2C=C3,1 +CC1=C(C=CC=C1)N=NC2=CC(=C(C=C2)N=NC4=C3C=CC=CC3=CC=C4O)C,1 +C[N+]2=C1C=C(C=CC1=CC3=CC=CC=C23)N,1 +ClC(=O)CCC1=CC=CC=C1,1 +C1CCC2=C(C1)C6=C4C2=C3C=CC=CC3=CC4=C5C=CC=CC5=C6,1 +COC1=C(C=CC=C1)N=NC3=C2C=CC=CC2=CC=C3O,1 +CC1=CC(=C(C=C1)C)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC2=C(C=C1)C(=CC3=C2C(=CC=C3)[N+]([O-])=O)[N+]([O-])=O,1 +CC2C(O)CCC3=CC(=O)C1(OC1C23C)C4OC4CO,1 +CN(C)[N+]([O-])=O,1 +OCCC1=CC=C(C=C1)[N+]([O-])=O,1 +CC(=O)OCC1=C(C=CC(=C1)C(C)=O)OC(C)=O,1 +O1C=CC2=C1C=C3C=CC4=CC=CC5=CC=C2C3=C45,1 +OCCN(CCO)N=O,1 +CC(C)=[N+]([O-])[O-],1 +CC(=O)N(NC1=CC3=C(C=C1)C2=CC=CC=C2C3)C4=CC6=C(C=C4)C5=CC=CC=C5C6,1 +ClC=C(Cl)C(Cl)Cl,1 +OC2=C1C(C5=C(OC1=CC=C2)C3=C(OC4OC=CC34)C=C5O)=O,1 +[O-][N+](=O)C4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,1 +[O-][N+](=O)C1=CC(=CC=C1)[N+]([O-])=O,1 +NC2=C1N=C([N](C1=NC=N2)C3=CC=C(C=C3)[N+]([O-])=O)C4=CC=C(C=C4)[N+]([O-])=O,1 +OS(=O)(=O)OC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +CC1CS(=O)(=O)CCN1N=CC2=CC=C(O2)[N+]([O-])=O,1 +COC2=CC1=C(C3=C(C(=C1C(=C2)O)O)C(=O)C=C(C)C3=O)O,1 +C1CC2(CCO1)CO2,1 +OC1CC2=C4C1=CC=C5C=CC3=CC=CC(=C2)C3=C45,1 +BrCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +CC4=C1C=CC=CC1=C3N=C2C=CC=CC2=C(C3=C4C)Cl,1 +O=NN1CCCC1,1 +CC(=O)NC1=CC=C(C=C1)C2=CC=C(C=C2)NC(C)=O,1 +C[N]2C1=CC=CC=C1C3=C(C)C=CC(=C23)C,1 +CNC2=C(C1=NC=CN=C1C=C2)C,1 +[O-][N+](=O)C2=C3C=CC4=[N+](C1=CC=CC=C1C5=CC=C(C=C2)C3=C45)[O-],1 +NC1=C(C=C(C(=C1)Cl)[N+]([O-])=O)O,1 +CN(C)CCCl,1 +NNC1=CC=CC=C1,1 +COC1=CC(=C(C=C1)C(=O)C2=C(C=CC=C2)O)O,1 +CCN(CC)C1=CC(=CC=C1)O,1 +NC3=C2C(=C1C=CC=CC1=NC2=CC=C3)N,1 +CC1CO1,1 +CC1=CC=C[N]2C1=NC3=C(C)C(=CN=C23)[N+]([O-])=O,1 +CC1=CC2=C(C=C1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 +OC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +CC3=CC2=C1C=CC=CC1=CC=C2C(=C3)C,1 +CC4CC1C(CC2=C[N](CC=C)C3=CC=CC1=C23)N(C4)C#N,1 +[O-][N+](=O)C1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,1 +CC1(CO1)C2=CC=C(C=C2)[N+]([O-])=O,1 +CNC3=NC1=C(C=CC2=NC=CC=C12)[N]3C,1 +NC1=CC(=C(C=C1)Cl)N,1 +CN(C)CCNC(=O)C2=C1N=C(C=CC1=CC=C2)C3=CC=CC=C3,1 +ONC2=C1C=CC=CC1=CC=C2,1 +OC1=NC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +CC1=C2C(=CC=C1)C3=C(C(=C2)C)C4=C(C=C3)C(O)C(O)C5OC45,1 +CCCCC1=CC=C(C=C1)N=CC2=CC=C(C=C2)OC,1 +C[N+]1=CC=C(CC1)C2=CC=CC=C2,1 +OC1=NC(=C(C=N1)N(CCCl)CCCl)O,1 +[O-][N+](=O)C1=C(C=CC=C1)SSC(Cl)=C(Cl)C(Cl)=C(Cl)Cl,1 +OC(=O)C1=CC(=CC=C1)[N+]([O-])=O,1 +COC1=C(C=CC(=C1)C2=NC(=C([NH]2)C3=CC=CC=C3)C4=CC=CC=C4)O,1 +[O-][N+](=O)C1=CC2=C(C=C1)NC(=O)C2=O,1 +COC1=NSC2=CC=CC(=C12)[N+]([O-])=O,1 +CN(CC(=O)COC(C)=O)N=O,1 +CS(=O)(=O)OCCCCOS(C)(=O)=O,1 +CCC=CC=CC=CC=CC=COCC(C)O,1 +CN(C)CCNC(=O)N2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3,1 +[O-][N+](=O)C1=CC(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +OCCBr,1 +COC1=CC(=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +NNC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +ClC(Cl)=CC=O,1 +CC3=CC2=CC1=CC=CC(=C1C(=C2C(=C3)O)O)O,1 +C[N]2C1=CC=CC=C1C3=CC=CC=C23,1 +CCC(COC(=O)C(C)=C)(COC(=O)C(C)=C)COC(=O)C(C)=C,1 +CC(=O)CN(CC(C)=O)N=O,1 +C1=CC3=C(C=C1)C2=CC=CC=C2N=C3,1 +COC1OC1(C)C,1 +CC(Cl)CCl,1 +[O-][N+](=O)C(Cl)(Cl)Cl,1 +CC4=C2C1=CC=CC=C1[NH]C2=C3C(C=CC(C3=N4)=O)=O,1 +OCC2=C1C=CC=CC1=CC3=CC=CC=C23,1 +CC(C)=CC3C(C(=O)OCN2C(=O)C1=C(CCCC1)C2=O)C3(C)C,1 +CC(C)Br,1 +CCC1=CC=C(C=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +CCCCC[N]3C=C2CC1C(C=C(C)CN1C)C4=C2C3=CC=C4,1 +C(CC1=CC=CC=C1)C2CO2,1 +C[N]2C(=NC3=C1N=CC(=NC1=C(C)C(=C23)C)C)N,1 +NC1=CC=C(C=C1)C2=C(C=C(C=C2)N)[N+]([O-])=O,1 +CCC12OC1(C(=O)OC)C(=O)OC2C,1 +NC1=CC(=C(C=C1)N)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC=C(O1)C=CC=O,1 +NC3=CC2=NC1=CC=CC=C1N=C2C=C3,1 +CC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,1 +COC(=O)C(=CC)C=C(C)C=C(C)C=CC=C(C)C(=O)C12OC1C(O)(CCO)NC2=O,1 +OC2=C(C(=C1C(C3=C(C(C1=C2)=O)C=CC=C3)=O)O)O,1 +CCCCCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CCC(C)=NO,1 +O1C2C1C6=C4C3=C2C=CC=C3C=CC4=C5C=CC=CC5=C6,1 +[O-][N+](=O)C2=CC1=CC(=C(C=C1C=C2)[N+]([O-])=O)[N+]([O-])=O,1 +COC3=CC2=CC1=CC(=CC(=C1C(=C2C(=C3)O)O)O)C,1 +[O-][N+](=O)C1=CC2=C(C=C1)C=CC2,1 +CC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,1 +ClC(Cl)(Cl)Br,1 +[O-][N+](=O)C1=C2C=CC3=CC=C(C4=CC=C(C=C1)C2=C34)N=O,1 +O=C(NCC1=CC=CC=C1)C2CO2,1 +CN(C)C1=CC=C(C=C1)C(=O)C2=CC=C(C=C2)N(C)C,1 +CC(C)C(NC(C)=O)C(=O)N(CC(O)=O)N=O,1 +C1=CC2=CN=C3C=CC=C4C=CC(=C1)C2=C34,1 +C(CC1CO1)C2CO2,1 +ClCC=O,1 +CN(C)C1=CC(=C(C=C1)N=NC2=CC=CC=C2)C,1 +CC1=CC=C(C=C1)S(=O)(=O)NN,1 +CN3CCC4=C2C1=CC(=CC=C1C=CC2=CC=C34)O,1 +C[N]2C(=NC3=C1N=CC(=NC1=CC(=C23)C)C)N,1 +COC3=C(C=C2C(=C1C=COC1=NC2=C3)OC)OC,1 +N1C2C1C6=C5C3=C2C=CC=C3C4NC4C5=CC=C6,1 +CNC(=O)ON,1 +NC(=O)N=NC(N)=O,1 +C5=CC=C4C=C3C2=C1C(=CC=CC1=CC=C2)C3=CC4=C5,1 +COC3=NC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NCCCNCCCl,1 +COC(=O)C1=C(C(=C(O1)[N+]([O-])=O)Cl)Cl,1 +CC2C1=C(C=CC=C1)C3=C2C=C(C=C3)C,1 +CC4=C3N=C2C1=CC=CC=C1C=CC2=C(C3=CC=C4)C,1 +NC1=C(C=CC(=C1)Cl)O,1 +CCC1=NC4=C([NH]1)C3=C2C=C(C=CC2=CC=C3C=C4)O,1 +CC2C1=C(C=CC=C1)C3=C2C=CC=C3,1 +CCC1=C(C=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +CC1=C(C=C(C(=C1)C)[N+]([O-])=O)[N+]([O-])=O,1 +CC1=C(C=C(C=C1)N)[N+]([O-])=O,1 +CCCCCOC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +CC(C)N(N)C(C)C,1 +COC3=C1C=CC=C2OC(=CC(=C12)C=C3)[N+]([O-])=O,1 +NC(CCC(=O)NC(CSC(Cl)=C(Cl)Cl)C(=O)NCC(O)=O)C(O)=O,1 +C4=CC3=CC2=CC1=CC=CC=C1C=C2C=C3C=C4,1 +CNC(=O)C=C(C)OP(=O)(OC)OC,1 +COC1=CC(=CC=C1)C=CC2=CC=C(C=C2)N,1 +NC1=CC(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CC(Br)C(=O)NC1=CC=CC=C1,1 +OC(=O)C(Br)Br,1 +COC3=C2N=C1C=CC=CC1=C(C2=C(C=C3)[N+]([O-])=O)NCCCN(C)C,1 +CCN(N=O)C(=O)N(C)C,1 +CC(C)(N=O)[N+]([O-])=O,1 +CC1OCC(=O)C(=O)C1O,1 +O=P2(OCC1=C(C=CC=C1)O2)OC3=CC=CC=C3,1 +CCC1=C(C(=O)OC)C(=O)OC1C,1 +COC(=O)C1=CCCN(C)C1,1 +CN(CCO[N+]([O-])=O)[N+]([O-])=O,1 +ClCC2=C4C=CC=C5C=CC3=CC1=CC=CC=C1C(=C2)C3=C45,1 +NC1=CC(=C(C=C1)C2=C(C=C(C=C2)N)Cl)Cl,1 +O=NN1CCSC1,1 +C[N]1C(=NC2=C1C=CC3=CC=CN=C23)N,1 +OC(=O)C(Cl)Br,1 +CC1=C(C=CC=C1)N=NC2=C(C=C(C(=C2)C)N)N,1 +NC3=CC=C2CC1=CC=CC=C1C2=C3,1 +CC4=CC3=NC2=C1C=CC=CC1=CC=C2C=C3C=C4,1 +COC(=O)C1=CCCN(C1)N=O,1 +OC1=CC(=CC=C1)[N+]([O-])=O,1 +CCS(=O)CCSP(=O)(OC)OC,1 +O1C2C1C6=C3C2=CC=CC3=C5C=C4C=CC=CC4=CC5=C6,1 +FC1=C(C=CC=C1)C(Cl)=O,1 +CC1=C3C(=C(C(=C1)N)C)C2=CC(=CC=C2[NH]3)O,1 +CCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 +OC2=C1C(C=CC(C1=C(C(=C2Cl)Cl)O)=O)=O,1 +CNC1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C(C)=O,1 +CC2=C1C=CC=CC1=NC=C2,1 +NC1=C(C=C(C=C1)[N+]([O-])=O)Cl,1 +[O-][N+](=O)C1=CC2=C(C=C1)C(=O)NC2=O,1 +ClC(Cl)(Cl)C=O,1 +COC(=COC(N)=O)C1=C(C(=C(C(=C1O)N2CC2)C)O)N3CC3,1 +CC1=C(C=C(C(=C1)N)[N+]([O-])=O)N,1 +[O-][N+](=O)C2=CC=C1C=N[NH]C1=C2,1 +COC2=CC1=CC=CN=C1C(=C2)NC(C)CCCN,1 +CCOC1=CC=C(C=C1)N,1 +OC1=CC=C2C(=C1)C=CC3=C2C4=C([NH]3)C=CC5=C4C=CC=C5,1 +[N-]=[N+]=C1C=NC(=O)NC1=O,1 +C(CCOCC1CO1)COCC2CO2,1 +CNC2=C(C1=NC(=CN=C1C=C2)C)C,1 +CC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC=C2O)C3=O,1 +COC1=C(C=CC(=C1)N)C,1 +CC1=C(C(=C(C(=C1)C)N)C)N,1 +ONC2=C1C=CC=CC1=[N+](C=C2)[O-],1 +COP(=O)(OC)C(O)C(Cl)(Cl)Cl,1 +NCCNCCO,1 +C1=CC5=C(C=C1)C4=CC3=C2C=NC=CC2=CC=C3C=C4C=C5,1 +CC(=O)N(Cl)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +[O-][N+](=O)C1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +CNC2=C(C1=NC=C(N=C1C=C2)C)C,1 +CC(=O)NC1=CC3=C(C=C1)C2=C(C=CC=C2C3)O,1 +[O-][N+](=O)C2=C3C=CC4=C1C=CC=CC1=NC5=CC=C(C=C2)C3=C45,1 +ON=C1CCCCC1,1 +[O-][N+](=O)C1=CC=C(O1)C=NN2CCCNC2=O,1 +CCC=CC=CC=CC=CC=CC=COCC(O)CO,1 +ClCC(Br)=C,1 +CC1=NC(=C(C=N1)CNC(=O)N(CCCl)N=O)N,1 +FC1=NC=CC=C1,1 +ON(C(=O)C1=CC=CC=C1)C2=CC4=C(C=C2)C3=CC=CC=C3C4,1 +O=CC1=CC=CO1,1 +[O-][N+](=O)C3=CN=C2[N]1C=CC=CC1=NC2=C3,1 +CC1=C2C(=CC=C1)C3=CC=C4C=CC=C5C=CC(=C2)C3=C45,1 +CN(C)S(=O)(=O)CCNC(=O)N(CCCl)N=O,1 +CCS(=O)(=O)CC[N]1C(=NC=C1[N+]([O-])=O)C,1 +NC(=O)C1(OC1C(=O)C2=CC=CC=C2)C(N)=O,1 +COC3=CC=C2N=C1OC=CC1=C(OC)C2=C3,1 +CC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)C)N,1 +CCNN=NCC,1 +OC2=C1C(C3=C(C(C1=CC=C2)=O)C(=CC=C3)O)=O,1 +CCOC1=CC=C(C=C1)N(O)C(C)=O,1 +COC1=C(C=C(C=C1)[N+]([O-])=O)N=NC3=C2C=CC=CC2=CC(=C3O)C(=O)NC4=CC(=CC=C4)[N+]([O-])=O,1 +OCC=[N+](O)[O-],1 +BrN1C(=O)CCC1=O,1 +ON=C(O)CC1=C[N](C=N1)N=O,1 +OCC(O)CN=[N+]=[N-],1 +CC1=CC=C(C=C1)C(Cl)=O,1 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N,1 +CCC1=C(C(=CC=C1)CC)NC(=O)CCl,1 +S1C=CN=C1,1 +CC(C)(Cl)[N+]([O-])=O,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC(=CC=C2)C,1 +NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)Br)Br,1 +COC1=NSC2=C(N)C=CC=C12,1 +C[N]1N=C(C)C(=C1N)C(=O)C2=C(C=CC=C2)F,1 +CC1=CC(=CC(=C1)C)NO,1 +COC1=CC=C(C=C1)N=[N+]([O-])C2=CC=C(C=C2)OC,1 +[O-][N+](=O)C1=C2C(=CC=C1)C(=CC=C2)[N+]([O-])=O,1 +C(OCC1=CC=CC=C1)C2CO2,1 +CC(C)(C)C1=CC(=O)C=C(C1=O)C2=CC(=O)C=C(C2=O)C(C)(C)C,1 +CCC=CC=CC=CC=CC=COCC(O)C1=CC=CC=C1,1 +CC(=O)N(O)C1=C(C=CC=C1)C,1 +COC1=C(C=CC=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +CC1=CC=C(C=C1)S(=O)(=O)OCC2CO2,1 +COC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +CC(C)=CC2C(C(=O)OCC1=CC=C(O1)CC#C)C2(C)C,1 +OC1OC(=O)C(=C1C(Cl)Cl)Cl,1 +ClCCNCCCNC2=C1C=CC=CC1=NC3=CC=CC=C23,1 +C1C4=C3C2=C1C=CC=C2C=CC3=CC=C4,1 +O=CC1CO1,1 +NC1=C(C=C(C=C1)CC2=CC(=C(C=C2)N)Cl)Cl,1 +NC(=S)C1=C(C=CC=C1Cl)Cl,1 +CC(C)(C)C1=CC=C(C=C1)OCC2CO2,1 +COC1=CC=C2C(=C1)C=CC3=C2C=C(O3)[N+]([O-])=O,1 +ClCC(Cl)=C,1 +CC1OC(CC(N)C1O)OC2=CC(O)(CC5=C2C(=C4C(=C3C=CC=CC3=C(C4=C5O)O)O)O)C(C)=O,1 +C=CCCC1CO1,1 +BrCC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,1 +[O-][N+](=O)C2=C3C=CC4=C1CCC=CC1=CC5=CC=C(C=C2)C3=C45,1 +ClC1=CC3=C(C=C1)C2=CC=CC=C2O3,1 +C([N]1C=CN=C1)C2=CC=CC=C2,1 +OS(=O)(=O)OCC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,1 +CC1=CC(=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3O)[N+]([O-])=O,1 +NC3=C(C=C2C1=CC=CC=C1[NH]C2=C3)[N+]([O-])=O,1 +OC(=O)COC1=CC=C(C=C1)N(CCCl)CCCl,1 +NC2=C1N=C[N](C1=NC=N2)CC(O)CN=[N+]=[N-],1 +C[N]2C(=NC3=C1N=C(C)C(=NC1=C(C)C(=C23)C)C)N,1 +CC3=C2C=CC1=CC=CC=C1C2=NC4=CC=CC=C34,1 +FC1=CC=C(C=C1)C(=O)C2OC2C3=CC=CC=C3,1 +[O-][N+](=O)C1=C(C=CC=C1)CC#N,1 +COC(=O)C12OC1(C)C(OC2=O)C(C)C,1 +[O-][N+](=O)C3=CC2=CC1=CC=CC=C1C=C2C=C3,1 +ClCC1=C4C(=CC2=CC=CC=C12)C3=CC=CC=C3C=C4,1 +BrCC(Br)CBr,1 +NCCC1=C(C=C(C(=C1)O)O)O,1 +ONC1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=C(C=C2C3=O)[N+]([O-])=O)[N+]([O-])=O,1 +CC(=O)OC(OC(C)=O)C1=CC=C(O1)[N+]([O-])=O,1 +COC1=CC=CC=CC1,1 +NC1=NC3=C(C=C1)C2=CC=CC=C2[NH]3,1 +BrCC(=O)NCC1=CC=CC=C1,1 +COC(=O)C1=CC=C(O1)[N+]([O-])=O,1 +CC1=CC=C2C=C4C(=C3CCC1=C23)C=CC5=CC=CC=C45,1 +COC(=O)C(C)=CC1=CC=C(O1)[N+]([O-])=O,1 +NC1=CC=C(C=C1)N=NC2=CC=CC=C2,1 +CNC2=C(C1=NC(=C(N=C1C=C2)C)C)C,1 +ClC(=O)C1=C(C=CC=C1Cl)Cl,1 +O=C(NC1=CC=CC=C1)C2CO2,1 +[O-][N+](=O)C1=NC=C[N]1CC(=O)NCC2=CC=CC=C2,1 +N1C4C1C3=C(C2=CC=CC=C2C=C3)C5=C4C=CC=C5,1 +O1C3C1C2=CSC=C2C4=CSC=C34,1 +CBr,1 +OC3C=CC2=C1C(=CC4=C(C1=CC=C2C3O)CCC4=O)C(F)(F)F,1 +CNC3=CC2=C1C=C(C=CC1=CC=C2C=C3)O,1 +CC3(C)CC2C=C(CO)C1(CC1(C)C2C3)C=O,1 +ClCC1=CC(=O)OC1,1 +CCOP(=S)(OCC)OP(=S)(OCC)OCC,1 +N1C6C1C2=C(C=C4C(=C2)C3=CC=CC=C3C5NC45)C7=C6C=CC=C7,1 +CC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,1 +OC(CC1=C[N](N=O)C2=CC=CC=C12)C(O)=O,1 +CC1=NC=C([N]1CCO)[N+]([O-])=O,1 +ClC3C6(Cl)C4C2C1OC1C5C2C3(Cl)C(Cl)(C45)C6(Cl)Cl,1 +[O-][N+](=O)C1=CC(=CC=C1)Br,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)C3=O,1 +COC1=CC4=C3C(=C1OC)C2=CC=CC=C2C(C3=NC=C4)=O,1 +CCCCN(CCCCO)N=O,1 +COS(=O)(=O)OC,1 +OCC(O)C1CO1,1 +ClC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +C(CC2=C1C=CC=CC1=CC=C2)C3CO3,1 +[O-][N+](=O)C2=C(C=C1OC3=C(OC1=C2)C=C(Cl)C(=C3)Cl)Cl,1 +CC1(C)C(C=C(Cl)Cl)C1C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=CC=C2,1 +OC4=C3C2=CC=C1C=CC=CC1=C2C=CC3=CC=C4,1 +CCN(CC)C1=CC=C(C=C1)N,1 +C[N]2C(=NC3=CC1=NC=C(C)N=C1C(=C23)C)N,1 +OCCC1=C(C=CC=C1)[N+]([O-])=O,1 +CC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,1 +OC1=CC4=C(C=C1)C3=CC=C2C=CC=CC2=C3C=C4,1 +CC3=CC2=CC1=CC=CC=C1C=C2C=C3,1 +CCC1=C(C(=CC=C1)CC)N(COC)C(=O)CCl,1 +[NH]3C2=CC=C1C=CC=CC1=C2C4=C3C=CC5=CC=CC=C45,1 +CC(=O)C=C,1 +[O-][N+](=O)C1=CC(=C(C=C1)C2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +CN1CCC4=C2C1CC5=C(C2=C3OCOC3=C4)C=CC=C5,1 +CC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +CC(=O)OCC(O)CO,1 +CC(C)CCCC(C)C3CCC4C2C(OO)C=C1CC(O)CCC1(C)C2CCC34C,1 +CC(=O)C(Cl)Cl,1 +[O-][N+](=O)C2=C1C=CC=C3C1=C(C=C2)C4=C(C=CC5=CC=CC3=C45)[N+]([O-])=O,1 +C1=CC2=C5C=CC=C6C=CC4=CC=C3C=CC(=C1)C2=C3C4=C56,1 +[O-][N+](=O)C3=CC=C2OC(=O)C1=CC=CC=C1C2=C3,1 +CC(=O)NC1=CC=C(C=C1)OC2=CC=CC=C2,1 +CC4CC3(OC1OC(CO)C(O)C(O)C1O)C=C(C)C2(CC2)C(C)(O)C3C4=O,1 +C1OC1COC2=C(C=CC=C2)C3=CC=CC=C3,1 +COC(=O)C(CSCCBr)NC(C)=O,1 +CC5=C3CCC4=C2C1NC1C6=C(C2=CC(=C34)C=C5)C=CC=C6,1 +CC(C)OS(C)(=O)=O,1 +CN(C)C1=CC=C(C=C1)C,1 +CNC(=O)OC1=CC=C(C=C1)C2=CC=CC=C2,1 +C6CCC5=C3C1=CC=CC=C1C4=CC2=CC=CC=C2C(=C34)C=C5C6,1 +NC1=C3C(=CC=C1)C2=CC=CC=C2C=C3,1 +OP(=O)(OCC(Br)CBr)OCC(Br)CBr,1 +[O-][N+](=O)C1=CC=C(C=C1)OC2=CC=CC=C2,1 +CC1=C3C(=C(C=C1)C)C2=CC(=CC=C2[NH]3)[N+]([O-])=O,1 +CC1=CC=C(C=C1)NCCCl,1 +O=NC2=CC1=CC=CC=C1C=C2,1 +C[N]1C(=NC2=C1C=CC3=CC=NC=C23)N,1 +C2=CC1=CC4=C(C=C1C=C2)C3=CC=CC=C3C=C4,1 +OP1(=NCCCO1)N(CCCl)CCCl,1 +OC2C1=C(C=CC=C1)C3=C2C=C(C=C3)[N+]([O-])=O,1 +C1OC1COC3=CC=C2SN=CC2=C3,1 +[O-][N+](=O)C1=CC=C(C=C1)C3=C([N]2C=CSC2=N3)N=O,1 +C1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +CC(=O)ON(C(C)=O)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +NC1=C(C=C(C=C1)[N+]([O-])=O)O,1 +COC1=CC3=C(C=C1)OC2=C(C(=CC(=C2)OC)O)C3=O,1 +OC2=C1C(C=CC(C1=CC=C2)=O)=O,1 +CC3=CC(=O)C2=C(C(=C1C=CC=CC1=C2O)O)C3=O,1 +CN(C)C(Cl)=O,1 +COC1=C(C=CC(=C1)N=NC2=CC=CC=C2)N,1 +CC(C)CC(=O)OCC1=COC=C2C(=CC=[C]12)C=O,1 +CC(=O)OCC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,1 +COC1=C(C=CC(=C1)[N+]([O-])=O)N,1 +N1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +CNC(=O)CSP(=S)(OC)OC,1 +CC1=C(C=CC=C1)NO,1 +OC5=CC4=C3C2=C1C=CC=CC1=CC=C2[NH]C3=CC=C4C=C5,1 +C=CC(=O)NCNC(=O)C=C,1 +CCOC1=CC=C(C=C1)[N+]([O-])=O,1 +CC(C)(C)N(CC(=O)C1=CC(=C(C=C1)O)CO)CC2=CC=CC=C2,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2C(O3)=O,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=C(C=CC=C2)Cl,1 +NC1=C(C=C(C(=C1)[N+]([O-])=O)N)F,1 +OC1=CC2=C(C(=C1)O)C(C(C(O2)C3=CC(=C(C=C3)O)O)=O)=O,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC(=CC=C2)CCl,1 +CC(Br)C(Br)CCl,1 +C[N]1C(=NC2=C1C=C(C)C3=NC=CN=C23)N,1 +C4CC3=C(C2=C1C=CC=CC1=CC=C2C=C3)C4,1 +COCC4CN(C)C3CC1=C[N](C)C2=CC=CC(=C12)C3=C4,1 +[O-][N+](=O)C1=CC(=C(C(=C1)[N+]([O-])=O)C2=CC=CC=C2)[N+]([O-])=O,1 +C3=CC2=CC1=CC=CC=C1N=C2C=C3,1 +CCN1C=C(C(O)=O)C(=O)C2=C1N=C(C(=C2)F)N3CCNCC3,1 +CC(=O)NC(CSCCCl)C(O)=O,1 +ClC(Cl)C1=CC=CC=C1,1 +[O-][N+](=O)C1=CC=C(C=C1)C=CC2=CC(=CC=C2)Cl,1 +[O-][N+](=O)C1=CC(=C(C=C1)C2=CC(=C(C=C2)[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O,1 +CCCCN(CCCC)N=O,1 +CNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +COC1=C(C=CC(=C1)NS(C)(=O)=O)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +C[N]1C=NC(=C1N=O)C2=CC=CC=C2,1 +[O-][N+](=O)C2=C3C=CC4=NC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +N#CC1=CC3=C2C1=CC=CC2=CC=C3,1 +NC3=CC2=C(C1=CC=CC=C1N=C2C=C3)N,1 +ONC1=CC=CC=C1,1 +ClC2=CC1=CC=CN=C1C=C2,1 +C1=CC3=C(C=C1)C4=C2C=CC=CC2=C5C=CC=C6C=CC(=C3)C4=C56,1 +CCC(C)OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +OC1=C2C=CC3=CC=C(C4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 +ClC=C(Cl)SCC1=CC=CC=C1,1 +S(SC2=NC1=CC=CC=C1S2)C4=NC3=CC=CC=C3S4,1 +N1C5C1C2=C(C=C4C(=C2)C3=CC=CC=C3C=C4)C6=C5C=CC=C6,1 +CC(=O)NC2=C1N=CC=CC1=CC=C2,1 +CN1CN=C2C(=[N+](O)[C-]N=C12)N,1 +CC=C(Cl)C=O,1 +NC(=N)NC(=O)C1=C(N=C(C(=N1)Cl)N)N,1 +C[N]1C(=NC2=C1C=CC3=NC=C(C)N=C23)N,1 +COC3=CC(=C2N=C1OC=CC1=C(OC)C2=C3)OC,1 +CN(COC(C)=O)[N+]([O-])=O,1 +CC(Cl)(Cl)[N+]([O-])=O,1 +CN(C)C(=S)SSC(=S)N(C)C,1 +NC1=CC2=CC=C3C=CC=C4C=CC(=C1)C2=C34,1 +NC1=CC=C(C=C1)SC2=CC=CC=C2,1 +CC1=C3C(=CC2=CC=CC=C12)C4=C(C=C3)C(O)C(O)C5OC45,1 +[O-][N+](=O)C1=CN=C(S1)N2CCN(C(=O)C(Cl)Cl)C2=O,1 +COC1=NSC2=CC=C(N)C=C12,1 +[O-][N+](=O)C1=CC=C2C=CC3=C(C5=C(C4=CC=C1C2=C34)C=CC=C5)[N+]([O-])=O,1 +CN(C)CCCNC2=C1C(=CC=C(C1=NC3=CC=CC=C23)N(CCO)CCO)[N+]([O-])=O,1 +CC1=CC=C(C=C1)NC(=O)C2=CSC(=C2)[N+]([O-])=O,1 +ClC(Cl)=C(Cl)C=O,1 +COC3=C2N=C1OC=CC1=C(C2=CC=C3)OC,1 +COC1=C(C5=C(C(=C1)O)C(=O)C2=C(C3=C(C=C2OC)OC4OC=CC34)O5)OC,1 +[O-][N+](=O)C1=CC=C(C=C1)NC2=CC=C(C=C2)Cl,1 +NC1=CC=C(C=C1)CC2=CC=C(C=C2)N,1 +NC(CCC(=O)NC(CSC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O)C(=O)NCC(O)=O)C(O)=O,1 +NC(CSC(Cl)=C(Cl)C(Cl)=C(Cl)Cl)C(O)=O,1 +CNC1=C([N](C=N1)C)C(=O)N(C)N=O,1 +CC3=CC2=C1C=C(C=CC1=CC=C2C=C3)C,1 +COC1=C(C=CC(=C1)NS(C)(=O)=O)NC3=C2C=CC=C(C2=NC4=CC(=CC=C34)N=[N+]=[N-])C,1 +CCN(CCCl)CCCNC2=C1C=CC=CC1=NC3=CC=CC=C23,1 +CC(O)CN(C)C1=NN=C(C=C1)NN,1 +CC4=CC3=CC2=C1C=CC=CC1=CC=C2C=C3C=C4,1 +CC1(C)COC1=O,1 +CC(O)CN(CC(C)O)N=O,1 +CC(Cl)CO,1 +CC1=C(C=C(C=C1)N=NC2=CC(=C(C=C2)C)N)N,1 +ClC(Cl)C(=O)C(Cl)Cl,1 +COC2=C1OC=CC1=CC3=C2OC(C=C3)=O,1 +CC4=C2C=C1C=CC=CC1=CC2=C3C=CC(C(C3=C4)O)O,1 +NC2=C1C=CC=CC1=C(C=C2)N,1 +O=NC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +C[N]2C(=NC3=C1C=CC=NC1=CC(=C23)C)NC(C)=O,1 +C1=CN=C(C=C1)C2=CN=CC=C2,1 +CC(=O)NC1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,1 +CC1=C4C(=C(C2=CC=CC=C12)CBr)C3=CC=CC=C3C=C4,1 +O=C1NCNC(=O)N1,1 +CC(=O)NC1=C(C(=CC=C1)N)C(O)=O,1 +C1OC1CC2=CC=CC=C2,1 +OC1=C(C=C(C=C1[N+]([O-])=O)C2=CC=CC=C2)[N+]([O-])=O,1 +C[N+]2=C1C=CC=CC1=C(C3=CC=CC=C23)N,1 +CCOC1=C(C=CC=C1)[N+]([O-])=O,1 +CCCCCN1C3C1C2=C(C=CC=C2)C4=C3C=CC=C4,1 +CC2=CC1=CC4=C(N=C1C=C2)C3=CC=CC=C3C=C4,1 +CC1=C3C(=C(C=C1)C)C2=CC=CC=C2C=C3,1 +C1=CC3=C(C=C1)C4=CC=C5C2=CC=CC=C2C=C6C=CC(=C3)C4=C56,1 +O1C2C=CC=CC12,1 +COC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +NC4=C1C=CC=CC1=C3N=C2C=CC(C=C2OC3=C4)=N,1 +NC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,1 +COC1=CC3=C(C(=C1)OC)C(=O)C2=C(C(=CC=C2O)OC)O3,1 +O=C1C=CC3=C2C1=CC=CC2=CC=C3,1 +CCC2=C(N=C1C(=C(C=CC1=N2)NC)C)CC,1 +[O-][N+](=O)C2=CC=C1[NH]C=NC1=C2,1 +CN(C)C1=CC(=CC=C1)O,1 +[N-]=[N+]=NCC1=CC=CC=C1,1 +[O-][N+](=O)C1=CC=[N+](C=C1)[O-],1 +CC4=C1C=CC=CC1=C3N=C2C=CC=CC2=C(C3=C4)C,1 +COC1=C(C=CC(=C1)NS(C)(=O)=O)NC3=C2C=CC(=CC2=NC4=CC=CC=C34)N=[N+]=[N-],1 +O=CC=O,1 +CC2=NC1=CC(=C(C=C1C(=C2)C)C)N,1 +COC1=C(C5=C(C=C1)C2=C(C4=C(C=C2)C=C3OCOC3=C4)N(C)C5=O)OC,1 +CC1(C)CC2C(O)(C1)C=C(C=O)C3(CC23C)C=O,1 +CC=C1CC(=C)C(O)(CO)C(=O)OCC2=CCN3CCC(OC1=O)C23,1 +CC(=O)NC1=CC=C(C=C1)N,1 +ClC1=NC(=CC=C1)C(Cl)(Cl)Cl,1 +CCOS(=O)(=O)C1=CC=C(C=C1)C,1 +[O-][N+](=O)C4=CC=C3C2=C1C(=CC=CC1=CC=C2)C5=C3C4=CC=C5,1 +CC(=O)NN=CC2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 +CCN(CC)CCCC(C)NC2=C1C=CC(=CC1=NC=C2)Cl,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2C3,1 +S2C4=CC=CC5=CC=C3C1=CC=CC=C1C=C2C3=C45,1 +NC2=C1C(C4=C(C(C1=C(C=C2OC3=CC=CC=C3)O)=O)C=CC=C4)=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC5=C(C=C2CC3)C4=CC=CC=C4CC5,1 +O=C1C=CC(=O)C2=C1C=CC=C2,1 +NC3=CN=C2[N]1C=CC=CC1=NC2=C3,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)F,1 +NC1=CC(=C(C=C1)O)[N+]([O-])=O,1 +CC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +CC1=CC=C(C=C1)NO,1 +NC3=CC2=CC1=CC=CC=C1C=C2C=C3,1 +OC5C=C3C2=C(C1=CC=CC=C1C=C2)C4=C3C(=CC=C4)C5O,1 +ClC1=C(Cl)C(=O)NC1=O,1 +OCCN1CN(CCO)CN(CCO)C1,1 +CSC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,1 +NC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +[O-][N+](=O)C4=C1C=CC=CC1=C3C=CC2=CC=CC5=C2C3=C4CC5,1 +OCCNC2=C1C=CC=CC1=NC(=N2)C3=CC=C(S3)[N+]([O-])=O,1 +ClCC=CCCl,1 +ClCC1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,1 +C[N]1C=NC2=C(NO)N=CN=C12,1 +O=CC(=O)C1=CC=CC=C1,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=C(C=C2C=C3)[N+]([O-])=O,1 +OCCN(CCO)C2=CC1=CC=CC=C1C=C2,1 +C=O,1 +CN(C)C1=CC=C(C=C1)N,1 +C[N]1C(=NC2=C1C=CC3=CN=CC=C23)N,1 +ClCC2=C4C=CC=C5C=CC3=C1C=CC=CC1=CC(=C2)C3=C45,1 +CC1=CC=C(C=C1)NC2=CC=C(C=C2)[N+]([O-])=O,1 +CCCCCC=CC(=O)CCC1=CC(=C(C=C1)O)OC,1 +CC1(CO1)C2=CC=C(C=C2)C3=CC=CC=C3,1 +COP(=S)(OC)OC1=CC(=C(C=C1)N)C,1 +CCNC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +OC5C=CC4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4C5O,1 +COC1=C(C=CC(=C1)CNC(=O)CCCCCCC(C)C)O,1 +O=C(OCC=CC1=CC=CC=C1)C=CC2=CC=CC=C2,1 +C[N]1C(=NC2=C1C=CC3=NC=CC=C23)N,1 +ClC1=CC=C(C=C1)C3=C([N]2C=CSC2=N3)N=O,1 +COC1=C(C=CC=C1)CC2CO2,1 +[O-][N+](=O)C1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +CC(=O)N(OC(=O)C1=CC=CC=C1)C2=CC4=C(C=C2)C3=CC=CC=C3C4,1 +CC(=O)C1=CC(=CC=C1)[N+]([O-])=O,1 +FC2=CC1=CC=CN=C1C=C2,1 +OC1=C2C=CC3=CC=CC4=CC=C(C(=C1)[N+]([O-])=O)C2=C34,1 +C5CC4=C3C=C2C1=CC=CC=C1C=CC2=NC3=CC=C4C=C5,1 +ON(C=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +COC4=CC(=O)C3=C2[NH]C1=CC=CC=C1C2=C(C)N=C3C4=O,1 +OC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=C(C=C3)N=NC4=CC=CC=C4,1 +C[N]1C(=NC2=C1C=CC3=NC(=CC=C23)O)N,1 +ClCC(=O)CCl,1 +OP(O)(=N)N(CCCl)CCCl,1 +C[N]2C=C1C=CC=C(C1=N2)[N+]([O-])=O,1 +FC2=C1C=CC=CC1=NC=C2,1 +O=C1C4=C3C2=C1C=CC=C2C=CC3=CC=C4,1 +ClCC1=C(Cl)C(=O)OC1,1 +C1=CC3=C(C=C1)C2=CC=CC=C2C=C3,1 +CC1=C(C=CC=C1)N=O,1 +OC1=C2C(=CC=C1)C3=C(C=C2)[NH]C4=C3C5=C(C=C4)C=CC=C5,1 +CC(=O)C(C)=O,1 +CC1=C(C=C(C=C1)NO)C,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC=C(C=C2)Br,1 +[O-][N+](=O)C2=CC1=C3C=CC4=CC=CC5=CC=C(C=C1O2)C3=C45,1 +CN(C)C(=O)NC1=CC(=C(C=C1)Cl)Cl,1 +CC1=C3C(=C(C=C1)C)C2=CC=CC=C2[NH]3,1 +[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=CC=C2)O3,1 +NC(=O)NN=CC1=CC=C(O1)[N+]([O-])=O,1 +C[N]1C(=NC2=C1C=C(C)C3=NC(=C(C)N=C23)C)N,1 +C=CCN=C=S,1 +[O-][N+](=O)C([N+]([O-])=O)([N+]([O-])=O)[N+]([O-])=O,1 +C1COCC2(C1)CO2,1 +ClC3=CC=C2OC1=CC=CC=C1C2=C3,1 +OC2=C3C=CC4=CC1=CC=CC=C1C5=CC=C(C=C2)C3=C45,1 +CC1=C(C=C(C=C1N)[N+]([O-])=O)[N+]([O-])=O,1 +[O-][N+](=NC1=CC=CC=C1)C2=CC=CC=C2,1 +ClC(=O)C1=CC=CC=C1,1 +COC1=CC3=C(C(=C1)O)C(=O)C2=C(C=CC(=C2)O)O3,1 +ClC2=C(Cl)C(=O)C1=C(C=CC=C1)C2=O,1 +OC1=C3C=CC(=C4C=CC2=CC=CC(=C1)C2=C34)[N+]([O-])=O,1 +COC3=CC=C2C(=C1C=COC1=NC2=C3)OC,1 +C1CSCN1,1 +C1=CC3=C(C=C1)C2=CC5=C(C=C2C=C3)C4=CN=CC=C4C=C5,1 +CC2=CC1=CC=CC=C1N=C2,1 +[O-][N+](=O)C1=C(C=CC=C1)Br,1 +CC(C)(C)OC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +C[N]1C=NC(=C1SC3=C2[NH]C=NC2=NC=N3)[N+]([O-])=O,1 +NC1=C2C=CC3=C(C=CC4=CC=C(C=C1)C2=C34)[N+]([O-])=O,1 +NC2=C1C=CC=CC1=CC=C2,1 +BrCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,1 +NC(=O)OC1CO1,1 +CCN(C=O)N=O,1 +C[N]1C(=NC2=C1C=CC3=NC=C(C)N=C23)NO,1 +OC1=C(C=C(C=C1)Cl)CC2=C(C=CC(=C2)Cl)O,1 +CCCCN(N=O)C(N)=O,1 +CC(C)(C)NC(=O)C=CC1=CC=C(O1)[N+]([O-])=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=C(C=CC=C2C3)[N+]([O-])=O,1 +COC(=O)NN=CC2=[N+](C1=CC=CC=C1[N+](=C2)[O-])[O-],1 +NC1=CC=C(C=C1)C2=CC=C(C=C2)N,1 +CCN(C)N=O,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=C(C=C2CC3)[N+]([O-])=O,1 +CCOC1=CC=C(C=C1)NO,1 +OC(CN=[N+]=[N-])CN=[N+]=[N-],1 +NC1=C(C=C(C=C1)F)F,1 +CC5=C1C=CC=CC1=C4C3=C2C=CC=CC2=C(C=C3[NH]C4=C5)C,1 +[O-][N+](=O)C3=CC=C2[NH]C1=CC=CC=C1C2=C3,1 +CC(O)CN(CC(O)CO)N=O,1 +CC1=C(C=C(C=C1)N)O,1 +[O-][N+](=O)C2=C3C=CC4=C(C1=CC=CC=C1C5=CC=C(C=C2)C3=C45)[N+]([O-])=O,1 +CN(C)N=NC1=CC=C(C=C1)Cl,1 +NC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,1 +CN(C)CCNC(=O)C2=C1OC3=C(OC1=CC=C2)C=CC=C3,1 +CC#CC(OC(=O)NC1CCCCC1)(C2=CC=CC=C2)C3=CC=CC=C3,1 +C[N]3C=CC4=CC=C2C=CC1=CC=C(O)C=C1C2=C34,1 +ClCC2=C1C=CC=CC1=C(C3=CC=CC=C23)Cl,1 +ON=C(O)C1=CC=CC=C1,1 +C[N]1C=CN=C1[N+]([O-])=O,1 +CC2=CC1=CC4=C(C=C1C=C2)C3=CC=CC=C3C=C4,1 +CC(=O)NC1=C2C=CC3=CC=CC4=CC=C(C(=C1)O)C2=C34,1 +C2=CC1=CC=CN=C1C=C2,1 +[O-][N+](=O)C1=CC=C(C=C1)S,1 +CC3=C2C=CC1=CC=CC=C1C2=C(C4=CC=CC=C34)C,1 +CCN1C=C(C(O)=O)C(=O)C2=C1C=C(C(=C2)F)N3CCNCC3,1 +ClCC4=C2C1=CC=CC=C1C3=CC=CC(=C23)C=C4,1 +[O-][N+](=O)C1=CN=C(S1)N2CCNC2=O,1 +CC3=C(C2=NC1=CC(=C(C=C1N=C2C=C3)C)N)N,1 +C[N]1C(=NC2=C1C=C(C)C3=NC=C(C)N=C23)N,1 +NC2=C1C=CC=C(C1=CC=C2)N,1 +C[N]1C(=NC2=C1C=C(C)C3=NC=C(N=C23)C4=CC=CC=C4)N,1 +C[N+]2=C1C=CC=CC1=CC3=CC=CC=C23,1 +OC(=O)CC1=CC(=C(C=C1)O)O,1 +C[N]1C(=NC2=CC(=CC=C12)C)N,1 +COP(=O)(OC)OC=C(Cl)Cl,1 +COC4=C2C1=CC=CC=C1CC3N(CCC(=C23)C=C4O)C,1 +OCC(Br)CBr,1 +[O-][N+](=O)C1=CC2=CC=C3C=C(C=C4CCC(=C1)C2=C34)[N+]([O-])=O,1 +O=C1C(=O)C3=C2C1=CC=CC2=CC=C3,1 +ClCC1=C2C=CC3=CC=CC4=CC=C(C=C1)C2=C34,1 +[O-][N+](=O)C1=CC=C(O1)C=O,1 +CC3=C2C1=CC=CC=C1[NH]C2=C(C(=N3)N)C,1 +O=C1C=CC4=C2C1=CC=C3C(C=CC(=C23)C=C4)=O,1 +CNC2=C(C1=NC(=CN=C1C=C2)C3=CC=CC=C3)C,1 +CC(=O)NC1=CC=C(C=C1)C2=CC=C(C=C2)N,1 +O2C3C=CC1=C(N=CC=C1)C23,1 +CCC(=C)C=O,1 +CC2=C(N=C1C=C(C=CC1=N2)N)C,1 +OS(=O)(=O)C1=C(C=CC(=C1)NC2=C(C=C(C=C2)[N+]([O-])=O)[N+]([O-])=O)NC3=CC=CC=C3,1 +CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)C=O,1 +CNC1=C(C=C(C=C1)N(CCO)CCO)[N+]([O-])=O,1 +O=C1C5=C4C3=C1C=C2C=CC=CC2=C3C=CC4=CC=C5,1 +COC(=O)C3=C2N=C1C=CC=CC1=C(C2=C(C=C3)[N+]([O-])=O)NCCCN(C)C,1 +ClC(Cl)C1=C(Cl)C(=O)OC1,1 +CC1=C(C=C(C(=C1C)N)[N+]([O-])=O)N,1 +CC5CC2C(CC3=C[N](C1CCCC1)C4=CC=CC2=C34)N(C)C5,1 +CC1=C(C=CC(=C1)[N+]([O-])=O)[N+]([O-])=O,1 +C[N]1C(=NC3=C1C=CC4=CC=C2C=CC(=CC2=C34)O)C,1 +[O-][N+](=O)C1=CC=C(C=C1)C(=O)OCC2CO2,1 +[O-][N+](=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +CC1=C(C(=CC=C1)N)N,1 +[O-][N+](=O)C1=C2C=CC3=CC=CC4=CC=C(C(=C1)[N+]([O-])=O)C2=C34,1 +CNC1=CC=C(C=C1)NC3=C2C=CC=CC2=NC4=CC=CC=C34,1 +CC(=O)C1=CC=C[NH]1,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC5=C(C=C2C=C3)C4=CC=CC=C4C=C5,1 +[O-][N+](=O)C1=CC(=CS1)C(=O)NC2=CC(=CC=C2)F,1 +[O-][N+](=O)C1=CC3=C(C=C1)C2=CC=CC=C2O3,1 +BrCC(=O)C1=CC=C(C=C1)C2=CC=CC=C2,1 +O=C1NC(=O)C=C1,1 +CC(=O)NC1=CC=C(C=C1)N=NC2=C(C=CC(=C2)C)O,1 +CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)CO,1 +NC1=C(C=C(C=C1)C2=CC(=C(C=C2)N)[N+]([O-])=O)[N+]([O-])=O,1 +NC1=CC(=C(C=C1)CO)[N+]([O-])=O,1 +[O-][N+](=O)C4=C2C(=CC=C3C1=CC=CC=C1C(=C23)C=C4)[N+]([O-])=O,1 +[NH]1C(=NC(=C1C2=CC=CC=C2)C3=CC=CC=C3)C4=CC=CC=C4,1 +CC(=O)NN,1 +CC(O)CN,1 +CC4=C2C=C1C(C(C=CC1=CC2=C3C=CC=CC3=C4)O)O,1 +NC3=CC=C2N=C1C=CC=C[N]1C2=N3,1 +NC1=C(C=CC(=C1)[N+]([O-])=O)CO,1 +O=C1C(=O)C5=C3C2=C1C=CC=C2C=CC3=C4C=CC=CC4=C5,1 +NC1=CC=C(C=C1)OC2=CC(=CC=C2)OC3=CC=C(C=C3)N,1 +C1=CC2=CC4=CC=C5C=CC=C6C=C3C=CC(=C1)C2=C3C4=C56,1 +ClCC4=C3C1=CC=CC2=CC=CC(=C12)C3=CC=C4,1 +C[N]1C(=NC=C1[N+]([O-])=O)C,1 +CN(C)CCNC(=O)C3=C2N=C1C=CC=CC1=C(C2=CC=C3)N,1 +CC(=O)N(O)C1=CC=C(C=C1)[N+]([O-])=O,1 +C5CCC4=C3C=C2C1=CC=CC=C1C=CC2=NC3=CC=C4C5,1 +[O-][N+](=O)C2=CC1=CC=CN=C1C=C2,1 +C(CCC1CO1)CC2CO2,1 +O=C2CC(=O)C1=C(C=CC=C1)C2=O,1 +C[N]1C(=NC2=C1C=C(C)C3=NC(=CN=C23)C)N,1 +[O-][N+](=O)C2=C1C=CC=CC1=[N+](C=C2)[O-],1 +OC5C=CC4=C3C=C1C=CC=C2C=CC(=C12)C3=CC=C4C5O,1 +NC1=CC(=C(C=C1)[N+]([O-])=O)N,1 +OC1=CC=C(C=C1)C=NN4N=NC2=C([NH]C3=CC=CC=C23)C4=O,1 +CC(O)CN(C)N=O,1 +CC1=C(C(=CC=C1)C)C,1 +C1N2CN3CN1CN(C2)C3,1 +CC4=C2C1=CC=CC=C1[NH]C2=C3C(C=C(C(C3=N4)=O)N5CC5)=O,1 +CN(C)CCNC(=O)C3=C2C=C1C=CC=CC1=CC2=CC=C3,1 +CC2=C4C=C1C=CC=CC1=C5C=CC3=CC=CC(=C2)C3=C45,1 +[O-][N+](=O)C1=CC=C(C=C1)C(=O)C2OC2C3=CC=CC=C3,1 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O,1 +OC3=C1C=CC=CC1=C2C=CC=CC2=C3,1 +BrC=CBr,1 +CCCC=CC(=O)OC1C(C)(C)CC2C1(O)C=C(C=O)C34CC23C(=O)OC4O,1 +[O-][N+](=O)C1=CC3=C(C=C1)OC2=C(C=C(C(=C2)Cl)Cl)O3,1 +NCCCNCCCCN(CCCN)N(O)N=O,1 +CC3=C2C1OC1C5=C(C2=C(C4=CC=CC=C34)C)C=CC=C5,1 +[O-][N+](=O)C1=CC=C(C=C1)C3=C([N]2C=CSC2=N3)[N+]([O-])=O,1 +CN(C)N=NC1=CC=C(C=C1)Br,1 +[O-][N+](=O)C3=CC=C2CC1=CC=CC=C1C2=C3,1 +NC(=NO)C1=CC=C(O1)[N+]([O-])=O,1 +C1=CC3=C(C=C1)C2=CC=CN=C2C=C3,1 +[O-][N+](=O)C1=C3C(=CC=C1)C2=CC=CC=C2[NH]3,1 +NC2=C1N=CC=CC1=CC=C2,1 +CC[N+]2=C(C1=CC(=CC=C1C3=CC=C(C=C23)N)N)C4=CC=CC=C4,1 +ON(N=O)C1=CC=CC=C1,1 +CC3=C(C=C2N=C1C=C(C(=CC1=CC2=C3)C)N)N,1 +NC1=CC(=C(C=C1)O)N,1 +NC2=C1C=CC=CC1=NC3=C2CCCC3,1 +CCN(CC)C1=CC=C(C=C1)C(C2=CC=C(C=C2)N(CC)CC)=C3C=CC(C=C3)=[N+](CC)CC,1 +CN(C)C1=CC=C(C=C1)C(=N)C2=CC=C(C=C2)N(C)C,1 +CC1=CC(=C(C=C1)N=NC3=C2C=CC(=CC2=CC(=C3O)S(O)(=O)=O)S(O)(=O)=O)C,1 +ClC=CC[N+]23CN1CN(CN(C1)C2)C3,1 +COC3=CC2=C(C1=CC=C(C=C1N=C2C=C3)Cl)NC(C)CCCN(CCCl)CCCl,1 +CC3=C(C=C2[N+](=C1C=C(C(=CC1=NC2=C3)C)N)C4=CC=CC=C4)N,1 +CN(C)CCCCl,1 +NC1=CC=C(C=C1)C(C2=CC=C(C=C2)N)=C3C=CC(=N)C=C3,1 +CN(C)C3=CC2=[S+]C1=CC(=CC=C1N=C2C=C3)N(C)C,1 +CC(COC1=CC=CC=C1)N(CCCl)CC2=CC=CC=C2,1 +CC1=C(C=CC(=C1)C(C2=CC=C(C=C2)N)=C3C=CC(=N)C=C3)N,1 +CN(C)C3=CC2=NC1=CC(=CC=C1C=C2C=C3)N(C)C,1 +CCN(CC)CCCC(C)NC2=C1C=C(C=CC1=NC3=CC(=CC=C23)Cl)OC,1 +ClCC1=NC=CC=C1,1 +ClCC1=CN=CC=C1,1 +CCN(CC)C1=CC3=C(C=C1)C(=C2C=CC(=CC2=[O+]3)N(CC)CC)C4=C(C=CC=C4)C(O)=O,1 +C[N+]2=C1C=C(C=CC1=CC3=CC=C(C=C23)N)N,1 +CN(C)C3=CC2=[S+]C1=CC(=C(C=C1N=C2C=C3)C)N,1 +NC(COC(=O)C=[N+]=[N-])C(O)=O,1 +NC1=NC=C(S1)[N+]([O-])=O,1 +CC(C)CCCC(C)C4CCC5C3CC1OC12CC(O)CCC2(C)C3CCC45C,1 +CCCCN(N=O)C(=N)N[N+]([O-])=O,1 +NC(CC1=CC=C(C=C1)N(CCCl)CCCl)C(O)=O,1 +COC2=CC=C1N=C(N)SC1=C2,1 +CN(N=O)C(=O)NC(C=O)C(O)C(O)C(O)CO,1 +CC2=CN(C1CC(N=[N+]=[N-])C(CO)O1)C(=O)NC2=O,1 +NC1=NC(=O)N(C=N1)C2OC(CO)C(O)C2O,1 +BrC2=C1C=C4C(=CC1=CC=C2)C3=CC=CC=C3C=C4,1 +OC2=C1C=CC(=CC1=C(N=N2)O)[N+]([O-])=O,1 +CCN(N=O)C(=N)N[N+]([O-])=O,1 +CN(C)N=NC1=C([NH]C=N1)C(N)=O,1 +OC1=NC(=NN=C1)O,1 +OC(CBr)C(O)C(O)C(O)CBr,1 +COC24C1NC1CN2C3=C(C(=C(C(=C3O)C)N)O)C4=COC(N)=O,1 +SC2=C1N=C[NH]C1=NC=N2,1 +OCC1OC(C(O)C1O)[N]2C=NC3=C(S)N=CN=C23,1 +NC(CC1=CC(=C(C=C1)O)O)C(O)=O,1 +NC(=NO)C1=CC=CC=C1,1 +CC(=O)NC(CS)C(O)=O,1 +CC1=C(C=CC(=C1)N)C2=CC=C(C=C2)O,1 +NC2=NC1=CC=C(C=C1S2)[N+]([O-])=O,1 +OCC1OC(CC1O)N2C=C(C(=O)NC2=O)C(F)(F)F,1 +CN(N=O)C(=N)N[N+]([O-])=O,1 +NC2=C1N=C[NH]C1=NC=[N+]2[O-],1 +NC2=C1N=C[N](C1=NC=N2)C3OC(CO)CC3O,1 +NC1=NC=CS1,1 +[O-][N+](=O)C1=CC=C(C=C1)CBr,1 +C=CC#N,1 +CCOP(=O)(OCC)OC1=CC=C(C=C1)[N+]([O-])=O,1 +ClCC(Br)CBr,1 +ClCCCl,1 +CC2=C1C(O)C(C)(C)C=C1C(=O)C(C)(O)C23CC3,1 +CC2=C1C(O)C(C)(CO)C=C1C(=O)C(C)(O)C23CC3,1 +CCCN(C(N)=NN=O)[N+]([O-])=O,1 +CCCCCN(N=O)C(=N)N[N+]([O-])=O,1 +CC(C)(O)C3CC2=C(C=C1OC(C=CC1=C2)=O)O3,1 +CN1C(SC2=C1C=CC=C2)=NN,1 +NC(CO)C(=O)NNCC1=C(C(=C(C=C1)O)O)O,1 +N1C(C1C2=CC=CC=C2)C3=CC=CC=C3,1 +CC(C)CC(=O)OCC1=COC(OC(=O)CC(C)C)C2C1CC(OC(C)=O)C23CO3,1 +C[N]1C(=CN=C1C2=NN=C(S2)N)[N+]([O-])=O,1 +C1=CC=C3C(=C1)C=C4C=CC=C5C2=C(C=CC=C2)C3=C45,1 +NC2=C1N=C([NH]C1=NC=N2)C3=CC=C(C=C3)[N+]([O-])=O,1 +COC4=C3C(=C2C(=C1C(CC(CC1=C(C2=C(C3=CC=C4)O)O)(O)C(C)=O)=O)O)O,1 +COC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=CC5=C3C4C=COC4O5)OC,1 +NC(CSC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O)C(O)=O,1 +ClCCN(CCCl)P1(=O)OCC(=O)CO1,1 +C[N+]2=C1C=CC=CC1=NC3=CC=CC=C23,1 +CS(=O)(=O)OCC(O)C(O)COS(C)(=O)=O,1 +CC(C)(N=NC(C)(C)C(N)=N)C(N)=N,1 +C[N+]([O-])(CCCl)CCCl,1 +N=NC1=NNC=C2C=CC=CC12,1 +[O-][N+](=O)C1=CC=C(S1)NC(=O)NCCCl,1 +OCC1OC(C(O)C1O)[N]2C=NC3=C(NO)N=CN=C23,1 +CCOC(=O)NNC2=C1C=CC=CC1=CN=N2,1 +CCN(CCCl)CCCNC2=C1N=C(C=CC1=NC3=CC(=CC=C23)Cl)OC,1 +CCN(CCCl)CCCNC1=C4C(=NC2=CC=CC=C12)C3=NC=CC=C3C=C4,1 +CC=C1CC(=C)C(C)(O)C(=O)OCC2=CCN3CCC(OC1=O)C23,1 +NCC(=O)NC1=CC=CC=C1,1 +CC(C)CN(N=O)C(N)=N[N+]([O-])=O,1 +CN1CC(=CC2C1CC3=C[NH]C4=CC=CC2=C34)C,1 +CC4CC1C(CC2=C[NH]C3=CC=CC1=C23)N(C)C4,1 +NC3=CC2=[S+]C1=CC(=CC=C1N=C2C=C3)N,1 +CC[N]2C1=CC=CC=C1C3=CC(=CC=C23)N,1 +CC2=CC=C1N=C(N)[NH]C1=C2,1 +CCN(CC)C1=CC=C(C=C1)C(C2=CC=CC=C2)=C3C=CC(C=C3)=[N+](CC)CC,1 +NC1=CC3=C(C=C1)C2=NC4=C(C(N2C3)=O)C=CC=C4,1 +C1OC1CC3=C2C=CC=CC2=CC=C3,1 +NC(CCC(=O)NC(CS)C(=O)NCC(O)=O)C(O)=O,1 +O=C(C1OC1C2=CC=CC=C2)C3=CC=CC=C3,1 +COC2=C(C1=NC3=C(C(=C1C=C2)OC)CCO3)OC,1 +NN=C1N=NC=C2C=CC=CC12,1 +NC(=O)CC1CO1,1 +CCC(C)ON=O,1 +CC3(C[N]1C=CN=N1)C(N2C(CC2=O)S3(=O)=O)C(O)=O,0 +CN(C)CCOC(=O)C=C,0 +ClC1=C(C=C(C(=C1)Cl)Cl)Cl,0 +CCOC(=O)COC1=CC2=C(C=C1)C(=O)C=C(O2)C3=CC=CC=C3,0 +CCCCCCCCCCCCC1=CC=CC=C1,0 +CCOC(=O)CC(C)C,0 +CCCCCOC(=O)C(C)=C,0 +CC1CCCC2(C)CCCCC12O,0 +CC(=C)C(=O)OCCOC(=O)C(C)=C,0 +ClC1=C(C=CC=C1)C=O,0 +OC1=C(C(=C(C=C1Cl)Cl)Cl)[N+]([O-])=O,0 +CCOC1=CC2=C(C=C1)NC(C)(C)C=C2C,0 +CCCCC(CC)COC(=O)C1=C(C=CC=C1)C(=O)OCC(CC)CCCC,0 +CCCCC(CC)COC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 +CCN(CC)CC#CC(C)(C)OC(=O)C(O)(C1CCCCC1)C2=CC=CC=C2,0 +CC(C)(C)COC(=O)C=C,0 +FC(Cl)C(F)(F)C(F)(F)Cl,0 +NC2=NC1=NC(=C(N=C1C(=N2)N)C3=CC=CC=C3)N,0 +COC(=O)C1=CC=C(C=C1)C(=O)OC,0 +ClC2=CC1=CC=CC=C1N=C2,0 +CC(=C)C(=O)OCCCCCOC(=O)C(C)=C,0 +CC(CC1=CC(=C(C=C1)O)O)C(C)CC2=CC(=C(C=C2)O)O,0 +OC1=C(C=C(C=C1)Cl)SC2=C(C=CC(=C2)Cl)O,0 +CC(=O)CC(=O)NC1=C(C=CC=C1)C,0 +C1CCOC1,0 +CCOCCC1=C(N=C([N]2N=CN=C12)N)C3=CC=CC=C3,0 +NCCS,0 +CC(C)(C)NC(=O)C3CCC4C2CC=C1C=C(CCC1(C)C2CCC34C)C(O)=O,0 +OC1=CC=C(C=C1)C2=CC=C(C=C2)O,0 +CC1=CC=C(C=C1)Br,0 +ClC3=C2C=C1C=CC=CC1=CC2=CC=C3,0 +COC2=C1OC=CC1=C(OC)C3=C2OC(C=C3)=O,0 +C2C1=C(C=CC=C1)C3=C2C=CC=C3,0 +CC2CCCC(=O)CCCC=CC1=C(C(=CC(=C1)O)O)C(=O)O2,0 +NC(CCC(O)=O)C(O)=O,0 +CC(O)C[N+](C)(C)NC(=O)C(C)=C,0 +CCOC(=O)OCC,0 +ClCC2=C3C=CC4=C1C=CC=CC1=CC5=CC=C(C=C2)C3=C45,0 +C3CCC2OCCOCCOC1CCCCC1OCCOCCOC2C3,0 +ON1C(=O)CCC1=O,0 +CCN(CC)CCCN,0 +CC(C)CCOC(C)=O,0 +CC1=C(C(=CC(=C1)C2=CC(=C(C(=C2)C)N)C)C)N,0 +CCCCCCC(O)=O,0 +CC(C)C1C(C)C(C)(C)C2=C1C=C(C(=C2)C)C(C)=O,0 +OC(=O)CC(O)(CC(O)=O)C(O)=O,0 +ICI,0 +COC1=CC(=CC=C1)C(=O)CBr,0 +CCN(CC)CCO,0 +CC3CC1=C(C(=C(C=C1)C(=O)NC(CC2=CC=CC=C2)C(O)=O)O)C(=O)O3,0 +CCCCC1CO1,0 +CCOCOCC,0 +CC(=C)C(=O)OCCO,0 +COC1=CC=C(C=C1)C3=COC2=C(C(=CC(=C2)O)O)C3=O,0 +OCC(O)C1=C(C(=C(O1)O)O)O,0 +COC(=O)C1=CC=C(C=C1)C,0 +ClC1=CC(=CC(=C1)Cl)Cl,0 +NC(N)=O,0 +CCCCCl,0 +[O-][N+](=O)C1=CC=CC=C1,0 +C[N]1C=NC2=C1C(NC(N2C)=O)=O,0 +CC1=CC=NC=C1,0 +OC(=O)CCC1=C[NH]C2=CC=CC=C12,0 +CC(C)(C)NCC(O)COC2=C1CC(C(CC1=CC=C2)O)O,0 +NC(CC(=O)C1=C(C(=CC=C1)O)N)C(O)=O,0 +CC(N)CCN,0 +CC(S)C(=O)NCC(O)=O,0 +N#CCCCCC#N,0 +CCCCC(CC)COC(=O)C=CC1=CC=C(C=C1)OC,0 +CC1(C)CC(CC(C)(CN=C=O)C1)N=C=O,0 +CC1NC(CC2=C1[NH]C3=CC=CC=C23)C(O)=O,0 +CCOP(=S)(OCC)OC2=NC1=CC=CC=C1N=C2,0 +CCCCC(CC)COP(=O)(OCC(CC)CCCC)OCC(CC)CCCC,0 +CNS(=O)(=O)C1=CC=C(C=C1)NC(C)=O,0 +OC1=CC(=C(C(=C1)Cl)Cl)Cl,0 +CCOC1=CC=C(C=C1)N=[N+]([O-])C2=CC=C(C=C2)OCC,0 +C1=CC=C(C=C1)C2=CC=C(C=C2)C3=CC=CC=C3,0 +CCCCCCCCN1SC=CC1=O,0 +OC(=O)C1=C(C=CC(=C1)Cl)O,0 +NC1=NC(=NC(=N1)N)Cl,0 +CC1=C(C=C(C(=C1)O)C(C)(C)C)SC2=C(C=C(C(=C2)C(C)(C)C)O)C,0 +NC2C1=C(C=CC=C1)C3=C2C=CC=C3,0 +COC(N)=O,0 +FC2=CN(C1CCCO1)C(=O)NC2=O,0 +CC3(C)SC2C(NC(=O)COC1=CC=CC=C1)C(=O)N2C3C(O)=O,0 +COC1=CC=C(C=C1)C=C,0 +CC(=O)C2=CC1=CC=CC=C1C=C2,0 +NC1=NCNC2=C1N=C[N]2C3OC(CO)C(O)C3=O,0 +OC1=CC2=C(C=C1)C4=C(C(O2)=O)C3=CC=C(C=C3O4)O,0 +CCCCCCCC(=O)CCC1=CC(=C(C=C1)O)OC,0 +CC1CC(CC(C)(C)C1)OC(=O)C2=C(C=CC=C2)O,0 +OC(=O)CCCCCCCCC(O)=O,0 +COP(=O)(SC)SC,0 +OC(CC(O)=O)C(O)=O,0 +CC(=C)C(=O)OCC(C)(C)C,0 +CC(C)NCC(O)COC1=C(C=CC=C1)CC=C,0 +C1COCCOCCOCCOCCOCCOCCO1,0 +C=CC1=CC=NC=C1,0 +CC(NC(=O)CC1=C(N=C(N=C1)C)N)=C(CCOC(=O)C2=CC=CC=C2)SC(=O)C3=CC=CC=C3,0 +COC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 +CC(Cl)=O,0 +CCOC1=CC(=CC=C1)[N+]([O-])=O,0 +CC1=NC=C[NH]1,0 +CC(=O)NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)N,0 +CCOC(=O)CNC(=O)CBr,0 +OC(=O)C=CC(O)=O,0 +CN2C(CSCC(F)(F)F)NC1=C(C=C(C(=C1)Cl)S(N)(=O)=O)S2(=O)=O,0 +NC1CCC(CC1)CC2CCC(N)CC2,0 +CCCCC#N,0 +CN(C)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C,0 +CC2(N(O)C1=C(C=CC=C1)C2=O)C3=CC=CC=C3,0 +CC1=NC=C(N=C1)C,0 +CC(C)CCCCCOC(=O)C=C,0 +NC1=C(C=CC=C1)C(O)=O,0 +OC1=CC=CC=C1,0 +NC(=O)N(C1=CC=CC=C1)C2=CC=CC=C2,0 +CCCCCCCCCCCCS,0 +CC(C)N=C=NC(C)C,0 +COC1=CC=C(C=C1)CN(CCN(C)C)C2=NC=CC=C2,0 +CN(C(=O)CN(CCO)CC(=O)N(C)C(C)(C)CC1=CC=CC=C1)C(C)(C)CC2=CC=CC=C2,0 +CCOP(=S)(OCC)OC1=C(C=C(C(=N1)Cl)Cl)Cl,0 +CC(C)CC(C)=O,0 +OCC=CC1=CC=CC=C1,0 +NC1=CC(=CC(=C1)Cl)Cl,0 +CN1CCC(CC1)=C3C2=C(C=CC=C2)C=CC4=C3C=CC=C4,0 +COC1=CC=C(C=C1)O,0 +CCC(=C)C(=O)C1=C(C(=C(C=C1)OCC(O)=O)Cl)Cl,0 +CS(C)(=O)=O,0 +CC(C)(N=NC(C)(C)C#N)C#N,0 +CCC(O)=O,0 +CC(C)CN(CC(C)C)CC(C)C,0 +OC1=CC2=C(C(=C1)O)C(C(C(O2)C3=CC=CC=C3)=O)=O,0 +OCC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,0 +CCCCCC=CCC=CCCCCCCCC(O)=O,0 +CC1=C(C2=C(C=C1[N+]([O-])=O)C(CC2(C)C)(C)C)[N+]([O-])=O,0 +CCCCCCCCCCC1CO1,0 +O=P(OC1=CC=CC=C1)(OC2=CC=CC=C2)OC3=CC=CC=C3,0 +OC1=C(C(=C(C=C1Cl)Cl)Cl)Cl,0 +OCC(=O)N(O)C1=CC=C(C=C1)Cl,0 +CNP1(=NP(=NP(=N1)(NC)NC)(NC)NC)NC,0 +CC(C)(C#N)C(C)(C)C#N,0 +CS(=N)(=O)CCC(N)C(O)=O,0 +CCN(CC)C1=CC2=C(C=C1)C=C(C(=O)O2)C4=NC3=CC=CC=C3[N]4C,0 +NC(CC1=C[NH]C2=CC=C(O)C=C12)C(O)=O,0 +NC1=C(C=CC=C1)C(=O)OCCC2=CC=CC=C2,0 +OC(=O)C=CC1=C(C=CC=C1)[N+]([O-])=O,0 +CC1=CC3=C(C=C1)C2=CC=C(C=C2C3)C,0 +NC(=O)CCCCC(N)=O,0 +NC(=O)C1=C(C=CC=C1)O,0 +NC(CSC=CCl)C(O)=O,0 +O3C4C1OC1C2=C(C=CC=N2)C34,0 +C[N]2C(=NC3=NC1=NC=CC=C1C=C23)N,0 +CC1=C(C=CC=C1)C=O,0 +CCCCCN(CCCCC)CCCCC,0 +CC(=O)OC2=C1N=CC=CC1=CC=C2,0 +OC(=O)C2=C(C=C1C=CC=CC1=C2)O,0 +CCCCC(CC)CNCC(CC)CCCC,0 +CC(C)NC1=NC(=NC(=N1)N)Cl,0 +[NH]1C=CN=C1,0 +OC(=O)CC(NC(=O)COC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 +OCCS,0 +O=S1(=O)CCCC1,0 +CC(C)C(C(=O)OC(C#N)C1=CC(=CC=C1)OC2=CC=CC=C2)C3=CC=C(C=C3)Cl,0 +CCC(C)N,0 +CCCCNC(=O)[N]1C(=NC2=CC=CC=C12)NC(=O)OC,0 +O(C1=CC=CC=C1)C2=CC=CC=C2,0 +CC(C)(C)NCC(O)C1=CC(=C(C=C1)O)NC(N)=O,0 +CN2C(=O)CC(=O)N(C1=CC=CC=C1)C3=C2C=CC(=C3)Cl,0 +CN(CCO)CCO,0 +CC1=C(C(=CC=C1)O)N,0 +CCC(CO)=[N+](O)[O-],0 +OC(=O)C(F)(F)C(F)(Cl)C(F)(F)C(F)(Cl)C(F)(F)Cl,0 +CC(C)OC(=O)CC(O)(CC(O)=O)C(O)=O,0 +CC(C)(C)OC(=O)OC(=O)OC(C)(C)C,0 +ClN1C(=O)N(Cl)C(=O)N(Cl)C1=O,0 +OC1=CC(=CC=C1)NC2=CC=CC=C2,0 +CC1=C(C=CC=C1N=[N+]([O-])C2=C(C(=CC=C2)[N+]([O-])=O)C)[N+]([O-])=O,0 +NC=O,0 +OC1=C(C=C(C=C1)Cl)CC2=CC=CC=C2,0 +CN(N)C=O,0 +CC2=CC=C1N=N[NH]C1=C2,0 +CCCCCCCC(O)=O,0 +CC1=CC=C(C=C1)N(O)C(C)=O,0 +COC1=C(C=C(C(=C1)N)C)N,0 +COC(=O)C1=CC=C(C=C1)O,0 +OC(=O)CC(=CC(O)=O)C(O)=O,0 +NC(=O)C1=NC=CN=C1,0 +CCN(CC1=CC=CC=C1)C2=CC=CC=C2,0 +CNC(=O)ON=CC(C)(C)SC,0 +O=CC2=C1C=CC=CC1=CC3=CC=CC=C23,0 +C1COCO1,0 +OC(=O)C(Br)=C,0 +C=CC1=C(C=CC=C1)C=C,0 +OS(=O)(=O)C1=CC=CC=C1,0 +CCCCCN(CCCOC)C(=O)C(CCC(O)=O)NC(=O)C1=CC(=C(C=C1)Cl)Cl,0 +C=CC(=O)OCCCCOC(=O)C=C,0 +C(OCC1=CC=CC=C1)C2=CC=CC=C2,0 +BrC1=C(C2=C(C(=C1Br)Br)C(=O)OC2=O)Br,0 +CC(C)N2C(=O)C1=C(C=CC=C1)NS2(=O)=O,0 +CCOP(=S)(OCC)SCN1C(=O)OC2=C1C=CC(=C2)Cl,0 +C=CCN(CC=C)CC=C,0 +CCNC1=CC=CC=C1,0 +NC1=C(C=CC=C1O)[N+]([O-])=O,0 +CC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O,0 +CC(C)(OC1=CC=C(C=C1)C(=O)C2=CC=C(C=C2)Cl)C(O)=O,0 +CCOC(=O)C4=CC1=C(C3=C2C(=C1)CCCN2CCC3)OC4=O,0 +COC(=O)C(=CC1=C(C=CC=C1)Br)C#N,0 +CCCCC1C(=O)N(N(C1=O)C2=CC=CC=C2)C3=CC=CC=C3,0 +CC(C)(C)OOC(C)(C)C,0 +CC1=C(C=CC=C1)C(N)=O,0 +CC(C)(OOC(C)(C)C1=CC=CC=C1)C2=CC=CC=C2,0 +CCCCOC(=O)CCC,0 +CCCCOCCCC,0 +CCC(C)=[N+](O)[O-],0 +NC(=O)C1CCCN1C(=O)C(CC2=C[NH]C=N2)NC(=O)C3CCC(=O)N3,0 +CCCC=C(CC)C=O,0 +CC1=CC=C(C=C1)C#N,0 +C2=CC1=CN=NC=C1C=C2,0 +ClC1=C(C(=CC=C1)Cl)C=O,0 +COC1=C(C=CC(=C1)C(C)=O)O,0 +CC(C)COC(=O)C(C)=C,0 +CC(C)(C)C1=C(C=CC(=C1)O)O,0 +NC1CCCC(N)C1,0 +CCCCOC(=O)C1=CC=C(C=C1)N,0 +CC1CCC(CC1)C(C)C,0 +NCCCN,0 +CC1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O,0 +OC1=CC=C(C=C1)NC3=CC2=CC=CC=C2C=C3,0 +CCCCC(CC)C(O)=O,0 +ClCC(Cl)C=C,0 +CC(C)CCOC(=O)CC(C)C,0 +NCC(O)=O,0 +OCC1=CC=C(C=C1)F,0 +CCCCOCCOCCSC#N,0 +O=C2N(SC1CCCCC1)C(=O)C3=C2C=CC=C3,0 +CC3=NN=C4CN=C(C1=C(C=CC=C1)Cl)C2=CC(=CC=C2[N]34)Cl,0 +OC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 +ON(C=O)C1=CC=CC=C1,0 +[O-][N+](=O)C1=CC(=CC=C1)Cl,0 +[O-][N+](=O)C1=CC2=C(C=C1)NC(=O)CN=C2C3=CC=CC=C3,0 +OC(C(O)C(O)=O)C(O)=O,0 +CS(=O)(=O)C=C,0 +CC(C)CC(C)O,0 +O=CC=CC1=CC=CC=C1,0 +CC(C)CNCC(C)C,0 +BrC1=C(C=CC=C1)C2=CC=CC=C2,0 +NC1=CC=C(C=C1)S(=O)(=O)NC3=NC2=CC=CC(=C2N=C3)Cl,0 +CN2C(=O)N(C)C1=C(N=C[NH]1)C2=O,0 +COC=O,0 +OC(=O)C(O)=O,0 +ClC(Cl)(Cl)C(Cl)(Cl)Cl,0 +CSCCC(NC(=O)COC1=C(C=C(C(=C1)Cl)Cl)Cl)C(O)=O,0 +CCCCCCCCCCCCCCCCCCO,0 +OC(=O)CN(CC(O)=O)CC(O)=O,0 +CCCN(CCC)C(=O)SCC,0 +CC1=C(C=C(C=C1)NCCO)O,0 +CC=O,0 +CC1(C)C=C(C(O)=O)C(C)(C)N1O,0 +OC(O)=O,0 +CCCCCCC1CO1,0 +CCCCCC(=O)CC2=C1C(OC3=C(OC1=CC(=C2)O)C(=C(C(O)=O)C(=C3)O)CCCCC)=O,0 +COC1=C(C=C(C=C1)CC=C)OC,0 +CC1=CC(=CC=C1)OP(=O)(OC2=CC=CC=C2)OC3=CC=CC=C3,0 +[O-][N+](=O)C1=CC=C(C=C1)OC2=C(C=C(C=C2Cl)Cl)Cl,0 +O=C3OC2=C1C=COC1=CC=C2C=C3,0 +COC1=C(C(=CC(=C1)C(C)=O)OC)O,0 +COC1(CCCC1)OC5CCC6C4CCC3CC2SC2CC3(C)C4CCC56C,0 +OCC(O)COP(O)(O)=O,0 +CCCCCCNCCCCCC,0 +CSCCC=O,0 +OCCOCCO,0 +CN(C)C1=CC=C(C=C1)C(=C2C=CC(=N)C=C2)C3=CC=C(C=C3)N(C)C,0 +O=C1NC(=O)C2CC=CCC12,0 +CN1CCCC1=O,0 +C=CC1=NC=CC=C1,0 +CCCCC(CC)COP(=O)(OC1=CC=CC=C1)OC2=CC=CC=C2,0 +OC1=CC3=C(C=C1)C(=O)C2=C(C=CC(=C2)O)C3=O,0 +C3CCC2OCCOCCOCCOC1CCCCC1OCCOCCOCCOC2C3,0 +CCCCCCCCCCCCCC[N+](C)(C)CC1=CC=CC=C1,0 +NCC(=O)NCC(=O)NCC(=O)NCC(O)=O,0 +OC1=C(C=CC=C1)C3=NC2=CC=CC=C2O3,0 +CCOP(=O)(CC)OCC,0 +CC(C)=CCC2C(=O)C(=O)C1=C(C=CC=C1)C2=O,0 +BrCC1=CC=C(C=C1)Br,0 +CC1=CC(=O)C=C(C)C1=O,0 +CC5CC2C(CC3=C[N](CC1CC1)C4=CC(=CC2=C34)Br)N(C)C5,0 +CC(=C)C(=O)OCCOCCOCCOC(=O)C(C)=C,0 +OC[P+](CO)(CO)CO,0 +OC2=CC1=C(C=C(C=C1C=C2)S(O)(=O)=O)S(O)(=O)=O,0 +CC(=O)OC3(CCC4C2C=C(Cl)C1=CC(=O)OCC1(C)C2CCC34C)C(C)=O,0 +C1=CC=C4C(=C1)N=C3C2=C(C=CC=C2)C6=C3C4=C5C=CC=CC5=N6,0 +CC1=CC=C(C=C1)N=NC3=C2C=CC=CC2=CC=C3O,0 +COC1=CC(=C(C(=C1)OC)Cl)N2C(=CC(=O)C(=C2C3=CC=C(C=C3)F)C)C4=CC=CC=C4,0 +COC1=CC=C(C=C1)C(Cl)=C(C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC,0 +ClCC1=C(C=CC=C1)CCl,0 +CCC(=C(CC)C1=CC=C(C=C1)OP(O)(O)=O)C2=CC=C(C=C2)OP(O)(O)=O,0 +CC1=NOC(=C1C)NS(=O)(=O)C2=CC=C(C=C2)N,0 +CCCCCCCCCCCCCCCCC1CO1,0 +COC(=O)C1=C(C)NC(=C(C1C2=C(C=CC=C2)[N+]([O-])=O)C(=O)OC)C,0 +OC1=CC=C(C=C1)CC=C,0 +ClC1=CC(=CC=C1)Cl,0 +CC1=C(C=C(C=C1)[N+]([O-])=O)NO,0 +CC3(O)CCC4C2CCC1CC(=O)C(CC1(C)C2CCC34C)C=O,0 +CC1=C(C(=CC=C1)C)NC2=NC(=NC(=C2)Cl)SCC(=O)NCCO,0 +CCOC(=O)C1=C(C=CC=C1)N,0 +CCCC(O)=O,0 +NC3=NC(=C2N=C(O)[N](C1CC(O)C(CO)O1)C2=N3)O,0 +ClC1=CC(=C(N=C1)OC2=CC=C(C=C2)OC3=C(C=C(C=N3)Cl)Cl)Cl,0 +COC1=C(C=CC(=C1)CCC(C)=O)O,0 +NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)N,0 +NC(=O)C1=CC=C(C=C1)N,0 +CC=[N+](O)[O-],0 +OC(=O)CCC(=O)NC1=CC(=C(C=C1)Cl)Cl,0 +CCCC(C)(COC(N)=O)COC(=O)NC(C)C,0 +COC2=CC1=CC=C(C=C1C=C2)CCC(C)=O,0 +OC(=O)COC1=C(C=C(C(=C1)Cl)Cl)Cl,0 +OCCN(CCO)CCO,0 +OC(C1CC1)(C2=CC=C(C=C2)Cl)C3=CC=C(C=C3)Cl,0 +CC(=O)N(O)C1=CC=C(C=C1)Cl,0 +ClC1=C(C(=CC=C1)Cl)Cl,0 +CC(C)[N+](C)(CCOC(=O)C2C1=C(C=CC=C1)OC3=C2C=CC=C3)C(C)C,0 +ClC1=CC=C(C=C1)Cl,0 +COC1=C(C=CC(=C1)C=CC(O)=O)O,0 +CCCCCCC1=CC=C(C=C1)C2=CC=C(C=C2)C#N,0 +CCN1C=C(C(O)=O)C(=O)C2=C1C(=C(C(=C2)F)C3=CC=NC=C3)F,0 +CC1=CC=CO1,0 +OCC1OC(CC1O)N2C=C(CCCl)C(=O)NC2=O,0 +NC1=NC(=CC(=N1)Cl)Cl,0 +OC1=C(C=CC=C1)C(=O)OCC2=CC=CC=C2,0 +C2=NC=C1C=NN=CC1=C2,0 +FC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 +NC(=O)C1=C(C=CC=C1)C(N)=O,0 +CC(=O)NC1=CC=C(C=C1)CC2=CC=C(C=C2)N,0 +COC3=C1C(N(C(C2=CC=CC(=C12)C=C3)=O)C)=O,0 +CCCCOC(=O)C=C,0 +O=C1OCC=C1,0 +[O-][N+](=NC1=CC3=C(C=C1)C2=CC=CC=C2C3)C4=CC6=C(C=C4)C5=CC=CC=C5C6,0 +CC(CS)C1CCC(C)C(S)C1,0 +CC(=O)C1C(=O)OC(=CC1=O)C,0 +NC(=O)NN=CC(O)=O,0 +CCCCCCNC(=O)N1C=C(F)C(=O)NC1=O,0 +N#CCC#N,0 +CC(CCC(O)=O)C3CCC4C2CCC1CC(O)CCC1(C)C2CCC34C,0 +[O-][N+](=O)C1=C(C=CC=C1)C(F)(F)F,0 +COC1=C(C(=C(C(=C1Cl)Cl)[N+]([O-])=O)Cl)Cl,0 +CCCCN(N)CCCC,0 +CCOC(=O)OC(C1CC2CCN1CC2C=C)C4=C3C=C(C=CC3=NC=C4)OC,0 +BrC1=CC=C(C=C1)C2=CC=CC=C2,0 +ClCC(CCl)(CCl)CCl,0 +ClC1=CC=C(C=C1)C3=NC2=CC=CC=C2O3,0 +FC(F)(F)C(F)(F)C(Cl)Cl,0 +CN(C)CCN(CC1=CSC=C1)C2=NC=CC=C2,0 +CC1=C(C=C(C=C1)[N+]([O-])=O)N=[N+]([O-])C2=C(C=CC(=C2)[N+]([O-])=O)C,0 +O=C(C=CC=CC1=CC2=C(C=C1)OCO2)N3CCCCC3,0 +CC(O)CNCC(C)O,0 +CCN(CC)C1=CC(=C(C=C1)N=O)O,0 +COC1=CC=C(C=C1)OC,0 +NC1=CC(=C(C(=C1)C(O)=O)O)S(O)(=O)=O,0 +NC1=C(C=CC(=C1)S(O)(=O)=O)O,0 +CCOP(O)(OC1=CC(=C(C=C1)SC)C)=NC(C)C,0 +FC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 +CC(Br)C1=CC=CC=C1,0 +OCCN1CCNCC1,0 +COC1=CC=C(C=C1)C2=NOC(=C2C3=CC=C(C=C3)OC)CC(O)=O,0 +OC1=C(C=C(C=C1Cl)Cl)NC(=O)C2=C(C(=CC(=C2O)Cl)Cl)Cl,0 +[O-][N+](=O)C1=C(C=CC=C1)C=CC(=O)C2=CC=CC=C2,0 +OC(=O)C1=CC=CC=C1,0 +S=C(NC1CCCCC1)NC2CCCCC2,0 +OC1=C(C=C(C=C1Br)C#N)Br,0 +CC1(C)CC(C(O)=O)C(C)(C)N1O,0 +OC1=C(C(=CC(=C1)Cl)Cl)Cl,0 +CC13CCC(=O)CC1=C2CC2C4C3CCC6(C)C4C5CC5C67CCC(=O)O7,0 +CN2C(=O)CN=C(C1=CC=CC=C1)C3=C2C=CC(=C3)Cl,0 +CC5=CC4=C3C=CC2=C1C=CC=C(C1=CC=C2C3=CC=C4C=C5)C,0 +CCCCCOC(=O)C=C,0 +CCCCOC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,0 +CNC(O)=NO,0 +CC1=CC(=CC(=C1)C)C,0 +CNCC(O)C1=CC(=C(C=C1)O)O,0 +O2C1=CC=CC=C1N=C2C3=CC=CC=C3,0 +CCCCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCCC,0 +O=C1CN(CC2N1CCC3=C2C=CC=C3)C(=O)C4CCCCC4,0 +OCC1=CC=CC=C1,0 +CCN(CC)CC,0 +BrC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 +NC1=CC3=C(C=C1)C(=C2C=CC(C=C2O3)=N)C4=C(C=CC=C4)C(O)=O,0 +BrCC1=CC(=CC=C1)CBr,0 +OC1=C(C(=CC=C1)Cl)Cl,0 +CNCCO,0 +O=C(OC1CCCCC1)C2=C(C=CC=C2)C(=O)OC3CCCCC3,0 +CN(C)C(=O)C1=N[N](C(=N1)CNC(=O)CN)C2=C(C=C(C=C2)Cl)C(=O)C3=C(C=CC=C3)Cl,0 +CC(=C)C(=O)OCCCCCCOC(=O)C(C)=C,0 +CC(CCO)CCC=C(C)C,0 +CCSC(Cl)=O,0 +NC1=C(C(=CC(=C1)Cl)Cl)O,0 +ClN1C(=O)NC(=O)N(Cl)C1=O,0 +C[N+](C)(C)NCCC(O)=O,0 +ClC1=CC=C(C=C1)C(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl,0 +OC(=O)C2=NC1=CC=CC=C1C(=C2)O,0 +ClC2=C(Cl)C3(Cl)C1COS(=O)OCC1C2(Cl)C3(Cl)Cl,0 +OC2=CC1=NC=CC=C1C=C2,0 +CC(=O)C1=C(C=CC=C1)[N+]([O-])=O,0 +CCNS(=O)(=O)C1=CC=C(C=C1)C,0 +CC(Cl)(Cl)C(O)=O,0 +C1=CC=C(C=C1)C2=CC(=CC=C2)C3=CC=CC=C3,0 +COC1=C(C(=CC=C1Cl)Cl)C(O)=O,0 +CCOC(=O)C(C)=C,0 +NCCC1=C[NH]C=N1,0 +CC(COC(=O)C1=CC=CC=C1)(COC(=O)C2=CC=CC=C2)COC(=O)C3=CC=CC=C3,0 +OC(=O)C1=CC=C(C=C1)C(O)=O,0 +O=CC1=CC(=CC=C1)C2=CC=CC=C2,0 +NCCCCCCN,0 +CNCC(O)=O,0 +OC1=CC(=CC(=C1)O)O,0 +CC(=O)C1=CC3=C(C=C1)OC2(CC2)C3=O,0 +CC(=C)C(=O)OCC(C)(C)COC(=O)C(C)=C,0 +OC1=C(C(=C(C=C1[N+]([O-])=O)[N+]([O-])=O)O)[N+]([O-])=O,0 +CCC(C)C=O,0 +NC1=C(C=CC(=C1)C(F)(F)F)Cl,0 +CN(C)C,0 +CC(C)NC1=CC=CC=C1,0 +OC(=O)C1=CC=C(C=C1)N=NC2=CC(=C(C=C2)O)C(O)=O,0 +OC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)O,0 +CN(C)C1=CC=CC=C1,0 +ClC1=CC=NC=C1,0 +FC(Cl)(Cl)Cl,0 +CC1(C)SSCC(NC1=O)C(O)=O,0 +C2=CC1=CC5=C(C=C1C=C2)C4=CC=C3C=CC=CC3=C4C=C5,0 +CC1=CC=C(C=C1)C3=NC2=CC=CC=C2O3,0 +CCCCCCCOC1=C(C=CC=C1)NC(=O)OC(C)CN(CC)CC,0 +CC(CCC(O)=O)C3CCC4C2C(O)CC1CC(O)CCC1(C)C2CCC34C,0 +CCOP(=S)(OCC)OC1=CC2=C(C=C1)C(=C(Cl)C(=O)O2)C,0 +FC1=C(C(=C(C(=C1F)Cl)F)Cl)F,0 +COC1=CC=C(C=C1)CCl,0 +NC1=C(C(=CC=C1)[N+]([O-])=O)O,0 +O=C3CCC(N2C(=O)C1=C(C=CC=C1)C2=O)C(=O)N3,0 +NC(=N)C1=CC=CC=C1,0 +CC(=C)C1CC=C(C)C(=O)C1,0 +CN(C)C1=CC=C(C=C1)N=NC2=CN=CC=C2,0 +ClCC(=O)C1=CC=CC=C1,0 +NC(CCCCNCC(N)C(O)=O)C(O)=O,0 +OC(=O)CCC(O)=O,0 +CC34C=CC2=C1CCC(=O)CC1=CCC2C3CCC4O,0 +OC(=O)C1=CN=CC=C1,0 +CC1=CC=C(C=C1)C=O,0 +CC(=C)C1CC=C(C)C(O)C1,0 +C2CCCCCC1OC1CCCC2,0 +CC(C)CN,0 +CC(=O)C=CC1=CC=CO1,0 +CCC2=C1[NH]C=C(C1=CC=C2)CCO,0 +CC2CC(C)(C)C1=C(C=C(C(=C1)C(C)=O)C)C2(C)C,0 +CCCCCCCCCCCC(=O)N(CCO)CCO,0 +CNC(CC(O)=O)C(=O)N(C2C1SC(C)(C)C(N1C2=O)C(O)=O)C(C(N)=O)C3=CC=C(C=C3)O,0 +CC1(C)C(C=C(Cl)Cl)C1C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3,0 +NC2=NC(=C1[NH]C=NC1=N2)N,0 +OC1COC2C(COC12)O[N+]([O-])=O,0 +CC(C)CC(=O)OCC=C,0 +CCCC(=O)OC1CCCCC1,0 +COC3=CC(=C2C(=O)OC1=CC(=CC(=C1C2=C3)C)O)O,0 +ClC1=NC(=NC(=C1)Cl)Cl,0 +[O-][N+](=O)C1=C(C=CC=C1)NC2=CC=CC=C2,0 +OC(=O)C3CC1=C([NH]C2=CC=CC=C12)C(N3)C4=CC=CC=C4,0 +OCCC#N,0 +CC(C)CC(NC(=O)COC1=C(C=C(C(=C1)Cl)Cl)Cl)C(O)=O,0 +OC(=O)CCCC1=C[NH]C2=CC=CC=C12,0 +COP(=O)(OC)SC,0 +CCCCCCCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCCCCCC,0 +OCC1=CC3=C(C=C1)C(=O)C2=C(C=CC=C2)C3=O,0 +CN1CCCN(C)C1=O,0 +OC2(CCN(CCCC(=O)C1=CC=C(C=C1)F)CC2)C3=CC=C(C=C3)Cl,0 +ClC1=CC(=C(C=C1)C=O)Cl,0 +CC1=CC(=CC=C1)N,0 +CC1(C)C2CCC1(C)C(O)C2,0 +BrC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 +C=CCOC(=O)C=C,0 +CCCCCC=[N+](O)[O-],0 +CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC,0 +CS(O)(=O)=O,0 +O=C3C(=O)C1=C(C=CC2=CC=CC=C12)C4=C3C=CC=C4,0 +CC(C)=CC1C(C(O)=O)C1(C)C,0 +NC2=CC1=CC=CN=C1C=C2,0 +CCCCOCCOP(=O)(OCCOCCCC)OCCOCCCC,0 +OC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 +OCC1=CC(=CC=C1)[N+]([O-])=O,0 +NC1=CC=C(C=C1)S(=O)(=O)NC2=NC=CS2,0 +ON=CC(=O)NC1=CC=CC=C1,0 +CC(C=O)=CC=CC(C)=CC=CC=C(C)C=CC=C(C)C=CC1=C(C)CCCC1(C)C,0 +CC(C)C1=CC(=C(C=C1)C)O,0 +CC(=O)CCC(C)=O,0 +OC(=O)CC1=C[NH]C2=CC=C(O)C=C12,0 +CCCCC(CC)COC(=O)C(C#N)=C(C1=CC=CC=C1)C2=CC=CC=C2,0 +CC(=O)CC(=O)CCC(O)=O,0 +OC(=O)C=CC1=CC(=C(C=C1)O)O,0 +OC2=C1N=CC=CC1=C(C=C2I)Cl,0 +CC(C)(C)C(=O)C(OC1=CC=C(C=C1)Cl)[N]2C=CN=C2,0 +CC3=C2C=C1C=CC=CC1=CC2=CC=C3,0 +OC1OCC=C2OC(=O)C=C12,0 +CC3=C2C1=CC(=CC(=C1C(OC2=CC(=C3)O)=O)O)O,0 +CC(=C)C(=O)OCCOCCOC(=O)C(C)=C,0 +CCCCC(CC)C=O,0 +CCC2=CN(C1CC(O)C(CO)O1)C(=O)NC2=O,0 +NS(=O)(=O)C1=C(C=C2C(=C1)S(NCN2)(=O)=O)Cl,0 +CC(C)C1=C(C=C(C=C1)C)O,0 +ClC1=CC(=CN=C1)Cl,0 +CCC2NC(=O)C1=C(C=C(C(=C1)S(N)(=O)=O)Cl)N2,0 +CN(C)C1=CC=C(C=C1)C=CC=O,0 +CC(C)NCC(O)COC2=C1C=CC=CC1=CC=C2,0 +O=CC1=CC=CC=C1,0 +CC(C(O)=O)C1=CC=C(C=C1)OC2=NC=CS2,0 +ClC2=C(C1=CC=CC=C1C(=C2Cl)Cl)Cl,0 +CCNCC#CC(C)(C)OC(=O)C(O)(C1CCCCC1)C2=CC=CC=C2,0 +O=C(C=CC1=CC=C(C=C1)C2=CC=CC=C2)C3=CC=CC=C3,0 +COC2=CC1=C(C=CN=C1C=C2)C(O)C3CC4CCN3CC4C=C,0 +ClCC1=CC(=CC=C1)CCl,0 +CCN=C=S,0 +NC1CCC(N)CC1,0 +OC1=C(C=CC=C1)C2=C(C=CC=C2)O,0 +FCC(F)(F)F,0 +FC(F)(F)C1=CC=CC=C1,0 +OC2=C(C1=CC=C(C=C1C=C2)S(O)(=O)=O)N=NC3=CC=C(C=C3)S(O)(=O)=O,0 +CC(CCC=C(C)C)CC=O,0 +ClCCN(CCCl)CCCl,0 +ClCC1=CC=C(C=C1)Br,0 +CCCCCCCCC1CO1,0 +O=C1CCCO1,0 +ClC1=C(C3=C(C(=C1Cl)Cl)OC2=C(C(=C(C(=C2Cl)Cl)Cl)Cl)O3)Cl,0 +CCOC(=O)C(C)=O,0 +CCCCCCCCC,0 +O=C1C=CC(=O)N1C2=CC=C(C=C2)CC3=CC=C(C=C3)N4C(=O)C=CC4=O,0 +FC1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,0 +CCC1=CC=C(C=C1)C,0 +C2CC1OC1CCC3OC23,0 +CC1=CC(=CC=C1)Br,0 +CCSC(=O)N1CCCCCC1,0 +CN(C)CC1=CC=CC=C1,0 +CC1=CC(=CC=C1)C,0 +O(P(OC1=CC=CC=C1)OC2=CC=CC=C2)C3=CC=CC=C3,0 +ClC=CCl,0 +CSSC,0 +N#CC=CC#N,0 +CN3C(=O)C24CC1=CC=CC(O)C1N2C(=O)C3(CO)SS4,0 +OC(=O)C=CC=CC(O)=O,0 +C=CC(=O)N1CCN(CC1)C2=CC=CC=C2,0 +COC1=CC=C(C=C1)C=O,0 +ClC1=CC=C(C=C1)CSC2=CC=C(C=C2)Cl,0 +ClC1C(Cl)C(Cl)C(Cl)C(Cl)C1Cl,0 +CC1=C(SCCO1)C(=O)NC2=CC=CC=C2,0 +CCOC(=O)C(SP(=S)(OC)OC)C1=CC=CC=C1,0 +CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C,0 +CN3C(C(=O)NC1=NC=CC=C1)C(=O)C2=C(C=CS2)S3(=O)=O,0 +CCOP(=S)(OCC)SCSCC,0 +CCCCOCCOCCO,0 +COC1=CC=C(C=C1)CO,0 +OC3=C2C(=C1C(=CC=CC1=CC2=CC=C3)O)O,0 +CC1=C(C(=C(C(=C1C)[N+]([O-])=O)C(C)(C)C)[N+]([O-])=O)C,0 +CCCCCC(=O)OCC,0 +C[N]1C=CC=C1,0 +OC(C#N)C1=CC=CC=C1,0 +CC(O)C2C1SC(=C(N1C2=O)C(O)=O)C3CCCO3,0 +CCC(C)(C)C1=CC=C(C=C1)O,0 +OCC(O)C(O)C(O)C(O)CO,0 +ClC1=CC=C(C=C1)C=O,0 +FC1=C(C(=C(C(=C1F)F)Cl)F)F,0 +[O-][N+](=O)C1=CC=C(C=C1)C2OC2C(=O)C3=CC=CC=C3,0 +O=C(NC1=CC=CC=C1)NC2=CC=CC=C2,0 +CC(C)(C)C2=CC(=CC=C1C=C(C(=O)C(=C1)C(C)(C)C)C(C)(C)C)C=C(C2=O)C(C)(C)C,0 +CCC1(CC(O)=O)OCCC2=C1[NH]C3=C(C=CC=C23)C(C)O,0 +O[N+]([O-])=C=CC1=CC=CO1,0 +CC(C)C1CC=C(C)C2CC=C(C)CC12,0 +[O-][N+](=O)C1=C(C=CC=C1)CBr,0 +CC1(C)C2CCC(=C)C1C2,0 +N#CC1=CC=CC=C1,0 +OS(=O)(=O)C1=C(C=CC=C1)[N+]([O-])=O,0 +CCCCC(CC)COC(=O)CCCCC(=O)OCC(CC)CCCC,0 +CC(=O)NC1=CC=C(C=C1)CC(O)=O,0 +CC4SC5=C(C(O)=O)C(=O)C1=C(C=C(C(=C1)F)N2CCN(CC2)CC3=C(C)OC(=O)O3)N45,0 +CCCCCCCCOC1=CC=C(C=C1)C(O)=O,0 +CN(C)C1=CC=C(C=C1)C(C2=CC=CC=C2)C3=CC=C(C=C3)N(C)C,0 +N#CC(C#N)=C(C#N)C#N,0 +CC1=CN=CC=C1,0 +[O-][N+](=O)C2=C1C=CC=CC1=C(C3=CC=CC=C23)[N+]([O-])=O,0 +CCOCCO,0 +CN(C(C)=O)C1=CC=C(C=C1)N=NC2=CC=C(C=C2)N(C)C(C)=O,0 +CC(C)CCCCCCCOC(=O)C(C)=C,0 +CCC(C(C)O)=[N+](O)[O-],0 +CCC34CCC1C(CCC2=CC(=O)CCC12)C3CCC4(O)C#C,0 +OCC2=C1C=CC=CC1=NC=C2,0 +OC2=CC1=CC=CN=C1C=C2,0 +NC1=C(C=CC=C1)C(=O)OCC=C,0 +NC1=NC=CC=C1,0 +CCCC=O,0 +CC(=O)CC(C)(C)NC(=O)C=C,0 +CCOP(=S)(OCC)SCCl,0 +ClC1=C(C(=CC=C1)C=O)Cl,0 +CCCCCCCCCCCCCCCCCCCC,0 +CC(=O)OCC=C(C)C=CC=C(C)C=CC1=C(C)CCCC1(C)C,0 +CC(C)COC(=O)CCCCC(=O)OCC(C)C,0 +OC(=O)C1=CC=C(C=C1)Cl,0 +CC(C)(N)C1CCC(C)(N)CC1,0 +CCCCCCCCCCCC(=O)OOC(=O)CCCCCCCCCCC,0 +CC1=C(C=C(C(=C1)C)S(O)(=O)=O)N=NC3=C(C2=CC=CC=C2C(=C3)S(O)(=O)=O)O,0 +COC2=CC=C1[NH]C=C(CCNC(C)=O)C1=C2,0 +CC(C)NC1=NC(=NC(=N1)Cl)NC(C)C,0 +CC(C)COC(=O)CC1=CC=CC=C1,0 +CC(=C)C(=O)OC(C)(C)C,0 +COC(C)(C)CC(C)=O,0 +CC1=C(C=C(C(=N1)O)C#N)C2=CC=NC=C2,0 +CCOP(=O)(OCC)OC(=CBr)C1=C(C=C(C=C1)Cl)Cl,0 +COC1=CC=C(C=C1)CN(C)N=O,0 +CCOP(=S)(OCC)SCSC(C)(C)C,0 +FC1=C(C=CC=C1)C2=CC=CC=C2,0 +ClC2=CC1=CC=CC=C1C=C2,0 +OC(=O)C1CSCN1,0 +OC1=NSC2=CC=CC=C12,0 +NC1=C(C(=CC=C1)[N+]([O-])=O)CO,0 +N#CC1=CC(=CC=C1)C#N,0 +CCOC(=O)CNC(=O)CCCCSC2=C1N=C[NH]C1=NC=N2,0 +CCOCCOC(=O)C=CC1=CC=C(C=C1)OC,0 +CCCCCCCCCC=C,0 +CC(=O)CC(C)(C)O,0 +CCNC1=NC(=NC(=N1)N)Cl,0 +CC(C)=CCCC(C)=CCO,0 +CCCCC(CC)COC(=O)CCCCCCCCC(=O)OCC(CC)CCCC,0 +CC1=CC=C(C=C1)CO,0 +CCC(C)(C)OC,0 +ClC1=C(C=CC=C1)Cl,0 +CCOC1=C(C=CC=C1)N,0 +OCC1=CC4=C3C(=C1)C2=CC=CC=C2C3=CC=C4,0 +OCC1OC(CC1O)N2C=C(C=CBr)C(=O)NC2=O,0 +CC(=O)OC1=CC2=C(C=C1)C(=CC(=O)O2)CBr,0 +CCN(C(=O)N(CC)C1=CC=CC=C1)C2=CC=CC=C2,0 +CC(=O)NC1=CC=CC=C1,0 +CC1=CC(=CC=C1)OP(=O)(OC2=CC(=CC=C2)C)OC3=CC(=CC=C3)C,0 +CCNC(=O)NC1=CC(=C(C=C1)OCC(O)CNC(C)(C)C)C(C)=O,0 +OCC(COC(=O)C=C)(COC(=O)C=C)COC(=O)C=C,0 +ClC1=CC(=C(C(=C1)Cl)Cl)Cl,0 +CC(CCC(O)=O)C1CCC2C4C(CCC12C)C3(C)CCC(O)CC3CC4=O,0 +CCCCCCOC(=O)C(C)=C,0 +ClC1=CC=C(C=C1)N2C(=O)CCC2=O,0 +NC1=C(C=CC=C1O)C(O)=O,0 +CCCCOP(=O)(OCCCC)OCCCC,0 +C[N+]1=CC=C(C=C1)C2=CC=CC=C2,0 +CC(OC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 +[O-][N+](=O)C1=CC=C(C=C1)COC2=CC=CC=C2,0 +COC1=CC(=O)C=CC1=O,0 +CN(C)CCCN,0 +ON=CC1=CC=NC=C1,0 +OC(=O)CC1=CC(=CC=C1)[N+]([O-])=O,0 +CC1(C)C2CCC1(C)C(C)(O)C2,0 +C1=CC=C(C=C1)N(C2=CC=CC=C2)C3=CC=CC=C3,0 +CC(Br)(CCl)CBr,0 +COC1=CC(=C(C=C1)O)C(C)(C)C,0 +CCCCCNCCCCC,0 +OC1C(=O)C(=O)C1=O,0 +OCC1=CC=C(C=C1)C(F)(F)F,0 +OC2=C(C1=CC=CC=C1C=C2)N=NC4=C(C3=CC=CC=C3C=C4)S(O)(=O)=O,0 +CCOCC(O)=O,0 +CCC3=C2C1=CC=CC=C1C=CC2=CC4=CC=CC=C34,0 +CC(C)=C,0 +OC1=C(C=CC=C1[N+]([O-])=O)[N+]([O-])=O,0 +COC1=C(C2=C(C(=C1)OC)C(=O)C3(O2)C(C)CC(=O)C=C3OC)Cl,0 +O[N+]([O-])=C,0 +CCCCN(CC)CC,0 +NC(CCC(=O)NC1=CC=C(C=C1)[N+]([O-])=O)C(O)=O,0 +COP(=O)(OC)N1CCOCC1,0 +CC1=C(C=C(C=C1O)[N+]([O-])=O)[N+]([O-])=O,0 +[NH]1C=CC2=CC=CC=C12,0 +CCCCOC(=O)C1=C(C=CC=C1)C(=O)OCC2=CC=CC=C2,0 +FC(F)(F)C1=CC(=CC=C1)Cl,0 +OC2=C1C(C5=C(OC1=CC=C2)C=C4OC3OC=CC3C4=C5O)=O,0 +CC(C)CC(C)N,0 +CC(O)CN1CC(C)OC1=O,0 +CC1=CC(=C(C=C1)N)S(O)(=O)=O,0 +CC1=CC=C(C=C1)NC(=O)CBr,0 +[NH]1C=NC2=CC=CC=C12,0 +CCCCCCC(=O)OCC,0 +C1=CC3=C(N=C1)C2=NC=CC=C2C=C3,0 +CC(=O)NC1=CC=C(C=C1)CC2=CC=C(C=C2)NC(C)=O,0 +CC1=CC(=CC=C1)C#N,0 +NN(C1=CC=CC=C1)C2=CC=CC=C2,0 +CN(C)C1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 +C=CN1CCCC1=O,0 +CC(C)CCCCCCCOP(=O)(OC1=CC=CC=C1)OC2=CC=CC=C2,0 +CC1=CC=C(C=C1)C(C)(C)C,0 +NC(=N)C1=CC=C(C=C1)C3=CC2=CC=C(C=C2[NH]3)C(N)=N,0 +CCCCC(CC)COC(=O)C1=C(C=CC=C1)C(O)=O,0 +CCN(CC)C(=O)NC1=CC(=C(C=C1)OCC(O)CNC(C)(C)C)C(C)=O,0 +CCCCCCCCCCCC=C,0 +S=C(NC1=CC=CC=C1)NC2=CC=CC=C2,0 +CCOC4=C2C1=CC=CC=C1C=CC2=C3CCC(C3=C4)=O,0 +CCCCCCCCCCCCCC=C,0 +OC(=O)C1=C(C=CC=C1)C(O)=O,0 +CC(=O)NC1=CC=C(C=C1)[N+]([O-])=O,0 +CN(C)[P+](O[N]1N=NC2=CC=CC=C12)(N(C)C)N(C)C,0 +CC(=C)C#N,0 +CCSCCC(N)C(O)=O,0 +CN(C)NC(=O)CCC(O)=O,0 +CSC(C)(C)C=NO,0 +CNC(=O)C1=CC(=CC=C1)NCC(=O)NCCC2=CC(=C(C=C2)OC)OC,0 +OC(=O)C1=CC=CO1,0 +ClC1=C(Cl)C(=O)C(=C(C#N)C1=O)C#N,0 +CC1=C(C=CC=C1)C#N,0 +CN(C)C(=S)N(C)C,0 +ClC1=CC(=O)C=CC1=O,0 +CCCCCCCCCC1=CC=C(C=C1)O,0 +CC([N]1C=CN=C1)=C(OCCOC2=CC=C(C=C2)Cl)C3=C(C=C(C=C3)Cl)Cl,0 +CC1=NC(=C(N=C1)C)C,0 +ONC1=CC=C(C=C1)Cl,0 +CC(CNC(=O)C1=CN=CC=C1)NC(=O)C2=CN=CC=C2,0 +CCOC(=O)CCl,0 +OC1=C(C=CC(=C1)Cl)Cl,0 +CC(C=CC(O)C1CC1)C2CCC3C(CCCC23C)=CC=C4CC(O)CC(O)C4=C,0 +CC1=C(N=CC=N1)C,0 +CCOC(=O)C1C(C=C(C)C)C1(C)C,0 +OC3N=C(C1=CC=CC=C1)C2=C(C=CC(=C2)Cl)NC3=O,0 +NCCS(O)(=O)=O,0 +CN1CCN(CC1)C3=CC=C2[NH]C(=NC2=C3)C5=CC=C4[NH]C(=NC4=C5)C6=CC=C(C=C6)O,0 +CC(CO)=[N+](O)[O-],0 +CC(C)NCC(O)COC3=C2C1=CC=CC=C1[NH]C2=CC=C3,0 +OCCOC(=O)C=C,0 +CC(C)(C)N(CCO)CCO,0 +C1CN=C(N1)C2=CC=C(C=C2)C4=CC3=CC=C(C=C3[NH]4)C5=NCCN5,0 +CCCCO,0 +CC1=C(C(=CC=C1)C)NC(=O)CN2CCCC2=O,0 +CCCCCOC1=CC(=CC=C1)NC(=O)OC2CCCCC2N3CCCC3,0 +CC(=O)NC1=CC(=CC=C1)C,0 +OC1=N[NH]C2=CC=CC=C12,0 +CCN(CC)C1=CC2=C(C=C1)C(=CC(O2)=O)C(F)(F)F,0 +CSCCC(NC=O)C(=O)NC(CC1=CC=CC=C1)C(O)=O,0 +CN(C)C1=CC=C(C=C1)C4CC2(C)C(CCC2(O)CCCO)C5CC=C3CC(=O)CCC3=C45,0 +[O-][N+](=O)C1=CC=C(C=C1)NC2=CC=C(C=C2)N=C=S,0 +CC1=CC(=C(C(=C1)CC2=C(C(=CC(=C2)C)C(C)(C)C)O)O)C(C)(C)C,0 +CC1SCC(NC1=O)C(=O)NC(CC2=C[NH]C=N2)C(=O)N3CCCC3C(N)=O,0 +CC(=O)NC1=CC=C(C=C1)OC2=CC=C(C=C2)NC(C)=O,0 +CON(C)C(=O)NC1=CC=C(C=C1)Br,0 +CC(=O)OC1=C(C=CC=C1)C(=O)OC2=C(C=CC=C2)C(O)=O,0 +CC1=CC(=C(C=C1)OP(=O)(OC2=C(C=C(C=C2)C)C)OC3=C(C=C(C=C3)C)C)C,0 +NC(=O)CN1CC(O)CC1=O,0 +CC(N)=S,0 +CCC1=NC=CN=C1,0 +CC(C)(S)C(=O)NC(CS)C(O)=O,0 +NN(CC1=CC=CC=C1)CC2=CC=CC=C2,0 +OC(=O)C(=O)NC1=CC(=CC=C1)C2=N[NH]N=N2,0 +OCCN1C(=O)N(CCO)C(=O)N(CCO)C1=O,0 +CC(=C)C1CCC(=CC1)C,0 +[O-][N+](=O)C1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0 +ClC1=CC(=CC=C1)C=O,0 +NC1=CC(=CC=C1)S(O)(=O)=O,0 +C1=CC=C(C=C1)C=CC2=CC=CC=C2,0 +O=C1OC(=O)C2=C1C=CC=C2,0 +COC(=O)C1=C(C=CC=C1)N,0 +OC(=O)C1CSCN1C(=O)C2CCC(=O)N2,0 +CNC(=O)N(C)C2=NC1=CC=CC=C1S2,0 +CCCCOC(=O)C1=C(C=CC=C1)C(=O)OC2CCCCC2,0 +COCCO,0 +CCCCCCCCCCCCC1CO1,0 +CNC(=O)NC,0 +COC1=CC=C(C=C1)NC2=CC=C(C=C2)OC,0 +[O-][N+](=O)C3=C2C=CC1=CC=CC=C1C2=CC4=CC=CC=C34,0 +CCCCOCC(O)=O,0 +NC1=C(C=CC=C1)Cl,0 +CN1CCNCC1,0 +COC(=O)CC(C)=O,0 +FC(F)(F)C(Cl)Br,0 +CCC(C)(C)C,0 +O=C(C=CC1=CC=CC=C1)C2=CC=C(C=C2)C3=CC=CC=C3,0 +CC(C)OC(C)=O,0 +CC3(C)C(C(=O)OC(C#N)C1=CC(=CC=C1)OC2=CC=CC=C2)C3(C)C,0 +CC(=O)C1=C2C(=CC(=C1)C(C)(C)C)C(CC2)(C)C,0 +NC2=C(C1=C(C=C(C=C1C=C2)S(O)(=O)=O)O)N=NC3=C(C=C(C=C3)[N+]([O-])=O)S(O)(=O)=O,0 +C1=NC=CN=C1,0 +[O-][N+](=O)C1=CC(=CC=C1)C(F)(F)F,0 +COC5=C1OC2C(C=CC3C4CC(=C1C23CCN4C)C=C5)O,0 +CC1=CC=CS1,0 +CC2CCC1C(OC(=O)C1=C)C3(C)C(=O)CC=C23,0 +OC1=C(C=CC=C1)[N+]([O-])=O,0 +NC1=CC(=C(C(=C1)Cl)Cl)Cl,0 +N(C1=CC=CC=C1)C3=C2C=CC=CC2=CC=C3,0 +OC1=C(C=C(C=C1)C2=CC=CC=C2)[N+]([O-])=O,0 +NC(=O)NNC(N)=O,0 +[O-][N+](=O)C1=C(C=CC(=C1)C(F)(F)F)Cl,0 +CCN(CC)C1=CC=C(C=C1)N=NC2=CC=CC=C2,0 +ON=C,0 +OC2=C1C=CC=CC1=NC=C2,0 +NCCN1CCNCC1,0 +O=C2C1=C(C=CC=C1)C3=C2C=CC=C3,0 +CC(C)(COC(=O)C=C)COC(=O)C=C,0 +CC(C)(Br)C(=O)NC1=CC=CC=C1,0 +CC(C)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C(O)=O,0 +CC(C)C1CCC(C)CC1OC(=O)C2=C(C=CC=C2)N,0 +OC1=C(C=C(C=C1Br)Br)C(=O)NC2=CC=C(C=C2)Br,0 +C1=CC=C(C=C1)P(C2=CC=CC=C2)C3=CC=CC=C3,0 +COC(=O)NC2=NC1=CC(=CC=C1[NH]2)SC3=CC=CC=C3,0 +O=NN(C1=CC=CC=C1)C2=CC=CC=C2,0 +O=C2NC1=C(CCC1)C(=O)N2C3CCCCC3,0 +NC1=C(C=CC=C1)C(=O)OCC=CC2=CC=CC=C2,0 +C1CSCCO1,0 +O=C(C=CC1=CC=CC=C1)C2=CC=CC=C2,0 +CC1=CC2=C(C(=C1)O)C(=O)C=C(C2=O)C3=C(C4=C(C=C3C)C(=O)C=CC4=O)O,0 +CC1=NN(C(=O)C1)C2=CC=CC=C2,0 +NC1=CC(=CC=C1)C(F)(F)F,0 +NC(=O)C1=CC=[N+](C=C1)COC[N+]2=C(C=CC=C2)C=NO,0 +NCC=C,0 +COP(=S)(OC)OC1=C(C=C(C(=N1)Cl)Cl)Cl,0 +CC1OCCC2=C1C=C3C(=C2)C(C(C3(C)C)C)(C)C,0 +NC1=CC(=C(C=C1)N)S(O)(=O)=O,0 +CCC1=C(C=CC=C1)O,0 +CCCCCC(=O)OCC=C,0 +CC1=C(C=C(C=C1)N=[N+]([O-])C2=CC(=C(C=C2)C)[N+]([O-])=O)[N+]([O-])=O,0 +NN2C(=O)C1=C(C=CC=C1)C2=O,0 +CC(=O)C1=NC=CC=C1,0 +COC4=C1C(C5=C(OC1=C3C2CCOC2OC3=C4)C=CC=C5O)=O,0 +CCOCN(C(=O)CCl)C1=C(C=CC=C1C)CC,0 +CC(N)=O,0 +OC(=O)COC1=CC=C(C=C1)Cl,0 +NC1=CC(=C(C=C1)Cl)Cl,0 +ClC1=CN=CC=C1,0 +O=C1CNC(=O)N1,0 +CCCC(O)C(CC)CO,0 +CC(=O)C1=C(C=CC(=C1)N)OCC(O)CNC(C)(C)C,0 +OC1(CCCCC1)C#N,0 +O=C(C1=CC=CC=C1)C(=O)C2=CC=CC=C2,0 +C=CC(=O)OCCOCCOCCOCCOC(=O)C=C,0 +CC(C)C=O,0 +[O-][N+](=O)C1=C(C=CC=C1)C2=CC=CC=C2,0 +CS(=O)C1=CC=C(C=C1)Cl,0 +OCC1OC(CC1O)N2CC(=O)C(=N)NC2=O,0 +OC(=O)C(Cl)(Cl)Cl,0 +CCC1=C(C=CC=C1)[N+]([O-])=O,0 +NC(=N)NC(N)=NCCC1=CC=CC=C1,0 +CC1=CC(C)(C)NC2=C1C=CC=C2,0 +COP(=S)(OC)SCC(=O)NCC=O,0 +CC(C)OC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 +CC(C)[N]2C1=CC=CC=C1C(=C2C=CC(O)CC(O)CC(O)=O)C3=CC=C(C=C3)F,0 +CCOC(C)(C)C,0 +CCCCCCCCCCCCC=C,0 +CCCCCCCCCC,0 +C1COCCOCCOCCOCCO1,0 +CC2=NC1=C(C=CC=C1)C2(C)C,0 +CCCCCCCCCC(O)=O,0 +CCC=O,0 +CCCCCCCCCC=CCC1CC(=O)OC1=O,0 +COC3=C(C=C2C1C(C5=C(OC1COC2=C3)C4=C(OC(C4)C(C)=C)C=C5)=O)OC,0 +COC1=CC(=O)C(=O)C(=C1)C(C)(C)C,0 +CC(=O)OCC(=O)NCCCOC1=CC(=CC=C1)CN2CCCCC2,0 +CC1=C(C=CC=C1)Br,0 +C[N+]1([O-])CCCC1C2=CN=CC=C2,0 +CC(C)NC(=O)NS(=O)(=O)C1=C(C=CN=C1)NC2=CC(=CC=C2)C,0 +CCNC3=C(C=C2C(=C1C=C(C(C=C1OC2=C3)=NCC)C)C4=C(C=CC=C4)C(=O)OCC)C,0 +O=C4C2=CC=C1N=C(SC1=C2C(=O)C5=CC=C3N=C(SC3=C45)C6=CC=CC=C6)C7=CC=CC=C7,0 +CC5=C2C1=CC=CC=C1C=CC2=C4C3OC3C(C(C4=C5)O)O,0 +CC(C)CC1NC(=O)CNC1=O,0 +OC2=CC1=CC=CC=C1N=C2,0 +CCOC(=O)C(CCC1=CC=CC=C1)NC(C)C(=O)N(CC(O)=O)C3CC2=C(C=CC=C2)C3,0 +CCCCN(CCO)CCCC,0 +ClNC1=NC(=NC(=N1)NCl)NCl,0 +CC1CN(CCN1)C3=C(C(=C2C(C(=CN(C2=C3)C4CC4)C(O)=O)=O)C)F,0 +OCC(O)CO,0 +CNC(=O)C1=CC=CC=C1,0 +CCC1=C(C=CC=C1)N,0 +OC(=O)C1=CC2=C(C=C1)C(=O)OC2=O,0 +CC(C)CC(C)NC1=CC=C(C=C1)NC2=CC=CC=C2,0 +O=C3OC2=C(C=C1C=COC1=C2)C=C3,0 +NC1=C(C=CC(=C1)Cl)Cl,0 +CCCCOC(=O)C=CC(=O)OCCCC,0 +CNNC,0 +O=C1C=CC(=O)C(=C1)C2=CC=CC=C2,0 +CC(N)CN,0 +CCOC2=C1N=CC=CC1=CC=C2,0 +CC1=C(C=CC=C1)C3=NC2=CC=CC=C2O3,0 +NC(N)=S,0 +BrCC1=CC=C(C=C1)CBr,0 +OC(=O)C(=O)C(O)=O,0 +OC(=O)C1=CC3=C(C(=C1)O)C(=O)C2=C(C=C(C=C2O)O)C3=O,0 +ClCC1=CC=NC=C1,0 +CC(N(C)C)C1=CC=CC=C1,0 +CC2COC1=C(C(=CC3=C1N2C=C(C(O)=O)C3=O)F)C4(N)CC4,0 +[O-][N+](=O)C1=CC=C(C=C1)NC2=CC=CC=C2,0 +O=C(OOC(=O)C1=CC=CC=C1)C2=CC=CC=C2,0 +CCC2=C1[NH]C3=C(C1=CC=C2)CCOC3(C)CC,0 +COC2=CC1=CC=C(C=C1C=C2)C(C)C(O)=O,0 +CN1C(CCC1=O)C2=CN=CC=C2,0 +CCCCCC=CC=CC=O,0 +COC1=C(C=CC(=C1)C3OC2=C(C(=CC(=C2)O)O)C(=O)C3=O)O,0 +COC(C)(C)C,0 +O=C2CCC1=C(C=CC=C1)O2,0 +CC=CC=CC(O)=O,0 +CCN(CC)S(=O)(=O)C1=CC=C(C=C1)N,0 +OCNC(=O)C=C,0 +CC(C)=CCCC(C)=CC=O,0 +CC2=NC1=CC=CC=C1N=C2,0 +CC(O)CCC(=O)C1=COC=C1,0 +CN(C)C(C)=O,0 +CN1CCOCC1,0 +CC(=C)OC(C)=O,0 +CCOC(=O)CC(C)=O,0 +OS(=O)(=O)C1=CC(=CC=C1)[N+]([O-])=O,0 +CSC(C)(C)C(=O)NC(CS)C(O)=O,0 +ClC1=NC(=NC(=N1)Cl)NC2=C(C=CC=C2)Cl,0 +CC1COC3=C2N1C=C(C(C2=CC(=C3N4CCN(C)CC4)F)=O)C(O)=O,0 +COC(=O)C(=CC1=CC=CO1)C#N,0 +CC(=C)C=C,0 +C1=CC=CC=C1,0 +CCCCC(CC)COCCCN,0 +[O-][N+](=O)C1=CC(=CC=C1)CBr,0 +CN(C)C=NC1=C(C=C(C=C1)Cl)C,0 +COC(=O)C1=C(C)NC(=C(C1C2=C(C=CC=C2)[N+]([O-])=O)C(=O)OCC(C)=O)C,0 +NCC1CCC(CC1)C(=O)C2=CC=C(C=C2)CCC(O)=O,0 +CCOC(=O)C1OC1C(=O)NC(CC(C)C)C(=O)NCCC(C)C,0 +CC1=CC(=O)OC2=C1C(=CC(=C2)O)O,0 +CN(C)C1=CC=C(C=C1)N=NC2=C(C=CC=C2)C,0 +CC(=O)NC1=CC=C(C=C1)OC(=O)C2=C(C=CC=C2)OC(C)=O,0 +C1CCC2(CC1)CO2,0 +NC(=S)NCC=C,0 +CC(CCC(O)=O)C3CCC4C2CCC1CC(O)CCC1(C)C2CC(O)C34C,0 +CC(=O)NC1=CC=C(C=C1)S(=O)(=O)NC2=NC=CC=C2,0 +CCCCCC(C)(O)C=CC1C(O)CC(=O)C1CC=CCCCC(O)=O,0 +CC(=C)C1=CC=CC=C1,0 +O=CC=CC1=CC=CO1,0 +CCCCCCCCCCCCCCCCCC(O)=O,0 +CCCCCCCCCCCCCCCCN,0 +CCNC1=NC(=NC(=N1)Cl)NCC,0 +COP(=S)(OC)OC,0 +ClC1=C(C(=C(C(=C1)Cl)Cl)Cl)Cl,0 +CCCC=[N+](O)[O-],0 +CNC1=CC=CC=C1,0 +OC(=O)C=C,0 +CCCCCCCCCCCCCCCCCCN,0 +COC1=CC2=C(C=C1)C(=CC(=O)O2)CBr,0 +CCC#N,0 +CC=C1CC2CC1C=C2,0 +CC(C)C(C)C,0 +COCC(O)=O,0 +CNC(=O)NC1=CC=CC=C1,0 +O2C1=C(C=CC=C1)SC3=C2C=CC=C3,0 +C=CC(=O)OCCOC(=O)C=C,0 +CC1=CC=C(C=C1)S(=O)(=O)NC2CCCCC2,0 +CCC(C)NC1=CC=C(C=C1)NC(C)CC,0 +CC(C)OC(=O)C(C)(C)OC1=CC=C(C=C1)C(=O)C2=CC=C(C=C2)Cl,0 +OC1=CC(=C(C=C1)Cl)Cl,0 +CCNC2=C(C=C1C(=CC(OC1=C2)=O)C)C,0 +CCOP(=O)(OCC)OC(=CCl)C1=C(C=C(C=C1)Cl)Cl,0 +OC1=NC(=NC(=N1)Cl)Cl,0 +COC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 +COC1=C(C=C(C(=C1)S(O)(=O)=O)C)N=NC3=C2C=CC(=CC2=CC=C3O)S(O)(=O)=O,0 +CC(=O)CC(=O)NC1=CC=C(C=C1)C,0 +CCCCNCC,0 +NS(=O)(=O)C1=C(C=C(C(=C1)C(O)=O)NCC2=CC=CO2)Cl,0 +CC(C)NCC(O)COC1=CC=C(C=C1)NC(C)=O,0 +CC(F)(F)F,0 +CCCCCCCCC=O,0 +C1=CC=C(C=C1)C2=CC=CC=C2,0 +FC(F)(F)C1=C(C=CC=C1)Cl,0 +CC(C)CC(=O)CC(C)C,0 +CCCCCC(C=O)=CC1=CC=CC=C1,0 +CN(C)CC(O)=O,0 +CCOC(=O)CC(=O)CCl,0 +OC(=O)COC1=CC=CC=C1,0 +BrC1=CC(=CC=C1)C2=CC=CC=C2,0 +CC1=C(C=CC=C1)C,0 +CCC1=C4C(=C(C2=CC=CC=C12)C)C3=CC=CC=C3C=C4,0 +CC(C)CCCCCCOC(=O)CCCCC(=O)OCCCCCCC(C)C,0 +OC1=C(C=CC=C1)O,0 +NC1=C(C=CC=C1)C(=O)OC2CCCCC2,0 +C1CCNC1,0 +CCCCN(CCCC)CCCC,0 +CC(C)C2=C(C)N(C)N(C1=CC=CC=C1)C2=O,0 +C(SCC1=CC=CC=C1)C2=CC=CC=C2,0 +COC(=O)C1=CC=CO1,0 +OC1=C(C=C(C=C1I)C#N)[N+]([O-])=O,0 +COC1=C(C=C(C=C1)C=O)OC,0 +O=C2C(=O)C1=C(C=CC=C1)C3=C2C=CC=C3,0 +CCO,0 +CC(=O)N=C1C=CC(=O)C=C1,0 +CC(C)(C)OOC(C)(C)C1=CC(=CC=C1)C(C)(C)OOC(C)(C)C,0 +CSC1=CC=C(C=C1)Cl,0 +O=C2C1=C(C=CC=C1)C6=C4C2=CC=C5C3=CC=CC=C3C(C(=C45)C=C6)=O,0 +OC1=CC=C(C=C1)C2(OC(=O)C3=C2C=CC=C3)C4=CC=C(C=C4)O,0 +ClCC1=CC=C(C=C1)CCl,0 +S=C1SSC2=NCCN12,0 +CC(O)C(C)O,0 +NCCO,0 +CCNC1=NC(=NC(=N1)Cl)NC(C)C,0 +OC(=O)CCC(=O)NC1=CC=C(C=C1)Cl,0 +OCC1NC(CC2=C1[NH]C3=CC=CC=C23)C(O)=O,0 +COC(=O)C=C,0 +CC(C)NC1=CC=C(C=C1)NC2=CC=CC=C2,0 +CCCC(=O)OCCC(C)C,0 +COC(=O)C1=C(C)NC(=C(C1C2=CC(=CC=C2)[N+]([O-])=O)C(=O)OCC=CC3=CC=CC=C3)C,0 +CCN=[N+]([O-])CC,0 +CNC(=O)OC2=C1OC(CC1=CC=C2)(C)C,0 +CN(C)C1=CC=NC=C1,0 +CCCCCCCCCCCC(=O)NCCO,0 +CC(=C)C(O)=O,0 +CC1=CC(=CC(=C1)C)N=NC3=C2C=CC=CC2=CC=C3O,0 +CCCCCCCC1CCC(=O)O1,0 +NC1=CC(=C(C=C1)O)C(O)=O,0 +CCOP(=O)(C#N)N(C)C,0 +CC(C)(C)C1=C(C(=CC(=C1)C=CC2=CC(=C(C(=C2)C(C)(C)C)O)C(C)(C)C)C(C)(C)C)O,0 +NC1=C(C=C(C=C1Cl)Cl)Cl,0 +OC(=O)CS,0 +CC(C)COC(=O)C=C,0 +CC1(C)CC(N)CC(C)(CN)C1,0 +CC1=C(C=C(C=C1)NO)[N+]([O-])=O,0 +ClC(Cl)=C(Cl)C1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl,0 +CNC(=O)OC1=CC=CC=C1,0 +NC1=CC=C(C=C1)C=CC(O)=O,0 +OC2(O)C(=O)C1=C(C=CC=C1)C2=O,0 +CC1=N[N](C(=C1)C)C2=C4C(=C(N=N2)NN)C3=CC=CC=C3[NH]4,0 +NC1=NC(=NC(=N1)N)N,0 +CC1=C(C(=C(C=C1)C)C)C,0 +CC1=C(C(=C(C(=C1C)N)C)C)N,0 +CC(C)COC(=O)C1=C(C=CC=C1)N,0 +CCOC1=C(C=CC=C1)OCC2CNCCO2,0 +CC1=CC=C(C=C1)NC(N)=O,0 +OC(=O)CCl,0 +OC(=O)C1CSC(N1C(=O)CCS)C2=C(C=CC=C2)O,0 +CC2=NC1=CC=CC=C1S2,0 +[O-][N+](=O)C1=CC=C(C=C1)S(=O)(=O)NC2=NC=CC=C2,0 +CC1(C)CCCC(C)(C)N1O,0 +CCCCCCCCCCC=CC1CC(=O)OC1=O,0 +CCOP(=O)(OCC)OC1=C(C=C(C(=N1)Cl)Cl)Cl,0 +CC(O)C(O)=O,0 +NCCCCC(NC(CCC1=CC=CC=C1)C(O)=O)C(=O)N2CCCC2C(O)=O,0 +NC1=CC(=C(C=C1)C=CC2=C(C=C(C=C2)N)S(O)(=O)=O)S(O)(=O)=O,0 +C1CN(CCO1)SC3=NC2=CC=CC=C2S3,0 +CCCCOCCOC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 +CCOC(=O)C(CCC1=CC=CC=C1)NC(C)C(=O)N3C2CCCCC2CC3C(O)=O,0 +OC1=C(C=CC=C1)C=O,0 +ClC1=CN=C(C=C1)Cl,0 +CCC(=O)NC1=CC(=C(C=C1)Cl)Cl,0 +N#CCCNCCC#N,0 +COC(=O)C(C)(C)OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl,0 +CCCNCCC,0 +CCCCCCC(CC=CCCCCCCCC(=O)OC)OC(C)=O,0 +[O-][N+](=O)C1=C(C(=CC(=C1)C(F)(F)F)[N+]([O-])=O)Cl,0 +CCOC(=O)CC(SP(=O)(OC)SC)C(=O)OCC,0 +OCC3OC1C(OC2=NC(=N)C=CN12)C3O,0 +OC(C(COC(=O)CCC(O)=O)NC(=O)C(Cl)Cl)C1=CC=C(C=C1)[N+]([O-])=O,0 +CC(C)(C)C(=O)C2C(=O)C1=C(C=CC=C1)C2=O,0 +CC(=O)NS(=O)(=O)C1=CC=C(C=C1)N,0 +CC(=C)C(=O)OCCOC(=O)NNC(=O)OCCOC(=O)C(C)=C,0 +FC1=CC=C(C=C1)C(=O)CCCN2CCN(CC2)C3=NC=CC=C3,0 +CNCCS(O)(=O)=O,0 +[O-][N+](=O)C1=C(C=CC=C1)C#N,0 +CC=C(C)C#N,0 +OC(=O)C1=C(C=CC(=C1)N=NC2=CC=C(C=C2)S(=O)(=O)NC3=NC=CC=C3)O,0 +CCCCCCCCC1OC1CCCCCCCC(=O)OCC(CC)CCCC,0 +O=C(C1=CC=CC=C1)C2=CC=CC=C2,0 +BrCCCBr,0 +CC(=O)OC(C)(C)C3CC2=C(C=C1OC(C(=CC1=C2)C(C)(C)C=C)=O)O3,0 +OC1=C5C(=CC=C1)C4=CC3=C2C=CC=CC2=CC=C3N=C4C=C5,0 +CN3CCC14C5OC2=C1C(=CC=C2O)CC3C4C=CC5O,0 +NC1=C(C=CC=C1)C(F)(F)F,0 +CN(C)CCN(CC1=CC=C(S1)Cl)C2=NC=CC=C2,0 +C2COCCOC1=C(C=CC=C1)OCCOCCO2,0 +CC1CS1,0 +CC(CCC(O)=O)C3CCC4C2CCC1CC(O)CCC1(C)C2CC(=O)C34C,0 +OC1=C(C=C(C(=C1)Cl)O)Cl,0 +OCC(CO)NC1CC(O)(CO)C(O)C(O)C1O,0 +CC(=O)NC1=CC=C(C=C1)S(N)(=O)=O,0 +CCCCCCCCC1=CC=C(C=C1)NC2=CC=C(C=C2)CCCCCCCC,0 +CCOC(=O)C(=C)C#N,0 +CC1=CC(=O)C=CC1=O,0 +CC34CCC1C(CCC2=C1C=CC(=C2)O)C35CCC4(O)C(O)C5,0 +OC3C(O)C1=C(C=CC2=CC=CC=C12)C4=C3C=CC=C4,0 +CC(=C)C(=O)OCCCCOC(=O)C(C)=C,0 +OC(=O)C1=CC(=CC=C1)Cl,0 +OC(=O)C(Cl)CCl,0 +CNS(=O)(=O)C1=CC=C(C=C1)N,0 +CC(C)NC(C)C,0 +OC1=C(C(=C(C(=C1)Cl)Cl)Cl)Cl,0 +BrCC#N,0 +OCNC(=O)CCl,0 +CCCCCCCCC=CCCCCCCCC(O)=O,0 +CC1=C(C=C(C(=C1)N)S(O)(=O)=O)Cl,0 +OC1=CC=C(C=C1)[N+]([O-])=O,0 +NC(=O)NCC(O)=O,0 +CN1CCN(C)CC1,0 +CN(C)N=NC1=CC=C(C=C1)C(O)=O,0 +CC(OC1=C(C=C(C=C1)Cl)C)C(O)=O,0 +ClC2=C(N=C1C=CC=CC1=N2)Cl,0 +CN(C)CCN(C)C,0 +OC=O,0 +CCCCCCOC(=O)C=C,0 +COC1=C(OC)C(=O)C(=CC1=O)C,0 +COC(=O)C1=C(C2=C(C(=C1)OC)OCO2)C3=C(C=C(C4=C3OCO4)OC)C(=O)OC,0 +C1CC3=C2C1=CC=CC2=CC=C3,0 +OC(=O)C=CC1=CN=C[NH]1,0 +N(C1=CC=CC=C1)C3=CC2=CC=CC=C2C=C3,0 +CC(C)CC1=CC=C(C=C1)C(C)C(O)=O,0 +COC(=O)NC2=NC1=CC(=CC=C1[NH]2)C(=O)C3=CC=C(C=C3)F,0 +OC(=O)C1=C(C=CC=C1)NC2=CC(=CC=C2)C(F)(F)F,0 +ClC1=CC=C(C=C1)C(=C(Cl)Cl)C2=CC=C(C=C2)Cl,0 +CC(C)N,0 +OCC1CCCO1,0 +CC(O)C(C)=O,0 +CC2C(C)(C)C1=C(C(=O)CCC1)C2(C)C,0 +CC2C(C)(C)C1=C(C=C(C(=C1)C)C(C)=O)C2(C)C,0 +CCCCCC,0 +CCCSSCC=C,0 +C[N]2C(=NC3=NC1=CC=NC=C1C=C23)N,0 +NC1=CC=C(C=C1)S(N)(=O)=O,0 +NC1=C(C(=CC(=C1)Cl)S(O)(=O)=O)O,0 +ClC1=CC=CC=C1,0 +COC(=O)C1=CC=CC=C1,0 +CC4=C2C1=CC=CC=C1C=CC2=C3CCCC3=C4,0 +CCNCC,0 +CCC(C1=CC=C(C=C1)O)=C(CC)C2=CC=C(C=C2)O,0 +CC(=O)NC1=CC=C(C=C1)S(=O)(=O)C2=CC=C(C=C2)NC(C)=O,0 +COC(=O)CCl,0 +CC(=C)C(C)=O,0 +CC(C)OC1=CC=C(C=C1)NC2=CC=CC=C2,0 +CC1=CC(=O)C(=CC1=O)C,0 +O=C3N2CC1=C(C=CC=C1)C(=O)N2CC4=C3C=CC=C4,0 +CCCCCCCCOC(=O)C(C)=C,0 +CC(C)OC(=O)CCl,0 +CC(C)(O)C#N,0 +CC1=C(C=CC(=C1)Cl)OCC(O)=O,0 +CC(C)NCC(O)COC2=C1OCC(CC1=CC=C2)O,0 +[O-][N+](=O)C1=CC=C(C=C1)CNC3=C2[NH]C=NC2=NC=N3,0 +CC(=O)OC(C)=O,0 +CC(C)(C)CBr,0 +OC(=O)COC1=C(C=C(C=C1)Cl)Cl,0 +NC1=C(N=CC(=C1)C2=CC=NC=C2)O,0 +CC1=CC(=C(C(=C1)C(C)(C)C)O)C(C)(C)C,0 +BrCC1=C(C=CC=C1)CBr,0 +CC(C)OP(C)(F)=O,0 +O=C1C(=O)C4=C3C2=C1C=CC=C2C=CC3=CC=C4,0 +CC(C)(C)CC(C)(S)CC(C)(C)C,0 +C=CCOC(=O)C1=C(C=CC=C1)C(=O)OCC=C,0 +OC1=CC2=C(C(=C1)O)C(=O)C=C(O2)C3=CC(=C(C=C3)O)O,0 +OCC1OC(CC1O)[N]2C=NC3=C2N=C[N]4C=CN=C34,0 +CN(C)P(=O)(N(C)C)N(C)C,0 +CC(=O)NC2=CC1=CC=CC=C1N=C2,0 +CC(O)C1=CC=CC=C1,0 +[O-][N+](=O)C1=CC=C(C=C1)C#N,0 +NCCNCCN,0 +CC(CC(O)=O)C(O)=O,0 +CCCCCCCCCCCCOCC1CO1,0 +OCC1=CC=CO1,0 +CCC=CCCC=CC=O,0 +CN1CCC(=CC1)C2=CC=CC=C2,0 +ClCC#N,0 +OC(=O)C(F)(F)C(F)(Cl)C(F)(F)C(F)(Cl)C(F)(F)C(F)(Cl)C(F)(F)Cl,0 +COCCCN,0 +N2C1=C(C=CC=C1)SC3=C2C=CC=C3,0 +CC3(C)SC2C(NC(=O)C(N)C1=CC=CC=C1)C(=O)N2C3C(O)=O,0 +CC(C)(C)[N+]([O-])=O,0 +CC(C)C(O)CCC(C)C1CCC2C(CCCC12C)=CC=C3CC(O)CC(O)C3=C,0 +OC(=O)CC1=C(C=CC=C1)Cl,0 +OC2=CC1=CC=C(C=C1C=C2)SSC4=CC3=CC=C(C=C3C=C4)O,0 +CC(=O)OCC1=CC2=C(C=C1)OCO2,0 +CN(C)C#N,0 +CCCCC(CC)COC(=O)C1=CC=C(C=C1)C(=O)OCC(CC)CCCC,0 +O=C1CCC(=O)O1,0 +COC(=O)C1=CC=C(C=C1)C=O,0 +CC(=O)C=CC1=CC2=C(C=C1)OCO2,0 +COC1=CC(=CC=C1)[N+]([O-])=O,0 +OCC1OC(C(O)C1O)[N]4C=NC5=C(NCC(O)COC3=C2C=CC=CC2=CC=C3)N=CN=C45,0 +C1=CC=C(C=C1)C(C2=CC=CC=C2)C3=CC=CC=C3,0 +CC1=CCC(CC1)C(C)(C)O,0 +COC1=C(C=C(C=C1)C(=O)N2CCN(CC2)C3=CC4=C(C=C3)NC(=O)CC4)OC,0 +NC(=N)C1=CC=C(C=C1)OCCCCCOC2=CC=C(C=C2)C(N)=N,0 +OCC1=C(C=CC=C1)[N+]([O-])=O,0 +CC(=O)NC3=C(C=C2C1=CC=CC=C1CC2=C3)O,0 +CC(=O)C1=C(C=CC(=C1)NC(=O)NC(C)(C)C)OCC(O)CNC(C)(C)C,0 +BrCC(=O)NC1=CC=CC=C1,0 +C2CC=CCCC1OC1CCC=C2,0 +CC(=O)NC1=CC(=CC=C1)O,0 +C=CCNCC=C,0 +C[N]1C=NC2=C1C(N(C(N2C)=O)C)=O,0 +ClC1=C(C=C(C=C1)C=O)Cl,0 +CC(C)NCC(O)COC2=C1OCC(CC1=CC=C2)O[N+]([O-])=O,0 +CC=NN(C)C=O,0 +CC2=C(C=C1C=CC=CC1=C2)[N+]([O-])=O,0 +CC(C)(C)C1=C(C(=CC(=C1)CC2=CC(=C(C(=C2)C(C)(C)C)O)C(C)(C)C)C(C)(C)C)O,0 +C1CN(CCN1)C2=CC=CC=C2,0 +FC1=NC(=CC=C1)F,0 +CCCCCCCCCCCCCCC1CO1,0 +ClC1=CC(=C(C=C1)Cl)Cl,0 +C1CNCCN1,0 +CC=C1CC(C)C(O)(CO)C(=O)OCC2=CC[N+]3([O-])CCC(OC1=O)C23,0 +CC1=C(C=CC=C1)Cl,0 +CCC1=C4C(=C(C2=CC=CC=C12)CC)C3=CC=CC=C3C=C4,0 +CCSCCOP(=S)(OC)OC,0 +CCOC(=O)C(Cl)C(C)=O,0 +CC2=C1C=CC=CC1=C3C(=C2)C4=C(C=C3)C(O)C(O)C5OC45,0 +NC1=CC=C(C=C1)Br,0 +C1COCCOCCOCCO1,0 +O=C1CCCCCN1,0 +[O-][N+](=O)C1=C(C(=C(C(=C1)Cl)Cl)Cl)Cl,0 +OCC1OC(C(O)C1O)N2CC(=O)C(=N)NC2=O,0 +OCCCC1=CC=CC=C1,0 +CC1=NC(=NC(=C1)C)SC(=O)OC(C)(C)C,0 +OC(=O)C=CC1=CC=CC=C1,0 +CCOP(=O)(OCC)OC1=NOC(=C1)C2=CC=CC=C2,0 +CC(O)=O,0 +N#CCC1=CC=CC=C1,0 +CC1(C)N(Cl)C(=O)N(Cl)C1=O,0 +CCC(C)=O,0 +OC1=C(C(=C(C(=C1Br)Br)Br)Br)Br,0 +CCN(CC)C1=CC2=C(C=C1)C(=CC(=O)O2)C,0 +NCCCNCCCN,0 +CCOC1=C(C=CC(=C1)C=O)O,0 +CN1N(C(=O)C=C1C)C2=CC=CC=C2,0 +COC1=C(C=C(C(=C1)OC)C=O)OC,0 +CCCNC(=O)NS(=O)(=O)C1=CC=C(C=C1)Cl,0 +CC(NC(=O)COC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 +C[N]2C(=NC3=NC1=CC=CN=C1C=C23)N,0 +OS(=O)(=O)C2=C1N=CC=CC1=CC=C2,0 +CC1=NC2=C(C=N1)CCC2,0 +CN(C1CCN(CC1)C3=NC2=CC=CC=C2[N]3CC4=CC=C(C=C4)F)C5=NC(=CC=N5)O,0 +OC1=CC=C(C=C1)C3CC(=O)C2=C(C=C(C=C2O)O)O3,0 +CC(=O)C(=O)C1=CC=CC=C1,0 +O=C(CN1C(=O)SC2=C1C=CC=C2)OCC3=CC=CC=C3,0 +ClC1=C(Cl)C(Cl)(Cl)C(=C1Cl)Cl,0 +BrCC(=O)C1=CC=CC=C1,0 +CCCCCCC=O,0 +O2C1=CC=CC=C1C3=CC=CC=C23,0 +CC1=CC=C(O1)C=O,0 +C2CCCC1OC1CC2,0 +C1COCCN1,0 +OC2=NC1=CC=CC=C1O2,0 +NC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=CC=C3,0 +O=CNC1=CC=CC=C1,0 +CCSCCSP(=S)(OC)OC,0 +COP(O)(SC)=NC(C)=O,0 +CC(C)(C)OOC(C)(C)CCC(C)(C)OOC(C)(C)C,0 +CC1=C(C=C(C=C1)Cl)[N+]([O-])=O,0 +CCOC(=O)C1OC1(C)C2=CC=CC=C2,0 +COC(=O)CCC(=O)OC,0 +CCCCCCCOC1=C(C=CC=C1)NC(=O)OCCN2CCCCC2,0 +CC(=C)C1=C(C=C(C(=C1)O)C)O,0 +O1C=CC2=CC=CC=C12,0 +CC(=O)C1=CC=CC=C1,0 +CCCCSCCC(N)C(O)=O,0 +OCC1=CC=C(C=C1)[N+]([O-])=O,0 +CC(C)(C)OC(=O)ON=C(C#N)C1=CC=CC=C1,0 +CCCOC(=O)C(C)=C,0 +CC(=O)[N]1C=CN=C1,0 +OC(=O)C2=NC1=C(C=CC=C1C(=C2)O)O,0 +ON=CC=NO,0 +N#CCCC#N,0 +NC1=CC=C(C=C1)S(O)(=O)=O,0 +OC2=C1C=C(C(OC1=CC=C2)=O)C4CCC3=C(C=CC=C3)C4,0 +CC1=CC(=O)OC2=C1C=CC(=C2)N,0 +CC(=O)NC1=C(C3=C(C=C1)C2=CC=CC=C2C3)O,0 +CC(O)CN(CCN(CC(C)O)CC(C)O)CC(C)O,0 +CCCCOCCOCCOCC2=C(C=C1OCOC1=C2)CCC,0 +CC(=O)OC1=CC=C(C=C1)CO,0 +CO,0 +COCCOCCOC,0 +CCC(=O)C(C)=O,0 +CC1(C)CC(C(N)=O)C(C)(C)N1O,0 +CC1=C(C=CC(=C1)Cl)OCCCC(O)=O,0 +O=C1OC(=O)C=C1,0 +CCCCC(CC)CN,0 +CC(C)C1=CC3=C(C=C1)OC2=C(C=C(C(=N2)N)C(O)=O)C3=O,0 +FC(F)(F)C1=CC=C(C=C1)Cl,0 +CC1=NN=C(S1)NS(=O)(=O)C2=CC=C(C=C2)N,0 +CCN(CC)S(=O)(=O)C1=CC=C(C=C1)NC(C)=O,0 +OC1=CC2=C(C=C1)OCO2,0 +CCC(C)C(C)CO,0 +OC1(O)C(=O)NC(=O)NC1=O,0 +NC(CC(O)=O)C(O)=O,0 +CC(C)OC(=O)C(C)=C,0 +COC1=C(C=CC(=C1)C=C)O,0 +CCCCCCCCCCC,0 +CC(=O)OC1=C(C=CC=C1)C(O)=O,0 +CCCCOC(=O)C1=C(C=CC=C1)N,0 +CC3=C(C2=C1C=CC=CC1=CC=C2C=C3)C,0 +NC(=O)C1=CN=CC=C1,0 +CC2(C)C3CCC1(CO1)C2C3,0 +BrC1=CC=CC=C1,0 +CCCCCCCCCCCCCC(O)=O,0 +NC(C#N)C(=N)C#N,0 +ClC2=NC1=CC=CC=C1C=C2,0 +OC1=CC(=C(C=C1)N=NC2=CC=C(C=C2)[N+]([O-])=O)O,0 +O=C4C=CC3=C2C=CC1=CC=CC=C1C2=CC=C3C4=O,0 +CC1=CC=C(C=C1)C(=O)C2=CC(=C(C(=C2)O)O)[N+]([O-])=O,0 +CN(C)C1=CC=C(C=C1)C4CC2(C)C(CCC2(O)C=CCO)C5CC=C3CC(=O)CCC3=C45,0 +CCCC(C1=C(C=C(C(=C1)C(C)(C)C)O)C)C2=C(C=C(C(=C2)C(C)(C)C)O)C,0 +CN(C)CCO,0 +OC1=C(C=C(C=C1)Cl)Cl,0 +OC(=O)C2=C1N=CC=CC1=CC=C2,0 +C1=CC=NC=C1,0 +ON=CC1=NC=CC=C1,0 +OCCOC1=C(C=C(C(=C1)Cl)Cl)Cl,0 +OCCO,0 +OS(=O)(=O)C1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,0 +OC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O,0 +CCN(CC)C(=O)CC1=CC=CC=C1,0 +OC1COC(O)(CN(CC(O)=O)N=O)C(O)C1O,0 +C[N+]1=CC=C(C=C1)C2=CC=[N+](C=C2)C,0 +COC4=C1C5=C(C(OC1=C3C2CCOC2OC3=C4)=O)C(OCC5)=O,0 +CC(C)CCCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCCC(C)C,0 +CC(=O)OCC1=CC=CC=C1,0 +OC2=CC=C1[NH]C=CC1=C2,0 +CC(Br)Br,0 +COC(=O)C1=C(C)NC(=C(C1C2=C(C(=CC=C2)Cl)Cl)C(=O)OC(C)C)COC(N)=O,0 +OCC(CO)(CO)CO,0 +OC1=CC(=CC(=C1)Cl)Cl,0 +CC1=C(C=C(C=C1)N)Cl,0 +CCCCCCCCCCOC(=O)C(C)=C,0 +COC1=CC(=CC(=C1)OC2=C(C=C(C=C2)Cl)Cl)[N+]([O-])=O,0 +ClC1=CC=C(C=C1)NC(=O)NC2=CC(=C(C=C2)Cl)Cl,0 +C=CC1CCC=CC1,0 +NCCC1=C[NH]C2=CC=C(O)C=C12,0 +COC1=C(C=CC(=C1)C=O)O,0 +COP(=O)(OC)OC(=CCl)C1=C(C=C(C(=C1)Cl)Cl)Cl,0 +CC(C=O)=CC1=CC=CC=C1,0 +CC(C)C1=CC3=C(C=C1)C2=CC=CC(=C2C=C3)C,0 +OC1=CC=C(C=C1)C2(CCCCC2)C3=CC=C(C=C3)O,0 +COC(=CC(O)=O)C(=O)C(C)=C,0 +C=CC(=O)OCCOCCOC(=O)C=C,0 +C=CC(=O)OCCCCCCOC(=O)C=C,0 +OCC=O,0 +CN(C)C=O,0 +COC2=C1OC3=C(C(C1=C(C=C2)O)=O)C(=CC5=C3C4CCOC4O5)OC,0 +CC(C)CCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCCC(C)C,0 +C1COCCOCCOCCOCCOCCO1,0 +CC1CCCC(C)N1CCCC(O)(C2=CC=CC=C2)C3=NC=CC=C3,0 +CC(C)COC(=O)C1=C(C=CC=C1)C(=O)OCC(C)C,0 +CCCCCCCCCCCCCl,0 +CNC(=O)N(C1=CC=CC=C1)C2=CC=CC=C2,0 +CCCCCC(O)=O,0 +CCCCC(CC)COP(OCC(CC)CCCC)OCC(CC)CCCC,0 +OC2=NC1=CC=CC=C1C=C2,0 +OC1=C(C(=C(C=C1)Cl)Cl)Cl,0 +OCC1=CC=C(C=C1)Br,0 +CC1=NC=CC=C1,0 +COC1=C(C2=C(C=C1O)OC(=CC2=O)C3=CC=C(C=C3)O)O,0 +CC(C)NCC(O)COC1=C(C=CC=C1)OCC=C,0 +CCCCCC1=CC(=CC(=C1)O)O,0 +C=CC(=O)OCCCCCOC(=O)C=C,0 +CC(=O)C(C)=NO,0 +CCC1(CC(O)=O)OCCC2=C1[N](C3=CC=CC=C23)C,0 +COC3=C1C=COC1=NC4=C(O)C2=C(OCO2)C(=C34)CC=C(C)C,0 +COC3=C(C=C2C16CCN7CC5=CCOC4C(C1N(C2=C3)C(C4)=O)C5CC67)OC,0 +OC(=O)COC2=CC1=CC=CC=C1C=C2,0 +CCC=CC#N,0 +CC1=C(C=CC(=C1C)N)N,0 +OC1=C2C=CC3=CC=CC4=CC=C(C=N1)C2=C34,0 +CNCC1=CC=C(O1)CSCCNC(NS(C)(=O)=O)=NCC(O)C2=CC=C(C=C2)O,0 +CNNCC1=CC=C(C=C1)C(=O)NC(C)C,0 +CC1=CC=C(C=C1)N(CCCl)CCCl,0 +CN(C)S(=O)(=O)N(SC(F)(Cl)Cl)C1=CC=CC=C1,0 +OCCNCCO,0 +CC(C)(C)C1CCC2(CC1)CO2,0 +COC(F)(F)C(Cl)Cl,0 +OC2=C1N=CC=CC1=C(C=C2Cl)Cl,0 +CCCCC=O,0 +CC(=O)C=CC1=C(C)CCCC1(C)C,0 +CC1=C(C=C(C=C1)S(O)(=O)=O)C,0 +CCC2=C1OC(=CC1=CC=C2)C(O)CNC(C)(C)C,0 +CC(C)=CCCC(C)(OC(=O)C1=C(C=CC=C1)N)C=C,0 +CC4=C3N=C2C1=CC=CC=C1C=CC2=CC3=CC=C4,0 +ClCC1=C3C=CC4=CC=CC5=CC=C(C2=CC=CC=C12)C3=C45,0 +OC1=CC=C(C=C1)C3=COC2=C(C=CC(=C2)O)C3=O,0 +O=C1NC(=O)C(N1)(C2=CC=CC=C2)C3=CC=CC=C3,0 +CCCCCCOC(=O)C1=C(C=CC=C1)C(=O)OCCCCCC,0 +[NH]1C=CC=C1,0 +CCC1=C(C(=CC(=C1)N)C)CC2=C(C=C(C=C2C)N)CC,0 +OCC#N,0 +CC(=O)CC(C)=O,0 +OC(=O)CC1=C[NH]C2=CC=CC=C12,0 +O=C2CN(CCCN1CC(=O)NC(=O)C1)CC(=O)N2,0 +CC(C)C2=CC=C(C)C1=C(C=C(C)C1=C2)S(O)(=O)=O,0 +CC(=O)C1=C(C(=C(C(=C1C)[N+]([O-])=O)C(C)(C)C)[N+]([O-])=O)C,0 +ClCC1(CCl)C2CC(Cl)(Cl)C1(CCl)C(Cl)C2Cl,0 +ClC1=C(C(=C(C=C1)Cl)Cl)Cl,0 +COC1=C(C=CC=C1)O,0 +FC(F)(F)C1=CC=C(C=C1)CCl,0 +OC(=O)CCC1=CC=CC=C1,0 +COC4=CC2C3CC1=C(C(=C(C=C1)OC)O)C2(CCN3C)CC4=O,0 +OC2=C(C1=CC=CC=C1C=C2)N=O,0 +COC3=CC=C2C1=C(C(=NCC1)C)[NH]C2=C3,0 +CNC1=C(C=CC=C1)C(=O)OC,0 +OC(=O)CCCOC1=C(C=C(C=C1)Cl)Cl,0 +ClC(Cl)C(C1=CC=C(C=C1)Cl)C2=C(C=CC=C2)Cl,0 +CCCCC(CC)CO,0 +CC(C)=CCCC(C)(O)C=C,0 +CC(C)(C)C(Br)C(=O)NC1=CC=CC=C1,0 +OS(=O)(=O)C1=CC=C(C=C1)[N+]([O-])=O,0 +CS(=O)(=O)C1=CC=C(C=C1)Cl,0 +CCC2=C1[NH]C3=C(C1=CC=C2)CCOC3(CC)CC(O)=O,0 +CCCCOC(=O)CC(CC(=O)OCCCC)(OC(C)=O)C(=O)OCCCC,0 +CC(=O)C1(CCNCC1)C2=CC=CC=C2,0 +CCN(CC)C(=S)SSC(=S)N(CC)CC,0 +NC1=CC=C(C=C1)C(O)=O,0 +CC(C(O)=O)C1=CC(=CC=C1)C(=O)C2=CC=CC=C2,0 +ClC1=C(C=CC=C1)C=C,0 +CN(C)C(=N)N(C)C,0 +CC4=C(COC(=O)C1N3C(SC1(C)C)C(NC(=O)C(N)C2=CC=CC=C2)C3=O)OC(=O)O4,0 +N#CSCSC#N,0 +OC(=O)C1=C(C=CC(=C1)Cl)Cl,0 +CCCCC(CC)COC(=O)C=C,0 +OC(=O)CCCCC(O)=O,0 +BrCC(=O)C1=CC=C(C=C1)Br,0 +C2CCC1=C(C=CC=C1)C2,0 +CCC(C1=CC=CC=C1)=C(C2=CC=CC=C2)C3=CC=C(C=C3)OCCN(C)C,0 +CC(=C)C1CCC(=CC1)C=O,0 +OC(C(F)(F)F)C(F)(F)F,0 +CC(C)CC=O,0 +ClC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,0 +CC1(CO1)C=C,0 +CC(C)CCC(C)NC1=CC=C(C=C1)NC(C)CCC(C)C,0 +COC(C)=O,0 +CC(C)(C)N,0 +CNC,0 +CC1=CC(O)C2CC1C2(C)C,0 +CN(C)C(=O)NC1=CC=C(C=C1)Cl,0 +CCOP(=O)(OCC)OCC,0 +CC(OC1=C(C=C(C(=C1)Cl)Cl)Cl)C(O)=O,0 +NC1=NC(=O)N(C=C1)C2OC(COP(O)(O)=O)C(O)C2O,0 +CC(C)O,0 +CC1=CC(=O)CC(C)(C)C1,0 +CCCN(CCC)S(=O)(=O)C1=CC=C(C=C1)C(O)=O,0 +OC(=O)C1=C(C=CC=C1Cl)Cl,0 +CC1=CC=C(C=C1)C,0 +CCCO,0 +S1C=CC=C1,0 +O=S1(=O)CC=CC1,0 +NC1=C(C(=CC(=C1)[N+]([O-])=O)S(O)(=O)=O)O,0 +CC(=O)OC2C1OC(=O)C(OC(C)=O)C1OC2=O,0 +ClCC1=CC=C(C=C1)C#N,0 +OC(=O)CN(CCN(CC(O)=O)CC(O)=O)CC(O)=O,0 +CCCCCCCCC=C,0 +ClC2=C(C=C1OC3=C(OC1=C2)C=C(Cl)C(=C3)Cl)Cl,0 +OC1=CC=C(C=C1)C2(NC(=O)NC2=O)C3=CC=CC=C3,0 +C1=CC=C(C=C1)C2=C(C=CC=C2)C3=CC=CC=C3,0 +CC1=CC=C(C=C1)CCl,0 +O=C([N]1C=CN=C1)[N]2C=CN=C2,0 +CC(=O)CC(=O)NC1=CC=CC=C1,0 +[O-][N+](=O)C1=CC=C(C=C1)[N]2N=C(N=[N+]2C3=CC=C(C=C3)I)C4=CC=CC=C4,0 +CCC(C)C1=C(C=CC=C1)O,0 +C1CN2CCN1CC2,0 +COP(=O)(OC)OC(=CBr)C1=C(C=C(C=C1)Cl)Cl,0 +CC(O)COCC(C)O,0 +COP(=S)(OC)OC1=CC(=C(C=C1)[N+]([O-])=O)C,0 +CCCCCCCCCCCC(O)=O,0 +NC(=O)C1=CC=CC=C1,0 +CC(=O)CCl,0 +NC(CC1=CC=C(C=C1)F)C(O)=O,0 +COC1=CC=C(C=C1)C=CC(=O)C2=CC=CC=C2,0 +ClC2=C1C=CC=CC1=CN=N2,0 +CCC1=CC=CC=C1,0 +COC1=C(C=CC(=C1)C=CC(=O)CC(=O)C=CC2=CC(=C(C=C2)O)OC)O,0 +CC(=O)NNC(=O)C1=NC=CC=C1,0 +COC2=C(C=C1[NH]C=C(C1=C2)CCNC(C)=O)O,0 +BrCC(Br)C1CCC(Br)C(Br)C1,0 +NCCC#N,0 +OC1=CC=C(C=C1)CCC(=O)C2=C(C=C(C=C2O)O)O,0 +CC(Cl)Cl,0 +OC2=C1C=CC=CC1=NC3=CC=CC=C23,0 +OC4C(O)C3=C(C=C2C1=CC=CC=C1C=CC2=N3)C5=C4C=CC=C5,0 +CCC1=NC=CC(=C1)C(N)=S,0 +CCCC,0 +OC(=O)C=CC1=CC=C(C=C1)Cl,0 +CCCCN,0 +CCC(C)(C)C1=CC(=C(C(=C1)N3NC2=C(C=CC=C2)N3)O)C(C)(C)CC,0 +NC1=CC=C(C=C1)O,0 +OC1CCCCC1,0 +[O-][N+](=O)C1=CC(=CC=C1)C=CC(=O)C2=CC=CC=C2,0 +COP(C)(=O)OC,0 +CCCCCCCCCCCCO,0 +ClC1=C(C2=C(C(=C1Cl)Cl)C(=O)OC2=O)Cl,0 +S=C1SC=C(S1)C2=CC=CC=C2,0 +OC(=O)C1=C(N=CC=C1)NC2=CC(=CC=C2)C(F)(F)F,0 +CC1CCCC1,0 +OC2CC13OC1(C2)C=CC=C3,0 +CC(C)(C)OC(=O)C=C,0 +CC1=CSC=C1,0 +COP(=O)(OC)C(OC(=O)CCl)C(Cl)(Cl)Cl,0 +OCC1=CC=C(C=C1)Cl,0 +ClC1=C(Cl)C(=O)C(Cl)(Cl)C1=O,0 +CCCCCCCCOP(=O)(OCCCCCCCC)OCCCCCCCC,0 +CCC1=CC=CO1,0 +OC4=C2C1=CC=CC=C1C=CC2=C3C=CC=CC3=C4,0 +CC1=C(C=CC(=C1)S(O)(=O)=O)N,0 +CCN(CC)C(=O)C1=CC(=CC=C1)C,0 +CC(C(O)=O)C1=CC3=C(C=C1)C2=CC(=CC=C2[NH]3)Cl,0 +OCC(O)C(O)C(OC1OC(CO)C(O)C(O)C1O)C(O)CO,0 +CCN,0 +NS(=O)(=O)C2=C1N=CC=CC1=CC=C2,0 +CC1=C(C(=CC=C1)NC2=NC(=NC(=C2)Cl)SCC(O)=O)C,0 +CC1=C(C=C(C(=C1)C)C)C,0 +CCCCOC(=O)CCCCCCCCC(=O)OCCCC,0 +CCCCCCC1=C(C=C(C=C1)O)O,0 +CC(O)CN(CC(C)O)CC(C)O,0 +OC(=O)C2=N[N](CC1=C(C=C(C=C1)Cl)Cl)C3=CC=CC=C23,0 +OC1=C(C=C(C=C1Br)Br)Br,0 +NC2=NC=C1N=C[NH]C1=N2,0 +N(C1=CC=CC=C1)C2=CC=CC=C2,0 +CCOC(=O)C(C)(C)OC1=CC=C(C=C1)Cl,0 +OCCCCO,0 +CCCCOP(=O)(OCCCC)OC1=CC=CC=C1,0 +NC2=C1C(C4=C(C(C1=C(C=C2S(O)(=O)=O)NC3CCCCC3)=O)C=CC=C4)=O,0 +NC(=O)CBr,0 +[O-][N+](=NC1=CC(=C(C=C1)Cl)Cl)C2=CC(=C(C=C2)Cl)Cl,0 +FC(F)C(F)(F)F,0 +CCC1=CC(=C(C(=C1)C(C)(C)C)O)C(C)(C)C,0 +O=C1OC4=C3C2=C1C=CC=C2C=CC3=CC=C4,0 +NC(=O)CI,0 +CC1=C(SSC1=S)C2=NC=CN=C2,0 +NC1=C(C(=C(C=C1)Cl)Cl)Cl,0 +CC1=C(C(=C(C(=C1[N+]([O-])=O)C)[N+]([O-])=O)C(C)(C)C)[N+]([O-])=O,0 +O=C2C1=C(C=CC=C1)CCC3=C2C=CC=C3,0 +CC1=CC(=C(C=C1)C)C,0 +ClC(=O)OCC1=CC=CC=C1,0 +OC2=C1C(C5=C(OC1=CC=C2)C3=C(OC4OCCC34)C=C5O)=O,0 +OC(=O)CC(Cl)C(O)=O,0 +CC1=CCC(=O)O1,0 +ClC2=C1C=CC=CC1=C(N=N2)Cl,0 +OCC4=C2C=CC=C3C1=CC=CC=C1C(=C23)C=C4,0 +CC1=C(C(=CC(=C1)[N+]([O-])=O)[N+]([O-])=O)C,0 +C1COCCO1,0 +CC1=CC=C(O1)C,0 +OCC1=CC=C(C=C1)O,0 +O[N+]([O-])=C2C1=C(C=CC=C1)C(=O)C3=C2C=CC=C3,0 +CC(=O)OC3CC2C1(C)CCCC(C)(C)C1CCC2(C)C4(O)CC(=C(C=O)C34C)C=O,0 +COC2=C(C(=C1C(OCC1=C2C)=O)O)CC=C(C)CCC(O)=O,0 +CC(C)C(=O)NC1=CC=CC=C1,0 +OC(=O)CC1=CC=C(C=C1)Cl,0 +C2=CC1=CC=NC=C1C=C2,0 +OC1=C(C4=C2C(=C1)C(=O)OC3=C2C(=CC(=C3O)O)C(=O)O4)O,0 +OC1=C(C(=CC(=C1Cl)Cl)Cl)Cl,0 +CC1=CC=CC=C1,0 +ClC1=C(C(=CC=C1)Cl)C#N,0 +CC(C)OC1=CC2=C(C=C1)C(C(=CO2)C3=CC=CC=C3)=O,0 +[O-][N+]2=C1C=CC=CC1=CC=C2,0 +CCN(CC)CC1=C(C=CC(=C1)NC3=C2C=CC(=CC2=NC=C3)Cl)O,0 +C1CCC(CC1)NSC3=NC2=CC=CC=C2S3,0 +CCN(N=O)C1=CC=CC=C1,0 +O=C1CC(=O)C1=O,0 +CC(C)(C1=CC=C(C=C1)O)C2=CC=C(C=C2)O,0 +CC(=O)NC1=CC=C(C=C1)C(=O)C=CC2=CC=CC=C2,0 +CC(=O)OO,0 +CC(=O)C1=CC=C(C=C1)S(=O)(=O)NC(=O)NC2CCCCC2,0 +CC(C)(C)O,0 +CC(C)(OC1=CC=C(C=C1)C2CC2(Cl)Cl)C(O)=O,0 +CC1=CC(=CC=C1)[N+]([O-])=O,0 +CCC=[N+](O)[O-],0 +C1OCOCO1,0 +CCC3=C2C1=CC=CC=C1C=CC2=C(C4=CC=CC=C34)C,0 +CCOC(C)=O,0 +CCOC1=CC=C(C=C1)NC(N)=O,0 +CC(C)=O,0 +CC1=CC=C(C=C1)Cl,0 +CCCCC(CC)COCCC#N,0 +ClCC1=CC=C(C=C1)Cl,0 +OC1=C(C=CC=C1)C(=O)OC2=CC=CC=C2,0 +ClC(=C)C#N,0 +CCOC(=O)OC(=O)OCC,0 +CC(CCN(C)C)N(C)C,0 +CC1=C(C)C(=O)C(=C(C)C1=O)C,0 +C=CCN1C(=O)N(CC=C)C(=O)N(CC=C)C1=O,0 +OC(=O)C1CC2=C(CN1)[NH]C3=CC=CC=C23,0 +CCCCCN,0 +[O-][N+](=O)OCC(CO[N+]([O-])=O)(CO[N+]([O-])=O)CO[N+]([O-])=O,0 +COC1=C(C5=C(C(=C1)O)C(=O)C2=C(C3=C(C=C2OC)OC4OCCC34)O5)OC,0 +OC(=O)C1=C(C=CC=C1)Cl,0 +O=C1CCCCC1,0 +CC1=CC=C(C=C1)OP(=O)(OC2=CC(=CC=C2)C)OC3=CC(=CC=C3)C,0 +OC(=O)C1=C(C=CC=C1)NC2=C(C=CC(=C2)Cl)C(O)=O,0 +CCCCCC(N)=O,0 +CCCCCCCCCCCC(=O)OCCS(O)(=O)=O,0 +OC1=C(C=C(C=C1Cl)Cl)SC2=C(C(=CC(=C2)Cl)Cl)O,0 +[O-][N+]4=C2C=CC1=CC=CC=C1C2=CC5=C3C=CC=CC3=CC=C45,0 +ClC1=CC=C(C=C1)S(=O)(=O)C2=C(C=C(C(=C2)Cl)Cl)Cl,0 +CC(OP(C)(Cl)=O)C(C)(C)C,0 +ClC1=CC(=CC(=C1)Cl)N2C(=O)CCC2=O,0 +NCC1=CC(=CC=C1)CN,0 +OC(=O)COC1=C(C(=C(C=C1)C(=O)C2=CC=CS2)Cl)Cl,0 +O=C1C5=C4C3=C2C1=CC=CC2=CC=C3C=CC4=CC=C5,0 +CC1=NC=CN=C1,0 +CCC(O)CN,0 +CC(=O)C3C(=O)C=C2OC1=C(C(=C(C(=C1C(C)=O)O)C)O)C2(C)C3=O,0 +O=C1CSC(=S)N1,0 +FC2=CC1=CC=CC=C1N=C2,0 +OC1=CC=C(C=C1)C3=CC(=O)C2=C(C=C(C=C2O)O)O3,0 +OC(=O)C1=CC(=C(C(=C1)O)O)O,0 +C=COC(=O)C=C,0 +CC(CCl)OP(=O)(OC(C)CCl)OC(C)CCl,0 +CC1(C)C2CCC1(C)C(=O)C2=O,0 +NC1=CC=C(C=C1)C(=O)OCCCOC(=O)C2=CC=C(C=C2)N,0 +COC1=C(C=CC(=C1)C=CC)O,0 +CC(C)CC(NC(=O)COC1=C(C=C(C=C1)Cl)Cl)C(O)=O,0 +OC(=O)C1=CC(=CC(=C1)Cl)Cl,0 +CCCCOC(C)=O,0 +C2CCC1CCCCC1C2,0 +CCC1=CC=C(C=C1)[N+]([O-])=O,0 +CC1=C(C(=C(C(=C1Br)Br)Br)Br)Br,0 +C[N+](C)(C)CC1=CC=CC=C1,0 +CC#N,0 +CC(C)(C)CC(C)(C)C1=CC=C(C=C1)OCCOCC[N+](C)(C)CC2=CC=CC=C2,0 +CCCCCCCCCCCCCCCCCC[N+](C)(C)CC1=CC=CC=C1,0 +CCCCC(CC)COS(O)(=O)=O,0 +OCCN4CCN(CCCN2C1=C(C=CC=C1)SC3=C2C=C(C=C3)C(F)(F)F)CC4,0 +OC(COC2=C1C(C=C(OC1=CC=C2)C(O)=O)=O)COC4=C3C(C=C(OC3=CC=C4)C(O)=O)=O,0 +OC2=C(C1=CC=C(C=C1C=C2)S(O)(=O)=O)N=NC3=CC=CC=C3,0 +OC2=C(C1=C(C=C(C=C1C=C2)S(O)(=O)=O)S(O)(=O)=O)N=NC3=CC=CC=C3,0 +CN(C)CCN(CC1=CC=CC=C1)C2=CC=CC=C2,0 +CC(C)C1CCC(C)CC1O,0 +COC(=O)C(C1CCCCN1)C2=CC=CC=C2,0 +CC(CCC1=CC=CC=C1)NCC(O)C2=CC(=C(C=C2)O)C(N)=O,0 +NC2=C1C(=C(C(=CC1=CC(=C2)S(O)(=O)=O)S(O)(=O)=O)N=NC3=CC=CC=C3)O,0 +CC3=C(OC1=C(C=CC=C1C(=O)OCCN2CCCCC2)C3=O)C4=CC=CC=C4,0 +CC(CN2C1=C(C=CC=C1)SC3=C2C=CC=C3)N(C)C,0 +CC(C)CCCC(C)CCCC(C)CCCC2(C)CCC1=C(C(=C(C(=C1C)O)C)C)O2,0 +C[N+](C)(C)CC(O)=O,0 +CON,0 +OC2=C(C1=CC=CC=C1C=C2)N=NC3=CC=C(C=C3)S(O)(=O)=O,0 +CC1=NC(=C(C=N1)C[N+]2=CSC(=C2C)CCO)N,0 +OC1=NC(=NC(=N1)O)O,0 +OC2=C1[N+](=CC=CC1=CC=C2)[O-],0 +OC(=O)C1C(C(O)=O)C2(Cl)C(=C(Cl)C1(Cl)C2(Cl)Cl)Cl,0 +OC2=C1C=CC=CC1=CN=N2,0 +C(NC2=C1[NH]C=NC1=NC=N2)C3=CC=CC=C3,0 +CC=C1CC(C)C(C)(O)C(=O)OCC2=CCN3CCC(OC1=O)C23,0 +NC2=NC1=N[NH]N=C1C(=N2)O,0 +CCCCCCCCCCCCCCCC(=O)OCC(O)C1=C(C(=C(O1)O)O)O,0 +CCCCCC(CC)OC(=O)C1=CC(=CC=C1)C(=O)OC(CC)CCCCC,0 +OC2=C1C=CC=CC1=C(N=N2)O,0 +SC2=NC1=CC=CC=C1S2,0 +OCC(O)C(O)CO,0 +CC2(C)C3CC1OC1(C)C2C3,0 +CC(=O)C1=C(O)[N]5C(=C1O)C2C(CC4=C3C2=C[NH]C3=CC=C4)C5(C)C,0 +CC(C)CC(=O)OC4CC1(OC(C)=O)C(OC2C(O)C(OC(C)=O)C1(C)C23CO3)C=C4C,0 +CC(=O)OCC12CCC(=CC1OC3C(O)C(OC(C)=O)C2(C)C34CO4)C,0 +CC4CC3OC1C(O)C(OC(C)=O)C(C)(C12CO2)C3(CO)C(=O)C4=O,0 +CC4CC3OC1C(O)C(O)C(C)(C12CO2)C3(CO)C(=O)C4=O,0 +NC1=NN=C(S1)S,0 +ClCC1C(CCl)C2(Cl)C(=C(Cl)C1(Cl)C2(Cl)Cl)Cl,0 +ClC1=CC3=C(C=C1)N2C=NNC2=CN=C3C4=CC=CC=C4,0 +C=CC1CC2CC1C=C2,0 +ClC3=C(Cl)C4(Cl)C2C1CC(C=C1)C2C3(Cl)C4(Cl)Cl,0 +CC1C(=O)OC2CCN3CC=C(COC(=O)C(C)(O)C1(C)O)C23,0 +OC2CC(O)(CC(OC(=O)C=CC1=CC(=C(C=C1)O)O)C2O)C(O)=O,0 +CN(C=NC=NC1=C(C=C(C=C1)C)C)C2=C(C=C(C=C2)C)C,0 +NC3=NC(=C2N=C(O)[N](C1OC(CO)C(O)C1O)C2=N3)O,0 +CC1(CO)C(O)CCC2(C)C1CCC3CC4CC23CCC4(O)CO,0 +CNC(=N)N[N+]([O-])=O,0 +CC(=O)OC4(CCC5C3C=C(Cl)C2=CC(=O)C1CC1C2(C)C3CCC45C)C(C)=O,0 +CC12CCC(CC1)C(C)(C)O2,0 +CC12CCCC(C)(C1CCC34CC(=C)C(O)(CCC23)C4)C(O)=O,0 +CNC3=C1CC(=O)C(=CC=C1C2=C(C(=C(C=C2CC3)OC)OC)OC)OC,0 +CC34CC(O)C1C(CCC2=CC(=O)C=CC12C)C3CCC4(O)C(O)C=O,0 +CC34CCC1C(CCC2=C1C=CC(=C2)O)C3CC(O)C4O,0 +CC34CCC1C(CCC2=C1C=CC(=C2)O)C3CCC4O,0 +CC2=CN(C1CC(O)C(CO)O1)C(=O)NC2=O,0 +OC1=NC(=C(C=N1)F)O,0 +CC(=O)OC3(CCC4C2CCC1=C(CCC(=O)C1)C2CCC34C)C#C,0 +CC1CCC6(OC1)OC5CC4C3CC=C2CC(O)CCC2(C)C3CCC4(C)C5C6C,0 +CC4CC3OC1C(O)CC(C)(C12CO2)C3(CO)C(=O)C4=O,0 +OC3=C(C=C2C1C4=C(OCC1(CC2=C3)O)C(=C(O)C=C4)O)O,0 +COC1=C(C(=CC(=C1)C3C2C(COC2=O)C(O)C5=C3C=C4OCOC4=C5)OC)OC,0 +CC2OC=C1C(=O)C(C(O)=O)C(=O)C(=C1C2C)C,0 +NC2=C1C(=NN=C(C1=CC=C2)O)O,0 +CC34CCC1C(CC=C2CC(O)CCC12C)C3CCC4=O,0 +CN1CCCC1C2=CN=CC=C2,0 +OCC1OC(CC1O)N2C=C(I)C(=O)NC2=O,0 +CC(C)C12CC1C(C)C(=O)C2,0 +CC(N)(CC1=CC(=C(C=C1)O)O)C(O)=O,0 +CC1=NC(=NC(=C1)O)S,0 +CC34CCC1C(CCC2=C1C=CC(=C2)O)C3CCC4(O)C#C,0 +CC(=O)C3CCC4C2CC=C1CC(=O)CCC1(C)C2CCC34C,0 +NC2=C1N=C[N](C1=NC=N2)C3OC(CO)C(O)C3O,0 +OC(=O)CCCCC1SCC2NC(=O)NC12,0 +NS(=O)(=O)C1=C(C=C2C(=C1)S(NC=N2)(=O)=O)Cl,0 +SC2=NC1=CC=CC=C1[NH]2,0 +OCC1OC(CC1O)N2C=C(Br)C(=O)NC2=O,0 +NC2=NC1=NC=C(N=C1C(=N2)O)CNC3=CC=C(C=C3)C(=O)NC(CCC(O)=O)C(O)=O,0 +CC1=C(N=C(N=C1)S)O,0 +CC=CC(=O)OC2CC3OC1=CC(C)C(=O)CC1(C)C2(C)C34CO4,0 +CC(C)CCCC(C)C1CCC2C(CCCC12C)=CC=C3CC(O)CCC3=C,0 +NC(CC1=CC=CC=C1)C(O)=O,0 +CC34CCC1C(CC=C2CC(=O)CCC12)C3CCC4(O)C#C,0 +CC(=O)OC3(CCC4C2CC(=C1CC(=O)CCC1(C)C2CCC34C)C)C(C)=O,0 +CC14C(O)C=CC5(OC1=O)C2CCC3(O)CC2(CC3=C)C(C45)C(O)=O,0 +C2C=CC3C1CC(C=C1)C23,0 +CC1=CCC2CC1C2(C)C,0 +CC6CCC5C(C)C3C(CC4C2CC=C1CC(O)CCC1(C)C2CCC34C)N5C6,0 +CC(CCC(O)=O)C3CCC4C2C(O)CC1CC(O)CCC1(C)C2CC(O)C34C,0 +[O-][N+](=O)OC1COC2C(COC12)O[N+]([O-])=O,0 +CC2=CCCC(=C)C1CC(C)(C)C1CC2,0 +CC1=C(N=C(N=N1)O)O,0 +OCC1OC(CC1O)N2C=CC(=O)NC2=O,0 +NC2=C1N=C[N](C1=NC=N2)C3CC(O)C(CO)O3,0 +CCCC(=O)OCC,0 +CC(=O)C1=CC=NC=C1,0 +ClC1=NC(=CC=C1)Cl,0 +CC(O)CO,0 +CC(C)CO,0 +CC1CCC(=O)C1=O,0 +CC1=CC(=O)OC2=C1C=CC(=C2)O,0 +CCN(CC)C1=CC=CC=C1,0 +CCCCOC(=O)C(C)=C,0 +CN(C)C(=O)OC1=C[N+](=CC=C1)C,0 +CCC(CO)NCCNC(CC)CO,0 +CC12CCC(CC1O2)C=C,0 +NC2=C1C=CC=CC1=CC=C2O,0 +CN1CCC(C1)CN3C2=C(C=CC=C2)SC4=C3C=CC=C4,0 +CCCCCC(=O)OC3(CCC4C2CCC1=C(CCC(=O)C1)C2CCC34C)C(C)=O,0 +O=C1NS(=O)(=O)C2=C1C=CC=C2,0 +OC2=C(C=C1C=C(C=CC1=C2)S(O)(=O)=O)S(O)(=O)=O,0 +NC1=CC=CC=C1,0 +COC1=C(C4=C(C=C1Cl)C3(C(C25SSC(C(N2C3N4C)=O)(C)N(C5=O)C)O)O)OC,0 +CCCCCCCCCCCCOS(O)(=O)=O,0 +OC(=O)CC1=C(C=CC=C1)NC2=C(C=CC=C2Cl)Cl,0 +NC2=C1N=C[N](C1=NC(=N2)O)C3OC(CO)C(O)C3O,0 +COC1=C(C(=CC(=C1)CC2NCCC3=C2C=C(C(=C3)O)O)OC)OC,0 +OC(=O)C2=NN(C1=CC=C(C=C1)S(O)(=O)=O)C(=O)C2N=NC3=CC=C(C=C3)S(O)(=O)=O,0 +CN(C)C4C3C(O)C2C(C(=O)C1=C(C=CC=C1O)C2(C)O)C(=O)C3(O)C(=O)C(C(N)=O)C4=O,0 +CCNC1=NC(=NC(=N1)O)NC(C)C,0 +ON1CN(Cl)CN(Cl)C1,0 +C[N+]1(C)CCOCC1,0 +ClC1=CC=C(C=C1)COC(C[N]2C=CN=C2)C3=C(C=C(C=C3)Cl)Cl,0 +O[N]1N=NC2=CC=CC=C12,0 +CN2CCN=C(C1=CC=CC=C1)C3=C2C=CC(=C3)Cl,0 +CC(CCC(O)=O)C3CCC4C2CCC1CC(=O)CCC1(C)C2CC(=O)C34C,0 +NC(CSCC1=CC=CC=C1)C(O)=O,0 +CCNC(=O)CCC(N)C(O)=O,0 +CCC3CN2CCC1=C(C=C(C(=C1)OC)OC)C2CC3CC4NCCC5=C4C=C(C(=C5)OC)OC,0 +NC1=CC(=C(C=C1)Cl)C(F)(F)F,0 +CCN(CC)CCCN(C2CC1=C(C=CC=C1)C2)C3=CC=CC=C3,0 +OC1C(O)C(OC1COP(O)(O)=O)N2C=CC(=O)NC2=O,0 +NCCC1=C[NH]C2=CC=CC=C12,0 +CCCC(=O)NC1=CC(=C(C=C1)OCC(O)CNC(C)C)C(C)=O,0 +FC1=CC=C(C=C1)CCl,0 +CCCC(=O)NC2=C1N=C[N](C1=NC=N2)C4OC3COP(O)(=O)OC3C4OC(=O)CCC,0 +FC1=CN=CC=C1,0 +CCCCCCC(=O)OC3(CCC4C2CCC1=CC(=O)CCC1C2CCC34C)C#C,0 +OCC1OC(C(O)C1O)[N]3C=NC4=C(NCC2=CC=C(C=C2)[N+]([O-])=O)N=CN=C34,0 +OCC1OC(CC1O)N2C=C(C=O)C(=O)NC2=O,0 +OC1C(O)C(OC1COP(O)(O)=O)[N]2C=NC3=C(O)N=CN=C23,0 +OC2=C1C=CC=CC1=NC=N2,0 +CCC5=C(CC1NCCC2=C1C=C(C(=C2)OC)OC)CC3N(CCC4=C3C=C(C(=C4)OC)OC)C5,0 +CC(C)C3=CC2=CCC1C(C)(CCCC1(C)C(O)=O)C2CC3,0 +OC1=CC2=C(C=C1)C4(C3=C(O2)C=C(O)C=C3)OC(=O)C5=C4C=CC=C5,0 +OC2=CC(=C1C=C(O)C(=[O+]C1=C2)C3=CC(=C(C(=C3)O)O)O)O,0 +CCCCCCC(O)CC=CCCCCCCCC(O)=O,0 +C[N+]1=CC(=CC=C1)C(O)=O,0 +OC(=O)C1=C(C=CC=C1)O,0 +NC2=NC1=CC=C(C=C1[NH]2)Cl,0 +CCCOC(C(=O)OC1CCN(C)CC1)(C2=CC=CC=C2)C3=CC=CC=C3,0 +NC3=NC(=C2N=C[N](C1OC(COP(O)(O)=O)C(O)C1O)C2=N3)O,0 +CNC(=O)OC1=CC2=C(C=C1)N(C)C3N(C)CCC23C,0 +CC(C)CCCC(C)C3CCC4C2CC=C1CCCCC1(C)C2CCC34C,0 +CC4CC2(C)C(CCC3C1CCC(O)C1(C)CCC23)CC4=O,0 +CC1=C(C(=C(C=N1)CO)CO)O,0 +CC1=CC(=C(C=C1)N=NC3=C2C=CC=CC2=CC(=C3O)C(O)=O)S(O)(=O)=O,0 +CN,0 +CC1=C(C(=CC=C1)OCC(O)CNC(C)(C)C)C,0 +CN[N+]([O-])=O,0 +ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl,0 +CC(C)CC(NC(=O)C(CC1=CC=CC=C1)NC(=O)CNC(=O)CN)C(O)=O,0 +CC1=NCCC2=C1[NH]C3=CC(=CC=C23)O,0 +CC(C)CCCC(C)C3CCC4C2CC=C1CC(CCC1(C)C2CCC34C)OC(C)=O,0 +CNCC(O)C1=CC(=CC=C1)O,0 +NC1=NC=N[NH]1,0 +NC1=NC(=O)N(C=C1I)C2CC(O)C(CO)O2,0 +NC(CC1=CC(=C(C=C1)O)[N+]([O-])=O)C(O)=O,0 +COC1=CC=C(C=C1)CN(CCN(C)C)C2=NC=CC=N2,0 +CN(C)C4C3CC2C(C(=O)C1=C(C=CC=C1O)C2(C)O)C(=O)C3(O)C(=O)C(C(N)=O)C4=O,0 +COC1=CC=C2C(=CC1=O)C(CCC3=C2C(=C(C(=C3)OC)OC)OC)NC(C)=O,0 +CN1C2CC(CC1C3OC23)OC(=O)C(CO)C4=CC=CC=C4,0 +CNC(C=[N+](O)[O-])=NCCSCC1=CC=C(O1)CN(C)C,0 +OCC1OC(C(O)C1O)N2C=CC(=N)NC2=O,0 +OC1=NC(=NC=N1)O,0 +CC2(C)C1CCC(C1)C2=C,0 +CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCO,0 +OCC1=CC(C(O)C1O)N2C=CC(=N)NC2=O,0 +O=C1NC(=S)NC(=O)C1C(=O)NC2=CC=CC=C2,0 diff --git a/test/data/multi_cell_call.csv b/test/data/multi_cell_call.csv new file mode 100644 index 0000000..cebe58b --- /dev/null +++ b/test/data/multi_cell_call.csv @@ -0,0 +1,1067 @@ +SMILES, Rodent carcinogenicity +C12(C(=C(/N=N/C3=C(C4=C(C(=C3)S(=O)(=O)[O-])C=CC=C4)O)C=CC=1S(=O)(=O)[O-])C=CC=C2).[Na+].[Na+], 0 +O=C(C2=CC=CC=C2)S\C(CCOC(C3=CC=CC=C3)=O)=C(C)/N(C=O)CC1=CN=C(C)N=C1N.Cl, 0 +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2, 0 +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2, 1 +BrC(CCl)CBr, 1 +NC(=S)NNC(=S)N, 0 +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC, 0 +[O-][N+](=O)C1=CC=CC(=C1)NC(=O)C2=CC3=CC=CC=C3C(=C2O)/N=N/C4=CC(=CC=C4OC)[N+]([O-])=O, 0 +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr, 1 +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+], 1 +BrCCBr, 1 +ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl, 1 +ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2], 1 +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr, 1 +C(CCCCCCCC)CCCNC(N)=N.CC(=O)O, 0 +CC1=CC=CC=C1, 1 +C1(=CC(=C2C(=C1)N=CC=C2)Br)Br, 0 +C1CCCNCCC1, 0 +O=C(N(CCCC)N=O)NCCCC, 1 +[Na+].C1(=CC=C2C(=C1S([O-])(=O)=O)C=CC=C2)/N=N/C3=C(C=CC4=C3C=CC=C4)O, 0 +CC(=O)O[Sn](OC(=O)C)(CCCC)CCCC, 0 +CC1=CC(C)=C(/N=N/C2=C(C(S([O-])(=O)=O)=CC3=C2C=CC(S([O-])(=O)=O)=C3)O)C=C1C.[Na+].[Na+], 1 +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 +NC1=CC=CC(C)=C1.[H]Cl, 1 +C1=C(Cl)C=C3C(=C1)N(CCO)C(=O)C(O)N=C3C2=CC=CC=C2F, 0 +Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl, 1 +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OCC)OCC, 0 +C1(=CC=C(N)C=C1)C.[H]Cl, 1 +[O-]C1=C(I)C=C(C(C2=C(C([O-])=O)C=CC=C2)=C3C=C(C(C(I)=C3O4)=O)I)C4=C1I.[Na+].[Na+], 0 +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2, 1 +Cl[C@@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl, 1 +CC(C)(O)CC[C@@H](O)[C@@H](C)[C@H]2CC[C@@]1(O)C/3=C/C(=O)[C@@H]4C[C@@H](O)[C@@H](O)C[C@]4(C)[C@H]\3CC[C@@]12C, 1 +Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl, 1 +N12([C@@H]([C@@H](C1=O)NC(COC3=CC=CC=C3)=O)SC([C@@H]2C(=O)[O-])(C)C).[K+], 0 +ClCC/C(C2=CC=CC=C2)=C(C3=CC=CC=C3)/C1=CC=C(C=C1)OCCN(C)C.OC(C(O)=O)(CC(O)=O)CC(O)=O, 0 +[Na+].[O-]S(=O)(=O)c4ccc(c1c3cc(C)c(cc3[o+]c2cc(c(C)cc12)N(CC)CC)N(CC)CC)c(c4)S([O-])(=O)=O, 0 +Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl, 1 +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl, 1 +C1(=C(C=C(N)C=C1)[N+](=O)[O-])NCCO, 0 +ClC(C(Cl)Cl)(Cl)Cl, 1 +O=CC(\Cl)=C(\Cl)C(O)=O, 0 +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC, 1 +C1(C(=CC=C(C=1)NC(C(C)=C)=O)Cl)Cl, 0 +C([O-])(=O)CN(CC(=O)O)CCN(CC([O-])=O)CC([O-])=O.[Na+].[Na+].[Na+].[H]O[H].[H]O[H].[H]O[H], 0 +ClC1(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 0 +OC1=CC(=CC=C1)O, 0 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 +O=C1C2=C(C=CC=C2)C(=O)C(=C1Cl)Cl, 0 +ClC(C(Cl)(Cl)Cl)(Cl)Cl, 1 +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CC(=O)O)C)C)C, 0 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 +O=[N+](C1=CC(=C(C(=C1)Cl)N)Cl)[O-], 0 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 +NC1=C(C=C(C=C1Cl)N)Cl, 1 +OC(=O)C(Cl)Cl, 1 +OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl, 0 +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)C)C)C)C, 1 +ClC#CCl, 1 +C12C(C3C(CC1C3)NC(N(C)C)=O)CCC2, 0 +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N, 1 +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)CCCCCCCCCCCCCCC)C)C)C, 0 +C1N2CN3CN(C2)CN1C3, 0 +BrC(Br)Br, 1 +CCCC/C=N/N(C=O)C, 1 +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45, 0 +N1=C(N=C(N(CO)CO)N=C1N(CO)CO)N(CO)CO, 1 +O=C(OCC)C4=C(C=CC=C4)C(C(C=C(C)C(NCC)=C3)=C3O1)=C(C=C2C)C1=C/C2=N/CC.Cl, 0 +ClC1=C(C=CC=C1)Cl, 0 +FC(C(F)Cl)(OC(F)F)F, 0 +[O-][N+](=O)C1=C(Cl)C(=C(Cl)C(=C1)[N+]([O-])=O)Cl, 0 +CCCCCNN.[H]Cl, 1 +ClC1=CC=C(C=C1)Cl, 1 +CCCCC/C=N/N(C=O)C, 1 +C(C(F)(Cl)Cl)(F)(F)Cl, 0 +O=C(CN=C2C3=CC=CC=C3)NC1=C2N(N=C1C)CC, 1 +ClC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)Cl)N, 1 +ClC(C(=O)O)(Cl)Cl, 1 +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl, 0 +OC(=O)\C=C/C(O)=O.C(C(C1CCCCC1)C2CCCCC2)C3CCCCN3, 0 +FC(F)Cl, 0 +O=S(O)(O)=O.O[C@@H]([C@H](C)NC)[C@@]1=CC=CC=C1.O[C@@H]([C@H](C)NC)[C@@]2=CC=CC=C2, 0 +NC1=C(C=C(C=C1Cl)Cl)Cl, 1 +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl, 1 +CN1CC[C@H]2OC(=O)C3(C[C@@H](C)[C@@](C)(O)C(=O)OC\C(=C\C1)C2=O)O[C@@H]3C, 1 +ClCC1CO1, 1 +O=C(N(CCCCCC)N=O)N, 1 +O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1, 0 +CC(=O)NC1=CC=C(C=C1)OCC, 1 +C([N+](C)(C)C)CCl.[Cl-], 0 +ClC1=CC2=C(C=C1)OC3=C(C=CC(=C3)Cl)O2, 0 +OC1=C(C=CC(=C1)O)CCCCCC, 0 +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O.O=S(O)(O)=O, 0 +CN1N(C2=CC=CC=C2)C(=O)C=C1C, 1 +FC(F)(Cl)Cl, 0 +ClC(CCl)Cl, 1 +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl, 1 +FCCl, 1 +CC(Cl)Cl, 0 +CCC1CO1, 1 +CC(Cl)(Cl)Cl, 0 +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1, 1 +ClC(Cl)Cl, 1 +ClCCCl, 1 +ClC(=CCl)Cl, 1 +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O, 0 +ClCOC, 1 +ClC1=C(C=CC(=C1)Cl)O, 0 +ClC(=CCl)Cl, 1 +C12=C(C(=O)NS1(=O)=O)C=CC=C2, 0 +OC1(=C(O)C(=O)O[C@H]1[C@@H](C[O-])O).[Na+], 0 +C1(C=CC=CN=1)CCl.Cl, 0 +FC(Cl)(Cl)Cl, 0 +O=C(O[C@H](CC)[C@](O)(C)[C@H](O)[C@@H](C)C2=O)[C@H](C)[C@@H](O[C@H]3C[C@](OC)(C)[C@@H](O)[C@H](C)O3)[C@H](C)[C@H]([C@@](O)(C)C[C@H]2C)O[C@H]1[C@H](O)[C@@H]([N@H+](C)C)C[C@@H](C)O1.[O-]C(CCCCCCCCCCCCCCCCC)=O, 0 +C1(=CC=CN=C1)CCl.[H]Cl, 1 +O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl, 1 +C1(CCNC(NC(N)=N)=N)=CC=CC=C1.[H]Cl, 0 +ClC1=C(OC(C)C(O)=O)C=CC(Cl)=C1, 0 +C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2)=NN=C4, 0 +OC1=C(C=C(C=C1Cl)Cl)Cl, 1 +C=CCC1=CC=C2C(=C1)OCO2, 1 +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC, 1 +ClC1=C(C=C(C=C1)Cl)OC(C(=O)O)C, 0 +ClC1=C(C=C(C(=C1)Cl)Cl)OC(C(=O)O)C, 0 +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+], 1 +O=S(=O)(C1=CC=C(C=C1)Cl)OC2=CC=C(C=C2)Cl, 0 +ClC1=C(C=CC(=C1)Cl)OCC(=O)O, 0 +ClCCN(CCCl)C1=CC=C(CC(OC3=CC=C(C4=C3)[C@]2([H])[C@](CC4)([H])[C@@](CC[C@@H]5OC(CC6=CC=C(N(CCCl)CCCl)C=C6)=O)([H])[C@]5(C)CC2)=O)C=C1, 1 +ClC1=C(C=C(C(=C1)Cl)Cl)OCC(=O)O, 0 +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3, 1 +OC1=CC=CC=C1, 0 +O=C(N(C)C)NC1=CC=C(C=C1)Cl, 1 +ClC1=C(C=CC(=C1)Cl)OCC(=O)OCCCC, 0 +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O, 1 +ClC4=C(C=CC=C4)C2=NC(C)C1=NN=C(C)N1C3=C2C=C(CCC5=CC=C(CC(C)C)C=C5)S3, 0 +O=C([C@H](CO)[C@]2=CC=CC=C2)O[C@@H]1C[C@H](N4C)[C@@H](O3)[C@@H]3[C@@H]4C1.Br.O.O.O, 0 +N1C2=C(C=CC=C2)SC3=CC=CC=C13, 0 +C(N)(=O)OC(C#C)(C1C=CC=CC=1)C2C=CC(=CC=2)Cl, 1 +ClC1=CC(=CC=C1OCC(=O)OC(C)C)Cl, 0 +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl, 1 +ClC1=CC(=C(C=C1SC2=CC=C(C=C2)Cl)Cl)Cl, 0 +ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl, 0 +ClCC(Cl)CCl, 1 +ClC([N+](=O)[O-])(Cl)Cl, 0 +ClC1=C(C=CC(=C1)Cl)OS(=O)(=O)C2=CC=CC=C2, 0 +NC(CCSCC)C(=O)O, 1 +S=C=NC1=CC=CC=C1, 0 +C=C(Cl)C=C, 1 +CC(Cl)CCl, 1 +OCCN(CCO)CCO, 1 +O=P(OC=C(Cl)Cl)(OC)OC, 1 +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O, 1 +O=C1N(C2=CC=CC=C2)N=C(C1)C, 0 +ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N, 1 +O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-], 1 +S=C(S[Se](SC(=S)N(C)C)(SC(=S)N(C)C)SC(=S)N(C)C)N(C)C, 0 +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2, 0 +CC1=CC(NC2=C1C=C(C=C2)OCC)(C)C, 0 +NC1(=CC=C(C=C1)NC2=CC=CC=C2).[H]Cl, 0 +O=NN(C)CCCCCCCCCCCC, 1 +S=C(NC1CCCCC1)NC1CCCCC1, 0 +O=C(OCC)C=C, 1 +O=C(C(C)=C2C)C(C(CCCCCC(O)=O)C1=CC=CC=C1)=C(C)C2=O, 0 +[Se]=S, 1 +OC(=O)CCCC\C=C(\c1cccnc1)c2ccccc2, 0 +O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O, 1 +C13CC(C4C3O4)C2C1C5C(O5)C2, 0 +CCO, 1 +CC1=CC(=C(C=C1C)N)C, 1 +NC(=S)NC1=CC=CC=C1, 0 +C[N+](CCC(C1=CC=C(C=C1)Cl)C2=NC=CC=C2)C.C(\C(=C(/C(=O)[O-])[H])[H])(=O)O, 0 +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45, 1 +[O-]\[N+](CC)=N/CC, 1 +C1=C(C(=CC(=C1N)C)C)C.[H]Cl, 1 +OC1=CC2=C(C=C1)OCO2, 1 +OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2, 1 +C1=CC=CC(=C1)CCN(C)N=O, 1 +O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC, 0 +ClC6C4(Cl)C3C1C5C(C3C2OC12)C4(Cl)C(Cl)(Cl)C56Cl, 0 +[O-]\[N+](CC)=N/C, 1 +ClC1=NC(=NC(=N1)NCC)NCC, 0 +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC, 1 +N(CCCCCCCCCCCCCC)(C)N=O, 1 +C(O)(=O)[O-].[Na+], 0 +NC1=CC(=CC=C1)N, 0 +N(CCCCCCCCCC)(C)N=O, 1 +OCC1=C(C(=C(C(=C1)/N=N/C2=C3C=CC=CC3=C(C=C2)S(=O)(=O)[O-])O)/N=N/C4=C5C=CC=CC5=C(C=C4)S(=O)(=O)[O-])O.[Na+].[Na+], 0 +NC1=CC=C(C=C1)N, 0 +CN(C(=O)N)N=O, 1 +C([N+](C)(C)C)CO.[Cl-], 0 +ClC(C(C1=CC=C(C=C1)CC)C2=CC=C(C=C2)CC)Cl, 0 +C1(=C(C=CC=C1N)N).[H]Cl.[H]Cl, 0 +C1N(C(OC1)=O)N=O, 1 +S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC, 0 +C1(SC2=C(C(=CC(=C2)Cl)Cl)[O-])(=C(C(=CC(=C1)Cl)Cl)[O-]).[Na+].[Na+], 0 +O=C(C)CN(N=O)CCO, 1 +CC(=O)[O-].[O-]C(=O)C.[O-]C(=O)C.[Cr+3], 0 +.[Na+].[Cl-], 0 +N(N)(CC)C=O, 1 +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O, 1 +[Na+].[O-]Cl=O, 0 +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl, 1 +CC1(C2=CC=CC=C2)C(O1)C(=O)OCC, 0 +C1(CSCCNC(NC)=NC#N)=C(C)NC=N1, 0 +O=C([O-])C(C(/C(CC([O-])=O)=C([C@@H](CCC([O-])=O)[C@@H]5C)\N=C5/C=C4\[N-]\C(C(C=C)=C4C)=C3)=N2)=C(C)/C2=C/C1=C(CC)C(C)=C/3[N-]1.[Na+].[Na+].[Na+].[Cu+2], 0 +C1(=CC(=CC=C1N)N).[H]Cl.[H]Cl, 0 +N=C(N(CC)N=O)N[N+]([O-])=O, 1 +C1([C@H](CNC)O)(=CC(=CC=C1)O).[H]Cl, 0 +O=C(C(O)(C2=CC=CC=C2)C1CCCCC1)OC(C)(C)C#CCN(CC)CC.O.Cl, 0 +NC(=O)N(CC)N=O, 1 +O=NN(CC=C1)CC1, 1 +O.[Na+].O.O.CCN(CC)C([S-])=S, 0 +S=C(S[Te](SC(=S)N(CC)CC)(SC(=S)N(CC)CC)SC(=S)N(CC)CC)N(CC)CC, 0 +N(CC(F)(F)F)(CC)N=O, 1 +Cl[O-].[Na+], 0 +C1(=CC=CC=C1)CCNN.S(O)(O)(=O)=O, 1 +ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl, 1 +OC(=O)C=CC=CC, 0 +O(C1=CC=CC=C1)CC2CO2, 1 +OCCBr, 1 +CCC1=CC=CC=C1, 1 +C1C(N(C(CN1N=O)C)C)C, 1 +OC(CNC(C)C)C1=CC=C(NS(=O)(C)=O)C=C1.[H]Cl, 0 +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1, 1 +C(CO)O, 0 +N(CC(CO)O)(CC=C)N=O, 1 +[O-]C12[C@@H](CC[N+](C)1CC=C2COC([C@](OC(C)=O)(C)[C@@H](C)\C=C3C=C)=O)OC/3=O, 1 +S=C(NCC)NCC, 1 +N(CC(C)O)(CC=C)N=O, 1 +NNC1=CC=CC=C1.[H]Cl, 1 +C=CC=C, 1 +NC(CCCN)(C(=O)O)C(F)F, 0 +C1CN1, 1 +N(CC(C)=O)(CC=C)N=O, 1 +CC(CC1=CC=CC=C1)NN.[H]Cl, 0 +CC(C)(C)O, 1 +CC(OC1=CC=C(C=C1)Cl)(C(=O)OCC)C, 1 +O=CNNC=O, 1 +N(CC=C)(CCO)N=O, 1 +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC, 1 +O=C1N2CC3=CC=CC=C3C(=O)N2CC4C=CC=CC1=4, 1 +O=C(N(CCCCC)N=O)OCC, 1 +O=[C@](O[C@H](O[C@H](CO)[C@H]1O)[C@H](O)[C@H]1O)[C@@]5(C)[C@](CC3)([H])[C@](CCC5)(C)[C@@](CC4)([H])[C@@](C2)3C[C@]4(O[C@H]6[C@H](O[C@H]7[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O7)[C@@H](O)[C@H](O)[C@@H](CO)O6)[C@@]2=C, 0 +CCCCCl, 0 +OCCN.O=C(C1=C(C=CC(=C1)Cl)O)NC2=CC=C(C=C2Cl)[N+](=O)[O-], 0 +N(N1CCCCC1C2=CC=CN=C2)=O, 1 +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O, 1 +CC(=O)O[Hg]C1=CC=CC=C1, 0 +OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-], 0 +O=S([N-]C1=O)(OC(C)=C1)=O.[K+], 0 +Cl[C@@]1(C(C)2C)C(Cl)(Cl)C(Cl)([C@](Cl)(C2=C)C1Cl)Cl, 1 +C1=C(C=CC=C1OCC2CO2)OCC3CO3, 1 +N(N)(CCCC)C=O, 1 +C=CC1=CC=CC=C1, 1 +OC1=CC=C(C=C1)C2=CC=CC=C2, 0 +C(C1=CC=C(C=C1)O)(=O)OCCCC, 0 +[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2, 1 +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O, 1 +O=NN(CC(C)O)CC(C)O, 1 +N#[N+]C1=CC=CC=C1.O=S([O-])(O)=O, 1 +C1C(C2=CC=CC=C2)O1, 1 +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl, 1 +O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4, 0 +O=NN(CC(=O)C)CC(=O)C, 1 +O=C1OC(=O)CC1, 0 +O=C1OC2=C(C=CC=C2)CC1, 1 +N(N(CC(F)(F)F)CC(F)(F)F)=O, 0 +CCCCOCCO, 1 +N(CCCCO)(CCCC)N=O, 1 +O[C@H]1[C@H](O[C@H](CO)[C@@H](O)[C@@H]1O)O[C@]2(CO)O[C@H](CO)[C@@H](O)[C@@H]2O, 0 +OC1=CC(C2=NC(N(C(C)C)C3=C2C=CC(C)=C3)=O)=CC=C1, 0 +CCCC1=CC2=C(C=C1)OCO2, 1 +O=NN(C)C2=NC1=CC=C(Cl)C=C1C(C3=CC=CC=C3)=[N+]([O-])C2, 0 +OC1=C(C=C(C=C1C(C)(C)C)CO)C(C)(C)C, 0 +S=C(N(CC)CC)SCC(=C)Cl, 1 +P, 0 +O=NN(/C(=N\C#N)NCCSCC1=C(N=CN1)C)C, 0 +C[C@@H]3O[C@]1(CS3)C2CCN(CC2)C1.C[C@@H]6O[C@]4(CS6)C5CCN(CC5)C4.O.Cl.Cl, 0 +NC(=O)C1=C(C=CC=C1)C(=O)N, 0 +C1(=C(C=CC(=C1)[C@H](CN[C@@H](CCC2=CC=CC=C2)C)O)O)C(N)=O.[H]Cl, 0 +O=NN(CCCC)CCCC, 1 +CC(=C)CCl, 1 +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Cu+2], 0 +O=C1C2=C(C=CC=C2)C(=O)O1, 0 +O=NN(CCO)CCO, 1 +C=C(Cl)C=C, 0 +O=C(N(CCCC)N=O)N, 1 +N1=CC=CC2=CC=CC(=C12)O[Cu]OC3=CC=CC4=CC=CN=C34, 0 +O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C, 1 +S=P(SCC(=O)NC)(OC)OC, 0 +CCN(CC)N=O, 1 +CC(=O)NN, 1 +CC1=C(Cl)C(=O)OC2=C1C=CC(=C2)OP(=S)(OCC)OCC, 0 +CN(N=O)C, 1 +OC(=O)CCl, 0 +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C, 1 +O=C1OC2=C(C=CC=C2)C=C1, 1 +C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2, 0 +ClC1=C(Cl)N=C(C(O)=O)C(Cl)=C1N, 0 +NN(CCCC)CCCC, 1 +COC1=CC(=C(C=C1)N)C, 1 +[O-]S(S(=O)[O-])(=O)=O.[K+].[K+], 0 +OC(CN(C1=CC=C(N=N1)NN)C)C.Cl.Cl, 0 +O=C/C=C/C1=CC=CC=C1, 0 +O[As](O)(C)=O, 0 +CC1CC(OC(O1)C)OC(=O)C, 1 +Cl.CCCCNN, 1 +O=S1(=O)CC=CC1, 0 +c1(n(cnc1)C)C[C@@H]2[C@@H](C(=O)OC2)CC, 0 +[Na+].[O-]C(=O)[C@@H](N)CC(O)=O, 0 +CC1CC(OC(O1)C)OC(=O)C, 0 +N(NCCCC)CCCC.Cl.Cl, 1 +O=NN(C1=CC=CC=C1)C2=CC=CC=C2, 1 +C\1=C/C(O[C@@H](C/C=C/C=C/C=C/C=C/[C@@H](C[C@@H]3O[C@](C[C@H](C[C@H]2O[C@H]/12)O)(C[C@@H]([C@H]3C(O)=O)O)O)O[C@@H]4O[C@@H]([C@H]([C@@H]([C@@H]4O)N)O)C)C)=O, 0 +NC1=CC(=CC=C1OC)C, 1 +NC1=CC=C(/C=C/C2=CC(OC)=CC=C2OC)C=C1, 1 +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2, 1 +OC(=O)CCC(=O)OCC2(CCCC)C(=O)N(c1ccccc1)N(C2=O)c3ccccc3, 0 +C1CNCCN1, 0 +O=C(NC2=C(Cl)C=NC=C2Cl)C1=CC(OC3CCCC3)=C(OC)C=C1, 1 +C1(=CC(=CC=C1N)OC)OC.[H]Cl, 0 +O=NN(CCC)CCC, 1 +CC(C)C(O)(C(C)O)C(=O)OC\C1=C\CN2CC[C@@H](OC(=O)C(\C)=C\C)[C@@H]12, 1 +C1CCNCC1, 0 +[Na+].O=C([O-])[C@@H](N)CCC(O)=O, 0 +CC(C)(C)c1cc(O)ccc1O, 0 +[N+].C1(N(N=O)[O-])=CC=CC=C1, 1 +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O, 1 +O=C3[C@@]2(C)CC[C@]1([H])[C@](CC[C@H](OS(=O)(O)=O)C4)(C)C4=CC[C@]([H])1[C@@]([H])2CC3, 0 +CC(C)CC(=O)O[C@H]1C[C@]2(COC(C)=O)[C@@]4(C)[C@H](OC(C)=O)[C@@H](O)[C@@H](O[C@@H]2/C=C1/C)[C@]34CO3, 1 +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2, 1 +C(CCC(=O)O)([O-])=O.[Na+], 0 +[Ca+2].[N-2]C#N, 0 +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl, 1 +O=NN(CCCCCC1)CCCCCC1, 1 +ClC(=C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC, 0 +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2, 0 +NC(=O)NCCCC, 0 +NC(=N)NC#N, 0 +C1=CC=CC=C1C(O)C(N(C)N=O)C, 1 +S(=O)(=O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2, 0 +O=[N+]([O-])C3=CC=C(O3)/C=N/N1C(O[C@@H](CN2CCOCC2)C1)=O.Cl, 1 +C1(NS(=O)(=O)[O-])CCCCC1.[Na+], 1 +CN(CC)N=O, 1 +CCN(CC)C(=O)C1=CC=CC(C)=C1, 0 +Cl.CC3CCCC(C)N3CCCC(O)(c1ccccc1)c2ccccn2, 0 +O=C1CCCO1, 0 +O=C(N(CC)N=O)OCC, 1 +[Cd+2].[O-]C(C)=O.[O-]C(C)=O, 0 +N=C\2/N=C3/O[C@H]1[C@H](O)[C@@H](CO)O[C@H]1N3/C=C/2, 0 +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C, 1 +[Cl-].[Cd+2].[Cl-], 1 +C([C@@H]1[C@@H]8[C@@H]([C@H]([C@H](O1)O[C@@H]2[C@@H](CO)O[C@@H]([C@@H]([C@H]2O)O)O[C@@H]3[C@@H](CO)O[C@@H]([C@@H]([C@H]3O)O)O[C@@H]4[C@@H](CO)O[C@@H]([C@@H]([C@H]4O)O)O[C@@H]5[C@@H](CO)O[C@@H]([C@@H]([C@H]5O)O)O[C@@H]6[C@@H](CO)O[C@@H]([C@@H]([C@H]6O)O)O[C@@H]7[C@@H](CO)O[C@@H]([C@@H]([C@H]7O)O)O8)O)O)O, 0 +O=NN1CCCCCCC1, 1 +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC, 1 +[Cd+2].[Cl-].[Cl-].[H]O[H], 0 +O=C1CCCCC1, 0 +O(CC1(C)C)C1=O, 1 +C1=C2C(=CC=C1)C=CC=C2, 1 +O=C(C)NCCSP(=S)(OC)OC, 0 +N(C([S-])=S)(CC)CC.[S-]C(N(CC)CC)=S.[Cd+2], 0 +NC(=O)CC1=C2C(=CC=C1)C=CC=C2, 0 +O=S(=O)([O-])[O-].[Cd+2], 1 +O=NN1CCCCCC1, 1 +N1=C(SNC2CCCCC2)SC3=C1C=CC=C3, 0 +C1(NC(CN1N=O)=O)=O, 1 +OC(=O)CC1=C2C(=CC=C1)C=CC=C2, 0 +C1(CCCCC1)N.[H]Cl, 0 +O=P(H)(OC)OC, 1 +O=[C@]([C@@H]1C[C@@H](O)CN1N=O)O, 0 +[Cd+2].[Cd+2].[Cd+2].[O-]S(=O)(=O)[O-].[O-]S([O-])(=O)=O.[O-]S([O-])(=O)=O.O.O.O.O.O.O.O.O, 0 +C1(CCCCC1[N+]).O=S(=O)([O-])O, 0 +N(N(CC(O)=O)CC(O)=O)=O, 0 +O=C1c2c(O)cc(C)cc2C(=O)c3cc(O)cc(O)c13, 0 +NC1=C2C(=CC=C1)C(=CC=C2)N, 1 +OC1=C(C=CC(=C1)/C=C/C(=O)O)O, 1 +P(=O)(OC)(OC)N1CCOCC1, 1 +N(CC(CO)O)(C)N=O, 1 +C1=C(CO)OC=C1, 1 +C12C(=CC=CC=1NCCN)C=CC=C2.[H]Cl.[H]Cl, 0 +C(O)(=O)[O-].[K+], 1 +O=C1C2=C(N=CN2C)N(C(=O)N1C)C, 0 +ClCCN(CCCl)[P]1(=O)NCCCO1, 1 +C1(=CC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)C)C, 1 +CN(CCO)N=O, 1 +O=CCCCC=O, 0 +C1=C2C(=CC=C1NC3=CC=C(C=C3)NC4=CC=C5C(=C4)C=CC=C5)C=CC=C2, 0 +.[K+].[Cl-], 0 +C[C@H](C\C=C\C)[C@@H](O)[C@@H]1N(C)C(=O)[C@H](C(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](NC(=O)[C@H](CC(C)C)N(C)C(=O)CN(C)C(=O)[C@H](CC)NC1=O)C(C)C, 0 +N(N(CCCO)C)=O, 1 +NC(=S)NC1=C2C(=CC=C1)C=CC=C2, 0 +CC(C)NCC(O)COc1ccc(cc1)NC(C)=O, 0 +O=[As](O)(O)[O-].[Na+], 0 +O=C1[C@H]3[C@H](C3)[C@@]([C@]4([H])[C@@]([C@@]5([H])[C@]([C@@](CC5)(OC(C)=O)[C@@](C)=O)(C)CC4)([H])C=C2Cl)(C)C2=C1, 1 +O=C(C1=CC=C(C=C1)C(=O)OC)OC, 0 +CC(O)CN(C)N=O, 1 +[As]21O[As]3O[As](O1)O[As](O2)O3, 0 +O=C(O)[C@H](CS)N.Cl, 0 +CN(C)C(C)=O, 0 +CN(CC(C)=O)N=O, 1 +[Na+].[As](=O)[O-], 0 +C(C(C)O)(O[Ca]OC(C(C)O)=O)=O, 0 +O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+], 1 +O=NN(C)CCOS(C1=CC=C(C)C=C1)(=O)=O, 1 +NC1=CC2=C(C=CC=C2)C=C1, 1 +O.O=C(Nc3cccc1c3O/C(=C\C1=O)C2=N\N\N=N2)c5ccc(OCCCCc4ccccc4)cc5.O=C(Nc3cccc1c3O/C(=C\C1=O)/C=2N\N=N/N=2)c5ccc(OCCCCc4ccccc4)cc5, 0 +O=C(N)C1=C(N=CN1)/N=N/N(C)C, 1 +C1(=C2C(=CC=C1N)C=CC=C2)S(=O)(O)=O, 0 +O=C1N(C2=CC=C(C=C2C(=NC1)C3=CC=CC=C3)Cl)CC4CC4, 0 +OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO, 0 +O=C(CN1C(=O)CCC1)NC2=C(C=CC=C2C)C, 0 +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4, 0 +O=C([C@H](CC1=CC=CC=C1)NC(=O)[C@H](CC(=O)O)N)OC, 0 +CC(OC(=O)OC1CCCCC1)OC(=O)c5cccc6nc(OCC)n(Cc2ccc(cc2)c3ccccc3C\4=N\N=N/N/4)c56, 0 +[Ni], 0 +O=C(CCC(=O)O)NN(C)C, 1 +OC(=O)C1=C(C=CC=C1)OC(=O)C, 0 +C([O-])(C)=O.[O-]C(C)=O.[Ni+2], 0 +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N, 1 +OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)/C=C\[C@]1(C)[C@H]4C(=O)C[C@@]23C, 0 +CN(C1=CC=CC=C1)N=O, 1 +O=C1CCCCCN1, 0 +ClC(C(C1=C(C=CC=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 0 +C1=CC=C(C(C(=O)OC)C2N(N=O)CCCC2)C=C1, 0 +S=C(N(CCCC)CCCC)S[Ni]SC(=S)N(CCCC)CCCC, 0 +OC1=C(C=C(C=C1)CNC(=O)CCCC/C=C/C(C)C)OC, 1 +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 1 +CC1=CC=CC=C1OCC(O)CNCCN2/C=C(/C)C(=O)NC2=O.[H]Cl, 0 +CN(CCCCCCCCCCC)N=O, 1 +O=S(=O)([O-])[O-].O.O.O.O.O.O.[Ni+2], 0 +C1=CC=C5C(=C1)N(CC2=CC=C(F)C=C2)C(NC4CCN(CCC3=CC=C(OC)C=C3)CC4)=N5, 0 +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2, 1 +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 1 +O=NN1CCOCC1, 1 +NC(=O)C1=CC=CN=C1, 0 +CC(C)NCC(O)COC1(=CC=C(C=C1)CC(=O)N).[H]Cl, 0 +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl, 1 +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl, 1 +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O, 1 +ClC1=NC(=NC(=N1)NC(C)C)NCC, 1 +C(NN)(N)=O.Cl, 1 +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br, 1 +O=NN(CCC1)C(C1)C(=O)O, 0 +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1, 0 +O=C(O[C@@H]2C[C@@H](CC3)N(C)[C@H]3C2)C(CO)C1=CC=CC=C1, 0 +NC(=O)NNC1=CC=CC=C1, 1 +O=NN(CCN1)CC1, 1 +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1.Cl, 0 +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl, 1 +O[As](=O)(C1=CC=C(C=C1)NC(=O)N)O, 0 +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl, 1 +NC(N3C)=NC2=C3C(C)=CC1=NC=CC=C12, 1 +OC(=O)C1=CC=CN=C1, 0 +CC(=O)O[C@H]1[C@@H]([C@H](O[C@H]([C@@H]1OC(=O)C)COC(=O)C)S[Au]=P(CC)(CC)CC)OC(=O)C, 0 +O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3, 1 +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N, 1 +O=C(C1=CC=CN=C1)NN, 1 +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O, 1 +C12C3=C(C=CC=C3)NC1=CC=CC=2, 1 +N1(C2C(SC3=C1C=CC=C3)=CC=CC=2)CC(N(C)C)C.[H]Cl, 0 +O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C, 0 +O=NN1CCCCC1, 1 +C1=CC=C2C(=C1)C=C(C=C2)C(CNC(C)C)O, 0 +OC(C(C=CC=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=C(C)S3)=O, 0 +CC(=O)O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3, 1 +O=NN1CCC[C@H]1[C@@](O)=O, 0 +C12=C(C=CC(=C1)C(CNC(C)C)O)C=CC=C2.[H]Cl, 0 +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O, 1 +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O, 1 +Br/C(Br)=C/[C@H]3[C@@H](C(=O)O[C@H](C#N)c2cccc(Oc1ccccc1)c2)C3(C)C, 0 +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O, 1 +O=NN1CCCC1, 1 +O=S1(=O)CCCO1, 1 +OC(CC(C1)C)C(C1)C(C)C, 0 +O=[N+]([O-])[O-].[Na+], 0 +ClC(Cl)(Cl)Cl, 1 +CC1SC(SC(N1N=O)C)C, 1 +ClC1=NC(=NC(=N1)NC(C)C)NC(C)C, 0 +N(C(=O)N)(N=O)CC(=O)O, 1 +O=NN1CCSCC1, 1 +O=C1CCO1, 1 +[O-][N+](C1=CC=CC(C2C(C(OC3CN(C(C5=CC=CC=C5)C4=CC=CC=C4)C3)=O)=C(NC(C)=C2C(OC(C)C)=O)N)=C1)=O, 0 +BrC(C(=O)NC(=O)N)(CC)CC, 0 +CC1=C(C=CC=C1)N=O, 1 +OC(COC1=CC=CC2=C1C=CC=C2)CNC(C)C.[H]Cl, 0 +SC1=NC2=C(C=CC=C2)S1, 1 +OC(=O)CN(CC(=O)O)CC(=O)O, 1 +[Na+].[N-]=[N+]=[N-], 0 +CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C, 0 +N#[N+][O-], 0 +O=C(N(CCCC)CC)SCCC, 0 +[S-]C1=NC(C=CC=C2)=C2S1.[S-]C3=NC(C=CC=C4)=C4S3.[Zn+2], 0 +O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC, 0 +C1(/N=N/C2=CC=CC=C2)=CC=CC=C1, 1 +N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O, 1 +C[N+](=NC)[O-], 1 +O=C1C[C@H](C\C=C1\C)C(C)=C, 0 +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1, 0 +O=N[O-].[Na+], 1 +[N+](=N/CCC)(/CCC)[O-], 1 +OC1=C(C=CC=C1)O, 1 +CC(N(C1=CC=CC2=C1CC3=C2C=CC=C3)C(C)=O)=O, 1 +S=C1NC=NC2=C1N=CN2, 0 +O=[N+](C1=CC(=C(C=C1)OC)N)[O-], 1 +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2, 1 +C1(=C(C=CC(=C1)NC(N(CC)CC)=O)OCC(CNC(C)(C)C)O)C(C)=O, 0 +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-], 1 +CC(=O)NNC(=O)C, 0 +COc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C)c4cc3, 0 +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O, 1 +[O-][N+](C3=CC=C(O3)C1=CN=C2N1C=CC=C2)=O, 1 +O=C(C1=C(C=CC=C1)C(=O)OCC=C)OCC=C, 0 +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl, 0 +CN(C)CCN(CC1=CC=CO1)C2=CC=CC=N2, 0 +N(N)(CC=C)CC=C, 1 +CC(=O)[O-].[O-]C(=O)C.[Ba+2], 0 +N(NCC=C)CC=C.[H]Cl.[H]Cl, 1 +CN(C)CCN(CC1=CC=CS1)C2=CC=CC=C2, 0 +O=C(C)NCC1=NC(=NO1)C2=CC=C(O2)[N+]([O-])=O, 1 +[Cl-].[Ba+2].[Cl-].O.O, 0 +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl, 1 +C=CCN(CC=C)N=O, 1 +C(C\C=C/CCCCCCCC)CCCCCC(=O)[O-].[Na+], 0 +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl, 1 +NC2=NC(C3=CC=CC=C3)=C(CCOCC)C1=NC=NN12, 1 +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O, 1 +NC1C=CC2=C(N=1)NC3=CC=CC=C23, 1 +O=C(C1=CC(=CC=C1O)/N=N/C2=CC=C(C=C2)C(=O)O)O, 0 +C1(=C(/C=C/C2=C(S(=O)(=O)[O-])C=C(C=C2)N)C=CC(=C1)N)S(=O)(=O)[O-].[Na+].[Na+], 0 +CC1=C(SSC1=S)C2=CN=CC=N2, 0 +[O-][N+](C2=CC=C(O2)C1=CSC=N1)=O, 1 +CC=O, 1 +O=CC1=CC=CC=C1, 1 +O=C1C(=C(C(=O)C(=C1Cl)Cl)Cl)Cl, 0 +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O, 1 +N/1C(N(\C=C\1)C)=S, 1 +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O, 1 +CC=NN(C)C=O, 1 +C1=CC=CC=C1, 1 +ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12, 1 +NC1=CC=C(C=C1)/N=N/C2=CC=C(C=C2)N, 0 +NC(C(=O)O)CCSC, 0 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O, 1 +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O, 1 +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C, 0 +CC(=O)N, 1 +NC1=CC=C(C2=CC=C(N)C=C2)C=C1, 1 +O=S(C1=NC2=C(C=CC(=C2)OC)N1)CC3=C(C(=C(C=N3)C)OC)C, 1 +NC2=CC=C(C(OC)=C2)\N=N/C1=CC=CC=C1, 0 +C1(=CC=C(C=C1)O)NC(C)=O, 1 +C1(C2=CC=C(C=C2)N)=CC=C(C=C1)N.[H]Cl.[H]Cl, 1 +O[As](=O)(C1=CC(=C(C=C1)O)[N+](=O)[O-])O, 0 +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2, 0 +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5, 1 +C12(=C(C=C(C=C1C=CC(=C2/N=N/C3=CC=CC=C3)O)S(=O)(=O)[O-])S(=O)(=O)[O-]).[Na+].[Na+], 0 +NC1=C(C=C2C3=C(C=CC=C3)OC2=C1)OC, 1 +O=[N+](C1=CC(=C(C=C1)N)N)[O-], 0 +O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].Cl[O-].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+], 0 +CC#N, 0 +ClC(C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)(Cl)Cl, 0 +O=[N+](C1=CC(=C(C=C1)C)N)[O-], 1 +C1(=CC=CC=C1)C(=O)[O-].[Na+], 0 +C1=COC2=C1C=CC=C2, 1 +ClCl, 0 +O=C(C(=NOC(=O)NC)SC)N(C)C, 0 +COC1=CC=C(C=C1)O, 1 +NC1=NC(=NC(=N1)N)C2=CC=CC=C2, 0 +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3, 1 +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-], 1 +C1=CC=C(C(OC)C(=O)O)C=C1, 0 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)Cl, 1 +O=C(C)NC3=CC=C(C2=C3)C1=C(C2=O)C=CC=C1, 1 +O=[N+](C1=CC=C(C=C1)N)[O-], 0 +N(NC(C)=O)C1=CC=C(C=C1)CO, 1 +C1=CC=CC(=C1)C(C(C2=CC=CC=C2)=O)O, 0 +O=C1OC(O)C(C(Cl)Cl)=C1Cl, 1 +N(NC(C)=O)C(C1=CC=NC=C1)=O, 1 +O=C1C=CC(=O)C=C1, 1 +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2, 1 +COC1=C(C=CC=C1)[N+](=O)[O-], 1 +O=C1C(C(=O)OC(=C1)C)C(=O)C, 0 +N1=C(SSC2=NC3=C(C=CC=C3)S2)SC4=C1C=CC=C4, 0 +ClC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-], 0 +[O-]\[N+](C)=N/CC, 1 +O=[N+](C1=CC(=C(C=C1)C(=O)O)N)[O-], 0 +C1(NNC(C)=O)=CC=CC=C1, 1 +N1C2=C(C=CC=C2)N=N1, 0 +CC(=C)CCl, 1 +O=C(N(CC(C)=O)N=O)NCCCl, 1 +N[C@@H](C\C1=C\N=C/N1)C(O)=O.Cl, 0 +CBr, 0 +O=[N+](C1=CC=CC=C1)[O-], 1 +ClC(C1=CC=CC=C1)(Cl)Cl, 1 +N(C(=O)N)(N=O)CC(C)=O, 1 +CC(OC)(C)C, 1 +O=[N+](C1=CC2=C(C=C1)NC=N2)[O-], 1 +O=C(C1=CC=CC=C1)NN, 1 +NN, 1 +NC(=O)OC, 1 +ClC1=C(C=CC=C1)[N+](=O)[O-], 1 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O, 1 +OC(CNC(C)C)COC1=CC=CC=C1OCC=C.Cl, 0 +OS(=O)(=O)O.NN, 1 +O=C(NN)OC, 0 +O=[N+](C1=CC=C(C=C1)Cl)[O-], 1 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N, 1 +C1(N=C(SC=1)NN)C2=CC=C(C=C2)N, 1 +O=C(C(C)(OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl)C)OC, 1 +Cl.O=P1(OCC(C)(C)CO1)C\4=C(/C)NC(/C)=C(/C(=O)OCCN(Cc2ccccc2)c3ccccc3)C/4c5cccc(c5)[N+]([O-])=O.CCO, 0 +NC1=C(C=CC(=C1)N)Cl, 1 +S=C(N1CCOCC1)SN1CCOCC1, 1 +NNC1=NC(=CS1)C2=CC=C(O2)[N+]([O-])=O, 1 +[K+].C1(=CC=C2C(=N1)N(C=C(C2=O)C([O-])=O)C)/C=C/C3=CC=C(O3)[N+]([O-])=O, 1 +O=[N+](CC)[O-], 0 +CC(=O)OCC1=CC=CC=C1, 1 +NC1=C(C=CC(=C1)Cl)N, 1 +N1=C(SC2=C1C=CC=C2)SN3CCOCC3, 0 +NNC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1, 1 +OCC1=CC=CC=C1, 0 +Nc1cc(Cl)c(N)cc1.OS(O)(=O)=O, 0 +O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.Cl, 0 +O=C(O)Cc1ccc(cc1)NC(C)=O, 0 +ClCC1=CC=CC=C1, 1 +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-], 1 +ClC1=C(C=CC(=C1)N)C, 0 +O=C(OC)C1=C(C)NC(C)=C(C(OCC(C)(C)CN(CC3=CC=CC=C3)C)=O)C1C2=CC([N+]([O-])=O)=CC=C2F.Cl, 0 +[O-][N+](=O)c1ccc2c3ccccc3Cc2c1, 1 +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-], 1 +NC1=CC(=CC=C1C)Cl, 1 +CN(N)C=O, 1 +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-], 1 +C1(=CC=C(NN)C=C1)C(O)=O.[H]Cl, 1 +C=CC=O, 0 +C1(=C(C=CC(=C1)Cl)N)C.[H]Cl, 1 +O=C(C3)C(C(O)=CC(O[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]5[C@H](O)[C@H](O)[C@@H](O)[C@H](C)O5)O4)=C2)=C2O[C@@H]3[C@@]1=CC(OC)=C(OC)C=C1, 0 +[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O, 1 +C=CC(OCC)OCC, 0 +C(CCl)(F)(F)F, 1 +N(C1=CC=CC=C1)NC2=CC=CC=C2, 1 +C=C/C=N/O, 0 +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O, 1 +NC(=O)Cc2c([O-])on[n+]2Cc1ccccc1, 1 +ClC(Cl)C(F)(F)F, 1 +O=C(C(=C)C)OC, 0 +NC(=O)C=C, 1 +[Be+2].O=S(=O)([O-])[O-], 0 +O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1, 0 +CS(=O)(=O)OC, 1 +[O-][N+](C)=O, 1 +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C, 1 +OC(=O)C=C, 0 +OCC(=O)[C@@]2(O)CC[C@H]3[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4[C@@H](O)C[C@]23C, 0 +N=C(N(N=O)C)N[N+](=O)[O-], 1 +O=[N+](C1=C2C(=CC=C1)C=CC=C2)[O-], 0 +ClC1=NC(SCC(NCCO)=O)=NC(NC2=CC=CC(C)=C2C)=C1, 1 +C=CC#N, 1 +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-], 1 +O=C(OCC2=CC=CC(C3=CC=CC=C3)=C2C)C1C(C)(C)C1/C=C(Cl)/C(F)(F)F, 0 +OC1=CC=C(C=C1)O, 1 +C1=C(C=CC=C1)C2=CC=CC=C2, 0 +O=C(C1=CC=CC=C1)CCl, 0 +OC1=CC=C(C=C1)OCC2=CC=CC=C2, 0 +OC(=O)C(C)(C)CCCOc1ccc(OCCCC(C)(C)C(O)=O)c(c1)c2ccccc2, 1 +ClCC(=O)C1=CC=C(NC(=O)C)C=C1, 0 +O=[N+](CCC)[O-], 0 +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C, 1 +NC1=CC=C(C=C1)Cl, 0 +CC([N+](=O)[O-])C, 0 +NC(=O)CCCCC(=O)N, 0 +OCC(CO)(CBr)CBr, 1 +C1(=CC=C(Cl)C=C1)N.[H]Cl, 1 +C(C1C=CC=CC=1)(=O)N(N=O)C, 1 +OC(=O)CC[N+](=O)[O-], 0 +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2, 1 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1, 1 +C1C(CC(CC1(OOC(C)(C)C)OOC(C)(C)C)(C)C)C, 0 +ClC1=CC=CC=C1C=C(C#N)C#N, 0 +C1(=CC(=CC(=C1N)C)C)C.[H]Cl, 1 +CN(N=O)C(=O)NCCC[C@H](N)C(O)=O, 1 +O=[N+](C1=CC=C2C3=C4C(=CC=C13)C=CC=C4C=C2)[O-], 1 +CCCC[Sn](O[Sn](CCCC)(CCCC)CCCC)(CCCC)CCCC, 0 +O=[N+](C1=CC2=CC=CN=C2C=C1)[O-], 0 +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC, 1 +CC(CCl)OC(C)CCl, 1 +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC, 1 +O=[N+](C1=CC=CC2=CC=CN=C12)[O-], 1 +O=C1C2=C(C=CC=C2C(=O)C3=C1C=CC=C3)O, 1 +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OC)OC, 0 +N(CCCC(F)(F)F)(CCCC(F)(F)F)N=O, 1 +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl, 0 +CC(C1=C(C(=C(C(=C1[N+](=O)[O-])C)[N+](=O)[O-])C)[N+](=O)[O-])(C)C, 1 +O=C1N(CCC1)C, 1 +N1C(N(CC(C1=O)C)N=O)=O, 0 +CC(C=NOC(=O)NC)(SC)C, 0 +[O-][N+](C1=CC([N+]([O-])=O)=CC([N+]([O-])=O)=C1)=O, 0 +CNC1=NC=NC2=C1N=CN2, 0 +O=NN1CCC(=O)NC1=O, 1 +O=C(N(CCO)N=O)NCC, 1 +O=[N+](OC(CO[N+](=O)[O-])CO[N+](=O)[O-])[O-], 1 +O[C@H]([C@@H]2O)[C@@H](O[C@@H]2CO)N1C(N=CN=C3NC)=C3N=C1, 0 +O=C(N(CCO)N=O)N, 1 +CC(=O)O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3, 0 +O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3, 0 +ClCOCCl, 1 +N(CC(CO)O)(CC(O)C)N=O, 1 +O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.[Mg+2], 1 +N(CC(CO)O)(CC(C)=O)N=O, 1 +O=C1C(NC(=O)N1)NC(=O)N, 0 +CC(C/C=N/N(C=O)C)C, 1 +O=C(N(CCCO)N=O)N, 1 +CC3=CC=C(C=C3)\C(C2=CC=CC=N2)=C/CN1CCCC1.O.Cl, 0 +C=CCO, 0 +C1=CC=C2C(=C1)N=C(N=C2N(CCO)CCO)C3=CC=C(S3)[N+]([O-])=O, 1 +OC1=C(C=CC(=C1)C)O, 1 +O=P(OCCCl)(OCCCl)OCCCl, 1 +C=CCCl, 0 +OC1=CC=CC2=CC=CN=C12, 0 +O=C(N(CCO)N=O)NCCCl, 1 +OC(C=C)C1=CC=C2OCOC2=C1, 1 +Oc1ccc(C[C@](C)(N)C(O)=O)cc1O.OC(=O)[C@@](C)(N)Cc1cc(O)c(O)cc1.O.O.O, 0 +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br, 1 +C1CO1, 1 +C1(=C(C=CC(=C1)CCNC)OC(C(C)C)=O)OC(C(C)C)=O.[H]Cl, 0 +O=C(N(CC(C)O)N=O)NCCCl, 1 +O=C(CC(C)C)OCC=C, 1 +S=C1NCCN1, 1 +C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1, 1 +ClC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N, 1 +N(CC(C)O)(CCO)N=O, 1 +NC(=O)N(CC=C)N=O, 1 +O=C1NCCN1, 0 +FC(F)(F)CNC(=N)Nc1ccn(CCCCC(N)=O)n1, 1 +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O, 1 +[Na+].[Na+].S=C(NCCNC(=S)[S-])[S-], 0 +CS(=O)(=O)OCCCNCCCOS(C)(=O)=O.[H]Cl, 0 +CC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)C)N, 1 +S=C(N(C)C)S[Bi](SC(=S)N(C)C)SC(=S)N(C)C, 0 +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O, 1 +N(CC(=O)[O-])CC(=O)O.[Na+], 0 +ClCCl, 1 +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1, 1 +C=CCNN.HCl, 1 +C(C1C=CC(=CC=1)O)(C2=CC=C(C=C2)O)(C)C, 0 +O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2, 0 +CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC, 1 +OC(=O)CC1=CNC2=C1C=CC=C2, 0 +O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+], 0 +C12C(=C(C=CC=1NC(C)=O)S(=O)(=O)[O-])C=C(C(=C2O)/N=N/C3=C4C(=C(C=C3)/N=N\C5=CC=C(C=C5)S(=O)(=O)[O-])C=CC(=C4)S(=O)(=O)[O-])S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+], 0 +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC, 1 +O=C(NC2=C1C=C(C3=NNC(CC3)=O)C=C2)C1(C)C, 1 +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N, 1 +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+], 1 +OC1=C(C=C(C=C1C(C)(C)C)C)CC2=CC(=CC(=C2O)C(C)(C)C)C, 0 +O=S(C1=C(/N=N/C2=CC=C(C3=CC=C(\N=N/C4=C(S(=O)([O-])=O)C=C5C(C(N)=CC(S(=O)([O-])=O)=C5)=C4O)C=C3)C=C2)C(O)=C(C(N)=CC(S(=O)([O-])=O)=C6)C6=C1)([O-])=O.[Na+].[Na+].[Na+].[Na+], 1 +O=[W](=O)([O-])[O-].[Na+].[Na+], 0 +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl, 1 +CCNN.[H]Cl, 1 +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl, 1 +C12C(=CC(=C(C=1O)/N=N/C3=C(C=C(C=C3)C4=CC(=C(C=C4)/N=N/C5=C(C=C6C(=C5O)C(=CC(=C6)S(=O)(=O)[O-])N)S(=O)(=O)[O-])OC)OC)S(=O)(=O)[O-])C=C(C=C2N)S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+], 1 +O=C(N(CC)N=O)NCCO, 1 +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+], 1 +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1, 1 +O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N, 1 +O=C(O[C@H](CC)C(/C=C(C)/C=C/C4=O)CO[C@H](O[C@H](C)[C@H]2O)[C@H](OC)[C@@H]2OC)C[C@@H](O)[C@H](C)[C@H]([C@@H](CC=O)C[C@H]4C)O[C@H]1[C@H](O)[C@@H](N(C)C)[C@H](O[C@H](O[C@@H](C)[C@@H]3O)C[C@@]3(C)O)[C@@H](C)O1.OC(C)C(O)=O, 0 +O=C(N(CC)N=O)NCC(=O)C, 1 +CNN, 1 +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N, 1 +O=S(=O)(C1=C(C=CC=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+], 0 +O=C1NC(=O)NC=C1, 1 +N#CN(CC)N=O, 1 +IC(I)I, 0 +N(C)[N+].S(=O)(=O)([O-])O, 1 +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N, 1 +COc3ccccc3N2CCN(CCCN\C1=C\C(=O)N(C)C(=O)N1C)CC2, 0 +O=C(NCCCN(CC)CC)CN1N=CC(C3=CC=CC=C3)=C1C2=CC=CC=C2.O=C(O)/C([H])=C([H])/C(O)=O, 0 +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1, 1 +C(N)(N)=O, 0 +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C, 1 +CC1=C2C(=CC=C1)C=CC=C2, 0 +C1(=C2/C(C3=CC(S(=O)(=O)[O-])=CC=C3N2)=O)/C(C4=CC(S(=O)(=O)[O-])=CC=C4N1)=O.[Na+].[Na+], 0 +NC(=O)OCC, 1 +CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O, 0 +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C.[H]Cl, 1 +CC2=CC1=CC=CC=C1C=C2, 0 +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O, 1 +O=S(=O)([O-])[O-].[V+2]=O, 0 +CCC1(C2=C(C3=C(C(=CC=C3)CC)N2)CCO1)CC(=O)O, 0 +O=C(O[C@@H]1CC[N+]2([O-])[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C, 1 +CN[N+](=O)[O-], 1 +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1, 1 +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1, 1 +C1(=C(C=CC(=C1)N(CCO)CCO)NCCO)[N+]([O-])=O, 0 +OC1=C(C=C(C=C1)CC=C)OC, 0 +C1(C(OCC(C)C)=O)=CC=C(O)C=C1, 0 +OB(O)O, 0 +Cl.N#Cc1ccc(cc1)C3CCCc2cncn23, 0 +Br(=O)(=O)[O-].[K+], 1 +C(CCCN(N=O)C)(O)C1C=NC=CC=1, 1 +O=CCBr, 0 +O=C(C1=CC=CN=C1)CCCN(N=O)C, 1 +CC(=O)OC=C, 1 +[Na+].CN(C)c1ccc(/N=N/S([O-])(=O)=O)cc1, 0 +CC(CON=O)C, 1 +C=CBr, 1 +O.O.O.O.NC(=O)[C@@H]3CCCN3C(=O)[C@@H](NC(=O)[C@@H]1CC(=O)N(C)C(=O)N1)C\C2=C\N=C/N2, 0 +O=[N+](C1=CN=C(S1)N)[O-], 1 +ClC(Cl)Br, 1 +O=NN(C)C1=NC=NC2=C1N=CN2[C@@H]3O[C@H](CO)[C@@H](O)[C@H]3O, 1 +NC(=O)OC=C, 1 +CC/C(C2=CC=CC=C2)=C(C1=CC=CC=C1)/C(C=C3)=CC=C3OCCN(C)C.OC(C(CC(O)=O)(O)CC(O)=O)=O, 1 +CCBr, 1 +S=P(OC1=CC(=C(C=C1)SC)C)(OC)OC, 0 +FC(C(OC(F)F)Cl)(F)F, 0 +C=CCl, 1 +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N, 1 +O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N, 0 +O=C(NCO)C=C, 1 +C=CF, 1 +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C, 1 +.[Cl-].[Fe+3].[Cl-].[Cl-], 0 +COC1C=C(C=CC=1C2NC3=CN=CC=C3N=2)S(C)=O, 1 +C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl, 1 +NCCS(O)(=O)=O, 0 +[Fe+3].O=C([O-])CC(O)(CC(=O)[O-])C([O-])=O.O.O.O.O, 0 +O=C(C1=CC=NC=C1)NN, 1 +CC1=CC2=CC=CN=C2C=C1, 0 +O=C(N1)N(C2OCCC2)C=C(F)C1=O, 0 +N(C)(C)C([S-])=S.[Fe+3].[S-]C(=S)N(C)C.[S-]C(=S)N(C)C, 0 +NC(=O)C1=CC=NC=C1, 0 +CC1=CC=CC2=CC=CN=C12, 0 +C=C(Cl)Cl, 1 +Cl/C2=C(\Cl)C3(Cl)C1C(Cl)OC(Cl)C1C2(Cl)C3(Cl)Cl, 0 +OC(=O)C1=CC=NC=C1, 0 +C=CC1=CC=C(C=C1)C, 0 +C=C(F)F, 0 +C1(C(NCC2CCCCN2)=O)=C(C=CC(=C1)OCC(F)(F)F)OCC(F)(F)F.CC(=O)O, 0 +COC1=C(O)C=CC(=C1)C=NNC(=O)C2=CC=NC=C2, 1 +NC1=CC=C(C=C1)C2=CC=CC=C2, 1 +CC1(CC(=CC(=O)C1)C)C, 1 +CN1C2=CC=C(C=C2C(=NC(C1=O)O)C3=CC=CC=C3)Cl, 0 +O=C(NC1=CC=CC(=C1)C(F)(F)F)N(C)C, 0 +NC3=CC1=C(C=C3)OC2=C1C=CC=C2, 1 +O=C1N(C=C)CCC1, 1 +CN1CCN(CC1)/C2=N/C3=CC=CC=C3SC4C=CC(C)=CC2=4, 0 +O=C(C(F)(F)F)NC1=CC3=C(C2=CC=CC=C2C3)C=C1, 1 +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+], 1 +ClCCN[P]1(=O)OCCCN1CCCl, 1 +N1(C(=CN=C1C)[N+](=O)[O-])CCO, 1 +OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1, 0 +O[C@H]1[C@@H](NC(CO)CO)C[C@](O)(CO)[C@@H](O)[C@@H]1O, 0 +CC(=C)C=C, 1 +CC1=C(C(=CC(=C1)OC(=O)NC)C)N(C)C, 0 +C1(N=CNN=1)N, 1 +O=C(OC)C1=C(C)NC(C)=C(C(OCCC3=CC=C(N4CCN(C(C6=CC=CC=C6)C5=CC=CC=C5)CC4)C=C3)=O)C1C2=CC([N+]([O-])=O)=CC=C2.Cl.Cl, 0 +[Na+].[F-], 0 +OC(C)C, 0 +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C, 1 +OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C, 0 +OC(=O)CCCCCCCCCCN, 1 +NC2=CC=C(C=C2N)C1=CC=C(N)C(N)=C1.Cl.Cl.Cl.Cl, 1 +NC1=CC=C(C=C1)C2=CC=C(C=C2)F, 1 +CC(OC1=CC=C(C=C1)NC2=CC=CC=C2)C, 0 +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl, 1 +Cl.CC(C)(C)NCC(O)COc1cccc(C)c1C, 0 +Clc1c([N+]([O-])=O)c(Cl)c(Cl)c(OC)c1Cl, 0 +Cl.CC(=O)O[C@@H](CC)C(C[C@H](C)N(C)C)(c1ccccc1)c2ccccc2, 1 +O=C(NC1=CC=CC(=C1)Cl)OC(C)C, 0 +CC(C)C=O, 0 +ClC1=CC(=C(C=C1C2=C(C=C(C(=C2)Cl)N)Cl)Cl)N, 0 +O=C(C(C1=CC=CC=C1)(C2=CC=CC=C2)CC(N(C)C)C)CC.[H]Cl, 0 +N(=C(C=1)C)N(C(C)C)C=1OC(=O)N(C)C, 0 +C1(C[C@H]([C@@H]([C@H]1CCCCCCC(=O)OC)/C=C/CC(O)(CCCC)C)O)=O, 0 +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2, 1 +CN(C)CNc2nnc(/C=C/c1ccc(o1)[N+]([O-])=O)o2, 1 +O=C1C(=CNC(=O)N1)F, 1 +O=C(NC1=CC=CC=C1)OC(C)C, 0 +O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H], 1 +CC(=O)O[C@@H]3CC(=O)O[C@H](C)C\C=C\C=C\[C@H](O)[C@H](C)C[C@H](CC=O)[C@H](O[C@@H]2O[C@H](C)[C@@H](O[C@H]1C[C@@](C)(O)[C@H](OC(=O)CC(C)C)[C@H](C)O1)[C@H](N(C)C)[C@H]2O)C3OC, 0 +O=S(=O)(C1=CC(=C(C=C1Cl)Cl)Cl)C2=CC=C(C=C2)Cl, 0 +C1=C(C(=C(C=C1O)C)N(C)C)C, 0 +C(NC)CC(OC1=CC=C(C=C1)C(F)(F)F)C2=CC=CC=C2.[H]Cl, 0 +C/C=C/C1=CC2=C(C=C1)OCO2, 0 +O=[Mo](=O)=O, 1 +[N+].[O-], 0 +C1(C(=CC=C(C=1)C)C)N.[H]Cl, 1 +ClC(CCl)(Cl)Cl, 1 +O=C1N(C2=CC=CC=C2)N(C(=C1N(C)C)C)C, 0 +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC=C(C=C3)O, 0 +O=C1C(O)=COC(CO)=C1, 1 +ClC(C(Cl)Cl)Cl, 1 +C=O, 1 +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C, 0 +CC(=C)C#N, 0 +ClC(=C(Cl)Cl)Cl, 1 +O=NN(CCN(C)C)C(=O)[NH2+]CC.[O-]N=O, 1 +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O, 0 +O=C(O)COC1=C(C)C=C(Cl)C=C1, 0 +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C, 1 +O=C(N(CCCCC)N=O)N, 1 +CCC(C)=NO, 1 +C1=CC=C(NC(=O)C(/N=N/C2=C(Cl)C=C(C3=CC(Cl)=C(/N=N/C(C(=O)NC4=CC=CC=C4)C(=O)C)C=C3)C=C2)C(=O)C)C=C1, 0 +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl, 1 +O(C)c1cc(CC=C)ccc1OC, 1 +ClC1=CC(Cl)=C(/N=N/C(C(=O)NC2=C(C=C(C3=CC(C)=C(NC(=O)C(/N=N/C4=C(Cl)C=C(Cl)C=C4)C(=O)C)C=C3)C=C2)C)C(=O)C)C=C1, 0 +CC1=NC=CN1, 1 +C1(C2=CC=C(C(=C2)Cl)N=NC(C(C)=O)C(=O)NC3=C(C=C(C(=C3)OC)Cl)OC)=CC(=C(C=C1)N=NC(C(C)=O)C(=O)NC4=CC(=C(C=C4OC)Cl)OC)Cl, 0 +Cl.CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(cccc1O)[C@@](C)(O)[C@H]4C[C@@H]23, 0 +C/C=C/C1=CC=C(C=C1)OC, 0 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O, 1 +[H][C@]12N(CC=C2COC([C@@](O)(C(O)(C)C)[C@H](C)OC)=O)CC[C@@H]1OC(\C(C)=C/C)=O, 1 +S=C(N(CC)CC)SSC(=S)N(CC)CC, 0 +S=C([S-])NCCNC([S-])=S.[Zn+2], 0 +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2, 0 +O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+], 0 +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl, 0 +O=CNN, 1 +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2], 1 +O=S(C1=CC=C2C(C=CC(O)=C2\N=N/C3=CC=C(S(=O)([O-])=O)C=C3)=C1)([O-])=O.[Na+].[Na+], 0 +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl, 1 +S=C(S[Pb]SC(N(C)C)=S)N(C)C, 0 +F/C(F)=C(\F)F, 1 +[N+](=O)([O-])c1ccccc1C, 1 +O=C(N(C)C)Cl, 1 +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O, 1 +OCCNC1=C(OCCO)C=C([N+]([O-])=O)C=C1, 0 +C(S)(=S)N(C)C.N(C)C, 0 +O=C2C1=C(CCC2)C(OC[C@@H](O)CNC(C)(C)C)=CC=C1.Cl, 0 +O=C(O)\C=C/C(O)=O.O=C(NC3CC(N4C)CCC4C3)C1=C2C(CC(C)(C)O2)=CC(Cl)=C1, 0 +OC2=C1[C@@](C=C(C)CC3)([H])[C@]3([H])C(C)(C)OC1=CC(CCCCC)=C2, 0 +NC1=CC=CC=C1[H]Cl, 1 +C[N+](CCCCCCCCCCCC)(C)[O-], 0 +C1=COC=C1, 1 +C1CCCO1, 1 +C1(=C(C=CC=C1)N)OC.[H]Cl, 1 +O=S(\N=C(NCCSCC2=CC=C(CNC)O2)/NCC(C1=CC=C(O)C=C1)O)(C)=O, 1 +CN(C=O)C, 0 +O=CC1=CC=CO1, 1 +O=C(O)CC[C@@H](C)[C@]3([H])[C@](CC2)(C)[C@](CC3)([H])[C@@](CC4)([H])[C@@]2([H])[C@]1(C)[C@@]4([H])C[C@H](O)CC1, 0 +C1(=CC=C(N)C=C1)OC.[H]Cl, 0 +O=C3C[C@@H]4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](C)(O)CC[C@@H]12)[C@@]4(C)C\C3=C\O, 1 +CN(C)N, 1 +OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O, 1 +C1=CC=CC=C1C(COC(N)=O)COC(N)=O, 1 +NC1=C(C=CC=C1)C(=O)O, 0 +N(NC)C.[H]Cl.[H]Cl, 1 +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3, 0 +[O-][N+](C2=CC=C(O2)C1=CSC(NN(C)C)=N1)=O, 1 +S=C([S-])N(CCCC)CCCC.[S-]C(N(CCCC)CCCC)=S.[Zn+2], 0 +[Cl-].OC[P+](CO)(CO)CO, 0 +C1(=N\CCN/1)C(C)OC2C(=CC=CC=2Cl)Cl.[H]Cl, 0 +[O-][N+](=O)N(C)C, 1 +S=C([S-])N(CC)CC.[S-]C(N(CC)CC)=S.[Zn+2], 0 +OC[P+](CO)(CO)CO.[O-]S([O-])(=O)=O.OC[P+](CO)(CO)CO, 0 +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl, 1 +OC(=O)C1=NN(C2=C1C=CC=C2)CC3=CC=C(C=C3Cl)Cl, 0 +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2], 1 +S=C(N(C)C)SSC(=S)N(C)C, 0 +NN(C=O)CCC, 1 +O=C(OC)C1=CCCN(C)C1.[H]Cl, 1 +CC(C)(CO)CCCCCCC(C)(C)CO, 0 +OC(C(SC(Cl)=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=CC=C3)=O, 0 +S=C(N(C)C)SC(=S)N(C)C, 0 +O=C(C1=CC(=C(C(=C1)O)O)O)OCCC, 0 +[K+].[I-], 1 +C\C(C)=C/Cl, 1 +C[C@@H](CC)C(=O)O[C@H]2C[C@@H](C)\C=C3\C=C/[C@H](C)[C@H](CC[C@@H]1C[C@@H](O)CC(=O)O1)[C@@H]23, 1 +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-], 1 +CCCOC(=O)[CH]1[CH](C)CC2=C(C=C3OCOC3=C2)[CH]1C(=O)OCCC, 0 +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2, 1 +C(=O)(/C=C/C)OC1=C(C(CCCCCC)C)C=C(C=C1[N+]([O-])=O)[N+]([O-])=O, 0 +[Cl-].C/[N+](C)=C1\C=C/C(C=C1)=C(\c2ccc(cc2)N(C)C)c3ccc(cc3)N(C)C, 1 +Cn3nc(CO)nc3NCCCOc2cc(CN1CCCCC1)ccc2, 1 +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F, 0 +S1C=CC(=C1)CN(C2=NC=CC=C2)CCN(C)C, 0 +OC(COC(C)(C)C)C, 1 +CS(=O)(=O)OC1=C(C=C(C=C1C(C)(C)C)[N+]([O-])=O)[N+](=O)[O-], 0 +Cl.Cl.Cl.Cc1ccc(cn1)C\C2=C\N/C(=N\C2=O)NCCSCc3ccc(CN(C)C)o3, 1 +O=C2C=1/N=C\NC=1N(C)C(=O)N2C, 0 +N1=CC=CC=C1, 1 +O=NN(C(=O)N)CCC, 1 +O=C1C23C4C5C6(C(=O)C7=C(O)C(C)=CC(=C7C(C6=C(C2C5O)O)=O)O)C(C4O)C(=C3C(=O)C8=C1C(O)=C(C)C=C8O)O, 1 +N(CCN(C)C)(C)N=O, 1 +N1C(=NC2=C1C=CC=C2)C3=CSC=N3, 0 +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O, 1 +CC=C, 0 +OC(=O)[C@@H]3[C@]51C[C@@](O)(CC[C@H]1[C@@]24\C=C/[C@H](O)[C@@](C)(C(=O)O2)[C@@H]34)C(=C)C5, 0 +OC[C@@H](NC(C(Cl)Cl)=O)[C@H](O)C1=CC=C(S(=O)(C)=O)C=C1, 0 +CC(CO)O, 0 +O=NN(CCN1N=O)CCC1, 1 +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N, 1 +Cl[Mg]Cl.O.O.O.O.O.O, 0 +S=P(N1CC1)(N1CC1)N1CC1, 1 +ClC1=C(Cl)C=CC([C@H]2C3=C(C=CC=C3)[C@@H](NC)CC2)=C1.Cl, 0 +CC1CO1, 1 +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2, 1 +C1(CN(N=O)CC(O1)C)C, 1 +[O-]P(=O)=O.[Na+], 0 +NNCCC.[H]Cl, 1 +O=NN1CCN(N=O)CC1, 1 +O=C1C=C(NC(=S)N1)CCC, 1 +O=C(C(SP(=O)(OC)OC)CC(=O)OCC)OCC, 0 +CCOC(=O)N(C)N=O, 1 +CC(=S)N, 1 +O[C@@H]1[C@@](O[C@@H](O[C@H](CO)[C@@H]2Cl)[C@H](O)[C@H]2O)(CCl)O[C@H](CCl)[C@H]1O, 0 +O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC, 0 +C1N(COC1)N=O, 1 +CC(C1=CC(=C(C=C1O)C)SC2=CC(=C(C=C2C)O)C(C)(C)C)(C)C, 0 +O=C1C=CC(=O)NN1, 0 +O=C(N(CCC1=CC=CC=C1)N=O)N, 1 +OC1=C(C=C(C=C1SC2=C(C(=CC(=C2)Cl)Cl)O)Cl)Cl, 0 +O=C(O[C@@H]1[C@@](O[C@@H](O[C@H](COC(C)=O)[C@H]2OC(C(C)C)=O)[C@H](OC(C(C)C)=O)[C@H]2OC(C(C)C)=O)(COC(C)=O)O[C@H](COC(C(C)C)=O)[C@H]1OC(C(C)C)=O)C(C)C, 0 +C1(=CC=C2C(=C1)N(C(\N=C/2C3=CC=CC=C3)=O)C(C)C)C, 0 +C1=CC(=CC=C1NNC(CC[C@@H](C(O)=O)N)=O)CO, 0 +C(=C/C=O)\[O-].[Na+], 1 +C([S-])#N.[Na+], 0 +CCCCOP(=O)(OCCCC)OCCCC, 1 +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N, 1 +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-], 0 +O=S(=O)([O-])[O-].O.[Mn+2], 0 +N1C=CC=C(C=1)C2N(N=O)CCC2, 1 +F[B-](F)(F)F.[Na+], 0 +O=P(OC(CCl)CCl)(OC(CCl)CCl)OC(CCl)CCl, 1 +OC(CO)CCl, 0 +Cl.Cl.[O-][N+](=O)c1cccc(c1)C/2C(\C(=O)OC)=C(\C)NC(\C)=C\2C(=O)OCCN3CCN(CC3)C(c4ccccc4)c5ccccc5, 0 +O=C(C1=CC=C(C=C1)N)NC2=CC=C(C=C2)N, 0 +NC(=S)NN, 0 +C1COCCO1, 1 +O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO, 0 +O=C(NC3=CC2=C(C=C3)C1=CC=C(NC(C)=O)C=C1C2)C, 0 +O=C1NC(=S)NC=C1, 1 +NC(=O)C1=NC=CN=C1, 0 +S=P(SC1C(SP(=S)(OCC)OCC)OCCO1)(OCC)OCC, 0 +OCC1CO1, 1 +NC1=C(C=CC(=C1)N)C, 1 +COC2=CC=C(C=C2)CN(CCN(C)C)C1=NC=CC=C1.OC(\C=C/C(O)=O)=O, 1 +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C, 1 +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl, 1 +S=C(N1CCCCC1)SSSSSSC(=S)N1CCCCC1, 0 +CN(C)[C@@H]2/C=C\CC[C@@]2(c1ccccc1)C(=O)OCC.OC(=O)\C=C\C(O)=O, 0 +NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl, 0 +C1(=CC(=C(C(=C1)N)C)N).[H]Cl.[H]Cl, 0 +O=NN(CCCCC)CCCCC, 1 +OCC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4, 0 +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O, 1 +NC1=C(C)C=C(N)C=C1.O=S(O)(O)=O, 0 +C(C1=CC=CC=C1)(C2=CC=CC=C2)OCCN(C)C.[H]Cl, 0 +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O, 0 +CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3, 0 +N(C1=CC=C(C=C1)NC2=CC=CC=C2)C3=CC=CC=C3, 0 +Cl.CC(C)(C)NCC(O)CO/C1=C/N(C)C(=O)c2ccccc12, 0 +S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC, 0 +N#CC(C1=CC=CC=C1)C2=CC=CC=C2, 0 +[Sn+2].[Cl-].[Cl-], 0 +[Na+].[Na+].OC(=O)[C@]5(C)C[C@H]6/C7=C/C(=O)[C@H]4[C@@](C)(CC[C@@H]3[C@]4(C)CC[C@H](OC2O[C@H](C([O-])=O)[C@@H](O)[C@H](O)[C@H]2O[C@H]1O[C@@H]([C@@H](O)[C@H](O)[C@H]1O)C([O-])=O)C3(C)C)[C@]7(C)CC[C@@]6(C)CC5, 0 +O=[Ti]=O, 0 +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](\CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=CC=C5.[Na+], 1 +C(C(=O)[O-])(O[Ti](OC(C(=O)[O-])=O)=O)=O.[K+].[K+], 0 +Cl.CCOC(=O)[C@H](CCc1ccccc1)N[C@@H](C)C(=O)N2Cc3ccccc3C[C@H]2C(O)=O, 0 +O=C(OC1=CC=CC=C1)OC2=CC=CC=C2, 0 +[Ti+2](C1=CC=CC1)C2(=CC=CC2).[Cl-].[Cl-], 0 +C(/C1=C(C=C(C=C1)O)S(=O)(=O)[O-])(C2=CC=C(C=C2)N(CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)=C4/C=C/C(C=C4)=[N+](\CC5=CC(=CC=C5)S(=O)(=O)[O-])CC.[Na+].[Na+], 0 +Cl.O=C(c2cn(C)c1ccccc12)[C@H]3CC=4N\C=N/C=4CC3, 0 +O1C2=C(C=CC=C2)OC3=CC=CC=C13, 0 +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O, 1 +C1(=C(C)C2OC(CCC=2C(=C1OC(=O)C)C)(CCCC(CCCC(CCCC(C)C)C)C)C)C, 0 +CC1=CC(C4=CC(C)=C(/N=N/C5=CC=C(OS(=O)(C6=CC=C(C)C=C6)=O)C=C5)C=C4)=CC=C1/N=N/C2=C(O)C=CC3=CC(S(=O)([O-])=O)=CC(S(=O)([O-])=O)=C23.[Na+].[Na+], 1 +N1(C2=CC=CC=C2)C(C(N(CS(=O)(=O)[O-])C)=C(N1C)C)=O.[Na+], 1 diff --git a/test/data/multi_cell_call_no_dup.csv b/test/data/multi_cell_call_no_dup.csv new file mode 100644 index 0000000..78ef7eb --- /dev/null +++ b/test/data/multi_cell_call_no_dup.csv @@ -0,0 +1,1057 @@ +SMILES, Rodent carcinogenicity +C12(C(=C(/N=N/C3=C(C4=C(C(=C3)S(=O)(=O)[O-])C=CC=C4)O)C=CC=1S(=O)(=O)[O-])C=CC=C2).[Na+].[Na+], 0 +O=C(C2=CC=CC=C2)S\C(CCOC(C3=CC=CC=C3)=O)=C(C)/N(C=O)CC1=CN=C(C)N=C1N.Cl, 0 +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NN2CCCCCC2, 0 +OC1=CC=C2C(=C1/N=N/C3=C(C=C(C=C3)C)[N+](=O)[O-])C=CC=C2, 1 +BrC(CCl)CBr, 1 +NC(=S)NNC(=S)N, 0 +O=S(=O)(C1=CC=C(C=C1)C)NC(=O)NCCCC, 0 +[O-][N+](=O)C1=CC=CC(=C1)NC(=O)C2=CC3=CC=CC=C3C(=C2O)/N=N/C4=CC(=CC=C4OC)[N+]([O-])=O, 0 +O[C@@H]([C@@H](O)[C@H](O)CBr)[C@@H](O)CBr, 1 +C12(C(=CC(=C(C=1/N=N/C3=C(C=C(C=C3)C)C)O)S(=O)(=O)[O-])C=C(C=C2)S(=O)(=O)[O-]).[Na+].[Na+], 1 +BrCCBr, 1 +ClC1/C=C\C2C1C3(Cl)C(/Cl)=C(/Cl)C2(Cl)C3(Cl)Cl, 1 +ClC(C(C)=C2)=CC(S(=O)([O-])=O)=C2/N=N/C1=C3C(C=CC=C3)=CC=C1O.ClC(C(C)=C5)=CC(S(=O)([O-])=O)=C5/N=N/C4=C6C(C=CC=C6)=CC=C4O.[Ba+2], 1 +O[C@H]([C@H](O)CBr)[C@H](O)[C@H](O)CBr, 1 +C(CCCCCCCC)CCCNC(N)=N.CC(=O)O, 0 +CC1=CC=CC=C1, 1 +C1(=CC(=C2C(=C1)N=CC=C2)Br)Br, 0 +C1CCCNCCC1, 0 +O=C(N(CCCC)N=O)NCCCC, 1 +[Na+].C1(=CC=C2C(=C1S([O-])(=O)=O)C=CC=C2)/N=N/C3=C(C=CC4=C3C=CC=C4)O, 0 +CC(=O)O[Sn](OC(=O)C)(CCCC)CCCC, 0 +CC1=CC(C)=C(/N=N/C2=C(C(S([O-])(=O)=O)=CC3=C2C=CC(S([O-])(=O)=O)=C3)O)C=C1C.[Na+].[Na+], 1 +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 +NC1=CC=CC(C)=C1.[H]Cl, 1 +C1=C(Cl)C=C3C(=C1)N(CCO)C(=O)C(O)N=C3C2=CC=CC=C2F, 0 +Cl\C(Cl)=C(Cl)/C(Cl)=C(Cl)\Cl, 1 +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OCC)OCC, 0 +C1(=CC=C(N)C=C1)C.[H]Cl, 1 +[O-]C1=C(I)C=C(C(C2=C(C([O-])=O)C=CC=C2)=C3C=C(C(C(I)=C3O4)=O)I)C4=C1I.[Na+].[Na+], 0 +C(CC(=O)O)C(=O)O.C(OCCN(C)C)(C)(C1=CC=CC=C1)C2=CC=CC=N2, 1 +Cl[C@@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl, 1 +CC(C)(O)CC[C@@H](O)[C@@H](C)[C@H]2CC[C@@]1(O)C/3=C/C(=O)[C@@H]4C[C@@H](O)[C@@H](O)C[C@]4(C)[C@H]\3CC[C@@]12C, 1 +Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl, 1 +N12([C@@H]([C@@H](C1=O)NC(COC3=CC=CC=C3)=O)SC([C@@H]2C(=O)[O-])(C)C).[K+], 0 +ClCC/C(C2=CC=CC=C2)=C(C3=CC=CC=C3)/C1=CC=C(C=C1)OCCN(C)C.OC(C(O)=O)(CC(O)=O)CC(O)=O, 0 +[Na+].[O-]S(=O)(=O)c4ccc(c1c3cc(C)c(cc3[o+]c2cc(c(C)cc12)N(CC)CC)N(CC)CC)c(c4)S([O-])(=O)=O, 0 +Cl[C@@H]1[C@@H](Cl)[C@H](Cl)[C@H](Cl)[C@@H](Cl)[C@@H]1Cl, 1 +ClC1=C(C(=C(C(=C1OC)Cl)Cl)Cl)Cl, 1 +C1(=C(C=C(N)C=C1)[N+](=O)[O-])NCCO, 0 +ClC(C(Cl)Cl)(Cl)Cl, 1 +O=CC(\Cl)=C(\Cl)C(O)=O, 0 +O=C(C4=CC(OC)=C(OC)C(OC)=C4)O[C@@H]1C[C@@]3([H])[C@@](C[C@](N5C3)([H])C2=C(CC5)C(C=C6)=C(C=C6OC)N2)([H])[C@H]([C@](OC)=O)[C@H]1OC, 1 +C1(C(=CC=C(C=1)NC(C(C)=C)=O)Cl)Cl, 0 +C([O-])(=O)CN(CC(=O)O)CCN(CC([O-])=O)CC([O-])=O.[Na+].[Na+].[Na+].[H]O[H].[H]O[H].[H]O[H], 0 +ClC1(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 0 +OC1=CC(=CC=C1)O, 0 +OC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl, 1 +O=C1C2=C(C=CC=C2)C(=O)C(=C1Cl)Cl, 0 +ClC(C(Cl)(Cl)Cl)(Cl)Cl, 1 +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CC(=O)O)C)C)C, 0 +O=[N+](C1=CC(=C(C(=C1)Cl)N)Cl)[O-], 0 +NC1=C(C=C(C=C1Cl)N)Cl, 1 +OC(=O)C(Cl)Cl, 1 +OC1=C(C=C(C(=C1CC2=C(C(=CC(=C2Cl)Cl)Cl)O)Cl)Cl)Cl, 0 +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)C)C)C)C, 1 +ClC#CCl, 1 +C12C(C3C(CC1C3)NC(N(C)C)=O)CCC2, 0 +NC1=C2C(=NC(=N1)N)N=C(C(=N2)C3=CC=CC=C3)N, 1 +CC1(C(=C(CCC1)C)C=CC(=CC=CC(=CCOC(=O)CCCCCCCCCCCCCCC)C)C)C, 0 +C1N2CN3CN(C2)CN1C3, 0 +BrC(Br)Br, 1 +CCCC/C=N/N(C=O)C, 1 +Cl\C2=C(/Cl)C3(Cl)C1C4CC(C1C2(Cl)C3(Cl)Cl)C5OC45, 0 +N1=C(N=C(N(CO)CO)N=C1N(CO)CO)N(CO)CO, 1 +O=C(OCC)C4=C(C=CC=C4)C(C(C=C(C)C(NCC)=C3)=C3O1)=C(C=C2C)C1=C/C2=N/CC.Cl, 0 +ClC1=C(C=CC=C1)Cl, 0 +FC(C(F)Cl)(OC(F)F)F, 0 +[O-][N+](=O)C1=C(Cl)C(=C(Cl)C(=C1)[N+]([O-])=O)Cl, 0 +CCCCCNN.[H]Cl, 1 +ClC1=CC=C(C=C1)Cl, 1 +CCCCC/C=N/N(C=O)C, 1 +C(C(F)(Cl)Cl)(F)(F)Cl, 0 +O=C(CN=C2C3=CC=CC=C3)NC1=C2N(N=C1C)CC, 1 +ClC1=C(C=CC(=C1)C2=CC(=C(C=C2)N)Cl)N, 1 +ClC(C(=O)O)(Cl)Cl, 1 +C1=C(C=CC(=C1)C(C2=CC=C(N)C(=C2)C)=C3C=CC(=N)C=C3)N.[H]Cl, 0 +OC(=O)\C=C/C(O)=O.C(C(C1CCCCC1)C2CCCCC2)C3CCCCN3, 0 +FC(F)Cl, 0 +O=S(O)(O)=O.O[C@@H]([C@H](C)NC)[C@@]1=CC=CC=C1.O[C@@H]([C@H](C)NC)[C@@]2=CC=CC=C2, 0 +NC1=C(C=C(C=C1Cl)Cl)Cl, 1 +C(C1=CC=C(C=C1)N)(C2=CC=C(C=C2)N)=C3C=CC(C=C3)=N.[H]Cl, 1 +CN1CC[C@H]2OC(=O)C3(C[C@@H](C)[C@@](C)(O)C(=O)OC\C(=C\C1)C2=O)O[C@@H]3C, 1 +ClCC1CO1, 1 +O=C(N(CCCCCC)N=O)N, 1 +O=C([C@](C(C=C4OC)=C(C=C4OC)OC3)([H])[C@]3([H])O2)C(C=C5)=C2C1=C5O[C@@H]([C@@](C)=C)C1, 0 +CC(=O)NC1=CC=C(C=C1)OCC, 1 +C([N+](C)(C)C)CCl.[Cl-], 0 +ClC1=CC2=C(C=C1)OC3=C(C=CC(=C3)Cl)O2, 0 +OC1=C(C=CC(=C1)O)CCCCCC, 0 +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O.O=S(O)(O)=O, 0 +CN1N(C2=CC=CC=C2)C(=O)C=C1C, 1 +FC(F)(Cl)Cl, 0 +ClC(CCl)Cl, 1 +NC1=CC=C(/N=N/C2=CC=CC=C2)C(N)=N1.Cl, 1 +FCCl, 1 +CC(Cl)Cl, 0 +CCC1CO1, 1 +CC(Cl)(Cl)Cl, 0 +O=C(O[C@@H]5CC([C@@](CC5)(C)[C@]([H])3CC4)=CC[C@@]3([H])[C@@]2([H])[C@@]4(C)[C@]([C@H](C)CCCC(C)C)([H])CC2)CC1=CC=C(N(CCCl)CCCl)C=C1, 1 +ClC(Cl)Cl, 1 +ClCCCl, 1 +ClC(=CCl)Cl, 1 +OC2=CC1=C(C(O)=C2)C(C(O[C@@H]4O[C@@H]([C@H]([C@H](O)[C@H]4O)O)CO[C@H]3[C@H](O)[C@H](O)[C@H]([C@H](C)O3)O)=C(C5=CC(O)=C(C=C5)O)O1)=O, 0 +ClCOC, 1 +ClC1=C(C=CC(=C1)Cl)O, 0 +C12=C(C(=O)NS1(=O)=O)C=CC=C2, 0 +OC1(=C(O)C(=O)O[C@H]1[C@@H](C[O-])O).[Na+], 0 +C1(C=CC=CN=1)CCl.Cl, 0 +FC(Cl)(Cl)Cl, 0 +O=C(O[C@H](CC)[C@](O)(C)[C@H](O)[C@@H](C)C2=O)[C@H](C)[C@@H](O[C@H]3C[C@](OC)(C)[C@@H](O)[C@H](C)O3)[C@H](C)[C@H]([C@@](O)(C)C[C@H]2C)O[C@H]1[C@H](O)[C@@H]([N@H+](C)C)C[C@@H](C)O1.[O-]C(CCCCCCCCCCCCCCCCC)=O, 0 +C1(=CC=CN=C1)CCl.[H]Cl, 1 +O=C1N(C(=O)C2=C1C=CC=C2)SC(Cl)(Cl)Cl, 1 +C1(CCNC(NC(N)=N)=N)=CC=CC=C1.[H]Cl, 0 +ClC1=C(OC(C)C(O)=O)C=CC(Cl)=C1, 0 +C1=C(Cl)C=C3C(=C1)N4C(CN=C3C2=CC=CC=C2)=NN=C4, 0 +OC1=C(C=C(C=C1Cl)Cl)Cl, 1 +C=CCC1=CC=C2C(=C1)OCO2, 1 +O=C1C(C2=CC=CC=C2)(C(=O)NC(=O)N1)CC, 1 +ClC1=C(C=C(C=C1)Cl)OC(C(=O)O)C, 0 +ClC1=C(C=C(C(=C1)Cl)Cl)OC(C(=O)O)C, 0 +C1(C2=CC=CC=C2)(C(NC(=NC1=O)[O-])=O)CC.[Na+], 1 +O=S(=O)(C1=CC=C(C=C1)Cl)OC2=CC=C(C=C2)Cl, 0 +ClC1=C(C=CC(=C1)Cl)OCC(=O)O, 0 +ClCCN(CCCl)C1=CC=C(CC(OC3=CC=C(C4=C3)[C@]2([H])[C@](CC4)([H])[C@@](CC[C@@H]5OC(CC6=CC=C(N(CCCl)CCCl)C=C6)=O)([H])[C@]5(C)CC2)=O)C=C1, 1 +ClC1=C(C=C(C(=C1)Cl)Cl)OCC(=O)O, 0 +C3=CC=CC(NS(=O)(=O)C2=CC=C(N=NC1=CC=C(O)C(C(O)=O)=C1)C=C2)=N3, 1 +OC1=CC=CC=C1, 0 +O=C(N(C)C)NC1=CC=C(C=C1)Cl, 1 +ClC1=C(C=CC(=C1)Cl)OCC(=O)OCCCC, 0 +O=C1OC(C2=C1C=CC=C2)(C3=CC=C(C=C3)O)C4=CC=C(C=C4)O, 1 +ClC4=C(C=CC=C4)C2=NC(C)C1=NN=C(C)N1C3=C2C=C(CCC5=CC=C(CC(C)C)C=C5)S3, 0 +O=C([C@H](CO)[C@]2=CC=CC=C2)O[C@@H]1C[C@H](N4C)[C@@H](O3)[C@@H]3[C@@H]4C1.Br.O.O.O, 0 +N1C2=C(C=CC=C2)SC3=CC=CC=C13, 0 +C(N)(=O)OC(C#C)(C1C=CC=CC=1)C2C=CC(=CC=2)Cl, 1 +ClC1=CC(=CC=C1OCC(=O)OC(C)C)Cl, 0 +ClCCN(C(COC2=CC=CC=C2)C)CC1=CC=CC=C1.Cl, 1 +ClC1=CC(=C(C=C1SC2=CC=C(C=C2)Cl)Cl)Cl, 0 +ClC1=C(C=CC(=C1)NC(=O)N(C)C)Cl, 0 +ClCC(Cl)CCl, 1 +ClC([N+](=O)[O-])(Cl)Cl, 0 +ClC1=C(C=CC(=C1)Cl)OS(=O)(=O)C2=CC=CC=C2, 0 +NC(CCSCC)C(=O)O, 1 +S=C=NC1=CC=CC=C1, 0 +C=C(Cl)C=C, 1 +CC(Cl)CCl, 1 +OCCN(CCO)CCO, 1 +O=P(OC=C(Cl)Cl)(OC)OC, 1 +[O-][N+](C1=CC=C(C2=CSC(NC(C(F)(F)F)=O)=N2)O1)=O, 1 +O=C1N(C2=CC=CC=C2)N=C(C1)C, 0 +ClC1=C(C(=C(C(=C1C#N)Cl)Cl)Cl)C#N, 1 +O=[N+](C1=C(C(=CC(=C1)C(F)(F)F)[N+](=O)[O-])N(CCC)CCC)[O-], 1 +S=C(S[Se](SC(=S)N(C)C)(SC(=S)N(C)C)SC(=S)N(C)C)N(C)C, 0 +C1=C2C(=CC=C1NC3=CC=CC=C3)C=CC=C2, 0 +CC1=CC(NC2=C1C=C(C=C2)OCC)(C)C, 0 +NC1(=CC=C(C=C1)NC2=CC=CC=C2).[H]Cl, 0 +O=NN(C)CCCCCCCCCCCC, 1 +S=C(NC1CCCCC1)NC1CCCCC1, 0 +O=C(OCC)C=C, 1 +O=C(C(C)=C2C)C(C(CCCCCC(O)=O)C1=CC=CC=C1)=C(C)C2=O, 0 +[Se]=S, 1 +OC(=O)CCCC\C=C(\c1cccnc1)c2ccccc2, 0 +O[C@H]1O[C@H](CO)[C@@H](O)[C@H](O)[C@H]1NC(=O)N(CCCl)N=O, 1 +C13CC(C4C3O4)C2C1C5C(O5)C2, 0 +CCO, 1 +CC1=CC(=C(C=C1C)N)C, 1 +NC(=S)NC1=CC=CC=C1, 0 +C[N+](CCC(C1=CC=C(C=C1)Cl)C2=NC=CC=C2)C.C(\C(=C(/C(=O)[O-])[H])[H])(=O)O, 0 +[O-]\[N+](CC)=N/CC, 1 +C1=C(C(=CC(=C1N)C)C)C.[H]Cl, 1 +OC1=CC2=C(C=C1)OCO2, 1 +OC1=CC=C2C(=C1/N=N/C3=CC=CC=C3)C=CC=C2, 1 +C1=CC=CC(=C1)CCN(C)N=O, 1 +O=S(=O)(C1=CC=C(C=C1)Cl)NC(=O)NCCC, 0 +ClC6C4(Cl)C3C1C5C(C3C2OC12)C4(Cl)C(Cl)(Cl)C56Cl, 0 +[O-]\[N+](CC)=N/C, 1 +ClC1=NC(=NC(=N1)NCC)NCC, 0 +O=C1N(C2=CC=CC=C2)N(C3=CC=CC=C3)C(=O)C1CCCC, 1 +N(CCCCCCCCCCCCCC)(C)N=O, 1 +C(O)(=O)[O-].[Na+], 0 +NC1=CC(=CC=C1)N, 0 +N(CCCCCCCCCC)(C)N=O, 1 +OCC1=C(C(=C(C(=C1)/N=N/C2=C3C=CC=CC3=C(C=C2)S(=O)(=O)[O-])O)/N=N/C4=C5C=CC=CC5=C(C=C4)S(=O)(=O)[O-])O.[Na+].[Na+], 0 +NC1=CC=C(C=C1)N, 0 +CN(C(=O)N)N=O, 1 +C([N+](C)(C)C)CO.[Cl-], 0 +ClC(C(C1=CC=C(C=C1)CC)C2=CC=C(C=C2)CC)Cl, 0 +C1(=C(C=CC=C1N)N).[H]Cl.[H]Cl, 0 +C1N(C(OC1)=O)N=O, 1 +S=P(OC1=NC(=C(C=C1Cl)Cl)Cl)(OCC)OCC, 0 +C1(SC2=C(C(=CC(=C2)Cl)Cl)[O-])(=C(C(=CC(=C1)Cl)Cl)[O-]).[Na+].[Na+], 0 +O=C(C)CN(N=O)CCO, 1 +CC(=O)[O-].[O-]C(=O)C.[O-]C(=O)C.[Cr+3], 0 +.[Na+].[Cl-], 0 +N(N)(CC)C=O, 1 +O=C1C2=C(C=CC=C2O)C(=O)C3=CC=CC(=C13)O, 1 +[Na+].[O-]Cl=O, 0 +C1(=C(C=CC=C1)N)N.[H]Cl.[H]Cl, 1 +CC1(C2=CC=CC=C2)C(O1)C(=O)OCC, 0 +C1(CSCCNC(NC)=NC#N)=C(C)NC=N1, 0 +O=C([O-])C(C(/C(CC([O-])=O)=C([C@@H](CCC([O-])=O)[C@@H]5C)\N=C5/C=C4\[N-]\C(C(C=C)=C4C)=C3)=N2)=C(C)/C2=C/C1=C(CC)C(C)=C/3[N-]1.[Na+].[Na+].[Na+].[Cu+2], 0 +C1(=CC(=CC=C1N)N).[H]Cl.[H]Cl, 0 +N=C(N(CC)N=O)N[N+]([O-])=O, 1 +C1([C@H](CNC)O)(=CC(=CC=C1)O).[H]Cl, 0 +O=C(C(O)(C2=CC=CC=C2)C1CCCCC1)OC(C)(C)C#CCN(CC)CC.O.Cl, 0 +NC(=O)N(CC)N=O, 1 +O=NN(CC=C1)CC1, 1 +O.[Na+].O.O.CCN(CC)C([S-])=S, 0 +S=C(S[Te](SC(=S)N(CC)CC)(SC(=S)N(CC)CC)SC(=S)N(CC)CC)N(CC)CC, 0 +N(CC(F)(F)F)(CC)N=O, 1 +Cl[O-].[Na+], 0 +C1(=CC=CC=C1)CCNN.S(O)(O)(=O)=O, 1 +ClC1(C(C2=CC=C(C=C2)OC(C(=O)O)(C)C)C1)Cl, 1 +OC(=O)C=CC=CC, 0 +O(C1=CC=CC=C1)CC2CO2, 1 +OCCBr, 1 +CCC1=CC=CC=C1, 1 +C1C(N(C(CN1N=O)C)C)C, 1 +OC(CNC(C)C)C1=CC=C(NS(=O)(C)=O)C=C1.[H]Cl, 0 +OC2=CC=C(C=C2)/C(CC)=C(CC)/C1=CC=C(O)C=C1, 1 +C(CO)O, 0 +N(CC(CO)O)(CC=C)N=O, 1 +[O-]C12[C@@H](CC[N+](C)1CC=C2COC([C@](OC(C)=O)(C)[C@@H](C)\C=C3C=C)=O)OC/3=O, 1 +S=C(NCC)NCC, 1 +N(CC(C)O)(CC=C)N=O, 1 +NNC1=CC=CC=C1.[H]Cl, 1 +C=CC=C, 1 +NC(CCCN)(C(=O)O)C(F)F, 0 +C1CN1, 1 +N(CC(C)=O)(CC=C)N=O, 1 +CC(CC1=CC=CC=C1)NN.[H]Cl, 0 +CC(C)(C)O, 1 +CC(OC1=CC=C(C=C1)Cl)(C(=O)OCC)C, 1 +O=CNNC=O, 1 +N(CC=C)(CCO)N=O, 1 +O=C1C2=C(C=C3C(=C2OC4=CC=CC(=C14)O)C5C(O3)OC=C5)OC, 1 +O=C1N2CC3=CC=CC=C3C(=O)N2CC4C=CC=CC1=4, 1 +O=C(N(CCCCC)N=O)OCC, 1 +O=[C@](O[C@H](O[C@H](CO)[C@H]1O)[C@H](O)[C@H]1O)[C@@]5(C)[C@](CC3)([H])[C@](CCC5)(C)[C@@](CC4)([H])[C@@](C2)3C[C@]4(O[C@H]6[C@H](O[C@H]7[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO)O7)[C@@H](O)[C@H](O)[C@@H](CO)O6)[C@@]2=C, 0 +CCCCCl, 0 +OCCN.O=C(C1=C(C=CC(=C1)Cl)O)NC2=CC=C(C=C2Cl)[N+](=O)[O-], 0 +N(N1CCCCC1C2=CC=CN=C2)=O, 1 +[C@@H]1(NC(N(N=O)C)=O)[C@H]([C@H](O)[C@H](O[C@@H]1O)CO)O, 1 +CC(=O)O[Hg]C1=CC=CC=C1, 0 +OC1=C(C=C(C=C1C(CC)C)[N+](=O)[O-])[N+](=O)[O-], 0 +O=S([N-]C1=O)(OC(C)=C1)=O.[K+], 0 +Cl[C@@]1(C(C)2C)C(Cl)(Cl)C(Cl)([C@](Cl)(C2=C)C1Cl)Cl, 1 +C1=C(C=CC=C1OCC2CO2)OCC3CO3, 1 +N(N)(CCCC)C=O, 1 +C=CC1=CC=CC=C1, 1 +OC1=CC=C(C=C1)C2=CC=CC=C2, 0 +C(C1=CC=C(C=C1)O)(=O)OCCCC, 0 +[Na+].[O-]C1=C(C=CC=C1)C2=CC=CC=C2, 1 +O.O.O.O.[Co+2].O.O.O.[O-]S([O-])(=O)=O, 1 +O=NN(CC(C)O)CC(C)O, 1 +N#[N+]C1=CC=CC=C1.O=S([O-])(O)=O, 1 +C1C(C2=CC=CC=C2)O1, 1 +N1(=C2C(=CC(=C1)C3=CC=CC=C3)N(C(=N2)N)C).[H]Cl, 1 +O[C@@H]1C2[C@@]34C5=C(C=CC(=C5O2)OC)CC(C3C=C1)N(C)CC4, 0 +O=NN(CC(=O)C)CC(=O)C, 1 +O=C1OC(=O)CC1, 0 +O=C1OC2=C(C=CC=C2)CC1, 1 +N(N(CC(F)(F)F)CC(F)(F)F)=O, 0 +CCCCOCCO, 1 +N(CCCCO)(CCCC)N=O, 1 +O[C@H]1[C@H](O[C@H](CO)[C@@H](O)[C@@H]1O)O[C@]2(CO)O[C@H](CO)[C@@H](O)[C@@H]2O, 0 +OC1=CC(C2=NC(N(C(C)C)C3=C2C=CC(C)=C3)=O)=CC=C1, 0 +CCCC1=CC2=C(C=C1)OCO2, 1 +O=NN(C)C2=NC1=CC=C(Cl)C=C1C(C3=CC=CC=C3)=[N+]([O-])C2, 0 +OC1=C(C=C(C=C1C(C)(C)C)CO)C(C)(C)C, 0 +S=C(N(CC)CC)SCC(=C)Cl, 1 +P, 0 +O=NN(/C(=N\C#N)NCCSCC1=C(N=CN1)C)C, 0 +C[C@@H]3O[C@]1(CS3)C2CCN(CC2)C1.C[C@@H]6O[C@]4(CS6)C5CCN(CC5)C4.O.Cl.Cl, 0 +NC(=O)C1=C(C=CC=C1)C(=O)N, 0 +C1(=C(C=CC(=C1)[C@H](CN[C@@H](CCC2=CC=CC=C2)C)O)O)C(N)=O.[H]Cl, 0 +O=NN(CCCC)CCCC, 1 +CC(=C)CCl, 1 +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Cu+2], 0 +O=C1C2=C(C=CC=C2)C(=O)O1, 0 +O=NN(CCO)CCO, 1 +O=C(N(CCCC)N=O)N, 1 +N1=CC=CC2=CC=CC(=C12)O[Cu]OC3=CC=CC4=CC=CN=C34, 0 +O=S(=O)(C1=CC=C(C=C1)N)NC2=NC(=CC(=N2)C)C, 1 +S=P(SCC(=O)NC)(OC)OC, 0 +CCN(CC)N=O, 1 +CC(=O)NN, 1 +CC1=C(Cl)C(=O)OC2=C1C=CC(=C2)OP(=S)(OCC)OCC, 0 +CN(N=O)C, 1 +OC(=O)CCl, 0 +OC1=C(C=C(C=C1C(C)(C)C)C)C(C)(C)C, 1 +O=C1OC2=C(C=CC=C2)C=C1, 1 +C2=C(N)C=CC(S(=O)(=O)NC1ON=C(C)C=1C)=C2, 0 +ClC1=C(Cl)N=C(C(O)=O)C(Cl)=C1N, 0 +NN(CCCC)CCCC, 1 +COC1=CC(=C(C=C1)N)C, 1 +[O-]S(S(=O)[O-])(=O)=O.[K+].[K+], 0 +OC(CN(C1=CC=C(N=N1)NN)C)C.Cl.Cl, 0 +O=C/C=C/C1=CC=CC=C1, 0 +O[As](O)(C)=O, 0 +CC1CC(OC(O1)C)OC(=O)C, 1 +Cl.CCCCNN, 1 +O=S1(=O)CC=CC1, 0 +c1(n(cnc1)C)C[C@@H]2[C@@H](C(=O)OC2)CC, 0 +[Na+].[O-]C(=O)[C@@H](N)CC(O)=O, 0 +N(NCCCC)CCCC.Cl.Cl, 1 +O=NN(C1=CC=CC=C1)C2=CC=CC=C2, 1 +C\1=C/C(O[C@@H](C/C=C/C=C/C=C/C=C/[C@@H](C[C@@H]3O[C@](C[C@H](C[C@H]2O[C@H]/12)O)(C[C@@H]([C@H]3C(O)=O)O)O)O[C@@H]4O[C@@H]([C@H]([C@@H]([C@@H]4O)N)O)C)C)=O, 0 +NC1=CC(=CC=C1OC)C, 1 +NC1=CC=C(/C=C/C2=CC(OC)=CC=C2OC)C=C1, 1 +N(C1C=CC(=CC=1)N=O)C2=CC=CC=C2, 1 +OC(=O)CCC(=O)OCC2(CCCC)C(=O)N(c1ccccc1)N(C2=O)c3ccccc3, 0 +C1CNCCN1, 0 +O=C(NC2=C(Cl)C=NC=C2Cl)C1=CC(OC3CCCC3)=C(OC)C=C1, 1 +C1(=CC(=CC=C1N)OC)OC.[H]Cl, 0 +O=NN(CCC)CCC, 1 +CC(C)C(O)(C(C)O)C(=O)OC\C1=C\CN2CC[C@@H](OC(=O)C(\C)=C\C)[C@@H]12, 1 +C1CCNCC1, 0 +[Na+].O=C([O-])[C@@H](N)CCC(O)=O, 0 +CC(C)(C)c1cc(O)ccc1O, 0 +[N+].C1(N(N=O)[O-])=CC=CC=C1, 1 +COC1=C(C=CC(=C1)C2=CC(=C(C=C2)N=C=O)OC)N=C=O, 1 +O=C3[C@@]2(C)CC[C@]1([H])[C@](CC[C@H](OS(=O)(O)=O)C4)(C)C4=CC[C@]([H])1[C@@]([H])2CC3, 0 +CC(C)CC(=O)O[C@H]1C[C@]2(COC(C)=O)[C@@]4(C)[C@H](OC(C)=O)[C@@H](O)[C@@H](O[C@@H]2/C=C1/C)[C@]34CO3, 1 +CCCC1=CC2=C(C=C1COCCOCCOCCCC)OCO2, 1 +C(CCC(=O)O)([O-])=O.[Na+], 0 +[Ca+2].[N-2]C#N, 0 +NC1=CC=C(C2=CC=C(N)C(OC)=C2)C=C1OC.Cl.Cl, 1 +O=NN(CCCCCC1)CCCCCC1, 1 +ClC(=C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)C3=CC=C(C=C3)OC, 0 +NC(=O)NCCCC, 0 +NC(=N)NC#N, 0 +C1=CC=CC=C1C(O)C(N(C)N=O)C, 1 +S(=O)(=O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2, 0 +O=[N+]([O-])C3=CC=C(O3)/C=N/N1C(O[C@@H](CN2CCOCC2)C1)=O.Cl, 1 +C1(NS(=O)(=O)[O-])CCCCC1.[Na+], 1 +CN(CC)N=O, 1 +CCN(CC)C(=O)C1=CC=CC(C)=C1, 0 +Cl.CC3CCCC(C)N3CCCC(O)(c1ccccc1)c2ccccn2, 0 +O=C1CCCO1, 0 +O=C(N(CC)N=O)OCC, 1 +[Cd+2].[O-]C(C)=O.[O-]C(C)=O, 0 +N=C\2/N=C3/O[C@H]1[C@H](O)[C@@H](CO)O[C@H]1N3/C=C/2, 0 +CC(C(O)=O)(OC1=CC=C(C=C1)C2CCCC3=C2C=CC=C3)C, 1 +[Cl-].[Cd+2].[Cl-], 1 +C([C@@H]1[C@@H]8[C@@H]([C@H]([C@H](O1)O[C@@H]2[C@@H](CO)O[C@@H]([C@@H]([C@H]2O)O)O[C@@H]3[C@@H](CO)O[C@@H]([C@@H]([C@H]3O)O)O[C@@H]4[C@@H](CO)O[C@@H]([C@@H]([C@H]4O)O)O[C@@H]5[C@@H](CO)O[C@@H]([C@@H]([C@H]5O)O)O[C@@H]6[C@@H](CO)O[C@@H]([C@@H]([C@H]6O)O)O[C@@H]7[C@@H](CO)O[C@@H]([C@@H]([C@H]7O)O)O8)O)O)O, 0 +O=NN1CCCCCCC1, 1 +O=C1C2=C(N=C(C=C2)C)N(C=C1C(=O)O)CC, 1 +[Cd+2].[Cl-].[Cl-].[H]O[H], 0 +O=C1CCCCC1, 0 +O(CC1(C)C)C1=O, 1 +C1=C2C(=CC=C1)C=CC=C2, 1 +O=C(C)NCCSP(=S)(OC)OC, 0 +N(C([S-])=S)(CC)CC.[S-]C(N(CC)CC)=S.[Cd+2], 0 +NC(=O)CC1=C2C(=CC=C1)C=CC=C2, 0 +O=S(=O)([O-])[O-].[Cd+2], 1 +O=NN1CCCCCC1, 1 +N1=C(SNC2CCCCC2)SC3=C1C=CC=C3, 0 +C1(NC(CN1N=O)=O)=O, 1 +OC(=O)CC1=C2C(=CC=C1)C=CC=C2, 0 +C1(CCCCC1)N.[H]Cl, 0 +O=[C@]([C@@H]1C[C@@H](O)CN1N=O)O, 0 +[Cd+2].[Cd+2].[Cd+2].[O-]S(=O)(=O)[O-].[O-]S([O-])(=O)=O.[O-]S([O-])(=O)=O.O.O.O.O.O.O.O.O, 0 +C1(CCCCC1[N+]).O=S(=O)([O-])O, 0 +N(N(CC(O)=O)CC(O)=O)=O, 0 +O=C1c2c(O)cc(C)cc2C(=O)c3cc(O)cc(O)c13, 0 +NC1=C2C(=CC=C1)C(=CC=C2)N, 1 +OC1=C(C=CC(=C1)/C=C/C(=O)O)O, 1 +P(=O)(OC)(OC)N1CCOCC1, 1 +N(CC(CO)O)(C)N=O, 1 +C1=C(CO)OC=C1, 1 +C12C(=CC=CC=1NCCN)C=CC=C2.[H]Cl.[H]Cl, 0 +C(O)(=O)[O-].[K+], 1 +O=C1C2=C(N=CN2C)N(C(=O)N1C)C, 0 +ClCCN(CCCl)[P]1(=O)NCCCO1, 1 +C1(=CC(=NC(=N1)C2=CC=C(O2)[N+]([O-])=O)C)C, 1 +CN(CCO)N=O, 1 +O=CCCCC=O, 0 +C1=C2C(=CC=C1NC3=CC=C(C=C3)NC4=CC=C5C(=C4)C=CC=C5)C=CC=C2, 0 +.[K+].[Cl-], 0 +C[C@H](C\C=C\C)[C@@H](O)[C@@H]1N(C)C(=O)[C@H](C(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](C)NC(=O)[C@H](C)NC(=O)[C@H](CC(C)C)N(C)C(=O)[C@@H](NC(=O)[C@H](CC(C)C)N(C)C(=O)CN(C)C(=O)[C@H](CC)NC1=O)C(C)C, 0 +N(N(CCCO)C)=O, 1 +NC(=S)NC1=C2C(=CC=C1)C=CC=C2, 0 +CC(C)NCC(O)COc1ccc(cc1)NC(C)=O, 0 +O=[As](O)(O)[O-].[Na+], 0 +O=C1[C@H]3[C@H](C3)[C@@]([C@]4([H])[C@@]([C@@]5([H])[C@]([C@@](CC5)(OC(C)=O)[C@@](C)=O)(C)CC4)([H])C=C2Cl)(C)C2=C1, 1 +O=C(C1=CC=C(C=C1)C(=O)OC)OC, 0 +CC(O)CN(C)N=O, 1 +[As]21O[As]3O[As](O1)O[As](O2)O3, 0 +O=C(O)[C@H](CS)N.Cl, 0 +CN(C)C(C)=O, 0 +CN(CC(C)=O)N=O, 1 +[Na+].[As](=O)[O-], 0 +C(C(C)O)(O[Ca]OC(C(C)O)=O)=O, 0 +O=C(/C=C(C(C1=CC=C(C=C1)OC)=O)/Br)[O-].[Na+], 1 +O=NN(C)CCOS(C1=CC=C(C)C=C1)(=O)=O, 1 +NC1=CC2=C(C=CC=C2)C=C1, 1 +O.O=C(Nc3cccc1c3O/C(=C\C1=O)C2=N\N\N=N2)c5ccc(OCCCCc4ccccc4)cc5.O=C(Nc3cccc1c3O/C(=C\C1=O)/C=2N\N=N/N=2)c5ccc(OCCCCc4ccccc4)cc5, 0 +O=C(N)C1=C(N=CN1)/N=N/N(C)C, 1 +C1(=C2C(=CC=C1N)C=CC=C2)S(=O)(O)=O, 0 +O=C1N(C2=CC=C(C=C2C(=NC1)C3=CC=CC=C3)Cl)CC4CC4, 0 +OC=1[C@H](OC(=O)C=1O)[C@@H](O)CO, 0 +O=C(CN1C(=O)CCC1)NC2=C(C=CC=C2C)C, 0 +O=C1N2C(C3=C(C=CC=C3)CC2)CN(C1)C(=O)C4CCCCC4, 0 +O=C([C@H](CC1=CC=CC=C1)NC(=O)[C@H](CC(=O)O)N)OC, 0 +CC(OC(=O)OC1CCCCC1)OC(=O)c5cccc6nc(OCC)n(Cc2ccc(cc2)c3ccccc3C\4=N\N=N/N/4)c56, 0 +[Ni], 0 +O=C(CCC(=O)O)NN(C)C, 1 +OC(=O)C1=C(C=CC=C1)OC(=O)C, 0 +C([O-])(C)=O.[O-]C(C)=O.[Ni+2], 0 +O=S(=O)(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N, 1 +OCC(=O)[C@@]3(O)CC[C@H]2[C@@H]4CC\C1=C\C(=O)/C=C\[C@]1(C)[C@H]4C(=O)C[C@@]23C, 0 +CN(C1=CC=CC=C1)N=O, 1 +O=C1CCCCCN1, 0 +ClC(C(C1=C(C=CC=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 0 +C1=CC=C(C(C(=O)OC)C2N(N=O)CCCC2)C=C1, 0 +S=C(N(CCCC)CCCC)S[Ni]SC(=S)N(CCCC)CCCC, 0 +OC1=C(C=C(C=C1)CNC(=O)CCCC/C=C/C(C)C)OC, 1 +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 1 +CC1=CC=CC=C1OCC(O)CNCCN2/C=C(/C)C(=O)NC2=O.[H]Cl, 0 +CN(CCCCCCCCCCC)N=O, 1 +O=S(=O)([O-])[O-].O.O.O.O.O.O.[Ni+2], 0 +C1=CC=C5C(=C1)N(CC2=CC=C(F)C=C2)C(NC4CCN(CCC3=CC=C(OC)C=C3)CC4)=N5, 0 +C12C(C(=O)N(C1=O)SC(C(Cl)Cl)(Cl)Cl)C\C=C/C2, 1 +ClC(=C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)Cl, 1 +O=NN1CCOCC1, 1 +NC(=O)C1=CC=CN=C1, 0 +CC(C)NCC(O)COC1(=CC=C(C=C1)CC(=O)N).[H]Cl, 0 +O=C1N(C(=O)C2C1CC=CC2)SC(Cl)(Cl)Cl, 1 +ClC(C(C1=CC=C(C=C1)Cl)C2=CC=C(C=C2)Cl)(Cl)Cl, 1 +C1=CC=C(C=[N+]1[O-])C2CCCN2N=O, 1 +ClC1=NC(=NC(=N1)NC(C)C)NCC, 1 +C(NN)(N)=O.Cl, 1 +BrC1=C(OC2=C(Br)C(Br)=C(Br)C(Br)=C2Br)C(Br)=C(Br)C(Br)=C1Br, 1 +O=NN(CCC1)C(C1)C(=O)O, 0 +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1, 0 +O=C(O[C@@H]2C[C@@H](CC3)N(C)[C@H]3C2)C(CO)C1=CC=CC=C1, 0 +NC(=O)NNC1=CC=CC=C1, 1 +O=NN(CCN1)CC1, 1 +CN(CCC2)[C@@H]2[C@]1=CN=CC=C1.Cl, 0 +N=C(C2=CC=C(N(C)C)C=C2)C1=CC=C(N(C)C)C=C1.[H]Cl, 1 +O[As](=O)(C1=CC=C(C=C1)NC(=O)N)O, 0 +CNNCC1(=CC=C(C=C1)C(=O)NC(C)C).[H]Cl, 1 +NC(N3C)=NC2=C3C(C)=CC1=NC=CC=C12, 1 +OC(=O)C1=CC=CN=C1, 0 +CC(=O)O[C@H]1[C@@H]([C@H](O[C@H]([C@@H]1OC(=O)C)COC(=O)C)S[Au]=P(CC)(CC)CC)OC(=O)C, 0 +O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3, 1 +CN1C2=C(C3=NC(=CN=C3C=C2)C)N=C1N, 1 +O=C(C1=CC=CN=C1)NN, 1 +N/C1=N/C(=O)N(/C=N1)[C@@H]2O[C@H](CO)[C@@H](O)[C@H]2O, 1 +C12C3=C(C=CC=C3)NC1=CC=CC=2, 1 +N1(C2C(SC3=C1C=CC=C3)=CC=CC=2)CC(N(C)C)C.[H]Cl, 0 +O=C(NC)OC1=CC=CC(C2)=C1OC2(C)C, 0 +O=NN1CCCCC1, 1 +C1=CC=C2C(=C1)C=C(C=C2)C(CNC(C)C)O, 0 +OC(C(C=CC=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=C(C)S3)=O, 0 +CC(=O)O[C@@H]3C\C4=C\C[C@@H]2[C@H](CC[C@]1(C)C(=O)CC[C@H]12)[C@@]4(C)CC3, 1 +O=NN1CCC[C@H]1[C@@](O)=O, 0 +C12=C(C=CC(=C1)C(CNC(C)C)O)C=CC=C2.[H]Cl, 0 +OC([C@H](CC1=CC=C(N(CCCl)CCCl)C=C1)N)=O, 1 +[O-][N+](C1=CN=C(NC(NCC)=O)S1)=O, 1 +Br/C(Br)=C/[C@H]3[C@@H](C(=O)O[C@H](C#N)c2cccc(Oc1ccccc1)c2)C3(C)C, 0 +[O-][N+](C(N=C3)=C(SC1=NC=NC2=C1NC=N2)N3C)=O, 1 +O=NN1CCCC1, 1 +O=S1(=O)CCCO1, 1 +OC(CC(C1)C)C(C1)C(C)C, 0 +O=[N+]([O-])[O-].[Na+], 0 +ClC(Cl)(Cl)Cl, 1 +CC1SC(SC(N1N=O)C)C, 1 +ClC1=NC(=NC(=N1)NC(C)C)NC(C)C, 0 +N(C(=O)N)(N=O)CC(=O)O, 1 +O=NN1CCSCC1, 1 +O=C1CCO1, 1 +[O-][N+](C1=CC=CC(C2C(C(OC3CN(C(C5=CC=CC=C5)C4=CC=CC=C4)C3)=O)=C(NC(C)=C2C(OC(C)C)=O)N)=C1)=O, 0 +BrC(C(=O)NC(=O)N)(CC)CC, 0 +CC1=C(C=CC=C1)N=O, 1 +OC(COC1=CC=CC2=C1C=CC=C2)CNC(C)C.[H]Cl, 0 +SC1=NC2=C(C=CC=C2)S1, 1 +OC(=O)CN(CC(=O)O)CC(=O)O, 1 +[Na+].[N-]=[N+]=[N-], 0 +CC2(C)CCCC(\C)=C2\C=C\C(\C)=C\C=C\C(\C)=C\C=C\C=C(/C)\C=C\C=C(/C)\C=C\C1=C(/C)CCCC1(C)C, 0 +N#[N+][O-], 0 +O=C(N(CCCC)CC)SCCC, 0 +[S-]C1=NC(C=CC=C2)=C2S1.[S-]C3=NC(C=CC=C4)=C4S3.[Zn+2], 0 +O=C1C2=C(C=CC=C2)N=NN1CSP(=S)(OC)OC, 0 +C1(/N=N/C2=CC=CC=C2)=CC=CC=C1, 1 +N(CC(=O)[O-])(CC(=O)[O-])CC(=O)[O-].[Na+].[Na+].[Na+].O, 1 +C[N+](=NC)[O-], 1 +O=C1C[C@H](C\C=C1\C)C(C)=C, 0 +O=C2CC3=C(CC2)[C@]1([H])[C@](CC3)([H])[C@@](CC4)([H])[C@]([C@]4(O)C#C)(C)CC1, 0 +O=N[O-].[Na+], 1 +[N+](=N/CCC)(/CCC)[O-], 1 +OC1=C(C=CC=C1)O, 1 +CC(N(C1=CC=CC2=C1CC3=C2C=CC=C3)C(C)=O)=O, 1 +S=C1NC=NC2=C1N=CN2, 0 +O=[N+](C1=CC(=C(C=C1)OC)N)[O-], 1 +C\C1=C\N(C(=O)NC1=O)[C@H]2C[C@H](/N=[N+]=[N-])[C@@H](CO)O2, 1 +C1(=C(C=CC(=C1)NC(N(CC)CC)=O)OCC(CNC(C)(C)C)O)C(C)=O, 0 +O=[N+](C1=CC=C(O1)/C=N/NC(=O)N)[O-], 1 +CC(=O)NNC(=O)C, 0 +COc3cc4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](O)(CC[C@@H]12)C#C)c4cc3, 0 +O=C(O[C@H](C)C2)C1=C2C(Cl)=CC(C(N[C@@H](CC3=CC=CC=C3)[C@@](O)=O)=O)=C1O, 1 +[O-][N+](C3=CC=C(O3)C1=CN=C2N1C=CC=C2)=O, 1 +O=C(C1=C(C=CC=C1)C(=O)OCC=C)OCC=C, 0 +ClC1=C(C(=C(C(=C1Cl)Cl)Cl)Cl)C(=C(Cl)Cl)Cl, 0 +CN(C)CCN(CC1=CC=CO1)C2=CC=CC=N2, 0 +N(N)(CC=C)CC=C, 1 +CC(=O)[O-].[O-]C(=O)C.[Ba+2], 0 +N(NCC=C)CC=C.[H]Cl.[H]Cl, 1 +CN(C)CCN(CC1=CC=CS1)C2=CC=CC=C2, 0 +O=C(C)NCC1=NC(=NO1)C2=CC=C(O2)[N+]([O-])=O, 1 +[Cl-].[Ba+2].[Cl-].O.O, 0 +ClCCN(C1=CC=C(C=C1)CCCC(=O)O)CCCl, 1 +C=CCN(CC=C)N=O, 1 +C(C\C=C/CCCCCCCC)CCCCCC(=O)[O-].[Na+], 0 +CN(C)CCN(CC2=CC=CS2)C1=NC=CC=C1.Cl, 1 +NC2=NC(C3=CC=CC=C3)=C(CCOCC)C1=NC=NN12, 1 +CC(=O)NC1=NN=C(S1)C2=CC=C(O2)[N+]([O-])=O, 1 +NC1C=CC2=C(N=1)NC3=CC=CC=C23, 1 +O=C(C1=CC(=CC=C1O)/N=N/C2=CC=C(C=C2)C(=O)O)O, 0 +C1(=C(/C=C/C2=C(S(=O)(=O)[O-])C=C(C=C2)N)C=CC(=C1)N)S(=O)(=O)[O-].[Na+].[Na+], 0 +CC1=C(SSC1=S)C2=CN=CC=N2, 0 +[O-][N+](C2=CC=C(O2)C1=CSC=N1)=O, 1 +CC=O, 1 +O=CC1=CC=CC=C1, 1 +O=C1C(=C(C(=O)C(=C1Cl)Cl)Cl)Cl, 0 +NC(C=C(C=C1)N)=C1OC.O=S(O)(O)=O, 1 +N/1C(N(\C=C\1)C)=S, 1 +[O-][N+](C1=CC=C(C2=CSC(NC(C)=O)=N2)O1)=O, 1 +CC=NN(C)C=O, 1 +C1=CC=CC=C1, 1 +ClC2(C(Cl)3Cl)C(Cl)=C(Cl)C3(Cl)C1CC(Cl)C(Cl)C12, 1 +NC1=CC=C(C=C1)/N=N/C2=CC=C(C=C2)N, 0 +NC(C(=O)O)CCSC, 0 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NC=O, 1 +ClC2(Cl)C1(Cl)C(\Cl)=C(\Cl)C2(Cl)C(C1C(O)=O)C(O)=O, 1 +NC1=C2C(=NC(=N1)N)N=CC(=N2)CN(C3=CC=C(C=C3)C(=O)N[C@@H](CCC(=O)O)C(=O)O)C, 0 +CC(=O)N, 1 +NC1=CC=C(C2=CC=C(N)C=C2)C=C1, 1 +O=S(C1=NC2=C(C=CC(=C2)OC)N1)CC3=C(C(=C(C=N3)C)OC)C, 1 +NC2=CC=C(C(OC)=C2)\N=N/C1=CC=CC=C1, 0 +C1(=CC=C(C=C1)O)NC(C)=O, 1 +C1(C2=CC=C(C=C2)N)=CC=C(C=C1)N.[H]Cl.[H]Cl, 1 +O[As](=O)(C1=CC(=C(C=C1)O)[N+](=O)[O-])O, 0 +O=S(=O)(C1=CC=C(C=C1)C(=O)C)NC(=O)NC2CCCCC2, 0 +C1=CC2=CC=CC3=CC=C4C(=C23)C1=C5C(=C4)C=CC=C5, 1 +C12(=C(C=C(C=C1C=CC(=C2/N=N/C3=CC=CC=C3)O)S(=O)(=O)[O-])S(=O)(=O)[O-]).[Na+].[Na+], 0 +NC1=C(C=C2C3=C(C=CC=C3)OC2=C1)OC, 1 +O=[N+](C1=CC(=C(C=C1)N)N)[O-], 0 +O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].O=P([O-])([O-])[O-].Cl[O-].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+].[Na+], 0 +CC#N, 0 +ClC(C(C1=CC=C(C=C1)OC)C2=CC=C(C=C2)OC)(Cl)Cl, 0 +O=[N+](C1=CC(=C(C=C1)C)N)[O-], 1 +C1(=CC=CC=C1)C(=O)[O-].[Na+], 0 +C1=COC2=C1C=CC=C2, 1 +ClCl, 0 +O=C(C(=NOC(=O)NC)SC)N(C)C, 0 +COC1=CC=C(C=C1)O, 1 +NC1=NC(=NC(=N1)N)C2=CC=CC=C2, 0 +ClC1=CC=C2C(=C1)C(=NC(O)C(=O)N2)C3=CC=CC=C3, 1 +O=[N+](C1=CC=C2C3=C1C=CC=C3CC2)[O-], 1 +C1=CC=C(C(OC)C(=O)O)C=C1, 0 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)Cl, 1 +O=C(C)NC3=CC=C(C2=C3)C1=C(C2=O)C=CC=C1, 1 +O=[N+](C1=CC=C(C=C1)N)[O-], 0 +N(NC(C)=O)C1=CC=C(C=C1)CO, 1 +C1=CC=CC(=C1)C(C(C2=CC=CC=C2)=O)O, 0 +O=C1OC(O)C(C(Cl)Cl)=C1Cl, 1 +N(NC(C)=O)C(C1=CC=NC=C1)=O, 1 +O=C1C=CC(=O)C=C1, 1 +COC1=C2C(=CC3=C1OC=C3)C=CC(=O)O2, 1 +COC1=C(C=CC=C1)[N+](=O)[O-], 1 +O=C1C(C(=O)OC(=C1)C)C(=O)C, 0 +N1=C(SSC2=NC3=C(C=CC=C3)S2)SC4=C1C=CC=C4, 0 +ClC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-], 0 +[O-]\[N+](C)=N/CC, 1 +O=[N+](C1=CC(=C(C=C1)C(=O)O)N)[O-], 0 +C1(NNC(C)=O)=CC=CC=C1, 1 +N1C2=C(C=CC=C2)N=N1, 0 +O=C(N(CC(C)=O)N=O)NCCCl, 1 +N[C@@H](C\C1=C\N=C/N1)C(O)=O.Cl, 0 +CBr, 0 +O=[N+](C1=CC=CC=C1)[O-], 1 +ClC(C1=CC=CC=C1)(Cl)Cl, 1 +N(C(=O)N)(N=O)CC(C)=O, 1 +CC(OC)(C)C, 1 +O=[N+](C1=CC2=C(C=C1)NC=N2)[O-], 1 +O=C(C1=CC=CC=C1)NN, 1 +NN, 1 +NC(=O)OC, 1 +ClC1=C(C=CC=C1)[N+](=O)[O-], 1 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O, 1 +OC(CNC(C)C)COC1=CC=CC=C1OCC=C.Cl, 0 +OS(=O)(=O)O.NN, 1 +O=C(NN)OC, 0 +O=[N+](C1=CC=C(C=C1)Cl)[O-], 1 +NC1=CC=C(C=C1)OC2=CC=C(C=C2)N, 1 +C1(N=C(SC=1)NN)C2=CC=C(C=C2)N, 1 +O=C(C(C)(OC1=CC=C(C=C1)C2=CC=C(C=C2)Cl)C)OC, 1 +Cl.O=P1(OCC(C)(C)CO1)C\4=C(/C)NC(/C)=C(/C(=O)OCCN(Cc2ccccc2)c3ccccc3)C/4c5cccc(c5)[N+]([O-])=O.CCO, 0 +NC1=C(C=CC(=C1)N)Cl, 1 +S=C(N1CCOCC1)SN1CCOCC1, 1 +NNC1=NC(=CS1)C2=CC=C(O2)[N+]([O-])=O, 1 +[K+].C1(=CC=C2C(=N1)N(C=C(C2=O)C([O-])=O)C)/C=C/C3=CC=C(O3)[N+]([O-])=O, 1 +O=[N+](CC)[O-], 0 +CC(=O)OCC1=CC=CC=C1, 1 +NC1=C(C=CC(=C1)Cl)N, 1 +N1=C(SC2=C1C=CC=C2)SN3CCOCC3, 0 +NNC1=NC(C2=CC=C([N+]([O-])=O)C=C2)=CS1, 1 +OCC1=CC=CC=C1, 0 +Nc1cc(Cl)c(N)cc1.OS(O)(=O)=O, 0 +O=C1[C@](C(O)=C2[C@@]3([H])[C@@](O)(C)C4=C(C(O)=CC=C4)C2=O)(O)[C@]([C@H]3O)([H])[C@H](N(C)C)C(O)=C1C(N)=O.Cl, 0 +O=C(O)Cc1ccc(cc1)NC(C)=O, 0 +ClCC1=CC=CC=C1, 1 +ClC1=C(C=CC(=C1)Cl)OC2=CC=C(C=C2)[N+](=O)[O-], 1 +ClC1=C(C=CC(=C1)N)C, 0 +O=C(OC)C1=C(C)NC(C)=C(C(OCC(C)(C)CN(CC3=CC=CC=C3)C)=O)C1C2=CC([N+]([O-])=O)=CC=C2F.Cl, 0 +[O-][N+](=O)c1ccc2c3ccccc3Cc2c1, 1 +OC(=O)C1=C(C=CC(=C1)OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-], 1 +NC1=CC(=CC=C1C)Cl, 1 +CN(N)C=O, 1 +O=C1N(CC(=O)N1)/N=C/C2=CC=C(O2)[N+](=O)[O-], 1 +C1(=CC=C(NN)C=C1)C(O)=O.[H]Cl, 1 +C=CC=O, 0 +C1(=C(C=CC(=C1)Cl)N)C.[H]Cl, 1 +O=C(C3)C(C(O)=CC(O[C@H]4[C@H](O)[C@@H](O)[C@H](O)[C@@H](CO[C@H]5[C@H](O)[C@H](O)[C@@H](O)[C@H](C)O5)O4)=C2)=C2O[C@@H]3[C@@]1=CC(OC)=C(OC)C=C1, 0 +[O-][N+](=O)C1=CC=C(O1)C=NN2CCNC2=O, 1 +C=CC(OCC)OCC, 0 +C(CCl)(F)(F)F, 1 +N(C1=CC=CC=C1)NC2=CC=CC=C2, 1 +C=C/C=N/O, 0 +CN1C2=C(C(OC)=CC3=C2C=CC(O3)(C)C)C(C4=C1C=CC=C4)=O, 1 +NC(=O)Cc2c([O-])on[n+]2Cc1ccccc1, 1 +ClC(Cl)C(F)(F)F, 1 +O=C(C(=C)C)OC, 0 +NC(=O)C=C, 1 +[Be+2].O=S(=O)([O-])[O-], 0 +O=S1(=O)C2=C(C=C(C(=C2)S(=O)(=O)N)Cl)NCN1, 0 +CS(=O)(=O)OC, 1 +[O-][N+](C)=O, 1 +ClC1=CC(=NC(=N1)SCC(=O)O)NC2=CC=CC(=C2C)C, 1 +OC(=O)C=C, 0 +OCC(=O)[C@@]2(O)CC[C@H]3[C@@H]4CC\C1=C\C(=O)CC[C@]1(C)[C@H]4[C@@H](O)C[C@]23C, 0 +N=C(N(N=O)C)N[N+](=O)[O-], 1 +O=[N+](C1=C2C(=CC=C1)C=CC=C2)[O-], 0 +ClC1=NC(SCC(NCCO)=O)=NC(NC2=CC=CC(C)=C2C)=C1, 1 +C=CC#N, 1 +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)[N+](=O)[O-], 1 +O=C(OCC2=CC=CC(C3=CC=CC=C3)=C2C)C1C(C)(C)C1/C=C(Cl)/C(F)(F)F, 0 +OC1=CC=C(C=C1)O, 1 +C1=C(C=CC=C1)C2=CC=CC=C2, 0 +O=C(C1=CC=CC=C1)CCl, 0 +OC1=CC=C(C=C1)OCC2=CC=CC=C2, 0 +OC(=O)C(C)(C)CCCOc1ccc(OCCCC(C)(C)C(O)=O)c(c1)c2ccccc2, 1 +ClCC(=O)C1=CC=C(NC(=O)C)C=C1, 0 +O=[N+](CCC)[O-], 0 +C12C(OC3=C(N=1)C(=CC=C3C)C(N[C@@H]4C(N[C@@H](C(N5[C@@H](CCC5)C(N(CC(N([C@H](C(O[C@H]4C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)=C(C(C(=C2C(N[C@@H]6C(N[C@@H](C(N7[C@@H](CCC7)C(N(CC(N([C@H](C(O[C@H]6C)=O)C(C)C)C)=O)C)=O)=O)C(C)C)=O)=O)N)=O)C, 1 +NC1=CC=C(C=C1)Cl, 0 +CC([N+](=O)[O-])C, 0 +NC(=O)CCCCC(=O)N, 0 +OCC(CO)(CBr)CBr, 1 +C1(=CC=C(Cl)C=C1)N.[H]Cl, 1 +C(C1C=CC=CC=1)(=O)N(N=O)C, 1 +OC(=O)CC[N+](=O)[O-], 0 +CC(=O)N(O)C1=CC2=C(C=C1)C3=CC=CC=C3C2, 1 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1, 1 +C1C(CC(CC1(OOC(C)(C)C)OOC(C)(C)C)(C)C)C, 0 +ClC1=CC=CC=C1C=C(C#N)C#N, 0 +C1(=CC(=CC(=C1N)C)C)C.[H]Cl, 1 +CN(N=O)C(=O)NCCC[C@H](N)C(O)=O, 1 +O=[N+](C1=CC=C2C3=C4C(=CC=C13)C=CC=C4C=C2)[O-], 1 +CCCC[Sn](O[Sn](CCCC)(CCCC)CCCC)(CCCC)CCCC, 0 +O=[N+](C1=CC2=CC=CN=C2C=C1)[O-], 0 +C12=C3C(C4=C(C(O3)=O)C(=O)CC4)=C(C=C1OC5C2C=CO5)OC, 1 +CC(CCl)OC(C)CCl, 1 +OC(C1=CC=C(C=C1)Cl)(C2=CC=C(C=C2)Cl)C(=O)OCC, 1 +O=[N+](C1=CC=CC2=CC=CN=C12)[O-], 1 +O=C1C2=C(C=CC=C2C(=O)C3=C1C=CC=C3)O, 1 +S=P(OC1=CC=C(C=C1)[N+](=O)[O-])(OC)OC, 0 +N(CCCC(F)(F)F)(CCCC(F)(F)F)N=O, 1 +C1(OCC=C)=CC=C(CC(=O)O)C=C1Cl, 0 +CC(C1=C(C(=C(C(=C1[N+](=O)[O-])C)[N+](=O)[O-])C)[N+](=O)[O-])(C)C, 1 +O=C1N(CCC1)C, 1 +N1C(N(CC(C1=O)C)N=O)=O, 0 +CC(C=NOC(=O)NC)(SC)C, 0 +[O-][N+](C1=CC([N+]([O-])=O)=CC([N+]([O-])=O)=C1)=O, 0 +CNC1=NC=NC2=C1N=CN2, 0 +O=NN1CCC(=O)NC1=O, 1 +O=C(N(CCO)N=O)NCC, 1 +O=[N+](OC(CO[N+](=O)[O-])CO[N+](=O)[O-])[O-], 1 +O[C@H]([C@@H]2O)[C@@H](O[C@@H]2CO)N1C(N=CN=C3NC)=C3N=C1, 0 +O=C(N(CCO)N=O)N, 1 +CC(=O)O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3, 0 +O[Sn](C1=CC=CC=C1)(C2=CC=CC=C2)C3=CC=CC=C3, 0 +ClCOCCl, 1 +N(CC(CO)O)(CC(O)C)N=O, 1 +O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.O=P(OCC(CBr)Br)([O-])OCC(CBr)Br.[Mg+2], 1 +N(CC(CO)O)(CC(C)=O)N=O, 1 +O=C1C(NC(=O)N1)NC(=O)N, 0 +CC(C/C=N/N(C=O)C)C, 1 +O=C(N(CCCO)N=O)N, 1 +CC3=CC=C(C=C3)\C(C2=CC=CC=N2)=C/CN1CCCC1.O.Cl, 0 +C=CCO, 0 +C1=CC=C2C(=C1)N=C(N=C2N(CCO)CCO)C3=CC=C(S3)[N+]([O-])=O, 1 +OC1=C(C=CC(=C1)C)O, 1 +O=P(OCCCl)(OCCCl)OCCCl, 1 +C=CCCl, 0 +OC1=CC=CC2=CC=CN=C12, 0 +O=C(N(CCO)N=O)NCCCl, 1 +OC(C=C)C1=CC=C2OCOC2=C1, 1 +Oc1ccc(C[C@](C)(N)C(O)=O)cc1O.OC(=O)[C@@](C)(N)Cc1cc(O)c(O)cc1.O.O.O, 0 +O=P(OCC(CBr)Br)(OCC(CBr)Br)OCC(CBr)Br, 1 +C1CO1, 1 +C1(=C(C=CC(=C1)CCNC)OC(C(C)C)=O)OC(C(C)C)=O.[H]Cl, 0 +O=C(N(CC(C)O)N=O)NCCCl, 1 +O=C(CC(C)C)OCC=C, 1 +S=C1NCCN1, 1 +C2C(=O)NC(=O)CN2CC(C)N1CC(=O)NC(=O)C1, 1 +ClC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)Cl)N, 1 +N(CC(C)O)(CCO)N=O, 1 +NC(=O)N(CC=C)N=O, 1 +O=C1NCCN1, 0 +FC(F)(F)CNC(=N)Nc1ccn(CCCCC(N)=O)n1, 1 +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2C)N)C.CC(=O)O, 1 +[Na+].[Na+].S=C(NCCNC(=S)[S-])[S-], 0 +CS(=O)(=O)OCCCNCCCOS(C)(=O)=O.[H]Cl, 0 +CC1=C(C=CC(=C1)CC2=CC(=C(C=C2)N)C)N, 1 +S=C(N(C)C)S[Bi](SC(=S)N(C)C)SC(=S)N(C)C, 0 +N1C2=C(C3=C1C=CC=C3)C(=NC(=C2)N)C.CC(=O)O, 1 +N(CC(=O)[O-])CC(=O)O.[Na+], 0 +ClCCl, 1 +CN(C)C2=CC=C(C=C2)CC1=CC=C(N(C)C)C=C1, 1 +C(C1C=CC(=CC=1)O)(C2=CC=C(C=C2)O)(C)C, 0 +O=C(O)[C@@H](N)CC1=CNC2=C1C=CC=C2, 0 +CCC(COC(=O)CCCCC(=O)OCC(CCCC)CC)CCCC, 1 +OC(=O)CC1=CNC2=C1C=CC=C2, 0 +O=S(=O)([O-])[O-].O=S(=O)([O-])[O-].[Al+3].[K+], 0 +C12C(=C(C=CC=1NC(C)=O)S(=O)(=O)[O-])C=C(C(=C2O)/N=N/C3=C4C(=C(C=C3)/N=N\C5=CC=C(C=C5)S(=O)(=O)[O-])C=CC(=C4)S(=O)(=O)[O-])S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+], 0 +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC, 1 +O=C(NC2=C1C=C(C3=NNC(CC3)=O)C=C2)C1(C)C, 1 +O=C1C2=C(C(=CC(=C2C(=O)C3=C1C=CC=C3)Br)Br)N, 1 +NC1=C5C(C=C(S(=O)([O-])=O)C(/N=N/C6=CC=CC=C6)=C5O)=CC(S(=O)([O-])=O)=C1/N=N/C2=CC=C(C3=CC=C(/N=N/C4=C(N)C=C(N)C=C4)C=C3)C=C2.[Na+].[Na+], 1 +OC1=C(C=C(C=C1C(C)(C)C)C)CC2=CC(=CC(=C2O)C(C)(C)C)C, 0 +O=S(C1=C(/N=N/C2=CC=C(C3=CC=C(\N=N/C4=C(S(=O)([O-])=O)C=C5C(C(N)=CC(S(=O)([O-])=O)=C5)=C4O)C=C3)C=C2)C(O)=C(C(N)=CC(S(=O)([O-])=O)=C6)C6=C1)([O-])=O.[Na+].[Na+].[Na+].[Na+], 1 +O=[W](=O)([O-])[O-].[Na+].[Na+], 0 +C(C1=CC=C(C=C1)N)C2=CC=C(C=C2)N.[H]Cl.[H]Cl, 1 +CCNN.[H]Cl, 1 +CCN1(C2C(=CC=CC=2)C3=C1C=CC(=C3)N).[H]Cl, 1 +C12C(=CC(=C(C=1O)/N=N/C3=C(C=C(C=C3)C4=CC(=C(C=C4)/N=N/C5=C(C=C6C(=C5O)C(=CC(=C6)S(=O)(=O)[O-])N)S(=O)(=O)[O-])OC)OC)S(=O)(=O)[O-])C=C(C=C2N)S(=O)(=O)[O-].[Na+].[Na+].[Na+].[Na+], 1 +O=C(N(CC)N=O)NCCO, 1 +NC1=CC(S(=O)([O-])=O)=CC2=C1C(O[Cu]OC4=C(C=CC(C5=CC(O[Cu]OC7=C(C(S(=O)([O-])=O)=CC8=C7C(N)=CC(S(=O)([O-])=O)=C8)\N=N6)=C/6C=C5)=C4)\N=N3)=C/3C(S(=O)([O-])=O)=C2.[Na+].[Na+].[Na+].[Na+], 1 +N=C(N)NC1=NC(CSCCNC2=NSN=C2N)=CS1, 1 +O=C1C2=C(C(=CC=C2N)N)C(=O)C3=C(C=CC(=C13)N)N, 1 +O=C(O[C@H](CC)C(/C=C(C)/C=C/C4=O)CO[C@H](O[C@H](C)[C@H]2O)[C@H](OC)[C@@H]2OC)C[C@@H](O)[C@H](C)[C@H]([C@@H](CC=O)C[C@H]4C)O[C@H]1[C@H](O)[C@@H](N(C)C)[C@H](O[C@H](O[C@@H](C)[C@@H]3O)C[C@@]3(C)O)[C@@H](C)O1.OC(C)C(O)=O, 0 +O=C(N(CC)N=O)NCC(=O)C, 1 +CNN, 1 +O=C1C2=C(C(=CC=C2C(=O)C3=C1C=CC=C3)C)N, 1 +O=S(=O)(C1=C(C=CC=C1)/C(=C2\C=C/C(=[N+](/CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)C=C2)C4=CC=C(C=C4)N(CC5=CC(=CC=C5)S(=O)(=O)[O-])CC)[O-].[Na+].[Na+], 0 +O=C1NC(=O)NC=C1, 1 +N#CN(CC)N=O, 1 +IC(I)I, 0 +N(C)[N+].S(=O)(=O)([O-])O, 1 +O1C(=NN=C1C2OC(=CC=2)[N+](=O)[O-])N, 1 +COc3ccccc3N2CCN(CCCN\C1=C\C(=O)N(C)C(=O)N1C)CC2, 0 +O=C(NCCCN(CC)CC)CN1N=CC(C3=CC=CC=C3)=C1C2=CC=CC=C2.O=C(O)/C([H])=C([H])/C(O)=O, 0 +NC1=NN=C(C2=CC=C([N+]([O-])=O)O2)S1, 1 +C(N)(N)=O, 0 +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C, 1 +CC1=C2C(=CC=C1)C=CC=C2, 0 +C1(=C2/C(C3=CC(S(=O)(=O)[O-])=CC=C3N2)=O)/C(C4=CC(S(=O)(=O)[O-])=CC=C4N1)=O.[Na+].[Na+], 0 +NC(=O)OCC, 1 +CC(=O)O[C@H]\1CC[C@H]4C(=C/1)/CC[C@@H]2[C@@H]4CC[C@]3(C)[C@@](CC[C@@H]23)(C#C)OC(C)=O, 0 +NC1=NC(C3=C(N=CC=C3)C=C2)=C2N1C.[H]Cl, 1 +CC2=CC1=CC=CC=C1C=C2, 0 +C1(=C(C=CC(=C1)N(CCO)CCO)NC)[N+]([O-])=O, 1 +O=S(=O)([O-])[O-].[V+2]=O, 0 +CCC1(C2=C(C3=C(C(=CC=C3)CC)N2)CCO1)CC(=O)O, 0 +O=C(O[C@@H]1CC[N+]2([O-])[C@@]([H])1C3=CC2)\C(C[C@@H](C)[C@](O)(CO)C(OC3)=O)=C([H])/C, 1 +CN[N+](=O)[O-], 1 +NC1=NC(C2=CC=C([N+]([O-])=O)O2)=CS1, 1 +NC1=NC(/C=C/C2=CC=C([N+]([O-])=O)O2)=NO1, 1 +C1(=C(C=CC(=C1)N(CCO)CCO)NCCO)[N+]([O-])=O, 0 +OC1=C(C=C(C=C1)CC=C)OC, 0 +C1(C(OCC(C)C)=O)=CC=C(O)C=C1, 0 +OB(O)O, 0 +Cl.N#Cc1ccc(cc1)C3CCCc2cncn23, 0 +Br(=O)(=O)[O-].[K+], 1 +C(CCCN(N=O)C)(O)C1C=NC=CC=1, 1 +O=CCBr, 0 +O=C(C1=CC=CN=C1)CCCN(N=O)C, 1 +CC(=O)OC=C, 1 +[Na+].CN(C)c1ccc(/N=N/S([O-])(=O)=O)cc1, 0 +CC(CON=O)C, 1 +C=CBr, 1 +O.O.O.O.NC(=O)[C@@H]3CCCN3C(=O)[C@@H](NC(=O)[C@@H]1CC(=O)N(C)C(=O)N1)C\C2=C\N=C/N2, 0 +O=[N+](C1=CN=C(S1)N)[O-], 1 +ClC(Cl)Br, 1 +O=NN(C)C1=NC=NC2=C1N=CN2[C@@H]3O[C@H](CO)[C@@H](O)[C@H]3O, 1 +NC(=O)OC=C, 1 +CC/C(C2=CC=CC=C2)=C(C1=CC=CC=C1)/C(C=C3)=CC=C3OCCN(C)C.OC(C(CC(O)=O)(O)CC(O)=O)=O, 1 +CCBr, 1 +S=P(OC1=CC(=C(C=C1)SC)C)(OC)OC, 0 +FC(C(OC(F)F)Cl)(F)F, 0 +C=CCl, 1 +O=C1C2=CC(=CC=C2C(=O)C3=C1C=CC=C3)N, 1 +O=C(C(C1=CC=C(C=C1)Cl)C(C)C)OC(C2=CC=CC(=C2)OC3=CC=CC=C3)C#N, 0 +O=C(NCO)C=C, 1 +C=CF, 1 +CC1=C(C=CC=C1)/N=N/C2=CC(=C(C=C2)N)C, 1 +.[Cl-].[Fe+3].[Cl-].[Cl-], 0 +COC1C=C(C=CC=1C2NC3=CN=CC=C3N=2)S(C)=O, 1 +C(C1=CC=CC=C1)(C2CCCCN2)C(OC)=O.[H]Cl, 1 +NCCS(O)(=O)=O, 0 +[Fe+3].O=C([O-])CC(O)(CC(=O)[O-])C([O-])=O.O.O.O.O, 0 +O=C(C1=CC=NC=C1)NN, 1 +CC1=CC2=CC=CN=C2C=C1, 0 +O=C(N1)N(C2OCCC2)C=C(F)C1=O, 0 +N(C)(C)C([S-])=S.[Fe+3].[S-]C(=S)N(C)C.[S-]C(=S)N(C)C, 0 +NC(=O)C1=CC=NC=C1, 0 +CC1=CC=CC2=CC=CN=C12, 0 +C=C(Cl)Cl, 1 +Cl/C2=C(\Cl)C3(Cl)C1C(Cl)OC(Cl)C1C2(Cl)C3(Cl)Cl, 0 +OC(=O)C1=CC=NC=C1, 0 +C=CC1=CC=C(C=C1)C, 0 +C=C(F)F, 0 +C1(C(NCC2CCCCN2)=O)=C(C=CC(=C1)OCC(F)(F)F)OCC(F)(F)F.CC(=O)O, 0 +COC1=C(O)C=CC(=C1)C=NNC(=O)C2=CC=NC=C2, 1 +NC1=CC=C(C=C1)C2=CC=CC=C2, 1 +CC1(CC(=CC(=O)C1)C)C, 1 +CN1C2=CC=C(C=C2C(=NC(C1=O)O)C3=CC=CC=C3)Cl, 0 +O=C(NC1=CC=CC(=C1)C(F)(F)F)N(C)C, 0 +NC3=CC1=C(C=C3)OC2=C1C=CC=C2, 1 +O=C1N(C=C)CCC1, 1 +CN1CCN(CC1)/C2=N/C3=CC=CC=C3SC4C=CC(C)=CC2=4, 0 +O=C(C(F)(F)F)NC1=CC3=C(C2=CC=CC=C2C3)C=C1, 1 +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](/CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=C(C=C5)N(C)C.[Na+], 1 +ClCCN[P]1(=O)OCCCN1CCCl, 1 +N1(C(=CN=C1C)[N+](=O)[O-])CCO, 1 +OS(O)(=O)=O.OCCN(CCO)c1ccc(N)cc1, 0 +O[C@H]1[C@@H](NC(CO)CO)C[C@](O)(CO)[C@@H](O)[C@@H]1O, 0 +CC(=C)C=C, 1 +CC1=C(C(=CC(=C1)OC(=O)NC)C)N(C)C, 0 +C1(N=CNN=1)N, 1 +O=C(OC)C1=C(C)NC(C)=C(C(OCCC3=CC=C(N4CCN(C(C6=CC=CC=C6)C5=CC=CC=C5)CC4)C=C3)=O)C1C2=CC([N+]([O-])=O)=CC=C2.Cl.Cl, 0 +[Na+].[F-], 0 +OC(C)C, 0 +O=C(C1=CC=C(C=C1)N(C)C)C2=CC=C(C=C2)N(C)C, 1 +OC1=C(C=C(C=C1C(C)(C)C)C(C)(C)C)C(C)(C)C, 0 +OC(=O)CCCCCCCCCCN, 1 +NC2=CC=C(C=C2N)C1=CC=C(N)C(N)=C1.Cl.Cl.Cl.Cl, 1 +NC1=CC=C(C=C1)C2=CC=C(C=C2)F, 1 +CC(OC1=CC=C(C=C1)NC2=CC=CC=C2)C, 0 +ClC53C1(Cl)C4(Cl)C2(Cl)C1(Cl)C(Cl)(Cl)C5(Cl)C2(Cl)C3(Cl)C4(Cl)Cl, 1 +Cl.CC(C)(C)NCC(O)COc1cccc(C)c1C, 0 +Clc1c([N+]([O-])=O)c(Cl)c(Cl)c(OC)c1Cl, 0 +Cl.CC(=O)O[C@@H](CC)C(C[C@H](C)N(C)C)(c1ccccc1)c2ccccc2, 1 +O=C(NC1=CC=CC(=C1)Cl)OC(C)C, 0 +CC(C)C=O, 0 +ClC1=CC(=C(C=C1C2=C(C=C(C(=C2)Cl)N)Cl)Cl)N, 0 +O=C(C(C1=CC=CC=C1)(C2=CC=CC=C2)CC(N(C)C)C)CC.[H]Cl, 0 +N(=C(C=1)C)N(C(C)C)C=1OC(=O)N(C)C, 0 +C1(C[C@H]([C@@H]([C@H]1CCCCCCC(=O)OC)/C=C/CC(O)(CCCC)C)O)=O, 0 +ClC1=CC2=C(C=C1Cl)OC3=C(C=C(C(=C3)Cl)Cl)O2, 1 +CN(C)CNc2nnc(/C=C/c1ccc(o1)[N+]([O-])=O)o2, 1 +O=C1C(=CNC(=O)N1)F, 1 +O=C(NC1=CC=CC=C1)OC(C)C, 0 +O=C(C(C)=C4N)C2=C(C4=O)[C@](COC(N)=O)([H])[C@@](N2C3)(OC)[C@@]1([H])N[C@@]31[H], 1 +CC(=O)O[C@@H]3CC(=O)O[C@H](C)C\C=C\C=C\[C@H](O)[C@H](C)C[C@H](CC=O)[C@H](O[C@@H]2O[C@H](C)[C@@H](O[C@H]1C[C@@](C)(O)[C@H](OC(=O)CC(C)C)[C@H](C)O1)[C@H](N(C)C)[C@H]2O)C3OC, 0 +O=S(=O)(C1=CC(=C(C=C1Cl)Cl)Cl)C2=CC=C(C=C2)Cl, 0 +C1=C(C(=C(C=C1O)C)N(C)C)C, 0 +C(NC)CC(OC1=CC=C(C=C1)C(F)(F)F)C2=CC=CC=C2.[H]Cl, 0 +C/C=C/C1=CC2=C(C=C1)OCO2, 0 +O=[Mo](=O)=O, 1 +[N+].[O-], 0 +C1(C(=CC=C(C=1)C)C)N.[H]Cl, 1 +ClC(CCl)(Cl)Cl, 1 +O=C1N(C2=CC=CC=C2)N(C(=C1N(C)C)C)C, 0 +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC=C(C=C3)O, 0 +O=C1C(O)=COC(CO)=C1, 1 +ClC(C(Cl)Cl)Cl, 1 +C=O, 1 +O=S(O)(O)=O.C1(=CC=CC=C1CC(N)C).C2=CC=CC=C2CC(N)C, 0 +CC(=C)C#N, 0 +ClC(=C(Cl)Cl)Cl, 1 +O=NN(CCN(C)C)C(=O)[NH2+]CC.[O-]N=O, 1 +[H][C@@]12[C@]([H])(NC([C@H](N)C3=CC=CC=C3)=O)C(N1[C@@H]([C@@](O)=O)C(C)(C)S2)=O.O.O.O, 0 +O=C(O)COC1=C(C)C=C(Cl)C=C1, 0 +OC1=C(C=C(C=C1)C)/N=N/C2=CC=C(C=C2)NC(=O)C, 1 +O=C(N(CCCCC)N=O)N, 1 +CCC(C)=NO, 1 +C1=CC=C(NC(=O)C(/N=N/C2=C(Cl)C=C(C3=CC(Cl)=C(/N=N/C(C(=O)NC4=CC=CC=C4)C(=O)C)C=C3)C=C2)C(=O)C)C=C1, 0 +ClC54C(=O)C1(Cl)C2(Cl)C5(Cl)C3(Cl)C4(Cl)C1(Cl)C2(Cl)C3(Cl)Cl, 1 +O(C)c1cc(CC=C)ccc1OC, 1 +ClC1=CC(Cl)=C(/N=N/C(C(=O)NC2=C(C=C(C3=CC(C)=C(NC(=O)C(/N=N/C4=C(Cl)C=C(Cl)C=C4)C(=O)C)C=C3)C=C2)C)C(=O)C)C=C1, 0 +CC1=NC=CN1, 1 +C1(C2=CC=C(C(=C2)Cl)N=NC(C(C)=O)C(=O)NC3=C(C=C(C(=C3)OC)Cl)OC)=CC(=C(C=C1)N=NC(C(C)=O)C(=O)NC4=CC(=C(C=C4OC)Cl)OC)Cl, 0 +Cl.CN(C)[C@@H]2C(\O)=C(\C(N)=O)C(=O)[C@@]3(O)C(/O)=C4/C(=O)c1c(cccc1O)[C@@](C)(O)[C@H]4C[C@@H]23, 0 +C/C=C/C1=CC=C(C=C1)OC, 0 +[O-][N+](=O)C1=CC=C(O1)C2=CSC(=N2)NNC=O, 1 +[H][C@]12N(CC=C2COC([C@@](O)(C(O)(C)C)[C@H](C)OC)=O)CC[C@@H]1OC(\C(C)=C/C)=O, 1 +S=C(N(CC)CC)SSC(=S)N(CC)CC, 0 +S=C([S-])NCCNC([S-])=S.[Zn+2], 0 +O[C@H]1[C@@H]([C@H](O)CO)O[C@H]2[C@@H]1O[C@@H]([C@@](Cl)(Cl)Cl)O2, 0 +O=C([O-])C(NN1C2=CC=C(S(=O)([O-])=O)C=C2)=C(/N=N/C3=CC=C(S(=O)([O-])=O)C=C3)C1=O.[Na+].[Na+].[Na+], 0 +ClC1=NC(=NC(=N1)NC2=CC=CC=C2Cl)Cl, 0 +O=CNN, 1 +[O-]C(C)=O.[O-]C(C)=O.[Pb+2].[OH-].[OH-].[Pb+2].[OH-].[OH-].[Pb+2], 1 +O=S(C1=CC=C2C(C=CC(O)=C2\N=N/C3=CC=C(S(=O)([O-])=O)C=C3)=C1)([O-])=O.[Na+].[Na+], 0 +C1(C2=CC(=C(N)C=C2)C)(=CC(=C(N)C=C1)C).[H]Cl.[H]Cl, 1 +S=C(S[Pb]SC(N(C)C)=S)N(C)C, 0 +F/C(F)=C(\F)F, 1 +[N+](=O)([O-])c1ccccc1C, 1 +O=C(N(C)C)Cl, 1 +O=C(C[C@@H]([C@@](O)=O)CC(O)=O)O[C@H]([C@@H](C)CCCC)[C@@H](C[C@H](C)C[C@@H](O)CCCC[C@@H](O)C[C@H](O)[C@@H](N)C)OC(C[C@@H]([C@@](O)=O)CC(O)=O)=O, 1 +OCCNC1=C(OCCO)C=C([N+]([O-])=O)C=C1, 0 +C(S)(=S)N(C)C.N(C)C, 0 +O=C2C1=C(CCC2)C(OC[C@@H](O)CNC(C)(C)C)=CC=C1.Cl, 0 +O=C(O)\C=C/C(O)=O.O=C(NC3CC(N4C)CCC4C3)C1=C2C(CC(C)(C)O2)=CC(Cl)=C1, 0 +OC2=C1[C@@](C=C(C)CC3)([H])[C@]3([H])C(C)(C)OC1=CC(CCCCC)=C2, 0 +NC1=CC=CC=C1[H]Cl, 1 +C[N+](CCCCCCCCCCCC)(C)[O-], 0 +C1=COC=C1, 1 +C1CCCO1, 1 +C1(=C(C=CC=C1)N)OC.[H]Cl, 1 +O=S(\N=C(NCCSCC2=CC=C(CNC)O2)/NCC(C1=CC=C(O)C=C1)O)(C)=O, 1 +CN(C=O)C, 0 +O=CC1=CC=CO1, 1 +O=C(O)CC[C@@H](C)[C@]3([H])[C@](CC2)(C)[C@](CC3)([H])[C@@](CC4)([H])[C@@]2([H])[C@]1(C)[C@@]4([H])C[C@H](O)CC1, 0 +C1(=CC=C(N)C=C1)OC.[H]Cl, 0 +O=C3C[C@@H]4CC[C@@H]1[C@H](CC[C@]2(C)[C@@](C)(O)CC[C@@H]12)[C@@]4(C)C\C3=C\O, 1 +CN(C)N, 1 +OC1=CC(=CC2=C1C(=O)O[C@H](CCCC(=O)CCC/C=C\2)C)O, 1 +C1=CC=CC=C1C(COC(N)=O)COC(N)=O, 1 +NC1=C(C=CC=C1)C(=O)O, 0 +N(NC)C.[H]Cl.[H]Cl, 1 +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3, 0 +[O-][N+](C2=CC=C(O2)C1=CSC(NN(C)C)=N1)=O, 1 +S=C([S-])N(CCCC)CCCC.[S-]C(N(CCCC)CCCC)=S.[Zn+2], 0 +[Cl-].OC[P+](CO)(CO)CO, 0 +C1(=N\CCN/1)C(C)OC2C(=CC=CC=2Cl)Cl.[H]Cl, 0 +[O-][N+](=O)N(C)C, 1 +S=C([S-])N(CC)CC.[S-]C(N(CC)CC)=S.[Zn+2], 0 +OC[P+](CO)(CO)CO.[O-]S([O-])(=O)=O.OC[P+](CO)(CO)CO, 0 +CC(COC1=CC=C(C=C1)C(C)(C)C)OS(=O)OCCCl, 1 +OC(=O)C1=NN(C2=C1C=CC=C2)CC3=CC=C(C=C3Cl)Cl, 0 +S=C([S-])N(C)C.[S-]C(N(C)C)=S.[Zn+2], 1 +S=C(N(C)C)SSC(=S)N(C)C, 0 +NN(C=O)CCC, 1 +O=C(OC)C1=CCCN(C)C1.[H]Cl, 1 +CC(C)(CO)CCCCCCC(C)(C)CO, 0 +OC(C(SC(Cl)=C1)=C1S(N2C)(=O)=O)=C2C(NC3=NC=CC=C3)=O, 0 +S=C(N(C)C)SC(=S)N(C)C, 0 +O=C(C1=CC(=C(C(=C1)O)O)O)OCCC, 0 +[K+].[I-], 1 +C\C(C)=C/Cl, 1 +C[C@@H](CC)C(=O)O[C@H]2C[C@@H](C)\C=C3\C=C/[C@H](C)[C@H](CC[C@@H]1C[C@@H](O)CC(=O)O1)[C@@H]23, 1 +O=[N+](C([N+](=O)[O-])([N+](=O)[O-])[N+](=O)[O-])[O-], 1 +CCCOC(=O)[CH]1[CH](C)CC2=C(C=C3OCOC3=C2)[CH]1C(=O)OCCC, 0 +C2(=O)C(C1=CC=CC=C1)(CC)C(=O)NCN2, 1 +C(=O)(/C=C/C)OC1=C(C(CCCCCC)C)C=C(C=C1[N+]([O-])=O)[N+]([O-])=O, 0 +[Cl-].C/[N+](C)=C1\C=C/C(C=C1)=C(\c2ccc(cc2)N(C)C)c3ccc(cc3)N(C)C, 1 +Cn3nc(CO)nc3NCCCOc2cc(CN1CCCCC1)ccc2, 1 +N#[N+]C1=CC=CC=C1.F[B-](F)(F)F, 0 +S1C=CC(=C1)CN(C2=NC=CC=C2)CCN(C)C, 0 +OC(COC(C)(C)C)C, 1 +CS(=O)(=O)OC1=C(C=C(C=C1C(C)(C)C)[N+]([O-])=O)[N+](=O)[O-], 0 +Cl.Cl.Cl.Cc1ccc(cn1)C\C2=C\N/C(=N\C2=O)NCCSCc3ccc(CN(C)C)o3, 1 +O=C2C=1/N=C\NC=1N(C)C(=O)N2C, 0 +N1=CC=CC=C1, 1 +O=NN(C(=O)N)CCC, 1 +O=C1C23C4C5C6(C(=O)C7=C(O)C(C)=CC(=C7C(C6=C(C2C5O)O)=O)O)C(C4O)C(=C3C(=O)C8=C1C(O)=C(C)C=C8O)O, 1 +N(CCN(C)C)(C)N=O, 1 +N1C(=NC2=C1C=CC=C2)C3=CSC=N3, 0 +[H][C@]12C3=CCN1CC[C@H]2OC(/C(CC([C@@](CO)(O)C(OC3)=O)=C)=C\C)=O, 1 +CC=C, 0 +OC(=O)[C@@H]3[C@]51C[C@@](O)(CC[C@H]1[C@@]24\C=C/[C@H](O)[C@@](C)(C(=O)O2)[C@@H]34)C(=C)C5, 0 +OC[C@@H](NC(C(Cl)Cl)=O)[C@H](O)C1=CC=C(S(=O)(C)=O)C=C1, 0 +CC(CO)O, 0 +O=NN(CCN1N=O)CCC1, 1 +N1C2=C(N3C=1/C(=C\C=C/3)C)N=C(C=C2)N, 1 +Cl[Mg]Cl.O.O.O.O.O.O, 0 +S=P(N1CC1)(N1CC1)N1CC1, 1 +ClC1=C(Cl)C=CC([C@H]2C3=C(C=CC=C3)[C@@H](NC)CC2)=C1.Cl, 0 +CC1CO1, 1 +N12C3=C(C=CC(=N3)N)N=C1C=CC=C2, 1 +C1(CN(N=O)CC(O1)C)C, 1 +[O-]P(=O)=O.[Na+], 0 +NNCCC.[H]Cl, 1 +O=NN1CCN(N=O)CC1, 1 +O=C1C=C(NC(=S)N1)CCC, 1 +O=C(C(SP(=O)(OC)OC)CC(=O)OCC)OCC, 0 +CCOC(=O)N(C)N=O, 1 +CC(=S)N, 1 +O[C@@H]1[C@@](O[C@@H](O[C@H](CO)[C@@H]2Cl)[C@H](O)[C@H]2O)(CCl)O[C@H](CCl)[C@H]1O, 0 +O=C(C(SP(=S)(OC)OC)CC(=O)OCC)OCC, 0 +C1N(COC1)N=O, 1 +CC(C1=CC(=C(C=C1O)C)SC2=CC(=C(C=C2C)O)C(C)(C)C)(C)C, 0 +O=C1C=CC(=O)NN1, 0 +O=C(N(CCC1=CC=CC=C1)N=O)N, 1 +OC1=C(C=C(C=C1SC2=C(C(=CC(=C2)Cl)Cl)O)Cl)Cl, 0 +O=C(O[C@@H]1[C@@](O[C@@H](O[C@H](COC(C)=O)[C@H]2OC(C(C)C)=O)[C@H](OC(C(C)C)=O)[C@H]2OC(C(C)C)=O)(COC(C)=O)O[C@H](COC(C(C)C)=O)[C@H]1OC(C(C)C)=O)C(C)C, 0 +C1(=CC=C2C(=C1)N(C(\N=C/2C3=CC=CC=C3)=O)C(C)C)C, 0 +C1=CC(=CC=C1NNC(CC[C@@H](C(O)=O)N)=O)CO, 0 +C(=C/C=O)\[O-].[Na+], 1 +C([S-])#N.[Na+], 0 +CCCCOP(=O)(OCCCC)OCCCC, 1 +C1(=CC=C(C=C1)SC2=CC=C(C=C2)N)N, 1 +CC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-], 0 +O=S(=O)([O-])[O-].O.[Mn+2], 0 +N1C=CC=C(C=1)C2N(N=O)CCC2, 1 +F[B-](F)(F)F.[Na+], 0 +O=P(OC(CCl)CCl)(OC(CCl)CCl)OC(CCl)CCl, 1 +OC(CO)CCl, 0 +Cl.Cl.[O-][N+](=O)c1cccc(c1)C/2C(\C(=O)OC)=C(\C)NC(\C)=C\2C(=O)OCCN3CCN(CC3)C(c4ccccc4)c5ccccc5, 0 +O=C(C1=CC=C(C=C1)N)NC2=CC=C(C=C2)N, 0 +NC(=S)NN, 0 +C1COCCO1, 1 +O[C@@H]([C@H](O)[C@H](O)CO)[C@H](O)CO, 0 +O=C(NC3=CC2=C(C=C3)C1=CC=C(NC(C)=O)C=C1C2)C, 0 +O=C1NC(=S)NC=C1, 1 +NC(=O)C1=NC=CN=C1, 0 +S=P(SC1C(SP(=S)(OCC)OCC)OCCO1)(OCC)OCC, 0 +OCC1CO1, 1 +NC1=C(C=CC(=C1)N)C, 1 +COC2=CC=C(C=C2)CN(CCN(C)C)C1=NC=CC=C1.OC(\C=C/C(O)=O)=O, 1 +[NH3+]C2=C(C)C=C(C3=N2)C1=C(N3)C=CC=C1.O=C([O-])C, 1 +NC1(=C(C=CC(=C1)N)C).[H]Cl.[H]Cl, 1 +S=C(N1CCCCC1)SSSSSSC(=S)N1CCCCC1, 0 +CN(C)[C@@H]2/C=C\CC[C@@]2(c1ccccc1)C(=O)OCC.OC(=O)\C=C\C(O)=O, 0 +NC1=C(C(=NC(=N1)N)CC)C2=CC=C(C=C2)Cl, 0 +C1(=CC(=C(C(=C1)N)C)N).[H]Cl.[H]Cl, 0 +O=NN(CCCCC)CCCCC, 1 +OCC(=O)[C@@]4(O)C[C@H](O[C@H]1C[C@H](N)[C@H](O)[C@H](C)O1)c5c(O)c3C(=O)c2c(OC)cccc2C(=O)c3c(O)c5C4, 0 +O=C1C2=C(C=C(C=C2O)O)OC(=C1O)C3=CC(=C(C=C3)O)O, 1 +NC1=C(C)C=C(N)C=C1.O=S(O)(O)=O, 0 +C(C1=CC=CC=C1)(C2=CC=CC=C2)OCCN(C)C.[H]Cl, 0 +O=C1C2=C(C=C(C=C2O)O)O/C(=C\1O)C3=CC(=C(C=C3)O)O.O.O, 0 +CN1C2=C(C=C(C=C2)Cl)C(=NCC1=O)C3=CC=CC=C3, 0 +N(C1=CC=C(C=C1)NC2=CC=CC=C2)C3=CC=CC=C3, 0 +Cl.CC(C)(C)NCC(O)CO/C1=C/N(C)C(=O)c2ccccc12, 0 +S=P(OC1=NC(=NC(=C1)C)C(C)C)(OCC)OCC, 0 +N#CC(C1=CC=CC=C1)C2=CC=CC=C2, 0 +[Sn+2].[Cl-].[Cl-], 0 +[Na+].[Na+].OC(=O)[C@]5(C)C[C@H]6/C7=C/C(=O)[C@H]4[C@@](C)(CC[C@@H]3[C@]4(C)CC[C@H](OC2O[C@H](C([O-])=O)[C@@H](O)[C@H](O)[C@H]2O[C@H]1O[C@@H]([C@@H](O)[C@H](O)[C@H]1O)C([O-])=O)C3(C)C)[C@]7(C)CC[C@@]6(C)CC5, 0 +O=[Ti]=O, 0 +C(/C1=CC=C(C=C1)N(CC2=CC(=CC=C2)S(=O)(=O)[O-])CC)(=C3\C=C/C(C=C3)=[N+](\CC4=CC(=CC=C4)S(=O)(=O)[O-])CC)C5=CC=CC=C5.[Na+], 1 +C(C(=O)[O-])(O[Ti](OC(C(=O)[O-])=O)=O)=O.[K+].[K+], 0 +Cl.CCOC(=O)[C@H](CCc1ccccc1)N[C@@H](C)C(=O)N2Cc3ccccc3C[C@H]2C(O)=O, 0 +O=C(OC1=CC=CC=C1)OC2=CC=CC=C2, 0 +[Ti+2](C1=CC=CC1)C2(=CC=CC2).[Cl-].[Cl-], 0 +C(/C1=C(C=C(C=C1)O)S(=O)(=O)[O-])(C2=CC=C(C=C2)N(CC3=CC(=CC=C3)S(=O)(=O)[O-])CC)=C4/C=C/C(C=C4)=[N+](\CC5=CC(=CC=C5)S(=O)(=O)[O-])CC.[Na+].[Na+], 0 +Cl.O=C(c2cn(C)c1ccccc12)[C@H]3CC=4N\C=N/C=4CC3, 0 +O1C2=C(C=CC=C2)OC3=CC=CC=C13, 0 +O=C2C1=C(OC)C=C(OC)C(Cl)=C1O[C@]32C(OC)=CC(C[C@@](C)3[H])=O, 1 +C1(=C(C)C2OC(CCC=2C(=C1OC(=O)C)C)(CCCC(CCCC(CCCC(C)C)C)C)C)C, 0 +CC1=CC(C4=CC(C)=C(/N=N/C5=CC=C(OS(=O)(C6=CC=C(C)C=C6)=O)C=C5)C=C4)=CC=C1/N=N/C2=C(O)C=CC3=CC(S(=O)([O-])=O)=CC(S(=O)([O-])=O)=C23.[Na+].[Na+], 1 +N1(C2=CC=CC=C2)C(C(N(CS(=O)(=O)[O-])C)=C(N1C)C)=O.[Na+], 1 diff --git a/test/data/multicolumn.csv b/test/data/multicolumn.csv new file mode 100644 index 0000000..37418d9 --- /dev/null +++ b/test/data/multicolumn.csv @@ -0,0 +1,8 @@ +SMILES, Hamster Carcinogenicity, numeric feature, classification, mixed, string, regression +c1ccccc1NN , 1, 1, true , true , test, 1.1 +C12C3=C(C=CC=C3)CC1=CC(=CC=2)NC(C)=O , 1, 2, false, 7.5 , test, 0.24 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1, 1, 3, true , 5 , test, 3578.239 +C1(N=CNN=1)N , 0, 4, false, false, test, -2.35 +O=C(N)\C(C2=CC=CO2)=C/C1=CC=C([N+]([O-])=O)O1, 1, 2, true , 4 , test_2, 1 +C1(N=CNN=1)N , 1, 2, false, false, test, -1.5 +c1nccc1 , 1, , false, , , 1.0 diff --git a/test/data/rat_feature_dataset.csv b/test/data/rat_feature_dataset.csv new file mode 100644 index 0000000..882b018 --- /dev/null +++ b/test/data/rat_feature_dataset.csv @@ -0,0 +1,1179 @@ +InChI,[#35&A]-[#6&A],[#16&A]-[#6&A],[#6&A]-[#6&A](=[#6&A])(-[#7&A]),[#6&A]-[#6&A]-[#6&A]-[#6&A]=[#6&A]-[#6&A]=[#6&A],[#6&A]-[#6&A]=[#6&A]-[#6&A]=[#6&A]-[#6&A],[#8&A]=[#6&A]-[#6&A]=[#6&A],[#8&A]-[#6&A](-[#6&A]=[#6&A])(=[#8&A]),[#8&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&A]-[#6&A]=[#6&A],[#8&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&A]-[#6&A]=[#6&A])(:[#6&a]:[#6&a]),[#6&A]-[#6&A]-[#7&A]-[#6&A]-[#6&A]=[#6&A],[#8&A]-[#6&A]-[#6&A]=[#6&A],[#6&A]-[#6&A]-[#6&A]-[#6&A]=[#6&A],[#8&A]-[#6&A](-[#6&A]=[#6&A])(-[#6&A]-[#6&A]),[#8&A]-[#6&A]-[#6&A]=[#6&A]-[#8&A],[#6&A]-[#6&A]=[#6&A]-[#6&A],[#8&A]-[#6&A]-[#6&A]=[#6&A]-[#6&A]=[#8&A],[#8&A]-[#6&A](-[#6&A]=[#6&A]-[#6&A])(=[#8&A]),[#6&a]-[#6&A]-[#6&A]=[#6&A]-[#6&A],[#8&A]-[#6&A]-[#6&A]=[#6&A]-[#6&A],[#6&A]-[#6&A]-[#6&A]-[#6&A]=[#6&A]-[#6&A],[#8&A]-[#6&A]-[#6&A]-[#6&A]-[#6&A]=[#6&A]-[#6&A],[#8&A]-[#6&A]-[#6&A]=[#6&A]-[#6&A]-[#6&A]-[#6&A],[#8&A]-[#6&A]-[#6&A]=[#6&A]-[#6&A]-[#6&A],[#8&A]-[#6&A]=[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#8&A]-[#6&A]=[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a],[#8&A]-[#6&A]=[#7&A]-[#6&a]:[#6&a]:[#6&a],[#8&A]-[#6&A]=[#7&A]-[#6&a]:[#6&a],[#7&A]-[#7&A]-[#6&A]=[#7&A]-[#6&A]-[#6&A],[#8&A]-[#6&A](=[#7&A]-[#6&A]-[#6&A])(-[#7&A](-[#7&A]=[#8&A])(-[#6&A])),[#8&A]-[#6&A](=[#7&A]-[#6&A]-[#6&A])(-[#7&A]-[#7&A]=[#8&A]),[#8&A]-[#6&A](=[#7&A]-[#6&A]-[#6&A])(-[#7&A](-[#7&A])(-[#6&A])),[#8&A]-[#6&A](=[#7&A]-[#6&A]-[#6&A])(-[#7&A]-[#7&A]),[#7&A]-[#7&A]-[#6&A]=[#7&A]-[#6&A],[#8&A]-[#6&A](=[#7&A]-[#6&A])(-[#7&A](-[#7&A]=[#8&A])(-[#6&A])),[#8&A]-[#6&A](=[#7&A]-[#6&A])(-[#7&A]-[#7&A]=[#8&A]),[#8&A]-[#6&A](=[#7&A]-[#6&A])(-[#7&A](-[#7&A])(-[#6&A])),[#8&A]-[#6&A](=[#7&A]-[#6&A])(-[#7&A]-[#7&A]),[#6&A]-[#6&A]-[#7&A]=[#6&A]-[#7&A]-[#6&A],[#8&A]-[#6&A](=[#7&A]-[#6&A]-[#6&A])(-[#7&A]-[#6&A]),[#8&A]-[#6&A](=[#7&A]-[#6&A])(-[#7&A]-[#6&A]),[#6&A]-[#6&A](=[#7&A]-[#6&A])(-[#8&A]),[#6&A]-[#6&A]=[#7&A]-[#6&A],[#6&A]-[#6&A]-[#6&A]=[#7&A]-[#6&A],[#8&A]=[#6&A],[#8&A]-[#6&A]=[#8&A],[#6&a]-[#6&A],[#6&a]:[#6&a]-[#6&A],[#6&a]:[#6&a]:[#6&a]-[#6&A],[#17&A]-[#6&a]:[#6&a]:[#6&a]-[#6&A],[#6&A]-[#6&A]-[#6&a]:[#6&a]:[#6&a]-[#6&A],[#6&a]:[#7&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&A],[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&A],[#6&a]:[#6&a](-[#6&A])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a]:[#6&a](-[#6&A](=[#8&A])(-[#6&A]))(:[#6&a]:[#6&a]:[#6&a]),[#8&A]-[#6&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a],[#6&a]:[#6&a]:[#6&a](-[#6&A]-[#8&A])(:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](-[#6&A])(:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a]:[#6&a](-[#6&A](=[#8&A])(-[#6&A]))(:[#6&a]:[#6&a]),[#8&A]-[#6&A]-[#6&a]:[#6&a]:[#6&a],[#6&a]:[#6&a]:[#6&a](-[#6&A]-[#8&A])(:[#6&a]:[#6&a]),[#6&a]:[#6&a](-[#6&A])(:[#6&a]:[#6&a]),[#6&A]-[#6&A](-[#6&a]:[#6&a])(=[#8&A]),[#8&A]-[#6&A]-[#6&a]:[#6&a],[#6&a]:[#6&a](-[#6&A])(:[#6&a]),[#6&A]-[#6&A](-[#6&a])(=[#8&A]),[#8&A]-[#6&A]-[#6&a],[#8&A]=[#16&A]-[#7&A]-[#6&A],[#8&A]=[#7&A]-[#7&A]-[#6&A],[#6&A]-[#7&A](-[#6&A])(-[#7&A]),[#6&A]-[#6&a](:[#6&a]-[#7&A]-[#6&A])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#6&A]-[#6&a](:[#6&a](-[#7&A]-[#6&A])(:[#6&a]))(:[#6&a]:[#6&a]:[#6&a]),[#6&A]-[#6&a]:[#6&a](-[#7&A]-[#6&A])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#6&A]-[#6&a](:[#6&a]-[#7&A]-[#6&A])(:[#6&a]:[#6&a]:[#6&a]),[#6&A]-[#6&a](:[#6&a](-[#7&A]-[#6&A])(:[#6&a]))(:[#6&a]:[#6&a]),[#6&A]-[#6&a](:[#6&a](-[#7&A]-[#6&A])(:[#6&a]:[#6&a]))(:[#6&a]:[#6&a]),[#6&A]-[#6&a]:[#6&a](-[#7&A]-[#6&A])(:[#6&a]:[#6&a]:[#6&a]),[#6&A]-[#6&a](:[#6&a]-[#7&A]-[#6&A])(:[#6&a]:[#6&a]),[#6&A]-[#7&A]-[#6&A],[#8&A]-[#6&A](-[#7&A]-[#6&A])(=[#7&A]),[#6&A]-[#7&A](-[#6&A])(-[#6&A]=[#8&A]),[#6&A]-[#7&A](-[#6&A])(-[#6&A](=[#8&A])(-[#6&A])),[#8&A]-[#6&A]-[#7&A]-[#6&A],[#17&A]-[#6&A]-[#6&A]-[#7&A]-[#6&A],[#8&A]=[#6&A](-[#7&A]-[#6&A])(-[#6&A]-[#7&A]),[#6&A]-[#6&A](-[#7&A]-[#6&A])(-[#6&A]-[#6&A]-[#6&A]-[#6&A]),[#6&A]-[#7&A](-[#6&A])(-[#6&A]-[#6&A]-[#6&A]-[#6&A]),[#7&A]-[#7&A](-[#6&A]-[#8&A])(-[#6&A]-[#6&A]-[#6&A]),[#6&A]-[#7&A](-[#6&A])(-[#6&A]-[#6&A]-[#6&A]),[#6&A]-[#6&A](-[#7&A]-[#6&A])(-[#6&A]-[#6&A]),[#7&A]-[#7&A](-[#6&A](=[#7&A])(-[#8&A]))(-[#6&A]-[#6&A]),[#7&A]-[#7&A](-[#6&A]=[#7&A])(-[#6&A]-[#6&A]),[#8&A]-[#6&A]-[#7&A]-[#6&A]-[#6&A],[#7&A]-[#7&A](-[#6&A]-[#8&A])(-[#6&A]-[#6&A]),[#6&A]-[#6&A](-[#7&A]-[#6&A]-[#6&A]-[#8&A])(-[#6&A]),[#8&A]=[#7&A]-[#7&A](-[#6&A]-[#6&A]-[#6&A])(-[#6&A]-[#6&A]-[#6&A]),[#6&A]-[#6&A](-[#7&A]-[#6&A]-[#6&A]-[#6&A])(-[#6&A]),[#7&A]-[#7&A](-[#6&A]-[#6&A])(-[#6&A]-[#6&A]-[#6&A]),[#7&A]-[#7&A](-[#6&A]-[#6&A])(-[#6&A]-[#6&A]),[#6&A]-[#7&A](-[#6&A])(-[#6&A]-[#6&A]),[#6&A]-[#7&A](-[#6&A])(-[#6&A]),[#6&a]:[#6&a]:[#6&a](-[#8&A]-[#6&A]-[#8&A])(:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a]:[#6&a](-[#8&A]-[#6&A]-[#8&A])(:[#6&a]:[#6&a]),[#8&A]=[#6&A]-[#8&A]-[#6&A],[#6&A]-[#6&A](-[#8&A]-[#6&A])(=[#8&A]),[#6&A]-[#6&A]-[#8&A]-[#6&A]-[#8&A]-[#6&A]-[#6&A],[#6&A]-[#6&A](-[#6&A]-[#8&A]-[#6&A])(-[#7&A]),[#6&A]-[#6&A]-[#8&A]-[#6&A]-[#6&A]-[#8&A]-[#6&A],[#6&A]-[#6&A]-[#6&A](-[#8&A]-[#6&A])(-[#6&A]-[#8&A]),[#8&A]-[#6&A]-[#6&A](-[#8&A]-[#6&A])(-[#6&A]-[#8&A]),[#8&A]-[#6&A]-[#6&A](-[#8&A]-[#6&A])(-[#6&A](-[#8&A])(-[#6&A])),[#6&A]-[#6&A]-[#6&A]-[#8&A]-[#6&A],[#8&A]-[#6&A](-[#6&A](-[#8&A]-[#6&A])(-[#6&A]))(-[#6&A]-[#8&A]),[#8&A]-[#6&A](-[#6&A](-[#8&A]-[#6&A])(-[#6&A]-[#8&A]))(-[#6&A]-[#8&A]),[#6&A]-[#6&A]-[#6&A]-[#6&A]-[#8&A]-[#6&A],[#8&A]-[#6&A](-[#6&A]-[#8&A]-[#6&A])(-[#6&A]-[#6&A]-[#8&A]),[#6&A]-[#8&A]-[#6&A]-[#6&A]-[#6&A]-[#6&A]-[#6&A]-[#8&A]-[#6&A],[#6&A]-[#6&A]-[#6&A]-[#6&A]-[#6&A]-[#6&A]-[#6&A]-[#8&A]-[#6&A],[#8&A]=[#6&A](-[#8&A]-[#6&A])(-[#6&A]-[#6&A]-[#6&A]-[#6&A]-[#6&A]-[#6&A]),[#8&A]=[#6&A](-[#8&A]-[#6&A])(-[#6&A]-[#6&A]-[#6&A]-[#6&A]),[#8&A]=[#6&A](-[#8&A]-[#6&A])(-[#6&A]-[#6&A]-[#6&A]),[#6&A]-[#6&A](-[#8&A]-[#6&A](=[#8&A])(-[#6&A]))(-[#6&A]-[#6&A]-[#8&A]),[#6&A]-[#6&A](-[#8&A]-[#6&A]=[#8&A])(-[#6&A]-[#6&A]-[#8&A]),[#6&A]-[#6&A](-[#6&A]-[#8&A]-[#6&A](=[#8&A])(-[#6&A]))(-[#6&A]),[#8&A]=[#6&A](-[#8&A]-[#6&A])(-[#6&A]-[#6&A]),[#8&A]-[#6&A]-[#6&A]-[#8&A]-[#6&A]=[#8&A],[#6&A]-[#6&A](-[#8&A]-[#6&A]-[#6&A]-[#8&A])(=[#8&A]),[#6&A]-[#6&A](-[#8&A]-[#6&A]-[#6&A])(=[#8&A]),[#6&A]-[#6&A]-[#8&A]-[#6&A]-[#6&A],[#8&A]-[#6&A]-[#6&A]-[#8&A]-[#6&A]-[#6&A]-[#8&A],[#6&A]-[#6&A](-[#6&A]-[#8&A]-[#6&A]-[#6&A]-[#8&A])(-[#8&A]),[#6&A]-[#6&A](-[#8&A]-[#6&A]-[#6&A]-[#8&A])(-[#6&A]-[#8&A]),[#6&A]-[#6&A](-[#8&A]-[#6&A]-[#6&A]-[#8&A])(-[#6&A]),[#8&A]-[#6&A]-[#6&A](-[#8&A]-[#6&A]-[#6&A])(-[#6&A](-[#8&A])(-[#6&A])),[#6&A]-[#6&A]-[#6&A]-[#8&A]-[#6&A]-[#6&A],[#8&A]-[#6&A]-[#6&A]-[#6&A]-[#8&A]-[#6&A]-[#6&A]-[#8&A],[#6&A]-[#6&A](-[#8&A]-[#6&A]-[#6&A]-[#8&A])(-[#6&A]-[#6&A]-[#8&A]),[#8&A]-[#6&A](-[#6&A]-[#8&A]-[#6&A]-[#6&A]-[#8&A])(-[#6&A]-[#8&A]),[#6&A]-[#6&A](-[#8&A]-[#6&A]-[#6&A]-[#8&A])(-[#6&A]-[#6&A]),[#6&A]-[#6&A](-[#8&A])(=[#7&A]),[#7&A]-[#7&A]-[#6&A]-[#8&A],[#6&A]-[#7&A](-[#6&A]-[#8&A])(-[#7&A]),[#7&A]-[#6&A]-[#6&A]=[#7&A],[#8&A]=[#6&A]-[#6&A],[#6&a]-[#6&A]-[#6&A],[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&A]-[#6&A],[#6&a]:[#6&a]:[#6&a](-[#6&A]-[#6&A])(:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a]:[#6&a](-[#6&A]-[#6&A])(:[#6&a]:[#6&a]),[#8&A]=[#7&A]-[#7&A]-[#6&A]-[#6&A],[#6&A]-[#7&A](-[#6&A]-[#6&A])(-[#7&A]),[#7&A]-[#6&A]-[#6&A]-[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&A]-[#6&A]-[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&A]-[#6&A]-[#7&A]-[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&A]-[#6&A]-[#7&A]-[#6&a]:[#6&a],[#7&A]-[#6&A]-[#6&A]-[#7&A]-[#6&a],[#16&A]-[#6&A]-[#6&A]-[#7&A],[#17&A]-[#6&A]-[#6&A]-[#7&A],[#6&A]-[#6&A](-[#6&A])(-[#7&A]),[#8&A]-[#6&A]-[#6&A],[#7&A]-[#7&A]-[#6&A]-[#6&A]-[#8&A],[#8&A]-[#6&A]-[#6&A]-[#8&A],[#16&A]-[#6&A]-[#6&A]-[#6&A],[#8&A]-[#6&A](-[#6&A]-[#6&A])(=[#7&A]),[#8&A]=[#6&A]-[#6&A]-[#6&A],[#6&a]-[#6&A]-[#6&A]-[#6&A],[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&A]-[#6&A]-[#6&A],[#6&A]-[#6&A](-[#6&A]-[#6&A])(-[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a]:[#6&a](-[#6&A]-[#6&A]-[#6&A])(:[#6&a]:[#6&a]:[#6&a]),[#6&A]-[#6&A](-[#6&A]-[#6&A])(-[#6&a]:[#6&a]:[#6&a]),[#6&A]-[#6&A](-[#6&A]-[#6&A])(-[#6&a](:[#6&a]:[#6&a])(:[#6&a])),[#6&a]:[#6&a]:[#6&a](-[#6&A]-[#6&A]-[#6&A])(:[#6&a]:[#6&a]),[#6&A]-[#6&A](-[#6&A]-[#6&A])(-[#6&a]:[#6&a]),[#6&A]-[#6&A](-[#6&A]-[#6&A])(-[#6&a](:[#6&a])(:[#6&a])),[#6&A]-[#6&A](-[#6&A]-[#6&A])(-[#6&a]),[#8&A]=[#7&A]-[#7&A]-[#6&A]-[#6&A]-[#6&A],[#6&A]-[#7&A](-[#6&A]-[#6&A]-[#6&A])(-[#7&A]),[#8&A]-[#6&A]-[#6&A]-[#6&A],[#6&A]-[#6&A]-[#6&A]-[#6&A],[#8&A]=[#7&A]-[#7&A]-[#6&A]-[#6&A]-[#6&A]-[#6&A],[#8&A]-[#6&A]-[#6&A]-[#6&A]-[#6&A],[#6&A]-[#6&A](-[#6&A])(-[#6&A]),[#7&a]:[#6&a]:[#16&a]:[#6&a],[#7&A]-[#6&a]:[#16&a]:[#6&a],[#7&a]:[#6&a]:[#6&a]:[#16&a]:[#6&a],[#7&a]:[#6&a]:[#16&a]:[#6&a]:[#6&a],[#7&A]-[#6&a]:[#16&a]:[#6&a]:[#6&a],[#7&a]:[#6&a]=[#7&A],[#7&A]-[#6&a]:[#8&a]:[#6&a]-[#6&a]:[#7&a]:[#6&a],[#7&A]-[#6&a](:[#8&a]:[#6&a]-[#6&a]:[#7&a]:[#6&a])(:[#6&a]:[#6&a]),[#7&A]-[#6&a]:[#8&a]:[#6&a]-[#6&a],[#7&a]:[#6&a]-[#6&a]:[#8&a]:[#6&a]:[#6&a],[#7&a]:[#6&a]-[#6&a]:[#8&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a](:[#8&a]:[#6&a]-[#6&a]:[#7&a])(:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#8&a]:[#6&a]-[#6&a])(:[#6&a]:[#6&a]),[#7&A]-[#6&a]:[#8&a]:[#6&a],[#7&A]-[#6&a]:[#8&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a](:[#8&a]:[#6&a])(:[#6&a]:[#6&a]),[#7&A]-[#6&a]:[#8&a]:[#6&a]:[#6&a],[#7&A]-[#16&A]-[#6&a],[#6&a]-[#6&a],[#8&a]:[#6&a]-[#6&a]:[#7&a]:[#6&a],[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#7&a]:[#6&a],[#8&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#7&a]:[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#7&a]:[#6&a])(:[#8&a]),[#8&A]=[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#7&a]:[#6&a],[#8&a]:[#6&a](-[#6&a]:[#7&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]),[#8&a]:[#6&a](-[#6&a]:[#7&a]:[#6&a])(:[#6&a]:[#6&a]),[#8&a]:[#6&a]-[#6&a]:[#7&a],[#6&a]:[#6&a]:[#6&a]-[#6&a],[#8&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a])(:[#8&a]),[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a])(:[#6&a]:[#6&a]),[#8&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#7&a],[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#7&a])(:[#8&a]),[#8&a]:[#6&a](-[#6&a]:[#7&a])(:[#6&a]:[#6&a]:[#6&a]),[#8&a]:[#6&a](-[#6&a]:[#7&a])(:[#6&a]:[#6&a]),[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a](:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#6&a])(:[#6&a]:[#6&a]),[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]))(:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]),[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]))(:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]),[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]),[#17&A]-[#6&a],[#16&a]:[#6&a]:[#7&a]:[#6&a],[#7&A]=[#6&a]:[#7&a]:[#6&a],[#7&A]-[#6&a]:[#7&a]:[#6&a],[#16&a]:[#6&a]:[#6&a]:[#7&a]:[#6&a],[#7&A]=[#6&a]:[#7&a]:[#6&a]:[#6&a]:[#6&a],[#16&a]:[#6&a]:[#7&a]:[#6&a]:[#6&a],[#7&A]=[#6&a]:[#7&a]:[#6&a]:[#6&a],[#16&a]:[#6&a]:[#6&a]:[#7&a]:[#6&a]-[#7&A],[#16&a]:[#6&a]:[#7&a],[#6&a]-[#7&A]=[#7&A]-[#6&a],[#6&a]:[#6&a]:[#6&a]-[#7&A]=[#7&A]-[#6&a]:[#6&a]:[#6&a],[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#7&A]=[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#7&A]-[#6&a],[#8&a]:[#6&a]-[#7&A]=[#8&A],[#16&a]:[#6&a]-[#7&A],[#8&a]:[#6&a]-[#7&A],[#7&a]:[#6&a]-[#7&A],[#16&a]:[#6&a]:[#6&a],[#8&a]:[#6&a]:[#6&a],[#7&A]-[#16&A]-[#6&a]:[#6&a],[#17&A]-[#6&a]:[#6&a],[#6&a]:[#6&a](:[#6&a])(-[#17&A]),[#16&a]:[#6&a]:[#6&a]:[#7&a],[#7&A]-[#6&a]:[#6&a],[#8&A]=[#7&A]-[#6&a]:[#6&a],[#17&A]-[#6&a]:[#6&a]-[#7&A],[#7&A]=[#6&a]:[#6&a]:[#6&a],[#7&a]:[#6&a](:[#6&a]:[#6&a])(=[#7&A]),[#8&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#8&a]),[#7&A]-[#16&A]-[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a]:[#6&a]:[#6&a]-[#16&A]-[#8&A],[#7&A]-[#6&a]:[#6&a]:[#6&a]-[#16&A]=[#8&A],[#17&A]-[#6&a]:[#6&a]:[#6&a],[#6&a]:[#6&a](:[#6&a]:[#6&a])(-[#17&A]),[#7&A]-[#6&a]:[#6&a]:[#6&a],[#8&A]=[#7&A]-[#6&a]:[#6&a]:[#6&a],[#8&a]:[#6&a](:[#6&a]:[#6&a])(-[#7&A]=[#8&A]),[#8&a]:[#6&a](:[#6&a]:[#6&a])(-[#7&A](=[#8&A])(=[#8&A])),[#16&A]-[#6&a]:[#6&a]:[#6&a]-[#7&A],[#17&A]-[#6&a]:[#6&a]:[#6&a]-[#7&A],[#8&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#8&a]),[#7&A]-[#16&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a],[#17&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#7&a],[#6&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]-[#8&A]),[#6&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a](-[#8&A])(:[#6&a])),[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a],[#8&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#7&A]=[#8&A],[#8&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(-[#7&A]=[#8&A]),[#8&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(-[#7&A](=[#8&A])(=[#8&A])),[#8&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#7&A],[#17&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]-[#7&A]),[#17&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a](-[#7&A])(:[#6&a])),[#7&A]-[#16&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]-[#8&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]-[#8&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]-[#8&A])(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]=[#8&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]=[#8&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]=[#8&A])(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](=[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](=[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](=[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A])(:[#6&a])),[#17&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#17&A]),[#6&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#17&A]),[#6&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#17&A])(:[#6&a])),[#6&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]-[#8&A]),[#6&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a](-[#8&A])(:[#6&a])),[#7&A]-[#7&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#17&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#7&A],[#16&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#7&A]),[#17&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#7&A]),[#17&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]-[#7&A]),[#17&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#7&A])(:[#6&a])),[#16&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#7&A])(:[#6&a])),[#17&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a](-[#7&A])(:[#6&a])),[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#16&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]-[#8&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]-[#8&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]-[#8&A])(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]=[#8&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]=[#8&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]=[#8&A])(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](=[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](=[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](=[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A])(:[#6&a])),[#17&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#17&A]),[#6&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#17&A]),[#17&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#7&A],[#6&a]:[#6&a](:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#7&A]),[#6&a]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]-[#7&A]),[#16&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#7&A]),[#17&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#7&A]),[#17&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]-[#7&A]),[#16&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#7&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]-[#8&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]-[#8&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]-[#8&A])(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]=[#8&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]=[#8&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]=[#8&A])(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](=[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](=[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](=[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A])(:[#6&a])),[#6&a]:[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#7&A]),[#6&a]:[#6&a]:[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#7&A]),[#16&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#7&A]),[#16&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#7&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]-[#8&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]-[#8&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]-[#8&A])(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]=[#8&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]=[#8&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]=[#8&A])(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](=[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](=[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](=[#8&A])(=[#8&A]))(:[#6&a]:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A])(:[#6&a])),[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#7&A]),[#6&a]:[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#7&A]),[#16&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#7&A]),[#16&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#7&A])(:[#6&a])),[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#16&A]-[#8&A])(-[#7&A]),[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A]))(-[#7&A]),[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A])(=[#8&A]))(-[#7&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]-[#8&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]-[#8&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](-[#8&A])(=[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](-[#8&A])(=[#8&A])(=[#8&A]))(:[#6&a])),[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#16&A]=[#8&A])(-[#7&A]),[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#16&A](=[#8&A])(=[#8&A]))(-[#7&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]=[#8&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A]=[#8&A])(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A](=[#8&A])(=[#8&A])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A](=[#8&A])(=[#8&A]))(:[#6&a])),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#16&A]),[#7&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#16&A])(:[#6&a])),[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#16&A])(-[#7&A]),[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]-[#7&A]),[#16&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]-[#7&A]),[#16&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a](-[#7&A])(:[#6&a])),[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a],[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a](:[#6&a]:[#6&a])(-[#16&A]))(:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#16&A]-[#6&a](:[#6&a]:[#6&a](:[#6&a]:[#6&a])(-[#7&A]))(:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(-[#16&A]))(:[#6&a]:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(-[#16&A]=[#8&A]))(:[#6&a]:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(-[#16&A](=[#8&A])(=[#8&A])))(:[#6&a]:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(-[#16&A]-[#8&A]))(:[#6&a]:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(-[#16&A](-[#8&A])(=[#8&A])))(:[#6&a]:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(-[#16&A](-[#8&A])(=[#8&A])(=[#8&A])))(:[#6&a]:[#6&a]:[#6&a]),[#8&A]-[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a](:[#6&a]:[#6&a])(-[#16&A]))(:[#6&a]:[#6&a]:[#6&a]),[#16&A]-[#6&a](:[#6&a]:[#6&a](:[#6&a]:[#6&a])(-[#7&A]))(:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a]:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a]:[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a]:[#6&a]:[#6&a])(:[#6&a]:[#6&a]))(:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#7&A]-[#6&a](:[#6&a]:[#6&a](:[#6&a]:[#6&a])(-[#16&A]))(:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a]:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a]:[#6&a](:[#6&a](:[#6&a]:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a]:[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]))(:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]:[#6&a]),[#17&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]),[#6&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a]:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]))(:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a])(:[#6&a]))(:[#6&a]:[#6&a]),[#17&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]),[#6&A]-[#6&a](:[#6&a]:[#6&a])(:[#6&a]:[#6&a]),[#6&a]:[#6&a](:[#6&a](:[#6&a])(:[#6&a]))(:[#6&a]),[#7&A]-[#8&A],[#8&A]-[#16&A]-[#8&A],[#8&A]=[#16&A](-[#8&A])(-[#8&A])(=[#8&A]),[#7&A]-[#16&A]=[#8&A],[#8&A]=[#16&A]=[#8&A],[#7&A]-[#7&A]=[#8&A],[#16&A]-[#7&A],[#7&A]=[#7&A],[#7&A]-[#7&A],[#15&A]=[#16&A] +"InChI=1S/C12H10O.Na/c13-12-9-5-4-8-11(12)10-6-2-1-3-7-10;/h1-9,13H;/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H7F3N2O/c1-2-9(8-10)3-4(5,6)7/h2-3H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C3H5N3O/c1-2-6(3-4)5-7/h2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/C2H3N3O/c1-5(2-3)4-6/h1H3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C9H14N8S3/c10-6-7(17-20-16-6)13-1-2-18-3-5-4-19-9(14-5)15-8(11)12/h4H,1-3H2,(H2,10,16)(H,13,17)(H4,11,12,14,15)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H9N5O3/c1-2-3-8(7-10)4(5)6-9(11)12/h2-3H2,1H3,(H2,5,6)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C17H21N3.ClH/c1-19(2)15-9-5-13(6-10-15)17(18)14-7-11-16(12-8-14)20(3)4;/h5-12,18H,1-4H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H13N3O/c14-12-13-7-2-1-5-10(13)9-4-3-6-11-8-9/h3-4,6,8,10H,1-2,5,7H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C8H18N2O2/c1-2-3-6-10(9-12)7-4-5-8-11/h11H,2-8H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C11H24N2O/c1-3-4-5-6-7-8-9-10-11-13(2)12-14/h3-11H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C8H12N4O5/c9-7-10-2-12(8(16)11-7)6-5(15)4(14)3(1-13)17-6/h2-6,13-15H,1H2,(H2,9,11,16)/t3-,4-,5-,6-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H15NO2/c17-15-11-5-4-10-14(15)16(18)19-12-6-9-13-7-2-1-3-8-13/h1-11H,12,17H2/b9-6+",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H13NO2S/c1-2-10-4-3-5(7)6(8)9/h5H,2-4,7H2,1H3,(H,8,9)/t5-/m0/s1",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H19N3S.ClH/c1-16(2)9-10-17(12-13-6-5-11-18-13)14-7-3-4-8-15-14;/h3-8,11H,9-10,12H2,1-2H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H11N3O/c13-11-12-6-2-4-9(12)8-3-1-5-10-7-8/h1,3,5,7,9H,2,4,6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/C2H4O/c1-2-3-1/h1-2H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H5NO/c1-2-3(4)5/h2H,1H2,(H2,4,5)",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H19N3O/c1-9(2)15-12(16)11-6-4-10(5-7-11)8-14-13-3/h4-7,9,13-14H,8H2,1-3H3,(H,15,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C12H11N3.C2H4O2/c1-7-12-8-4-2-3-5-9(8)15-10(12)6-11(13)14-7;1-2(3)4/h2-6,15H,1H3,(H2,13,14);1H3,(H,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H18N6O6/c16-1-13(2-17)7-10-8(14(3-18)4-19)12-9(11-7)15(5-20)6-21/h16-21H,1-6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H13N5O3S/c11-10-13-8-7(9(19)14-10)12-3-15(8)6-1-4(17)5(2-16)18-6/h3-6,16-17H,1-2H2,(H3,11,13,14,19)/t4-,5+,6+/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H9N3O3/c1-5-7-4-6(9(11)12)8(5)2-3-10/h4,10H,2-3H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C9H16N2O2S2/c14-9(10-1-5-12-6-2-10)15-11-3-7-13-8-4-11/h1-8H2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 +"InChI=1S/C6H3Cl3O/c7-3-1-4(8)6(10)5(9)2-3/h1-2,10H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H8N4/c11-8-5-4-7-10(13-8)14-6-2-1-3-9(14)12-7/h1-6H,(H2,11,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H12F6N2O/c9-7(10,11)3-1-5-16(15-17)6-2-4-8(12,13)14/h1-6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/C2F4/c3-1(4)2(5)6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C24H31FO6/c1-20(2)30-19-10-16-15-6-5-13-9-14(27)7-8-21(13,3)23(15,25)17(28)11-22(16,4)24(19,31-20)18(29)12-26/h7-9,15-17,19,26,28H,5-6,10-12H2,1-4H3/t15-,16-,17-,19+,21-,22-,23-,24+/m0/s1",0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H9O3P/c1-5-7(3,4)6-2/h1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/CH2ClF/c2-1-3/h1H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H12FNO/c1-10(17)16-14-8-4-12(5-9-14)11-2-6-13(15)7-3-11/h2-9H,1H3,(H,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H17F3N6O/c12-11(13,14)7-17-10(16)18-9-4-6-20(19-9)5-2-1-3-8(15)21/h4,6H,1-3,5,7H2,(H2,15,21)(H3,16,17,18,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H8O4/c1-14-12-10-8(4-5-15-10)6-7-2-3-9(13)16-11(7)12/h2-6H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H17NO2/c10-7-9(6-8(11)12)4-2-1-3-5-9/h1-7,10H2,(H,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C2H4O2.4H2O.3Pb/c2*1-2(3)4;;;;;;;/h2*1H3,(H,3,4);4*1H2;;;/q;;;;;;3*+2/p-6",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H23N3O.C4H4O4/c1-19(2)12-13-20(17-6-4-5-11-18-17)14-15-7-9-16(21-3)10-8-15;5-3(6)1-2-4(7)8/h4-11H,12-14H2,1-3H3;1-2H,(H,5,6)(H,7,8)/b;2-1-",0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H3Cl3O3/c6-2-1(3(7)8)4(9)11-5(2)10/h3-4,9H",0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8O2/c1-9-7-4-2-6(8)3-5-7/h2-5,8H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H14N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h5-6,9-11H,2-4H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C4H10N2O3/c1-6(5-9)2-4(8)3-7/h4,7-8H,2-3H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C5H12N2O3/c1-5(9)4-7(6-10)2-3-8/h5,8-9H,2-4H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C5H10N2O2/c1-2-3-7(6-9)4-5-8/h2,8H,1,3-5H2",0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C10H13N3O2/c1-13(12-15)7-3-5-10(14)9-4-2-6-11-8-9/h2,4,6,8H,3,5,7H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H12N2O3/c1-2-3-8(7-11)4-6(10)5-9/h2,6,9-10H,1,3-5H2",0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C12H10N2O/c15-14-12-8-6-11(7-9-12)13-10-4-2-1-3-5-10/h1-9,13H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H12ClN3O3/c1-4(11)3-8-6(12)10(9-13)5(2)7/h4-5,11H,3H2,1-2H3,(H,8,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C14H15N3O2/c1-14(2)9-7-8(3-4-11(9)15-13(14)19)10-5-6-12(18)17-16-10/h3-4,7H,5-6H2,1-2H3,(H,15,19)(H,17,18)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C6H12N2O2/c1-3-4-8(7-10)5-6(2)9/h3,6,9H,1,4-5H2,2H3",0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C3H6FN3O2/c4-1-2-7(6-9)3(5)8/h1-2H2,(H2,5,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H9NO6.3Na.H2O/c8-4(9)1-7(2-5(10)11)3-6(12)13;;;;/h1-3H2,(H,8,9)(H,10,11)(H,12,13);;;;1H2/q;3*+1;/p-3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H10N4/c1-15-9-5-4-8-7(3-2-6-13-8)10(9)14-11(15)12/h2-6H,1H3,(H2,12,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H5N3O3S/c8-7-9-4(3-14-7)5-1-2-6(13-5)10(11)12/h1-3H,(H2,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C8H16O2.Ca/c2*1-3-5-7(6-4-2)8(9)10;/h2*7H,3-6H2,1-2H3,(H,9,10);/q;;+2/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H14N4.4ClH/c13-9-3-1-7(5-11(9)15)8-2-4-10(14)12(16)6-8;;;;/h1-6H,13-16H2;4*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H4N4O3S/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H10N4.ClH/c1-15-9-5-4-8-7(3-2-6-13-8)10(9)14-11(15)12;/h2-6H,1H3,(H2,12,14);1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H13N3O2/c1-2-3-4-5-9(8-11)6(7)10/h2-5H2,1H3,(H2,7,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C12H12N2/c13-11-5-1-9(2-6-11)10-3-7-12(14)8-4-10/h1-8H,13-14H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H16N2O2.2ClH/c1-17-13-7-9(3-5-11(13)15)10-4-6-12(16)14(8-10)18-2;;/h3-8H,15-16H2,1-2H3;2*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H6N6/c4-1-7-2(5)9-3(6)8-1/h(H6,4,5,6,7,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H6N6O3/c8-6-10-5(11-7(9)12-6)3-1-2-4(16-3)13(14)15/h1-2H,(H4,8,9,10,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H7ClN/c7-9-6-4-2-1-3-5(6)8/h1-4H,8H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C34H27N9O7S2.2Na/c35-22-10-15-27(26(36)18-22)41-38-24-11-6-19(7-12-24)20-8-13-25(14-9-20)40-42-32-28(51(45,46)47)16-21-17-29(52(48,49)50)33(34(44)30(21)31(32)37)43-39-23-4-2-1-3-5-23;;/h1-18,44H,35-37H2,(H,45,46,47)(H,48,49,50);;/q;2*+1/p-2/b41-38+,42-40+,43-39+;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C11H14O2/c1-4-5-9-6-7-10(12-2)11(8-9)13-3/h4,6-8H,1,5H2,2-3H3",0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H12N2O/c1-6-4-2-3-5-8(6)7-9/h6H,2-5H2,1H3/t6-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H12N2O4/c1-5(10)2-8(7-12)3-6(11)4-9/h6,9,11H,2-4H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C9H8O4/c10-7-3-1-6(5-8(7)11)2-4-9(12)13/h1-5,10-11H,(H,12,13)/b4-2+",0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H9NO2/c1-3-4(2)5(6)7/h4H,3H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H13NO2/c1-10(17)16(18)13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9,18H,8H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H7NO3/c1-11-7-5-3-2-4-6(7)8(9)10/h2-5H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H5NO2/c3-1-2(4)5/h1,3H2,(H,4,5)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/Co.H2O4S.7H2O/c;1-5(2,3)4;;;;;;;/h;(H2,1,2,3,4);7*1H2/q+2;;;;;;;;/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C8H8/c1-2-8-6-4-3-5-7-8/h2-7H,1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H6N4O3S/c8-10-7-9-4(3-15-7)5-1-2-6(14-5)11(12)13/h1-3H,8H2,(H,9,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C12H12N2O/c13-9-1-5-11(6-2-9)15-12-7-3-10(14)4-8-12/h1-8H,13-14H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H10N2O.H2O4S/c1-10-7-3-2-5(8)4-6(7)9;1-5(2,3)4/h2-4H,8-9H2,1H3;(H2,1,2,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +InChI=1S/C6HCl5O/c7-1-2(8)4(10)6(12)5(11)3(1)9/h12H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/CH4N2S/c2-1(3)4/h(H4,2,3,4)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H4Br6/c13-7-3-11(17)9(15)1-5(7)6-2-10(16)12(18)4-8(6)14/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H10N2.2ClH/c1-5-2-3-6(8)4-7(5)9;;/h2-4H,8-9H2,1H3;2*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H10N2O3/c7-3-1-6(5-9)2-4-8/h7-8H,1-4H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C20H18ClNO6/c1-10-7-12-14(21)9-13(17(23)16(12)20(27)28-10)18(24)22-15(19(25)26)8-11-5-3-2-4-6-11/h2-6,9-10,15,23H,7-8H2,1H3,(H,22,24)(H,25,26)/t10-,15+/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H10N2O2/c1-4(7)3-6(2)5-8/h4,7H,3H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C18H16N2O7S2.2Na/c1-10-7-11(2)16(28(22,23)24)8-14(10)19-20-15-9-17(29(25,26)27)12-5-3-4-6-13(12)18(15)21;;/h3-9,21H,1-2H3,(H,22,23,24)(H,25,26,27);;/q;2*+1/p-2/b20-19+;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C2H5NO2/c1-5-2(3)4/h1H3,(H2,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H7N3O2/c1-2-3-7(6-9)4(5)8/h2H,1,3H2,(H2,5,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C3H7N3O2/c1-2-6(5-8)3(4)7/h2H2,1H3,(H2,4,7)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C15H18N4O/c1-3-18(4-2)15-7-5-13(6-8-15)16-17-14-9-11-19(20)12-10-14/h5-12H,3-4H2,1-2H3/b17-16+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C9H12N2O/c1-11(10-12)8-7-9-5-3-2-4-6-9/h2-6H,7-8H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C8H11NO/c1-6-3-4-8(10-2)7(9)5-6/h3-5H,9H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H10N4S/c10-7-3-1-6(2-4-7)8-5-14-9(12-8)13-11/h1-5H,10-11H2,(H,12,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,0,1,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C3H5Br2Cl/c4-1-3(5)2-6/h3H,1-2H2",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H11N5.ClH/c12-10-7-6-9(11(13)14-10)16-15-8-4-2-1-3-5-8;/h1-7H,(H4,12,13,14);1H/b16-15+;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C6H7ClN2/c7-4-1-2-5(8)6(9)3-4/h1-3H,8-9H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H11NO2/c1-15-13-6-9-8-4-2-3-5-11(8)16-12(9)7-10(13)14/h2-7H,14H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H13N/c1-6-4-8(3)9(10)5-7(6)2/h4-5H,10H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H10N2/c11-9-5-1-3-7-8(9)4-2-6-10(7)12/h1-6H,11-12H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H14N2O2/c1-8(12(2)11-14)10(13)9-6-4-3-5-7-9/h3-8,10,13H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H7ClN2/c7-5-2-1-4(8)3-6(5)9/h1-3H,8-9H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H9N/c11-10-6-5-8-3-1-2-4-9(8)7-10/h1-7H,11H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H12N4.ClH/c1-17-11-7-10(9-5-3-2-4-6-9)8-15-12(11)16-13(17)14;/h2-8H,1H3,(H2,14,15,16);1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H10/c1-7-4-3-5-8(2)6-7/h3-6H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H8N2O2/c1-4(7)3-6(2)5-8/h3H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C2HCl2F3/c3-1(4)2(5,6)7/h1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C2H4Br2/c3-1-2-4/h1-2H2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H17N3O4/c1-12-10-3-2-9(8-11(10)14(17)18)13(4-6-15)5-7-16/h2-3,8,12,15-16H,4-7H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H7AsO2/c1-3(2,4)5/h1-2H3,(H,4,5)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H4Cl2/c4-2-1-3-5/h1-2H,3H2/b2-1+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C4Cl6/c5-1(3(7)8)2(6)4(9)10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/CH2O3.K/c2-1(3)4;/h(H2,2,3,4);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C2HCl3/c3-1-2(4)5/h1H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C2Cl4/c3-1(4)2(5)6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H10N4O3S/c1-12(2)11-9-10-6(5-17-9)7-3-4-8(16-7)13(14)15/h3-5H,1-2H3,(H,10,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +InChI=1S/C7H3Cl5O/c1-13-7-5(11)3(9)2(8)4(10)6(7)12/h1H3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H12Cl2N2/c14-10-6-8(1-3-12(10)16)5-9-2-4-13(17)11(15)7-9/h1-4,6-7H,5,16-17H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H10Cl2N2/c13-9-5-7(1-3-11(9)15)8-2-4-12(16)10(14)6-8/h1-6H,15-16H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C2Cl2/c3-1-2-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H9NO/c13-8-5-6-10-9-3-1-2-4-11(9)14-12(10)7-8/h1-7H,13H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +InChI=1S/CHCl3/c2-1(3)4/h1H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H14NO4P/c1-9-12(8,10-2)7-3-5-11-6-4-7/h3-6H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C8Cl4N2/c9-5-3(1-13)6(10)8(12)7(11)4(5)2-14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H3Br/c1-2-3/h2H,1H2",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C32H24N6O16S4.2Cu.4Na/c33-19-11-17(55(43,44)45)5-15-9-25(57(49,50)51)29(31(41)27(15)19)37-35-21-3-1-13(7-23(21)39)14-2-4-22(24(40)8-14)36-38-30-26(58(52,53)54)10-16-6-18(56(46,47)48)12-20(34)28(16)32(30)42;;;;;;/h1-12,39-42H,33-34H2,(H,43,44,45)(H,46,47,48)(H,49,50,51)(H,52,53,54);;;;;;/q;2*+2;4*+1/p-8/b37-35+,38-36+;;;;;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C4H7Cl/c1-4(2)3-5/h3H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H5N3O4/c4-3(9)6(5-10)1-2(7)8/h1H2,(H2,4,9)(H,7,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C2H5NO/c1-2(3)4/h1H3,(H2,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H8O/c1-2-4-3-5-4/h4H,2-3H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H10/c1-2-8-6-4-3-5-7-8/h3-7H,2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H20N2O/c1-18(2)15-9-5-13(6-10-15)17(20)14-7-11-16(12-8-14)19(3)4/h5-12H,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6N2/c1-4-5-2-3-6-4/h2-3H,1H3,(H,5,6)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/CCl4/c2-1(3,4)5",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8/c1-7-5-3-2-4-6-7/h2-6H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H12N2OS2/c1-4-8(7-9)5(2)11-6(3)10-4/h4-6H,1-3H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C3H6O/c1-3-2-4-3/h3H,2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6O2/c1-3-2-4(5)6-3/h3H,2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H14N2.ClH/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16;/h3-9H,2,15H2,1H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H10N2O/c1-3-6(4-2)5-7/h3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9/h1-6H/t1-,2-,3-,4-,5+,6+/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/Cd.H2O4S/c;1-5(2,3)4/h;(H2,1,2,3,4)/q+2;/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C21H27N5O2S.3ClH/c1-15-4-5-16(11-23-15)10-17-12-24-21(25-20(17)27)22-8-9-29-14-19-7-6-18(28-19)13-26(2)3;;;/h4-7,11-12H,8-10,13-14H2,1-3H3,(H2,22,24,25,27);3*1H",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H5Cl/c1-3-4(2)5/h3H,1-2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H30O5/c1-3-5-7-20-8-9-21-10-11-22-14-17-13-19-18(23-15-24-19)12-16(17)6-4-2/h12-13H,3-11,14-15H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H12O2/c1-2-3-8-4-5-9-10(6-8)12-7-11-9/h4-6H,2-3,7H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H14N2/c1-2-16-13-6-4-3-5-11(13)12-9-10(15)7-8-14(12)16/h3-9H,2,15H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H8N2O2/c7-4-1-2-6(3-4)5-8/h4,7H,1-3H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C12H27O4P/c1-4-7-10-14-17(13,15-11-8-5-2)16-12-9-6-3/h4-12H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H12N2O2S/c13-9-1-5-11(6-2-9)17(15,16)12-7-3-10(14)4-8-12/h1-8H,13-14H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C17H22N2/c1-18(2)16-9-5-14(6-10-16)13-15-7-11-17(12-8-15)19(3)4/h5-12H,13H2,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H11N3/c1-11(2)10-9-8-6-4-3-5-7-8/h3-7H,1-2H3/b10-9+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0 +"InChI=1S/C14H15N3/c1-17(2)14-10-8-13(9-11-14)16-15-12-6-4-3-5-7-12/h3-11H,1-2H3/b16-15+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C15H17N3/c1-12-5-4-6-14(11-12)17-16-13-7-9-15(10-8-13)18(2)3/h4-11H,1-3H3/b17-16+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C6H18N3OP/c1-7(2)11(10,8(3)4)9(5)6/h1-6H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H32N2O/c1-3-4-5-6-7-8-9-10-11-12-13-14-15-17(2)16-18/h3-15H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C7H15Cl2N2O2P/c8-2-5-11(6-3-9)14(12)10-4-1-7-13-14/h1-7H2,(H,10,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H12O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8,17H,2-3H2,1H3",0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H5N3O2/c1-5(4-7)2(3)6/h1H3,(H2,3,6)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C2H5ClO/c1-4-2-3/h2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H15Cl2N2O2P/c8-2-4-10-14(12)11(6-3-9)5-1-7-13-14/h1-7H2,(H,10,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H11N5/c1-6-5-13-7-3-4-8-10(9(7)14-6)15-11(12)16(8)2/h3-5H,1-2H3,(H2,12,15)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H19NO3/c1-20(2)10-9-13-15(24-20)11-16(23-4)17-18(13)21(3)14-8-6-5-7-12(14)19(17)22/h5-11H,1-4H3",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C5H10N4O2/c10-6-8-2-1-3-9(7-11)5-4-8/h1-5H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C11H10N4/c1-7-3-2-6-15-10(7)13-8-4-5-9(12)14-11(8)15/h2-6H,1H3,(H2,12,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H9NO2/c14-13(15)11-7-6-9-5-4-8-2-1-3-10(11)12(8)9/h1-3,6-7H,4-5H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H12N2O/c1-9-8-11(14)13(12(9)2)10-6-4-3-5-7-10/h3-8H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2Cl6/c3-1(4,5)2(6,7)8",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C32H24N6O14S4.4Na/c33-23-13-21(53(41,42)43)9-17-11-25(55(47,48)49)29(31(39)27(17)23)37-35-19-5-1-15(2-6-19)16-3-7-20(8-4-16)36-38-30-26(56(50,51)52)12-18-10-22(54(44,45)46)14-24(34)28(18)32(30)40;;;;/h1-14,39-40H,33-34H2,(H,41,42,43)(H,44,45,46)(H,47,48,49)(H,50,51,52);;;;/q;4*+1/p-4/b37-35-,38-36+;;;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C8H11N/c1-9(2)8-6-4-3-5-7-8/h3-7H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C2H6N2O/c1-4(2)3-5/h1-2H3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C3H8N2O2/c1-5(4-7)2-3-6/h6H,2-3H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C3H8N2O/c1-3-5(2)4-6/h3H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C7H14N4O4/c1-11(10-15)7(14)9-4-2-3-5(8)6(12)13/h5H,2-4,8H2,1H3,(H,9,14)(H,12,13)/t5-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C8H14ClN5/c1-4-10-7-12-6(9)13-8(14-7)11-5(2)3/h5H,4H2,1-3H3,(H2,10,11,12,13,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H4Cl4O2/c13-5-1-9-10(2-6(5)14)18-12-4-8(16)7(15)3-11(12)17-9/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H5Cl/c7-6-4-2-1-3-5-6/h1-5H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10HCl11/c11-2-1-3(12)5(14)4(1,13)10(20,21)7(2,16)8(5,17)6(2,15)9(3,18)19/h1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H19ClN4O2S/c1-10-4-3-5-12(11(10)2)19-14-8-13(17)20-16(21-14)24-9-15(23)18-6-7-22/h3-5,8,22H,6-7,9H2,1-2H3,(H,18,23)(H,19,20,21)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H15N3O/c1-21(20-22)16-10-7-14(8-11-16)6-9-15-12-13-19-18-5-3-2-4-17(15)18/h2-13H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C5H8/c1-4-5(2)3/h4H,1-2H2,3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H2Cl6O2/c13-3-1-5-11(9(17)7(3)15)20-12-6(19-5)2-4(14)8(16)10(12)18/h1-2H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H12O6/c1-21-11-7-12-13(8-5-6-22-18(8)24-12)17-15(11)16(20)14-9(19)3-2-4-10(14)23-17/h2-8,18-19H,1H3",0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H8Cl2/c13-11-5-1-3-9(7-11)10-4-2-6-12(14)8-10/h1-8H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H10O/c1-4(2,3)5/h5H,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H7Cl3/c13-10-3-1-2-8(4-10)9-5-11(14)7-12(15)6-9/h1-7H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H5Cl3/c4-1-3(6)2-5/h3H,1-2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C34H59NO15/c1-5-6-9-20(3)32(50-31(44)17-23(34(47)48)15-29(41)42)27(49-30(43)16-22(33(45)46)14-28(39)40)13-19(2)12-24(36)10-7-8-11-25(37)18-26(38)21(4)35/h19-27,32,36-38H,5-18,35H2,1-4H3,(H,39,40)(H,41,42)(H,45,46)(H,47,48)/t19-,20+,21+,22+,23+,24+,25-,26+,27-,32-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10Cl10O/c11-2-1(21)3(12)6(15)4(2,13)8(17)5(2,14)7(3,16)9(6,18)10(8,19)20",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/CH2Cl2/c2-1-3/h1H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H5ClO/c4-1-3-2-5-3/h3H,1-2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H12F2N6O/c14-10-1-2-11(12(15)3-10)13(22,4-20-8-16-6-18-20)5-21-9-17-7-19-21/h1-3,6-9,22H,4-5H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H5Cl5/c13-8-3-1-2-6(10(8)15)7-4-5-9(14)12(17)11(7)16/h1-5H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H4Cl6/c13-7-3-1-5(9(15)11(7)17)6-2-4-8(14)12(18)10(6)16/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H13ClN6/c1-4-12-7-13-6(10)14-8(15-7)16-9(2,3)5-11/h4H2,1-3H3,(H2,12,13,14,15,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10Cl12/c11-1-2(12)7(17)4(14)3(13,5(1,15)9(7,19)20)6(1,16)10(21,22)8(2,4)18",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H17N3O2/c1-10-8-15(14-18)9-11(2)16(10)13(17)12-6-4-3-5-7-12/h3-7,10-11H,8-9H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/C12H6Cl4/c13-7-4-5-8(11(15)6-7)9-2-1-3-10(14)12(9)16/h1-6H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H5NS2/c9-7-8-5-3-1-2-4-6(5)10-7/h1-4H,(H,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H13N5O4/c1-15(2)7-12-11-14-13-9(20-11)5-3-8-4-6-10(19-8)16(17)18/h3-6H,7H2,1-2H3,(H,12,14)/b5-3+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C37H36N2O9S3.2Na/c1-3-38(25-27-7-5-9-35(23-27)50(43,44)45)32-17-11-29(12-18-32)37(31-15-21-34(22-16-31)49(40,41)42)30-13-19-33(20-14-30)39(4-2)26-28-8-6-10-36(24-28)51(46,47)48;;/h5-24H,3-4,25-26H2,1-2H3,(H2-,40,41,42,43,44,45,46,47,48);;/q;2*+1/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C6H12Cl3O4P/c7-1-4-11-14(10,12-5-2-8)13-6-3-9/h1-6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H19N3O3S/c1-10-8-18-15(11(2)16(10)23-4)9-24(21)17-19-13-6-5-12(22-3)7-14(13)20-17/h5-8H,9H2,1-4H3,(H,19,20)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6N2O3/c7-5-2-1-4(8(10)11)3-6(5)9/h1-3,9H,7H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8N2O/c1-9(8-10)7-5-3-2-4-6-7/h2-6H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/C4H4O/c1-2-4-5-3-1/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H15Cl6O4P/c10-1-7(2-11)17-20(16,18-8(3-12)4-13)19-9(5-14)6-15/h7-9H,1-6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H18N3OP/c1-7-4-10(7)14(13,11-5-8(11)2)12-6-9(12)3/h7-9H,4-6H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H13N.ClH/c1-6-4-7(2)9(10)8(3)5-6;/h4-5H,10H2,1-3H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C6H11Br4O4P.Mg/c2*7-1-5(9)3-13-15(11,12)14-4-6(10)2-8;/h2*5-6H,1-4H2,(H,11,12);/q;;+2/p-2",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H7Cl2O4P/c1-8-11(7,9-2)10-3-4(5)6/h3H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H14O4/c21-15-9-5-13(6-10-15)20(14-7-11-16(22)12-8-14)18-4-2-1-3-17(18)19(23)24-20/h1-12,21-22H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H18Cl2N2O2/c14-5-7-17(8-6-15)11-3-1-10(2-4-11)9-12(16)13(18)19/h1-4,12H,5-9,16H2,(H,18,19)/t12-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H24N2O/c15-13-14-11-9-7-5-3-1-2-4-6-8-10-12-14/h1-12H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/C9H6N2O2/c12-11(13)8-5-1-3-7-4-2-6-10-9(7)8/h1-6H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8O3/c1-10-6-4-2-3-5(8)7(6)9/h2-4,8-9H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H4Cl2/c7-5-1-2-6(8)4-3-5/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C3H6O3S/c4-7(5)3-1-2-6-7/h1-3H2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C14H19Cl2NO2/c15-8-10-17(11-9-16)13-6-4-12(5-7-13)2-1-3-14(18)19/h4-7H,1-3,8-11H2,(H,18,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H18ClNO4S/c1-9-5-10(2)8-16(7-9)21(19,20)11-3-4-13(15)12(6-11)14(17)18/h3-4,6,9-10H,5,7-8H2,1-2H3,(H,17,18)/t9-,10+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C5H7N3O2/c1-4-6-3-5(7(4)2)8(9)10/h3H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H4N4O4/c7-6-9-8-5(14-6)3-1-2-4(13-3)10(11)12/h1-2H,(H2,7,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H23ClO4S/c1-12(20-21(17)19-10-9-16)11-18-14-7-5-13(6-8-14)15(2,3)4/h5-8,12H,9-11H2,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0 +"InChI=1S/C10H13NO2/c1-3-13-10-6-4-9(5-7-10)11-8(2)12/h4-7H,3H2,1-2H3,(H,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H25NO6/c1-3-12-8-11(2)18(23,10-20)17(22)24-9-13-4-6-19-7-5-14(15(13)19)25-16(12)21/h3-4,11,14-15,20,23H,5-10H2,1-2H3/b12-3-/t11-,14-,15-,18-/m1/s1",0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H28N2O/c1-3-4-5-6-7-8-9-10-11-12-13-15(2)14-16/h3-13H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C4H9N3O2/c1-2-3-7(6-9)4(5)8/h2-3H2,1H3,(H2,5,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C5H8N2O/c8-6-7-4-2-1-3-5-7/h1-2H,3-5H2",0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H14N2O3/c1-5(9)3-8(7-11)4-6(2)10/h5-6,9-10H,3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H6O2/c7-5-1-2-6(8)4-3-5/h1-4,7-8H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H8N4O5/c1-5(14)10-4-7-11-9(12-18-7)6-2-3-8(17-6)13(15)16/h2-3H,4H2,1H3,(H,10,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H9N.ClH/c1-6-3-2-4-7(8)5-6;/h2-5H,8H2,1H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C22H28O3/c1-4-22(25-14(2)23)12-10-20-19-7-5-15-13-16(24)6-8-17(15)18(19)9-11-21(20,22)3/h1,13,17-20H,5-12H2,2-3H3/t17-,18+,19+,20-,21-,22-/m0/s1",0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/HNO2.Na/c2-1-3;/h(H,2,3);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H7NO2/c1-6-2-4-7(5-3-6)8(9)10/h2-5H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C2H4Cl2O/c3-1-5-2-4/h1-2H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C4H8N2O/c7-5-6-3-1-2-4-6/h1-4H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C4H5N3O3/c8-3-1-2-7(6-10)4(9)5-3/h1-2H2,(H,5,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C9H12N2O2/c1-2-13-8-5-3-7(4-6-8)11-9(10)12/h3-6H,2H2,1H3,(H3,10,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C4H8N2OS/c7-5-6-1-3-8-4-2-6/h1-4H2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/C4H8N2O2/c7-5-6-1-3-8-4-2-6/h1-4H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/C7H14N2O/c10-8-9-6-4-2-1-3-5-7-9/h1-7H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/H4N2/c1-2/h1-2H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C10H22N2O/c1-3-5-7-9-12(11-13)10-8-6-4-2/h3-10H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C8H18N2O/c1-3-5-7-10(9-11)8-6-4-2/h3-8H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C18H22ClNO.ClH/c1-16(15-21-18-10-6-3-7-11-18)20(13-12-19)14-17-8-4-2-5-9-17;/h2-11,16H,12-15H2,1H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H9N3O/c8-6-7-3-1-5-2-4-7/h5H,1-4H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C7H16N4O2.HNO2/c1-4-8-7(12)11(9-13)6-5-10(2)3;2-1-3/h4-6H2,1-3H3,(H,8,12);(H,2,3)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0 +"InChI=1S/C19H27NO7/c1-11-9-19(12(2)27-19)17(23)26-14-6-8-20(4)7-5-13(15(14)21)10-25-16(22)18(11,3)24/h5,11-12,14,24H,6-10H2,1-4H3/b13-5-/t11-,12-,14-,18-,19?/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H7N3O2/c1-10(9-12)7-4-2-6(8-11)3-5-7/h2-5H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C14H12N4O3S/c19-8-7-15-13-9-3-1-2-4-10(9)16-14(17-13)11-5-6-12(22-11)18(20)21/h1-6,19H,7-8H2,(H,15,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H6N4O4S/c1-4(13)9-8-11-10-7(17-8)5-2-3-6(16-5)12(14)15/h2-3H,1H3,(H,9,11,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H11NO2/c1-13-12(14)15-11-8-4-6-9-5-2-3-7-10(9)11/h2-8H,1H3,(H,13,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6N2O2/c9-7-5-1-2-6(8-10)4-3-5/h1-4,9-10H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H14N2O/c1-3-5-7-8(9)6-4-2/h3-6H2,1-2H3/b8-7+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0 +"InChI=1S/C6H3N3O5/c10-6-8-7-5(14-6)3-1-2-4(13-3)9(11)12/h1-2H,(H,8,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H10N2O/c15-13-14(11-7-3-1-4-8-11)12-9-5-2-6-10-12/h1-10H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C3H6O2/c4-1-3-2-5-3/h3-4H,1-2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H11NO/c1-6-5-7(10-2)3-4-8(6)9/h3-5H,9H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H10Br2O2/c6-1-5(2-7,3-8)4-9/h8-9H,1-4H2",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H6N2S/c6-3-4-1-2-5-3/h1-2H2,(H2,4,5,6)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H11N5O2/c1-8-7(13)5-6(12(3)10-14)9-4-11(5)2/h4H,1-3H3,(H,8,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/3C2H7O3P.Al/c3*1-2-5-6(3)4;/h3*6H,2H2,1H3,(H,3,4);/q;;;+3/p-3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H10O2/c1-2-4-8(5-3-1)10-6-9-7-11-9/h1-5,9H,6-7H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H5N5O3/c1-6(5-8)2(3)4-7(9)10/h1H3,(H2,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H12N3PS/c11-10(7-1-2-7,8-3-4-8)9-5-6-9/h1-6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +"InChI=1S/C4H8N2S4.Zn/c7-3(8)5-1-2-6-4(9)10;/h1-2H2,(H2,5,7,8)(H2,6,9,10);/q;+2/p-2",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C3H7NS2.Zn/c2*1-4(2)3(5)6;/h2*1-2H3,(H,5,6);/q;;+2/p-2",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H9NO2/c1-6(10)9-7-2-4-8(11)5-3-7/h2-5,11H,1H3,(H,9,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H12N2S/c1-3-6-5(8)7-4-2/h3-4H2,1-2H3,(H2,6,7,8)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H8O2/c1-5(2)3-7-4(5)6/h3H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H14ClNS2/c1-4-10(5-2)8(11)12-6-7(3)9/h3-6H2,1-2H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H8O2/c10-9-6-5-7-3-1-2-4-8(7)11-9/h1-4H,5-6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H15N3O2/c1-10-3-8-15(20)14(9-10)18-17-13-6-4-12(5-7-13)16-11(2)19/h3-9,20H,1-2H3,(H,16,19)/b18-17+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C31H22N6O9S.Cu.2Na/c38-26-12-9-21(15-23(26)31(42)43)34-32-19-5-1-17(2-6-19)18-3-7-20(8-4-18)33-37-29-28(40)14-11-24(30(29)41)35-36-25-16-22(47(44,45)46)10-13-27(25)39;;;/h1-16,38-41H,(H,42,43)(H,44,45,46);;;/q;+2;2*+1/p-4/b34-32?,36-35+,37-33?;;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8O2/c1-5-2-3-6(8)7(9)4-5/h2-4,8-9H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H9Cl5/c15-11-5-1-9(2-6-11)13(14(17,18)19)10-3-7-12(16)8-4-10/h1-8,13H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6N2O3/c7-4-1-2-6(9)5(3-4)8(10)11/h1-3,9H,7H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H10O3/c1-2-8(11)7-3-4-9-10(5-7)13-6-12-9/h2-5,8,11H,1,6H2",0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H13N3.C2H4O2/c1-7-12-11(8(2)15-13(7)14)9-5-3-4-6-10(9)16-12;1-2(3)4/h3-6,16H,1-2H3,(H2,14,15);1H3,(H,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H9NO6/c8-4(9)1-7(2-5(10)11)3-6(12)13/h1-3H2,(H,8,9)(H,10,11)(H,12,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H12N2S/c13-9-1-5-11(6-2-9)15-12-7-3-10(14)4-8-12/h1-8H,13-14H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H14O4/c1-2-9(13-5-11-7-15-11)4-10(3-1)14-6-12-8-16-12/h1-4,11-12H,5-8H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H21NO3/c1-13(2,3)14-7-12(17)9-4-5-11(16)10(6-9)8-15/h4-6,12,14-17H,7-8H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C2H4Cl2/c3-1-2-4/h1-2H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H12N2O/c19-15-11-10-12-6-4-5-9-14(12)16(15)18-17-13-7-2-1-3-8-13/h1-11,19H/b18-17+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C17H13N3O3/c1-11-6-8-14(15(10-11)20(22)23)18-19-17-13-5-3-2-4-12(13)7-9-16(17)21/h2-10,21H,1H3/b19-18+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C4H9NO/c1-3-4(2)5-6/h6H,3H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H6N2O4/c1-5-2-3-6(8(10)11)4-7(5)9(12)13/h2-4H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H6O3/c8-5-1-2-6-7(3-5)10-4-9-6/h1-3,8H,4H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H14O6/c17-10-2-1-8-13-9-4-12(19)11(18)3-7(9)5-16(13,21)6-22-15(8)14(10)20/h1-4,13,17-21H,5-6H2/t13-,16-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H6N4O5/c13-6-4-11(8(14)10-6)9-3-5-1-2-7(17-5)12(15)16/h1-3H,4H2,(H,10,13,14)/b9-3+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C6H6O2/c7-5-3-1-2-4-6(5)8/h1-4,7-8H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H16O2/c1-11(2,3)9-7-8(13-4)5-6-10(9)12/h5-7,12H,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H10N2O3/c1-5(9)3-8(7-11)4-6(2)10/h3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C20H14N2O10S3.3Na/c23-16-7-5-11-9-12(33(24,25)26)10-18(35(30,31)32)19(11)20(16)22-21-15-6-8-17(34(27,28)29)14-4-2-1-3-13(14)15;;;/h1-10,23H,(H,24,25,26)(H,27,28,29)(H,30,31,32);;;/q;3*+1/p-3/b22-21+;;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C21H32O3/c1-19-11-13(12-22)18(23)10-14(19)4-5-15-16(19)6-8-20(2)17(15)7-9-21(20,3)24/h12,14-17,22,24H,4-11H2,1-3H3/b13-12-/t14-,15+,16-,17-,19-,20-,21-/m0/s1",0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C24H38O4/c1-5-9-13-19(7-3)17-27-23(25)21-15-11-12-16-22(21)24(26)28-18-20(8-4)14-10-6-2/h11-12,15-16,19-20H,5-10,13-14,17-18H2,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H5NS/c1-2-3-5-4-6/h2H,1,3H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C24H26FNO4/c1-15(2)26-21-6-4-3-5-20(21)24(16-7-9-17(25)10-8-16)22(26)12-11-18(27)13-19(28)14-23(29)30/h3-12,15,18-19,27-28H,13-14H2,1-2H3,(H,29,30)/b12-11+/t18-,19-/m1/s1",0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H7N3O/c7-9-6(10)5-1-3-8-4-2-5/h1-4H,7H2,(H,9,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C5H12N2O4/c8-2-1-7(6-11)3-5(10)4-9/h5,8-10H,1-4H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C5H11NO2/c1-3-5(4-2)6(7)8/h5H,3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H11NO2/c1-9(17)16-10-6-7-12-11-4-2-3-5-13(11)15(18)14(12)8-10/h2-8H,1H3,(H,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H10N2O3/c1-5(9)4-7(6-10)2-3-8/h8H,2-4H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C7H5NO4/c9-7(10)5-1-3-6(4-2-5)8(11)12/h1-4H,(H,9,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6N2O2/c7-5-6-3-1-2-4-8-6/h1-2H,3-4H2",0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0 +"InChI=1S/C12H12O4/c1-3-10(16-8(2)13)9-4-5-11-12(6-9)15-7-14-11/h3-6,10H,1,7H2,2H3",0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C5H4O2/c6-4-5-2-1-3-7-5/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H10N6O3/c1-11-4-8-6(12(2)9-15)5(11)7(14)13(3)10-16/h4H,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C9H11ClN2O/c1-12(2)9(13)11-8-5-3-7(10)4-6-8/h3-6H,1-2H3,(H,11,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H8/c1-4(2)3/h1H2,2-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/CN4O8/c6-2(7)1(3(8)9,4(10)11)5(12)13",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H11N3O2/c1-4(2)3-8(7-10)5(6)9/h4H,3H2,1-2H3,(H2,6,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C9H8N4O2S/c1-13(12-15)9(14)11-8-10-6-4-2-3-5-7(6)16-8/h2-5H,1H3,(H,10,11,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C8H14O2/c1-4-5-10-8(9)6-7(2)3/h4,7H,1,5-6H2,2-3H3",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C33H40N2O9/c1-38-19-7-8-20-21-9-10-35-16-18-13-27(44-32(36)17-11-25(39-2)30(41-4)26(12-17)40-3)31(42-5)28(33(37)43-6)22(18)15-24(35)29(21)34-23(20)14-19/h7-8,11-12,14,18,22,24,27-28,31,34H,9-10,13,15-16H2,1-6H3/t18-,22+,24-,27-,28+,31+/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,1,0,0,1,0,0,1,1,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H13NO2S/c1-2-10-4-3-5(7)6(8)9/h5H,2-4,7H2,1H3,(H,8,9)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H31NO6/c1-6-13(4)18(23)27-16-8-10-21-9-7-15(17(16)21)11-26-19(24)20(25,12(2)3)14(5)22/h6-7,12,14,16-17,22,25H,8-11H2,1-5H3/b13-6+/t14?,16-,17-,20?/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H10N2O3/c1-7(6-10)4-2-3-5(8)9/h2-4H2,1H3,(H,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H12N2O3/c1-8(2)7-5(9)3-4-6(10)11/h3-4H2,1-2H3,(H,7,9)(H,10,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C15H10F3NO/c16-15(17,18)14(20)19-11-5-6-13-10(8-11)7-9-3-1-2-4-12(9)13/h1-6,8H,7H2,(H,19,20)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H16N4O6.ClH/c18-13-16(14-7-10-1-2-12(22-10)17(19)20)9-11(23-13)8-15-3-5-21-6-4-15;/h1-2,7,11H,3-6,8-9H2;1H/b14-7+;/t11-;/m0./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C10H12N4O5/c15-6-5-12-3-4-13(10(12)16)11-7-8-1-2-9(19-8)14(17)18/h1-2,7,15H,3-6H2/b11-7+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C4H10N2S/c1-5-4(7)6(2)3/h1-3H3,(H,5,7)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6N4O4/c7-6(11)9-8-3-4-1-2-5(14-4)10(12)13/h1-3H,(H3,7,9,11)/b8-3+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C6H6N2O3/c7-5-3-4(8(10)11)1-2-6(5)9/h1-3,9H,7H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H12ClN3O3/c1-5(11)4-10(9-13)6(12)8-3-2-7/h5,11H,2-4H2,1H3,(H,8,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H12Br2O4/c7-1-3(9)5(11)6(12)4(10)2-8/h3-6,9-12H,1-2H2/t3-,4-,5-,6-/m1/s1",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H10N2O2/c1-6(5-8)3-2-4-7/h7H,2-4H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C19H28O2/c1-18-9-7-13(20)11-12(18)3-4-14-15-5-6-17(21)19(15,2)10-8-16(14)18/h3,13-16,20H,4-11H2,1-2H3/t13-,14-,15-,16-,18-,19-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/2Cr.2Na.7O/q;;2*+1;;;;;;2*-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C32H40BrN5O5.CH4O3S/c1-16(2)12-24-29(40)37-11-7-10-25(37)32(42)38(24)30(41)31(43-32,17(3)4)35-28(39)18-13-20-19-8-6-9-22-26(19)21(27(33)34-22)14-23(20)36(5)15-18;1-5(2,3)4/h6,8-9,13,16-18,23-25,34,42H,7,10-12,14-15H2,1-5H3,(H,35,39);1H3,(H,2,3,4)/t18-,23-,24+,25+,31-,32+;/m1./s1",0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,1,0,1,1,0,0,1,0,1,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C9H16ClN3O7/c10-1-2-13(12-19)9(18)11-5-7(16)6(15)4(3-14)20-8(5)17/h4-8,14-17H,1-3H2,(H,11,18)/t4-,5-,6-,7-,8+/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C11H9BrO4.Na/c1-16-8-4-2-7(3-5-8)11(15)9(12)6-10(13)14;/h2-6H,1H3,(H,13,14);/q;+1/p-1/b9-6+;",1,0,0,0,0,1,1,1,1,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H15Br6O4P/c10-1-7(13)4-17-20(16,18-5-8(14)2-11)19-6-9(15)3-12/h7-9H,1-6H2",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H13NO/c1-10(17)16-13-6-7-15-12(9-13)8-11-4-2-3-5-14(11)15/h2-7,9H,8H2,1H3,(H,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H25NO7/c1-3-12-8-11(2)18(23,10-20)17(22)25-9-13-4-6-19(24)7-5-14(15(13)19)26-16(12)21/h3-4,11,14-15,20,23H,5-10H2,1-2H3/b12-3-/t11-,14-,15-,18-,19?/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H18N4O5/c1-5-9(16)12(21)8-6(4-24-14(17)22)15(23-2)13-7(18-13)3-19(15)10(8)11(5)20/h6-7,13,18H,3-4,16H2,1-2H3,(H2,17,22)/t6-,7+,13+,15-/m1/s1",0,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H17ClO3/c1-17(2,16(19)20-3)21-15-10-6-13(7-11-15)12-4-8-14(18)9-5-12/h4-11H,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H5NO2/c8-7(9)6-4-2-1-3-5-6/h1-5H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C16H9NO2/c18-17(19)14-9-7-12-5-4-10-2-1-3-11-6-8-13(14)16(12)15(10)11/h1-9H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H9NO4/c1-8-6-7-11-12(13(8)16(19)20)15(18)10-5-3-2-4-9(10)14(11)17/h2-7H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H5N3O9/c7-4(8)13-1-3(15-6(11)12)2-14-5(9)10/h3H,1-2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H3N3O2S/c4-3-5-1-2(9-3)6(7)8/h1H,(H2,4,5)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H8N2O/c1-3-4-5(2)6/h3H2,1-2H3/b5-4-",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0 +"InChI=1S/C14H8O4/c15-9-5-1-3-7-11(9)14(18)12-8(13(7)17)4-2-6-10(12)16/h1-6,15-16H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H8O3/c15-11-7-3-6-10-12(11)14(17)9-5-2-1-4-8(9)13(10)16/h1-7,15H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H7NO2/c1-2-6-3(4)5/h2H2,1H3,(H2,4,5)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H11NO5/c1-2-14-5-8(13(16)17)12(15)7-3-10-11(4-9(7)14)19-6-18-10/h3-5H,2,6H2,1H3,(H,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H6N4O4S/c13-4-9-11-8-10-5(3-17-8)6-1-2-7(16-6)12(14)15/h1-4H,(H,9,13)(H,10,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C20H16O8/c1-23-10-7-11-13(8-4-5-26-20(8)27-11)18-15(10)16(22)14-9(21)6-12(24-2)17(25-3)19(14)28-18/h4-8,20-21H,1-3H3",0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H29N5O2/c1-23-19(21-18(15-25)22-23)20-9-6-12-26-17-8-5-7-16(13-17)14-24-10-3-2-4-11-24/h5,7-8,13,25H,2-4,6,9-12,14-15H2,1H3,(H,20,21,22)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H7Br2NO2/c15-8-5-9(16)12(17)11-10(8)13(18)6-3-1-2-4-7(6)14(11)19/h1-5H,17H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H10N2OS/c1-2-3-5-4-6(10)9-7(11)8-5/h4H,2-3H2,1H3,(H2,8,9,10,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H10N2/c1-5-2-3-6(8)4-7(5)9/h2-4H,8-9H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H12N4O2/c15-5-1-2-6(16)10-9(5)13(19)11-7(17)3-4-8(18)12(11)14(10)20/h1-4H,15-18H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H11NO2/c1-8-6-7-11-12(13(8)16)15(18)10-5-3-2-4-9(10)14(11)17/h2-7H,16H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C9H6O2/c10-9-6-5-7-3-1-2-4-8(7)11-9/h1-6H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H23NO6/c1-9-13(18)23-11-5-7-17-6-4-10(12(11)17)8-22-14(19)16(3,21)15(9,2)20/h4,9,11-12,20-21H,5-8H2,1-3H3/t9-,11+,12+,15+,16-/m0/s1",0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H4N2O2/c7-3-1-2-5-4(8)6-3/h1-2H,(H2,5,6,7,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6ClN.ClH/c7-5-1-3-6(8)4-2-5;/h1-4H,8H2;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H8O5/c15-8-5-9(16)14(19)11-10(8)12(17)6-3-1-2-4-7(6)13(11)18/h1-5,15-16,19H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H20O2/c1-3-17(13-5-9-15(19)10-6-13)18(4-2)14-7-11-16(20)12-8-14/h5-12,19-20H,3-4H2,1-2H3/b18-17+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C3H4O2/c4-3-1-2-5-3/h1-2H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C8H6O/c1-2-4-8-7(3-1)5-6-9-8/h1-6H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H12N2/c1-3-7-11(8-4-1)13-14-12-9-5-2-6-10-12/h1-10,13-14H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C19H20N2O2/c1-2-3-14-17-18(22)20(15-10-6-4-7-11-15)21(19(17)23)16-12-8-5-9-13-16/h4-13,17H,2-3,14H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C6H6ClN.ClH/c7-4-6-2-1-3-8-5-6;/h1-3,5H,4H2;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H8Cl3NO2S/c10-9(11,12)16-13-7(14)5-3-1-2-4-6(5)8(13)15/h1-2,5-6H,3-4H2",0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 +"InChI=1S/C7H5NO3S.Na/c9-7-5-3-1-2-4-6(5)12(10,11)8-7;/h1-4H,(H,8,9);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C3H7N3O3/c4-3(8)6(5-9)1-2-7/h7H,1-2H2,(H2,4,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C4H9N3O3/c5-4(9)7(6-10)2-1-3-8/h8H,1-3H2,(H2,5,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C7H15N3O2/c1-2-3-4-5-6-10(9-12)7(8)11/h2-6H2,1H3,(H2,8,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C17H12O7/c1-20-9-6-10-12(8-3-5-22-17(8)23-10)14-11(9)7-2-4-21-15(18)13(7)16(19)24-14/h3,5-6,8,17H,2,4H2,1H3",0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H10ClN3O3/c6-1-2-7-5(11)9(8-12)3-4-10/h10H,1-4H2,(H,7,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C5H11N3O3/c1-2-6-5(10)8(7-11)3-4-9/h9H,2-4H2,1H3,(H,6,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C5H10N2O3/c1-3-7(6-9)5(8)10-4-2/h3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H11N3O3/c1-3-9(8-12)6(11)7-4-5(2)10/h3-4H2,1-2H3,(H,7,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C8H16N2O3/c1-3-5-6-7-10(9-12)8(11)13-4-2/h3-7H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C9H19N3O2/c1-3-5-7-10-9(13)12(11-14)8-6-4-2/h3-8H2,1-2H3,(H,10,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C5H11N3O2/c1-2-3-4-8(7-10)5(6)9/h2-4H2,1H3,(H2,6,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C5H8O2/c1-3-5(6)7-4-2/h3H,1,4H2,2H3",0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/H4N2.H2O4S/c1-2;1-5(2,3)4/h1-2H2;(H2,1,2,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,1,0 +"InChI=1S/C5H7N3O4/c6-3(5(10)11)2-12-4(9)1-8-7/h1,3H,2,6H2,(H,10,11)/t3-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C5H11N3O3/c1-2-8(7-11)5(10)6-3-4-9/h9H,2-4H2,1H3,(H,6,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C9H6N2O2/c1-7-2-3-8(10-5-12)4-9(7)11-6-13/h2-4H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6O/c1-2-3-4-5/h2-4H,1H3/b3-2+",0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H26N2O/c1-3-4-5-6-7-8-9-10-11-12-14(2)13-15/h3-12H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C18H18Cl2N2O3/c1-24-15-7-6-11(8-16(15)25-12-4-2-3-5-12)18(23)22-17-13(19)9-21-10-14(17)20/h6-10,12H,2-5H2,1H3,(H,21,22,23)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H10N6O/c1-12(2)11-10-6-4(5(7)13)8-3-9-6/h3H,1-2H3,(H2,7,13)(H,8,9)/b11-10+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0 +"InChI=1S/C27H50O6/c1-4-7-10-13-16-19-25(28)31-22-24(33-27(30)21-18-15-12-9-6-3)23-32-26(29)20-17-14-11-8-5-2/h24H,4-23H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H14O6/c1-20-10-6-11-14(8-4-5-21-17(8)22-11)15-13(10)7-2-3-9(18)12(7)16(19)23-15/h4-6,8-9,17-18H,2-3H2,1H3/t8-,9+,17-/m0/s1",0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H9N3O3S/c16-12-7-3-1-2-4-8(7)13-11(14-12)9-5-6-10(19-9)15(17)18/h1-6,11,13H,(H,14,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H3N3O3/c7-2-1-6(5-9)3(8)4-2/h1H2,(H,4,7,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/CH4N2O2/c1-2-3(4)5/h2H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H8N2.2ClH/c7-5-3-1-2-4-6(5)8;;/h1-4H,7-8H2;2*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H13N.ClH/c1-6-4-8(3)9(10)5-7(6)2;/h4-5H,10H2,1-3H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/2ClH.Hg/h2*1H;/q;;+2/p-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H12N2O3.Na/c1-2-12(8-6-4-3-5-7-8)9(15)13-11(17)14-10(12)16;/h3-7H,2H2,1H3,(H2,13,14,15,16,17);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H16N2.2ClH/c1-9-7-11(3-5-13(9)15)12-4-6-14(16)10(2)8-12;;/h3-8H,15-16H2,1-2H3;2*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H10ClNO/c13-9-1-5-11(6-2-9)15-12-7-3-10(14)4-8-12/h1-8H,14H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H15NO2/c1-11(19)18(12(2)20)17-9-5-8-15-14-7-4-3-6-13(14)10-16(15)17/h3-9H,10H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C23H31NO2.ClH/c1-6-22(26-19(3)25)23(17-18(2)24(4)5,20-13-9-7-10-14-20)21-15-11-8-12-16-21;/h7-16,18,22H,6,17H2,1-5H3;1H/t18-,22-;/m0./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H5N3O4S/c12-4-9-8-10-5(3-16-8)6-1-2-7(15-6)11(13)14/h1-4H,(H,9,10,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H16N4O4S/c21-9-7-19(8-10-22)16-11-3-1-2-4-12(11)17-15(18-16)13-5-6-14(25-13)20(23)24/h1-6,21-22H,7-10H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H14N2O/c1-9-8-12(2,3)14(13-15)11-7-5-4-6-10(9)11/h4-8H,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C9H11N3O2/c13-10-12-6-2-4-9(12)8-3-1-5-11(14)7-8/h1,3,5,7,9H,2,4,6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C8H9N3O.ClH/c9-4-3-6-1-2-8(12)7(5-6)11-10;/h1-2,5H,3-4,9H2;1H",0,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C5H6O2/c6-4-5-2-1-3-7-5/h1-3,6H,4H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H14Cl2O3/c1-12(2,11(16)17)18-9-5-3-8(4-6-9)10-7-13(10,14)15/h3-6,10H,7H2,1-2H3,(H,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H10O3/c5-1-3-7-4-2-6/h5-6H,1-4H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H14N4O3S/c21-20(22)14-6-5-13(24-14)15-17-12-4-2-1-3-11(12)16(18-15)19-7-9-23-10-8-19/h1-6H,7-10H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H4N2OS/c7-3-1-2-5-4(8)6-3/h1-2H,(H2,5,6,7,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H9NO/c7-6-5-3-1-2-4-5/h7H,1-4H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H9NO.ClH/c1-9-7-5-3-2-4-6(7)8;/h2-5H,8H2,1H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H20O4/c1-2-3-13-22-18(20)16-11-7-8-12-17(16)19(21)23-14-15-9-5-4-6-10-15/h4-12H,2-3,13-14H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C26H42O4/c1-21(2)15-9-5-7-13-19-29-25(27)23-17-11-12-18-24(23)26(28)30-20-14-8-6-10-16-22(3)4/h11-12,17-18,21-22H,5-10,13-16,19-20H2,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H10N2/c1-3-7-11(8-4-1)13-14-12-9-5-2-6-10-12/h1-10H/b14-13+,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +InChI=1S/C10H8/c1-2-6-10-8-4-3-7-9(10)5-1/h1-8H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C5H5N/c1-2-4-6-5-3-1/h1-5H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C17H13ClN2O4S.Ba/c2*1-10-8-14(16(9-13(10)18)25(22,23)24)19-20-17-12-5-3-2-4-11(12)6-7-15(17)21;/h2*2-9,21H,1H3,(H,22,23,24);/q;;+2/p-2/b2*20-19+;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C8H11N.ClH/c1-6-3-4-7(2)8(9)5-6;/h3-5H,9H2,1-2H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H10N6O5/c1-5(18)12-10-14-9(15-11(16-10)13-6(2)19)7-3-4-8(22-7)17(20)21/h3-4H,1-2H3,(H2,12,13,14,15,16,18,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H7N3OS/c1-4-2-10-5(7-4)8-6-3-9/h2-3H,1H3,(H,6,9)(H,7,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C8H12N2O3.Na/c1-3-8(4-2)5(11)9-7(13)10-6(8)12;/h3-4H2,1-2H3,(H2,9,10,11,12,13);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H9NO/c1-2-7-5-3-4-6(7)8/h2H,1,3-5H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H9N3O3/c1-6-5-7(2)12-10(11-6)8-3-4-9(16-8)13(14)15/h3-5H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H23NO2/c12-10-8-6-4-2-1-3-5-7-9-11(13)14/h1-10,12H2,(H,13,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H17NO2/c1-18-15-9-10-16(19-2)13(11-15)6-3-12-4-7-14(17)8-5-12/h3-11H,17H2,1-2H3/b6-3+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H11N.ClH/c13-12-8-6-11(7-9-12)10-4-2-1-3-5-10;/h1-9H,13H2;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H5NS/c1-2(3)4/h1H3,(H2,3,4)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H13NO/c1-4-7(5-2)6(3)8/h4-5H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H6N2O4/c1-5-6(8(10)11)3-2-4-7(5)9(12)13/h2-4H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H13NO/c1-11(16)15-14-9-7-13(8-10-14)12-5-3-2-4-6-12/h2-10H,1H3,(H,15,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C21H27NO7/c1-6-15-11-13(2)20(4,29-14(3)23)19(25)27-12-16-7-9-22(5)10-8-17(21(16,22)26)28-18(15)24/h6-7,11,13,17H,1,8-10,12H2,2-5H3/b15-11+/t13-,17+,20-,21?,22?/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H7Cl/c1-4(2)3-5/h1,3H2,2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H16N4O4/c1-7(15-5-10(18)13-11(19)6-15)2-14-3-8(16)12-9(17)4-14/h7H,2-6H2,1H3,(H,12,16,17)(H,13,18,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H11Cl2N/c1-8(4-2-6)5-3-7/h2-5H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H17N5O/c1-2-21-9-8-12-13(11-6-4-3-5-7-11)19-15(16)20-14(12)17-10-18-20/h3-7,10H,2,8-9H2,1H3,(H2,16,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H14N4O5S/c23-16-9-6-13(11-15(16)18(24)25)21-20-12-4-7-14(8-5-12)28(26,27)22-17-3-1-2-10-19-17/h1-11,23H,(H,19,22)(H,24,25)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,1,0,0 +"InChI=1S/BrHO3.K/c2-1(3)4;/h(H,2,3,4);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/CH3NO2/c1-2(3)4/h1H3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H8O/c1-2-4-7(5-3-1)8-6-9-8/h1-5,8H,6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C25H31NO6/c1-13-26-25(20(30)12-31-14(2)27)21(32-13)10-18-17-6-5-15-9-16(28)7-8-23(15,3)22(17)19(29)11-24(18,25)4/h7-9,17-19,21-22,29H,5-6,10-12H2,1-4H3/t17-,18-,19-,21+,22+,23-,24-,25+/m0/s1",0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/CH2O/c1-2/h1H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H10N2O2/c1-3-4-8(7-10)5-6(2)9/h3H,1,4-5H2,2H3",0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C16H16N2O4S/c1-11(19)17-13-3-7-15(8-4-13)23(21,22)16-9-5-14(6-10-16)18-12(2)20/h3-10H,1-2H3,(H,17,19)(H,18,20)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C34H28N6O16S4.4Na/c1-55-25-9-15(3-5-23(25)37-39-31-27(59(49,50)51)11-17-7-19(57(43,44)45)13-21(35)29(17)33(31)41)16-4-6-24(26(10-16)56-2)38-40-32-28(60(52,53)54)12-18-8-20(58(46,47)48)14-22(36)30(18)34(32)42;;;;/h3-14,41-42H,35-36H2,1-2H3,(H,43,44,45)(H,46,47,48)(H,49,50,51)(H,52,53,54);;;;/q;4*+1/p-4/b39-37+,40-38+;;;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C21H30O3/c1-13(22)24-15-8-10-20(2)14(12-15)4-5-16-17-6-7-19(23)21(17,3)11-9-18(16)20/h4,15-18H,5-12H2,1-3H3/t15-,16-,17-,18-,20-,21-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C3H4N2O3/c6-3-5(4-7)1-2-8-3/h1-2H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C20H14N2O10S3.3Na/c23-20-18(35(30,31)32)10-11-9-12(33(24,25)26)5-6-13(11)19(20)22-21-16-7-8-17(34(27,28)29)15-4-2-1-3-14(15)16;;;/h1-10,23H,(H,24,25,26)(H,27,28,29)(H,30,31,32);;;/q;3*+1/p-3/b22-21+;;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C18H16N2O7S2.2Na/c1-10-3-6-15(11(2)7-10)19-20-17-14-5-4-13(28(22,23)24)8-12(14)9-16(18(17)21)29(25,26)27;;/h3-9,21H,1-2H3,(H,22,23,24)(H,25,26,27);;/q;2*+1/p-2/b20-19+;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C9H12/c1-7-4-5-8(2)9(3)6-7/h4-6H,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H12N2O3/c1-3-14-6-9(12(16)17)10(15)8-5-4-7(2)13-11(8)14/h4-6H,3H2,1-2H3,(H,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H14ClN3O2S/c1-8-4-3-5-10(9(8)2)16-12-6-11(15)17-14(18-12)21-7-13(19)20/h3-6H,7H2,1-2H3,(H,19,20)(H,16,17,18)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H7N3O/c1-9(8-10)6-4-2-3-5-7-6/h2-5H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/C20H12/c1-2-7-17-15(4-1)12-16-9-8-13-5-3-6-14-10-11-18(17)20(16)19(13)14/h1-12H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H14N2O4/c12-10(14)16-6-9(7-17-11(13)15)8-4-2-1-3-5-8/h1-5,9H,6-7H2,(H2,12,14)(H2,13,15)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C4H8O/c1-2-4-5-3-1/h1-4H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C4H8N2O2/c7-5-6-3-1-2-4-8-6/h1-4H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0 +InChI=1S/C4H8O2/c1-2-6-4-3-5-1/h1-4H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H16/c1-8(2)10-6-4-9(3)5-7-10/h4,10H,1,5-7H2,2-3H3/t10-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H12N2O/c1-6-4-2-3-5-8(6)7-9/h6H,2-5H2,1H3/t6-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C62H86N12O16/c1-27(2)42-59(84)73-23-17-19-36(73)57(82)69(13)25-38(75)71(15)48(29(5)6)61(86)88-33(11)44(55(80)65-42)67-53(78)35-22-21-31(9)51-46(35)64-47-40(41(63)50(77)32(10)52(47)90-51)54(79)68-45-34(12)89-62(87)49(30(7)8)72(16)39(76)26-70(14)58(83)37-20-18-24-74(37)60(85)43(28(3)4)66-56(45)81/h21-22,27-30,33-34,36-37,42-45,48-49H,17-20,23-26,63H2,1-16H3,(H,65,80)(H,66,81)(H,67,78)(H,68,79)/t33-,34-,36-,37-,42+,43+,44-,45-,48-,49-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H9Cl4NO2S/c11-9(12)10(13,14)18-15-7(16)5-3-1-2-4-6(5)8(15)17/h1-2,5-6,9H,3-4H2",0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 +"InChI=1S/C6H11IO3/c1-4(7)6-9-3-5(2-8)10-6/h4-6,8H,2-3H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H15N3O/c1-6-4-10(8-11)5-7(2)9(6)3/h6-7H,4-5H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/CHBr3/c2-1(3)4/h1H,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H9NO2/c15-14(16)11-5-6-13-10(8-11)7-9-3-1-2-4-12(9)13/h1-6,8H,7H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H9NO2/c15-8-5-6-11-12(7-8)14(17)10-4-2-1-3-9(10)13(11)16/h1-7H,15H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H11NO7.Na/c1-23-12-4-2-3-8-9(12)5-11(18(21)22)14-10(17(19)20)6-13-16(15(8)14)25-7-24-13;/h2-6H,7H2,1H3,(H,19,20);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H10N4O4/c1-6-5-12(9(14)11-6)10-4-7-2-3-8(17-7)13(15)16/h2-4,6H,5H2,1H3,(H,11,14)/b10-4+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C8H8N4O4/c13-8-9-3-4-11(8)10-5-6-1-2-7(16-6)12(14)15/h1-2,5H,3-4H2,(H,9,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C12H11N3.C2H4O2/c1-7-6-9-8-4-2-3-5-10(8)14-12(9)15-11(7)13;1-2(3)4/h2-6H,1H3,(H3,13,14,15);1H3,(H,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H14N4O7S.Na/c23-21(24)14-7-9-15(17(11-14)22(25)26)20-13-6-8-16(18(10-13)30(27,28)29)19-12-4-2-1-3-5-12;/h1-11,19-20H,(H,27,28,29);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 +InChI=1S/C7H4N2O3S/c10-9(11)7-2-1-6(12-7)5-3-13-4-8-5/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H14O/c1-7-4-8(10)6-9(2,3)5-7/h4H,5-6H2,1-3H3",0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H9NO2S/c1-6-4-2-3-5-7(6)11(8,9)10/h2-5H,1H3,(H2,8,9,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C16H12N2O4/c1-21-15-7-11(3-5-13(15)17-9-19)12-4-6-14(18-10-20)16(8-12)22-2/h3-8H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6O2/c1-3-6-4(2)5/h3H,1H2,2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/SSe/c1-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H10N2O/c1-3-5-6(7)4-2/h3-4H2,1-2H3/b6-5-",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0 +"InChI=1S/C6H8N4O3S/c1-2-7-5(11)9-6-8-3-4(14-6)10(12)13/h3H,2H2,1H3,(H2,7,8,9,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H4F3N3O4S/c10-9(11,12)7(16)14-8-13-4(3-20-8)5-1-2-6(19-5)15(17)18/h1-3H,(H,13,14,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H8N2O/c1-3-5(6)4-2/h3H2,1-2H3/b5-4-",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0 +InChI=1S/C11H7N3O3/c15-14(16)11-5-4-9(17-11)8-7-12-10-3-1-2-6-13(8)10/h1-7H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H13N3O2/c16-9-7-8(13-1-2-13)12(17)11(15-5-6-15)10(9)14-3-4-14/h7H,1-6H2",0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C21H33NO7/c1-7-13(2)18(23)29-16-9-11-22-10-8-15(17(16)22)12-28-19(24)21(26,14(3)27-6)20(4,5)25/h7-8,14,16-17,25-26H,9-12H2,1-6H3/b13-7-/t14-,16-,17+,21+/m0/s1",0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/Cd.2ClH/h;2*1H/q+2;;/p-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6Cl2/c5-3-1-2-4-6/h1-2H,3-4H2/b2-1+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H24O2/c1-3-20(22)11-9-18-17-6-4-13-12-14(21)5-7-15(13)16(17)8-10-19(18,20)2/h1,5,7,12,16-18,21-22H,4,6,8-11H2,2H3/t16-,17-,18+,19+,20+/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H15N3O2/c1-13(12-15)7-3-5-10(14)9-4-2-6-11-8-9/h2,4,6,8,10,14H,3,5,7H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C21H28O5/c1-19-7-5-13(23)9-12(19)3-4-14-15-6-8-21(26,17(25)11-22)20(15,2)10-16(24)18(14)19/h5,7,9,14-16,18,22,24,26H,3-4,6,8,10-11H2,1-2H3/t14-,15-,16-,18+,19-,20-,21-/m0/s1",0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H4Cl6O4/c10-3-4(11)8(13)2(6(18)19)1(5(16)17)7(3,12)9(8,14)15/h1-2H,(H,16,17)(H,18,19)",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C5H10N2O/c8-6-7-4-2-1-3-5-7/h1-5H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C35H45Cl2NO6/c1-33-14-12-26(39)20-24(33)8-11-27-28-13-15-35(43,34(28,2)21-29(40)32(27)33)30(41)22-44-31(42)5-3-4-23-6-9-25(10-7-23)38(18-16-36)19-17-37/h6-7,9-10,12,14,20,27-29,32,40,43H,3-5,8,11,13,15-19,21-22H2,1-2H3/t27-,28-,29-,32+,33-,34-,35-/m0/s1",0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H7NO2/c1-6-4-2-3-5-7(6)8(9)10/h2-5H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H14N2O/c1-5(2)7-8(9)6(3)4/h5-6H,1-4H3/b8-7-",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0 +"InChI=1S/C6H12Br2O4/c7-1-3(9)5(11)6(12)4(10)2-8/h3-6,9-12H,1-2H2/t3-,4+,5+,6-",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H11Cl2NO/c1-8(9,4-2-6)5-3-7/h2-5H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C25H34O6/c1-4-5-21-30-20-11-17-16-7-6-14-10-15(27)8-9-23(14,2)22(16)18(28)12-24(17,3)25(20,31-21)19(29)13-26/h8-10,16-18,20-22,26,28H,4-7,11-13H2,1-3H3/t16-,17-,18-,20+,21?,22+,23-,24-,25+/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/HI.K/h1H;/q;+1/p-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H4N4/c3-2-4-1-5-6-2/h1H,(H3,3,4,5,6)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H5N2O2.N/c9-7-8(10)6-4-2-1-3-5-6;/h1-5H;/q-1;+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0 +"InChI=1S/C4H8N2S4.Mn/c7-3(8)5-1-2-6-4(9)10;/h1-2H2,(H2,5,7,8)(H2,6,9,10);/q;+2/p-2",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H19Cl7/c1-2-7(14)3-4-8(15)9(16)5-10(17)12(19)11(18)6-13/h7-12H,2-6H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H5Br/c1-2-3/h2H2,1H3",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H10O/c1-7(9)8-5-3-2-4-6-8/h2-7,9H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H8N2O5/c12-11(14)8(9-2-1-5-17-9)6-7-3-4-10(18-7)13(15)16/h1-6H,(H2,12,14)/b8-6-",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H13N5O4/c1-5-3-15(10(18)12-9(5)17)8-2-6(13-14-11)7(4-16)19-8/h3,6-8,16H,2,4H2,1H3,(H,12,17,18)/t6-,7+,8+/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +InChI=1S/C2H6N2O/c1-3-4(2)5/h1-2H3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C14H13N3O2S/c1-19-13-7-9(20(2)18)3-4-10(13)14-16-11-5-6-15-8-12(11)17-14/h3-8H,1-2H3,(H,16,17)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H10O7/c16-7-4-10(19)12-11(5-7)22-15(14(21)13(12)20)6-1-2-8(17)9(18)3-6/h1-5,16-19,21H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H9AsO/c1-4(2,3)5/h1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H3Cl/c1-2-3/h2H,1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H10O2/c1-2-3-8-4-5-9-10(6-8)12-7-11-9/h2,4-6H,1,3,7H2",0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H3F/c1-2-3/h2H,1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H10N2O/c1-3-5-8(7-9)6-4-2/h3-4H,1-2,5-6H2",0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C9H8N4O2S/c10-12-9-11-8(5-16-9)6-1-3-7(4-2-6)13(14)15/h1-5H,10H2,(H,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,0,1,0,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C10H14N2O4S/c1-9-3-5-10(6-4-9)17(14,15)16-8-7-12(2)11-13/h3-6H,7-8H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0 +"InChI=1S/C7H7FN2O/c1-10(9-11)7-4-2-6(8)3-5-7/h2-5H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C4H6/c1-3-4-2/h3-4H,1-2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H3N/c1-2-3-4/h2H,1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H12ClNO2/c1-2-16(20-15(18)19,12-6-4-3-5-7-12)13-8-10-14(17)11-9-13/h1,3-11H,(H2,18,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C39H41N3O6S2.Na/c1-5-41(27-29-9-7-11-37(25-29)49(43,44)45)35-21-15-32(16-22-35)39(31-13-19-34(20-14-31)40(3)4)33-17-23-36(24-18-33)42(6-2)28-30-10-8-12-38(26-30)50(46,47)48;/h7-26H,5-6,27-28H2,1-4H3,(H-,43,44,45,46,47,48);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C10H10N4O3S/c1-6(2)12-13-10-11-5-8(18-10)7-3-4-9(17-7)14(15)16/h3-5H,1-2H3,(H,11,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +InChI=1S/C3H4O2.Na/c4-2-1-3-5;/h1-4H;/q;+1/p-1/b2-1+;,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C37H36N2O6S2.Na/c1-3-38(26-28-10-8-14-35(24-28)46(40,41)42)33-20-16-31(17-21-33)37(30-12-6-5-7-13-30)32-18-22-34(23-19-32)39(4-2)27-29-11-9-15-36(25-29)47(43,44)45;/h5-25H,3-4,26-27H2,1-2H3,(H-,40,41,42,43,44,45);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/2C2H4O2.Pb/c2*1-2(3)4;/h2*1H3,(H,3,4);/q;;+2/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H19N3O.ClH/c1-9(2)15-12(16)11-6-4-10(5-7-11)8-14-13-3;/h4-7,9,13-14H,8H2,1-3H3,(H,15,16);1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0 +InChI=1S/C12Br10O/c13-1-3(15)7(19)11(8(20)4(1)16)23-12-9(21)5(17)2(14)6(18)10(12)22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C4H8N4O2/c9-5-7-2-1-3-8(4-7)6-10/h1-4H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/CHBrCl2/c2-1(3)4/h1H,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H11NO2/c1-3-5-6(4-2)7(8)9/h5H,3-4H2,1-2H3/b6-5-",0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H7NO/c1-6-4-2-3-5-7(6)8-9/h2-5H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H2ClF3/c3-1-2(4,5)6/h1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H22N2O.C4H6O4/c1-17(20-14-13-19(2)3,15-9-5-4-6-10-15)16-11-7-8-12-18-16;5-3(6)1-2-4(7)8/h4-12H,13-14H2,1-3H3;1-2H2,(H,5,6)(H,7,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H14N2O/c1-3-5-8(7-9)6-4-2/h3-6H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C19H17N3.ClH/c20-16-7-1-13(2-8-16)19(14-3-9-17(21)10-4-14)15-5-11-18(22)12-6-15;/h1-12,20H,21-22H2;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H7Cl2NO3/c13-8-1-6-12(11(14)7-8)18-10-4-2-9(3-5-10)15(16)17/h1-7H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H10O/c13-12-9-5-4-8-11(12)10-6-2-1-3-7-10/h1-9,13H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H15ClO3/c1-4-15-11(14)12(2,3)16-10-7-5-9(13)6-8-10/h5-8H,4H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H12O/c1-5(2,3)6-4/h1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H11N3O3/c12-10(15)6-9-11(16)17-13-14(9)7-8-4-2-1-3-5-8/h1-5H,6-7H2,(H2-,12,13,15,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0 +"InChI=1S/C18H23NO6/c1-3-12-8-11(2)18(23,10-20)17(22)24-9-13-4-6-19-7-5-14(15(13)19)25-16(12)21/h3-4,14-15,20,23H,2,5-10H2,1H3/b12-3-/t14-,15-,18-/m1/s1",0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C22H32O2/c1-17(9-7-10-18(2)14-16-24-20(4)23)12-13-21-19(3)11-8-15-22(21,5)6/h7,9-10,12-14H,8,11,15-16H2,1-6H3",0,0,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H4O/c1-2-3/h2H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6N2S/c1-6-3-2-5-4(6)7/h2-3H,1H3,(H,5,7)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C26H29NO.C6H8O7/c1-4-25(21-11-7-5-8-12-21)26(22-13-9-6-10-14-22)23-15-17-24(18-16-23)28-20-19-27(2)3;7-3(8)1-6(13,5(11)12)2-4(9)10/h5-18H,4,19-20H2,1-3H3;13H,1-2H2,(H,7,8)(H,9,10)(H,11,12)/b26-25-;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H2Cl2O2/c3-1(4)2(5)6/h1H,(H,5,6)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H14N2O4/c1-8(2)16-9-6-4-5-7-10(9)17-11(14)13(3)12-15/h4-8H,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C8H15N3O7/c1-11(10-17)8(16)9-4-6(14)5(13)3(2-12)18-7(4)15/h3-7,12-15H,2H2,1H3,(H,9,16)/t3-,4-,5-,6-,7+/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C2H2F4/c3-1-2(4,5)6/h1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H9NO2/c1-4(2)3-7-5-6/h4H,3H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H7N3O4S/c1-5(13)10-9-11-6(4-17-9)7-2-3-8(16-7)12(14)15/h2-4H,1H3,(H,10,11,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H3Cl2F/c1-2(3,4)5/h1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C21H16/c1-13-6-7-15-12-20-17-5-3-2-4-14(17)8-9-18(20)19-11-10-16(13)21(15)19/h2-9,12H,10-11H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H14O5/c1-5-7(3)18-4-8-9(5)6(2)11(14)10(12(8)15)13(16)17/h4-5,7,15H,1-3H3,(H,16,17)/t5-,7-/m0/s1",0,0,0,1,0,1,1,0,0,0,1,1,0,1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H16ClNO4/c1-11-15(10-18(22)23)16-9-14(25-2)7-8-17(16)21(11)19(24)12-3-5-13(20)6-4-12/h3-9H,10H2,1-2H3,(H,22,23)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H22O3/c1-11-6-7-12(2)13(10-11)18-9-5-8-15(3,4)14(16)17/h6-7,10H,5,8-9H2,1-4H3,(H,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C39H59Cl2NO2/c1-27(2)7-6-8-28(3)34-15-16-35-33-14-11-30-26-32(17-19-38(30,4)36(33)18-20-39(34,35)5)44-37(43)25-29-9-12-31(13-10-29)42(23-21-40)24-22-41/h9-13,27-28,32-36H,6-8,14-26H2,1-5H3/t28-,32+,33+,34-,35+,36+,38+,39-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C37H30N4O10S3.2Na/c1-22-4-13-30(14-5-22)54(49,50)51-29-11-9-28(10-12-29)38-39-32-15-6-25(18-23(32)2)26-7-16-33(24(3)19-26)40-41-37-34(42)17-8-27-20-31(52(43,44)45)21-35(36(27)37)53(46,47)48;;/h4-21,42H,1-3H3,(H,43,44,45)(H,46,47,48);;/q;2*+1/p-2/b39-38+,41-40+;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C19H18N2O7S2.2Na/c1-10-6-12(3)16(7-11(10)2)20-21-18-15-5-4-14(29(23,24)25)8-13(15)9-17(19(18)22)30(26,27)28;;/h4-9,22H,1-3H3,(H,23,24,25)(H,26,27,28);;/q;2*+1/p-2/b21-20+;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C7H8N2O3/c1-12-7-3-2-5(9(10)11)4-6(7)8/h2-4H,8H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C2H6N2O2/c1-3(2)4(5)6/h1-2H3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C8H14O4/c1-5-4-8(11-6(2)9)12-7(3)10-5/h5,7-8H,4H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H7NO/c1-3(2)4-5/h5H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H8N2O2/c1-10(9-12)8(11)7-5-3-2-4-6-7/h2-6H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C14H15N3/c1-10-5-3-4-6-14(10)17-16-12-7-8-13(15)11(2)9-12/h3-9H,15H2,1-2H3/b17-16+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C15H18N2/c1-10-7-12(3-5-14(10)16)9-13-4-6-15(17)11(2)8-13/h3-8H,9,16-17H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H19NO3/c1-12(2,3)13-7-11(16)8-4-9(14)6-10(15)5-8/h4-6,11,13-16H,7H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H22O3/c1-20(2,19(21)22)23-16-12-10-15(11-13-16)18-9-5-7-14-6-3-4-8-17(14)18/h3-4,6,8,10-13,18H,5,7,9H2,1-2H3,(H,21,22)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H14N2.2ClH/c14-12-5-1-10(2-6-12)9-11-3-7-13(15)8-4-11;;/h1-8H,9,14-15H2;2*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C7H6O/c8-6-7-4-2-1-3-5-7/h1-6H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H20O5S.Na/c1-18-9-8-14-13-5-3-12(23-24(20,21)22)10-11(13)2-4-15(14)16(18)6-7-17(18)19;/h3-5,10,14,16H,2,6-9H2,1H3,(H,20,21,22);/q;+1/p-1/t14-,16+,18+;/m1./s1",0,0,0,0,0,0,0,1,1,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C18H34O2.Na/c1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18(19)20;/h9-10H,2-8,11-17H2,1H3,(H,19,20);/q;+1/p-1/b10-9-;",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H7NO2/c1-2-3-4(5)6/h2-3H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H8N2O.2ClH/c7-4-1-2-6(9)5(8)3-4;;/h1-3,9H,7-8H2;2*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/ClHO2.Na/c2-1-3;/h(H,2,3);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H13N4O8P.2Na/c15-6-4(1-21-23(18,19)20)22-10(7(6)16)14-3-13-5-8(14)11-2-12-9(5)17;;/h2-4,6-7,10,15-16H,1H2,(H,11,12,17)(H2,18,19,20);;/q;2*+1/p-2/t4-,6-,7-,10-;;/m1../s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H9NO.ClH/c1-9-7-4-2-6(8)3-5-7;/h2-5H,8H2,1H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H14N4O5/c9-7-10-2-12(8(16)11-7)6-5(15)4(14)3(1-13)17-6/h3-6,13-15H,1-2H2,(H3,9,10,11,16)/t3-,4-,5-,6-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H14O2/c1-4-7(8-5-2)9-6-3/h4,7H,1,5-6H2,2-3H3",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H9Cl4O4P/c1-16-19(15,17-2)18-10(5-11)6-3-8(13)9(14)4-7(6)12/h3-5H,1-2H3/b10-5-",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C25H30N2O5.ClH/c1-3-32-25(31)21(14-13-18-9-5-4-6-10-18)26-17(2)23(28)27-16-20-12-8-7-11-19(20)15-22(27)24(29)30;/h4-12,17,21-22,26H,3,13-16H2,1-2H3,(H,29,30);1H/t17-,21-,22-;/m0./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,0,1,1,0,0,0,0,1,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C22H30N2O.ClH/c1-18-10-8-11-19(2)24(18)17-9-15-22(25,20-12-4-3-5-13-20)21-14-6-7-16-23-21;/h3-7,12-14,16,18-19,25H,8-11,15,17H2,1-2H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/2O.Ti,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/Ni,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H19N3O/c1-16(2)9-10-17(12-13-6-5-11-18-13)14-7-3-4-8-15-14/h3-8,11H,9-10,12H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C22H24N2O8.ClH/c1-21(31)8-5-4-6-11(25)12(8)16(26)13-9(21)7-10-15(24(2)3)17(27)14(20(23)30)19(29)22(10,32)18(13)28;/h4-6,9-10,15,25,27-28,31-32H,7H2,1-3H3,(H2,23,30);1H/t9-,10-,15-,21+,22-;/m0./s1",0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H7N3O2S/c12-5-9-11-8-10-6(4-14-8)7-2-1-3-13-7/h1-5H,(H,9,12)(H,10,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,1,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,0,1,0,1,1,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C5H7NO3/c1-5(2)3(7)6-4(8)9-5/h1-2H3,(H,6,7,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H15O3PS2/c1-8-7-9(5-6-10(8)16-4)13-14(15,11-2)12-3/h5-7H,1-4H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1 +"InChI=1S/C15H16O2/c1-15(2,11-3-7-13(16)8-4-11)12-5-9-14(17)10-6-12/h3-10,16-17H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H9NO/c1-6-4-2-3-5(6)7/h2-4H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H17ClN2O/c20-15-8-9-17-16(10-15)19(14-4-2-1-3-5-14)21-11-18(23)22(17)12-13-6-7-13/h1-5,8-10,13H,6-7,11-12H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H4Cl3NO2S/c10-9(11,12)16-13-7(14)5-3-1-2-4-6(5)8(13)15/h1-4H",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0 +"InChI=1S/C27H30O16.H2O4S/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9;1-5(2,3)4/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3;(H2,1,2,3,4)/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-;/m0./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +InChI=1S/NO3.Na/c2-1(3)4;/q-1;+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H20N2S/c1-16(2)10-11-17(13-15-9-6-12-18-15)14-7-4-3-5-8-14/h3-9,12H,10-11,13H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H12N2O7S2.2Na/c19-13-7-6-10-8-12(26(20,21)22)9-14(27(23,24)25)15(10)16(13)18-17-11-4-2-1-3-5-11;;/h1-9,19H,(H,20,21,22)(H,23,24,25);;/q;2*+1/p-2/b18-17+;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C17H14F3N3O2S/c1-11-2-4-12(5-3-11)15-10-16(17(18,19)20)22-23(15)13-6-8-14(9-7-13)26(21,24)25/h2-10H,1H3,(H2,21,24,25)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C7H8N2O2/c1-5-2-3-6(9(10)11)4-7(5)8/h2-4H,8H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8N4O2/c1-10-5-4(8-3-9-5)6(12)11(2)7(10)13/h3H,1-2H3,(H,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H5N3/c1-2-4-6-5(3-1)7-9-8-6/h1-4H,(H,7,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H35N.C4H4O4/c1-3-9-16(10-4-1)19(17-11-5-2-6-12-17)15-18-13-7-8-14-20-18;5-3(6)1-2-4(7)8/h16-20H,1-15H2;1-2H,(H,5,6)(H,7,8)/b;2-1-",0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H24N2O3.ClH/c1-13(7-8-14-5-3-2-4-6-14)21-12-18(23)15-9-10-17(22)16(11-15)19(20)24;/h2-6,9-11,13,18,21-23H,7-8,12H2,1H3,(H2,20,24);1H/t13-,18+;/m1./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H19NO2.ClH/c1-17-14(16)13(11-7-3-2-4-8-11)12-9-5-6-10-15-12;/h2-4,7-8,12-13,15H,5-6,9-10H2,1H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C4H4O3/c5-3-1-2-4(6)7-3/h1-2H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6Cl6/c7-1-2(8)4(10)6(12)5(11)3(1)9/h1-6H/t1-,2-,3-,4+,5+,6+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H4Cl3N/c7-3-1-4(8)6(10)5(9)2-3/h1-2H,10H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H13NO/c1-10(17)16-15-8-4-7-13-12-6-3-2-5-11(12)9-14(13)15/h2-8H,9H2,1H3,(H,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/Na.HO3P/c;1-4(2)3/h;(H,1,2,3)/q+1;/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H8I4O5.2Na/c21-11-5-9-13(7-3-1-2-4-8(7)20(27)28)10-6-12(22)17(26)15(24)19(10)29-18(9)14(23)16(11)25;;/h1-6,25H,(H,27,28);;/q;2*+1/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C21H21O4P/c1-16-4-10-19(11-5-16)23-26(22,24-20-12-6-17(2)7-13-20)25-21-14-8-18(3)9-15-21/h4-15H,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8O2/c1-5-4-6(8)2-3-7(5)9/h2-4,8-9H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/2ClH.Sn/h2*1H;/q;;+2/p-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C27H33NO3/c1-4-28(5-2)19-20-31-26-17-13-24(14-18-26)27(29,23-9-7-6-8-10-23)21-22-11-15-25(30-3)16-12-22/h6-18,29H,4-5,19-21H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H4Cl2O/c7-4-1-2-6(9)5(8)3-4/h1-3,9H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/Cl2/c1-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H10O5/c1-6-2-8-12(10(17)3-6)15(20)13-9(14(8)19)4-7(16)5-11(13)18/h2-5,16-18H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/Mn.H2O4S.H2O/c;1-5(2,3)4;/h;(H2,1,2,3,4);1H2/q+2;;/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C37H36N2O9S3.2Na/c1-3-38(25-27-9-7-11-33(23-27)49(40,41)42)31-19-15-29(16-20-31)37(35-13-5-6-14-36(35)51(46,47)48)30-17-21-32(22-18-30)39(4-2)26-28-10-8-12-34(24-28)50(43,44)45;;/h5-24H,3-4,25-26H2,1-2H3,(H2-,40,41,42,43,44,45,46,47,48);;/q;2*+1/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C3H7NO/c1-4(2)3-5/h3H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/H2O4S.O.V/c1-5(2,3)4;;/h(H2,1,2,3,4);;/q;;+2/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C6H8O6.Na/c7-1-2(8)5-3(9)4(10)6(11)12-5;/h2,5,7-10H,1H2;/q;+1/p-1/t2-,5+;/m1./s1",0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H8O2/c1-2-3-4-5-6(7)8/h2-5H,1H3,(H,7,8)",0,0,0,0,1,1,1,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H13N3.ClH/c15-8-11-4-6-12(7-5-11)14-3-1-2-13-9-16-10-17(13)14;/h4-7,9-10,14H,1-3H2;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H28N4O5S2/c1-20-11-16-7-8-17(28-16)13-29-10-9-21-19(23-30(2,26)27)22-12-18(25)14-3-5-15(24)6-4-14/h3-8,18,20,24-25H,9-13H2,1-2H3,(H2,21,22,23)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C5H13ClN.ClH/c1-7(2,3)5-4-6;/h4-5H2,1-3H3;1H/q+1;/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H10N2O3/c9-6(10)5-3-1-2-4-8(5)7-11/h5H,1-4H2,(H,9,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H8O7.2N/c7-3(8)1-6(13,5(11)12)2-4(9)10;;/h13H,1-2H2,(H,7,8)(H,9,10)(H,11,12);;/q;2*+1/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/ClH/h1H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/AsO2.Na/c2-1-3;/q-1;+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H24N2O3.ClH/c1-17(2,3)18-9-12(20)11-22-15-10-19(4)16(21)14-8-6-5-7-13(14)15;/h5-8,10,12,18,20H,9,11H2,1-4H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +InChI=1S/CHNS.Na/c2-1-3;/h3H;/q;+1/p-1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H14NO.ClH/c1-6(2,3)4-5-7;/h7H,4-5H2,1-3H3;1H/q+1;/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C32H26Cl2N6O4/c1-19(41)29(31(43)35-23-9-5-3-6-10-23)39-37-27-15-13-21(17-25(27)33)22-14-16-28(26(34)18-22)38-40-30(20(2)42)32(44)36-24-11-7-4-8-12-24/h3-18,29-30H,1-2H3,(H,35,43)(H,36,44)/b39-37+,40-38+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/Al.K.2H2O4S/c;;2*1-5(2,3)4/h;;2*(H2,1,2,3,4)/q+3;+1;;/p-4",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C42H50Cl4N2O4/c1-42-17-16-36-35-13-11-34(51-40(49)26-29-2-7-32(8-3-29)47(22-18-43)23-19-44)28-31(35)6-12-37(36)38(42)14-15-39(42)52-41(50)27-30-4-9-33(10-5-30)48(24-20-45)25-21-46/h2-5,7-11,13,28,36-39H,6,12,14-27H2,1H3/t36-,37-,38+,39+,42+/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H14N2O2/c1-3-14-10-5-4-8(6-9(10)11)12-7(2)13/h4-6H,3,11H2,1-2H3,(H,12,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C22H19Br2NO3/c1-22(2)17(12-19(23)24)20(22)21(26)28-18(13-25)14-7-6-10-16(11-14)27-15-8-4-3-5-9-15/h3-12,17-18,20H,1-2H3/t17-,18+,20-/m0/s1",1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H8N2O3/c8-5(9)4-2-1-3-7(4)6-10/h4H,1-3H2,(H,8,9)/t4-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/C12H4Br6/c13-7-2-1-6(10(16)12(7)18)5-3-8(14)11(17)9(15)4-5/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H12O5/c1-17-7-5-10(18-2)13-8-3-4-9(15)12(8)14(16)19-11(13)6-7/h5-6H,3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H5NO/c1-2-3-4/h2,4H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6ClN/c7-5-1-3-6(8)4-2-5/h1-4H,8H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/3ClH.Fe/h3*1H;/q;;;+3/p-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H14N2O2/c1-2-9(10(14)13-11(12)15)8-6-4-3-5-7-8/h3-7,9H,2H2,1H3,(H3,12,13,14,15)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C40H62O19/c1-18(2)33(43)50-16-27-29(54-35(45)20(5)6)32(57-38(48)23(11)12)40(58-27,17-51-25(14)42)59-39-31(56-37(47)22(9)10)30(55-36(46)21(7)8)28(53-34(44)19(3)4)26(52-39)15-49-24(13)41/h18-23,26-32,39H,15-17H2,1-14H3/t26-,27-,28-,29-,30+,31-,32+,39-,40+/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C24H40O3/c1-15(4-9-22(26)27)19-7-8-20-18-6-5-16-14-17(25)10-12-23(16,2)21(18)11-13-24(19,20)3/h15-21,25H,4-14H2,1-3H3,(H,26,27)/t15-,16-,17-,18+,19-,20+,21+,23+,24-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H7ClO2/c4-1-3(6)2-5/h3,5-6H,1-2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H9NO3/c1-6(2)4(8)7(3)5(9)10-6/h1-3H3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H25ClN2O2.C4H4O4/c1-19(2)10-11-6-12(20)7-16(17(11)24-19)18(23)21-13-8-14-4-5-15(9-13)22(14)3;5-3(6)1-2-4(7)8/h6-7,13-15H,4-5,8-10H2,1-3H3,(H,21,23);1-2H,(H,5,6)(H,7,8)/b;2-1-",0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H7NO2S.ClH/c4-2(1-7)3(5)6;/h2,7H,1,4H2,(H,5,6);1H/t2-;/m0./s1",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H31NO/c1-4-5-6-7-8-9-10-11-12-13-14-15(2,3)16/h4-14H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H22N4O5.CH4O3S/c1-24(2)17(25)12-28-18(26)11-13-3-9-16(10-4-13)29-19(27)14-5-7-15(8-6-14)23-20(21)22;1-5(2,3)4/h3-10H,11-12H2,1-2H3,(H4,21,22,23);1H3,(H,2,3,4)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C33H47NO13/c1-18-10-8-6-4-3-5-7-9-11-21(45-32-30(39)28(34)29(38)19(2)44-32)15-25-27(31(40)41)22(36)17-33(42,47-25)16-20(35)14-24-23(46-24)12-13-26(37)43-18/h3-9,11-13,18-25,27-30,32,35-36,38-39,42H,10,14-17,34H2,1-2H3,(H,40,41)/b4-3+,7-5+,8-6+,11-9+,13-12+/t18-,19-,20+,21+,22+,23-,24-,25+,27-,28+,29-,30+,32+,33-/m1/s1",0,0,0,1,1,1,1,0,0,0,1,1,1,0,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C38H60O18/c1-16-11-37-9-5-20-35(2,7-4-8-36(20,3)34(50)55-32-29(49)26(46)23(43)18(13-40)52-32)21(37)6-10-38(16,15-37)56-33-30(27(47)24(44)19(14-41)53-33)54-31-28(48)25(45)22(42)17(12-39)51-31/h17-33,39-49H,1,4-15H2,2-3H3/t17-,18-,19-,20+,21+,22-,23-,24-,25+,26+,27+,28-,29-,30-,31+,32+,33+,35-,36-,37-,38+/m1/s1",0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H40N4S8Te/c1-9-21(10-2)17(25)29-33(30-18(26)22(11-3)12-4,31-19(27)23(13-5)14-6)32-20(28)24(15-7)16-8/h9-16H2,1-8H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H8O2/c6-4-2-1-3-5-7/h4-5H,1-3H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H23NO3/c1-18-13-7-8-14(18)10-15(9-13)21-17(20)16(11-19)12-5-3-2-4-6-12/h2-6,13-16,19H,7-11H2,1H3/t13-,14-,16?/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H34O7/c1-2-3-4-5-6-7-8-9-10-11-12-15(22)14-26-19-17(24)20(25)27-18(19)16(23)13-21/h16,18,21,23-24H,2-14H2,1H3/t16-,18+/m0/s1",0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H14N2O4S.Na/c23-18-12-10-13-5-1-3-7-15(13)19(18)22-21-17-11-9-14-6-2-4-8-16(14)20(17)27(24,25)26;/h1-12,23H,(H,24,25,26);/q;+1/p-1/b22-21+;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C2HCl3O2/c3-2(4,5)1(6)7/h(H,6,7)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H14N2O6S2.2Na/c15-11-5-3-9(13(7-11)23(17,18)19)1-2-10-4-6-12(16)8-14(10)24(20,21)22;;/h1-8H,15-16H2,(H,17,18,19)(H,20,21,22);;/q;2*+1/p-2/b2-1+;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +InChI=1S/C2H2F2/c1-2(3)4/h1H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H5NO/c1-2-3-4-5/h2-3,5H,1H2/b4-3+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H7NO4.Na/c6-3(7)1-5-2-4(8)9;/h5H,1-2H2,(H,6,7)(H,8,9);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H11ClN2O5S/c13-9-5-10(15-6-7-2-1-3-20-7)8(12(16)17)4-11(9)21(14,18)19/h1-5,15H,6H2,(H,16,17)(H2,14,18,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,1,0,0,1,1,1,0,0,0,0,1,1,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C10H16O/c1-9(2)5-4-6-10(3)7-8-11/h5,7-8H,4,6H2,1-3H3",0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H20Cl2/c1-3-13-5-9-15(10-6-13)17(18(19)20)16-11-7-14(4-2)8-12-16/h5-12,17-18H,3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/CCl3F/c2-1(3,4)5",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H6N2O2/c1-6-2(5)4-3/h3H2,1H3,(H,4,5)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C4H7N3O3/c1-3(8)2-7(6-10)4(5)9/h2H2,1H3,(H2,5,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C6H13N5O3/c1-2-3-4-5-10(9-12)6(7)8-11(13)14/h2-5H2,1H3,(H2,7,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C4H7NO2/c1-2-4(7)5-3-6/h2,6H,1,3H2,(H,5,7)",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/CH5N3S/c2-1(5)4-3/h3H2,(H3,2,4,5)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C10H12ClNO2/c1-7(2)14-10(13)12-9-5-3-4-8(11)6-9/h3-7H,1-2H3,(H,12,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C63H88N12O16/c1-17-31(8)44-61(86)75-25-19-21-38(75)59(84)71(14)27-40(77)73(16)50(30(6)7)63(88)90-35(12)46(57(82)67-44)69-55(80)41-42(64)51(78)33(10)53-48(41)65-47-36(23-22-32(9)52(47)91-53)54(79)68-45-34(11)89-62(87)49(29(4)5)72(15)39(76)26-70(13)58(83)37-20-18-24-74(37)60(85)43(28(2)3)66-56(45)81/h22-23,28-31,34-35,37-38,43-46,49-50H,17-21,24-27,64H2,1-16H3,(H,66,81)(H,67,82)(H,68,79)(H,69,80)/t31-,34+,35+,37-,38-,43+,44+,45-,46-,49-,50-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H14N2O2/c1-3-5(4-2)6(10)9-7(8)11/h5H,3-4H2,1-2H3,(H3,8,9,10,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H11F3N2O/c1-15(2)9(16)14-8-5-3-4-7(6-8)10(11,12)13/h3-6H,1-2H3,(H,14,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H14O6/c7-1-3(9)5(11)6(12)4(10)2-8/h3-12H,1-2H2/t3-,4-,5-,6-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H17N3O.ClH/c1-20-9-13(12-4-2-3-5-16(12)20)17(21)11-6-7-14-15(8-11)19-10-18-14;/h2-5,9-11H,6-8H2,1H3,(H,18,19);1H/t11-;/m1./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/CHBr2Cl/c2-1(3)4/h1H,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C8H4O3/c9-7-5-3-1-2-4-6(5)8(10)11-7/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H8Cl8/c1-4-7(2-11,3-12)9(16)6(14)5(13)8(4,15)10(9,17)18/h5-6H,1-3H2",0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H7NS/c10-7-9-6-8-4-2-1-3-5-8/h1-5H,6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C36H60O2/c1-7-8-9-10-11-12-13-14-15-16-17-18-19-25-35(37)38-30-28-32(3)23-20-22-31(2)26-27-34-33(4)24-21-29-36(34,5)6/h20,22-23,26-28H,7-19,21,24-25,29-30H2,1-6H3",0,0,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/CH2O3.Na/c2-1(3)4;/h(H2,2,3,4);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H12N4/c1-7-2-9-4-8(1)5-10(3-7)6-9/h1-6H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H21NO3/c1-3-11-6-5-7-12-13-8-9-21-17(4-2,10-14(19)20)16(13)18-15(11)12/h5-7,18H,3-4,8-10H2,1-2H3,(H,19,20)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,1,0,0,1,0,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H13N3O4S2/c1-8-7-15-14(22-8)16-13(19)11-12(18)9-5-3-4-6-10(9)23(20,21)17(11)2/h3-7,18H,1-2H3,(H,15,16,19)",0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C12H18N2O2/c1-8-6-10(16-12(15)13-3)7-9(2)11(8)14(4)5/h6-7H,1-5H3,(H,13,15)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H10O/c7-6-4-2-1-3-5-6/h1-5H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H8N2O2.Mg.2H2O/c10-9-11-8(12)7(13-9)6-4-2-1-3-5-6;;;/h1-5,7H,(H2,10,11,12);;2*1H2/q;+2;;/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6O4.Na/c5-3(6)1-2-4(7)8;/h1-2H2,(H,5,6)(H,7,8);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H11NO/c8-6-4-2-1-3-5-7-6/h1-5H2,(H,7,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/Ni.H2O4S.6H2O/c;1-5(2,3)4;;;;;;/h;(H2,1,2,3,4);6*1H2/q+2;;;;;;;/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C8H10N4O2/c1-10-4-9-6-5(10)7(13)12(3)8(14)11(6)2/h4H,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C24H30N2O8/c1-5-25-26-24(29)21-15(10-27)22(28)14-9-17-16(33-11-34-17)8-13(14)20(21)12-6-18(30-2)23(32-4)19(7-12)31-3/h6-9,15,20-22,25,27-28H,5,10-11H2,1-4H3,(H,26,29)/t15-,20+,21-,22-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C17H14ClFN2O3/c18-10-5-6-14-12(9-10)15(11-3-1-2-4-13(11)19)20-16(23)17(24)21(14)7-8-22/h1-6,9,16,22-23H,7-8H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C29H50O2/c1-20(2)12-9-13-21(3)14-10-15-22(4)16-11-18-29(8)19-17-26-25(7)27(30)23(5)24(6)28(26)31-29/h20-22,30H,9-19H2,1-8H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C62H111N11O12/c1-25-27-28-40(15)52(75)51-56(79)65-43(26-2)58(81)67(18)33-48(74)68(19)44(29-34(3)4)55(78)66-49(38(11)12)61(84)69(20)45(30-35(5)6)54(77)63-41(16)53(76)64-42(17)57(80)70(21)46(31-36(7)8)59(82)71(22)47(32-37(9)10)60(83)72(23)50(39(13)14)62(85)73(51)24/h25,27,34-47,49-52,75H,26,28-33H2,1-24H3,(H,63,77)(H,64,76)(H,65,79)(H,66,78)/b27-25+/t40-,41+,42-,43+,44+,45+,46+,47+,49+,50+,51+,52-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,1,1,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H17N3O2S/c20-9-7-19(8-10-21)16-12-4-1-2-5-13(12)17-15(18-16)14-6-3-11-22-14/h1-6,11,20-21H,7-10H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H3FN2O2/c5-2-1-6-4(9)7-3(2)8/h1H,(H2,6,7,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C14H8Cl4/c15-11-5-1-9(2-6-11)13(14(17)18)10-3-7-12(16)8-4-10/h1-8H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/CH3.ClH.Hg/h1H3;1H;/q;;+1/p-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C2H2Cl4/c3-1(4)2(5)6/h1-2H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H14O3/c1-3-14-11(13)10-12(2,15-10)9-7-5-4-6-8-9/h4-8,10H,3H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C9H8O/c10-8-4-7-9-5-2-1-3-6-9/h1-8H/b7-4+,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H20F6N2O3.C2H4O2/c18-16(19,20)9-27-12-4-5-14(28-10-17(21,22)23)13(7-12)15(26)25-8-11-3-1-2-6-24-11;1-2(3)4/h4-5,7,11,24H,1-3,6,8-10H2,(H,25,26);1H3,(H,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H14O4/c1-16-8-6-11(17-2)13-9-4-3-5-10(9)14(15)18-12(13)7-8/h6-7H,3-5H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H22O8/c1-7-4-9-16(5-18,12(22)10(7)20)15(3)13(24-8(2)19)11(21)14(25-9)17(15)6-23-17/h4,9,11-14,18,21-22H,5-6H2,1-3H3/t9?,11-,12?,13+,14?,15-,16-,17+/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H4N2O2/c7-3-1-2-4(8)6-5-3/h1-2H,(H,5,7)(H,6,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H8Cl6O/c13-8-9(14)11(16)5-3-1-2(6-7(3)19-6)4(5)10(8,15)12(11,17)18/h2-7H,1H2",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H6Cl6O3S/c10-5-6(11)8(13)4-2-18-19(16)17-1-3(4)7(5,12)9(8,14)15/h3-4H,1-2H2",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 +"InChI=1S/C24H36O5/c1-5-15(3)24(27)29-21-11-14(2)10-17-7-6-16(4)20(23(17)21)9-8-19-12-18(25)13-22(26)28-19/h6-7,10,14-16,18-21,23,25H,5,8-9,11-13H2,1-4H3/t14-,15-,16-,18+,19+,20-,21-,23-/m0/s1",0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1,1,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H12N2O3/c1-2-12(8-6-4-3-5-7-8)9(15)13-11(17)14-10(12)16/h3-7H,2H2,1H3,(H2,13,14,15,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C43H58N4O12/c1-21-12-11-13-22(2)42(55)45-33-28(20-44-47-17-15-46(9)16-18-47)37(52)30-31(38(33)53)36(51)26(6)40-32(30)41(54)43(8,59-40)57-19-14-29(56-10)23(3)39(58-27(7)48)25(5)35(50)24(4)34(21)49/h11-14,19-21,23-25,29,34-35,39,49-53H,15-18H2,1-10H3,(H,45,55)/b12-11+,19-14+,22-13-,44-20+/t21-,23+,24+,25+,29-,34-,35+,39+,43-/m0/s1",0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C7H10N2O3/c1-12-7(10)6-3-2-4-9(5-6)8-11/h3H,2,4-5H2,1H3",0,0,0,0,0,1,1,0,0,1,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C15H12N2O2/c18-13-15(17-14(19)16-13,11-7-3-1-4-8-11)12-9-5-2-6-10-12/h1-10H,(H2,16,17,18,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H9NO7/c1-5(11)15-9(16-6(2)12)7-3-4-8(17-7)10(13)14/h3-4,9H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C21H30O2/c1-5-6-7-8-15-12-18(22)20-16-11-14(2)9-10-17(16)21(3,4)23-19(20)13-15/h11-13,16-17,22H,5-10H2,1-4H3/t16-,17-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C10H13NO4.3H2O/c2*1-10(11,9(14)15)5-6-2-3-7(12)8(13)4-6;;;/h2*2-4,12-13H,5,11H2,1H3,(H,14,15);3*1H2/t2*10-;;;/m00.../s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H18O4/c1-21-17-13-15(7-9-16(17)19)8-10-18(20)22-12-11-14-5-3-2-4-6-14/h2-10,13,19H,11-12H2,1H3/b10-8+",0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H6O8/c15-5-1-3-7-8-4(14(20)22-11(7)9(5)17)2-6(16)10(18)12(8)21-13(3)19/h1-2,15-18H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C24H35NO3.ClH.H2O/c1-5-25(6-2)19-13-18-23(3,4)28-22(26)24(27,20-14-9-7-10-15-20)21-16-11-8-12-17-21;;/h7,9-10,14-15,21,27H,5-6,8,11-12,16-17,19H2,1-4H3;1H;1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H18O/c1-3-5-6-8(4-2)7-9/h8-9H,3-7H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H17ClO3/c1-17(2,16(19)20)21-11-12-3-5-13(6-4-12)14-7-9-15(18)10-8-14/h3-10H,11H2,1-2H3,(H,19,20)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H15NO3/c8-4-1-7(2-5-9)3-6-10/h8-10H,1-6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8O/c8-6-7-4-2-1-3-5-7/h1-5,8H,6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H8O3/c4-1-3(6)2-5/h3-6H,1-2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C14H10O4/c15-13(11-7-3-1-4-8-11)17-18-14(16)12-9-5-2-6-10-12/h1-10H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6O2/c1-3(5-1)4-2-6-4/h3-4H,1-2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H17NS/c15-12-14-11-7-2-1-4-8-13-9-5-3-6-10-13/h3,5-6,9-10H,1-2,4,7-8,11H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C22H29FO5/c1-12-8-16-15-5-4-13-9-14(25)6-7-19(13,2)21(15,23)17(26)10-20(16,3)22(12,28)18(27)11-24/h6-7,9,12,15-17,24,26,28H,4-5,8,10-11H2,1-3H3/t12-,15+,16+,17+,19+,20+,21+,22+/m1/s1",0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H24N2O2/c22-18-13-20(19(23)15-7-2-1-3-8-15)12-17-16-9-5-4-6-14(16)10-11-21(17)18/h4-6,9,15,17H,1-3,7-8,10-13H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H7N3O3/c1-9(8-11)6-2-4-7(5-3-6)10(12)13/h2-5H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C19H22N2.ClH.H2O/c1-16-7-9-17(10-8-16)18(19-6-2-3-12-20-19)11-15-21-13-4-5-14-21;;/h2-3,6-12H,4-5,13-15H2,1H3;1H;1H2/b18-11+;;",0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H11N3O3S.Na/c1-11(2)8-5-3-7(4-6-8)9-10-15(12,13)14;/h3-6H,1-2H3,(H,12,13,14);/q;+1/p-1/b10-9+;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0 +"InChI=1S/C10H14O/c1-10(2,3)8-4-6-9(11)7-5-8/h4-7,11H,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H4O/c1-2-3-4/h2-3H,1H2",0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H4INO/c3-1-2(4)5/h1H2,(H2,4,5)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H18O2/c1-2-3-4-5-6-10-7-8-11(13)9-12(10)14/h7-9,13-14H,2-6H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C23H41Cl7/c1-3-4-18(25)7-8-20(27)11-12-22(29)15-16-23(30)14-13-21(28)10-9-19(26)6-5-17(2)24/h17-23H,3-16H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H4O2/c1-2-3(4)5/h2H,1H2,(H,4,5)",0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H11NO4/c10-6(9(13)14)3-5-1-2-7(11)8(12)4-5/h1-2,4,6,11-12H,3,10H2,(H,13,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H8N2O3/c1-6(2)3(9)7-5(11)8-4(6)10/h1-2H3,(H2,7,8,9,10,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H6Cl4/c13-9-1-7(2-10(14)5-9)8-3-11(15)6-12(16)4-8/h1-6H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/N3.Na/c1-3-2;/q-1;+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0 +"InChI=1S/C4H7NO4.Na/c5-2(4(8)9)1-3(6)7;/h2H,1,5H2,(H,6,7)(H,8,9);/q;+1/p-1/t2-;/m0./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H7NO/c11-8-5-1-3-7-4-2-6-10-9(7)8/h1-6,11H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/FH.Na/h1H;/q;+1/p-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H10O6/c16-8-3-1-7(2-4-8)15-14(20)13(19)12-10(18)5-9(17)6-11(12)21-15/h1-6,16-18,20H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C29H35N2O7S2.Na/c1-7-30(8-2)24-16-26-22(13-18(24)5)29(21-12-11-20(39(32,33)34)15-28(21)40(35,36)37)23-14-19(6)25(17-27(23)38-26)31(9-3)10-4;/h11-17H,7-10H2,1-6H3,(H,32,33,34)(H,35,36,37);/q2*+1/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C8H11NO2.ClH/c9-4-3-6-1-2-7(10)8(11)5-6;/h1-2,5,10-11H,3-4,9H2;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H6N2S3/c1-5-7(12-13-8(5)11)6-4-9-2-3-10-6/h2-4H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H18N2O2/c1-11(2)20-16-9-12(3)7-8-15(16)17(19-18(20)22)13-5-4-6-14(21)10-13/h4-11,21H,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H18F3NO.ClH/c1-21-12-11-16(13-5-3-2-4-6-13)22-15-9-7-14(8-10-15)17(18,19)20;/h2-10,16,21H,11-12H2,1H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H12O4/c1-3-11-7(9)5-6-8(10)12-4-2/h5-6H,3-4H2,1-2H3/b6-5-",0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H10/c1-3-9-6-4-5-8(2)7-9/h3-7H,1H2,2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H4N4S/c10-5-3-4(7-1-6-3)8-2-9-5/h1-2H,(H2,6,7,8,9,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C21H20O6/c1-26-20-11-14(5-9-18(20)24)3-7-16(22)13-17(23)8-4-15-6-10-19(25)21(12-15)27-2/h3-12,24-25H,13H2,1-2H3/b7-3+,8-4+",0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C41H42N4O6.2ClH/c1-28-36(40(46)50-3)38(33-15-10-16-35(27-33)45(48)49)37(29(2)42-28)41(47)51-26-21-30-17-19-34(20-18-30)43-22-24-44(25-23-43)39(31-11-6-4-7-12-31)32-13-8-5-9-14-32;;/h4-20,27,38-39,42H,21-26H2,1-3H3;2*1H",0,0,1,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H24N2S/c16-13(14-11-7-3-1-4-8-11)15-12-9-5-2-6-10-12/h11-12H,1-10H2,(H2,14,15,16)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C8Cl8/c9-2-1(4(11)8(15)16)3(10)6(13)7(14)5(2)12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H6O3S2.Na/c3-7(4,5)2-1-6;/h6H,1-2H2,(H,3,4,5);/q;+1/p-1",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/6C4H9.O.2Sn/c6*1-3-4-2;;;/h6*1,3-4H2,2H3;;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/3C2H4O2.Cr/c3*1-2(3)4;/h3*1H3,(H,3,4);/q;;;+3/p-3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H26O6P2S4/c1-5-15-19(21,16-6-2)23-11-12(14-10-9-13-11)24-20(22,17-7-3)18-8-4/h11-12H,5-10H2,1-4H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +"InChI=1S/C10H11NO3/c1-7(12)11-9-4-2-8(3-5-9)6-10(13)14/h2-5H,6H2,1H3,(H,11,12)(H,13,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H19N3S/c1-16(2)8-9-17(11-13-6-10-18-12-13)14-5-3-4-7-15-14/h3-7,10,12H,8-9,11H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H12NO3PS2/c1-6-5(7)4-12-10(11,8-2)9-3/h4H2,1-3H3,(H,6,7)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +"InChI=1S/C9H11Cl3NO3PS/c1-3-14-17(18,15-4-2)16-9-7(11)5-6(10)8(12)13-9/h5H,3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +"InChI=1S/C10H10N2O/c1-8-7-10(13)12(11-8)9-5-3-2-4-6-9/h2-6H,7H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +InChI=1S/ClH.Na/h1H;/q;+1/p-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H14NO5PS/c1-3-14-17(18,15-4-2)16-10-7-5-9(6-8-10)11(12)13/h5-8H,3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +InChI=1S/ClH.K/h1H;/q;+1/p-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C40H56/c1-31(19-13-21-33(3)25-27-37-35(5)23-15-29-39(37,7)8)17-11-12-18-32(2)20-14-22-34(4)26-28-38-36(6)24-16-30-40(38,9)10/h11-14,17-22,25-28H,15-16,23-24,29-30H2,1-10H3/b12-11+,19-13+,20-14+,27-25+,28-26+,31-17+,32-18+,33-21+,34-22+",0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H12O4P.ClH/c5-1-9(2-6,3-7)4-8;/h5-8H,1-4H2;1H/q+1;/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/H3P/h1H3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/Ba.2ClH.2H2O/h;2*1H;2*1H2/q+2;;;;/p-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/CH5AsO3/c1-2(3,4)5/h1H3,(H2,3,4,5)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H12Cl2O/c1-5(3-7)9-6(2)4-8/h5-6H,3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H14N2O5/c13-4-3-11-9-2-1-8(12(15)16)7-10(9)17-6-5-14/h1-2,7,11,13-14H,3-6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H32O3/c1-2-3-4-5-6-7-8-9-18-10-12-19(13-11-18)22-17-16-21-15-14-20/h10-13,20H,2-9,14-17H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C35H38N4O6.2ClH/c1-24-30(34(40)44-3)32(28-15-10-16-29(23-28)39(42)43)31(25(2)36-24)35(41)45-22-21-37-17-19-38(20-18-37)33(26-11-6-4-7-12-26)27-13-8-5-9-14-27;;/h4-16,23,32-33,36H,17-22H2,1-3H3;2*1H",0,0,1,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H8N2S/c1-4-3(6)5-2/h1-2H3,(H2,4,5,6)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/CN2.Ca/c2-1-3;/q-2;+2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H12N2S4/c1-7(2)5(9)11-12-6(10)8(3)4/h1-4H3,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H20N2S4/c1-5-11(6-2)9(13)15-16-10(14)12(7-3)8-4/h5-8H2,1-4H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H19NO4S/c1-3-9-14(10-4-2)19(17,18)12-7-5-11(6-8-12)13(15)16/h5-8H,3-4,9-10H2,1-2H3,(H,15,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +InChI=1S/Cd.2ClH.H2O/h;2*1H;1H2/q+2;;;/p-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C28H30N2O3.ClH/c1-6-29-23-15-25-21(13-17(23)4)27(19-11-9-10-12-20(19)28(31)32-8-3)22-14-18(5)24(30-7-2)16-26(22)33-25;/h9-16,29H,6-8H2,1-5H3;1H/b30-24-;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/3Cd.3H2O4S.8H2O/c;;;3*1-5(2,3)4;;;;;;;;/h;;;3*(H2,1,2,3,4);8*1H2/q3*+2;;;;;;;;;;;/p-6",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C8H9FN2O3/c9-5-4-11(6-2-1-3-14-6)8(13)10-7(5)12/h4,6H,1-3H2,(H,10,12,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C30H46O4/c1-25(2)21-8-11-30(7)23(28(21,5)10-9-22(25)32)20(31)16-18-19-17-27(4,24(33)34)13-12-26(19,3)14-15-29(18,30)6/h16,19,21-23,32H,8-15,17H2,1-7H3,(H,33,34)/t19-,21-,22-,23+,26+,27-,28-,29+,30+/m0/s1",0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C22H30O2S/c1-13-9-17(23)15(21(3,4)5)11-19(13)25-20-12-16(22(6,7)8)18(24)10-14(20)2/h9-12,23-24H,1-8H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H3N3O6/c10-7(11)4-1-5(8(12)13)3-6(2-4)9(14)15/h1-3H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H17N/c1-2-3-4-5-6-7-8/h2-8H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H15NO2/c1-5(8)3-7-4-6(2)9/h5-9H,3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H30O3S.Na/c1-3-4-5-6-7-8-9-10-11-16(2)17-12-14-18(15-13-17)22(19,20)21;/h12-16H,3-11H2,1-2H3,(H,19,20,21);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C4H9Cl/c1-2-3-4-5/h2-4H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H8O2/c1-2-6-10-9(5-1)13-11-7-3-4-8-12(11)14-10/h1-8H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H27NO/c1-4-5-6-7-8-9-10-11-12-13(2,3)14/h4-12H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H5NO4/c5-3(6)1-2-4(7)8/h1-2H2,(H,5,6)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C4H9.2C2H4O2.Sn/c2*1-3-4-2;2*1-2(3)4;/h2*1,3-4H2,2H3;2*1H3,(H,3,4);/q;;;;+2/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H19NO2/c20-18(21)12-6-2-5-11-17(15-8-3-1-4-9-15)16-10-7-13-19-14-16/h1,3-4,7-11,13-14H,2,5-6,12H2,(H,20,21)/b17-11+",0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C24H26N2O6/c1-2-3-16-24(17-32-21(29)15-14-20(27)28)22(30)25(18-10-6-4-7-11-18)26(23(24)31)19-12-8-5-9-13-19/h4-13H,2-3,14-17H2,1H3,(H,27,28)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C7H6O2/c8-7(9)6-4-2-1-3-5-6/h1-5H,(H,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H10Cl2N2O2/c16-10-6-5-9(12(17)7-10)8-19-13-4-2-1-3-11(13)14(18-19)15(20)21/h1-7H,8H2,(H,20,21)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C7H5NO3S.Ca/c2*9-7-5-3-1-2-4-6(5)12(10,11)8-7;/h2*1-4H,(H,8,9);/q;;+2/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C17H23N7O5.4H2O/c1-23-13(25)6-10(22-17(23)29)15(27)21-11(5-9-7-19-8-20-9)16(28)24-4-2-3-12(24)14(18)26;;;;/h7-8,10-12H,2-6H2,1H3,(H2,18,26)(H,19,20)(H,21,27)(H,22,29);4*1H2/t10-,11-,12-;;;;/m0..../s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,1,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H11NO/c13-11-7-6-10(8-12(11)14)9-4-2-1-3-5-9/h1-8,14H,13H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H23NO2.C4H4O4/c1-4-20-16(19)17(14-10-6-5-7-11-14)13-9-8-12-15(17)18(2)3;5-3(6)1-2-4(7)8/h5-8,10-12,15H,4,9,13H2,1-3H3;1-2H,(H,5,6)(H,7,8)/b;2-1+/t15-,17+;/m1./s1",0,0,0,0,0,1,1,0,0,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H13ClN2O3S/c1-2-7-12-10(14)13-17(15,16)9-5-3-8(11)4-6-9/h3-6H,2,7H2,1H3,(H2,12,13,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C5H5N3O/c6-5(9)4-3-7-1-2-8-4/h1-3H,(H2,6,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C9H6N2O2/c12-11(13)8-3-4-9-7(6-8)2-1-5-10-9/h1-6H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H21N3O3S/c1-12-6-8-13(9-7-12)21(19,20)16-14(18)15-17-10-4-2-3-5-11-17/h6-9H,2-5,10-11H2,1H3,(H2,15,16,18)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,1,0 +"InChI=1S/C15H20N2O4S/c1-11(18)12-7-9-14(10-8-12)22(20,21)17-15(19)16-13-5-3-2-4-6-13/h7-10,13H,2-6H2,1H3,(H2,16,17,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C2H5Cl/c1-2-3/h2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H18N2O3S/c1-3-4-9-13-12(15)14-18(16,17)11-7-5-10(2)6-8-11/h5-8H,3-4,9H2,1-2H3,(H2,13,14,15)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C28H29ClN4S/c1-17(2)15-21-11-9-20(10-12-21)13-14-22-16-24-26(23-7-5-6-8-25(23)29)30-18(3)27-32-31-19(4)33(27)28(24)34-22/h5-12,16-18H,13-15H2,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C33H34N4O6/c1-20(2)42-32(38)27-21(3)35-31(34)29(28(27)24-15-10-16-25(17-24)37(40)41)33(39)43-26-18-36(19-26)30(22-11-6-4-7-12-22)23-13-8-5-9-14-23/h4-17,20,26,28,30,35H,18-19,34H2,1-3H3",0,0,1,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H21NO7/c12-2-5(3-13)11-6-1-10(18,4-14)9(17)8(16)7(6)15/h5-9,11-18H,1-4H2/t6-,7-,8+,9-,10-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8ClN3O4S2/c8-4-1-5-7(2-6(4)16(9,12)13)17(14,15)11-3-10-5/h1-2,10-11H,3H2,(H2,9,12,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0 +InChI=1S/NO2/c2-1-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H3ClN2O4/c7-5-2-1-4(8(10)11)3-6(5)9(12)13/h1-3H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C8H7NO2/c10-9(11)7-6-8-4-2-1-3-5-8/h1-7H/b7-6+,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H12N2O/c1-2-3-4-7-5(6)8/h2-4H2,1H3,(H3,6,7,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H7NS/c9-7-10-6-8-4-2-1-3-5-8/h1-5H,6H2",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C9H13N.H2O4S/c2*1-8(10)7-9-5-3-2-4-6-9;1-5(2,3)4/h2*2-6,8H,7,10H2,1H3;(H2,1,2,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C6H14O2/c1-2-3-5-8-6-4-7/h7H,2-6H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H13N3O4S/c1-18-13(15(20)17-12-8-4-5-9-16-12)14(19)10-6-2-3-7-11(10)23(18,21)22/h2-9,19H,1H3,(H,16,17,20)",0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C6H6O/c7-6-4-2-1-3-5-6/h1-5,7H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H7N3O/c1-9(8-10)6-3-2-4-7-5-6/h2-5H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C10H12O2/c1-4-3-2-6-10(11-6)7(3)5(1)9-8(4)12-9/h3-10H,1-2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H11N/c1-6-4-3-5-7(2)8(6)9/h3-5H,9H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H34O2/c1-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19(20)21-2/h7-8,10-11H,3-6,9,12-18H2,1-2H3/b8-7-,11-10-",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H11N.ClH/c13-12-9-5-4-8-11(12)10-6-2-1-3-7-10;/h1-9H,13H2;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H6/c1-3-2/h3H,1H2,2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H8O6/c7-1-2(8)5-3(9)4(10)6(11)12-5/h2,5,7-10H,1H2/t2-,5+/m0/s1",0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C4H12O4P.H2O4S/c2*5-1-9(2-6,3-7)4-8;1-5(2,3)4/h2*5-8H,1-4H2;(H2,1,2,3,4)/q2*+1;/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C10H7N3S/c1-2-4-8-7(3-1)12-10(13-8)9-5-14-6-11-9/h1-6H,(H,12,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H11NS2.Na.3H2O/c1-3-6(4-2)5(7)8;;;;/h3-4H2,1-2H3,(H,7,8);;3*1H2/q;+1;;;/p-1",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H30O/c1-16(2,3)12-10-13(17(4,5)6)15(19)14(11-12)18(7,8)9/h10-11,19H,1-9H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H24O2/c1-14(2,3)11-7-10(9-16)8-12(13(11)17)15(4,5)6/h7-8,16-17H,9H2,1-6H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C23H32O2/c1-14-9-16(20(24)18(11-14)22(3,4)5)13-17-10-15(2)12-19(21(17)25)23(6,7)8/h9-12,24-25H,13H2,1-8H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H9N/c1-8-4-5-10-9(7-8)3-2-6-11-10/h2-7H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H4O2/c4-1-3-2-5-3/h1,3H,2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H6Cl6O2/c14-6-2-8(16)12(20)4(10(6)18)1-5-11(19)7(15)3-9(17)13(5)21/h2-3,20-21H,1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H11ClO/c14-12-6-7-13(15)11(9-12)8-10-4-2-1-3-5-10/h1-7,9,15H,8H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C3H6N2OS2/c6-4-5-1-7-3-8-2-5/h1-3H2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C3H8O/c1-3(2)4/h3-4H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H12N2.ClH/c13-10-6-8-12(9-7-10)14-11-4-2-1-3-5-11;/h1-9,14H,13H2;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H9NO2/c1-2-3-4-5(6)7/h2-4H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H7O6.Na/c7-1-2(8)5-3(9)4(10)6(11)12-5;/h2,5,8-10H,1H2;/q-1;+1/t2-,5+;/m1./s1",0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C24H12O2/c25-23-17-7-3-1-5-13(17)15-9-11-20-22-16(10-12-19(23)21(15)22)14-6-2-4-8-18(14)24(20)26/h1-12H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H3ClO2/c3-1-2(4)5/h1H2,(H,4,5)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H13NO2/c7-5-3-1-2-4-6(8)9/h1-5,7H2,(H,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H4Cl2/c1-2(3)4/h2H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H34O4/c1-3-4-12-15-18(23-21)16-13-10-8-6-5-7-9-11-14-17-19(20)22-2/h8,10,13,16,18,21H,3-7,9,11-12,14-15,17H2,1-2H3/b10-8-,16-13+",0,0,0,1,1,0,0,0,0,0,1,1,1,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H9N/c1-8-4-2-5-9-6-3-7-11-10(8)9/h2-7H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H12N2O2/c12-9(11(14)15)5-7-6-13-10-4-2-1-3-8(7)10/h1-4,6,9,13H,5,12H2,(H,14,15)/t9-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H11NS/c12-9-11-8-4-7-10-5-2-1-3-6-10/h1-3,5-6H,4,7-8H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H21NO2.ClH/c1-12(2)17-10-14(18)11-19-16-9-5-7-13-6-3-4-8-15(13)16;/h3-9,12,14,17-18H,10-11H2,1-2H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H16O2/c1-6(8)5-9-7(2,3)4/h6,8H,5H2,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C24H17N5O7/c1-36-21-10-9-17(29(34)35)13-20(21)26-27-22-18-8-3-2-5-14(18)11-19(23(22)30)24(31)25-15-6-4-7-16(12-15)28(32)33/h2-13,30H,1H3,(H,25,31)/b27-26+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C6H14/c1-3-5-6-4-2/h3-6H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H14Cl2O3/c1-2-21-15(19)16(20,11-3-7-13(17)8-4-11)12-5-9-14(18)10-6-12/h3-10,20H,2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H20O/c1-7(2)9-5-4-8(3)6-10(9)11/h7-11H,4-6H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H8O7/c7-3(8)1-6(13,5(11)12)2-4(9)10/h13H,1-2H2,(H,7,8)(H,9,10)(H,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H8N4O12/c10-6(11)18-1-5(2-19-7(12)13,3-20-8(14)15)4-21-9(16)17/h1-4H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +InChI=1S/ClO.Na/c1-2;/q-1;+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H6Cl2/c1-3(5)2-4/h3H,2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H10N2O/c1-6-2-4-7(5-3-6)10-8(9)11/h2-5H,1H3,(H3,9,10,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H12O2/c15-13(11-7-3-1-4-8-11)14(16)12-9-5-2-6-10-12/h1-10,13,15H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H12N2O2/c7-5(9)3-1-2-4-6(8)10/h1-4H2,(H2,7,9)(H2,8,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C34H28Cl4N6O4/c1-17-13-21(5-9-27(17)39-33(47)31(19(3)45)43-41-29-11-7-23(35)15-25(29)37)22-6-10-28(18(2)14-22)40-34(48)32(20(4)46)44-42-30-12-8-24(36)16-26(30)38/h5-16,31-32H,1-4H3,(H,39,47)(H,40,48)/b43-41+,44-42+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C2H3Cl3/c1-2(3,4)5/h1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H13NO/c1-2-3-4-5-6(7)8/h2-5H2,1H3,(H2,7,8)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H15N7OS/c1-8-9(15-7-14-8)5-19-4-3-12-10(13-6-11)17(2)16-18/h7H,3-5H2,1-2H3,(H,12,13)(H,14,15)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C2H5N3OS/c3-2(7)5-4-1-6/h1H,(H,4,6)(H3,3,5,7)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C7H8N2S/c8-7(10)9-6-4-2-1-3-5-6/h1-5H,(H3,8,9,10)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C46H58N4O9/c1-8-42(54)23-28-24-45(40(52)57-6,36-30(15-19-49(25-28)26-42)29-13-10-11-14-33(29)47-36)32-21-31-34(22-35(32)56-5)48(4)38-44(31)17-20-50-18-12-16-43(9-2,37(44)50)39(59-27(3)51)46(38,55)41(53)58-7/h10-14,16,21-22,28,37-39,47,54-55H,8-9,15,17-20,23-26H2,1-7H3/t28-,37+,38-,39-,42+,43-,44-,45+,46+/m1/s1",0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,1,0,0,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H6N4S2/c3-1(7)5-6-2(4)8/h(H3,3,5,7)(H3,4,6,8)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C24H30N4O.C4H4O4/c1-3-27(4-2)17-11-16-25-23(29)19-28-24(21-14-9-6-10-15-21)22(18-26-28)20-12-7-5-8-13-20;5-3(6)1-2-4(7)8/h5-10,12-15,18H,3-4,11,16-17,19H2,1-2H3,(H,25,29);1-2H,(H,5,6)(H,7,8)/b;2-1+",0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H10N2S/c1-2-7-5-6(8(9)11)3-4-10-7/h3-5H,2H2,1H3,(H2,9,11)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C28H31FN4O/c1-34-25-12-8-21(9-13-25)14-17-32-18-15-24(16-19-32)30-28-31-26-4-2-3-5-27(26)33(28)20-22-6-10-23(29)11-7-22/h2-13,24H,14-20H2,1H3,(H,30,31)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H7N3O2/c7-6(10)9-8-4-5-2-1-3-11-5/h1-4H,(H3,7,9,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C7H6O2.Na/c8-7(9)6-4-2-1-3-5-6;/h1-5H,(H,8,9);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H12N3O3PS2/c1-15-17(18,16-2)19-7-13-10(14)8-5-3-4-6-9(8)11-12-13/h3-6H,7H2,1-2H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +"InChI=1S/C18H22O5/c1-12-6-5-9-14(19)8-4-2-3-7-13-10-15(20)11-16(21)17(13)18(22)23-12/h3,7,10-12,20-21H,2,4-6,8-9H2,1H3/b7-3-/t12-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H18N2O5S.K/c1-16(2)12(15(21)22)18-13(20)11(14(18)24-16)17-10(19)8-23-9-6-4-3-5-7-9;/h3-7,11-12,14H,8H2,1-2H3,(H,17,19)(H,21,22);/q;+1/p-1/t11-,12+,14-;/m1./s1",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H19NO/c1-5-16-11-6-7-13-12(8-11)10(2)9-14(3,4)15-13/h6-9,15H,5H2,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C22H24N2O9.ClH/c1-21(32)7-5-4-6-8(25)9(7)15(26)10-12(21)17(28)13-14(24(2)3)16(27)11(20(23)31)19(30)22(13,33)18(10)29;/h4-6,12-14,17,25,27-29,32-33H,1-3H3,(H2,23,31);1H/t12-,13-,14+,17+,21-,22+;/m1./s1",0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H4F4N2.2ClH/c7-1-2(8)5(11)4(10)6(12)3(1)9;;/h11-12H2;2*1H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H12O2/c1-3-4-8-5-6-9(11)10(7-8)12-2/h3,5-7,11H,1,4H2,2H3",0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/CHClF2/c2-1(3)4/h1H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8ClN.ClH/c1-5-4-6(8)2-3-7(5)9;/h2-4H,9H2,1H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H5NO3S/c9-7-5-3-1-2-4-6(5)12(10,11)8-7/h1-4H,(H,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C8H8N2O2/c9-7(11)5-3-1-2-4-6(5)8(10)12/h1-4H,(H2,9,11)(H2,10,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H14N2/c1-12-7-3-5-10(12)9-4-2-6-11-8-9/h2,4,6,8,10H,3,5,7H2,1H3/t10-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C10H17NOS.2ClH.H2O/c2*1-8-12-10(7-13-8)6-11-4-2-9(10)3-5-11;;;/h2*8-9H,2-7H2,1H3;2*1H;1H2/t2*8-,10-;;;/m11.../s1",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C4H9NO/c1-4(6)5(2)3/h1-3H3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H4N4/c3-1-6-2(4)5/h(H4,4,5,6)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H9O4P/c1-5-8(4,6-2)7-3/h1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H7Cl/c8-6-7-4-2-1-3-5-7/h1-5H,6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H14N2O7S2.2Na/c23-20-15-8-4-3-7-14(15)19(31(27,28)29)11-17(20)22-21-16-9-10-18(30(24,25)26)13-6-2-1-5-12(13)16;;/h1-11,23H,(H,24,25,26)(H,27,28,29);;/q;2*+1/p-2/b22-21+;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0 +InChI=1S/C4H6O2/c5-4-2-1-3-6-4/h1-3H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C26H28ClNO.C6H8O7/c1-28(2)19-20-29-24-15-13-23(14-16-24)26(22-11-7-4-8-12-22)25(17-18-27)21-9-5-3-6-10-21;7-3(8)1-6(13,5(11)12)2-4(9)10/h3-16H,17-20H2,1-2H3;13H,1-2H2,(H,7,8)(H,9,10)(H,11,12)/b26-25-;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H12O2/c1-2-6-7(10-6)3-5(1)8-4-9-8/h5-8H,1-4H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H21N2O3PS/c1-6-15-18(19,16-7-2)17-11-8-10(5)13-12(14-11)9(3)4/h8-9H,6-7H2,1-5H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +InChI=1S/C16H8Cl4N2O2/c17-9-5-13(19)15(21-7-9)23-11-1-2-12(4-3-11)24-16-14(20)6-10(18)8-22-16/h1-8H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H13N/c1-2-8-15(9-3-1)17-16-11-10-13-6-4-5-7-14(13)12-16/h1-12,17H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8ClN/c1-5-2-3-6(8)4-7(5)9/h2-4H,9H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H11N7/c13-9-7(6-4-2-1-3-5-6)16-8-10(14)18-12(15)19-11(8)17-9/h1-5H,(H6,13,14,15,17,18,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H7NO2/c8-6-4-2-1-3-5(6)7(9)10/h1-4H,8H2,(H,9,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H10ClN3O4S2/c1-17-10(13(19)16-9-4-2-3-5-15-9)11(18)12-7(23(17,20)21)6-8(14)22-12/h2-6,18H,1H3,(H,15,16,19)",0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C10H12N2O4/c1-3-16-10-5-4-8(11-7(2)13)6-9(10)12(14)15/h4-6H,3H2,1-2H3,(H,11,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C2H3N/c1-2-3/h1H3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H24O2/c1-5-6-7-8-9-17-14-10-11(2)15(16)13(4)12(14)3/h10,16H,5-9H2,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H19N3.ClH/c1-13-12-16(6-11-19(13)23)20(14-2-7-17(21)8-3-14)15-4-9-18(22)10-5-15;/h2-12,21H,22-23H2,1H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2HClF4/c3-1(4)2(5,6)7/h1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H4N2O4.Na/c8-3-1-2(4(9)10)6-5(11)7-3;/h1H,(H,9,10)(H2,6,7,8,11);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H20N2O3S.ClH/c1-9(2)13-8-12(15)10-4-6-11(7-5-10)14-18(3,16)17;/h4-7,9,12-15H,8H2,1-3H3;1H",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C16H11ClN4/c17-12-6-7-14-13(8-12)16(11-4-2-1-3-5-11)18-9-15-20-19-10-21(14)15/h1-8,10H,9H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H8ClN/c1-5-2-3-6(9)4-7(5)8/h2-4H,9H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H8N2/c7-5-1-2-6(8)4-3-5/h1-4H,7-8H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H6Cl2O3/c9-5-1-2-7(6(10)3-5)13-4-8(11)12/h1-3H,4H2,(H,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H6Cl4S/c13-7-1-3-8(4-2-7)17-12-6-10(15)9(14)5-11(12)16/h1-6H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6N4O3/c5-3(10)6-1-2(9)8-4(11)7-1/h1H,(H3,5,6,10)(H2,7,8,9,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H6O4/c8-6-3-4-5(11-6)1-2-10-7(4)9/h1,3,7,9H,2H2",0,0,0,0,1,1,1,0,0,0,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H8Cl4N2/c13-7-3-11(17)9(15)1-5(7)6-2-10(16)12(18)4-8(6)14/h1-4H,17-18H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H12F2N2O2/c7-4(8)6(10,5(11)12)2-1-3-9/h4H,1-3,9-10H2,(H,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H10O2/c1-8(10)11-7-9-5-3-2-4-6-9/h2-6H,7H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H11NO2S/c1-9-3-2-4(6)5(7)8/h4H,2-3,6H2,1H3,(H,7,8)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H12N2O2/c12-9(11(14)15)5-7-6-13-10-4-2-1-3-8(7)10/h1-4,6,9,13H,5,12H2,(H,14,15)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H25NO3.ClH/c1-17(2,3)18-10-12(19)11-21-16-9-5-6-13-14(16)7-4-8-15(13)20;/h5-6,9,12,18-19H,4,7-8,10-11H2,1-3H3;1H/t12-;/m0./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H4Cl2/c7-5-3-1-2-4-6(5)8/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H7N3O/c1-9(8-10)6-2-4-7-5-3-6/h2-5H,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C16H19ClN2.C4H4O4/c1-19(2)12-10-15(16-5-3-4-11-18-16)13-6-8-14(17)9-7-13;5-3(6)1-2-4(7)8/h3-9,11,15H,10,12H2,1-2H3;1-2H,(H,5,6)(H,7,8)/q+1;/p-1/b;2-1-",0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H21NO3/c1-7(11)4-10(5-8(2)12)6-9(3)13/h7-9,11-13H,4-6H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H10O7.2H2O/c16-7-4-10(19)12-11(5-7)22-15(14(21)13(12)20)6-1-2-8(17)9(18)3-6;;/h1-5,16-19,21H;2*1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6Cl2N2/c7-4-1-3(9)2-5(8)6(4)10/h1-2H,9-10H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H10N2.H2O4S/c1-5-4-6(8)2-3-7(5)9;1-5(2,3)4/h2-4H,8-9H2,1H3;(H2,1,2,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C12H13ClN4/c1-2-9-10(11(14)17-12(15)16-9)7-3-5-8(13)6-4-7/h3-6H,2H2,1H3,(H4,14,15,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H6O5/c8-4-1-3(7(11)12)2-5(9)6(4)10/h1-2,8-10H,(H,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H17Cl2N.ClH/c1-20-17-9-7-12(13-4-2-3-5-14(13)17)11-6-8-15(18)16(19)10-11;/h2-6,8,10,12,17,20H,7,9H2,1H3;1H/t12-,17-;/m0./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C48H74O14/c1-11-25(2)43-28(5)17-18-47(62-43)23-34-20-33(61-47)16-15-27(4)42(26(3)13-12-14-32-24-55-45-40(49)29(6)19-35(46(51)58-34)48(32,45)52)59-39-22-37(54-10)44(31(8)57-39)60-38-21-36(53-9)41(50)30(7)56-38/h12-15,19,25-26,28,30-31,33-45,49-50,52H,11,16-18,20-24H2,1-10H3/b13-12+,27-15+,32-14+/t25-,26-,28-,30-,31-,33+,34-,35-,36-,37-,38-,39-,40+,41-,42-,43+,44-,45+,47+,48+/m0/s1",0,0,0,1,1,0,0,0,0,0,1,1,1,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/CH4N2O/c2-1(3)4/h(H4,2,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C2H2Cl2/c1-2(3)4/h1H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/CCl2F2/c2-1(3,4)5",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H14N2O2/c1-2-12(9-6-4-3-5-7-9)10(15)13-8-14-11(12)16/h3-7H,2,8H2,1H3,(H,13,15)(H,14,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H13N3O3S/c1-7-8(2)13-17-11(7)14-18(15,16)10-5-3-9(12)4-6-10/h3-6,14H,12H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C12H8Cl2O2S/c13-9-1-5-11(6-2-9)17(15,16)12-7-3-10(14)4-8-12/h1-8H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C8H19NO6S2.ClH/c1-16(10,11)14-7-3-5-9-6-4-8-15-17(2,12)13;/h9H,3-8H2,1-2H3;1H",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/2C2H4O2.Ca/c2*1-2(3)4;/h2*1H3,(H,3,4);/q;;+2/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H8N2O3/c7-4-3-6(5-8)1-2-9-4/h4,7H,1-3H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C4H10N2/c1-2-6-4-3-5-1/h5-6H,1-4H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H7N3O3/c1-3-2-8(7-11)5(10)6-4(3)9/h3H,2H2,1H3,(H,6,9,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C4H4N2O3/c7-2-1-3(8)6-4(9)5-2/h1H2,(H2,5,6,7,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H16N2/c1-3-7-15(8-4-1)19-17-11-13-18(14-12-17)20-16-9-5-2-6-10-16/h1-14,19-20H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H16N2S.ClH/c1-9-5-3-6-10(2)11(9)14-12-13-7-4-8-15-12;/h3,5-6H,4,7-8H2,1-2H3,(H,13,14);1H",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H6Cl8/c11-3-1-2-4(5(3)12)9(16)7(14)6(13)8(2,15)10(9,17)18/h2-5H,1H2",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/Ca.2ClH/h;2*1H/q+2;;/p-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H22N4O/c1-3-11-20(12-4-2)17-7-5-15(6-8-17)18-19-16-9-13-21(22)14-10-16/h5-10,13-14H,3-4,11-12H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +InChI=1S/CHI3/c2-1(3)4/h1H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C19H21N3S/c1-14-7-8-17-15(13-14)19(22-11-9-21(2)10-12-22)20-16-5-3-4-6-18(16)23-17/h3-8,13H,9-12H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H14O4/c7-1-3-9-5-6-10-4-2-8/h7-8H,1-6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H11N5O3/c1-4(2)3-9(8-11)5(6)7-10(12)13/h4H,3H2,1-2H3,(H2,6,7)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +InChI=1S/Mo.3O,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C2H4O2.Ba/c2*1-2(3)4;/h2*1H3,(H,3,4);/q;;+2/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H7N7O2S/c1-15-4-14-7(16(17)18)9(15)19-8-5-6(11-2-10-5)12-3-13-8/h2-4H,1H3,(H,10,11,12,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H5Cl3N4/c10-5-3-1-2-4-6(5)13-9-15-7(11)14-8(12)16-9/h1-4H,(H,13,14,15,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H13ClN2O/c1-19-14-8-7-12(17)9-13(14)16(18-10-15(19)20)11-5-3-2-4-6-11/h2-9H,10H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H14N2O7S/c1-11(2,3)8-5-7(12(14)15)6-9(13(16)17)10(8)20-21(4,18)19/h5-6H,1-4H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C20H29N5O3/c1-22-18(15-19(26)23(2)20(22)27)21-9-6-10-24-11-13-25(14-12-24)16-7-4-5-8-17(16)28-3/h4-5,7-8,15,21H,6,9-14H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H10N4O4/c1-13(11-17)9(15)7-5-3-4-6-8(7)10(16)14(2)12-18/h3-6H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C21H30O5/c1-19-7-5-13(23)9-12(19)3-4-14-15-6-8-21(26,17(25)11-22)20(15,2)10-16(24)18(14)19/h9,14-16,18,22,24,26H,3-8,10-11H2,1-2H3/t14-,15-,16-,18+,19-,20-,21-/m0/s1",0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C34H38N3O7P.C2H6O.ClH/c1-24-30(33(38)42-19-18-36(28-15-9-6-10-16-28)21-26-12-7-5-8-13-26)31(27-14-11-17-29(20-27)37(39)40)32(25(2)35-24)45(41)43-22-34(3,4)23-44-45;1-2-3;/h5-17,20,31,35H,18-19,21-23H2,1-4H3;3H,2H2,1H3;1H",0,0,1,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/CH3Br/c1-2/h1H3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H5N/c1-4(2)3-5/h1H2,2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H3Cl3N2O2/c7-1-3(10)2(8)5(9)11-4(1)6(12)13/h(H2,10,11)(H,12,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H7NO2/c1-3(2)4(5)6/h3H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H22N2O3.ClH/c1-10(2)16-8-12(17)9-19-13-5-3-11(4-6-13)7-14(15)18;/h3-6,10,12,16-17H,7-9H2,1-2H3,(H2,15,18);1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C12H6Cl2O2/c13-7-1-3-9-11(5-7)16-10-4-2-8(14)6-12(10)15-9/h1-6H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C42H69NO15/c1-23(2)19-32(47)56-40-27(6)53-34(22-42(40,8)50)57-37-26(5)54-41(36(49)35(37)43(9)10)58-38-29(17-18-44)20-24(3)30(46)16-14-12-13-15-25(4)52-33(48)21-31(39(38)51-11)55-28(7)45/h12-14,16,18,23-27,29-31,34-41,46,49-50H,15,17,19-22H2,1-11H3/b13-12+,16-14+/t24-,25-,26-,27+,29+,30+,31-,34+,35-,36-,37-,38+,39?,40-,41+,42-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H14N2.2ClH/c13-8-9-14-12-7-3-5-10-4-1-2-6-11(10)12;;/h1-7,14H,8-9,13H2;2*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H12O5/c1-17-7-5-10(18-2)13-11(6-7)19-14(16)8-3-4-9(15)12(8)13/h5-6H,3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C28H21N5O14S4.4Na/c1-14(34)29-23-10-11-24(50(42,43)44)20-13-25(51(45,46)47)27(28(35)26(20)23)33-32-22-9-8-21(18-7-6-17(12-19(18)22)49(39,40)41)31-30-15-2-4-16(5-3-15)48(36,37)38;;;;/h2-13,35H,1H3,(H,29,34)(H,36,37,38)(H,39,40,41)(H,42,43,44)(H,45,46,47);;;;/q;4*+1/p-4/b31-30-,33-32+;;;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C18H28O3S/c1-3-4-5-6-7-8-11-22(19)15(2)12-16-9-10-17-18(13-16)21-14-20-17/h9-10,13,15H,3-8,11-12,14H2,1-2H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H9N3O2.ClH/c7-5(6(10)11)1-4-2-8-3-9-4;/h2-3,5H,1,7H2,(H,8,9)(H,10,11);1H/t5-;/m0./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H8O/c1-4(2)3-5/h3-4H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H9ClO3/c1-6-4-7(10)2-3-8(6)13-5-9(11)12/h2-4H,5H2,1H3,(H,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C23H22O6/c1-11(2)16-8-14-15(28-16)6-5-12-22(24)21-13-7-18(25-3)19(26-4)9-17(13)27-10-20(21)29-23(12)14/h5-7,9,16,20-21H,1,8,10H2,2-4H3/t16-,20-,21+/m1/s1",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H22N8O5/c1-28(9-11-8-23-17-15(24-11)16(21)26-20(22)27-17)12-4-2-10(3-5-12)18(31)25-13(19(32)33)6-7-14(29)30/h2-5,8,13H,6-7,9H2,1H3,(H,25,31)(H,29,30)(H,32,33)(H4,21,22,23,26,27)/t13-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H7N5O/c1-11-2-8-4-3(11)5(12)10-6(7)9-4/h2H,1H3,(H3,7,9,10,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H3Cl3/c3-1-2(4)5/h2H,1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H20N2S.ClH/c1-13(18(2)3)12-19-14-8-4-6-10-16(14)20-17-11-7-5-9-15(17)19;/h4-11,13H,12H2,1-3H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H17N3O4S.Na/c1-10-12(14(2)9-21(18,19)20)13(17)16(15(10)3)11-7-5-4-6-8-11;/h4-8H,9H2,1-3H3,(H,18,19,20);/q;+1/p-1",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C11H12Cl2N2O.ClH/c1-7(11-14-5-6-15-11)16-10-8(12)3-2-4-9(10)13;/h2-4,7H,5-6H2,1H3,(H,14,15);1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H10NO5PS/c1-12-15(16,13-2)14-8-5-3-7(4-6-8)9(10)11/h3-6H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +"InChI=1S/C5H11N5O3/c1-2-3-4-9(8-11)5(6)7-10(12)13/h2-4H2,1H3,(H2,6,7)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/2C10H15NO.H2O4S/c2*1-8(11-2)10(12)9-6-4-3-5-7-9;1-5(2,3)4/h2*3-8,10-12H,1-2H3;(H2,1,2,3,4)/t2*8-,10-;/m00./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C2H7N3/c1-5-2(3)4/h1H3,(H4,3,4,5)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H21NO.ClH/c1-18(2)13-14-19-17(15-9-5-3-6-10-15)16-11-7-4-8-12-16;/h3-12,17H,13-14H2,1-2H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C7H3Cl4NO3/c1-15-7-4(10)2(8)6(12(13)14)3(9)5(7)11/h1H3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H16O/c1-8-5-6-10(12)9(7-8)11(2,3)4/h5-7,12H,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C27H23N5O4.H2O/c2*33-23-17-24(26-29-31-32-30-26)36-25-21(23)10-6-11-22(25)28-27(34)19-12-14-20(15-13-19)35-16-5-4-9-18-7-2-1-3-8-18;/h2*1-3,6-8,10-15,17H,4-5,9,16H2,(H,28,34)(H,29,30,31,32);1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H15N/c1-2-4-6-8-7-5-3-1/h8H,1-7H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H10ClN3O3/c1-5(11)4-10(9-13)6(12)8-3-2-7/h2-4H2,1H3,(H,8,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C8H11N3O3/c9-6-1-2-7(10-3-4-12)8(5-6)11(13)14/h1-2,5,10,12H,3-4,9H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C22H42O4/c1-5-9-13-19(7-3)17-25-21(23)15-11-12-16-22(24)26-18-20(8-4)14-10-6-2/h19-20H,5-18H2,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H16N2O2.H2O4S/c11-9-1-3-10(4-2-9)12(5-7-13)6-8-14;1-5(2,3)4/h1-4,13-14H,5-8,11H2;(H2,1,2,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C15H13NO/c1-10(17)16-14-8-4-6-12-9-11-5-2-3-7-13(11)15(12)14/h2-8H,9H2,1H3,(H,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H4F6N2O/c5-3(6,7)1-12(11-13)2-4(8,9)10/h1-2H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C11H8N2/c1-2-4-10-8(3-1)9-5-6-12-7-11(9)13-10/h1-7,13H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H12N4O5/c9-4-1-10-12(8(16)11-4)7-6(15)5(14)3(2-13)17-7/h1,3,5-7,13-15H,2H2,(H2,9,11,16)/t3-,5-,6-,7-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6N2O5/c7-3(8)1-6(5-11)2-4(9)10/h1-2H2,(H,7,8)(H,9,10)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C5H11NO/c1-3-6(4-2)5-7/h5H,3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H18O2/c1-9(2)8-11-4-6-12(7-5-11)10(3)13(14)15/h4-7,9-10H,8H2,1-3H3,(H,14,15)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H7NO/c1-2-7-5-3-4-6-8(7)9/h2-6H,1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H15Cl2NO5S/c1-21(19,20)8-4-2-7(3-5-8)10(17)9(6-16)15-12(18)11(13)14/h2-5,9-11,16-17H,6H2,1H3,(H,15,18)/t9-,10-/m1/s1",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C21H27NO.ClH/c1-5-20(23)21(16-17(2)22(3)4,18-12-8-6-9-13-18)19-14-10-7-11-15-19;/h6-15,17H,5,16H2,1-4H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C25H22ClNO3/c1-17(2)24(18-11-13-20(26)14-12-18)25(28)30-23(16-27)19-7-6-10-22(15-19)29-21-8-4-3-5-9-21/h3-15,17,23-24H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H12Cl2N2O5/c12-10(13)11(18)14-8(5-16)9(17)6-1-3-7(4-2-6)15(19)20/h1-4,8-10,16-17H,5H2,(H,14,18)/t8-,9-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H6O4/c8-5-2-1-4(7(10)11)3-6(5)9/h1-3,8-9H,(H,10,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C9H5Br2N/c10-6-4-8(11)7-2-1-3-12-9(7)5-6/h1-5H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H13N3O3S/c1-8-7(12)13-9-5(14-4)6(11)10(2)3/h1-4H3,(H,8,12)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C37H36N2O10S3.2Na/c1-3-38(24-26-7-5-9-33(21-26)50(41,42)43)30-15-11-28(12-16-30)37(35-20-19-32(40)23-36(35)52(47,48)49)29-13-17-31(18-14-29)39(4-2)25-27-8-6-10-34(22-27)51(44,45)46;;/h5-23H,3-4,24-25H2,1-2H3,(H3,41,42,43,44,45,46,47,48,49);;/q;2*+1/p-2",0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C32H38N2O8/c1-37-24-12-17(13-25(38-2)29(24)39-3)31(35)42-26-14-18-16-34-11-10-20-19-8-6-7-9-22(19)33-28(20)23(34)15-21(18)27(30(26)40-4)32(36)41-5/h6-9,12-13,18,21,23,26-27,30,33H,10-11,14-16H2,1-5H3/t18-,21+,23-,26-,27+,30+/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,1,0,0,1,0,0,1,1,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C24H51O4P/c1-7-13-16-22(10-4)19-26-29(25,27-20-23(11-5)17-14-8-2)28-21-24(12-6)18-15-9-3/h22-24H,7-21H2,1-6H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H5N3O4/c6-5(7-9)3-1-2-4(12-3)8(10)11/h1-2,9H,(H2,6,7)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H14NO3PS2/c1-6(8)7-4-5-13-11(12,9-2)10-3/h4-5H2,1-3H3,(H,7,8)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +"InChI=1S/C21H25NO5/c1-22-15-8-6-12-10-18(25-3)20(26-4)21(27-5)19(12)13-7-9-17(24-2)16(23)11-14(13)15/h7,9-11,15,22H,6,8H2,1-5H3/t15-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C27H44O3/c1-18-8-12-22(28)17-21(18)11-10-20-7-6-16-27(5)23(13-14-24(20)27)19(2)9-15-25(29)26(3,4)30/h10-11,19,22-25,28-30H,1,6-9,12-17H2,2-5H3/b20-10+,21-11-/t19-,22+,23-,24+,25-,27-/m1/s1",0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C2H4O2.Cd/c2*1-2(3)4;/h2*1H3,(H,3,4);/q;;+2/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H5N3O2/c11-10(12)5-1-2-6-7(3-5)9-4-8-6/h1-4H,(H,8,9)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H19N3O4S.3H2O/c1-16(2)11(15(22)23)19-13(21)10(14(19)24-16)18-12(20)9(17)8-6-4-3-5-7-8;;;/h3-7,9-11,14H,17H2,1-2H3,(H,18,20)(H,22,23);3*1H2/t9-,10-,11+,14-;;;/m1.../s1",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6O2/c7-5-2-1-3-6(8)4-5/h1-4,7-8H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H10N2O8S2.2Na/c19-15-9-5-7(27(21,22)23)1-3-11(9)17-13(15)14-16(20)10-6-8(28(24,25)26)2-4-12(10)18-14;;/h1-6,17-18H,(H,21,22,23)(H,24,25,26);;/q;2*+1/p-2/b14-13-;;",0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C10H19O6PS2/c1-5-15-9(11)7-8(10(12)16-6-2)19-17(18,13-3)14-4/h8H,5-7H2,1-4H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +"InChI=1S/2C3H6O3.Ca/c2*1-2(4)3(5)6;/h2*2,4H,1H3,(H,5,6);/q;;+2/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H5NO2/c1-2-3(4)5/h2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/O3/c1-3-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H12Cl2N2.2ClH/c14-10-6-8(1-3-12(10)16)5-9-2-4-13(17)11(15)7-9;;/h1-4,6-7H,5,16-17H2;2*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H7ClO/c1-3(5)2-4/h3,5H,2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H10N2.2ClH/c1-5-6(8)3-2-4-7(5)9;;/h2-4H,8-9H2,1H3;2*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C34H36N4O6.Cu.3Na/c1-7-19-15(3)23-12-25-17(5)21(9-10-29(39)40)32(37-25)22(11-30(41)42)33-31(34(43)44)18(6)26(38-33)14-28-20(8-2)16(4)24(36-28)13-27(19)35-23;;;;/h7,12-14,17,21H,1,8-11H2,2-6H3,(H5,35,36,37,38,39,40,41,42,43,44);;;;/q;+2;3*+1/p-5/t17-,21-;;;;/m0..../s1",0,0,1,1,0,1,1,0,0,0,1,1,0,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/2Na.4O.W/q2*+1;;;2*-1;,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H8N2.2ClH/c7-5-2-1-3-6(8)4-5;;/h1-4H,7-8H2;2*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H8O2/c1-4(2)5(6)7-3/h1H2,2-3H3",0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H8N2.2ClH/c7-5-1-2-6(8)4-3-5;;/h1-4H,7-8H2;2*1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H12N4O9S2.3Na/c21-15-13(18-17-9-1-5-11(6-2-9)30(24,25)26)14(16(22)23)19-20(15)10-3-7-12(8-4-10)31(27,28)29;;;/h1-8,19H,(H,22,23)(H,24,25,26)(H,27,28,29);;;/q;3*+1/p-3/b18-17+;;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C15H23NO3.ClH/c1-4-9-18-14-7-5-6-8-15(14)19-11-13(17)10-16-12(2)3;/h4-8,12-13,16-17H,1,9-11H2,2-3H3;1H",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C40H58O4/c1-26(2)10-9-11-27(3)29-18-20-38(7)33-16-15-32-36(4,5)34(19-21-39(32)25-40(33,39)23-22-37(29,38)6)44-35(42)17-13-28-12-14-30(41)31(24-28)43-8/h10,12-14,17,24,27,29,32-34,41H,9,11,15-16,18-23,25H2,1-8H3/b17-13+/t27-,29-,32+,33+,34+,37-,38+,39-,40+/m1/s1",0,0,0,0,0,1,1,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H11NO2.ClH/c1-10-6-3-4-7(9)8(5-6)11-2;/h3-5H,9H2,1-2H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H11ClN2O2/c16-10-6-7-12-11(8-10)13(9-4-2-1-3-5-9)18-15(20)14(19)17-12/h1-8,15,20H,(H,17,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H14N2O6/c12-3-4-6(14)7(15)8(17-4)11-2-1-5(13)10-9(11)16/h4,6-8,12,14-15H,1-3H2,(H,10,13,16)/t4-,6-,7-,8-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H21NO4.BrH.3H2O/c1-18-13-7-11(8-14(18)16-15(13)22-16)21-17(20)12(9-19)10-5-3-2-4-6-10;;;;/h2-6,11-16,19H,7-9H2,1H3;1H;3*1H2/t11-,12-,13+,14+,15-,16+;;;;/m1..../s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H18N2O5/c1-21-14(20)11(7-9-5-3-2-4-6-9)16-13(19)10(15)8-12(17)18/h2-6,10-11H,7-8,15H2,1H3,(H,16,19)(H,17,18)/t10-,11-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H30O2/c1-13(2,11-15)9-7-5-6-8-10-14(3,4)12-16/h15-16H,5-12H2,1-4H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H2Cl4/c3-1-2(4,5)6/h1H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H28O2/c1-15(8-6-9-16(2)14-19(21)22)11-12-18-17(3)10-7-13-20(18,4)5/h6,8-9,11-12,14H,7,10,13H2,1-5H3,(H,21,22)",0,0,0,1,1,1,1,0,0,0,1,1,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H3Cl3O2/c3-2(4,5)1(6)7/h1,6-7H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H13NO2.ClH/c1-10-6-9(12)7-3-2-4-8(11)5-7;/h2-5,9-12H,6H2,1H3;1H/t9-;/m0./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C29H34FN3O6.ClH/c1-18-24(27(34)38-6)26(22-14-21(33(36)37)12-13-23(22)30)25(19(2)31-18)28(35)39-17-29(3,4)16-32(5)15-20-10-8-7-9-11-20;/h7-14,26,31H,15-17H2,1-6H3;1H",0,0,1,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H8N2/c1-4(2)3/h3H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C8H7ClO/c9-6-8(10)7-4-2-1-3-5-7/h1-5H,6H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C33H64O2/c1-3-5-7-9-11-13-15-17-19-21-23-25-27-29-32(34)31-33(35)30-28-26-24-22-20-18-16-14-12-10-8-6-4-2/h3-31H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H17FO4S/c1-12-17(9-13-3-6-15(7-4-13)26(2,24)25)16-8-5-14(21)10-19(16)18(12)11-20(22)23/h3-10H,11H2,1-2H3,(H,22,23)/b17-9-",0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C14H10Cl4/c15-11-5-1-9(2-6-11)13(14(17)18)10-3-7-12(16)8-4-10/h1-8,13-14H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H4ClNO2/c7-5-3-1-2-4-6(5)8(9)10/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H8O3/c1-2-8(11)7-3-4-9-10(5-7)13-6-12-9/h2-5H,1,6H2",0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H15Cl3O2/c1-20-13-7-3-11(4-8-13)15(16(17,18)19)12-5-9-14(21-2)10-6-12/h3-10,15H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H8Cl6/c13-8-9(14)11(16)7-5-2-1-4(3-5)6(7)10(8,15)12(11,17)18/h1-2,4-7H,3H2",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H6O/c1-2-3-4/h2,4H,1,3H2",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2HCl5/c3-1(4)2(5,6)7/h1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C24H32O4/c1-5-24(28-16(3)26)13-11-22-21-8-6-17-14-18(27-15(2)25)7-9-19(17)20(21)10-12-23(22,24)4/h1,14,18-22H,6-13H2,2-4H3/t18-,19-,20+,21+,22-,23-,24-/m0/s1",0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H10O2/c1-2-3-7-4-6-5-8-6/h2,6H,1,3-5H2",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H8Cl2N2O4.C2H7NO/c14-7-1-4-12(18)9(5-7)13(19)16-11-3-2-8(17(20)21)6-10(11)15;3-1-2-4/h1-6,18H,(H,16,19);4H,1-3H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H10O4/c1-13-9(11)7-3-5-8(6-4-7)10(12)14-2/h3-6H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H10N2O5/c17-12-6-5-10(7-11(12)14(20)21)16-15-9-3-1-8(2-4-9)13(18)19/h1-7,17H,(H,18,19)(H,20,21)/b16-15+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C16H14O3/c1-11(16(18)19)13-8-5-9-14(10-13)15(17)12-6-3-2-4-7-12/h2-11H,1H3,(H,18,19)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C10H5ClN2/c11-10-4-2-1-3-9(10)5-8(6-12)7-13/h1-5H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H12O5/c1-2-3-15-10(14)6-4-7(11)9(13)8(12)5-6/h4-5,11-13H,2-3H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H19N3O5/c16-6-3-13-11-2-1-10(9-12(11)15(19)20)14(4-7-17)5-8-18/h1-2,9,13,16-18H,3-8H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C20H33N3O4/c1-7-23(8-2)19(26)22-15-9-10-18(17(11-15)14(3)24)27-13-16(25)12-21-20(4,5)6/h9-11,16,21,25H,7-8,12-13H2,1-6H3,(H,22,26)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H8Cl6O/c13-8-9(14)3-1-4-5(2(3)7-6(1)19-7)11(9,16)12(17,18)10(4,8)15/h1-8H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/Be.H2O4S/c;1-5(2,3)4/h;(H2,1,2,3,4)/q+2;/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C22H26O4/c1-14-15(2)22(26)20(16(3)21(14)25)18(17-10-6-4-7-11-17)12-8-5-9-13-19(23)24/h4,6-7,10-11,18H,5,8-9,12-13H2,1-3H3,(H,23,24)",0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H8Cl3O4P/c1-10-12(9,11-2)3(8)4(5,6)7/h3,8H,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C31H52O3/c1-21(2)13-10-14-22(3)15-11-16-23(4)17-12-19-31(9)20-18-28-26(7)29(33-27(8)32)24(5)25(6)30(28)34-31/h21-23H,10-20H2,1-9H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C26H26N4O4S.ClH/c1-18(30(17-31)16-22-15-28-19(2)29-24(22)27)23(35-26(33)21-11-7-4-8-12-21)13-14-34-25(32)20-9-5-3-6-10-20;/h3-12,15,17H,13-14,16H2,1-2H3,(H2,27,28,29);1H/b23-18-;",0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C17H25NO4.ClH/c1-11(2)16(19)21-14-7-6-13(8-9-18-5)10-15(14)22-17(20)12(3)4;/h6-7,10-12,18H,8-9H2,1-5H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H16N2O8.3Na.3H2O/c13-7(14)3-11(4-8(15)16)1-2-12(5-9(17)18)6-10(19)20;;;;;;/h1-6H2,(H,13,14)(H,15,16)(H,17,18)(H,19,20);;;;3*1H2/q;3*+1;;;/p-3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H13BrN2O2/c1-3-7(8,4-2)5(11)10-6(9)12/h3-4H2,1-2H3,(H3,9,10,11,12)",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H9Cl5O/c15-11-5-1-9(2-6-11)13(20,14(17,18)19)10-3-7-12(16)8-4-10/h1-8,20H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C2H4O2.2H2O.Zn/c2*1-2(3)4;;;/h2*1H3,(H,3,4);2*1H2;/q;;;;+2/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H24O/c1-10-8-11(14(2,3)4)13(16)12(9-10)15(5,6)7/h8-9,16H,1-7H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H19O7PS/c1-5-16-9(11)7-8(10(12)17-6-2)19-18(13,14-3)15-4/h8H,5-7H2,1-4H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H13NO2/c1-10(16)15-13-8-7-12(9-14(13)17)11-5-3-2-4-6-11/h2-9,17H,1H3,(H,15,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H16ClO5PS/c1-4-17-21(22,18-5-2)20-10-6-7-11-9(3)13(15)14(16)19-12(11)8-10/h6-8H,4-5H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1 +"InChI=1S/C6H11N.H2O4S/c7-6-4-2-1-3-5-6;1-5(2,3)4/h6H,1-5H2;(H2,1,2,3,4)/q+1;/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/C7H5Cl2NO2/c8-3-1-4(7(11)12)6(9)5(10)2-3/h1-2H,10H2,(H,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H13N.ClH/c7-6-4-2-1-3-5-6;/h6H,1-5,7H2;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H9N3S/c10-12-9-11-8(6-13-9)7-4-2-1-3-5-7/h1-6H,10H2,(H,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 +"InChI=1S/C22H38O5/c1-4-5-14-22(2,26)15-10-12-18-17(19(23)16-20(18)24)11-8-6-7-9-13-21(25)27-3/h10,12,17-18,20,24,26H,4-9,11,13-16H2,1-3H3/b12-10+/t17-,18-,20-,22?/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C15H16N4O/c1-3-19-15-13(10(2)18-19)17-12(20)9-16-14(15)11-7-5-4-6-8-11/h4-8H,3,9H2,1-2H3,(H,17,20)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H9AsN2O4/c9-7(11)10-6-3-1-5(2-4-6)8(12,13)14/h1-4H,(H3,9,10,11)(H2,12,13,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6ClN.ClH/c7-5-6-3-1-2-4-8-6;/h1-4H,5H2;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H18N2O2/c1-10-5-3-6-11(2)14(10)15-12(17)9-16-8-4-7-13(16)18/h3,5-6H,4,7-9H2,1-2H3,(H,15,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6AsNO6/c9-6-2-1-4(7(10,11)12)3-5(6)8(13)14/h1-3,9H,(H2,10,11,12)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C36H32Cl4N6O8/c1-17(47)33(35(49)41-27-15-29(51-3)23(39)13-31(27)53-5)45-43-25-9-7-19(11-21(25)37)20-8-10-26(22(38)12-20)44-46-34(18(2)48)36(50)42-28-16-30(52-4)24(40)14-32(28)54-6/h7-16,33-34H,1-6H3,(H,41,49)(H,42,50)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0 +"InChI=1S/C8H5Cl3O3/c9-4-1-6(11)7(2-5(4)10)14-3-8(12)13/h1-2H,3H2,(H,12,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H14O6S2/c1-13(7,8)11-5-3-4-6-12-14(2,9)10/h3-6H2,1-2H3",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C11H18N2O3/c1-4-11(6-5-7(2)3)8(14)12-10(16)13-9(11)15/h7H,4-6H2,1-3H3,(H2,12,13,14,15,16)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C3H8O2/c1-3(5)2-4/h3-5H,2H2,1H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H9N5/c10-8-12-7(13-9(11)14-8)6-4-2-1-3-5-6/h1-5H,(H4,10,11,12,13,14)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H9NO3S/c1-3(7)6-4(2-10)5(8)9/h4,10H,2H2,1H3,(H,6,7)(H,8,9)/t4-/m0/s1",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H14O3/c1-3-5(7)9-6(8)4-2/h5-8H,3-4H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H13NO3S.Na/c8-11(9,10)7-6-4-2-1-3-5-6;/h6-7H,1-5H2,(H,8,9,10);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0 +"InChI=1S/C6H7N/c7-6-4-2-1-3-5-6/h1-5H,7H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H20O2/c1-10(2)6-5-7-11(3)8-9-14-12(4)13/h6,8H,5,7,9H2,1-4H3/b11-8+",0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H22N2O3/c1-10(2)15-8-13(18)9-19-14-6-4-12(5-7-14)16-11(3)17/h4-7,10,13,15,18H,8-9H2,1-3H3,(H,16,17)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H11ClO3/c1-2-5-15-10-4-3-8(6-9(10)12)7-11(13)14/h2-4,6H,1,5,7H2,(H,13,14)",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C12H17NO/c1-4-13(5-2)12(14)11-8-6-7-10(3)9-11/h6-9H,4-5H2,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H15N5.ClH/c11-9(12)15-10(13)14-7-6-8-4-2-1-3-5-8;/h1-5H,6-7H2,(H6,11,12,13,14,15);1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H11N/c1-2-4-6-5-3-1/h6H,1-5H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H7NO3S/c3-1-2-7(4,5)6/h1-3H2,(H,4,5,6)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C9H9NS/c11-8-10-7-6-9-4-2-1-3-5-9/h1-5H,6-7H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H16N6S/c1-8-9(16-7-15-8)5-17-4-3-13-10(12-2)14-6-11/h7H,3-5H2,1-2H3,(H,15,16)(H2,12,13,14)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/2Cr.3O,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C11H16N2O2/c1-3-10-8(6-15-11(10)14)4-9-5-12-7-13(9)2/h5,7-8,10H,3-4,6H2,1-2H3/t8-,10-/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H7ClN2.H2O4S/c7-5-3-4(8)1-2-6(5)9;1-5(2,3)4/h1-3H,8-9H2;(H2,1,2,3,4)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,0,1,0,0,0,0,0 +"InChI=1S/2C3H7NS2.Pb/c2*1-4(2)3(5)6;/h2*1-2H3,(H,5,6);/q;;+2/p-2",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C13H16F3N3O4/c1-3-5-17(6-4-2)12-10(18(20)21)7-9(13(14,15)16)8-11(12)19(22)23/h7-8H,3-6H2,1-2H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H11N3O4/c10-5-1-2-12-8-7(16-9(12)11-5)6(14)4(3-13)15-8/h1-2,4,6-8,10,13-14H,3H2/t4-,6-,7+,8-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H6N2O4/c8-6-3-4(9(12)13)1-2-5(6)7(10)11/h1-3H,8H2,(H,10,11)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C10H7NO2/c12-11(13)10-7-3-5-8-4-1-2-6-9(8)10/h1-7H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H5Cl7/c11-4-2-1-3-5(4)9(15)7(13)6(12)8(3,14)10(9,16)17/h1-5H",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H11N.ClH/c1-6-3-4-8(9)7(2)5-6;/h3-5H,9H2,1-2H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6Cl5NO2/c7-1-2(8)4(10)6(12(13)14)5(11)3(1)9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C5H10N6O2/c12-6-10-2-8-1-9(4-10)5-11(3-8)7-13/h1-5H2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C7H9N.ClH/c1-6-2-4-7(8)5-3-6;/h2-5H,8H2,1H3;1H",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C2H4N2S2/c3-1(5)2(4)6/h(H2,3,5)(H2,4,6)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H6N2O2/c7-5-1-3-6(4-2-5)8(9)10/h1-4H,7H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C14H14O4/c1-3-9-17-13(15)11-7-5-6-8-12(11)14(16)18-10-4-2/h3-8H,1-2,9-10H2",0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5Cl6/c6-1-2(7)4(9)5(10,11)3(1)8",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/C6H4ClNO2/c7-5-1-3-6(4-2-5)8(9)10/h1-4H,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C16H12N2O7S2.2Na/c19-15-8-1-10-9-13(27(23,24)25)6-7-14(10)16(15)18-17-11-2-4-12(5-3-11)26(20,21)22;;/h1-9,19H,(H,20,21,22)(H,23,24,25);;/q;2*+1/p-2/b18-17-;;",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,0,0 +"InChI=1S/C6H7N3O2/c7-5-2-1-4(9(10)11)3-6(5)8/h1-3H,7-8H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C6H7N3O2/c7-4-1-2-5(8)6(3-4)9(10)11/h1-3H,7-8H2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H10ClNO2/c1-7(13)12-9-4-2-8(3-5-9)10(14)6-11/h2-5H,6H2,1H3,(H,12,13)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C23H21ClO3/c1-25-19-10-4-16(5-11-19)22(17-6-12-20(26-2)13-7-17)23(24)18-8-14-21(27-3)15-9-18/h4-15H,1-3H3",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H9NO4.Na/c6-3(5(9)10)1-2-4(7)8;/h3H,1-2,6H2,(H,7,8)(H,9,10);/q;+1/p-1/t3-;/m0./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C4H6O2S/c5-7(6)3-1-2-4-7/h1-2H,3-4H2",0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0 +"InChI=1S/C10H22Cl2N2O4/c11-1-3-13-5-7(15)9(17)10(18)8(16)6-14-4-2-12/h7-10,13-18H,1-6H2/t7-,8-,9-,10-/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/2C5H5.2ClH.Ti/c2*1-2-4-5-3-1;;;/h2*1-3H,4H2;2*1H;/q;;;;+2/p-2",0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C8H12O6/c1-2-13-7-5(11)8(12)14-6(7)4(10)3-9/h4,6,9-11H,2-3H2,1H3/t4-,6+/m0/s1",0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H11NO2S/c1-2-9-3-4(6)5(7)8/h4H,2-3,6H2,1H3,(H,7,8)/t4-/m0/s1",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C33H34N6O6/c1-3-42-32-34-28-15-9-14-27(31(40)43-21(2)44-33(41)45-24-10-5-4-6-11-24)29(28)39(32)20-22-16-18-23(19-17-22)25-12-7-8-13-26(25)30-35-37-38-36-30/h7-9,12-19,21,24H,3-6,10-11,20H2,1-2H3,(H,35,36,37,38)",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C18H21NO3/c1-19-8-7-18-11-4-5-13(20)17(18)22-16-14(21-2)6-3-10(15(16)18)9-12(11)19/h3-6,11-13,17,20H,7-9H2,1-2H3/t11?,12?,13-,17?,18+/m0/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C9H7Cl2N5.C4H4O4/c10-4-1-2-6(11)5(3-4)7-14-8(12)16-9(13)15-7;5-3(6)1-2-4(7)8/h1-3H,(H4,12,13,14,15,16);1-2H,(H,5,6)(H,7,8)/b;2-1-",0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C10H12O/c1-3-4-9-5-7-10(11-2)8-6-9/h3-8H,1-2H3/b4-3+",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C5H8N2O4/c8-3-1-4(5(9)10)7(2-3)6-11/h3-4,8H,1-2H2,(H,9,10)/t3-,4+/m1/s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0 +"InChI=1S/C2Cl3F3/c3-1(4,6)2(5,7)8",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C32H60O10/c1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-30(36)40-25-24-37-27-29(39-22-19-34)32-28(38-21-18-33)26-31(42-32)41-23-20-35/h9-10,28-29,31-35H,2-8,11-27H2,1H3",0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/Bi.ClH.O/h;1H;/q+1;;/p-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C37H67NO13.C18H36O2/c1-14-25-37(10,45)30(41)20(4)27(39)18(2)16-35(8,44)32(51-34-28(40)24(38(11)12)15-19(3)47-34)21(5)29(22(6)33(43)49-25)50-26-17-36(9,46-13)31(42)23(7)48-26;1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18(19)20/h18-26,28-32,34,40-42,44-45H,14-17H2,1-13H3;2-17H2,1H3,(H,19,20)/t18-,19-,20+,21+,22-,23+,24+,25-,26+,28-,29+,30-,31+,32-,34+,35-,36-,37-;/m1./s1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +InChI=1S/3C6H5.H2O.Sn/c3*1-2-4-6-5-3-1;;/h3*1-5H;1H2;/q;;;;+1/p-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/AsH3O4.Na/c2-1(3,4)5;/h(H3,2,3,4,5);/q;+1/p-1",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +"InChI=1S/C7H14N2O2S/c1-7(2,12-4)5-9-11-6(10)8-3/h5H,1-4H3,(H,8,10)",0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 diff --git a/test/data/wrong_dataset.csv b/test/data/wrong_dataset.csv new file mode 100644 index 0000000..99febb3 --- /dev/null +++ b/test/data/wrong_dataset.csv @@ -0,0 +1,8 @@ +SMILES,Wrong Dataset +Tost,0 +Is,1 +A,0 +Wrong,1 +Dataset,0 +Entry,1 +O[C@@H]8[C@@H](O)[C@@H]1O[C@H](CO)[C@H]8O[C@H]7O[C@H](CO)[C@@H](O[C@H]6O[C@H](CO)[C@@H](O[C@H]5O[C@H](CO)[C@@H](O[C@H]4O[C@H](CO)[C@@H](O[C@H]3O[C@H](CO)[C@@H](O[C@H]2O[C@H](CO)[C@@H](O1)[C@H](O)[C@H]2O)[C@H](O)[C@H]3O)[C@H](O)[C@H]4O)[C@H](O)[C@H]5O)[C, 0 diff --git a/test/dataset-long.rb b/test/dataset-long.rb new file mode 100644 index 0000000..50ae8fc --- /dev/null +++ b/test/dataset-long.rb @@ -0,0 +1,116 @@ +require_relative "setup.rb" + +class DatasetLongTest < MiniTest::Test + + def test_01_upload_epafhm + f = File.join DATA_DIR, "EPAFHM.csv" + d = OpenTox::Dataset.from_csv_file f + csv = CSV.read f + assert_equal csv.size-1, d.compounds.size + assert_equal csv.first.size-1, d.features.size + assert_equal csv.size-1, d.data_entries.size + d.delete + end + +=begin +# TODO catch OpenBabel segfaults and identify/remove cause + def test_02_upload_multicell + duplicates = [ + "http://localhost:8082/compound/InChI=1S/C6HCl5O/c7-1-2(8)4(10)6(12)5(11)3(1)9/h12H", + "http://localhost:8082/compound/InChI=1S/C12H8Cl6O/c13-8-9(14)11(16)5-3-1-2(6-7(3)19-6)4(5)10(8,15)12(11,17)18/h2-7H,1H2", + "http://localhost:8082/compound/InChI=1S/C2HCl3/c3-1-2(4)5/h1H", + "http://localhost:8082/compound/InChI=1S/C4H5Cl/c1-3-4(2)5/h3H,1-2H2", + "http://localhost:8082/compound/InChI=1S/C4H7Cl/c1-4(2)3-5/h1,3H2,2H3", + "http://localhost:8082/compound/InChI=1S/C8H14O4/c1-5-4-8(11-6(2)9)12-7(3)10-5/h5,7-8H,4H2,1-3H3", + "http://localhost:8082/compound/InChI=1S/C19H30O5/c1-3-5-7-20-8-9-21-10-11-22-14-17-13-19-18(23-15-24-19)12-16(17)6-4-2/h12-13H,3-11,14-15H2,1-2H3", + ] + errors = ['O=P(H)(OC)OC', 'C=CCNN.HCl' ] + f = File.join DATA_DIR, "multi_cell_call.csv" + d = OpenTox::Dataset.from_csv_file f + csv = CSV.read f + assert_equal true, d.features.first.nominal + assert_nil d["index"] + assert_equal csv.size-1-errors.size, d.compounds.size + assert_equal csv.first.size-1, d.features.size + assert_equal csv.size-1-errors.size, d.data_entries.size + p d.warnings + (duplicates+errors).each do |uri| + assert d.warnings.grep %r{#{uri}} + end + d.delete + end +=end + + def test_03_upload_isscan + f = File.join DATA_DIR, "ISSCAN-multi.csv" + d = OpenTox::Dataset.from_csv_file f + csv = CSV.read f + assert_equal csv.size-1, d.compounds.size + assert_equal csv.first.size-1, d.features.size + assert_equal csv.size-1, d.data_entries.size + d.delete + #assert_equal false, URI.accessible?(d.uri) + end + + def test_04_simultanous_upload + threads = [] + 3.times do |t| + threads << Thread.new(t) do |up| + d = OpenTox::Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" + assert_equal OpenTox::Dataset, d.class + assert_equal 1, d.features.size + assert_equal 85, d.compounds.size + assert_equal 85, d.data_entries.size + csv = CSV.read("#{DATA_DIR}/hamster_carcinogenicity.csv") + csv.shift + assert_equal csv.collect{|r| r[1]}, d.data_entries.flatten + d.delete + end + end + threads.each {|aThread| aThread.join} + end + + def test_05_upload_kazius + f = File.join DATA_DIR, "kazius.csv" + d = OpenTox::Dataset.from_csv_file f + csv = CSV.read f + assert_equal csv.size-1, d.compounds.size + assert_equal csv.first.size-1, d.features.size + assert_equal csv.size-1, d.data_entries.size + # TODO: check if warning is correct: + # Duplicate compound InChI=1S/C5H4N4S/c10-5-3-4(7-1-6-3)8-2-9-5/h1-2H,(H2,6,7,8,9,10) at rows 1357, 2235 + #assert_empty d.warnings + # 493 COC1=C(C=C(C(=C1)Cl)OC)Cl,1 + c = d.compounds[491] + assert_equal c.smiles, "COc1cc(c(cc1Cl)OC)Cl" + assert_equal d[c.id,d.features.first.id], 1 + d.delete + end + + def test_upload_feature_dataset + t = Time.now + f = File.join DATA_DIR, "rat_feature_dataset.csv" + d = Dataset.from_csv_file f + assert_equal 458, d.features.size + d.save + p "Upload: #{Time.now-t}" + d2 = Dataset.find d.id + t = Time.now + assert_equal d.features.size, d2.features.size + csv = CSV.read f + csv.shift # remove header + assert_equal csv.size, d2.compounds.size + assert_equal csv.first.size-1, d2.features.size + d2.compounds.each_with_index do |compound,i| + row = csv[i] + row.shift # remove compound + assert_equal row, d2.data_entries[i] + end + p "Dowload: #{Time.now-t}" + d2.delete + assert_raises Mongoid::Errors::DocumentNotFound do + Dataset.find d.id + end + end + +end diff --git a/test/dataset.rb b/test/dataset.rb new file mode 100644 index 0000000..b3e1403 --- /dev/null +++ b/test/dataset.rb @@ -0,0 +1,199 @@ +# TODO; check compound/data_entry sequences with missing and duplicated values + +require_relative "setup.rb" + +class DatasetTest < MiniTest::Test + + def test_all + d1 = Dataset.new + d1.save + datasets = Dataset.all + assert_equal Dataset, datasets.first.class + d1.delete + end + + def test_create_empty + d = Dataset.new + assert_equal Dataset, d.class + refute_nil d.id + assert_kind_of BSON::ObjectId, d.id + end + + def test_client_create + d = Dataset.new + assert_equal Dataset, d.class + d.name = "Create dataset test" + + # features not set + # << operator was removed for efficiency reasons (CH) + #assert_raises BadRequestError do + # d << [Compound.from_smiles("c1ccccc1NN"), 1,2] + #end + + # add data entries + d.features = ["test1", "test2"].collect do |title| + f = Feature.new + f.name = title + f.numeric = true + f.save + f + end + + # wrong feature size + # << operator was removed for efficiency reasons (CH) + #assert_raises BadRequestError do + # d << [Compound.from_smiles("c1ccccc1NN"), 1,2,3] + #end + + # manual low-level insertions without consistency checks for runtime efficiency + data_entries = [] + d.compound_ids << Compound.from_smiles("c1ccccc1NN").id + data_entries << [1,2] + d.compound_ids << Compound.from_smiles("CC(C)N").id + data_entries << [4,5] + d.compound_ids << Compound.from_smiles("C1C(C)CCCC1").id + data_entries << [6,7] + d.data_entries = data_entries + assert_equal 3, d.compounds.size + assert_equal 2, d.features.size + assert_equal [[1,2],[4,5],[6,7]], d.data_entries + d.save_all + # check if dataset has been saved correctly + new_dataset = Dataset.find d.id + assert_equal 3, new_dataset.compounds.size + assert_equal 2, new_dataset.features.size + assert_equal [[1,2],[4,5],[6,7]], new_dataset.data_entries + d.delete + assert_raises Mongoid::Errors::DocumentNotFound do + Dataset.find d.id + end + assert_raises Mongoid::Errors::DocumentNotFound do + Dataset.find new_dataset.id + end + end + + def test_dataset_accessors + d = Dataset.from_csv_file "#{DATA_DIR}/multicolumn.csv" + # create empty dataset + new_dataset = Dataset.find d.id + # get metadata + assert_match "multicolumn.csv", new_dataset.source + assert_equal "multicolumn.csv", new_dataset.title + # get features + assert_equal 6, new_dataset.features.size + assert_equal 7, new_dataset.compounds.size + assert_equal ["1", nil, "false", nil, nil, 1.0], new_dataset.data_entries.last + d.delete + end + + def test_create_from_file + d = Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.mini.csv") + assert_equal Dataset, d.class + refute_nil d.warnings + assert_match "EPAFHM.mini.csv", d.source + assert_equal "EPAFHM.mini.csv", d.name + d.delete + #assert_equal false, URI.accessible?(d.uri) + end + + def test_create_from_file_with_wrong_smiles_compound_entries + d = Dataset.from_csv_file File.join(DATA_DIR,"wrong_dataset.csv") + refute_nil d.warnings + assert_match /2|3|4|5|6|7|8/, d.warnings.join + d.delete + end + + def test_multicolumn_csv + d = Dataset.from_csv_file "#{DATA_DIR}/multicolumn.csv" + refute_nil d.warnings + assert d.warnings.grep(/Duplicate compound/) + assert d.warnings.grep(/3, 5/) + assert_equal 6, d.features.size + assert_equal 7, d.compounds.size + assert_equal 5, d.compounds.collect{|c| c.inchi}.uniq.size + assert_equal [["1", "1", "true", "true", "test", 1.1], ["1", "2", "false", "7.5", "test", 0.24], ["1", "3", "true", "5", "test", 3578.239], ["0", "4", "false", "false", "test", -2.35], ["1", "2", "true", "4", "test_2", 1], ["1", "2", "false", "false", "test", -1.5], ["1", nil, "false", nil, nil, 1.0]], d.data_entries + assert_equal "c1cc[nH]c1,1,,false,,,1.0", d.to_csv.split("\n")[7] + csv = CSV.parse(d.to_csv) + original_csv = CSV.read("#{DATA_DIR}/multicolumn.csv") + csv.shift + original_csv.shift + csv.each_with_index do |row,i| + compound = Compound.from_smiles row.shift + original_compound = Compound.from_smiles original_csv[i].shift + assert_equal original_compound.inchi, compound.inchi + row.each_with_index do |v,j| + if v.numeric? + assert_equal original_csv[i][j].strip.to_f, row[j].to_f + else + assert_equal original_csv[i][j].strip, row[j].to_s + end + end + end + d.delete + end + + def test_from_csv + d = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" + assert_equal Dataset, d.class + assert_equal 1, d.features.size + assert_equal 85, d.compounds.size + assert_equal 85, d.data_entries.size + csv = CSV.read("#{DATA_DIR}/hamster_carcinogenicity.csv") + csv.shift + assert_equal csv.collect{|r| r[1]}, d.data_entries.flatten + d.delete + #assert_equal false, URI.accessible?(d.uri) + end + + def test_from_csv_classification + ["int", "float", "string"].each do |mode| + d = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.mini.bool_#{mode}.csv" + csv = CSV.read("#{DATA_DIR}/hamster_carcinogenicity.mini.bool_#{mode}.csv") + csv.shift + entries = d.data_entries.flatten + csv.each_with_index do |r, i| + assert_equal r[1].to_s, entries[i] + end + d.delete + end + end + + def test_from_csv2 + File.open("#{DATA_DIR}/temp_test.csv", "w+") { |file| file.write("SMILES,Hamster\nCC=O,true\n ,true\nO=C(N),true") } + dataset = Dataset.from_csv_file "#{DATA_DIR}/temp_test.csv" + assert_equal "Cannot parse SMILES compound ' ' at position 3, all entries are ignored.", dataset.warnings.join + File.delete "#{DATA_DIR}/temp_test.csv" + dataset.features.each{|f| feature = Feature.find f.id; feature.delete} + dataset.delete + end + + def test_same_feature + datasets = [] + features = [] + 2.times do |i| + d = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.mini.csv" + features << d.features.first + assert features[0].id==features[-1].id,"re-upload should find old feature, but created new one" + datasets << d + end + datasets.each{|d| d.delete} + end + + def test_create_from_file + d = Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.mini.csv") + assert_equal Dataset, d.class + refute_nil d.warnings + assert_match /row 13/, d.warnings.join + assert_match "EPAFHM.mini.csv", d.source + assert_equal 1, d.features.size + feature = d.features.first + assert_kind_of NumericBioAssay, feature + assert_equal 0.0113, d.data_entries[0][0] + assert_equal 0.00323, d.data_entries[5][0] + d2 = Dataset.find d.id + assert_equal 0.0113, d2.data_entries[0][0] + assert_equal 0.00323, d2.data_entries[5][0] + end + +end + diff --git a/test/error.rb b/test/error.rb new file mode 100644 index 0000000..7b71b22 --- /dev/null +++ b/test/error.rb @@ -0,0 +1,24 @@ +require_relative "setup.rb" + +class ErrorTest < MiniTest::Test + + def test_bad_request + object = OpenTox::Feature.new + assert_raises Mongoid::Errors::DocumentNotFound do + response = OpenTox::Feature.find(object.id) + end + end + + def test_error_methods + assert_raises OpenTox::ResourceNotFoundError do + resource_not_found_error "This is a test" + end + end + + def test_exception + assert_raises Exception do + raise Exception.new "Basic Exception" + end + end + +end diff --git a/test/feature.rb b/test/feature.rb new file mode 100644 index 0000000..71ef4c0 --- /dev/null +++ b/test/feature.rb @@ -0,0 +1,65 @@ +require_relative "setup.rb" + +class FeatureTest < MiniTest::Test + + def test_opentox_feature + @feature = OpenTox::Feature.create(:name => "tost") + assert_equal true, OpenTox::Feature.where(name: "tost").exists?, "#{@feature.id} is not accessible." + assert_equal true, OpenTox::Feature.where(id: @feature.id).exists?, "#{@feature.id} is not accessible." + + list = OpenTox::Feature.all + listsize1 = list.length + assert_equal true, list.collect{|f| f.id}.include?(@feature.id) + # modify feature + @feature2 = OpenTox::Feature.find(@feature.id) + assert_equal "tost", @feature2[:name] + assert_equal "tost", @feature2.name + assert_kind_of Feature, @feature2 + + @feature2[:name] = "feature2" + @feature2.save + list = OpenTox::Feature.all + listsize2 = list.length + assert_match "feature2", @feature2.name + refute_match "tost", @feature2.name + assert_equal listsize1, listsize2 + + id = @feature2.id + @feature2.delete + assert_raises Mongoid::Errors::DocumentNotFound do + OpenTox::Feature.find(id) + end + end + + def test_duplicated_features + metadata = { + :name => "feature duplication test", + :nominal => true, + :description => "feature duplication test" + } + feature = NumericBioAssay.find_or_create_by metadata + dup_feature = NumericBioAssay.find_or_create_by metadata + assert_kind_of Feature, feature + assert !feature.id.nil?, "No Feature ID in #{feature.inspect}" + assert !feature.id.nil?, "No Feature ID in #{dup_feature.inspect}" + assert_equal feature.id, dup_feature.id + feature.delete + assert_raises Mongoid::Errors::DocumentNotFound do + OpenTox::Feature.find(feature.id) + end + assert_raises Mongoid::Errors::DocumentNotFound do + OpenTox::Feature.find(dup_feature.id) + end + end + + def test_smarts_feature + feature = Smarts.find_or_create_by(:smarts => "CN") + assert feature.smarts, "CN" + assert_kind_of Smarts, feature + feature.smarts = 'cc' + assert feature.smarts, "cc" + original = Feature.where(:smarts => 'CN').first + assert original.smarts, "CN" + end + +end diff --git a/test/setup.rb b/test/setup.rb new file mode 100644 index 0000000..379fa53 --- /dev/null +++ b/test/setup.rb @@ -0,0 +1,6 @@ +require 'minitest/autorun' +require_relative '../lib/lazar.rb' +include OpenTox +TEST_DIR ||= File.expand_path(File.dirname(__FILE__)) +DATA_DIR ||= File.join(TEST_DIR,"data") +#$mongo.database.drop -- cgit v1.2.3 From b7cd3ebbb858a8891c35c45896f1bdd525f3534e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 10 Aug 2015 13:26:06 +0200 Subject: algorithm libraries added, fminer tests pass --- lazar.gemspec | 29 +++++++ lib/algorithm.rb | 21 +++++ lib/bbrc.rb | 159 ++++++++++++++++++++++++++++++++++++++ lib/classification.rb | 107 ++++++++++++++++++++++++++ lib/compound.rb | 2 - lib/crossvalidation.rb | 187 +++++++++++++++++++++++++++++++++++++++++++++ lib/dataset.rb | 4 +- lib/descriptor.rb | 73 +++++++++--------- lib/feature.rb | 3 + lib/lazar.rb | 31 +++++++- lib/neighbor.rb | 25 ++++++ lib/regression.rb | 199 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/similarity.rb | 58 ++++++++++++++ lib/validation.rb | 114 +++++++++++++++++++++++++++ test/descriptor-long.rb | 13 ++++ test/descriptor.rb | 83 ++++++++++++++++++++ test/fminer-long.rb | 37 +++++++++ test/fminer.rb | 46 +++++++++++ 18 files changed, 1146 insertions(+), 45 deletions(-) create mode 100644 lazar.gemspec create mode 100644 lib/algorithm.rb create mode 100644 lib/bbrc.rb create mode 100644 lib/classification.rb create mode 100644 lib/crossvalidation.rb create mode 100644 lib/neighbor.rb create mode 100644 lib/regression.rb create mode 100644 lib/similarity.rb create mode 100644 lib/validation.rb create mode 100644 test/descriptor-long.rb create mode 100644 test/descriptor.rb create mode 100644 test/fminer-long.rb create mode 100644 test/fminer.rb diff --git a/lazar.gemspec b/lazar.gemspec new file mode 100644 index 0000000..3a9a1af --- /dev/null +++ b/lazar.gemspec @@ -0,0 +1,29 @@ +# -*- encoding: utf-8 -*- +$:.push File.expand_path("../lib", __FILE__) + +Gem::Specification.new do |s| + s.name = "opentox-client" + s.version = File.read("./VERSION").strip + s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler, Denis Gebele"] + s.email = ["helma@in-silico.ch"] + s.homepage = "http://github.com/opentox/lazar" + s.summary = %q{Ruby wrapper for the OpenTox REST API} + s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} + s.license = 'GPL-3' + + s.rubyforge_project = "lazar" + + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } + s.require_paths = ["lib"] + + # specify any dependencies here; for example: + s.add_runtime_dependency "bundler" + s.add_runtime_dependency "rest-client" + s.add_runtime_dependency 'nokogiri' + s.add_runtime_dependency "openbabel" + s.add_runtime_dependency 'rserve-client' + s.add_runtime_dependency "mongoid", '~> 5.0beta' + +end diff --git a/lib/algorithm.rb b/lib/algorithm.rb new file mode 100644 index 0000000..113f847 --- /dev/null +++ b/lib/algorithm.rb @@ -0,0 +1,21 @@ +module OpenTox + + module Algorithm + + # Generic method to execute algorithms + # Algorithms should: + # - accept a Compound, an Array of Compounds or a Dataset as first argument + # - optional parameters as second argument + # - return an object corresponding to the input type as result (eg. Compound -> value, Array of Compounds -> Array of values, Dataset -> Dataset with values + # @param [OpenTox::Compound,Array,OpenTox::Dataset] Input object + # @param [Hash] Algorithm parameters + # @return Algorithm result + def self.run algorithm, object, parameters=nil + bad_request_error "Cannot run '#{algorithm}' algorithm. Please provide an OpenTox::Algorithm." unless algorithm =~ /^OpenTox::Algorithm/ + klass,method = algorithm.split('.') + parameters.nil? ? Object.const_get(klass).send(method,object) : Object.const_get(klass).send(method,object, parameters) + end + + end +end + diff --git a/lib/bbrc.rb b/lib/bbrc.rb new file mode 100644 index 0000000..6a2eed7 --- /dev/null +++ b/lib/bbrc.rb @@ -0,0 +1,159 @@ +module OpenTox + module Algorithm + class Fminer + TABLE_OF_ELEMENTS = [ +"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Uut", "Fl", "Uup", "Lv", "Uus", "Uuo"] + + # + # Run bbrc algorithm on dataset + # + # @param [OpenTox::Dataset] training dataset + # @param [optional] parameters BBRC parameters, accepted parameters are + # - min_frequency Minimum frequency (default 5) + # - feature_type Feature type, can be 'paths' or 'trees' (default "trees") + # - backbone BBRC classes, pass 'false' to switch off mining for BBRC representatives. (default "true") + # - min_chisq_significance Significance threshold (between 0 and 1) + # - nr_hits Set to "true" to get hit count instead of presence + # - get_target Set to "true" to obtain target variable as feature + # @return [OpenTox::Dataset] Fminer Dataset + def self.bbrc training_dataset, params={} + + time = Time.now + bad_request_error "More than one prediction feature found in training_dataset #{training_dataset.id}" unless training_dataset.features.size == 1 + + prediction_feature = training_dataset.features.first + if params[:min_frequency] + minfreq = params[:min_frequency] + else + per_mil = 5 # value from latest version + i = training_dataset.feature_ids.index prediction_feature.id + nr_labeled_cmpds = training_dataset.data_entries.select{|de| !de[i].nil?}.size + minfreq = per_mil * nr_labeled_cmpds.to_f / 1000.0 # AM sugg. 8-10 per mil for BBRC, 50 per mil for LAST + minfreq = 2 unless minfreq > 2 + minfreq = minfreq.round + end + + @bbrc ||= Bbrc::Bbrc.new + @bbrc.Reset + if prediction_feature.numeric + @bbrc.SetRegression(true) # AM: DO NOT MOVE DOWN! Must happen before the other Set... operations! + else + bad_request_error "No accept values for "\ + "dataset '#{training_dataset.id}' and "\ + "feature '#{prediction_feature.id}'" unless prediction_feature.accept_values + value2act = Hash[[*prediction_feature.accept_values.map.with_index]] + end + @bbrc.SetMinfreq(minfreq) + @bbrc.SetType(1) if params[:feature_type] == "paths" + @bbrc.SetBackbone(false) if params[:backbone] == "false" + @bbrc.SetChisqSig(params[:min_chisq_significance].to_f) if params[:min_chisq_significance] + @bbrc.SetConsoleOut(false) + + params[:nr_hits] ? nr_hits = params[:nr_hits] : nr_hits = false + feature_dataset = FminerDataset.new( + :training_dataset_id => training_dataset.id, + :training_algorithm => "#{self.to_s}.bbrc", + :training_feature_id => prediction_feature.id , + :training_parameters => { + :min_frequency => minfreq, + :nr_hits => nr_hits, + :backbone => (params[:backbone] == false ? false : true) + } + + ) + feature_dataset.compounds = training_dataset.compounds + + # add data + training_dataset.compounds.each_with_index do |compound,i| + @bbrc.AddCompound(compound.smiles,i+1) + act = value2act[training_dataset.data_entries[i].first] + @bbrc.AddActivity(act,i+1) + end + #g_median=@fminer.all_activities.values.to_scale.median + + #task.progress 10 + #step_width = 80 / @bbrc.GetNoRootNodes().to_f + + $logger.debug "BBRC setup: #{Time.now-time}" + time = Time.now + ftime = 0 + itime = 0 + rtime = 0 + + # run @bbrc + (0 .. @bbrc.GetNoRootNodes()-1).each do |j| + results = @bbrc.MineRoot(j) + results.each do |result| + rt = Time.now + f = YAML.load(result)[0] + smarts = f.shift + # convert fminer SMARTS representation into a more human readable format + smarts.gsub!(%r{\[#(\d+)&(\w)\]}) do + element = TABLE_OF_ELEMENTS[$1.to_i-1] + $2 == "a" ? element.downcase : element + end + p_value = f.shift + f.flatten! + +=begin + if (!@bbrc.GetRegression) + id_arrs = f[2..-1].flatten + max = OpenTox::Algorithm::Fminer.effect(f[2..-1].reverse, @fminer.db_class_sizes) # f needs reversal for bbrc + effect = max+1 + else #regression part + id_arrs = f[2] + # DV: effect calculation + f_arr=Array.new + f[2].each do |id| + id=id.keys[0] # extract id from hit count hash + f_arr.push(@fminer.all_activities[id]) + end + f_median=f_arr.to_scale.median + if g_median >= f_median + effect = 'activating' + else + effect = 'deactivating' + end + end +=end + rtime += Time.now - rt + + ft = Time.now + feature = OpenTox::FminerSmarts.find_or_create_by({ + "smarts" => smarts, + "p_value" => p_value.to_f.abs.round(5), + #"effect" => effect, + "dataset_id" => feature_dataset.id + }) + feature_dataset.feature_ids << feature.id + ftime += Time.now - ft + + it = Time.now + f.each do |id_count_hash| + id_count_hash.each do |id,count| + nr_hits ? count = count.to_i : count = 1 + feature_dataset.data_entries[id-1] ||= [] + feature_dataset.data_entries[id-1][feature_dataset.feature_ids.size-1] = count + end + end + itime += Time.now - it + + end + end + + $logger.debug "Fminer: #{Time.now-time} (read: #{rtime}, iterate: #{itime}, find/create Features: #{ftime})" + time = Time.now + + feature_dataset.fill_nil_with 0 + + $logger.debug "Prepare save: #{Time.now-time}" + time = Time.now + feature_dataset.save_all + + $logger.debug "Save: #{Time.now-time}" + feature_dataset + + end + end + end +end diff --git a/lib/classification.rb b/lib/classification.rb new file mode 100644 index 0000000..fc6fa77 --- /dev/null +++ b/lib/classification.rb @@ -0,0 +1,107 @@ +module OpenTox + module Algorithm + + class Classification + + def self.weighted_majority_vote neighbors + return [nil,nil] if neighbors.empty? + weighted_sum = {} + sim_sum = 0.0 + neighbors.each do |row| + n,sim,acts = row + acts.each do |act| + weighted_sum[act] ||= 0 + weighted_sum[act] += sim + end + end + case weighted_sum.size + when 1 + return [weighted_sum.keys.first, 1.0] + when 2 + sim_sum = weighted_sum[weighted_sum.keys[0]] + sim_sum -= weighted_sum[weighted_sum.keys[1]] + sim_sum > 0 ? prediction = weighted_sum.keys[0] : prediction = weighted_sum.keys[1] + confidence = (sim_sum/neighbors.size).abs + return [prediction,confidence] + else + bad_request_error "Cannot predict more than 2 classes, multinomial classifications is not yet implemented. Received classes were: '#{weighted.sum.keys}'" + end + end + + # Classification with majority vote from neighbors weighted by similarity + # @param [Hash] params Keys `:activities, :sims, :value_map` are required + # @return [Numeric] A prediction value. + def self.fminer_weighted_majority_vote neighbors, training_dataset + + neighbor_contribution = 0.0 + confidence_sum = 0.0 + + $logger.debug "Weighted Majority Vote Classification." + + values = neighbors.collect{|n| n[2]}.uniq + neighbors.each do |neighbor| + i = training_dataset.compound_ids.index n.id + neighbor_weight = neighbor[1] + activity = values.index(neighbor[2]) + 1 # map values to integers > 1 + neighbor_contribution += activity * neighbor_weight + if values.size == 2 # AM: provide compat to binary classification: 1=>false 2=>true + case activity + when 1 + confidence_sum -= neighbor_weight + when 2 + confidence_sum += neighbor_weight + end + else + confidence_sum += neighbor_weight + end + end + if values.size == 2 + if confidence_sum >= 0.0 + prediction = values[1] + elsif confidence_sum < 0.0 + prediction = values[0] + end + elsif values.size == 1 # all neighbors have the same value + prediction = values[0] + else + prediction = (neighbor_contribution/confidence_sum).round # AM: new multinomial prediction + end + + confidence = (confidence_sum/neighbors.size).abs + {:value => prediction, :confidence => confidence.abs} + end + + # Local support vector regression from neighbors + # @param [Hash] params Keys `:props, :activities, :sims, :min_train_performance` are required + # @return [Numeric] A prediction value. + def self.local_svm_classification(params) + + confidence = 0.0 + prediction = nil + + $logger.debug "Local SVM." + if params[:activities].size>0 + if params[:props] + n_prop = params[:props][0].collect.to_a + q_prop = params[:props][1].collect.to_a + props = [ n_prop, q_prop ] + end + activities = params[:activities].collect.to_a + activities = activities.collect{|v| "Val" + v.to_s} # Convert to string for R to recognize classification + prediction = local_svm_prop( props, activities, params[:min_train_performance]) # params[:props].nil? signals non-prop setting + prediction = prediction.sub(/Val/,"") if prediction # Convert back + confidence = 0.0 if prediction.nil? + #$logger.debug "Prediction: '" + prediction.to_s + "' ('#{prediction.class}')." + confidence = get_confidence({:sims => params[:sims][1], :activities => params[:activities]}) + end + {:prediction => prediction, :confidence => confidence} + + end + + + + end + + end +end + diff --git a/lib/compound.rb b/lib/compound.rb index 3ba1670..3418fcc 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -3,8 +3,6 @@ # Could not find contribution data file. CACTUS_URI="http://cactus.nci.nih.gov/chemical/structure/" -require 'openbabel' -require "base64" module OpenTox diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb new file mode 100644 index 0000000..d926cc4 --- /dev/null +++ b/lib/crossvalidation.rb @@ -0,0 +1,187 @@ +module OpenTox + + class CrossValidation + field :validation_ids, type: Array, default: [] + field :folds, type: Integer + field :nr_instances, type: Integer + field :nr_unpredicted, type: Integer + field :predictions, type: Array + field :finished_at, type: Time + end + + class ClassificationCrossValidation < CrossValidation + + field :accept_values, type: Array + field :confusion_matrix, type: Array + field :weighted_confusion_matrix, type: Array + field :accuracy, type: Float + field :weighted_accuracy, type: Float + field :true_rate, type: Hash + field :predictivity, type: Hash + # TODO auc, f-measure (usability??) + + def self.create model, n=10 + cv = self.new + validation_ids = [] + nr_instances = 0 + nr_unpredicted = 0 + predictions = [] + validation_class = Object.const_get(self.to_s.sub(/Cross/,'')) + accept_values = Feature.find(model.prediction_feature_id).accept_values + confusion_matrix = Array.new(accept_values.size,0){Array.new(accept_values.size,0)} + weighted_confusion_matrix = Array.new(accept_values.size,0){Array.new(accept_values.size,0)} + true_rate = {} + predictivity = {} + fold_nr = 1 + training_dataset = Dataset.find model.training_dataset_id + training_dataset.folds(n).each do |fold| + t = Time.now + $logger.debug "Fold #{fold_nr}" + validation = validation_class.create(model, fold[0], fold[1]) + validation_ids << validation.id + nr_instances += validation.nr_instances + nr_unpredicted += validation.nr_unpredicted + predictions += validation.predictions + validation.confusion_matrix.each_with_index do |r,i| + r.each_with_index do |c,j| + confusion_matrix[i][j] += c + weighted_confusion_matrix[i][j] += validation.weighted_confusion_matrix[i][j] + end + end + $logger.debug "Fold #{fold_nr}: #{Time.now-t} seconds" + fold_nr +=1 + end + true_rate = {} + predictivity = {} + accept_values.each_with_index do |v,i| + true_rate[v] = confusion_matrix[i][i]/confusion_matrix[i].reduce(:+).to_f + predictivity[v] = confusion_matrix[i][i]/confusion_matrix.collect{|n| n[i]}.reduce(:+).to_f + end + confidence_sum = 0 + weighted_confusion_matrix.each do |r| + r.each do |c| + confidence_sum += c + end + end + cv.update_attributes( + nr_instances: nr_instances, + nr_unpredicted: nr_unpredicted, + accept_values: accept_values, + confusion_matrix: confusion_matrix, + weighted_confusion_matrix: weighted_confusion_matrix, + accuracy: (confusion_matrix[0][0]+confusion_matrix[1][1])/(nr_instances-nr_unpredicted).to_f, + weighted_accuracy: (weighted_confusion_matrix[0][0]+weighted_confusion_matrix[1][1])/confidence_sum.to_f, + true_rate: true_rate, + predictivity: predictivity, + predictions: predictions.sort{|a,b| b[3] <=> a[3]}, # sort according to confidence + finished_at: Time.now + ) + cv.save + cv + end + + #Average area under roc 0.646 + #Area under roc 0.646 + #F measure carcinogen: 0.769, noncarcinogen: 0.348 + end + + class RegressionCrossValidation < Validation + + field :validation_ids, type: Array, default: [] + field :folds, type: Integer + field :rmse, type: Float + field :mae, type: Float + field :weighted_rmse, type: Float + field :weighted_mae, type: Float + + def self.create model, n=10 + cv = self.new + validation_ids = [] + nr_instances = 0 + nr_unpredicted = 0 + predictions = [] + validation_class = Object.const_get(self.to_s.sub(/Cross/,'')) + fold_nr = 1 + training_dataset = Dataset.find model.training_dataset_id + training_dataset.folds(n).each do |fold| + t = Time.now + $logger.debug "Predicting fold #{fold_nr}" + + validation = validation_class.create(model, fold[0], fold[1]) + validation_ids << validation.id + nr_instances += validation.nr_instances + nr_unpredicted += validation.nr_unpredicted + predictions += validation.predictions + $logger.debug "Fold #{fold_nr}: #{Time.now-t} seconds" + fold_nr +=1 + end + rmse = 0 + weighted_rmse = 0 + rse = 0 + weighted_rse = 0 + mae = 0 + weighted_mae = 0 + rae = 0 + weighted_rae = 0 + n = 0 + confidence_sum = 0 + predictions.each do |pred| + compound_id,activity,prediction,confidence = pred + if activity and prediction + error = prediction-activity + rmse += error**2 + weighted_rmse += confidence*error**2 + mae += error.abs + weighted_mae += confidence*error.abs + n += 1 + confidence_sum += confidence + else + # TODO: create warnings + p pred + end + end + mae = mae/n + weighted_mae = weighted_mae/confidence_sum + rmse = Math.sqrt(rmse/n) + weighted_rmse = Math.sqrt(weighted_rmse/confidence_sum) + cv.update_attributes( + folds: n, + validation_ids: validation_ids, + nr_instances: nr_instances, + nr_unpredicted: nr_unpredicted, + predictions: predictions.sort{|a,b| b[3] <=> a[3]}, + mae: mae, + rmse: rmse, + weighted_mae: weighted_mae, + weighted_rmse: weighted_rmse + ) + cv.save + cv + end + + def plot + # RMSE + x = predictions.collect{|p| p[1]} + y = predictions.collect{|p| p[2]} + R.assign "Measurement", x + R.assign "Prediction", y + R.eval "par(pty='s')" # sets the plot type to be square + #R.eval "fitline <- lm(log(Prediction) ~ log(Measurement))" + #R.eval "error <- log(Measurement)-log(Prediction)" + R.eval "error <- Measurement-Prediction" + R.eval "rmse <- sqrt(mean(error^2,na.rm=T))" + R.eval "mae <- mean( abs(error), na.rm = TRUE)" + R.eval "r <- cor(log(Prediction),log(Measurement))" + R.eval "svg(filename='/tmp/#{id.to_s}.svg')" + R.eval "plot(log(Prediction),log(Measurement),main='#{self.name}', sub=paste('RMSE: ',rmse, 'MAE :',mae, 'r^2: ',r^2),asp=1)" + #R.eval "plot(log(Prediction),log(Measurement),main='#{self.name}', sub=paste('RMSE: ',rmse, 'MAE :',mae, 'r^2: '),asp=1)" + #R.eval "plot(log(Prediction),log(Measurement),main='#{self.name}', ,asp=1)" + R.eval "abline(0,1,col='blue')" + #R.eval "abline(fitline,col='red')" + R.eval "dev.off()" + "/tmp/#{id.to_s}.svg" + end + end + + +end diff --git a/lib/dataset.rb b/lib/dataset.rb index 0237adf..4f6f0b5 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -294,8 +294,8 @@ module OpenTox end =end - private - + # Fill unset data entries + # @param any value def fill_nil_with n (0 .. compound_ids.size-1).each do |i| @data_entries[i] ||= [] diff --git a/lib/descriptor.rb b/lib/descriptor.rb index 68bc7a2..335f3dc 100644 --- a/lib/descriptor.rb +++ b/lib/descriptor.rb @@ -1,11 +1,12 @@ require 'digest/md5' ENV["JAVA_HOME"] ||= "/usr/lib/jvm/java-7-openjdk" -BABEL_3D_CACHE_DIR = File.join(File.dirname(__FILE__),"..",'/babel_3d_cache') # TODO store descriptors in mongodb module OpenTox module Algorithm + + # Class for descriptor calculations class Descriptor include OpenTox @@ -39,6 +40,7 @@ module OpenTox require_relative "unique_descriptors.rb" + # Description of available descriptors def self.description descriptor lib = descriptor.split('.').first case lib @@ -54,6 +56,7 @@ module OpenTox end end + # Match an array of smarts features def self.smarts_match compounds, smarts_features, count=false bad_request_error "Compounds for smarts_match are empty" unless compounds bad_request_error "Smarts features for smarts_match are empty" unless smarts_features @@ -73,7 +76,7 @@ module OpenTox # eg. at line 249 of rat_feature_dataset # which worked with opentox-client # (but no smarts_match) - p "'#{compound.inchi}'" + #p "'#{compound.inchi}'" obconversion.read_string(obmol,compound.inchi) @smarts.each_with_index do |smart,s| smarts_pattern.init(smart) @@ -88,49 +91,20 @@ module OpenTox serialize end + # Count matches of an array with smarts features def self.smarts_count compounds, smarts + # TODO: non-overlapping matches? smarts_match compounds,smarts,true end - def self.serialize - case @input_class - when "OpenTox::Compound" - if @with_names and @physchem_descriptors - [@physchem_descriptors,@data_entries.first] - else - @data_entries.first - end - when "Array" - if @with_names and @physchem_descriptors - [@physchem_descriptors,@data_entries.first] - else - @data_entries - end - when "OpenTox::Dataset" - dataset = OpenTox::DescriptorDataset.new(:compound_ids => @compounds.collect{|c| c.id}) - if @smarts - dataset.feature_ids = @smarts.collect{|smart| Smarts.find_or_create_by(:smarts => smart).id} - @count ? algo = "count" : algo = "match" - dataset.feature_calculation_algorithm = "#{self}.smarts_#{algo}" - - elsif @physchem_descriptors - dataset.feature_ids = @physchem_descriptors.collect{|d| PhysChemDescriptor.find_or_create_by(:name => d, :creator => __FILE__).id} - dataset.data_entries = @data_entries - dataset.feature_calculation_algorithm = "#{self}.physchem" - #TODO params? - end - dataset.save_all - dataset - end - end - - def self.physchem compounds, descriptors=UNIQUEDESCRIPTORS, with_names=false + # Calculate physchem descriptors + # @param [OpenTox::Compound,Array,OpenTox::Dataset] input object, either a compound, an array of compounds or a dataset + def self.physchem compounds, descriptors=UNIQUEDESCRIPTORS parse compounds @data_entries = Array.new(@compounds.size){[]} @descriptors = descriptors @smarts = nil @physchem_descriptors = [] # CDK may return more than one result per descriptor, they are stored as separate features - @with_names = with_names des = {} @descriptors.each do |d| lib, descriptor = d.split(".",2) @@ -173,7 +147,8 @@ module OpenTox end last_feature_idx = @physchem_descriptors.size YAML.load_file("#{sdf}#{lib}.yaml").each_with_index do |calculation,i| - $logger.error "Descriptor calculation failed for compound #{compounds[i].inchi}." if calculation.empty? + # TODO create warnings + #$logger.error "Descriptor calculation failed for compound #{@compounds[i].inchi}." if calculation.empty? # CDK Descriptors may calculate multiple values, they are stored in separate features @physchem_descriptors += calculation.keys if i == 0 calculation.keys.each_with_index do |name,j| @@ -238,6 +213,30 @@ module OpenTox end end + def self.serialize + case @input_class + when "OpenTox::Compound" + @data_entries.first + when "Array" + @data_entries + when "OpenTox::Dataset" + dataset = OpenTox::DescriptorDataset.new(:compound_ids => @compounds.collect{|c| c.id}) + if @smarts + dataset.feature_ids = @smarts.collect{|smart| Smarts.find_or_create_by(:smarts => smart).id} + @count ? algo = "count" : algo = "match" + dataset.feature_calculation_algorithm = "#{self}.smarts_#{algo}" + + elsif @physchem_descriptors + dataset.feature_ids = @physchem_descriptors.collect{|d| PhysChemDescriptor.find_or_create_by(:name => d, :creator => __FILE__).id} + dataset.data_entries = @data_entries + dataset.feature_calculation_algorithm = "#{self}.physchem" + #TODO params? + end + dataset.save_all + dataset + end + end + def self.fix_value val val = val.first if val.is_a? Array and val.size == 1 val = nil if val == "NaN" diff --git a/lib/feature.rb b/lib/feature.rb index 9deb199..b2bc1f5 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -29,6 +29,9 @@ module OpenTox # Feature for SMARTS fragments class Smarts < NominalFeature field :smarts, type: String + def self.from_smarts smarts + self.find_or_create_by :smarts => smarts + end end # Feature for supervised fragments from Fminer algorithm diff --git a/lib/lazar.rb b/lib/lazar.rb index 8831ba2..2e7e7c2 100644 --- a/lib/lazar.rb +++ b/lib/lazar.rb @@ -6,6 +6,9 @@ require 'json' require 'logger' require 'mongoid' require 'rserve' +require "nokogiri" +require "base64" + # Mongo setup # TODO retrieve correct environment from Rack/Sinatra @@ -27,8 +30,21 @@ Mongo::Logger.logger = $logger Mongo::Logger.level = Logger::WARN #Mongoid.logger = $logger +# Require sub-Repositories +require_relative '../libfminer/libbbrc/bbrc' # include before openbabel +require_relative '../libfminer/liblast/last' # +require_relative '../last-utils/lu.rb' +require 'openbabel' + +# Fminer environment variables +ENV['FMINER_SMARTS'] = 'true' +ENV['FMINER_NO_AROMATIC'] = 'true' +ENV['FMINER_PVALUES'] = 'true' +ENV['FMINER_SILENT'] = 'true' +ENV['FMINER_NR_HITS'] = 'true' + # OpenTox classes and includes -CLASSES = ["Feature","Compound", "Dataset", "Validation", "CrossValidation"]# Algorithm and Models are modules +CLASSES = ["Feature","Compound","Dataset","Validation","CrossValidation"]# Algorithm and Models are modules [ # be aware of the require sequence as it affects class/method overwrites "overwrite.rb", @@ -39,8 +55,15 @@ CLASSES = ["Feature","Compound", "Dataset", "Validation", "CrossValidation"]# A "compound.rb", "dataset.rb", "descriptor.rb", - #"algorithm.rb", - #"model.rb", - #"validation.rb" + "algorithm.rb", + "descriptor.rb", + "bbrc.rb", + "lazar.rb", + "similarity.rb", + "neighbor.rb", + "classification.rb", + "regression.rb", + "validation.rb", + "crossvalidation.rb", ].each{ |f| require_relative f } diff --git a/lib/neighbor.rb b/lib/neighbor.rb new file mode 100644 index 0000000..a2c28d4 --- /dev/null +++ b/lib/neighbor.rb @@ -0,0 +1,25 @@ +module OpenTox + module Algorithm + class Neighbor + + def self.fingerprint_similarity compound, params={} + compound.neighbors params[:min_sim] + end + + def self.fminer_similarity compound, params + feature_dataset = Dataset.find params[:feature_dataset_id] + query_fingerprint = Algorithm::Descriptor.smarts_match(compound, feature_dataset.features.collect{|f| f.smarts} ) + neighbors = [] + + # find neighbors + feature_dataset.data_entries.each_with_index do |fingerprint, i| + sim = Algorithm::Similarity.tanimoto fingerprint, query_fingerprint + if sim > params[:min_sim] + neighbors << [feature_dataset.compound_ids[i],sim] # use compound_ids, instantiation of Compounds is too time consuming + end + end + neighbors + end + end + end +end diff --git a/lib/regression.rb b/lib/regression.rb new file mode 100644 index 0000000..891d7f9 --- /dev/null +++ b/lib/regression.rb @@ -0,0 +1,199 @@ +# TODO install R packages kernlab, caret, doMC, class, e1071 + + + # log transform activities (create new dataset) + # scale, normalize features, might not be necessary + # http://stats.stackexchange.com/questions/19216/variables-are-often-adjusted-e-g-standardised-before-making-a-model-when-is + # http://stats.stackexchange.com/questions/7112/when-and-how-to-use-standardized-explanatory-variables-in-linear-regression + # zero-order correlation and the semi-partial correlation + # seems to be necessary for svm + # http://stats.stackexchange.com/questions/77876/why-would-scaling-features-decrease-svm-performance?lq=1 + # http://stackoverflow.com/questions/15436367/svm-scaling-input-values + # use lasso or elastic net?? + # select relevant features + # remove features with a single value + # remove correlated features + # remove features not correlated with endpoint +module OpenTox + module Algorithm + + class Regression + + def self.weighted_average neighbors + weighted_sum = 0.0 + sim_sum = 0.0 + neighbors.each do |row| + n,sim,acts = row + acts.each do |act| + weighted_sum += sim*Math.log10(act) + sim_sum += sim + end + end + confidence = sim_sum/neighbors.size.to_f + sim_sum == 0 ? prediction = nil : prediction = 10**(weighted_sum/sim_sum) + [prediction,confidence] + end + + # Local support vector regression from neighbors + # @param [Hash] params Keys `:props, :activities, :sims, :min_train_performance` are required + # @return [Numeric] A prediction value. + def self.local_svm_regression neighbors, params={:min_train_performance => 0.1} + + confidence = 0.0 + prediction = nil + + $logger.debug "Local SVM." + props = neighbors.collect{|row| row[3] } + neighbors.shift + activities = neighbors.collect{|n| n[2]} + prediction = self.local_svm_prop( props, activities, params[:min_train_performance]) # params[:props].nil? signals non-prop setting + prediction = nil if (!prediction.nil? && prediction.infinite?) + $logger.debug "Prediction: '#{prediction}' ('#{prediction.class}')." + if prediction + confidence = get_confidence({:sims => neighbors.collect{|n| n[1]}, :activities => activities}) + else + confidence = nil if prediction.nil? + end + [prediction, confidence] + + end + + + # Local support vector prediction from neighbors. + # Uses propositionalized setting. + # Not to be called directly (use local_svm_regression or local_svm_classification). + # @param [Array] props, propositionalization of neighbors and query structure e.g. [ Array_for_q, two-nested-Arrays_for_n ] + # @param [Array] activities, activities for neighbors. + # @param [Float] min_train_performance, parameter to control censoring + # @return [Numeric] A prediction value. + def self.local_svm_prop(props, activities, min_train_performance) + + $logger.debug "Local SVM (Propositionalization / Kernlab Kernel)." + n_prop = props[1..-1] # is a matrix, i.e. two nested Arrays. + q_prop = props[0] # is an Array. + + prediction = nil + if activities.uniq.size == 1 + prediction = activities[0] + else + t = Time.now + #$logger.debug gram_matrix.to_yaml + #@r = RinRuby.new(true,false) # global R instance leads to Socket errors after a large number of requests + @r = Rserve::Connection.new#(true,false) # global R instance leads to Socket errors after a large number of requests + rs = [] + ["caret", "doMC", "class"].each do |lib| + #raise "failed to load R-package #{lib}" unless @r.void_eval "suppressPackageStartupMessages(library('#{lib}'))" + rs << "suppressPackageStartupMessages(library('#{lib}'))" + end + #@r.eval "registerDoMC()" # switch on parallel processing + rs << "registerDoMC()" # switch on parallel processing + #@r.eval "set.seed(1)" + rs << "set.seed(1)" + $logger.debug "Loading R packages: #{Time.now-t}" + t = Time.now + p n_prop + begin + + # set data + rs << "n_prop <- c(#{n_prop.flatten.join(',')})" + rs << "n_prop <- c(#{n_prop.flatten.join(',')})" + rs << "n_prop_x_size <- c(#{n_prop.size})" + rs << "n_prop_y_size <- c(#{n_prop[0].size})" + rs << "y <- c(#{activities.join(',')})" + rs << "q_prop <- c(#{q_prop.join(',')})" + rs << "y = matrix(y)" + rs << "prop_matrix = matrix(n_prop, n_prop_x_size, n_prop_y_size, byrow=T)" + rs << "q_prop = matrix(q_prop, 1, n_prop_y_size, byrow=T)" + + $logger.debug "Setting R data: #{Time.now-t}" + t = Time.now + # prepare data + rs << " + weights=NULL + if (!(class(y) == 'numeric')) { + y = factor(y) + weights=unlist(as.list(prop.table(table(y)))) + weights=(weights-1)^2 + } + " + + rs << " + rem = nearZeroVar(prop_matrix) + if (length(rem) > 0) { + prop_matrix = prop_matrix[,-rem,drop=F] + q_prop = q_prop[,-rem,drop=F] + } + rem = findCorrelation(cor(prop_matrix)) + if (length(rem) > 0) { + prop_matrix = prop_matrix[,-rem,drop=F] + q_prop = q_prop[,-rem,drop=F] + } + " + + #p @r.eval("y").to_ruby + #p "weights" + #p @r.eval("weights").to_ruby + $logger.debug "Preparing R data: #{Time.now-t}" + t = Time.now + # model + support vectors + #train_success = @r.eval <<-EOR + rs << ' + model = train(prop_matrix,y, + method="svmRadial", + preProcess=c("center", "scale"), + class.weights=weights, + trControl=trainControl(method="LGOCV",number=10), + tuneLength=8 + ) + perf = ifelse ( class(y)!="numeric", max(model$results$Accuracy), model$results[which.min(model$results$RMSE),]$Rsquared ) + ' + File.open("/tmp/r.r","w+"){|f| f.puts rs.join("\n")} + p rs.join("\n") + p `Rscript /tmp/r.r` +=begin + @r.void_eval <<-EOR + model = train(prop_matrix,y, + method="svmRadial", + #preProcess=c("center", "scale"), + #class.weights=weights, + #trControl=trainControl(method="LGOCV",number=10), + #tuneLength=8 + ) + perf = ifelse ( class(y)!='numeric', max(model$results$Accuracy), model$results[which.min(model$results$RMSE),]$Rsquared ) + EOR +=end + + $logger.debug "Creating R SVM model: #{Time.now-t}" + t = Time.now + if train_success + # prediction + @r.eval "predict(model,q_prop); p = predict(model,q_prop)" # kernlab bug: predict twice + #@r.eval "p = predict(model,q_prop)" # kernlab bug: predict twice + @r.eval "if (class(y)!='numeric') p = as.character(p)" + prediction = @r.p + + # censoring + prediction = nil if ( @r.perf.nan? || @r.perf < min_train_performance.to_f ) + prediction = nil if prediction =~ /NA/ + $logger.debug "Performance: '#{sprintf("%.2f", @r.perf)}'" + else + $logger.debug "Model creation failed." + prediction = nil + end + $logger.debug "R Prediction: #{Time.now-t}" + rescue Exception => e + $logger.debug "#{e.class}: #{e.message}" + $logger.debug "Backtrace:\n\t#{e.backtrace.join("\n\t")}" + ensure + #puts @r.inspect + #TODO: broken pipe + #@r.quit # free R + end + end + prediction + end + end + + end +end + diff --git a/lib/similarity.rb b/lib/similarity.rb new file mode 100644 index 0000000..91e18db --- /dev/null +++ b/lib/similarity.rb @@ -0,0 +1,58 @@ +=begin +* Name: similarity.rb +* Description: Similarity algorithms +* Author: Andreas Maunz 0 and b.size>0 + if a.size>12 && b.size>12 + a = a[0..11] + b = b[0..11] + end + a_vec = a.to_gv + b_vec = b.to_gv + val = a_vec.dot(b_vec) / (a_vec.norm * b_vec.norm) + end + val + end + + end + + end +end diff --git a/lib/validation.rb b/lib/validation.rb new file mode 100644 index 0000000..bcbe49a --- /dev/null +++ b/lib/validation.rb @@ -0,0 +1,114 @@ +module OpenTox + + class Validation + + field :prediction_dataset_id, type: BSON::ObjectId + field :test_dataset_id, type: BSON::ObjectId + field :nr_instances, type: Integer + field :nr_unpredicted, type: Integer + field :predictions, type: Array + + def prediction_dataset + Dataset.find prediction_dataset_id + end + + def test_dataset + Dataset.find test_dataset_id + end + + end + + class ClassificationValidation < Validation + field :accept_values, type: String + field :confusion_matrix, type: Array + field :weighted_confusion_matrix, type: Array + + def self.create model, training_set, test_set + validation = self.class.new + #feature_dataset = Dataset.find model.feature_dataset_id + # TODO check and delegate to Algorithm + #features = Algorithm.run feature_dataset.training_algorithm, training_set, feature_dataset.training_parameters + validation_model = model.class.create training_set#, features + test_set_without_activities = Dataset.new(:compound_ids => test_set.compound_ids) # just to be sure that activities cannot be used + prediction_dataset = validation_model.predict test_set_without_activities + accept_values = prediction_dataset.prediction_feature.accept_values + confusion_matrix = Array.new(accept_values.size,0){Array.new(accept_values.size,0)} + weighted_confusion_matrix = Array.new(accept_values.size,0){Array.new(accept_values.size,0)} + predictions = [] + nr_unpredicted = 0 + prediction_dataset.data_entries.each_with_index do |pe,i| + if pe[0] and pe[1] and pe[1].numeric? + prediction = pe[0] + # TODO prediction_feature, convention?? + # TODO generalize for multiple classes + activity = test_set.data_entries[i].first + confidence = prediction_dataset.data_entries[i][1] + predictions << [prediction_dataset.compound_ids[i], activity, prediction, confidence] + if prediction == activity + if prediction == accept_values[0] + confusion_matrix[0][0] += 1 + weighted_confusion_matrix[0][0] += confidence + elsif prediction == accept_values[1] + confusion_matrix[1][1] += 1 + weighted_confusion_matrix[1][1] += confidence + end + elsif prediction != activity + if prediction == accept_values[0] + confusion_matrix[0][1] += 1 + weighted_confusion_matrix[0][1] += confidence + elsif prediction == accept_values[1] + confusion_matrix[1][0] += 1 + weighted_confusion_matrix[1][0] += confidence + end + end + else + nr_unpredicted += 1 if pe[0].nil? + end + end + validation = self.new( + :prediction_dataset_id => prediction_dataset.id, + :test_dataset_id => test_set.id, + :nr_instances => test_set.compound_ids.size, + :nr_unpredicted => nr_unpredicted, + :accept_values => accept_values, + :confusion_matrix => confusion_matrix, + :weighted_confusion_matrix => weighted_confusion_matrix, + :predictions => predictions.sort{|a,b| b[3] <=> a[3]} # sort according to confidence + ) + validation.save + validation + end + end + + class RegressionValidation < Validation + def self.create model, training_set, test_set + + validation_model = Model::LazarRegression.create training_set + test_set_without_activities = Dataset.new(:compound_ids => test_set.compound_ids) # just to be sure that activities cannot be used + prediction_dataset = validation_model.predict test_set_without_activities + predictions = [] + nr_unpredicted = 0 + activities = test_set.data_entries.collect{|de| de.first} + prediction_dataset.data_entries.each_with_index do |de,i| + if de[0] and de[1] and de[1].numeric? + activity = activities[i] + prediction = de.first + confidence = de[1] + predictions << [prediction_dataset.compound_ids[i], activity, prediction,confidence] + else + nr_unpredicted += 1 + end + end + validation = self.new( + :prediction_dataset_id => prediction_dataset.id, + :test_dataset_id => test_set.id, + :nr_instances => test_set.compound_ids.size, + :nr_unpredicted => nr_unpredicted, + :predictions => predictions.sort{|a,b| b[3] <=> a[3]} # sort according to confidence + ) + validation.save + validation + end + end + +end diff --git a/test/descriptor-long.rb b/test/descriptor-long.rb new file mode 100644 index 0000000..2752d5a --- /dev/null +++ b/test/descriptor-long.rb @@ -0,0 +1,13 @@ +require_relative "setup.rb" +class DescriptorLongTest < MiniTest::Test + + def test_dataset_all + dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"hamster_carcinogenicity.mini.csv") + d = OpenTox::Algorithm::Descriptor.physchem dataset + assert_equal dataset.compounds, d.compounds + assert_equal 332, d.features.size + assert_equal 332, d.data_entries.first.size + d.delete + end + +end diff --git a/test/descriptor.rb b/test/descriptor.rb new file mode 100644 index 0000000..1143b87 --- /dev/null +++ b/test/descriptor.rb @@ -0,0 +1,83 @@ +require_relative "setup.rb" + +class DescriptorTest < MiniTest::Test + + def test_list + # check available descriptors + @descriptors = OpenTox::Algorithm::Descriptor::DESCRIPTORS.keys + assert_equal 111,@descriptors.size,"wrong num physchem descriptors" + @descriptor_values = OpenTox::Algorithm::Descriptor::DESCRIPTOR_VALUES + assert_equal 356,@descriptor_values.size,"wrong num physchem descriptors" + sum = 0 + [ @descriptors, @descriptor_values ].each do |desc| + {"Openbabel"=>16,"Cdk"=>(desc==@descriptors ? 50 : 295),"Joelib"=>45}.each do |k,v| + assert_equal v,desc.select{|x| x=~/^#{k}\./}.size,"wrong num #{k} descriptors" + sum += v + end + end + assert_equal (111+356),sum + end + + def test_smarts + c = OpenTox::Compound.from_smiles "N=C=C1CCC(=F=FO)C1" + s = Smarts.find_or_create_by(:smarts => "FF") + result = OpenTox::Algorithm::Descriptor.smarts_match c, s + assert_equal [1], result + smarts = ["CC", "C", "C=C", "CO", "FF", "C1CCCC1", "NN"].collect{|s| Smarts.find_or_create_by(:smarts => s)} + result = OpenTox::Algorithm::Descriptor.smarts_match c, smarts + assert_equal [1, 1, 1, 0, 1, 1, 0], result + smarts_count = [10, 6, 2, 0, 2, 10, 0] + result = OpenTox::Algorithm::Descriptor.smarts_count c, smarts + assert_equal smarts_count, result + end + + def test_compound_openbabel_single + c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" + result = OpenTox::Algorithm::Descriptor.physchem c, ["Openbabel.logP"] + assert_equal [1.12518], result + end + + def test_compound_cdk_single + c = OpenTox::Compound.from_smiles "c1ccccc1" + result = OpenTox::Algorithm::Descriptor.physchem c, ["Cdk.AtomCount"] + assert_equal [12], result + c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" + result = OpenTox::Algorithm::Descriptor.physchem c, ["Cdk.AtomCount"] + assert_equal [17], result + result = OpenTox::Algorithm::Descriptor.physchem c, ["Cdk.CarbonTypes"] + c_types = {"Cdk.CarbonTypes.C1SP1"=>1, "Cdk.CarbonTypes.C2SP1"=>0, "Cdk.CarbonTypes.C1SP2"=>0, "Cdk.CarbonTypes.C2SP2"=>1, "Cdk.CarbonTypes.C3SP2"=>0, "Cdk.CarbonTypes.C1SP3"=>2, "Cdk.CarbonTypes.C2SP3"=>1, "Cdk.CarbonTypes.C3SP3"=>1, "Cdk.CarbonTypes.C4SP3"=>0} + assert_equal [1, 0, 0, 1, 0, 2, 1, 1, 0], result + end + + def test_compound_joelib_single + c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" + result = OpenTox::Algorithm::Descriptor.physchem c, ["Joelib.LogP"] + assert_equal [2.65908], result + end + + def test_compound_all + c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" + result = OpenTox::Algorithm::Descriptor.physchem c + assert_equal 332, result.size + assert_equal 30.8723, result[2] + assert_equal 1.12518, result[328] + end + + def test_compound_descriptor_parameters + c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" + result = OpenTox::Algorithm::Descriptor.physchem c, [ "Openbabel.logP", "Cdk.AtomCount", "Cdk.CarbonTypes", "Joelib.LogP" ], true + assert_equal 12, result.last.size + assert_equal ["Openbabel.logP", "Cdk.AtomCount.nAtom", "Cdk.CarbonTypes.C1SP1", "Cdk.CarbonTypes.C2SP1", "Cdk.CarbonTypes.C1SP2", "Cdk.CarbonTypes.C2SP2", "Cdk.CarbonTypes.C3SP2", "Cdk.CarbonTypes.C1SP3", "Cdk.CarbonTypes.C2SP3", "Cdk.CarbonTypes.C3SP3", "Cdk.CarbonTypes.C4SP3", "Joelib.LogP"], result.first + assert_equal [1.12518, 17, 1, 0, 0, 1, 0, 2, 1, 1, 0, 2.65908], result.last + end + + def test_dataset_descriptor_parameters + dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"hamster_carcinogenicity.mini.csv") + d = OpenTox::Algorithm::Descriptor.physchem dataset, [ "Openbabel.logP", "Cdk.AtomCount", "Cdk.CarbonTypes", "Joelib.LogP" ] + assert_kind_of Dataset, d + assert_equal dataset.compounds, d.compounds + assert_equal dataset.compounds.size, d.data_entries.size + assert_equal 12, d.data_entries.first.size + end + +end diff --git a/test/fminer-long.rb b/test/fminer-long.rb new file mode 100644 index 0000000..826f206 --- /dev/null +++ b/test/fminer-long.rb @@ -0,0 +1,37 @@ +require_relative "setup.rb" + +class FminerTest < MiniTest::Test + + def test_fminer_multicell + skip "multicell segfaults" + # TODO aborts, probably fminer + # or OpenBabel segfault + dataset = OpenTox::Dataset.new + #multi_cell_call.csv + dataset.upload File.join(DATA_DIR,"multi_cell_call.csv") + feature_dataset = OpenTox::Algorithm::Fminer.bbrc(dataset)#, :min_frequency => 15) + dataset.delete + feature_dataset.delete + end + + def test_fminer_isscan + dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"ISSCAN-multi.csv") + feature_dataset = OpenTox::Algorithm::Fminer.bbrc(dataset)#, :min_frequency => 15) + assert_equal feature_dataset.compounds.size, dataset.compounds.size + p feature_dataset + dataset.delete + feature_dataset.delete + end + + def test_fminer_kazius + dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"kazius.csv") + # TODO reactivate default settings + feature_dataset = OpenTox::Algorithm::Fminer.bbrc(dataset, :min_frequency => 20) + assert_equal feature_dataset.compounds.size, dataset.compounds.size + feature_dataset = Dataset.find feature_dataset.id + assert feature_dataset.data_entries.size, dataset.compounds.size + dataset.delete + feature_dataset.delete + end + +end diff --git a/test/fminer.rb b/test/fminer.rb new file mode 100644 index 0000000..17dcbe1 --- /dev/null +++ b/test/fminer.rb @@ -0,0 +1,46 @@ +require_relative "setup.rb" + +class FminerTest < MiniTest::Test + + def test_fminer_bbrc + dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"hamster_carcinogenicity.csv") + refute_nil dataset.id + feature_dataset = OpenTox::Algorithm::Fminer.bbrc dataset + feature_dataset = Dataset.find feature_dataset.id + assert_equal dataset.compounds.size, feature_dataset.compounds.size + assert_equal 54, feature_dataset.features.size + assert_equal "C-C-C=C", feature_dataset.features.first.smarts + compounds = feature_dataset.compounds + smarts = feature_dataset.features + match = OpenTox::Algorithm::Descriptor.smarts_match compounds, smarts + feature_dataset.data_entries.each_with_index do |fingerprint,i| + assert_equal match[i], fingerprint + end + + dataset.delete + feature_dataset.delete + end + + def test_fminer_last + skip "last features have to be activated" + dataset = OpenTox::Dataset.new + dataset.upload File.join(DATA_DIR,"hamster_carcinogenicity.csv") + feature_dataset = OpenTox::Algorithm::Fminer.last :dataset => dataset + assert_equal dataset.compounds.size, feature_dataset.compounds.size + assert_equal 21, feature_dataset.features.size + assert_equal '[#6&A]-[#6&a]:[#6&a]:[#6&a]:[#6&a]:[#6&a]', feature_dataset.features.first.smarts + + compounds = feature_dataset.compounds + smarts = feature_dataset.features.collect{|f| f.smarts} + match = OpenTox::Algorithm::Descriptor.smarts_match compounds, smarts + compounds.each_with_index do |c,i| + smarts.each_with_index do |s,j| + assert_equal match[i][j], feature_dataset.data_entries[i][j].to_i + end + end + + dataset.delete + feature_dataset.delete + end + +end -- cgit v1.2.3 From 6ab86c253ba0eb79b9e6a20effa2d18626accf2b Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 13 Aug 2015 11:56:40 +0200 Subject: OpenBabel can (canonical smiles) instead of inchi as internal identifier to avoid OpenBabel InChi bug. --- lazar.gemspec | 2 +- lib/compound.rb | 54 +++++++--- lib/descriptor.rb | 8 +- lib/lazar-model.rb | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib/lazar.rb | 2 +- lib/neighbor.rb | 2 +- lib/overwrite.rb | 6 ++ test/compound.rb | 18 +++- test/lazar-fminer.rb | 51 +++++++++ test/validation.rb | 41 ++++++++ 10 files changed, 445 insertions(+), 26 deletions(-) create mode 100644 lib/lazar-model.rb create mode 100644 test/lazar-fminer.rb create mode 100644 test/validation.rb diff --git a/lazar.gemspec b/lazar.gemspec index 3a9a1af..7a90080 100644 --- a/lazar.gemspec +++ b/lazar.gemspec @@ -2,7 +2,7 @@ $:.push File.expand_path("../lib", __FILE__) Gem::Specification.new do |s| - s.name = "opentox-client" + s.name = "lazar" s.version = File.read("./VERSION").strip s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler, Denis Gebele"] s.email = ["helma@in-silico.ch"] diff --git a/lib/compound.rb b/lib/compound.rb index 3418fcc..5343aa0 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -10,13 +10,13 @@ module OpenTox include OpenTox field :inchi, type: String - attr_readonly :inchi field :smiles, type: String field :inchikey, type: String field :names, type: Array field :cid, type: String field :chemblid, type: String - field :image_id, type: BSON::ObjectId + field :png_id, type: BSON::ObjectId + field :svg_id, type: BSON::ObjectId field :sdf_id, type: BSON::ObjectId field :fp4, type: Array field :fp4_size, type: Integer @@ -46,14 +46,18 @@ module OpenTox # @return [OpenTox::Compound] Compound def self.from_smiles smiles # do not store smiles because it might be noncanonical - Compound.find_or_create_by :inchi => obconversion(smiles,"smi","inchi") + Compound.find_or_create_by :smiles => obconversion(smiles,"smi","can") end # Create a compound from inchi string # @param inchi [String] smiles InChI string # @return [OpenTox::Compound] Compound def self.from_inchi inchi - Compound.find_or_create_by :inchi => inchi + # Temporary workaround for OpenBabels Inchi bug + # http://sourceforge.net/p/openbabel/bugs/957/ + # bug has not been fixed in latest git/development version + smiles = `echo "#{inchi}" | babel -iinchi - -ocan`.chomp.strip + smiles.empty? ? nil : Compound.find_or_create_by(:smiles => smiles, :inchi => inchi) end # Create a compound from sdf string @@ -61,7 +65,7 @@ module OpenTox # @return [OpenTox::Compound] Compound def self.from_sdf sdf # do not store sdf because it might be 2D - Compound.find_or_create_by :inchi => obconversion(sdf,"sdf","inchi") + Compound.find_or_create_by :smiles => obconversion(sdf,"sdf","can") end # Create a compound from name. Relies on an external service for name lookups. @@ -70,20 +74,30 @@ module OpenTox # @param name [String] can be also an InChI/InChiKey, CAS number, etc # @return [OpenTox::Compound] Compound def self.from_name name - Compound.find_or_create_by :inchi => RestClientWrapper.get(File.join(CACTUS_URI,URI.escape(name),"stdinchi")) + Compound.find_or_create_by :smiles => RestClientWrapper.get(File.join(CACTUS_URI,URI.escape(name),"smiles")) end - # Get InChIKey + # Get InChI # @return [String] InChI string + def inchi + unless self["inchi"] + result = `echo "#{self.smiles}" | babel -ismi - -oinchi`.chomp + update(:inchi => result.chomp) unless result.empty? + end + self["inchi"] + end + + # Get InChIKey + # @return [String] InChIKey string def inchikey - update(:inchikey => obconversion(inchi,"inchi","inchikey")) unless self["inchikey"] + update(:inchikey => obconversion(smiles,"smi","inchikey")) unless self["inchikey"] self["inchikey"] end # Get (canonical) smiles # @return [String] Smiles string def smiles - update(:smiles => obconversion(inchi,"inchi","smi")) unless self["smiles"] # should give canonical smiles, "can" seems to give incorrect results + update(:smiles => obconversion(self["smiles"],"smi","can")) #unless self["smiles"] # should give canonical smiles, "can" seems to give incorrect results self["smiles"] end @@ -91,7 +105,7 @@ module OpenTox # @return [String] SDF string def sdf if self.sdf_id.nil? - sdf = obconversion(inchi,"inchi","sdf") + sdf = obconversion(smiles,"smi","sdf") file = Mongo::Grid::File.new(sdf, :filename => "#{id}.sdf",:content_type => "chemical/x-mdl-sdfile") sdf_id = $gridfs.insert_one file update :sdf_id => sdf_id @@ -99,17 +113,29 @@ module OpenTox $gridfs.find_one(_id: self.sdf_id).data end + # Get SVG image + # @return [image/svg] Image data + def svg + if self.svg_id.nil? + svg = obconversion(smiles,"smi","svg") + file = Mongo::Grid::File.new(svg, :filename => "#{id}.svg", :content_type => "image/svg") + update(:image_id => $gridfs.insert_one(file)) + end + $gridfs.find_one(_id: self.svg_id).data + + end + # Get png image # @example # image = compound.png # @return [image/png] Image data def png - if self.image_id.nil? - png = obconversion(inchi,"inchi","_png2") + if self.png_id.nil? + png = obconversion(smiles,"smi","_png2") file = Mongo::Grid::File.new(Base64.encode64(png), :filename => "#{id}.png", :content_type => "image/png") - update(:image_id => $gridfs.insert_one(file)) + update(:png_id => $gridfs.insert_one(file)) end - Base64.decode64($gridfs.find_one(_id: self.image_id).data) + Base64.decode64($gridfs.find_one(_id: self.png_id).data) end diff --git a/lib/descriptor.rb b/lib/descriptor.rb index 335f3dc..f0492a2 100644 --- a/lib/descriptor.rb +++ b/lib/descriptor.rb @@ -64,7 +64,7 @@ module OpenTox @count = count obconversion = OpenBabel::OBConversion.new obmol = OpenBabel::OBMol.new - obconversion.set_in_format('inchi') + obconversion.set_in_format('smi') smarts_pattern = OpenBabel::OBSmartsPattern.new smarts_features = [smarts_features] if smarts_features.is_a?(Feature) @smarts = smarts_features.collect{|f| f.smarts} @@ -77,7 +77,7 @@ module OpenTox # which worked with opentox-client # (but no smarts_match) #p "'#{compound.inchi}'" - obconversion.read_string(obmol,compound.inchi) + obconversion.read_string(obmol,compound.smiles) @smarts.each_with_index do |smart,s| smarts_pattern.init(smart) if smarts_pattern.match(obmol) @@ -123,10 +123,10 @@ module OpenTox obdescriptors = descriptors.collect{|d| OpenBabel::OBDescriptor.find_type d} obmol = OpenBabel::OBMol.new obconversion = OpenBabel::OBConversion.new - obconversion.set_in_format 'inchi' + obconversion.set_in_format 'smi' last_feature_idx = @physchem_descriptors.size @compounds.each_with_index do |compound,c| - obconversion.read_string obmol, compound.inchi + obconversion.read_string obmol, compound.smiles obdescriptors.each_with_index do |descriptor,d| @data_entries[c][d+last_feature_idx] = fix_value(descriptor.predict(obmol)) end diff --git a/lib/lazar-model.rb b/lib/lazar-model.rb new file mode 100644 index 0000000..4ca3403 --- /dev/null +++ b/lib/lazar-model.rb @@ -0,0 +1,287 @@ +module OpenTox + + module Model + + class Lazar + include OpenTox + include Mongoid::Document + include Mongoid::Timestamps + store_in collection: "models" + + field :title, type: String + field :endpoint, type: String + field :creator, type: String, default: __FILE__ + # datasets + field :training_dataset_id, type: BSON::ObjectId + # algorithms + field :prediction_algorithm, type: String + field :neighbor_algorithm, type: String + field :neighbor_algorithm_parameters, type: Hash + # prediction feature + field :prediction_feature_id, type: BSON::ObjectId + + attr_accessor :prediction_dataset + attr_accessor :training_dataset + + # Create a lazar model from a training_dataset and a feature_dataset + # @param [OpenTox::Dataset] training_dataset + # @return [OpenTox::Model::Lazar] Regression or classification model + def self.create training_dataset + + bad_request_error "More than one prediction feature found in training_dataset #{training_dataset.id}" unless training_dataset.features.size == 1 + + # TODO document convention + prediction_feature = training_dataset.features.first + prediction_feature.nominal ? lazar = OpenTox::Model::LazarClassification.new : lazar = OpenTox::Model::LazarRegression.new + lazar.training_dataset_id = training_dataset.id + lazar.prediction_feature_id = prediction_feature.id + lazar.title = prediction_feature.title + + lazar.save + lazar + end + + def predict object + + t = Time.now + at = Time.now + + training_dataset = Dataset.find training_dataset_id + prediction_feature = Feature.find prediction_feature_id + + # parse data + compounds = [] + case object.class.to_s + when "OpenTox::Compound" + compounds = [object] + when "Array" + compounds = object + when "OpenTox::Dataset" + compounds = object.compounds + else + bad_request_error "Please provide a OpenTox::Compound an Array of OpenTox::Compounds or an OpenTox::Dataset as parameter." + end + + # make predictions + predictions = [] + compounds.each_with_index do |compound,c| + t = Time.new + neighbors = Algorithm.run(neighbor_algorithm, compound, neighbor_algorithm_parameters) + # add activities + # TODO: improve efficiency, takes 3 times longer than previous version + # TODO database activity?? + neighbors.collect! do |n| + rows = training_dataset.compound_ids.each_index.select{|i| training_dataset.compound_ids[i] == n.first} + acts = rows.collect{|row| training_dataset.data_entries[row][0]}.compact + acts.empty? ? nil : n << acts + end + neighbors.compact! # remove neighbors without training activities + predictions << Algorithm.run(prediction_algorithm, neighbors) + end + + # serialize result + case object.class.to_s + when "OpenTox::Compound" + return predictions.first + when "Array" + return predictions + when "OpenTox::Dataset" + # prepare prediction dataset + prediction_dataset = LazarPrediction.new( + :title => "Lazar prediction for #{prediction_feature.title}", + :creator => __FILE__, + :prediction_feature_id => prediction_feature.id + + ) + confidence_feature = OpenTox::NumericFeature.find_or_create_by( "title" => "Prediction confidence" ) + # TODO move into warnings field + warning_feature = OpenTox::NominalFeature.find_or_create_by("title" => "Warnings") + prediction_dataset.features = [ prediction_feature, confidence_feature, warning_feature ] + prediction_dataset.compounds = compounds + prediction_dataset.data_entries = predictions + prediction_dataset.save_all + return prediction_dataset + end + + end + + def training_activities + i = training_dataset.feature_ids.index prediction_feature_id + training_dataset.data_entries.collect{|de| de[i]} + end + + end + + class LazarClassification < Lazar + def initialize + super + self.prediction_algorithm = "OpenTox::Algorithm::Classification.weighted_majority_vote" + self.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fingerprint_similarity" + self.neighbor_algorithm_parameters = {:min_sim => 0.7} + end + end + + class LazarFminerClassification < LazarClassification + #field :feature_dataset_id, type: BSON::ObjectId + #field :feature_calculation_algorithm, type: String + + def self.create training_dataset + model = super(training_dataset) + model.update "_type" => self.to_s # adjust class + model = self.find model.id # adjust class + model.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fminer_similarity" + model.neighbor_algorithm_parameters = { + :feature_calculation_algorithm => "OpenTox::Algorithm::Descriptor.smarts_match", + :feature_dataset_id => Algorithm::Fminer.bbrc(training_dataset).id, + :min_sim => 0.3 + } + model.save + model + end + +=begin + def predict object + + t = Time.now + at = Time.now + + @training_dataset = OpenTox::Dataset.find(training_dataset_id) + @feature_dataset = OpenTox::Dataset.find(feature_dataset_id) + + compounds = [] + case object.class.to_s + when "OpenTox::Compound" + compounds = [object] + when "Array" + compounds = object + when "OpenTox::Dataset" + compounds = object.compounds + else + bad_request_error "Please provide a OpenTox::Compound an Array of OpenTox::Compounds or an OpenTox::Dataset as parameter." + end + + $logger.debug "Setup: #{Time.now-t}" + t = Time.now + + @query_fingerprint = Algorithm.run(feature_calculation_algorithm, compounds, @feature_dataset.features.collect{|f| f.name} ) + + $logger.debug "Query fingerprint calculation: #{Time.now-t}" + t = Time.now + + predictions = [] + prediction_feature = OpenTox::Feature.find prediction_feature_id + tt = 0 + pt = 0 + nt = 0 + st = 0 + nit = 0 + @training_fingerprints ||= @feature_dataset.data_entries + compounds.each_with_index do |compound,c| + t = Time.new + + $logger.debug "predict compound #{c+1}/#{compounds.size} #{compound.inchi}" + + database_activities = @training_dataset.values(compound,prediction_feature) + if database_activities and !database_activities.empty? + database_activities = database_activities.first if database_activities.size == 1 + $logger.debug "Compound #{compound.inchi} occurs in training dataset with activity #{database_activities}" + predictions << {:compound => compound, :value => database_activities, :confidence => "measured"} + next + else + + #training_fingerprints = @feature_dataset.data_entries + query_fingerprint = @query_fingerprint[c] + neighbors = [] + tt += Time.now-t + t = Time.new + + + # find neighbors + @training_fingerprints.each_with_index do |fingerprint, i| + ts = Time.new + sim = Algorithm.run(similarity_algorithm,fingerprint, query_fingerprint) + st += Time.now-ts + ts = Time.new + if sim > self.min_sim + if prediction_algorithm =~ /Regression/ + neighbors << [@feature_dataset.compound_ids[i],sim,training_activities[i], fingerprint] + else + neighbors << [@feature_dataset.compound_ids[i],sim,training_activities[i]] # use compound_ids, instantiation of Compounds is too time consuming + end + end + nit += Time.now-ts + end + + if neighbors.empty? + predictions << {:compound => compound, :value => nil, :confidence => nil, :warning => "No neighbors with similarity > #{min_sim} in dataset #{training_dataset.id}"} + next + end + nt += Time.now-t + t = Time.new + + if prediction_algorithm =~ /Regression/ + prediction = Algorithm.run(prediction_algorithm, neighbors, :min_train_performance => self.min_train_performance) + else + prediction = Algorithm.run(prediction_algorithm, neighbors) + end + prediction[:compound] = compound + prediction[:neighbors] = neighbors.sort{|a,b| b[1] <=> a[1]} # sort with ascending similarities + + + # AM: transform to original space (TODO) + #confidence_value = ((confidence_value+1.0)/2.0).abs if prediction.first and similarity_algorithm =~ /cosine/ + + + $logger.debug "predicted value: #{prediction[:value]}, confidence: #{prediction[:confidence]}" + predictions << prediction + pt += Time.now-t + end + + end + $logger.debug "Transform time: #{tt}" + $logger.debug "Neighbor search time: #{nt} (Similarity calculation: #{st}, Neighbor insert: #{nit})" + $logger.debug "Prediction time: #{pt}" + $logger.debug "Total prediction time: #{Time.now-at}" + + # serialize result + case object.class.to_s + when "OpenTox::Compound" + return predictions.first + when "Array" + return predictions + when "OpenTox::Dataset" + # prepare prediction dataset + prediction_dataset = LazarPrediction.new( + :title => "Lazar prediction for #{prediction_feature.title}", + :creator => __FILE__, + :prediction_feature_id => prediction_feature.id + + ) + confidence_feature = OpenTox::NumericFeature.find_or_create_by( "title" => "Prediction confidence" ) + warning_feature = OpenTox::NominalFeature.find_or_create_by("title" => "Warnings") + prediction_dataset.features = [ prediction_feature, confidence_feature, warning_feature ] + prediction_dataset.compounds = compounds + prediction_dataset.data_entries = predictions.collect{|p| [p[:value], p[:confidence],p[:warning]]} + prediction_dataset.save_all + return prediction_dataset + end + + end +=end + end + + class LazarRegression < Lazar + + def initialize + super + self.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fingerprint_similarity" + self.prediction_algorithm = "OpenTox::Algorithm::Regression.weighted_average" + self.neighbor_algorithm_parameters = {:min_sim => 0.7} + end + + end + + end + +end + diff --git a/lib/lazar.rb b/lib/lazar.rb index 2e7e7c2..0c5e18b 100644 --- a/lib/lazar.rb +++ b/lib/lazar.rb @@ -58,7 +58,7 @@ CLASSES = ["Feature","Compound","Dataset","Validation","CrossValidation"]# Algor "algorithm.rb", "descriptor.rb", "bbrc.rb", - "lazar.rb", + "lazar-model.rb", "similarity.rb", "neighbor.rb", "classification.rb", diff --git a/lib/neighbor.rb b/lib/neighbor.rb index a2c28d4..d849cbf 100644 --- a/lib/neighbor.rb +++ b/lib/neighbor.rb @@ -8,7 +8,7 @@ module OpenTox def self.fminer_similarity compound, params feature_dataset = Dataset.find params[:feature_dataset_id] - query_fingerprint = Algorithm::Descriptor.smarts_match(compound, feature_dataset.features.collect{|f| f.smarts} ) + query_fingerprint = Algorithm::Descriptor.smarts_match(compound, feature_dataset.features) neighbors = [] # find neighbors diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 2eb0b39..a27d685 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -11,6 +11,12 @@ class Object end end +class Numeric + def percent_of(n) + self.to_f / n.to_f * 100.0 + end +end + module Enumerable # @return [Array] only the duplicates of an enumerable def duplicates diff --git a/test/compound.rb b/test/compound.rb index 7bbba58..b45e3d0 100644 --- a/test/compound.rb +++ b/test/compound.rb @@ -4,20 +4,20 @@ class CompoundTest < MiniTest::Test def test_0_compound_from_smiles c = OpenTox::Compound.from_smiles "F[B-](F)(F)F.[Na+]" - assert_equal "InChI=1S/BF4.Na/c2-1(3,4)5;/q-1;+1", c.inchi - assert_equal "[B-](F)(F)(F)F.[Na+]", c.smiles, "A failure here might be caused by a compound webservice running on 64bit architectures using an outdated version of OpenBabel. Please install OpenBabel version 2.3.2 or higher." # seems to be fixed in 2.3.2 + assert_equal "InChI=1S/BF4.Na/c2-1(3,4)5;/q-1;+1", c.inchi.chomp + assert_equal "F[B-](F)(F)F.[Na+]", c.smiles, "A failure here might be caused by a compound webservice running on 64bit architectures using an outdated version of OpenBabel. Please install OpenBabel version 2.3.2 or higher." # seems to be fixed in 2.3.2 end def test_1_compound_from_smiles c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" assert_equal "InChI=1S/C6H9NO/c1-5(4-7)3-6(2)8/h5H,3H2,1-2H3", c.inchi - assert_equal "CC(CC(=O)C)C#N", c.smiles + assert_equal "CC(C#N)CC(=O)C", c.smiles end def test_2_compound_from_smiles c = OpenTox::Compound.from_smiles "N#[N+]C1=CC=CC=C1.F[B-](F)(F)F" assert_equal "InChI=1S/C6H5N2.BF4/c7-8-6-4-2-1-3-5-6;2-1(3,4)5/h1-5H;/q+1;-1", c.inchi - assert_equal "c1ccc(cc1)[N+]#N.[B-](F)(F)(F)F", c.smiles + assert_equal "F[B-](F)(F)F.N#[N+]c1ccccc1", c.smiles end def test_compound_from_name @@ -54,6 +54,7 @@ class CompoundTest < MiniTest::Test # OpenBabel segfaults randomly during inchikey calculation def test_inchikey c = OpenTox::Compound.from_inchi "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H" + p c assert_equal "UHOVQNZJYSORNB-UHFFFAOYSA-N", c.inchikey end @@ -87,7 +88,14 @@ class CompoundTest < MiniTest::Test refute_nil c.fp4 end c = d.compounds[371] - assert_equal 19, c.neighbors.size + assert c.neighbors.size >= 19 end + def test_openbabel_segfault + inchi = "InChI=1S/C19H27NO7/c1-11-9-19(12(2)27-19)17(23)26-14-6-8-20(4)7-5-13(15(14)21)10-25-16(22)18(11,3)24/h5,11-12,14,24H,6-10H2,1-4H3/b13-5-/t11-,12-,14-,18-,19?/m1/s1" + + #r = `echo "#{inchi}" | babel -iinchi - -oinchi` + c = Compound.from_inchi(inchi) + assert_nil c + end end diff --git a/test/lazar-fminer.rb b/test/lazar-fminer.rb new file mode 100644 index 0000000..fbfa3d2 --- /dev/null +++ b/test/lazar-fminer.rb @@ -0,0 +1,51 @@ +require_relative "setup.rb" + +class LazarFminerTest < MiniTest::Test + + def test_lazar_fminer + training_dataset = Dataset.from_csv_file File.join(DATA_DIR,"hamster_carcinogenicity.csv") + model = Model::LazarFminerClassification.create training_dataset#, feature_dataset + feature_dataset = Dataset.find model.neighbor_algorithm_parameters[:feature_dataset_id] + assert_equal training_dataset.compounds.size, feature_dataset.compounds.size + p feature_dataset.features.size + #assert_equal 54, feature_dataset.features.size + feature_dataset.data_entries.each do |e| + assert_equal e.size, feature_dataset.features.size + end + #assert_equal 'C-C-C=C', feature_dataset.features.first.smarts + + [ { + :compound => OpenTox::Compound.from_inchi("InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H"), + :prediction => "false", + :confidence => 0.25281385281385277, + :nr_neighbors => 11 + },{ + :compound => OpenTox::Compound.from_smiles("c1ccccc1NN"), + :prediction => "false", + :confidence => 0.3639589577089577, + :nr_neighbors => 14 + }, { + :compound => Compound.from_smiles('OCCCCCCCC\C=C/CCCCCCCC'), + :prediction => "false", + :confidence => 0.5555555555555556, + :nr_neighbors => 1 + }].each do |example| + prediction = model.predict example[:compound] + + p prediction + #assert_equal example[:prediction], prediction[:value] + #assert_equal example[:confidence], prediction[:confidence] + #assert_equal example[:nr_neighbors], prediction[:neighbors].size + end + + # make a dataset prediction + compound_dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.mini.csv") + prediction = model.predict compound_dataset + assert_equal compound_dataset.compounds, prediction.compounds + + assert_match /No neighbors/, prediction.data_entries[7][2] + assert_equal "measured", prediction.data_entries[14][1] + # cleanup + [training_dataset,model,feature_dataset,compound_dataset].each{|o| o.delete} + end +end diff --git a/test/validation.rb b/test/validation.rb new file mode 100644 index 0000000..d98feb5 --- /dev/null +++ b/test/validation.rb @@ -0,0 +1,41 @@ +require_relative "setup.rb" + +class ValidationTest < MiniTest::Test + + def test_fminer_crossvalidation + dataset = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" + model = Model::LazarFminerClassification.create dataset#, features + cv = ClassificationCrossValidation.create model + p cv.accuracy + p cv.weighted_accuracy + assert cv.accuracy > 0.8 + assert cv.weighted_accuracy > cv.accuracy, "Weighted accuracy (#{cv.weighted_accuracy}) larger than unweighted accuracy(#{cv.accuracy}) " + end + + def test_classification_crossvalidation + dataset = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" + model = Model::LazarClassification.create dataset#, features + cv = ClassificationCrossValidation.create model + p cv.accuracy + p cv.weighted_accuracy + assert cv.accuracy > 0.7 + assert cv.weighted_accuracy > cv.accuracy, "Weighted accuracy should be larger than unweighted accuracy." + end + + def test_regression_crossvalidation + dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" + #dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.csv" + model = Model::LazarRegression.create dataset + cv = RegressionCrossValidation.create model + p cv.rmse + p cv.weighted_rmse + p cv.mae + p cv.weighted_mae + `inkview #{cv.plot}` + assert cv.rmse < 30, "RMSE > 30" + assert cv.weighted_rmse < cv.rmse, "Weighted RMSE (#{cv.weighted_rmse}) larger than unweighted RMSE(#{cv.rmse}) " + assert cv.mae < 12 + assert cv.weighted_mae < cv.mae + end + +end -- cgit v1.2.3 From d0850e2983a219da214a67190fe881c7650f532f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 13 Aug 2015 18:57:11 +0200 Subject: majority of tests working --- lazar.gemspec | 6 ++-- lib/bbrc.rb | 12 ++++++-- lib/classification.rb | 8 ++--- lib/compound.rb | 14 +++++++-- lib/dataset.rb | 23 +++++++------- lib/descriptor.rb | 7 +---- lib/lazar-model.rb | 21 ++++++++++--- lib/overwrite.rb | 8 +++++ lib/regression.rb | 2 +- test/all.rb | 5 +++ test/dataset-long.rb | 13 ++++---- test/dataset.rb | 2 +- test/descriptor-long.rb | 13 ++++++++ test/descriptor.rb | 14 ++++----- test/fminer-long.rb | 11 ++++--- test/fminer.rb | 10 ++++-- test/lazar-fminer.rb | 7 ++--- test/lazar-long.rb | 72 ++++++++++++++++++++++++++++++++++++++++++++ test/lazar-physchem-short.rb | 27 +++++++++++++++++ 19 files changed, 216 insertions(+), 59 deletions(-) create mode 100644 test/all.rb create mode 100644 test/lazar-long.rb create mode 100644 test/lazar-physchem-short.rb diff --git a/lazar.gemspec b/lazar.gemspec index 7a90080..8da29b7 100644 --- a/lazar.gemspec +++ b/lazar.gemspec @@ -7,15 +7,15 @@ Gem::Specification.new do |s| s.authors = ["Christoph Helma, Martin Guetlein, Andreas Maunz, Micha Rautenberg, David Vorgrimmler, Denis Gebele"] s.email = ["helma@in-silico.ch"] s.homepage = "http://github.com/opentox/lazar" - s.summary = %q{Ruby wrapper for the OpenTox REST API} - s.description = %q{Ruby wrapper for the OpenTox REST API (http://www.opentox.org)} + s.summary = %q{Lazar framework} + s.description = %q{Libraries for lazy structure-activity relationships and read-across.} s.license = 'GPL-3' s.rubyforge_project = "lazar" s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") - s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } + s.extensions = %w[ext/lazar/extconf.rb] s.require_paths = ["lib"] # specify any dependencies here; for example: diff --git a/lib/bbrc.rb b/lib/bbrc.rb index 6a2eed7..c83b9b3 100644 --- a/lib/bbrc.rb +++ b/lib/bbrc.rb @@ -26,6 +26,7 @@ module OpenTox minfreq = params[:min_frequency] else per_mil = 5 # value from latest version + per_mil = 8 # as suggested below i = training_dataset.feature_ids.index prediction_feature.id nr_labeled_cmpds = training_dataset.data_entries.select{|de| !de[i].nil?}.size minfreq = per_mil * nr_labeled_cmpds.to_f / 1000.0 # AM sugg. 8-10 per mil for BBRC, 50 per mil for LAST @@ -65,9 +66,11 @@ module OpenTox # add data training_dataset.compounds.each_with_index do |compound,i| - @bbrc.AddCompound(compound.smiles,i+1) act = value2act[training_dataset.data_entries[i].first] - @bbrc.AddActivity(act,i+1) + if act # TODO check if this works + @bbrc.AddCompound(compound.smiles,i+1) + @bbrc.AddActivity(act,i+1) + end end #g_median=@fminer.all_activities.values.to_scale.median @@ -94,6 +97,9 @@ module OpenTox end p_value = f.shift f.flatten! + compound_idxs = f.collect{|e| e.first.first-1} + # majority class + effect = compound_idxs.collect{|i| training_dataset.data_entries[i].first}.mode =begin if (!@bbrc.GetRegression) @@ -122,7 +128,7 @@ module OpenTox feature = OpenTox::FminerSmarts.find_or_create_by({ "smarts" => smarts, "p_value" => p_value.to_f.abs.round(5), - #"effect" => effect, + "effect" => effect, "dataset_id" => feature_dataset.id }) feature_dataset.feature_ids << feature.id diff --git a/lib/classification.rb b/lib/classification.rb index fc6fa77..723c66f 100644 --- a/lib/classification.rb +++ b/lib/classification.rb @@ -4,7 +4,7 @@ module OpenTox class Classification def self.weighted_majority_vote neighbors - return [nil,nil] if neighbors.empty? + return {:value => nil,:confidence => nil,:warning => "Cound not find similar compounds."} if neighbors.empty? weighted_sum = {} sim_sum = 0.0 neighbors.each do |row| @@ -16,13 +16,13 @@ module OpenTox end case weighted_sum.size when 1 - return [weighted_sum.keys.first, 1.0] + return {:value => weighted_sum.keys.first, :confidence => weighted_sum.values.first/neighbors.size.abs} when 2 sim_sum = weighted_sum[weighted_sum.keys[0]] sim_sum -= weighted_sum[weighted_sum.keys[1]] sim_sum > 0 ? prediction = weighted_sum.keys[0] : prediction = weighted_sum.keys[1] confidence = (sim_sum/neighbors.size).abs - return [prediction,confidence] + return {:value => prediction,:confidence => confidence} else bad_request_error "Cannot predict more than 2 classes, multinomial classifications is not yet implemented. Received classes were: '#{weighted.sum.keys}'" end @@ -94,7 +94,7 @@ module OpenTox #$logger.debug "Prediction: '" + prediction.to_s + "' ('#{prediction.class}')." confidence = get_confidence({:sims => params[:sims][1], :activities => params[:activities]}) end - {:prediction => prediction, :confidence => confidence} + {:value => prediction, :confidence => confidence} end diff --git a/lib/compound.rb b/lib/compound.rb index 5343aa0..10deabc 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -13,6 +13,7 @@ module OpenTox field :smiles, type: String field :inchikey, type: String field :names, type: Array + field :warning, type: String field :cid, type: String field :chemblid, type: String field :png_id, type: BSON::ObjectId @@ -46,7 +47,12 @@ module OpenTox # @return [OpenTox::Compound] Compound def self.from_smiles smiles # do not store smiles because it might be noncanonical - Compound.find_or_create_by :smiles => obconversion(smiles,"smi","can") + smiles = obconversion(smiles,"smi","can") + if smiles.empty? + Compound.find_or_create_by(:warning => "SMILES parsing failed for '#{smiles}', this may be caused by an incorrect SMILES string.") + else + Compound.find_or_create_by :smiles => obconversion(smiles,"smi","can") + end end # Create a compound from inchi string @@ -57,7 +63,11 @@ module OpenTox # http://sourceforge.net/p/openbabel/bugs/957/ # bug has not been fixed in latest git/development version smiles = `echo "#{inchi}" | babel -iinchi - -ocan`.chomp.strip - smiles.empty? ? nil : Compound.find_or_create_by(:smiles => smiles, :inchi => inchi) + if smiles.empty? + Compound.find_or_create_by(:warning => "InChi parsing failed for #{inchi}, this may be caused by an incorrect InChi string or a bug in OpenBabel libraries.") + else + Compound.find_or_create_by(:smiles => smiles, :inchi => inchi) + end end # Create a compound from sdf string diff --git a/lib/dataset.rb b/lib/dataset.rb index 4f6f0b5..8c5ffc0 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -208,30 +208,29 @@ module OpenTox value_time = 0 # compounds and values - @data_entries = Array.new(table.size){Array.new(table.first.size-1)} + @data_entries = [] #Array.new(table.size){Array.new(table.first.size-1)} table.each_with_index do |vals,i| ct = Time.now identifier = vals.shift warnings << "No feature values for compound at position #{i+2}." if vals.compact.empty? begin - # TODO parse inchi and catch openbabel errors (and segfaults) in compound.rb case compound_format when /SMILES/i compound = OpenTox::Compound.from_smiles(identifier) - if compound.inchi.empty? - warnings << "Cannot parse #{compound_format} compound '#{identifier}' at position #{i+2}, all entries are ignored." - next - end when /InChI/i compound = OpenTox::Compound.from_inchi(identifier) end - rescue + rescue + compound = nil + end + if compound.nil? + # compound parsers may return nil warnings << "Cannot parse #{compound_format} compound '#{identifier}' at position #{i+2}, all entries are ignored." next end + # TODO insert empty compounds to keep positions? compound_time += Time.now-ct - compound_ids << compound.id r += 1 unless vals.size == feature_ids.size # way cheaper than accessing features @@ -239,15 +238,17 @@ module OpenTox next end - cid = compound.id.to_s + compound_ids << compound.id + @data_entries << Array.new(table.first.size-1) + vals.each_with_index do |v,j| if v.blank? warnings << "Empty value for compound '#{identifier}' (row #{r+2}) and feature '#{feature_names[j]}' (column #{j+2})." next elsif numeric[j] - @data_entries[i][j] = v.to_f + @data_entries.last[j] = v.to_f else - @data_entries[i][j] = v.strip + @data_entries.last[j] = v.strip end end end diff --git a/lib/descriptor.rb b/lib/descriptor.rb index f0492a2..5ae0ef2 100644 --- a/lib/descriptor.rb +++ b/lib/descriptor.rb @@ -71,12 +71,6 @@ module OpenTox @physchem_descriptors = nil @data_entries = Array.new(@compounds.size){Array.new(@smarts.size,false)} @compounds.each_with_index do |compound,c| - # TODO OpenBabel may segfault here - # catch inchi errors in compound.rb - # eg. at line 249 of rat_feature_dataset - # which worked with opentox-client - # (but no smarts_match) - #p "'#{compound.inchi}'" obconversion.read_string(obmol,compound.smiles) @smarts.each_with_index do |smart,s| smarts_pattern.init(smart) @@ -214,6 +208,7 @@ module OpenTox end def self.serialize + @data_entries.collect!{|de| de.collect{|v| v.round(5) unless v.nil?}} case @input_class when "OpenTox::Compound" @data_entries.first diff --git a/lib/lazar-model.rb b/lib/lazar-model.rb index 4ca3403..aeaa515 100644 --- a/lib/lazar-model.rb +++ b/lib/lazar-model.rb @@ -9,7 +9,6 @@ module OpenTox store_in collection: "models" field :title, type: String - field :endpoint, type: String field :creator, type: String, default: __FILE__ # datasets field :training_dataset_id, type: BSON::ObjectId @@ -64,12 +63,18 @@ module OpenTox # make predictions predictions = [] + neighbors = [] compounds.each_with_index do |compound,c| t = Time.new + database_activities = training_dataset.values(compound,prediction_feature) + if database_activities and !database_activities.empty? + database_activities = database_activities.first if database_activities.size == 1 + predictions << {:compound => compound, :value => database_activities, :confidence => "measured", :warning => "Compound #{compound.smiles} occurs in training dataset with activity '#{database_activities}'."} + next + end neighbors = Algorithm.run(neighbor_algorithm, compound, neighbor_algorithm_parameters) # add activities # TODO: improve efficiency, takes 3 times longer than previous version - # TODO database activity?? neighbors.collect! do |n| rows = training_dataset.compound_ids.each_index.select{|i| training_dataset.compound_ids[i] == n.first} acts = rows.collect{|row| training_dataset.data_entries[row][0]}.compact @@ -82,7 +87,9 @@ module OpenTox # serialize result case object.class.to_s when "OpenTox::Compound" - return predictions.first + prediction = predictions.first + prediction[:neighbors] = neighbors.sort{|a,b| b[1] <=> a[1]} # sort according to similarity + return prediction when "Array" return predictions when "OpenTox::Dataset" @@ -98,7 +105,7 @@ module OpenTox warning_feature = OpenTox::NominalFeature.find_or_create_by("title" => "Warnings") prediction_dataset.features = [ prediction_feature, confidence_feature, warning_feature ] prediction_dataset.compounds = compounds - prediction_dataset.data_entries = predictions + prediction_dataset.data_entries = predictions.collect{|p| [p[:value], p[:confidence], p[:warning]]} prediction_dataset.save_all return prediction_dataset end @@ -281,6 +288,12 @@ module OpenTox end + class PredictionModel < Lazar + field :category, type: String + field :endpoint, type: String + field :crossvalidation_id, type: BSON::ObjectId + end + end end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index a27d685..df515eb 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -22,6 +22,14 @@ module Enumerable def duplicates inject({}) {|h,v| h[v]=h[v].to_i+1; h}.reject{|k,v| v==1}.keys end + # http://stackoverflow.com/questions/2562256/find-most-common-string-in-an-array + Enumerable.class_eval do + def mode + group_by do |e| + e + end.values.max_by(&:size).first + end + end end class String diff --git a/lib/regression.rb b/lib/regression.rb index 891d7f9..8a52e7d 100644 --- a/lib/regression.rb +++ b/lib/regression.rb @@ -31,7 +31,7 @@ module OpenTox end confidence = sim_sum/neighbors.size.to_f sim_sum == 0 ? prediction = nil : prediction = 10**(weighted_sum/sim_sum) - [prediction,confidence] + {:value => prediction,:confidence => confidence} end # Local support vector regression from neighbors diff --git a/test/all.rb b/test/all.rb new file mode 100644 index 0000000..2bb1c4f --- /dev/null +++ b/test/all.rb @@ -0,0 +1,5 @@ +exclude = ["./setup.rb","./all.rb"] +(Dir[File.join(File.dirname(__FILE__),"*.rb")]-exclude).each do |test| + p test + require_relative test +end diff --git a/test/dataset-long.rb b/test/dataset-long.rb index 50ae8fc..5463079 100644 --- a/test/dataset-long.rb +++ b/test/dataset-long.rb @@ -77,13 +77,11 @@ class DatasetLongTest < MiniTest::Test assert_equal csv.size-1, d.compounds.size assert_equal csv.first.size-1, d.features.size assert_equal csv.size-1, d.data_entries.size - # TODO: check if warning is correct: - # Duplicate compound InChI=1S/C5H4N4S/c10-5-3-4(7-1-6-3)8-2-9-5/h1-2H,(H2,6,7,8,9,10) at rows 1357, 2235 - #assert_empty d.warnings + assert_empty d.warnings # 493 COC1=C(C=C(C(=C1)Cl)OC)Cl,1 c = d.compounds[491] - assert_equal c.smiles, "COc1cc(c(cc1Cl)OC)Cl" - assert_equal d[c.id,d.features.first.id], 1 + assert_equal c.smiles, "COc1cc(Cl)c(cc1Cl)OC" + assert_equal d.data_entries[491][0], "1" d.delete end @@ -98,8 +96,11 @@ class DatasetLongTest < MiniTest::Test t = Time.now assert_equal d.features.size, d2.features.size csv = CSV.read f + csv.delete_at(248) # remove entry with InChi segfault csv.shift # remove header - assert_equal csv.size, d2.compounds.size + refute_empty d2.warnings + assert_match /249/, d2.warnings.join + assert_equal csv.size, d2.compounds.size assert_equal csv.first.size-1, d2.features.size d2.compounds.each_with_index do |compound,i| row = csv[i] diff --git a/test/dataset.rb b/test/dataset.rb index b3e1403..27dba61 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -112,7 +112,7 @@ class DatasetTest < MiniTest::Test assert_equal 7, d.compounds.size assert_equal 5, d.compounds.collect{|c| c.inchi}.uniq.size assert_equal [["1", "1", "true", "true", "test", 1.1], ["1", "2", "false", "7.5", "test", 0.24], ["1", "3", "true", "5", "test", 3578.239], ["0", "4", "false", "false", "test", -2.35], ["1", "2", "true", "4", "test_2", 1], ["1", "2", "false", "false", "test", -1.5], ["1", nil, "false", nil, nil, 1.0]], d.data_entries - assert_equal "c1cc[nH]c1,1,,false,,,1.0", d.to_csv.split("\n")[7] + assert_equal "c1ccc[nH]1,1,,false,,,1.0", d.to_csv.split("\n")[7] csv = CSV.parse(d.to_csv) original_csv = CSV.read("#{DATA_DIR}/multicolumn.csv") csv.shift diff --git a/test/descriptor-long.rb b/test/descriptor-long.rb index 2752d5a..7a4c00f 100644 --- a/test/descriptor-long.rb +++ b/test/descriptor-long.rb @@ -2,6 +2,8 @@ require_relative "setup.rb" class DescriptorLongTest < MiniTest::Test def test_dataset_all + # TODO: improve CDK descriptor calculation speed or add timeout + skip "CDK descriptor calculation takes too long for some compounds" dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"hamster_carcinogenicity.mini.csv") d = OpenTox::Algorithm::Descriptor.physchem dataset assert_equal dataset.compounds, d.compounds @@ -10,4 +12,15 @@ class DescriptorLongTest < MiniTest::Test d.delete end + def test_dataset_openbabel + # TODO: improve CDK descriptor calculation speed or add timeout + dataset = Dataset.from_csv_file File.join(DATA_DIR,"hamster_carcinogenicity.mini.csv") + d = Algorithm::Descriptor.physchem dataset, Algorithm::Descriptor::OBDESCRIPTORS.keys + assert_equal dataset.compounds, d.compounds + size = Algorithm::Descriptor::OBDESCRIPTORS.keys.size + assert_equal size, d.features.size + assert_equal size, d.data_entries.first.size + d.delete + end + end diff --git a/test/descriptor.rb b/test/descriptor.rb index 1143b87..2d6ff08 100644 --- a/test/descriptor.rb +++ b/test/descriptor.rb @@ -20,10 +20,11 @@ class DescriptorTest < MiniTest::Test def test_smarts c = OpenTox::Compound.from_smiles "N=C=C1CCC(=F=FO)C1" - s = Smarts.find_or_create_by(:smarts => "FF") + File.open("tmp.png","w+"){|f| f.puts c.png} + s = Smarts.find_or_create_by(:smarts => "F=F") result = OpenTox::Algorithm::Descriptor.smarts_match c, s assert_equal [1], result - smarts = ["CC", "C", "C=C", "CO", "FF", "C1CCCC1", "NN"].collect{|s| Smarts.find_or_create_by(:smarts => s)} + smarts = ["CC", "C", "C=C", "CO", "F=F", "C1CCCC1", "NN"].collect{|s| Smarts.find_or_create_by(:smarts => s)} result = OpenTox::Algorithm::Descriptor.smarts_match c, smarts assert_equal [1, 1, 1, 0, 1, 1, 0], result smarts_count = [10, 6, 2, 0, 2, 10, 0] @@ -34,7 +35,7 @@ class DescriptorTest < MiniTest::Test def test_compound_openbabel_single c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" result = OpenTox::Algorithm::Descriptor.physchem c, ["Openbabel.logP"] - assert_equal [1.12518], result + assert_equal 1.12518, result.first end def test_compound_cdk_single @@ -65,10 +66,9 @@ class DescriptorTest < MiniTest::Test def test_compound_descriptor_parameters c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" - result = OpenTox::Algorithm::Descriptor.physchem c, [ "Openbabel.logP", "Cdk.AtomCount", "Cdk.CarbonTypes", "Joelib.LogP" ], true - assert_equal 12, result.last.size - assert_equal ["Openbabel.logP", "Cdk.AtomCount.nAtom", "Cdk.CarbonTypes.C1SP1", "Cdk.CarbonTypes.C2SP1", "Cdk.CarbonTypes.C1SP2", "Cdk.CarbonTypes.C2SP2", "Cdk.CarbonTypes.C3SP2", "Cdk.CarbonTypes.C1SP3", "Cdk.CarbonTypes.C2SP3", "Cdk.CarbonTypes.C3SP3", "Cdk.CarbonTypes.C4SP3", "Joelib.LogP"], result.first - assert_equal [1.12518, 17, 1, 0, 0, 1, 0, 2, 1, 1, 0, 2.65908], result.last + result = OpenTox::Algorithm::Descriptor.physchem c, [ "Openbabel.logP", "Cdk.AtomCount", "Cdk.CarbonTypes", "Joelib.LogP" ]#, true + assert_equal 12, result.size + assert_equal [1.12518, 17.0, 1, 0, 0, 1, 0, 2, 1, 1, 0, 2.65908], result#.last end def test_dataset_descriptor_parameters diff --git a/test/fminer-long.rb b/test/fminer-long.rb index 826f206..0f202b4 100644 --- a/test/fminer-long.rb +++ b/test/fminer-long.rb @@ -3,13 +3,13 @@ require_relative "setup.rb" class FminerTest < MiniTest::Test def test_fminer_multicell - skip "multicell segfaults" + #skip "multicell segfaults" # TODO aborts, probably fminer # or OpenBabel segfault - dataset = OpenTox::Dataset.new - #multi_cell_call.csv - dataset.upload File.join(DATA_DIR,"multi_cell_call.csv") + dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"multi_cell_call.csv") feature_dataset = OpenTox::Algorithm::Fminer.bbrc(dataset)#, :min_frequency => 15) + p feature_dataset.training_parameters + assert_equal dataset.compound_ids, feature_dataset.compound_ids dataset.delete feature_dataset.delete end @@ -18,7 +18,8 @@ class FminerTest < MiniTest::Test dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"ISSCAN-multi.csv") feature_dataset = OpenTox::Algorithm::Fminer.bbrc(dataset)#, :min_frequency => 15) assert_equal feature_dataset.compounds.size, dataset.compounds.size - p feature_dataset + p feature_dataset.features.size + p feature_dataset.training_parameters dataset.delete feature_dataset.delete end diff --git a/test/fminer.rb b/test/fminer.rb index 17dcbe1..16e1f9e 100644 --- a/test/fminer.rb +++ b/test/fminer.rb @@ -8,10 +8,16 @@ class FminerTest < MiniTest::Test feature_dataset = OpenTox::Algorithm::Fminer.bbrc dataset feature_dataset = Dataset.find feature_dataset.id assert_equal dataset.compounds.size, feature_dataset.compounds.size - assert_equal 54, feature_dataset.features.size - assert_equal "C-C-C=C", feature_dataset.features.first.smarts + # TODO: fminer calculates 62 instead of 54 features + # it is unclear which commit changed the numbers (occurs with old libraries/mongodb branch too + # modification of Compound to use smiles instead of inchis seems to have no effect + #assert_equal 54, feature_dataset.features.size + #assert_equal "C-C-C=C", feature_dataset.features.first.smarts compounds = feature_dataset.compounds smarts = feature_dataset.features + smarts.each do |smart| + assert smart.p_value.round(2) >= 0.95 + end match = OpenTox::Algorithm::Descriptor.smarts_match compounds, smarts feature_dataset.data_entries.each_with_index do |fingerprint,i| assert_equal match[i], fingerprint diff --git a/test/lazar-fminer.rb b/test/lazar-fminer.rb index fbfa3d2..41e1071 100644 --- a/test/lazar-fminer.rb +++ b/test/lazar-fminer.rb @@ -7,7 +7,7 @@ class LazarFminerTest < MiniTest::Test model = Model::LazarFminerClassification.create training_dataset#, feature_dataset feature_dataset = Dataset.find model.neighbor_algorithm_parameters[:feature_dataset_id] assert_equal training_dataset.compounds.size, feature_dataset.compounds.size - p feature_dataset.features.size + #TODO check fminer features, see fminer.rb #assert_equal 54, feature_dataset.features.size feature_dataset.data_entries.each do |e| assert_equal e.size, feature_dataset.features.size @@ -32,8 +32,7 @@ class LazarFminerTest < MiniTest::Test }].each do |example| prediction = model.predict example[:compound] - p prediction - #assert_equal example[:prediction], prediction[:value] + assert_equal example[:prediction], prediction[:value] #assert_equal example[:confidence], prediction[:confidence] #assert_equal example[:nr_neighbors], prediction[:neighbors].size end @@ -43,7 +42,7 @@ class LazarFminerTest < MiniTest::Test prediction = model.predict compound_dataset assert_equal compound_dataset.compounds, prediction.compounds - assert_match /No neighbors/, prediction.data_entries[7][2] + assert_equal "Cound not find similar compounds.", prediction.data_entries[7][2] assert_equal "measured", prediction.data_entries[14][1] # cleanup [training_dataset,model,feature_dataset,compound_dataset].each{|o| o.delete} diff --git a/test/lazar-long.rb b/test/lazar-long.rb new file mode 100644 index 0000000..c0deaa2 --- /dev/null +++ b/test/lazar-long.rb @@ -0,0 +1,72 @@ +require_relative "setup.rb" + +class LazarExtendedTest < MiniTest::Test + + def test_lazar_bbrc_ham_minfreq + dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"hamster_carcinogenicity.csv") + model = OpenTox::Model::Lazar.create dataset, OpenTox::Algorithm::Fminer.bbrc(dataset, :min_frequency => 5) + feature_dataset = OpenTox::Dataset.find model.feature_dataset_id + assert_equal dataset.compounds.size, feature_dataset.compounds.size + assert_equal 41, feature_dataset.features.size + assert_equal 'N-C=N', feature_dataset.features.first.smarts + compound = OpenTox::Compound.from_inchi("InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H") + prediction = model.predict compound + assert_equal "false", prediction[:value] + assert_equal 0.12380952380952381, prediction[:confidence] + dataset.delete + model.delete + feature_dataset.delete + end + + def test_lazar_bbrc_large_ds + # TODO fminer crashes with these settings + skip "it seems that fminer aborts without further notice" + dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"multi_cell_call_no_dup.csv") + feature_dataset = OpenTox::Algorithm::Fminer.bbrc dataset#, :min_frequency => 15) + model = OpenTox::Model::Lazar.create dataset, feature_dataset + model.save + p model.id + feature_dataset = OpenTox::CalculatedDataset.find model.feature_dataset_id + assert_equal dataset.compounds.size, feature_dataset.compounds.size + assert_equal 52, feature_dataset.features.size + assert_equal '[#17&A]-[#6&A]', feature_dataset.features.first.title + compound = OpenTox::Compound.from_inchi("InChI=1S/C10H9NO2S/c1-8-2-4-9(5-3-8)13-6-10(12)11-7-14/h2-5H,6H2,1H3") + prediction_dataset = model.predict compound + prediction = prediction_dataset.data_entries.first + assert_in_delta 0.025, prediction[:confidence], 0.001 + #assert_equal 0.025885845574483608, prediction[:confidence] + # with compound change in training_dataset see: + # https://github.com/opentox/opentox-test/commit/0e78c9c59d087adbd4cc58bab60fb29cbe0c1da0 + #assert_equal 0.02422364949075546, prediction[:confidence] + dataset.delete + model.delete + feature_dataset.delete + prediction_dataset.delete + end + + def test_lazar_kazius + t = Time.now + dataset = Dataset.from_csv_file File.join(DATA_DIR,"kazius.csv") + p "Dataset upload: #{Time.now-t}" + t = Time.now + feature_dataset = Algorithm::Fminer.bbrc(dataset, :min_frequency => 100) + p "Feature mining: #{Time.now-t}" + t = Time.now + assert_equal feature_dataset.compounds.size, dataset.compounds.size + model = Model::Lazar.create dataset, feature_dataset +=begin +=end + #model = Model::Lazar.find('55bcf5bf7a7838381200017e') + #p model.id + #prediction_times = [] + 2.times do + compound = Compound.from_smiles("Clc1ccccc1NN") + prediction = model.predict compound + assert_equal "1", prediction[:value] + assert_in_delta 0.019858401199860445, prediction[:confidence], 0.001 + end + #dataset.delete + #feature_dataset.delete + end + +end diff --git a/test/lazar-physchem-short.rb b/test/lazar-physchem-short.rb new file mode 100644 index 0000000..ecf8aff --- /dev/null +++ b/test/lazar-physchem-short.rb @@ -0,0 +1,27 @@ +require_relative "setup.rb" + +class LazarPhyschemDescriptorTest < MiniTest::Test + def test_epafhm + # check available descriptors + @descriptors = OpenTox::Algorithm::Descriptor::DESCRIPTORS.keys + assert_equal 111,@descriptors.size,"wrong number of physchem descriptors" + @descriptor_values = OpenTox::Algorithm::Descriptor::DESCRIPTOR_VALUES + + # select descriptors for test + @num_features_offset = 0 + @descriptors.keep_if{|x| x=~/^Openbabel\./} + @descriptors.delete("Openbabel.L5") # TODO Openbabel.L5 does not work, investigate!!! + puts "Descriptors: #{@descriptors}" + + # UPLOAD DATA + training_dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.medi.csv") + puts "Dataset: "+training_dataset.id +# feature_dataset = Algorithm::Descriptor.physchem training_dataset, @descriptors + model = Model::LazarRegression.create training_dataset#, feature_dataset + #p model + compound = Compound.from_smiles "CC(C)(C)CN" + prediction = model.predict compound + p prediction + + end +end -- cgit v1.2.3 From 81a2454a9abde6bb79793eb4c72e4a8725f5fe7f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 15 Aug 2015 11:21:26 +0200 Subject: initial installation script --- ext/lazar/extconf.rb | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 ext/lazar/extconf.rb diff --git a/ext/lazar/extconf.rb b/ext/lazar/extconf.rb new file mode 100644 index 0000000..738a85b --- /dev/null +++ b/ext/lazar/extconf.rb @@ -0,0 +1,88 @@ +require 'fileutils' +main_dir = File.expand_path(File.join(File.dirname(__FILE__),"..","..")) + +# install OpenBabel + +require 'mkmf' +require 'rbconfig' +require 'openbabel/version' + +openbabel_version = 2.3.2 + +openbabel_dir = File.join main_dir, "openbabel" +src_dir = File.join openbabel_dir, "openbabel-#{openbabel_version}" +build_dir = File.join openbabel_dir, "build" +install_dir = openbabel_dir +install_lib_dir = File.join install_dir, "lib" +lib_dir = File.join openbabel_dir, "lib", "openbabel" +ruby_src_dir = File.join src_dir, "scripts", "ruby" + +begin + nr_processors = `grep processor /proc/cpuinfo | wc -l` # speed up compilation, Linux only +rescue + nr_processors = 1 +end + +Dir.chdir openbabel_dir do + FileUtils.rm_rf src_dir + puts "Downloading OpenBabel sources" + system "curl -L -d use_mirror=netcologne 'http://downloads.sourceforge.net/project/openbabel/openbabel/#{ob_num_ver}/openbabel-#{ob_num_ver}.tar.gz' | tar xz" + system "sed -i -e 's/-Wl,-flat_namespace//;s/-flat_namespace//' #{File.join ruby_src_dir, "extconf.rb"}" # remove unrecognized compiler option + system "sed -i -e 's/Init_OpenBabel/Init_openbabel/g' #{File.join ruby_src_dir,"*cpp"}" # fix swig bindings + system "sed -i -e 's/Config::CONFIG/RbConfig::CONFIG/' #{File.join src_dir, "scripts", "CMakeLists.txt" }" # fix Ruby Config + system "sed -i -e 's/Config::CONFIG/RbConfig::CONFIG/' #{File.join ruby_src_dir, "extconf.rb" }" # fix Ruby Config +end +FileUtils.mkdir_p build_dir +FileUtils.mkdir_p install_dir +Dir.chdir build_dir do + puts "Configuring OpenBabel" + cmake = "cmake #{src_dir} -DCMAKE_INSTALL_PREFIX=#{install_dir} -DBUILD_GUI=OFF -DENABLE_TESTS=OFF -DRUBY_BINDINGS=ON" + # set rpath for local installations + # http://www.cmake.org/Wiki/CMake_RPATH_handling + # http://vtk.1045678.n5.nabble.com/How-to-force-cmake-not-to-remove-install-rpath-td5721193.html + cmake += " -DCMAKE_INSTALL_RPATH:STRING=\"#{install_lib_dir}\"" + system cmake +end + +# local installation in gem directory +Dir.chdir build_dir do + puts "Compiling OpenBabel sources." + system "make -j#{nr_processors}" + system "make install" + ENV["PKG_CONFIG_PATH"] = File.dirname(File.expand_path(Dir["#{install_dir}/**/openbabel*pc"].first)) +end + +# get include and lib from pkg-config +ob_include=`pkg-config openbabel-2.0 --cflags-only-I`.sub(/\s+/,'').sub(/-I/,'') +ob_lib=`pkg-config openbabel-2.0 --libs-only-L`.sub(/\s+/,'').sub(/-L/,'') + +# compile ruby bindings +puts "Compiling and installing OpenBabel Ruby bindings." +Dir.chdir ruby_src_dir do + # fix rpath + system "sed -i 's|with_ldflags.*$|with_ldflags(\"#\$LDFLAGS -dynamic -Wl,-rpath,#{install_lib_dir}\") do|' #{File.join(ruby_src_dir,'extconf.rb')}" + system "#{RbConfig.ruby} extconf.rb --with-openbabel-include=#{ob_include} --with-openbabel-lib=#{ob_lib}" + system "make -j#{nr_processors}" +end +FileUtils.cp(ruby_src_dir+"/openbabel.#{RbConfig::CONFIG["DLEXT"]}", "./") +FileUtils.mkdir_p lib_dir +FileUtils.mv "openbabel.#{RbConfig::CONFIG["DLEXT"]}" lib_dir +FileUtils.remove_entry_secure src_dir, build_dir + +# install fminer +fminer_dir = File.join main_dir, "libfminer" +system "git clone git://github.com/amaunz/fminer2.git #{fminer_dir}" + +["libbbrc","liblast"].each do |lib| + FileUtils.cd File.join(fminer_dir,lib) + system "sed -i 's,^INCLUDE_OB.*,INCLUDE_OB\ =\ #{ob_include},g' Makefile" + system "sed -i 's,^LDFLAGS_OB.*,LDFLAGS_OB\ =\ #{ob_lib},g' Makefile" + system "sed -i 's,^INCLUDE_RB.*,INCLUDE_RB\ =\ #{RbConfig::CONFIG['rubyhdrdir']},g' Makefile" + system "make ruby" +end + +# install last-utils +FileUtils.cd main_dir +"git clone git://github.com/amaunz/last-utils.git" + +# install R packagemain_dir -- cgit v1.2.3 From 9a5b7b1bfb352b3a6555babe8bc2344414f66185 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 15 Aug 2015 11:52:18 +0200 Subject: java libraries added --- .gitignore | 3 + java/.gitignore | 2 + java/CdkDescriptorInfo.class | Bin 0 -> 1705 bytes java/CdkDescriptorInfo.java | 22 +++++++ java/CdkDescriptors.class | Bin 0 -> 6167 bytes java/CdkDescriptors.java | 141 ++++++++++++++++++++++++++++++++++++++++ java/Jmol.jar | Bin 0 -> 3422261 bytes java/JoelibDescriptorInfo.class | Bin 0 -> 1039 bytes java/JoelibDescriptorInfo.java | 15 +++++ java/JoelibDescriptors.class | Bin 0 -> 2578 bytes java/JoelibDescriptors.java | 60 +++++++++++++++++ java/Rakefile | 15 +++++ java/cdk-1.4.19.jar | Bin 0 -> 16877592 bytes java/joelib2.jar | Bin 0 -> 1866172 bytes java/log4j.jar | Bin 0 -> 391834 bytes lazar.gemspec | 2 +- 16 files changed, 259 insertions(+), 1 deletion(-) create mode 100644 java/.gitignore create mode 100644 java/CdkDescriptorInfo.class create mode 100644 java/CdkDescriptorInfo.java create mode 100644 java/CdkDescriptors.class create mode 100644 java/CdkDescriptors.java create mode 100644 java/Jmol.jar create mode 100644 java/JoelibDescriptorInfo.class create mode 100644 java/JoelibDescriptorInfo.java create mode 100644 java/JoelibDescriptors.class create mode 100644 java/JoelibDescriptors.java create mode 100644 java/Rakefile create mode 100644 java/cdk-1.4.19.jar create mode 100644 java/joelib2.jar create mode 100644 java/log4j.jar diff --git a/.gitignore b/.gitignore index 8f883a0..926a09d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +last-utils +libfminer +test/fminer_debug.txt Gemfile.lock *.gem .bundle diff --git a/java/.gitignore b/java/.gitignore new file mode 100644 index 0000000..533ae63 --- /dev/null +++ b/java/.gitignore @@ -0,0 +1,2 @@ +bak +docs diff --git a/java/CdkDescriptorInfo.class b/java/CdkDescriptorInfo.class new file mode 100644 index 0000000..9b9408e Binary files /dev/null and b/java/CdkDescriptorInfo.class differ diff --git a/java/CdkDescriptorInfo.java b/java/CdkDescriptorInfo.java new file mode 100644 index 0000000..73a65ac --- /dev/null +++ b/java/CdkDescriptorInfo.java @@ -0,0 +1,22 @@ +import java.util.*; +import org.openscience.cdk.qsar.descriptors.molecular.*; +import org.openscience.cdk.qsar.*; + +class CdkDescriptorInfo { + public static void main(String[] args) { + + DescriptorEngine engine = new DescriptorEngine(DescriptorEngine.MOLECULAR); + + for (Iterator it = engine.getDescriptorInstances().iterator(); it.hasNext(); ) { + IDescriptor descriptor = it.next(); + String cdk_class = descriptor.getClass().toString().replaceAll("class ",""); + System.out.println("- :java_class: \""+cdk_class+"\""); + String description = engine.getDictionaryDefinition(cdk_class).replaceAll("^\\s+", "" ).replaceAll("\\s+$", "").replaceAll("\\s+", " "); + System.out.println(" :description: \""+description+"\""); + System.out.println(" :names:"); + for (String name : descriptor.getDescriptorNames()) { + System.out.println(" - \""+name+"\""); + } + } + } +} diff --git a/java/CdkDescriptors.class b/java/CdkDescriptors.class new file mode 100644 index 0000000..49bfaf2 Binary files /dev/null and b/java/CdkDescriptors.class differ diff --git a/java/CdkDescriptors.java b/java/CdkDescriptors.java new file mode 100644 index 0000000..1236240 --- /dev/null +++ b/java/CdkDescriptors.java @@ -0,0 +1,141 @@ +import java.util.*; +import java.io.*; +import org.openscience.cdk.DefaultChemObjectBuilder; +import org.openscience.cdk.interfaces.IMolecule; +import org.openscience.cdk.io.iterator.IteratingMDLReader; +import org.openscience.cdk.qsar.*; +import org.openscience.cdk.qsar.DescriptorValue; +import org.openscience.cdk.aromaticity.CDKHueckelAromaticityDetector; +import org.openscience.cdk.tools.manipulator.AtomContainerManipulator; +import org.openscience.cdk.exception.NoSuchAtomTypeException; + +class CdkDescriptors { + public static void main(String[] args) { + + if (args==null || args.length<2) { + System.err.println("required params: ..."); + System.exit(1); + } + if (! new File(args[0]).exists()){ + System.err.println("file not found "+args[0]); + System.exit(1); + } + + // command line descriptor params can be either "descriptorName" or "descriptorValueName" + // terminology: + // A descriptor can calculate serveral values, e.g., ALOGP produces ALOGP.ALogP, ALOGP.ALogp2, ALOGP.AMR + // "descriptorName" ALOGP + // "valueName" AMR + // "descriptorValueName" ALOGP.AMR + DescriptorEngine engine; + Set classNames = new LinkedHashSet(); // descriptors to be computed + Set descriptorNames = new LinkedHashSet(); // all values of this descriptor will be printed + Set descriptorValueNames = new LinkedHashSet(); // only these values of a descriptor will be printed + for (int i =1; i < args.length; i++) { + String descriptorName; + if (args[i].indexOf(".")!=-1) { + descriptorValueNames.add(args[i]); + descriptorName = args[i].substring(0,args[i].indexOf(".")); + } + else { + descriptorNames.add(args[i]); + descriptorName = args[i]; + } + classNames.add(getDescriptorClassName(descriptorName)); + } + + engine = new DescriptorEngine(new ArrayList(classNames)); + List instances = engine.instantiateDescriptors(new ArrayList(classNames)); + List specs = engine.initializeSpecifications(instances); + engine.setDescriptorInstances(instances); + engine.setDescriptorSpecifications(specs); + + try { + BufferedReader br = new BufferedReader(new FileReader(args[0])); + PrintWriter yaml = new PrintWriter(new FileWriter(args[0]+"cdk.yaml")); + // parse 3d sdf from file and calculate descriptors + IteratingMDLReader reader = new IteratingMDLReader( br, DefaultChemObjectBuilder.getInstance()); + int c = 0; + while (reader.hasNext()) { + try { + System.out.println("computing "+(args.length-1)+" descriptors for compound "+(++c)); + IMolecule molecule = (IMolecule)reader.next(); + molecule = (IMolecule) AtomContainerManipulator.removeHydrogens(molecule); + try { + AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(molecule); + } + catch (NoSuchAtomTypeException e) { + e.printStackTrace(); + } + CDKHueckelAromaticityDetector.detectAromaticity(molecule); + + engine.process(molecule); + Map properties = molecule.getProperties(); + Boolean first = true; + for (Map.Entry entry : properties.entrySet()) { + try { + if ((entry.getKey() instanceof DescriptorSpecification) && (entry.getValue() instanceof DescriptorValue)) { + DescriptorSpecification property = (DescriptorSpecification)entry.getKey(); + DescriptorValue value = (DescriptorValue)entry.getValue(); + String[] values = value.getValue().toString().split(","); + for (int i = 0; i < values.length; i++) { + String cdk_class = property.getImplementationTitle(); + String descriptorName = cdk_class.substring(cdk_class.lastIndexOf(".")+1).replace("Descriptor",""); + String descriptorValueName = descriptorName + "." + value.getNames()[i]; + if (descriptorNames.contains(descriptorName) || descriptorValueNames.contains(descriptorValueName)) { + if (first) { yaml.print("- "); first = false; } + else { yaml.print(" "); } + yaml.println("Cdk." + descriptorValueName + ": " + values[i]); + } + } + } + } + catch (ClassCastException e) { } // sdf properties are stored as molecules properties (strings), ignore them + catch (Exception e) { e.printStackTrace(); } // output nothing to yaml + } + } + catch (Exception e) { + yaml.println("- {}"); + e.printStackTrace(); + continue; + } + } + yaml.close(); + } + catch (Exception e) { e.printStackTrace(); } + } + + + /** HACK to find the class for a descriptor + * problem: Descriptor is not always at the end of the class (APolDescriptor), but may be in the middle (AutocorrelationDescriptorPolarizability) + * this method makes a class-lookup using trial and error */ + static String getDescriptorClassName(String descriptorName) { + String split = splitCamelCase(descriptorName)+" "; // space mark possible positions for 'Descriptor' + for(int i = split.length()-1; i>0; i--) { + if (split.charAt(i)==' ') { // iterate over all spaces, starting with the trailing one + String test = split.substring(0,i)+"Descriptor"+split.substring(i+1,split.length()); // replace current space with 'Descriptor' .. + test = test.replaceAll("\\s",""); // .. and remove other spaces + String className = "org.openscience.cdk.qsar.descriptors.molecular." + test; + try { + Class.forName(className); + return className; + } catch (ClassNotFoundException e) {} + } + } + System.err.println("Descriptor not found: "+descriptorName); + System.exit(1); + return null; + } + + /** inserts space in between camel words */ + static String splitCamelCase(String s) { + return s.replaceAll( + String.format("%s|%s|%s", + "(?<=[A-Z])(?=[A-Z][a-z])", + "(?<=[^A-Z])(?=[A-Z])", + "(?<=[A-Za-z])(?=[^A-Za-z])" + ), + " " + ); + } +} diff --git a/java/Jmol.jar b/java/Jmol.jar new file mode 100644 index 0000000..2c7e5aa Binary files /dev/null and b/java/Jmol.jar differ diff --git a/java/JoelibDescriptorInfo.class b/java/JoelibDescriptorInfo.class new file mode 100644 index 0000000..0ee67bf Binary files /dev/null and b/java/JoelibDescriptorInfo.class differ diff --git a/java/JoelibDescriptorInfo.java b/java/JoelibDescriptorInfo.java new file mode 100644 index 0000000..851d650 --- /dev/null +++ b/java/JoelibDescriptorInfo.java @@ -0,0 +1,15 @@ +import joelib2.feature.FeatureHelper; + +class JoelibDescriptorInfo { + public static void main(String[] args) { + FeatureHelper helper = FeatureHelper.instance(); + System.out.println("---"); // document separator for Joelib debug messages + for (Object feature : helper.getNativeFeatures() ) { + System.out.println("- :java_class: \""+feature.toString()+"\""); + // methods for accessing feature descriptions e.g. with + // FeatureFactory.instance().getFeature(feature.toString()).getDescription().getText() or + // FeatureFactory.instance().getFeature(feature.toString()).getDescription().getHtml() + // are defunct + } + } +} diff --git a/java/JoelibDescriptors.class b/java/JoelibDescriptors.class new file mode 100644 index 0000000..d88ac63 Binary files /dev/null and b/java/JoelibDescriptors.class differ diff --git a/java/JoelibDescriptors.java b/java/JoelibDescriptors.java new file mode 100644 index 0000000..e90e35f --- /dev/null +++ b/java/JoelibDescriptors.java @@ -0,0 +1,60 @@ +import java.util.*; +import java.io.*; +import joelib2.feature.Feature; +import joelib2.feature.FeatureHelper; +import joelib2.feature.FeatureFactory; +import joelib2.feature.FeatureResult; +import joelib2.io.BasicIOType; +import joelib2.io.BasicIOTypeHolder; +import joelib2.io.BasicReader; +import joelib2.io.MoleculeFileHelper; +import joelib2.io.MoleculeFileIO; +import joelib2.io.MoleculeIOException; +import joelib2.molecule.BasicConformerMolecule; + +class JoelibDescriptors { + public static void main(String[] args) { + + String[] features = null; + features = new String[args.length-1]; + System.arraycopy(args,1,features,0,args.length-1); + + FeatureFactory factory = FeatureFactory.instance(); + MoleculeFileIO loader = null; + String line = new String(); + String sdf = new String(); + try { + // parse 3d sdf from file and calculate descriptors + InputStream is = new FileInputStream(args[0]); + PrintWriter yaml = new PrintWriter(new FileWriter(args[0]+"joelib.yaml")); + BasicIOType inType = BasicIOTypeHolder.instance().getIOType("SDF"); + loader = MoleculeFileHelper.getMolReader(is, inType); + BasicConformerMolecule mol = new BasicConformerMolecule(inType, inType); + while (true) { + try { + Boolean success = loader.read(mol); + if (!success) { break; } // last molecule + for (int i =0; i < features.length; i++) { + String name = "joelib2.feature.types." + features[i]; + Feature feature = factory.getFeature(name); + FeatureResult result = feature.calculate(mol); + if (i == 0) { yaml.print("- "); } + else { yaml.print(" "); } + yaml.print( "Joelib."+features[i]+": " ); + yaml.println( result.toString() ); + } + + } + catch (Exception e) { + System.err.println(e.toString()); + e.printStackTrace(); + } + } + yaml.close(); + } + catch (Exception e) { + System.err.println(e.toString()); + e.printStackTrace(); + } + } +} diff --git a/java/Rakefile b/java/Rakefile new file mode 100644 index 0000000..a865528 --- /dev/null +++ b/java/Rakefile @@ -0,0 +1,15 @@ +# Java class, classpath +java_classes = [ + ["CdkDescriptors", "cdk-1.4.19.jar"], + ["CdkDescriptorInfo", "cdk-1.4.19.jar"], + ["JoelibDescriptors", "joelib2.jar:."], + ["JoelibDescriptorInfo", "joelib2.jar:."], +] + +task :default => java_classes.collect{|c| "#{c.first}.class"} + +java_classes.each do |c| + file "#{c.first}.class" => "#{c.first}.java" do + puts `javac -classpath #{c.last} #{c.first}.java` + end +end diff --git a/java/cdk-1.4.19.jar b/java/cdk-1.4.19.jar new file mode 100644 index 0000000..3281c87 Binary files /dev/null and b/java/cdk-1.4.19.jar differ diff --git a/java/joelib2.jar b/java/joelib2.jar new file mode 100644 index 0000000..fae8d3c Binary files /dev/null and b/java/joelib2.jar differ diff --git a/java/log4j.jar b/java/log4j.jar new file mode 100644 index 0000000..c930a6a Binary files /dev/null and b/java/log4j.jar differ diff --git a/lazar.gemspec b/lazar.gemspec index 8da29b7..6fe3f5b 100644 --- a/lazar.gemspec +++ b/lazar.gemspec @@ -22,7 +22,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency "bundler" s.add_runtime_dependency "rest-client" s.add_runtime_dependency 'nokogiri' - s.add_runtime_dependency "openbabel" + #s.add_runtime_dependency "openbabel" s.add_runtime_dependency 'rserve-client' s.add_runtime_dependency "mongoid", '~> 5.0beta' -- cgit v1.2.3 From c26112cbe94689da20688b4924c9025a995310ae Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sat, 15 Aug 2015 14:57:16 +0200 Subject: openbabel and fminer installation added --- ext/lazar/extconf.rb | 41 ++++++++++++++++++++++------------------- java/.gitignore | 2 -- 2 files changed, 22 insertions(+), 21 deletions(-) delete mode 100644 java/.gitignore diff --git a/ext/lazar/extconf.rb b/ext/lazar/extconf.rb index 738a85b..c37b40b 100644 --- a/ext/lazar/extconf.rb +++ b/ext/lazar/extconf.rb @@ -1,17 +1,16 @@ require 'fileutils' +require 'rbconfig' + main_dir = File.expand_path(File.join(File.dirname(__FILE__),"..","..")) # install OpenBabel -require 'mkmf' -require 'rbconfig' -require 'openbabel/version' -openbabel_version = 2.3.2 +openbabel_version = "2.3.2" openbabel_dir = File.join main_dir, "openbabel" -src_dir = File.join openbabel_dir, "openbabel-#{openbabel_version}" -build_dir = File.join openbabel_dir, "build" +src_dir = openbabel_dir #File.join openbabel_dir, "openbabel-#{openbabel_version}" +build_dir = File.join src_dir, "build" install_dir = openbabel_dir install_lib_dir = File.join install_dir, "lib" lib_dir = File.join openbabel_dir, "lib", "openbabel" @@ -23,14 +22,12 @@ rescue nr_processors = 1 end -Dir.chdir openbabel_dir do +#FileUtils.mkdir_p openbabel_dir +=begin +Dir.chdir main_dir do FileUtils.rm_rf src_dir puts "Downloading OpenBabel sources" - system "curl -L -d use_mirror=netcologne 'http://downloads.sourceforge.net/project/openbabel/openbabel/#{ob_num_ver}/openbabel-#{ob_num_ver}.tar.gz' | tar xz" - system "sed -i -e 's/-Wl,-flat_namespace//;s/-flat_namespace//' #{File.join ruby_src_dir, "extconf.rb"}" # remove unrecognized compiler option - system "sed -i -e 's/Init_OpenBabel/Init_openbabel/g' #{File.join ruby_src_dir,"*cpp"}" # fix swig bindings - system "sed -i -e 's/Config::CONFIG/RbConfig::CONFIG/' #{File.join src_dir, "scripts", "CMakeLists.txt" }" # fix Ruby Config - system "sed -i -e 's/Config::CONFIG/RbConfig::CONFIG/' #{File.join ruby_src_dir, "extconf.rb" }" # fix Ruby Config + system "git clone https://github.com/openbabel/openbabel.git" end FileUtils.mkdir_p build_dir FileUtils.mkdir_p install_dir @@ -51,11 +48,13 @@ Dir.chdir build_dir do system "make install" ENV["PKG_CONFIG_PATH"] = File.dirname(File.expand_path(Dir["#{install_dir}/**/openbabel*pc"].first)) end +=end # get include and lib from pkg-config -ob_include=`pkg-config openbabel-2.0 --cflags-only-I`.sub(/\s+/,'').sub(/-I/,'') -ob_lib=`pkg-config openbabel-2.0 --libs-only-L`.sub(/\s+/,'').sub(/-L/,'') +ob_include= File.expand_path "../../openbabel/include/openbabel-2.0" +ob_lib= File.expand_path "../../openbabel/lib" +=begin # compile ruby bindings puts "Compiling and installing OpenBabel Ruby bindings." Dir.chdir ruby_src_dir do @@ -64,10 +63,11 @@ Dir.chdir ruby_src_dir do system "#{RbConfig.ruby} extconf.rb --with-openbabel-include=#{ob_include} --with-openbabel-lib=#{ob_lib}" system "make -j#{nr_processors}" end -FileUtils.cp(ruby_src_dir+"/openbabel.#{RbConfig::CONFIG["DLEXT"]}", "./") -FileUtils.mkdir_p lib_dir -FileUtils.mv "openbabel.#{RbConfig::CONFIG["DLEXT"]}" lib_dir -FileUtils.remove_entry_secure src_dir, build_dir +#FileUtils.cp(ruby_src_dir+"/openbabel.#{RbConfig::CONFIG["DLEXT"]}", "./") +#FileUtils.mkdir_p lib_dir +#FileUtils.mv "openbabel.#{RbConfig::CONFIG["DLEXT"]}", lib_dir +#FileUtils.remove_entry_secure src_dir, build_dir +=end # install fminer fminer_dir = File.join main_dir, "libfminer" @@ -78,11 +78,14 @@ system "git clone git://github.com/amaunz/fminer2.git #{fminer_dir}" system "sed -i 's,^INCLUDE_OB.*,INCLUDE_OB\ =\ #{ob_include},g' Makefile" system "sed -i 's,^LDFLAGS_OB.*,LDFLAGS_OB\ =\ #{ob_lib},g' Makefile" system "sed -i 's,^INCLUDE_RB.*,INCLUDE_RB\ =\ #{RbConfig::CONFIG['rubyhdrdir']},g' Makefile" + # TODO fix in fminer Makefile + system "sed -i 's,-g, -g -I #{RbConfig::CONFIG['rubyhdrdir']} -I #{RbConfig::CONFIG['rubyarchhdrdir']} -I,' Makefile" # fix include path (CH) + system "sed -i '74s/$(CC)/$(CC) -L/' Makefile" # fix library path (CH) system "make ruby" end # install last-utils FileUtils.cd main_dir -"git clone git://github.com/amaunz/last-utils.git" +system "git clone git://github.com/amaunz/last-utils.git" # install R packagemain_dir diff --git a/java/.gitignore b/java/.gitignore deleted file mode 100644 index 533ae63..0000000 --- a/java/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -bak -docs -- cgit v1.2.3 From 4f622dd05299c3812286e11e8fce3e656e21ef29 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 18 Aug 2015 13:19:37 +0200 Subject: first attempt at installing openbabel from github --- ChangeLog | 2 - ext/lazar/extconf.rb | 13 +++-- lazar.gemspec | 2 +- lib/lazar-model.rb | 134 +-------------------------------------------------- 4 files changed, 9 insertions(+), 142 deletions(-) delete mode 100644 ChangeLog diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index 08d2402..0000000 --- a/ChangeLog +++ /dev/null @@ -1,2 +0,0 @@ -v0.0.3 2012-05-07 -* switch from v0.0.2pre to v0.0.3 diff --git a/ext/lazar/extconf.rb b/ext/lazar/extconf.rb index c37b40b..0c86985 100644 --- a/ext/lazar/extconf.rb +++ b/ext/lazar/extconf.rb @@ -22,8 +22,7 @@ rescue nr_processors = 1 end -#FileUtils.mkdir_p openbabel_dir -=begin +FileUtils.mkdir_p openbabel_dir Dir.chdir main_dir do FileUtils.rm_rf src_dir puts "Downloading OpenBabel sources" @@ -48,26 +47,26 @@ Dir.chdir build_dir do system "make install" ENV["PKG_CONFIG_PATH"] = File.dirname(File.expand_path(Dir["#{install_dir}/**/openbabel*pc"].first)) end -=end # get include and lib from pkg-config ob_include= File.expand_path "../../openbabel/include/openbabel-2.0" ob_lib= File.expand_path "../../openbabel/lib" -=begin # compile ruby bindings puts "Compiling and installing OpenBabel Ruby bindings." Dir.chdir ruby_src_dir do + #p `pwd` # fix rpath system "sed -i 's|with_ldflags.*$|with_ldflags(\"#\$LDFLAGS -dynamic -Wl,-rpath,#{install_lib_dir}\") do|' #{File.join(ruby_src_dir,'extconf.rb')}" system "#{RbConfig.ruby} extconf.rb --with-openbabel-include=#{ob_include} --with-openbabel-lib=#{ob_lib}" system "make -j#{nr_processors}" end + +#p(ruby_src_dir+"/openbabel.#{RbConfig::CONFIG["DLEXT"]}", "./") #FileUtils.cp(ruby_src_dir+"/openbabel.#{RbConfig::CONFIG["DLEXT"]}", "./") -#FileUtils.mkdir_p lib_dir -#FileUtils.mv "openbabel.#{RbConfig::CONFIG["DLEXT"]}", lib_dir +FileUtils.mkdir_p lib_dir +FileUtils.mv "openbabel.#{RbConfig::CONFIG["DLEXT"]}", lib_dir #FileUtils.remove_entry_secure src_dir, build_dir -=end # install fminer fminer_dir = File.join main_dir, "libfminer" diff --git a/lazar.gemspec b/lazar.gemspec index 6fe3f5b..8da29b7 100644 --- a/lazar.gemspec +++ b/lazar.gemspec @@ -22,7 +22,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency "bundler" s.add_runtime_dependency "rest-client" s.add_runtime_dependency 'nokogiri' - #s.add_runtime_dependency "openbabel" + s.add_runtime_dependency "openbabel" s.add_runtime_dependency 'rserve-client' s.add_runtime_dependency "mongoid", '~> 5.0beta' diff --git a/lib/lazar-model.rb b/lib/lazar-model.rb index aeaa515..1970401 100644 --- a/lib/lazar-model.rb +++ b/lib/lazar-model.rb @@ -129,8 +129,6 @@ module OpenTox end class LazarFminerClassification < LazarClassification - #field :feature_dataset_id, type: BSON::ObjectId - #field :feature_calculation_algorithm, type: String def self.create training_dataset model = super(training_dataset) @@ -145,136 +143,6 @@ module OpenTox model.save model end - -=begin - def predict object - - t = Time.now - at = Time.now - - @training_dataset = OpenTox::Dataset.find(training_dataset_id) - @feature_dataset = OpenTox::Dataset.find(feature_dataset_id) - - compounds = [] - case object.class.to_s - when "OpenTox::Compound" - compounds = [object] - when "Array" - compounds = object - when "OpenTox::Dataset" - compounds = object.compounds - else - bad_request_error "Please provide a OpenTox::Compound an Array of OpenTox::Compounds or an OpenTox::Dataset as parameter." - end - - $logger.debug "Setup: #{Time.now-t}" - t = Time.now - - @query_fingerprint = Algorithm.run(feature_calculation_algorithm, compounds, @feature_dataset.features.collect{|f| f.name} ) - - $logger.debug "Query fingerprint calculation: #{Time.now-t}" - t = Time.now - - predictions = [] - prediction_feature = OpenTox::Feature.find prediction_feature_id - tt = 0 - pt = 0 - nt = 0 - st = 0 - nit = 0 - @training_fingerprints ||= @feature_dataset.data_entries - compounds.each_with_index do |compound,c| - t = Time.new - - $logger.debug "predict compound #{c+1}/#{compounds.size} #{compound.inchi}" - - database_activities = @training_dataset.values(compound,prediction_feature) - if database_activities and !database_activities.empty? - database_activities = database_activities.first if database_activities.size == 1 - $logger.debug "Compound #{compound.inchi} occurs in training dataset with activity #{database_activities}" - predictions << {:compound => compound, :value => database_activities, :confidence => "measured"} - next - else - - #training_fingerprints = @feature_dataset.data_entries - query_fingerprint = @query_fingerprint[c] - neighbors = [] - tt += Time.now-t - t = Time.new - - - # find neighbors - @training_fingerprints.each_with_index do |fingerprint, i| - ts = Time.new - sim = Algorithm.run(similarity_algorithm,fingerprint, query_fingerprint) - st += Time.now-ts - ts = Time.new - if sim > self.min_sim - if prediction_algorithm =~ /Regression/ - neighbors << [@feature_dataset.compound_ids[i],sim,training_activities[i], fingerprint] - else - neighbors << [@feature_dataset.compound_ids[i],sim,training_activities[i]] # use compound_ids, instantiation of Compounds is too time consuming - end - end - nit += Time.now-ts - end - - if neighbors.empty? - predictions << {:compound => compound, :value => nil, :confidence => nil, :warning => "No neighbors with similarity > #{min_sim} in dataset #{training_dataset.id}"} - next - end - nt += Time.now-t - t = Time.new - - if prediction_algorithm =~ /Regression/ - prediction = Algorithm.run(prediction_algorithm, neighbors, :min_train_performance => self.min_train_performance) - else - prediction = Algorithm.run(prediction_algorithm, neighbors) - end - prediction[:compound] = compound - prediction[:neighbors] = neighbors.sort{|a,b| b[1] <=> a[1]} # sort with ascending similarities - - - # AM: transform to original space (TODO) - #confidence_value = ((confidence_value+1.0)/2.0).abs if prediction.first and similarity_algorithm =~ /cosine/ - - - $logger.debug "predicted value: #{prediction[:value]}, confidence: #{prediction[:confidence]}" - predictions << prediction - pt += Time.now-t - end - - end - $logger.debug "Transform time: #{tt}" - $logger.debug "Neighbor search time: #{nt} (Similarity calculation: #{st}, Neighbor insert: #{nit})" - $logger.debug "Prediction time: #{pt}" - $logger.debug "Total prediction time: #{Time.now-at}" - - # serialize result - case object.class.to_s - when "OpenTox::Compound" - return predictions.first - when "Array" - return predictions - when "OpenTox::Dataset" - # prepare prediction dataset - prediction_dataset = LazarPrediction.new( - :title => "Lazar prediction for #{prediction_feature.title}", - :creator => __FILE__, - :prediction_feature_id => prediction_feature.id - - ) - confidence_feature = OpenTox::NumericFeature.find_or_create_by( "title" => "Prediction confidence" ) - warning_feature = OpenTox::NominalFeature.find_or_create_by("title" => "Warnings") - prediction_dataset.features = [ prediction_feature, confidence_feature, warning_feature ] - prediction_dataset.compounds = compounds - prediction_dataset.data_entries = predictions.collect{|p| [p[:value], p[:confidence],p[:warning]]} - prediction_dataset.save_all - return prediction_dataset - end - - end -=end end class LazarRegression < Lazar @@ -291,6 +159,8 @@ module OpenTox class PredictionModel < Lazar field :category, type: String field :endpoint, type: String + field :unit, type: String + field :model_id, type: BSON::ObjectId field :crossvalidation_id, type: BSON::ObjectId end -- cgit v1.2.3 From 4067d78c78c1f503b5f21d043ece8042260a3d78 Mon Sep 17 00:00:00 2001 From: ch Date: Tue, 18 Aug 2015 16:37:09 +0200 Subject: initial installation fixes, installs on Debian 3.16.7 --- ext/lazar/extconf.rb | 12 ++++-------- lazar.gemspec | 2 +- lib/compound.rb | 28 ++++++++++++++++------------ lib/lazar.rb | 7 +++++-- mongoid.yml | 8 ++++++++ test/compound.rb | 2 +- 6 files changed, 35 insertions(+), 24 deletions(-) create mode 100644 mongoid.yml diff --git a/ext/lazar/extconf.rb b/ext/lazar/extconf.rb index 0c86985..d274c4d 100644 --- a/ext/lazar/extconf.rb +++ b/ext/lazar/extconf.rb @@ -28,11 +28,12 @@ Dir.chdir main_dir do puts "Downloading OpenBabel sources" system "git clone https://github.com/openbabel/openbabel.git" end + FileUtils.mkdir_p build_dir FileUtils.mkdir_p install_dir Dir.chdir build_dir do puts "Configuring OpenBabel" - cmake = "cmake #{src_dir} -DCMAKE_INSTALL_PREFIX=#{install_dir} -DBUILD_GUI=OFF -DENABLE_TESTS=OFF -DRUBY_BINDINGS=ON" + cmake = "cmake #{src_dir} -DCMAKE_INSTALL_PREFIX=#{install_dir} -DBUILD_GUI=OFF -DENABLE_TESTS=OFF -DRUN_SWIG=ON -DRUBY_BINDINGS=ON" # set rpath for local installations # http://www.cmake.org/Wiki/CMake_RPATH_handling # http://vtk.1045678.n5.nabble.com/How-to-force-cmake-not-to-remove-install-rpath-td5721193.html @@ -55,19 +56,12 @@ ob_lib= File.expand_path "../../openbabel/lib" # compile ruby bindings puts "Compiling and installing OpenBabel Ruby bindings." Dir.chdir ruby_src_dir do - #p `pwd` # fix rpath system "sed -i 's|with_ldflags.*$|with_ldflags(\"#\$LDFLAGS -dynamic -Wl,-rpath,#{install_lib_dir}\") do|' #{File.join(ruby_src_dir,'extconf.rb')}" system "#{RbConfig.ruby} extconf.rb --with-openbabel-include=#{ob_include} --with-openbabel-lib=#{ob_lib}" system "make -j#{nr_processors}" end -#p(ruby_src_dir+"/openbabel.#{RbConfig::CONFIG["DLEXT"]}", "./") -#FileUtils.cp(ruby_src_dir+"/openbabel.#{RbConfig::CONFIG["DLEXT"]}", "./") -FileUtils.mkdir_p lib_dir -FileUtils.mv "openbabel.#{RbConfig::CONFIG["DLEXT"]}", lib_dir -#FileUtils.remove_entry_secure src_dir, build_dir - # install fminer fminer_dir = File.join main_dir, "libfminer" system "git clone git://github.com/amaunz/fminer2.git #{fminer_dir}" @@ -86,5 +80,7 @@ end # install last-utils FileUtils.cd main_dir system "git clone git://github.com/amaunz/last-utils.git" +FileUtils.cd File.join(main_dir,"last-utils") +`sed -i '8s/"openbabel", //' lu.rb` # install R packagemain_dir diff --git a/lazar.gemspec b/lazar.gemspec index 8da29b7..6fe3f5b 100644 --- a/lazar.gemspec +++ b/lazar.gemspec @@ -22,7 +22,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency "bundler" s.add_runtime_dependency "rest-client" s.add_runtime_dependency 'nokogiri' - s.add_runtime_dependency "openbabel" + #s.add_runtime_dependency "openbabel" s.add_runtime_dependency 'rserve-client' s.add_runtime_dependency "mongoid", '~> 5.0beta' diff --git a/lib/compound.rb b/lib/compound.rb index 10deabc..e51e9ad 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -62,7 +62,7 @@ module OpenTox # Temporary workaround for OpenBabels Inchi bug # http://sourceforge.net/p/openbabel/bugs/957/ # bug has not been fixed in latest git/development version - smiles = `echo "#{inchi}" | babel -iinchi - -ocan`.chomp.strip + smiles = `echo "#{inchi}" | "#{File.join(File.dirname(__FILE__),"..","openbabel","bin","babel")}" -iinchi - -ocan`.chomp.strip if smiles.empty? Compound.find_or_create_by(:warning => "InChi parsing failed for #{inchi}, this may be caused by an incorrect InChi string or a bug in OpenBabel libraries.") else @@ -91,7 +91,8 @@ module OpenTox # @return [String] InChI string def inchi unless self["inchi"] - result = `echo "#{self.smiles}" | babel -ismi - -oinchi`.chomp + + result = `echo "#{self.smiles}" | "#{File.join(File.dirname(__FILE__),"..","openbabel","bin","babel")}" -ismi - -oinchi`.chomp update(:inchi => result.chomp) unless result.empty? end self["inchi"] @@ -182,21 +183,23 @@ module OpenTox #reqbits = [count['_id'] for count in db.mfp_counts.find({'_id': {'$in': qfp}}).sort('count', 1).limit(qn - qmin + 1)] aggregate = [ #{'$match': {'mfp.count': {'$gte': qmin, '$lte': qmax}, 'mfp.bits': {'$in': reqbits}}}, - {'$match': {'_id': {'$ne': self.id}}}, # remove self - {'$project': { - 'tanimoto': {'$let': { - 'vars': {'common': {'$size': {'$setIntersection': ['$fp4', fp4]}}}, - 'in': {'$divide': ['$$common', {'$subtract': [{'$add': [qn, '$fp4_size']}, '$$common']}]} + {'$match' => {'_id' => {'$ne' => self.id}}}, # remove self + {'$project' => { + 'tanimoto' => {'$let' => { + 'vars' => {'common' => {'$size' => {'$setIntersection' => ['$fp4', fp4]}}}, + 'in' => {'$divide' => ['$$common', {'$subtract' => [{'$add' => [qn, '$fp4_size']}, '$$common']}]} }}, - '_id': 1 + '_id' => 1 }}, - {'$match': {'tanimoto': {'$gte': threshold}}}, - {'$sort': {'tanimoto': -1}} + {'$match' => {'tanimoto' => {'$gte' => threshold}}}, + {'$sort' => {'tanimoto' => -1}} ] $mongo["compounds"].aggregate(aggregate).collect{ |r| [r["_id"], r["tanimoto"]] } end +=begin +=end private @@ -210,11 +213,12 @@ module OpenTox when /smi|can|inchi/ obconversion.write_string(obmol).gsub(/\s/,'').chomp when /sdf/ - OpenBabel::OBOp.find_type("Gen3D").do(obmol) +# TODO set 3D + #OpenBabel::OBOp.find_type("Gen3D").do(obmol) sdf = obconversion.write_string(obmol) if sdf.match(/.nan/) $logger.warn "3D generation failed for compound #{identifier}, trying to calculate 2D structure" - OpenBabel::OBOp.find_type("Gen2D").do(obmol) + #OpenBabel::OBOp.find_type("Gen2D").do(obmol) sdf = obconversion.write_string(obmol) if sdf.match(/.nan/) $logger.warn "2D generation failed for compound #{identifier}" diff --git a/lib/lazar.rb b/lib/lazar.rb index 0c5e18b..9e2363c 100644 --- a/lib/lazar.rb +++ b/lib/lazar.rb @@ -14,7 +14,7 @@ require "base64" # TODO retrieve correct environment from Rack/Sinatra ENV["MONGOID_ENV"] ||= "development" # TODO remove config files, change default via ENV or directly in Mongoid class -Mongoid.load!("#{ENV['HOME']}/.opentox/config/mongoid.yml") +Mongoid.load!("#{File.expand_path(File.join(File.dirname(__FILE__),'..','mongoid.yml'))}") # TODO get Mongo::Client from Mongoid $mongo = Mongo::Client.new('mongodb://127.0.0.1:27017/opentox') # TODO same for GridFS @@ -31,10 +31,13 @@ Mongo::Logger.level = Logger::WARN #Mongoid.logger = $logger # Require sub-Repositories +# TODO: set +ENV["LD_LIBRARY_PATH"] = "#{File.join File.dirname(__FILE__),'..','openbabel','lib'}" +p ENV["LD_LIBRARY_PATH"] require_relative '../libfminer/libbbrc/bbrc' # include before openbabel require_relative '../libfminer/liblast/last' # require_relative '../last-utils/lu.rb' -require 'openbabel' +require_relative '../openbabel/lib/openbabel' # Fminer environment variables ENV['FMINER_SMARTS'] = 'true' diff --git a/mongoid.yml b/mongoid.yml new file mode 100644 index 0000000..20b644b --- /dev/null +++ b/mongoid.yml @@ -0,0 +1,8 @@ +development: + clients: + default: + database: opentox + hosts: + - localhost:27017 + options: + raise_not_found_error: false diff --git a/test/compound.rb b/test/compound.rb index b45e3d0..40b9f9e 100644 --- a/test/compound.rb +++ b/test/compound.rb @@ -83,7 +83,7 @@ class CompoundTest < MiniTest::Test end def test_neighbors - d = Dataset.from_csv_file "data/EPAFHM.csv" + d = Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.csv") d.compounds.each do |c| refute_nil c.fp4 end -- cgit v1.2.3 From 36e10aa98a3d19a78a1889857262abe338a05eef Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 12:57:23 +0200 Subject: libfminer rpath fixed, installation instructions --- README.md | 41 ++++++++++++++++++----------------------- ext/lazar/extconf.rb | 2 +- lib/compound.rb | 13 ++++++++++++- lib/lazar.rb | 3 --- test/compound.rb | 5 ++--- 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 91889ec..c398df2 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,33 @@ -opentox-client -==================== - -Thin Ruby wrapper for the [OpenTox](http://www.opentox.org) REST API - -Libraries: - -* {OpenTox::Algorithm} Wrapper for OpenTox Algorithms -* {OpenTox::Authorization} Authorization and Authentication -* {OpenTox::Compound} Compound Library -* {OpenTox::Dataset} Dataset Library -* {OpenTox::Error} extends Exception class according the OpenTox API -* {OpenTox::Model} Model Library -* {OpenTox} OpenTox Library - general definition of OpenTox objects -* {OTLogger} OpenTox Logger Extensions -* {OpenTox::Policies} parse and serialize XML for the openSSO A&A server -* {OpenTox::RestClientWrapper} wrapper for the RestClient gem -* {OpenTox::Task} Task Library +lazar +===== +Ruby libraries for the lazar framework Dependencies ------------ - libraptor1-dev + lazar depends on a couple of external programs and libraries. On Debian 7 "Wheezy" systems you can install them with + + `sudo apt-get install build-essential ruby ruby-dev git cmake swig r-base r-base-dev r-cran-rserve openjdk-7-jre libgsl0-dev libxml2-dev zlib1g-dev libcairo2-dev` + + You will also need at least mongodb version 3.0, but Debian "Wheezy" provides version 2.4. Please follow the instructions at http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian/: + + ``` + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 + echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list + sudo apt-get update + sudo apt-get install -y mongodb-org + ``` Installation ------------ - gem install opentox-client + gem install lazar Documentation ------------- -* [API documentation](http://rdoc.info/gems/opentox-client) -* [RubyDoc.info Code documentation](http://rubydoc.info/github/opentox/opentox-client/development/frames) +* [API documentation](http://rdoc.info/gems/lazar) Copyright --------- -Copyright (c) 2009-2014 Christoph Helma, Martin Guetlein, Micha Rautenberg, Andreas Maunz, David Vorgrimmler, Denis Gebele. See LICENSE for details. +Copyright (c) 2009-2015 Christoph Helma, Martin Guetlein, Micha Rautenberg, Andreas Maunz, David Vorgrimmler, Denis Gebele. See LICENSE for details. diff --git a/ext/lazar/extconf.rb b/ext/lazar/extconf.rb index d274c4d..b86c61b 100644 --- a/ext/lazar/extconf.rb +++ b/ext/lazar/extconf.rb @@ -73,7 +73,7 @@ system "git clone git://github.com/amaunz/fminer2.git #{fminer_dir}" system "sed -i 's,^INCLUDE_RB.*,INCLUDE_RB\ =\ #{RbConfig::CONFIG['rubyhdrdir']},g' Makefile" # TODO fix in fminer Makefile system "sed -i 's,-g, -g -I #{RbConfig::CONFIG['rubyhdrdir']} -I #{RbConfig::CONFIG['rubyarchhdrdir']} -I,' Makefile" # fix include path (CH) - system "sed -i '74s/$(CC)/$(CC) -L/' Makefile" # fix library path (CH) + system "sed -i '74s/$(CC)/$(CC) -Wl,-rpath,#{ob_lib.gsub('/','\/')} -L/' Makefile" # fix library path (CH) system "make ruby" end diff --git a/lib/compound.rb b/lib/compound.rb index e51e9ad..fdec019 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -213,11 +213,22 @@ module OpenTox when /smi|can|inchi/ obconversion.write_string(obmol).gsub(/\s/,'').chomp when /sdf/ -# TODO set 3D +p "SDF conversion" + # has no effect + #obconversion.add_option("gen3D", OpenBabel::OBConversion::GENOPTIONS) + # segfaults with openbabel git master #OpenBabel::OBOp.find_type("Gen3D").do(obmol) + + builder = OpenBabel::OBBuilder.new + builder.build(obmol); + sdf = obconversion.write_string(obmol) +print sdf if sdf.match(/.nan/) + +# TODO: fix or eliminate 2d generation $logger.warn "3D generation failed for compound #{identifier}, trying to calculate 2D structure" + obconversion.set_options("gen2D", OpenBabel::OBConversion::GENOPTIONS) #OpenBabel::OBOp.find_type("Gen2D").do(obmol) sdf = obconversion.write_string(obmol) if sdf.match(/.nan/) diff --git a/lib/lazar.rb b/lib/lazar.rb index 9e2363c..2ea8cba 100644 --- a/lib/lazar.rb +++ b/lib/lazar.rb @@ -31,9 +31,6 @@ Mongo::Logger.level = Logger::WARN #Mongoid.logger = $logger # Require sub-Repositories -# TODO: set -ENV["LD_LIBRARY_PATH"] = "#{File.join File.dirname(__FILE__),'..','openbabel','lib'}" -p ENV["LD_LIBRARY_PATH"] require_relative '../libfminer/libbbrc/bbrc' # include before openbabel require_relative '../libfminer/liblast/last' # require_relative '../last-utils/lu.rb' diff --git a/test/compound.rb b/test/compound.rb index 40b9f9e..7265ef5 100644 --- a/test/compound.rb +++ b/test/compound.rb @@ -40,6 +40,7 @@ class CompoundTest < MiniTest::Test def test_sdf_export c = OpenTox::Compound.from_smiles "CC=O" +print c.sdf assert_match /7 6 0 0 0 0 0 0 0 0999 V2000/, c.sdf end @@ -51,7 +52,6 @@ class CompoundTest < MiniTest::Test File.unlink(testbild) end - # OpenBabel segfaults randomly during inchikey calculation def test_inchikey c = OpenTox::Compound.from_inchi "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H" p c @@ -94,8 +94,7 @@ class CompoundTest < MiniTest::Test def test_openbabel_segfault inchi = "InChI=1S/C19H27NO7/c1-11-9-19(12(2)27-19)17(23)26-14-6-8-20(4)7-5-13(15(14)21)10-25-16(22)18(11,3)24/h5,11-12,14,24H,6-10H2,1-4H3/b13-5-/t11-,12-,14-,18-,19?/m1/s1" - #r = `echo "#{inchi}" | babel -iinchi - -oinchi` c = Compound.from_inchi(inchi) - assert_nil c + assert_equal inchi, c.inchi end end -- cgit v1.2.3 From c4692ae10f898c111a7d9d0bc9e7867820f249e1 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 13:37:14 +0200 Subject: ob_{include|lib} paths fixed --- README.md | 22 +++++++++++++++++++--- ext/lazar/extconf.rb | 6 ++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c398df2..ac40156 100644 --- a/README.md +++ b/README.md @@ -12,17 +12,33 @@ Dependencies You will also need at least mongodb version 3.0, but Debian "Wheezy" provides version 2.4. Please follow the instructions at http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian/: - ``` +``` sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list sudo apt-get update sudo apt-get install -y mongodb-org - ``` +``` Installation ------------ - gem install lazar + `gem install lazar` + + Please be patient, the compilation of OpenBabel and Fminer libraries can be very time consuming. If installation fails you can try a + + Manual installation + ................... + +``` + git clone https://github.com/opentox/lazar.git + cd lazar + ruby ext/lazar/extconf.rb + bundle install +``` + + This should give you more verbose information that can help in debugging (e.g. to identify missing libraries). + + This should Documentation ------------- diff --git a/ext/lazar/extconf.rb b/ext/lazar/extconf.rb index b86c61b..b9db3f0 100644 --- a/ext/lazar/extconf.rb +++ b/ext/lazar/extconf.rb @@ -50,10 +50,11 @@ Dir.chdir build_dir do end # get include and lib from pkg-config -ob_include= File.expand_path "../../openbabel/include/openbabel-2.0" -ob_lib= File.expand_path "../../openbabel/lib" +ob_include= File.expand_path File.join(File.dirname(__FILE__),"../../openbabel/include/openbabel-2.0") +ob_lib= File.expand_path File.join(File.dirname(__FILE__),"../../openbabel/lib") # compile ruby bindings +=begin puts "Compiling and installing OpenBabel Ruby bindings." Dir.chdir ruby_src_dir do # fix rpath @@ -61,6 +62,7 @@ Dir.chdir ruby_src_dir do system "#{RbConfig.ruby} extconf.rb --with-openbabel-include=#{ob_include} --with-openbabel-lib=#{ob_lib}" system "make -j#{nr_processors}" end +=end # install fminer fminer_dir = File.join main_dir, "libfminer" -- cgit v1.2.3 From 57bb9c2c691d350dce8c30b862030973043818cc Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 14:00:55 +0200 Subject: hydrogens added for 3d generation --- README.md | 25 ++++++++++--------------- ext/lazar/extconf.rb | 1 - lib/compound.rb | 15 ++++++++++----- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index ac40156..e0b17d1 100644 --- a/README.md +++ b/README.md @@ -12,33 +12,28 @@ Dependencies You will also need at least mongodb version 3.0, but Debian "Wheezy" provides version 2.4. Please follow the instructions at http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian/: -``` - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 - echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list - sudo apt-get update - sudo apt-get install -y mongodb-org -``` + ``` + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 + echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list + sudo apt-get update + sudo apt-get install -y mongodb-org + ``` Installation ------------ `gem install lazar` - Please be patient, the compilation of OpenBabel and Fminer libraries can be very time consuming. If installation fails you can try a + Please be patient, the compilation of OpenBabel and Fminer libraries can be very time consuming. If installation fails you can try to install manually: - Manual installation - ................... - -``` + ``` git clone https://github.com/opentox/lazar.git cd lazar ruby ext/lazar/extconf.rb bundle install -``` - - This should give you more verbose information that can help in debugging (e.g. to identify missing libraries). + ``` - This should + The output should give you more verbose information that can help in debugging (e.g. to identify missing libraries). Documentation ------------- diff --git a/ext/lazar/extconf.rb b/ext/lazar/extconf.rb index b9db3f0..0ee5e93 100644 --- a/ext/lazar/extconf.rb +++ b/ext/lazar/extconf.rb @@ -49,7 +49,6 @@ Dir.chdir build_dir do ENV["PKG_CONFIG_PATH"] = File.dirname(File.expand_path(Dir["#{install_dir}/**/openbabel*pc"].first)) end -# get include and lib from pkg-config ob_include= File.expand_path File.join(File.dirname(__FILE__),"../../openbabel/include/openbabel-2.0") ob_lib= File.expand_path File.join(File.dirname(__FILE__),"../../openbabel/lib") diff --git a/lib/compound.rb b/lib/compound.rb index fdec019..6d755da 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -46,7 +46,6 @@ module OpenTox # @param [String] smiles Smiles string # @return [OpenTox::Compound] Compound def self.from_smiles smiles - # do not store smiles because it might be noncanonical smiles = obconversion(smiles,"smi","can") if smiles.empty? Compound.find_or_create_by(:warning => "SMILES parsing failed for '#{smiles}', this may be caused by an incorrect SMILES string.") @@ -62,7 +61,8 @@ module OpenTox # Temporary workaround for OpenBabels Inchi bug # http://sourceforge.net/p/openbabel/bugs/957/ # bug has not been fixed in latest git/development version - smiles = `echo "#{inchi}" | "#{File.join(File.dirname(__FILE__),"..","openbabel","bin","babel")}" -iinchi - -ocan`.chomp.strip + #smiles = `echo "#{inchi}" | "#{File.join(File.dirname(__FILE__),"..","openbabel","bin","babel")}" -iinchi - -ocan`.chomp.strip + smiles = obconversion(inchi,"inchi","can") if smiles.empty? Compound.find_or_create_by(:warning => "InChi parsing failed for #{inchi}, this may be caused by an incorrect InChi string or a bug in OpenBabel libraries.") else @@ -92,7 +92,8 @@ module OpenTox def inchi unless self["inchi"] - result = `echo "#{self.smiles}" | "#{File.join(File.dirname(__FILE__),"..","openbabel","bin","babel")}" -ismi - -oinchi`.chomp + result = obconversion(smiles,"smi","inchi") + #result = `echo "#{self.smiles}" | "#{File.join(File.dirname(__FILE__),"..","openbabel","bin","babel")}" -ismi - -oinchi`.chomp update(:inchi => result.chomp) unless result.empty? end self["inchi"] @@ -108,7 +109,7 @@ module OpenTox # Get (canonical) smiles # @return [String] Smiles string def smiles - update(:smiles => obconversion(self["smiles"],"smi","can")) #unless self["smiles"] # should give canonical smiles, "can" seems to give incorrect results + update(:smiles => obconversion(self["smiles"],"smi","can")) unless self["smiles"] self["smiles"] end @@ -219,8 +220,12 @@ p "SDF conversion" # segfaults with openbabel git master #OpenBabel::OBOp.find_type("Gen3D").do(obmol) + # TODO: find disconnected structures + # strip_salts + # separate + obmol.add_hydrogens builder = OpenBabel::OBBuilder.new - builder.build(obmol); + builder.build(obmol) sdf = obconversion.write_string(obmol) print sdf -- cgit v1.2.3 From 4fb010f4c0f30e5b23d39e191ce36587827f8f4e Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 14:17:44 +0200 Subject: name conversion fixed --- lib/compound.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 6d755da..c0d6536 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -75,7 +75,7 @@ module OpenTox # @return [OpenTox::Compound] Compound def self.from_sdf sdf # do not store sdf because it might be 2D - Compound.find_or_create_by :smiles => obconversion(sdf,"sdf","can") + Compound.from_smiles obconversion(sdf,"sdf","can") end # Create a compound from name. Relies on an external service for name lookups. @@ -84,7 +84,7 @@ module OpenTox # @param name [String] can be also an InChI/InChiKey, CAS number, etc # @return [OpenTox::Compound] Compound def self.from_name name - Compound.find_or_create_by :smiles => RestClientWrapper.get(File.join(CACTUS_URI,URI.escape(name),"smiles")) + Compound.from_smiles RestClientWrapper.get(File.join(CACTUS_URI,URI.escape(name),"smiles")) end # Get InChI -- cgit v1.2.3 From d36c5525c2b1a5f138454e01e16770063ed269d1 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 14:24:30 +0200 Subject: versioning started at 0.0.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9ae0833..8acdd82 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0beta1 +0.0.1 -- cgit v1.2.3 From f582fe037154471e95f5f519c44fd7c9871c00b6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 15:27:20 +0200 Subject: dummy Makefile for ext/lazar/extconf.rb --- ext/lazar/extconf.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/lazar/extconf.rb b/ext/lazar/extconf.rb index 0ee5e93..f466afb 100644 --- a/ext/lazar/extconf.rb +++ b/ext/lazar/extconf.rb @@ -85,3 +85,4 @@ FileUtils.cd File.join(main_dir,"last-utils") `sed -i '8s/"openbabel", //' lu.rb` # install R packagemain_dir +$makefile_created = true -- cgit v1.2.3 From 2e9623835dfa0a376719a4212a6d03de406221c7 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 15:28:01 +0200 Subject: VERSION bumped to 0.0.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8acdd82..4e379d2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.1 +0.0.2 -- cgit v1.2.3 From 411abce3dc539d0890e61b9f28d99f411cd25390 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 15:36:20 +0200 Subject: ext/lazar/Makefile added --- ext/lazar/Makefile | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 ext/lazar/Makefile diff --git a/ext/lazar/Makefile b/ext/lazar/Makefile new file mode 100644 index 0000000..7222794 --- /dev/null +++ b/ext/lazar/Makefile @@ -0,0 +1,5 @@ +all: + true + +install: + true -- cgit v1.2.3 From b760ab16cebed1d4cb47c1c960d389c4ba11cb55 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 15:39:05 +0200 Subject: VERSION bumped to 0.0.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 4e379d2..bcab45a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.2 +0.0.3 -- cgit v1.2.3 From 84e68d13d65a9efc31a3ed9ad8358efa8234eb54 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 15:40:34 +0200 Subject: Makefile fixed --- ext/lazar/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/lazar/Makefile b/ext/lazar/Makefile index 7222794..1d51914 100644 --- a/ext/lazar/Makefile +++ b/ext/lazar/Makefile @@ -1,5 +1,5 @@ all: - true + true install: - true + true -- cgit v1.2.3 From f1fbdac96301223d012abe5baf120be491fb522a Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 15:41:05 +0200 Subject: VERSION bumped to 0.0.4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index bcab45a..bbdeab6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.3 +0.0.5 -- cgit v1.2.3 From c8e93cf1c391b7632d6c50c4630143643af2a11f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 15:41:38 +0200 Subject: VERSION bumped to 0.0.4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index bbdeab6..81340c7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.5 +0.0.4 -- cgit v1.2.3 From 5d22fb5ee6fa207816f48b9f1e1ec778f0b47d67 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 16:48:43 +0200 Subject: git calls removed from lazar.gemspec (git does not work when installed as a gem) --- VERSION | 2 +- lazar.gemspec | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index 81340c7..bbdeab6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.4 +0.0.5 diff --git a/lazar.gemspec b/lazar.gemspec index 6fe3f5b..1444b24 100644 --- a/lazar.gemspec +++ b/lazar.gemspec @@ -13,8 +13,8 @@ Gem::Specification.new do |s| s.rubyforge_project = "lazar" - s.files = `git ls-files`.split("\n") - s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + s.files = Dir["lib/*rb"] + s.test_files = Dir["test/*rb"] s.extensions = %w[ext/lazar/extconf.rb] s.require_paths = ["lib"] @@ -22,7 +22,6 @@ Gem::Specification.new do |s| s.add_runtime_dependency "bundler" s.add_runtime_dependency "rest-client" s.add_runtime_dependency 'nokogiri' - #s.add_runtime_dependency "openbabel" s.add_runtime_dependency 'rserve-client' s.add_runtime_dependency "mongoid", '~> 5.0beta' -- cgit v1.2.3 From f9a777bfdbedb93549270ee1c6ffb146e240c904 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 19 Aug 2015 17:29:33 +0200 Subject: git calls reintroduced into lazar.gemspec to avoid file losses. Seems to work with require 'lazar' in irb. --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 81340c7..1750564 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.4 +0.0.6 -- cgit v1.2.3 From 398d8ca681db3aa0a0552eee026705e60dd8449d Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 20 Aug 2015 14:02:04 +0200 Subject: crossvalidation fixes --- VERSION | 2 +- lib/crossvalidation.rb | 17 ++++- lib/dataset.rb | 2 +- lib/lazar-model.rb | 170 ----------------------------------------- lib/lazar.rb | 2 +- lib/model.rb | 177 +++++++++++++++++++++++++++++++++++++++++++ lib/regression.rb | 24 ++++++ test/lazar-physchem-short.rb | 1 + test/lazar-regression.rb | 27 +++++++ test/validation.rb | 5 +- 10 files changed, 249 insertions(+), 178 deletions(-) delete mode 100644 lib/lazar-model.rb create mode 100644 lib/model.rb create mode 100644 test/lazar-regression.rb diff --git a/VERSION b/VERSION index 1750564..5a5831a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.6 +0.0.7 diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb index d926cc4..d0ad324 100644 --- a/lib/crossvalidation.rb +++ b/lib/crossvalidation.rb @@ -2,11 +2,16 @@ module OpenTox class CrossValidation field :validation_ids, type: Array, default: [] + field :model_id, type: BSON::ObjectId field :folds, type: Integer field :nr_instances, type: Integer field :nr_unpredicted, type: Integer field :predictions, type: Array field :finished_at, type: Time + + def time + finished_at - created_at + end end class ClassificationCrossValidation < CrossValidation @@ -22,6 +27,7 @@ module OpenTox def self.create model, n=10 cv = self.new + cv.save # set created_at validation_ids = [] nr_instances = 0 nr_unpredicted = 0 @@ -64,6 +70,10 @@ module OpenTox end end cv.update_attributes( + name: model.name, + model_id: model.id, + folds: n, + validation_ids: validation_ids, nr_instances: nr_instances, nr_unpredicted: nr_unpredicted, accept_values: accept_values, @@ -85,10 +95,8 @@ module OpenTox #F measure carcinogen: 0.769, noncarcinogen: 0.348 end - class RegressionCrossValidation < Validation + class RegressionCrossValidation < CrossValidation - field :validation_ids, type: Array, default: [] - field :folds, type: Integer field :rmse, type: Float field :mae, type: Float field :weighted_rmse, type: Float @@ -96,6 +104,7 @@ module OpenTox def self.create model, n=10 cv = self.new + cv.save # set created_at validation_ids = [] nr_instances = 0 nr_unpredicted = 0 @@ -145,6 +154,8 @@ module OpenTox rmse = Math.sqrt(rmse/n) weighted_rmse = Math.sqrt(weighted_rmse/confidence_sum) cv.update_attributes( + name: model.name, + model_id: model.id, folds: n, validation_ids: validation_ids, nr_instances: nr_instances, diff --git a/lib/dataset.rb b/lib/dataset.rb index 8c5ffc0..5850c3d 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -49,7 +49,7 @@ module OpenTox @data_entries = Marshal.load(data_entry_file.data) bad_request_error "Data entries (#{data_entries_id}) are not a 2D-Array" unless @data_entries.is_a? Array and @data_entries.first.is_a? Array bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries.size} rows, but dataset (#{id}) has #{compound_ids.size} compounds" unless @data_entries.size == compound_ids.size - bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries..first.size} columns, but dataset (#{id}) has #{feature_ids.size} features" unless @data_entries.first.size == feature_ids.size + bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries.first.size} columns, but dataset (#{id}) has #{feature_ids.size} features" unless @data_entries.first.size == feature_ids.size $logger.debug "Retrieving data: #{Time.now-t}" end end diff --git a/lib/lazar-model.rb b/lib/lazar-model.rb deleted file mode 100644 index 1970401..0000000 --- a/lib/lazar-model.rb +++ /dev/null @@ -1,170 +0,0 @@ -module OpenTox - - module Model - - class Lazar - include OpenTox - include Mongoid::Document - include Mongoid::Timestamps - store_in collection: "models" - - field :title, type: String - field :creator, type: String, default: __FILE__ - # datasets - field :training_dataset_id, type: BSON::ObjectId - # algorithms - field :prediction_algorithm, type: String - field :neighbor_algorithm, type: String - field :neighbor_algorithm_parameters, type: Hash - # prediction feature - field :prediction_feature_id, type: BSON::ObjectId - - attr_accessor :prediction_dataset - attr_accessor :training_dataset - - # Create a lazar model from a training_dataset and a feature_dataset - # @param [OpenTox::Dataset] training_dataset - # @return [OpenTox::Model::Lazar] Regression or classification model - def self.create training_dataset - - bad_request_error "More than one prediction feature found in training_dataset #{training_dataset.id}" unless training_dataset.features.size == 1 - - # TODO document convention - prediction_feature = training_dataset.features.first - prediction_feature.nominal ? lazar = OpenTox::Model::LazarClassification.new : lazar = OpenTox::Model::LazarRegression.new - lazar.training_dataset_id = training_dataset.id - lazar.prediction_feature_id = prediction_feature.id - lazar.title = prediction_feature.title - - lazar.save - lazar - end - - def predict object - - t = Time.now - at = Time.now - - training_dataset = Dataset.find training_dataset_id - prediction_feature = Feature.find prediction_feature_id - - # parse data - compounds = [] - case object.class.to_s - when "OpenTox::Compound" - compounds = [object] - when "Array" - compounds = object - when "OpenTox::Dataset" - compounds = object.compounds - else - bad_request_error "Please provide a OpenTox::Compound an Array of OpenTox::Compounds or an OpenTox::Dataset as parameter." - end - - # make predictions - predictions = [] - neighbors = [] - compounds.each_with_index do |compound,c| - t = Time.new - database_activities = training_dataset.values(compound,prediction_feature) - if database_activities and !database_activities.empty? - database_activities = database_activities.first if database_activities.size == 1 - predictions << {:compound => compound, :value => database_activities, :confidence => "measured", :warning => "Compound #{compound.smiles} occurs in training dataset with activity '#{database_activities}'."} - next - end - neighbors = Algorithm.run(neighbor_algorithm, compound, neighbor_algorithm_parameters) - # add activities - # TODO: improve efficiency, takes 3 times longer than previous version - neighbors.collect! do |n| - rows = training_dataset.compound_ids.each_index.select{|i| training_dataset.compound_ids[i] == n.first} - acts = rows.collect{|row| training_dataset.data_entries[row][0]}.compact - acts.empty? ? nil : n << acts - end - neighbors.compact! # remove neighbors without training activities - predictions << Algorithm.run(prediction_algorithm, neighbors) - end - - # serialize result - case object.class.to_s - when "OpenTox::Compound" - prediction = predictions.first - prediction[:neighbors] = neighbors.sort{|a,b| b[1] <=> a[1]} # sort according to similarity - return prediction - when "Array" - return predictions - when "OpenTox::Dataset" - # prepare prediction dataset - prediction_dataset = LazarPrediction.new( - :title => "Lazar prediction for #{prediction_feature.title}", - :creator => __FILE__, - :prediction_feature_id => prediction_feature.id - - ) - confidence_feature = OpenTox::NumericFeature.find_or_create_by( "title" => "Prediction confidence" ) - # TODO move into warnings field - warning_feature = OpenTox::NominalFeature.find_or_create_by("title" => "Warnings") - prediction_dataset.features = [ prediction_feature, confidence_feature, warning_feature ] - prediction_dataset.compounds = compounds - prediction_dataset.data_entries = predictions.collect{|p| [p[:value], p[:confidence], p[:warning]]} - prediction_dataset.save_all - return prediction_dataset - end - - end - - def training_activities - i = training_dataset.feature_ids.index prediction_feature_id - training_dataset.data_entries.collect{|de| de[i]} - end - - end - - class LazarClassification < Lazar - def initialize - super - self.prediction_algorithm = "OpenTox::Algorithm::Classification.weighted_majority_vote" - self.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fingerprint_similarity" - self.neighbor_algorithm_parameters = {:min_sim => 0.7} - end - end - - class LazarFminerClassification < LazarClassification - - def self.create training_dataset - model = super(training_dataset) - model.update "_type" => self.to_s # adjust class - model = self.find model.id # adjust class - model.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fminer_similarity" - model.neighbor_algorithm_parameters = { - :feature_calculation_algorithm => "OpenTox::Algorithm::Descriptor.smarts_match", - :feature_dataset_id => Algorithm::Fminer.bbrc(training_dataset).id, - :min_sim => 0.3 - } - model.save - model - end - end - - class LazarRegression < Lazar - - def initialize - super - self.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fingerprint_similarity" - self.prediction_algorithm = "OpenTox::Algorithm::Regression.weighted_average" - self.neighbor_algorithm_parameters = {:min_sim => 0.7} - end - - end - - class PredictionModel < Lazar - field :category, type: String - field :endpoint, type: String - field :unit, type: String - field :model_id, type: BSON::ObjectId - field :crossvalidation_id, type: BSON::ObjectId - end - - end - -end - diff --git a/lib/lazar.rb b/lib/lazar.rb index 2ea8cba..174fb2c 100644 --- a/lib/lazar.rb +++ b/lib/lazar.rb @@ -58,7 +58,7 @@ CLASSES = ["Feature","Compound","Dataset","Validation","CrossValidation"]# Algor "algorithm.rb", "descriptor.rb", "bbrc.rb", - "lazar-model.rb", + "model.rb", "similarity.rb", "neighbor.rb", "classification.rb", diff --git a/lib/model.rb b/lib/model.rb new file mode 100644 index 0000000..bf8c549 --- /dev/null +++ b/lib/model.rb @@ -0,0 +1,177 @@ +module OpenTox + + module Model + + class Lazar + include OpenTox + include Mongoid::Document + include Mongoid::Timestamps + store_in collection: "models" + + field :title, as: :name, type: String + field :creator, type: String, default: __FILE__ + # datasets + field :training_dataset_id, type: BSON::ObjectId + # algorithms + field :prediction_algorithm, type: String + field :neighbor_algorithm, type: String + field :neighbor_algorithm_parameters, type: Hash + # prediction feature + field :prediction_feature_id, type: BSON::ObjectId + + attr_accessor :prediction_dataset + attr_accessor :training_dataset + + # Create a lazar model from a training_dataset and a feature_dataset + # @param [OpenTox::Dataset] training_dataset + # @return [OpenTox::Model::Lazar] Regression or classification model + def self.create training_dataset + + bad_request_error "More than one prediction feature found in training_dataset #{training_dataset.id}" unless training_dataset.features.size == 1 + + # TODO document convention + prediction_feature = training_dataset.features.first + prediction_feature.nominal ? lazar = OpenTox::Model::LazarClassification.new : lazar = OpenTox::Model::LazarRegression.new + lazar.training_dataset_id = training_dataset.id + lazar.prediction_feature_id = prediction_feature.id + lazar.title = prediction_feature.title + + lazar.save + lazar + end + + def predict object + + t = Time.now + at = Time.now + + training_dataset = Dataset.find training_dataset_id + prediction_feature = Feature.find prediction_feature_id + + # parse data + compounds = [] + case object.class.to_s + when "OpenTox::Compound" + compounds = [object] + when "Array" + compounds = object + when "OpenTox::Dataset" + compounds = object.compounds + else + bad_request_error "Please provide a OpenTox::Compound an Array of OpenTox::Compounds or an OpenTox::Dataset as parameter." + end + + # make predictions + predictions = [] + neighbors = [] + compounds.each_with_index do |compound,c| + t = Time.new + database_activities = training_dataset.values(compound,prediction_feature) + if database_activities and !database_activities.empty? + database_activities = database_activities.first if database_activities.size == 1 + predictions << {:compound => compound, :value => database_activities, :confidence => "measured", :warning => "Compound #{compound.smiles} occurs in training dataset with activity '#{database_activities}'."} + next + end + neighbors = Algorithm.run(neighbor_algorithm, compound, neighbor_algorithm_parameters) + # add activities + # TODO: improve efficiency, takes 3 times longer than previous version + neighbors.collect! do |n| + rows = training_dataset.compound_ids.each_index.select{|i| training_dataset.compound_ids[i] == n.first} + acts = rows.collect{|row| training_dataset.data_entries[row][0]}.compact + acts.empty? ? nil : n << acts + end + neighbors.compact! # remove neighbors without training activities + predictions << Algorithm.run(prediction_algorithm, neighbors) + end + + # serialize result + case object.class.to_s + when "OpenTox::Compound" + prediction = predictions.first + prediction[:neighbors] = neighbors.sort{|a,b| b[1] <=> a[1]} # sort according to similarity + return prediction + when "Array" + return predictions + when "OpenTox::Dataset" + # prepare prediction dataset + prediction_dataset = LazarPrediction.new( + :title => "Lazar prediction for #{prediction_feature.title}", + :creator => __FILE__, + :prediction_feature_id => prediction_feature.id + + ) + confidence_feature = OpenTox::NumericFeature.find_or_create_by( "title" => "Prediction confidence" ) + # TODO move into warnings field + warning_feature = OpenTox::NominalFeature.find_or_create_by("title" => "Warnings") + prediction_dataset.features = [ prediction_feature, confidence_feature, warning_feature ] + prediction_dataset.compounds = compounds + prediction_dataset.data_entries = predictions.collect{|p| [p[:value], p[:confidence], p[:warning]]} + prediction_dataset.save_all + return prediction_dataset + end + + end + + def training_activities + i = training_dataset.feature_ids.index prediction_feature_id + training_dataset.data_entries.collect{|de| de[i]} + end + + end + + class LazarClassification < Lazar + def initialize + super + self.prediction_algorithm = "OpenTox::Algorithm::Classification.weighted_majority_vote" + self.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fingerprint_similarity" + self.neighbor_algorithm_parameters = {:min_sim => 0.7} + end + end + + class LazarFminerClassification < LazarClassification + + def self.create training_dataset + model = super(training_dataset) + model.update "_type" => self.to_s # adjust class + model = self.find model.id # adjust class + model.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fminer_similarity" + model.neighbor_algorithm_parameters = { + :feature_calculation_algorithm => "OpenTox::Algorithm::Descriptor.smarts_match", + :feature_dataset_id => Algorithm::Fminer.bbrc(training_dataset).id, + :min_sim => 0.3 + } + model.save + model + end + end + + class LazarRegression < Lazar + + def initialize + super + self.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fingerprint_similarity" + self.prediction_algorithm = "OpenTox::Algorithm::Regression.weighted_average" + self.neighbor_algorithm_parameters = {:min_sim => 0.7} + end + + end + + class PredictionModel + include OpenTox + include Mongoid::Document + include Mongoid::Timestamps + store_in collection: "models" + + # TODO field Validations + field :endpoint, type: String + field :species, type: String + field :source, type: String + field :unit, type: String + field :model_id, type: BSON::ObjectId + field :crossvalidation_id, type: BSON::ObjectId + end + + end + +end + diff --git a/lib/regression.rb b/lib/regression.rb index 8a52e7d..0bc6547 100644 --- a/lib/regression.rb +++ b/lib/regression.rb @@ -34,6 +34,30 @@ module OpenTox {:value => prediction,:confidence => confidence} end + def self.weighted_average_with_relevant_fingerprints neighbors + weighted_sum = 0.0 + sim_sum = 0.0 + fingerprint_features = [] + neighbors.each do |row| + n,sim,acts = row + neighbor = Compound.find n + fingerprint_features += neighbor.fp4 + end + fingerprint_features.uniq! + p fingerprint_features +=begin + p n + acts.each do |act| + weighted_sum += sim*Math.log10(act) + sim_sum += sim + end + end +=end + confidence = sim_sum/neighbors.size.to_f + sim_sum == 0 ? prediction = nil : prediction = 10**(weighted_sum/sim_sum) + {:value => prediction,:confidence => confidence} + end + # Local support vector regression from neighbors # @param [Hash] params Keys `:props, :activities, :sims, :min_train_performance` are required # @return [Numeric] A prediction value. diff --git a/test/lazar-physchem-short.rb b/test/lazar-physchem-short.rb index ecf8aff..e74a4b9 100644 --- a/test/lazar-physchem-short.rb +++ b/test/lazar-physchem-short.rb @@ -2,6 +2,7 @@ require_relative "setup.rb" class LazarPhyschemDescriptorTest < MiniTest::Test def test_epafhm + skip "Physchem Regression not yet implemented." # check available descriptors @descriptors = OpenTox::Algorithm::Descriptor::DESCRIPTORS.keys assert_equal 111,@descriptors.size,"wrong number of physchem descriptors" diff --git a/test/lazar-regression.rb b/test/lazar-regression.rb new file mode 100644 index 0000000..c36f521 --- /dev/null +++ b/test/lazar-regression.rb @@ -0,0 +1,27 @@ +require_relative "setup.rb" + +class LazarRegressionTest < MiniTest::Test + + def test_weighted_average + training_dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" + model = Model::LazarRegression.create training_dataset + compound = Compound.from_smiles "CC(C)(C)CN" + prediction = model.predict compound + assert_equal 13.6, prediction[:value].round(1) + assert_equal 0.83, prediction[:confidence].round(2) + assert_equal 1, prediction[:neighbors].size + end + + def test_weighted_average_with_relevant_fingerprints + training_dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" + model = Model::LazarRegression.create training_dataset + model.update(:prediction_algorithm => "OpenTox::Algorithm::Regression.weighted_average_with_relevant_fingerprints") + compound = Compound.from_smiles "CC(C)(C)CN" + prediction = model.predict compound + p prediction + #assert_equal 13.6, prediction[:value].round(1) + #assert_equal 0.83, prediction[:confidence].round(2) + #assert_equal 1, prediction[:neighbors].size + end + +end diff --git a/test/validation.rb b/test/validation.rb index d98feb5..485769c 100644 --- a/test/validation.rb +++ b/test/validation.rb @@ -4,10 +4,11 @@ class ValidationTest < MiniTest::Test def test_fminer_crossvalidation dataset = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" - model = Model::LazarFminerClassification.create dataset#, features + model = Model::LazarFminerClassification.create dataset cv = ClassificationCrossValidation.create model p cv.accuracy p cv.weighted_accuracy + refute_empty cv.validation_ids assert cv.accuracy > 0.8 assert cv.weighted_accuracy > cv.accuracy, "Weighted accuracy (#{cv.weighted_accuracy}) larger than unweighted accuracy(#{cv.accuracy}) " end @@ -31,7 +32,7 @@ class ValidationTest < MiniTest::Test p cv.weighted_rmse p cv.mae p cv.weighted_mae - `inkview #{cv.plot}` + #`inkview #{cv.plot}` assert cv.rmse < 30, "RMSE > 30" assert cv.weighted_rmse < cv.rmse, "Weighted RMSE (#{cv.weighted_rmse}) larger than unweighted RMSE(#{cv.rmse}) " assert cv.mae < 12 -- cgit v1.2.3 From 8c6c59980bc82dc2177147f2fe34adf8bfbc1539 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 24 Aug 2015 12:17:07 +0200 Subject: Model::Prediction with tests, initial indexes --- .gitignore | 1 + VERSION | 2 +- lib/compound.rb | 2 ++ lib/crossvalidation.rb | 1 + lib/feature.rb | 1 + lib/lazar.rb | 7 +++---- lib/model.rb | 13 +++++++++++-- test/compound.rb | 4 ++-- test/data/hamster_carcinogenicity.json | 3 +++ test/prediction_models.rb | 23 +++++++++++++++++++++++ test/setup.rb | 3 ++- 11 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 test/data/hamster_carcinogenicity.json create mode 100644 test/prediction_models.rb diff --git a/.gitignore b/.gitignore index 926a09d..901e399 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ last-utils libfminer +openbabel test/fminer_debug.txt Gemfile.lock *.gem diff --git a/VERSION b/VERSION index 5a5831a..d169b2f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.7 +0.0.8 diff --git a/lib/compound.rb b/lib/compound.rb index c0d6536..fa57aff 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -22,6 +22,8 @@ module OpenTox field :fp4, type: Array field :fp4_size, type: Integer + index({smiles: 1}, {unique: true}) + # Overwrites standard Mongoid method to create fingerprints before database insertion def self.find_or_create_by params compound = self.find_or_initialize_by params diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb index d0ad324..5af75bf 100644 --- a/lib/crossvalidation.rb +++ b/lib/crossvalidation.rb @@ -8,6 +8,7 @@ module OpenTox field :nr_unpredicted, type: Integer field :predictions, type: Array field :finished_at, type: Time + #belongs_to :prediction def time finished_at - created_at diff --git a/lib/feature.rb b/lib/feature.rb index b2bc1f5..22b2846 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -29,6 +29,7 @@ module OpenTox # Feature for SMARTS fragments class Smarts < NominalFeature field :smarts, type: String + index "smarts" => 1 def self.from_smarts smarts self.find_or_create_by :smarts => smarts end diff --git a/lib/lazar.rb b/lib/lazar.rb index 174fb2c..d0128b7 100644 --- a/lib/lazar.rb +++ b/lib/lazar.rb @@ -15,20 +15,19 @@ require "base64" ENV["MONGOID_ENV"] ||= "development" # TODO remove config files, change default via ENV or directly in Mongoid class Mongoid.load!("#{File.expand_path(File.join(File.dirname(__FILE__),'..','mongoid.yml'))}") -# TODO get Mongo::Client from Mongoid -$mongo = Mongo::Client.new('mongodb://127.0.0.1:27017/opentox') -# TODO same for GridFS +$mongo = Mongoid.default_client +#$mongo = Mongo::Client.new('mongodb://127.0.0.1:27017/opentox') $gridfs = $mongo.database.fs # R setup R = Rserve::Connection.new # Logger setup +STDOUT.sync = true # for redirection, etc see http://stackoverflow.com/questions/8549443/why-doesnt-logger-output-to-stdout-get-redirected-to-files $logger = Logger.new STDOUT # STDERR did not work on my development machine (CH) $logger.level = Logger::DEBUG Mongo::Logger.logger = $logger Mongo::Logger.level = Logger::WARN -#Mongoid.logger = $logger # Require sub-Repositories require_relative '../libfminer/libbbrc/bbrc' # include before openbabel diff --git a/lib/model.rb b/lib/model.rb index bf8c549..185d70f 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -19,6 +19,8 @@ module OpenTox # prediction feature field :prediction_feature_id, type: BSON::ObjectId + #belongs_to :prediction + attr_accessor :prediction_dataset attr_accessor :training_dataset @@ -156,11 +158,10 @@ module OpenTox end - class PredictionModel + class Prediction include OpenTox include Mongoid::Document include Mongoid::Timestamps - store_in collection: "models" # TODO field Validations field :endpoint, type: String @@ -169,6 +170,14 @@ module OpenTox field :unit, type: String field :model_id, type: BSON::ObjectId field :crossvalidation_id, type: BSON::ObjectId + + def predict object + Model::Lazar.find(model_id).predict object + end + + def crossvalidation + CrossValidation.find crossvalidation_id + end end end diff --git a/test/compound.rb b/test/compound.rb index 7265ef5..06c19a2 100644 --- a/test/compound.rb +++ b/test/compound.rb @@ -54,7 +54,6 @@ print c.sdf def test_inchikey c = OpenTox::Compound.from_inchi "InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H" - p c assert_equal "UHOVQNZJYSORNB-UHFFFAOYSA-N", c.inchikey end @@ -88,7 +87,8 @@ print c.sdf refute_nil c.fp4 end c = d.compounds[371] - assert c.neighbors.size >= 19 + n = c.neighbors + assert n.size >= 18, "Neighbors size (#{n.size}) should be larger than 17" end def test_openbabel_segfault diff --git a/test/data/hamster_carcinogenicity.json b/test/data/hamster_carcinogenicity.json new file mode 100644 index 0000000..8c17d9d --- /dev/null +++ b/test/data/hamster_carcinogenicity.json @@ -0,0 +1,3 @@ +{ "species": "Hamster", +"endpoint": "Carcinogenicity", +"source": "http://www.epa.gov/ncct/dsstox/sdf_cpdbas.html" } diff --git a/test/prediction_models.rb b/test/prediction_models.rb new file mode 100644 index 0000000..b4ad415 --- /dev/null +++ b/test/prediction_models.rb @@ -0,0 +1,23 @@ +require_relative "setup.rb" + +class PredictionModelTest < MiniTest::Test + + def test_prediction_model + dataset = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" + model = Model::LazarFminerClassification.create dataset + cv = ClassificationCrossValidation.create model + metadata = JSON.parse(File.read("#{DATA_DIR}/hamster_carcinogenicity.json")) + + metadata[:model_id] = model.id + metadata[:crossvalidation_id] = cv.id + pm = Model::Prediction.new(metadata) + pm.save + [:endpoint,:species,:source].each do |p| + refute_empty pm[p] + end + assert pm.crossvalidation.accuracy > 0.8 + prediction = pm.predict Compound.from_smiles("CCCC(NN)C") + assert_equal "true", prediction[:value] + pm.delete + end +end diff --git a/test/setup.rb b/test/setup.rb index 379fa53..538853d 100644 --- a/test/setup.rb +++ b/test/setup.rb @@ -3,4 +3,5 @@ require_relative '../lib/lazar.rb' include OpenTox TEST_DIR ||= File.expand_path(File.dirname(__FILE__)) DATA_DIR ||= File.join(TEST_DIR,"data") -#$mongo.database.drop +$mongo.database.drop +$gridfs = $mongo.database.fs # recreate GridFS indexes -- cgit v1.2.3 From f8faf510b4574df1a00fa61a9f0a1681fc2f4857 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Tue, 25 Aug 2015 17:20:55 +0200 Subject: Experiments added --- lib/classification.rb | 2 +- lib/compound.rb | 1 + lib/crossvalidation.rb | 109 ++++++++++++++++++++++++++++++++++++----------- lib/dataset.rb | 15 ++++--- lib/experiment.rb | 66 ++++++++++++++++++++++++++++ lib/feature.rb | 2 +- lib/lazar.rb | 6 +-- lib/model.rb | 27 +++++++----- lib/opentox.rb | 2 +- lib/overwrite.rb | 6 +++ lib/regression.rb | 29 ++++++++++++- test/dataset.rb | 2 +- test/experiment.rb | 31 ++++++++++++++ test/lazar-long.rb | 2 +- test/lazar-regression.rb | 7 +-- test/setup.rb | 4 +- test/validation.rb | 7 ++- 17 files changed, 261 insertions(+), 57 deletions(-) create mode 100644 lib/experiment.rb create mode 100644 test/experiment.rb diff --git a/lib/classification.rb b/lib/classification.rb index 723c66f..0d47983 100644 --- a/lib/classification.rb +++ b/lib/classification.rb @@ -3,7 +3,7 @@ module OpenTox class Classification - def self.weighted_majority_vote neighbors + def self.weighted_majority_vote compound, neighbors return {:value => nil,:confidence => nil,:warning => "Cound not find similar compounds."} if neighbors.empty? weighted_sum = {} sim_sum = 0.0 diff --git a/lib/compound.rb b/lib/compound.rb index fa57aff..a819f56 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -178,6 +178,7 @@ module OpenTox end def neighbors threshold=0.7 + # TODO restrict to dataset # from http://blog.matt-swain.com/post/87093745652/chemical-similarity-search-in-mongodb qn = fp4.size #qmin = qn * threshold diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb index 5af75bf..4407aeb 100644 --- a/lib/crossvalidation.rb +++ b/lib/crossvalidation.rb @@ -102,6 +102,8 @@ module OpenTox field :mae, type: Float field :weighted_rmse, type: Float field :weighted_mae, type: Float + field :weighted_mae, type: Float + field :correlation_plot_id, type: BSON::ObjectId def self.create model, n=10 cv = self.new @@ -135,10 +137,11 @@ module OpenTox weighted_rae = 0 n = 0 confidence_sum = 0 + nil_activities = [] predictions.each do |pred| compound_id,activity,prediction,confidence = pred if activity and prediction - error = prediction-activity + error = Math.log(prediction)-Math.log(activity) rmse += error**2 weighted_rmse += confidence*error**2 mae += error.abs @@ -147,13 +150,36 @@ module OpenTox confidence_sum += confidence else # TODO: create warnings - p pred + $logger.debug "No training activities for #{Compound.find(compound_id).smiles} in training dataset #{training_dataset.id}." + nil_activities << pred end end + predictions -= nil_activities + x = predictions.collect{|p| p[1]} + y = predictions.collect{|p| p[2]} + R.assign "Measurement", x + R.assign "Prediction", y + R.eval "corr <- lm(-log(Measurement) ~ -log(Prediction))" + s = R.eval "summary <- summary(corr)" + p R.eval("summary$r.squared").to_ruby + #p s.to_ruby + #p s.to_ruby.first + s.to_ruby.each_with_index do |l,i| + #p i + #p l + end mae = mae/n weighted_mae = weighted_mae/confidence_sum rmse = Math.sqrt(rmse/n) weighted_rmse = Math.sqrt(weighted_rmse/confidence_sum) + # TODO check!! + predictions.sort! do |a,b| + relative_error_a = (a[1]-a[2]).abs/a[1].to_f + relative_error_a = 1/relative_error_a if relative_error_a < 1 + relative_error_b = (b[1]-b[2]).abs/b[1].to_f + relative_error_b = 1/relative_error_b if relative_error_b < 1 + [relative_error_b,b[3]] <=> [relative_error_a,a[3]] + end cv.update_attributes( name: model.name, model_id: model.id, @@ -161,7 +187,7 @@ module OpenTox validation_ids: validation_ids, nr_instances: nr_instances, nr_unpredicted: nr_unpredicted, - predictions: predictions.sort{|a,b| b[3] <=> a[3]}, + predictions: predictions,#.sort{|a,b| [(b[1]-b[2]).abs/b[1].to_f,b[3]] <=> [(a[1]-a[2]).abs/a[1].to_f,a[3]]}, mae: mae, rmse: rmse, weighted_mae: weighted_mae, @@ -171,27 +197,62 @@ module OpenTox cv end - def plot - # RMSE - x = predictions.collect{|p| p[1]} - y = predictions.collect{|p| p[2]} - R.assign "Measurement", x - R.assign "Prediction", y - R.eval "par(pty='s')" # sets the plot type to be square - #R.eval "fitline <- lm(log(Prediction) ~ log(Measurement))" - #R.eval "error <- log(Measurement)-log(Prediction)" - R.eval "error <- Measurement-Prediction" - R.eval "rmse <- sqrt(mean(error^2,na.rm=T))" - R.eval "mae <- mean( abs(error), na.rm = TRUE)" - R.eval "r <- cor(log(Prediction),log(Measurement))" - R.eval "svg(filename='/tmp/#{id.to_s}.svg')" - R.eval "plot(log(Prediction),log(Measurement),main='#{self.name}', sub=paste('RMSE: ',rmse, 'MAE :',mae, 'r^2: ',r^2),asp=1)" - #R.eval "plot(log(Prediction),log(Measurement),main='#{self.name}', sub=paste('RMSE: ',rmse, 'MAE :',mae, 'r^2: '),asp=1)" - #R.eval "plot(log(Prediction),log(Measurement),main='#{self.name}', ,asp=1)" - R.eval "abline(0,1,col='blue')" - #R.eval "abline(fitline,col='red')" - R.eval "dev.off()" - "/tmp/#{id.to_s}.svg" + def misclassifications n=nil + #n = predictions.size unless n + n = 20 unless n + model = Model::Lazar.find(self.model_id) + training_dataset = Dataset.find(model.training_dataset_id) + prediction_feature = training_dataset.features.first + predictions[0..n-1].collect do |p| + compound = Compound.find(p[0]) + neighbors = compound.neighbors.collect do |n| + neighbor = Compound.find(n[0]) + values = training_dataset.values(neighbor,prediction_feature) + { :smiles => neighbor.smiles, :fingerprint => neighbor.fp4.collect{|id| Smarts.find(id).name},:similarity => n[1], :measurements => values} + end + { + :smiles => compound.smiles, + :fingerprint => compound.fp4.collect{|id| Smarts.find(id).name}, + :measured => p[1], + :predicted => p[2], + :relative_error => (p[1]-p[2]).abs/p[1].to_f, + :confidence => p[3], + :neighbors => neighbors + } + end + end + + def correlation_plot + unless correlation_plot_id + tmpfile = "/tmp/#{id.to_s}.svg" + x = predictions.collect{|p| p[1]} + y = predictions.collect{|p| p[2]} + attributes = Model::Lazar.find(self.model_id).attributes + attributes.delete_if{|key,_| key.match(/_id|_at/) or ["_id","creator","name"].include? key} + attributes = attributes.values.collect{|v| v.is_a?(String) ? v.sub(/OpenTox::/,'') : v}.join("\n") + p "'"+attributes + R.eval "library(ggplot2)" + R.eval "library(grid)" + R.eval "library(gridExtra)" + R.assign "measurement", x + R.assign "prediction", y + #R.eval "error <- log(Measurement)-log(Prediction)" + #R.eval "rmse <- sqrt(mean(error^2, na.rm=T))" + #R.eval "mae <- mean(abs(error), na.rm=T)" + R.eval "r <- cor(-log(prediction),-log(measurement))" + R.eval "svg(filename='#{tmpfile}')" + R.eval "all = c(-log(measurement),-log(prediction))" + R.eval "range = c(min(all), max(all))" + R.eval "image = qplot(-log(prediction),-log(measurement),main='#{self.name}',asp=1,xlim=range, ylim=range)" + R.eval "image = image + geom_abline(intercept=0, slope=1) + stat_smooth(method='lm', se=FALSE)" + R.eval "text = textGrob(paste('RMSE: ', '#{rmse.round(2)},','MAE:','#{mae.round(2)},','r^2: ',round(r^2,2),'\n\n','#{attributes}'),just=c('left','top'),check.overlap = T)" + R.eval "grid.arrange(image, text, ncol=2)" + R.eval "dev.off()" + file = Mongo::Grid::File.new(File.read(tmpfile), :filename => "#{self.id.to_s}_correlation_plot.svg") + plot_id = $gridfs.insert_one(file) + update(:correlation_plot_id => plot_id) + end + $gridfs.find_one(_id: correlation_plot_id).data end end diff --git a/lib/dataset.rb b/lib/dataset.rb index 5850c3d..b3f5392 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -10,7 +10,7 @@ module OpenTox # associations like has_many, belongs_to deteriorate performance field :feature_ids, type: Array, default: [] field :compound_ids, type: Array, default: [] - field :data_entries_id, type: BSON::ObjectId, default: [] + field :data_entries_id, type: BSON::ObjectId#, default: [] field :source, type: String field :warnings, type: Array, default: [] @@ -19,9 +19,9 @@ module OpenTox def save_all dump = Marshal.dump(@data_entries) file = Mongo::Grid::File.new(dump, :filename => "#{self.id.to_s}.data_entries") - data_entries_id = $gridfs.insert_one(file) - update(:data_entries_id => data_entries_id) - save + entries_id = $gridfs.insert_one(file) + update(:data_entries_id => entries_id) + #save end # Readers @@ -125,11 +125,11 @@ module OpenTox # Serialisation - # converts dataset to csv format including compound smiles as first column, other column headers are feature titles + # converts dataset to csv format including compound smiles as first column, other column headers are feature names # @return [String] def to_csv(inchi=false) CSV.generate() do |csv| #{:force_quotes=>true} - csv << [inchi ? "InChI" : "SMILES"] + features.collect{|f| f.title} + csv << [inchi ? "InChI" : "SMILES"] + features.collect{|f| f.name} compounds.each_with_index do |c,i| csv << [inchi ? c.inchi : c.smiles] + data_entries[i] end @@ -149,9 +149,10 @@ module OpenTox # Create a dataset from CSV file # TODO: document structure def self.from_csv_file file, source=nil, bioassay=true + $logger.debug "Parsing #{file}." source ||= file table = CSV.read file, :skip_blanks => true - dataset = self.new(:source => source, :name => File.basename(file)) + dataset = self.new(:source => source, :name => File.basename(file,".*")) dataset.parse_table table, bioassay dataset end diff --git a/lib/experiment.rb b/lib/experiment.rb new file mode 100644 index 0000000..b3ed174 --- /dev/null +++ b/lib/experiment.rb @@ -0,0 +1,66 @@ +module OpenTox + + class Experiment + field :dataset_ids, type: Array + field :model_algorithms, type: Array + field :model_ids, type: Array, default: [] + field :crossvalidation_ids, type: Array, default: [] + field :prediction_algorithms, type: Array + field :neighbor_algorithms, type: Array + field :neighbor_algorithm_parameters, type: Array + end + + # TODO more sophisticated experimental design + def run + dataset_ids.each do |dataset_id| + dataset = Dataset.find(dataset_id) + model_algorithms.each do |model_algorithm| + prediction_algorithms.each do |prediction_algorithm| + neighbor_algorithms.each do |neighbor_algorithm| + neighbor_algorithm_parameters.each do |neighbor_algorithm_parameter| + $logger.debug "Creating #{model_algorithm} model for dataset #{dataset.name}, with prediction_algorithm #{prediction_algorithm}, neighbor_algorithm #{neighbor_algorithm}, neighbor_algorithm_parameters #{neighbor_algorithm_parameter}." + model = Object.const_get(model_algorithm).create dataset + model.prediction_algorithm = prediction_algorithm + model.neighbor_algorithm = neighbor_algorithm + model.neighbor_algorithm_parameters = neighbor_algorithm_parameter + model.save + model_ids << model.id + cv = nil + if dataset.features.first.nominal + cv = ClassificationCrossValidation + elsif dataset.features.first.numeric + cv = RegressionCrossValidation + end + if cv + $logger.debug "Creating #{cv} for #{model_algorithm}, dataset #{dataset.name}, with prediction_algorithm #{prediction_algorithm}, neighbor_algorithm #{neighbor_algorithm}, neighbor_algorithm_parameters #{neighbor_algorithm_parameter}." + crossvalidation = cv.create model + crossvalidation_ids << crossvalidation.id + else + $logger.warn "#{dataset.features.first} is neither nominal nor numeric." + end + end + end + end + end + end + save + end + + def self.create params + experiment = self.new + $logge.debug "Experiment started ..." + experiment.run params + experiment + end + + def report + crossvalidation_ids.each do |id| + cv = CrossValidation.find(id) + file = "/tmp/#{cv.name}.svg" + File.open(file,"w+"){|f| f.puts cv.correlation_plot} + `inkview '#{file}'` + #p Crossvalidation.find(id).correlation_plot + end + end + +end diff --git a/lib/feature.rb b/lib/feature.rb index 22b2846..9521597 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -2,7 +2,7 @@ module OpenTox # Basic feature class class Feature - field :name, as: :title, type: String + field :name, type: String field :nominal, type: Boolean field :numeric, type: Boolean field :measured, type: Boolean diff --git a/lib/lazar.rb b/lib/lazar.rb index d0128b7..5903556 100644 --- a/lib/lazar.rb +++ b/lib/lazar.rb @@ -16,7 +16,6 @@ ENV["MONGOID_ENV"] ||= "development" # TODO remove config files, change default via ENV or directly in Mongoid class Mongoid.load!("#{File.expand_path(File.join(File.dirname(__FILE__),'..','mongoid.yml'))}") $mongo = Mongoid.default_client -#$mongo = Mongo::Client.new('mongodb://127.0.0.1:27017/opentox') $gridfs = $mongo.database.fs # R setup @@ -26,8 +25,8 @@ R = Rserve::Connection.new STDOUT.sync = true # for redirection, etc see http://stackoverflow.com/questions/8549443/why-doesnt-logger-output-to-stdout-get-redirected-to-files $logger = Logger.new STDOUT # STDERR did not work on my development machine (CH) $logger.level = Logger::DEBUG -Mongo::Logger.logger = $logger Mongo::Logger.level = Logger::WARN +#Mongo::Logger.logger = $logger # Require sub-Repositories require_relative '../libfminer/libbbrc/bbrc' # include before openbabel @@ -43,7 +42,7 @@ ENV['FMINER_SILENT'] = 'true' ENV['FMINER_NR_HITS'] = 'true' # OpenTox classes and includes -CLASSES = ["Feature","Compound","Dataset","Validation","CrossValidation"]# Algorithm and Models are modules +CLASSES = ["Feature","Compound","Dataset","Validation","CrossValidation","Experiment"]# Algorithm and Models are modules [ # be aware of the require sequence as it affects class/method overwrites "overwrite.rb", @@ -64,5 +63,6 @@ CLASSES = ["Feature","Compound","Dataset","Validation","CrossValidation"]# Algor "regression.rb", "validation.rb", "crossvalidation.rb", + "experiment.rb", ].each{ |f| require_relative f } diff --git a/lib/model.rb b/lib/model.rb index 185d70f..418ec18 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -2,24 +2,27 @@ module OpenTox module Model - class Lazar + class Model include OpenTox include Mongoid::Document include Mongoid::Timestamps store_in collection: "models" - field :title, as: :name, type: String + field :name, type: String field :creator, type: String, default: __FILE__ # datasets field :training_dataset_id, type: BSON::ObjectId # algorithms field :prediction_algorithm, type: String - field :neighbor_algorithm, type: String - field :neighbor_algorithm_parameters, type: Hash # prediction feature field :prediction_feature_id, type: BSON::ObjectId + end - #belongs_to :prediction + class Lazar < Model + + # algorithms + field :neighbor_algorithm, type: String + field :neighbor_algorithm_parameters, type: Hash attr_accessor :prediction_dataset attr_accessor :training_dataset @@ -36,7 +39,7 @@ module OpenTox prediction_feature.nominal ? lazar = OpenTox::Model::LazarClassification.new : lazar = OpenTox::Model::LazarRegression.new lazar.training_dataset_id = training_dataset.id lazar.prediction_feature_id = prediction_feature.id - lazar.title = prediction_feature.title + lazar.name = "#{training_dataset.name} #{prediction_feature.name}" lazar.save lazar @@ -83,7 +86,7 @@ module OpenTox acts.empty? ? nil : n << acts end neighbors.compact! # remove neighbors without training activities - predictions << Algorithm.run(prediction_algorithm, neighbors) + predictions << Algorithm.run(prediction_algorithm, compound, neighbors) end # serialize result @@ -97,14 +100,14 @@ module OpenTox when "OpenTox::Dataset" # prepare prediction dataset prediction_dataset = LazarPrediction.new( - :title => "Lazar prediction for #{prediction_feature.title}", + :name => "Lazar prediction for #{prediction_feature.name}", :creator => __FILE__, :prediction_feature_id => prediction_feature.id ) - confidence_feature = OpenTox::NumericFeature.find_or_create_by( "title" => "Prediction confidence" ) + confidence_feature = OpenTox::NumericFeature.find_or_create_by( "name" => "Prediction confidence" ) # TODO move into warnings field - warning_feature = OpenTox::NominalFeature.find_or_create_by("title" => "Warnings") + warning_feature = OpenTox::NominalFeature.find_or_create_by("name" => "Warnings") prediction_dataset.features = [ prediction_feature, confidence_feature, warning_feature ] prediction_dataset.compounds = compounds prediction_dataset.data_entries = predictions.collect{|p| [p[:value], p[:confidence], p[:warning]]} @@ -112,6 +115,10 @@ module OpenTox return prediction_dataset end + def training_dataset + return Dataset.find(training_dataset_id) + end + end def training_activities diff --git a/lib/opentox.rb b/lib/opentox.rb index 33293ac..53b34e9 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -12,7 +12,7 @@ module OpenTox include Mongoid::Document include Mongoid::Timestamps store_in collection: klass.downcase.pluralize - field :title, as: :name, type: String + field :name, type: String end OpenTox.const_set klass,c diff --git a/lib/overwrite.rb b/lib/overwrite.rb index df515eb..cb47527 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -81,6 +81,12 @@ class Array return self.uniq.size == 1 end + def median + sorted = self.sort + len = sorted.length + (sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0 + end + end module URI diff --git a/lib/regression.rb b/lib/regression.rb index 0bc6547..020bb3a 100644 --- a/lib/regression.rb +++ b/lib/regression.rb @@ -19,7 +19,7 @@ module OpenTox class Regression - def self.weighted_average neighbors + def self.weighted_average compound, neighbors weighted_sum = 0.0 sim_sum = 0.0 neighbors.each do |row| @@ -34,6 +34,33 @@ module OpenTox {:value => prediction,:confidence => confidence} end + def self.local_linear_regression compound, neighbors + p neighbors.size + return nil unless neighbors.size > 0 + features = neighbors.collect{|n| Compound.find(n.first).fp4}.flatten.uniq + p features + training_data = Array.new(neighbors.size){Array.new(features.size,0)} + neighbors.each_with_index do |n,i| + #p n.first + neighbor = Compound.find n.first + features.each_with_index do |f,j| + training_data[i][j] = 1 if neighbor.fp4.include? f + end + end + p training_data + + R.assign "activities", neighbors.collect{|n| n[2].median} + R.assign "features", training_data + R.eval "model <- lm(activities ~ features)" + R.eval "summary <- summary(model)" + p R.summary + compound_features = features.collect{|f| compound.fp4.include? f ? 1 : 0} + R.assign "compound_features", compound_features + R.eval "prediction <- predict(model,compound_features)" + p R.prediction + + end + def self.weighted_average_with_relevant_fingerprints neighbors weighted_sum = 0.0 sim_sum = 0.0 diff --git a/test/dataset.rb b/test/dataset.rb index 27dba61..b5275d4 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -78,7 +78,7 @@ class DatasetTest < MiniTest::Test new_dataset = Dataset.find d.id # get metadata assert_match "multicolumn.csv", new_dataset.source - assert_equal "multicolumn.csv", new_dataset.title + assert_equal "multicolumn.csv", new_dataset.name # get features assert_equal 6, new_dataset.features.size assert_equal 7, new_dataset.compounds.size diff --git a/test/experiment.rb b/test/experiment.rb new file mode 100644 index 0000000..eae7fa0 --- /dev/null +++ b/test/experiment.rb @@ -0,0 +1,31 @@ +require_relative "setup.rb" + +class ExperimentTest < MiniTest::Test + + def test_regression_experiment + datasets = [ + "EPAFHM.csv", + "FDA_v3b_Maximum_Recommended_Daily_Dose_mmol.csv", + "LOAEL_log_mmol_corrected_smiles.csv" + ] + model_algorithms = ["OpenTox::Model::LazarRegression"] + neighbor_algorithms = ["OpenTox::Algorithm::Neighbor.fingerprint_similarity"] + prediction_algorithms = ["OpenTox::Algorithm::Regression.weighted_average"] + neighbor_algorithm_parameters = [{:min_sim => 0.7}] + experiment = Experiment.create( + :name => "Regression for datasets #{datasets}.", + :dataset_ids => datasets.collect{|d| Dataset.from_csv_file(File.join(DATA_DIR, d)).id}, + :model_algorithms => model_algorithms, + :neighbor_algorithms => neighbor_algorithms, + :neighbor_algorithm_parameters => neighbor_algorithm_parameters, + :prediction_algorithms => prediction_algorithms, + ) + experiment.run +=begin + experiment = Experiment.find "55dc58b32b72ed14a8000008" +=end + p experiment.id + experiment.report + refute_empty experiment.crossvalidation_ids + end +end diff --git a/test/lazar-long.rb b/test/lazar-long.rb index c0deaa2..1b58319 100644 --- a/test/lazar-long.rb +++ b/test/lazar-long.rb @@ -29,7 +29,7 @@ class LazarExtendedTest < MiniTest::Test feature_dataset = OpenTox::CalculatedDataset.find model.feature_dataset_id assert_equal dataset.compounds.size, feature_dataset.compounds.size assert_equal 52, feature_dataset.features.size - assert_equal '[#17&A]-[#6&A]', feature_dataset.features.first.title + assert_equal '[#17&A]-[#6&A]', feature_dataset.features.first.name compound = OpenTox::Compound.from_inchi("InChI=1S/C10H9NO2S/c1-8-2-4-9(5-3-8)13-6-10(12)11-7-14/h2-5H,6H2,1H3") prediction_dataset = model.predict compound prediction = prediction_dataset.data_entries.first diff --git a/test/lazar-regression.rb b/test/lazar-regression.rb index c36f521..4062cfd 100644 --- a/test/lazar-regression.rb +++ b/test/lazar-regression.rb @@ -12,11 +12,12 @@ class LazarRegressionTest < MiniTest::Test assert_equal 1, prediction[:neighbors].size end - def test_weighted_average_with_relevant_fingerprints + def test_local_linear_regression + skip training_dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" model = Model::LazarRegression.create training_dataset - model.update(:prediction_algorithm => "OpenTox::Algorithm::Regression.weighted_average_with_relevant_fingerprints") - compound = Compound.from_smiles "CC(C)(C)CN" + model.update(:prediction_algorithm => "OpenTox::Algorithm::Regression.local_linear_regression") + compound = Compound.from_smiles "NC(=O)OCCC" prediction = model.predict compound p prediction #assert_equal 13.6, prediction[:value].round(1) diff --git a/test/setup.rb b/test/setup.rb index 538853d..3dad683 100644 --- a/test/setup.rb +++ b/test/setup.rb @@ -3,5 +3,5 @@ require_relative '../lib/lazar.rb' include OpenTox TEST_DIR ||= File.expand_path(File.dirname(__FILE__)) DATA_DIR ||= File.join(TEST_DIR,"data") -$mongo.database.drop -$gridfs = $mongo.database.fs # recreate GridFS indexes +#$mongo.database.drop +#$gridfs = $mongo.database.fs # recreate GridFS indexes diff --git a/test/validation.rb b/test/validation.rb index 485769c..009c337 100644 --- a/test/validation.rb +++ b/test/validation.rb @@ -24,8 +24,8 @@ class ValidationTest < MiniTest::Test end def test_regression_crossvalidation - dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" - #dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.csv" + #dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" + dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.csv" model = Model::LazarRegression.create dataset cv = RegressionCrossValidation.create model p cv.rmse @@ -33,6 +33,9 @@ class ValidationTest < MiniTest::Test p cv.mae p cv.weighted_mae #`inkview #{cv.plot}` + #puts JSON.pretty_generate(cv.misclassifications)#.collect{|l| l.join ", "}.join "\n" + p cv.misclassifications.collect{|l| l[:neighbors].size} + `inkview #{cv.plot}` assert cv.rmse < 30, "RMSE > 30" assert cv.weighted_rmse < cv.rmse, "Weighted RMSE (#{cv.weighted_rmse}) larger than unweighted RMSE(#{cv.rmse}) " assert cv.mae < 12 -- cgit v1.2.3 From d542e9fe92567c54423f39904111bd5293236416 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 26 Aug 2015 14:20:23 +0200 Subject: Parallel Crossvalidations --- .gitignore | 1 + lazar.gemspec | 3 + lib/crossvalidation.rb | 81 +- lib/dataset.rb | 18 +- lib/experiment.rb | 4 +- lib/lazar.rb | 2 +- lib/opentox.rb | 1 + lib/validation.rb | 5 +- test/data/LOAEL_log_mg_corrected_smiles.csv | 1134 ++++++++++++------------- test/data/LOAEL_log_mmol_corrected_smiles.csv | 1132 ++++++++++++------------ test/data/LOAEL_mmol_corrected_smiles.csv | 568 +++++++++++++ test/experiment.rb | 6 +- 12 files changed, 1769 insertions(+), 1186 deletions(-) create mode 100644 test/data/LOAEL_mmol_corrected_smiles.csv diff --git a/.gitignore b/.gitignore index 901e399..4974b27 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ last-utils libfminer openbabel +fminer_debug.txt test/fminer_debug.txt Gemfile.lock *.gem diff --git a/lazar.gemspec b/lazar.gemspec index addb60d..8e06aa1 100644 --- a/lazar.gemspec +++ b/lazar.gemspec @@ -23,6 +23,9 @@ Gem::Specification.new do |s| s.add_runtime_dependency "rest-client" s.add_runtime_dependency 'nokogiri' s.add_runtime_dependency 'rserve-client' + #s.add_runtime_dependency 'celluloid' + s.add_runtime_dependency 'forkoff' + #s.add_runtime_dependency 'parallel' s.add_runtime_dependency "mongoid", '~> 5.0beta' end diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb index 4407aeb..58a9664 100644 --- a/lib/crossvalidation.rb +++ b/lib/crossvalidation.rb @@ -6,13 +6,16 @@ module OpenTox field :folds, type: Integer field :nr_instances, type: Integer field :nr_unpredicted, type: Integer - field :predictions, type: Array + field :predictions, type: Array, default: [] field :finished_at, type: Time - #belongs_to :prediction def time finished_at - created_at end + + def validations + validation_ids.collect{|vid| Validation.find vid} + end end class ClassificationCrossValidation < CrossValidation @@ -45,7 +48,7 @@ module OpenTox t = Time.now $logger.debug "Fold #{fold_nr}" validation = validation_class.create(model, fold[0], fold[1]) - validation_ids << validation.id + #validation_ids << validation.id nr_instances += validation.nr_instances nr_unpredicted += validation.nr_unpredicted predictions += validation.predictions @@ -74,7 +77,7 @@ module OpenTox name: model.name, model_id: model.id, folds: n, - validation_ids: validation_ids, + #validation_ids: validation_ids, nr_instances: nr_instances, nr_unpredicted: nr_unpredicted, accept_values: accept_values, @@ -103,29 +106,33 @@ module OpenTox field :weighted_rmse, type: Float field :weighted_mae, type: Float field :weighted_mae, type: Float + field :r_squared, type: Float field :correlation_plot_id, type: BSON::ObjectId def self.create model, n=10 cv = self.new cv.save # set created_at - validation_ids = [] + #validation_ids = [] nr_instances = 0 nr_unpredicted = 0 predictions = [] validation_class = Object.const_get(self.to_s.sub(/Cross/,'')) fold_nr = 1 training_dataset = Dataset.find model.training_dataset_id - training_dataset.folds(n).each do |fold| - t = Time.now - $logger.debug "Predicting fold #{fold_nr}" - - validation = validation_class.create(model, fold[0], fold[1]) - validation_ids << validation.id + training_dataset.folds(n).each_with_index do |fold,fold_nr| + fork do # parallel execution of validations + $logger.debug "Dataset #{training_dataset.name}: Fold #{fold_nr} started" + t = Time.now + validation = validation_class.create(model, fold[0], fold[1],cv) + $logger.debug "Dataset #{training_dataset.name}, Fold #{fold_nr}: #{Time.now-t} seconds" + end + end + Process.waitall + cv.validation_ids = Validation.where(:crossvalidation_id => cv.id).distinct(:_id) + cv.validations.each do |validation| nr_instances += validation.nr_instances nr_unpredicted += validation.nr_unpredicted predictions += validation.predictions - $logger.debug "Fold #{fold_nr}: #{Time.now-t} seconds" - fold_nr +=1 end rmse = 0 weighted_rmse = 0 @@ -135,9 +142,8 @@ module OpenTox weighted_mae = 0 rae = 0 weighted_rae = 0 - n = 0 confidence_sum = 0 - nil_activities = [] + #nil_activities = [] predictions.each do |pred| compound_id,activity,prediction,confidence = pred if activity and prediction @@ -146,34 +152,29 @@ module OpenTox weighted_rmse += confidence*error**2 mae += error.abs weighted_mae += confidence*error.abs - n += 1 confidence_sum += confidence + cv.predictions << pred else # TODO: create warnings + cv.warnings << "No training activities for #{Compound.find(compound_id).smiles} in training dataset #{training_dataset.id}." $logger.debug "No training activities for #{Compound.find(compound_id).smiles} in training dataset #{training_dataset.id}." - nil_activities << pred + #nil_activities << pred end end - predictions -= nil_activities - x = predictions.collect{|p| p[1]} - y = predictions.collect{|p| p[2]} - R.assign "Measurement", x - R.assign "Prediction", y - R.eval "corr <- lm(-log(Measurement) ~ -log(Prediction))" - s = R.eval "summary <- summary(corr)" - p R.eval("summary$r.squared").to_ruby - #p s.to_ruby - #p s.to_ruby.first - s.to_ruby.each_with_index do |l,i| - #p i - #p l - end - mae = mae/n + #predictions -= nil_activities + x = cv.predictions.collect{|p| p[1]} + y = cv.predictions.collect{|p| p[2]} + R.assign "measurement", x + R.assign "prediction", y + R.eval "r <- cor(-log(measurement),-log(prediction))" + r = R.eval("r").to_ruby + + mae = mae/cv.predictions.size weighted_mae = weighted_mae/confidence_sum - rmse = Math.sqrt(rmse/n) + rmse = Math.sqrt(rmse/cv.predictions.size) weighted_rmse = Math.sqrt(weighted_rmse/confidence_sum) # TODO check!! - predictions.sort! do |a,b| + cv.predictions.sort! do |a,b| relative_error_a = (a[1]-a[2]).abs/a[1].to_f relative_error_a = 1/relative_error_a if relative_error_a < 1 relative_error_b = (b[1]-b[2]).abs/b[1].to_f @@ -184,14 +185,15 @@ module OpenTox name: model.name, model_id: model.id, folds: n, - validation_ids: validation_ids, + #validation_ids: validation_ids, nr_instances: nr_instances, nr_unpredicted: nr_unpredicted, - predictions: predictions,#.sort{|a,b| [(b[1]-b[2]).abs/b[1].to_f,b[3]] <=> [(a[1]-a[2]).abs/a[1].to_f,a[3]]}, + #predictions: predictions,#.sort{|a,b| [(b[1]-b[2]).abs/b[1].to_f,b[3]] <=> [(a[1]-a[2]).abs/a[1].to_f,a[3]]}, mae: mae, rmse: rmse, weighted_mae: weighted_mae, - weighted_rmse: weighted_rmse + weighted_rmse: weighted_rmse, + r_squared: r**2 ) cv.save cv @@ -239,19 +241,20 @@ module OpenTox #R.eval "error <- log(Measurement)-log(Prediction)" #R.eval "rmse <- sqrt(mean(error^2, na.rm=T))" #R.eval "mae <- mean(abs(error), na.rm=T)" - R.eval "r <- cor(-log(prediction),-log(measurement))" + #R.eval "r <- cor(-log(prediction),-log(measurement))" R.eval "svg(filename='#{tmpfile}')" R.eval "all = c(-log(measurement),-log(prediction))" R.eval "range = c(min(all), max(all))" R.eval "image = qplot(-log(prediction),-log(measurement),main='#{self.name}',asp=1,xlim=range, ylim=range)" R.eval "image = image + geom_abline(intercept=0, slope=1) + stat_smooth(method='lm', se=FALSE)" - R.eval "text = textGrob(paste('RMSE: ', '#{rmse.round(2)},','MAE:','#{mae.round(2)},','r^2: ',round(r^2,2),'\n\n','#{attributes}'),just=c('left','top'),check.overlap = T)" + R.eval "text = textGrob(paste('RMSE: ', '#{rmse.round(2)},','MAE:','#{mae.round(2)},','r^2: ','#{r_squared.round(2)}','\n\n','#{attributes}'),just=c('left','top'),check.overlap = T)" R.eval "grid.arrange(image, text, ncol=2)" R.eval "dev.off()" file = Mongo::Grid::File.new(File.read(tmpfile), :filename => "#{self.id.to_s}_correlation_plot.svg") plot_id = $gridfs.insert_one(file) update(:correlation_plot_id => plot_id) end + p correlation_plot_id $gridfs.find_one(_id: correlation_plot_id).data end end diff --git a/lib/dataset.rb b/lib/dataset.rb index b3f5392..979753c 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -12,7 +12,6 @@ module OpenTox field :compound_ids, type: Array, default: [] field :data_entries_id, type: BSON::ObjectId#, default: [] field :source, type: String - field :warnings, type: Array, default: [] # Save all data including data_entries # Should be used instead of save @@ -21,7 +20,6 @@ module OpenTox file = Mongo::Grid::File.new(dump, :filename => "#{self.id.to_s}.data_entries") entries_id = $gridfs.insert_one(file) update(:data_entries_id => entries_id) - #save end # Readers @@ -50,7 +48,7 @@ module OpenTox bad_request_error "Data entries (#{data_entries_id}) are not a 2D-Array" unless @data_entries.is_a? Array and @data_entries.first.is_a? Array bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries.size} rows, but dataset (#{id}) has #{compound_ids.size} compounds" unless @data_entries.size == compound_ids.size bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries.first.size} columns, but dataset (#{id}) has #{feature_ids.size} features" unless @data_entries.first.size == feature_ids.size - $logger.debug "Retrieving data: #{Time.now-t}" + #$logger.debug "Retrieving data: #{Time.now-t}" end end @data_entries @@ -149,11 +147,17 @@ module OpenTox # Create a dataset from CSV file # TODO: document structure def self.from_csv_file file, source=nil, bioassay=true - $logger.debug "Parsing #{file}." source ||= file - table = CSV.read file, :skip_blanks => true - dataset = self.new(:source => source, :name => File.basename(file,".*")) - dataset.parse_table table, bioassay + name = File.basename(file,".*") + dataset = self.find_by(:source => source, :name => name) + if dataset + $logger.debug "#{file} already in database." + else + $logger.debug "Parsing #{file}." + table = CSV.read file, :skip_blanks => true + dataset = self.new(:source => source, :name => name) + dataset.parse_table table, bioassay + end dataset end diff --git a/lib/experiment.rb b/lib/experiment.rb index b3ed174..191e76e 100644 --- a/lib/experiment.rb +++ b/lib/experiment.rb @@ -54,12 +54,12 @@ module OpenTox end def report + # TODO create ggplot2 report crossvalidation_ids.each do |id| cv = CrossValidation.find(id) - file = "/tmp/#{cv.name}.svg" + file = "/tmp/#{id}.svg" File.open(file,"w+"){|f| f.puts cv.correlation_plot} `inkview '#{file}'` - #p Crossvalidation.find(id).correlation_plot end end diff --git a/lib/lazar.rb b/lib/lazar.rb index 5903556..decbe69 100644 --- a/lib/lazar.rb +++ b/lib/lazar.rb @@ -9,12 +9,12 @@ require 'rserve' require "nokogiri" require "base64" - # Mongo setup # TODO retrieve correct environment from Rack/Sinatra ENV["MONGOID_ENV"] ||= "development" # TODO remove config files, change default via ENV or directly in Mongoid class Mongoid.load!("#{File.expand_path(File.join(File.dirname(__FILE__),'..','mongoid.yml'))}") +Mongoid.raise_not_found_error = false # return nil if no document is found $mongo = Mongoid.default_client $gridfs = $mongo.database.fs diff --git a/lib/opentox.rb b/lib/opentox.rb index 53b34e9..875487c 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -13,6 +13,7 @@ module OpenTox include Mongoid::Timestamps store_in collection: klass.downcase.pluralize field :name, type: String + field :warnings, type: Array, default: [] end OpenTox.const_set klass,c diff --git a/lib/validation.rb b/lib/validation.rb index bcbe49a..445f897 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -1,8 +1,10 @@ module OpenTox class Validation + #include Celluloid field :prediction_dataset_id, type: BSON::ObjectId + field :crossvalidation_id, type: BSON::ObjectId field :test_dataset_id, type: BSON::ObjectId field :nr_instances, type: Integer field :nr_unpredicted, type: Integer @@ -81,7 +83,7 @@ module OpenTox end class RegressionValidation < Validation - def self.create model, training_set, test_set + def self.create model, training_set, test_set, crossvalidation=nil validation_model = Model::LazarRegression.create training_set test_set_without_activities = Dataset.new(:compound_ids => test_set.compound_ids) # just to be sure that activities cannot be used @@ -106,6 +108,7 @@ module OpenTox :nr_unpredicted => nr_unpredicted, :predictions => predictions.sort{|a,b| b[3] <=> a[3]} # sort according to confidence ) + validation.crossvalidation_id = crossvalidation.id if crossvalidation validation.save validation end diff --git a/test/data/LOAEL_log_mg_corrected_smiles.csv b/test/data/LOAEL_log_mg_corrected_smiles.csv index e7dde1f..22e6824 100644 --- a/test/data/LOAEL_log_mg_corrected_smiles.csv +++ b/test/data/LOAEL_log_mg_corrected_smiles.csv @@ -1,568 +1,568 @@ SMILES,LOAEL_log_mg_kg_bw_day -'C1=C(C(=CC(=C1NN=C3C2=C(C=C([S]([O-])(=O)=O)C=C2)C=CC3=O)OC)[S]([O-])(=O)=O)C.[Na+].[Na+]',3.57275546515422 -'O1C(=O)C(O)=C(O)C1C(O)CO',3.48444220764241 -'C1(C)=C(C=CC(C)=CC=CC(C)=CC=CC=C(C)C=CC=C(C)C(=O)OC)C(C)(C)CCC1',2.69897000433602 -'c(cccc1)(c1)C(C)C',2.66464197555613 -'O=C(OCCCC)c(c(ccc1)C(=O)OCCCC)c1',2.77815125038364 -'O=C(OCC)c(c(ccc1)C(=O)OCC)c1',3.64689362416774 -'O=C(OC(OC(OC1C)C)C1)C',2.09691001300806 -'Oc(c(ccc1)C)c1C',0.778151250383644 -'Oc(ccc(c1C)C)c1',1.14612803567824 -'O=C(OCC)C=C',2.39445168082622 -'c(cccc1)(c1)CC',2.61066016308988 -'OCCO',2.39794000867204 -'c(ccc1C(=O)OCC(=O)OCC)cc1C(=O)OCC',3.39794000867204 -'O=C',1.91381385238372 -'O=C(O)C=CC(=O)O',3.03382569395331 -'OCC(O)CO',3.83777776955373 -'O=C(OC)c(ccc(O)c1)c1',3.17609125905568 -'O=C(OCCC)c(ccc(O)c1)c1',3.17609125905568 -'CC(CCC(=O)(O))C3CCC4C2CCC1CC(O)CCC1(C)C2CCC34C',2.69897000433602 -'OC(C(CCC1C)C(C)C)C1',2.77305469336426 -'O=C(O)C(=C)C',2.39445168082622 -'O=C(OC)c(c(O)ccc1)c1',2.55630250076729 -'Oc(cccc1)c1',2.53655844257153 -'O=C(OCCC)c(cc(O)c(O)c1O)c1',2.93651374247889 -'OCC(O)C1C(O)=C(O)C(=O)O1',3.19145101446490 -'c(cccc1)(c1)C=C',1.32221929473392 -'O=Cc(occ1)c1',1.77815125038364 -'NCCNc1cccc2ccccc12',1.89762709129044 -'CN(C)(C)CCCl',2.43933269383026 -'O=C(Nc(ccc(c1)C(=O)CCl)c1)C',3.19865708695442 -'c(ccc(c1)Cl)(c1)C(c(ccc(c2)Cl)c2)C(Cl)(Cl)Cl',1.50514997831991 -'CC(Oc1cc(Cl)c(Cl)cc1Cl)C(=O)(O)',0.939519252618618 -'O=N(=O)C(=CC=C1OC)C=C1N=NC(C(O)=C2C(=O)NC(=CC=C4)C=C4N(=O)=O)=C(C=C3)C(=C2)C=C3',3.32221929473392 -'O=N(=O)C(C=C1)=CC(OCCO)=C1NCCO',2.35983548233989 -'Cc1cccc(CC)c1N(C(=O)CCl)COCC',1.69897000433602 -'C1=C(C(=CC=C1OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-])C(=O)[O-].[Na+]',2.25527250510331 -'CCc1cccc(CC)c1N(COC)C(=O)CCl',1.17609125905568 -'O=C(Nc(ccc(OCC)c1N)c1)C',3.07371835034612 -'Oc(ccc(N)c1)c1',2.83632411570675 -'CC(N)CC(=CC=C1)C=C1',0.698970004336019 -'O(c(ccc(c1)C=CC)c1)C',2.53655844257153 -'COc1ccc(N)cc1',2.67577834167409 -'O=C(O)c(c(N)ccc1)c1',3.43949059038968 -'Clc2cccc(c2)c1ccccc1',0.602059991327962 -'O=C(NC(C(=O)OC)Cc(cccc1)c1)C(N)CC(=O)O',2.16731733474818 -'n1c2ccc(Cl)cc2ncc1Oc3ccc(OC(C)C(=O)OCC)cc3',0.568201724066995 -'COC(=O)NS(=O)(=O)c1ccc(N)cc1',2.25527250510331 -'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',-0.443697499232713 -'CNC(=O)Oc1ccccc1OC(C)C',1.69897000433602 -'CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n2cncn2',1.39794000867204 -'O=S(O)(=O)C(=CC=C1)C=C1CN(CC)=C(C=C2)C=CC2=C(C(C=C3)=CC=C3N(C)C)C(C=C4)=CC=C4N(CC)CC(C=C5)=CC(=C5)S(=O)(=O)O',2.85733249643127 -'c(c(cccc1)c1)(cccc2)c2',2.39794000867204 -'BrC(Cl)Cl',2.11394335230684 -'ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O)',1.07918124604762 -'O=C(Oc(c(c(ccc1)cc2)c1)c2)NC',1.19312459835446 -'CC1=C(SCCO1)C(=O)Nc2ccccc2',1.47712125471966 -'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',-0.568636235841013 -'O=C(O)CCl',1.47712125471966 -'ClC(=CC=C1N)C=C1',0.778151250383644 -'CC(C)OC(=O)C(O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2',0.954242509439325 -'n1c(OC)nc(C)nc1NC(=O)NS(=O)(=O)c2ccccc2Cl',1.39794000867204 -'OS(=O)(=O)C(C(=CC=C2)C1=C2)=CC=C1N=NC(C(O)=C3N=NC(C(C=C5)=C4C=C5)=CC=C4S(O)(=O)=O)=CC(=C3O)CO',2.8668778143375 -'S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1',-0.0969100130080564 -'CNP(=O)(OC)Oc1ccc(cc1Cl)C(C)(C)C',0.602059991327962 -'C(C1C2C(C(O)C(O1)OC8C(OC(OC7C(OC(OC6C(OC(OC5C(C(C(OC4C(C(C(OC3C(C(C(O2)OC3CO)O)O)OC4CO)O)O)OC5CO)O)O)C(C6O)O)CO)C(C7O)O)CO)C(C8O)O)CO)O)O',3.20411998265593 -'n1c(N)nc(N)nc1NC2CC2',1.17609125905568 -'COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl',2.69897000433602 -'O=C(O)C(Cl)(Cl)C',1.44978684698577 -'Nc1cc(N)c(O)cc1',1.39794000867204 -'FC(F)(Cl)Cl',2.17609125905568 -'ClCCl',1.69897000433602 -'O=P(OC)(OC)OC=C(Cl)Cl',0.361727836017593 -'OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl',1.30102999566398 -'ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl',-1.30102999566398 -'CN(=C1C(C=C2)=CC=C2)N(C)C(=C1)C(C=C3)=CC=C3',2.09691001300806 -'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',0.903089986991944 -'CC1=C(C)S(=O)(=O)CCS1(=O)=O',1 -'O=C(NC)CSP(OC)(OC)=S',-0.602059991327962 -'COc1ccc(N)c(OC)c1',2.44090908206522 -'COP(=O)OC',2 -'CC(=C(N(=O)=O)C=C1N(=O)=O)C=C1',1.53147891704226 -'CN(C)C(=O)C(c1ccccc1)c2ccccc2',1.47712125471966 -'N(c(cccc1)c1)c(cccc2)c2',1.49136169383427 -'C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3',-0.236572006437063 -'CCOP(=S)(OCC)SCCSCC',-1 -'NC(=S)NNC(N)=S',2.97634997900327 -'O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1',0.778151250383644 -'O=P(O)(O)CCCl',2.17609125905568 -'O=C(OCC)C(O1)C1(c(cccc2)c2)C',2.24303804868629 -'COC(=O)NC(=NC1=C2)NC1=CC(=C2)SC(C=C3)=CC=C3',1.17609125905568 -'CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1',1.39794000867204 -'c1cc(C(F)(F)F)cc(Cl)c1NC(C(C)C)C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',0.397940008672038 -'S=P(OCC)(Sc1ccccc1)CC',0.198657086954423 -'n1c(C)nc(OC)nc1NC(=O)NS(=O)(=O)c2ccsc2C(=O)OC',1.39794000867204 -'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',0.698970004336019 -'O=N(=O)N(CN1N(=O)=O)CN(C1)N(=O)=O',0.176091259055681 -'O=C(N=C(N(C1(=O))C)N(C)C)N1C(CCCC2)C2',1.69897000433602 -'n(c(c(ccc1)cc2)c1O)c2',2.15533603746506 -'c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2',1.60205999132796 -'COc1cccc(OC)c1C(=O)Nc2onc(C(C)(CC)CC)c2',1.70500795933334 -'n1c(OC)cc(OC)nc1NC(=O)NS(=O)(=O)Cc2ccccc2C(=O)OC',2.48995847942483 -'CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC',1.69897000433602 -'CN(C)(CCC1)CC1',2.17609125905568 -'O=P(SCCCC)(SCCCC)SCCCC',0.0969100130080564 -'COCC(=O)N(C(C)C(=O)OC)c1c(C)cccc1C',1.79588001734408 -'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',0.301029995663981 -'CNC(=O)ON=C(C)SC',1 -'COP(=S)(OC)Oc1ccc(cc1)N(=O)(=O)',-0.602059991327962 -'O=C1N(N)C(SC)=NN=C1C(C)(C)C',1.17609125905568 -'COP(=O)(OC)OC(Br)C(Cl)(Cl)Br',0.301029995663981 -'OC(C(N)C1O)C(C)OC1(C)OC(CC(C)(C(C2O)C(O)=O)OC(O)(C2)CC(O)CC(C)(O3)C3C=C4)C=CC=CC=CC=CCC(C)OC4=O',1.85733249643127 -'O=N(=O)c(ccc(c1N)C)c1',0.903089986991944 -'O=N(=O)c(c(N)ccc1N)c1',1.93951925261862 -'O=C(O)C(=C(N)C=C1N(=O)=O)C=C1',3.07371835034612 -'O=N(=O)c(c(c(ccc1)cc2)c1)c2',2.21748394421391 -'c12c(N=Nc3ccccc3)c(O)ccc1cc(S(=O)(=O)O)cc2',2.25527250510331 -'CC(C)Oc1cc(c(Cl)cc1Cl)N2N=C(OC2(=O))C(C)(C)C',0.698970004336019 -'CNC(=O)ON=C(SC)C(=O)N(C)C',0.698970004336019 -'CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O',0.544068044350276 -'Oc(c(c(c(c1Cl)Cl)Cl)Cl)c1Cl',1 -'NC(=N)NC(=N)NCCc1ccccc1',1.86332286012046 -'COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O)',1.30102999566398 -'CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC',1.08990511143940 -'ClC3C6(Cl)C4C2C1OC1C5C2C3(Cl)C(Cl)(C45)C6(Cl)Cl',-0.154901959985743 -'O=C(OC(=O)c1cccc2)c12',3.07371835034612 -'Nc1c(Cl)c(Cl)nc(C(=O)(O))c1Cl',1.77815125038364 -'CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1',0.397940008672038 -'Nc3ccc2cc1ccc(N)cc1nc2c3',1.67209785793572 -'CCC(=O)Nc1ccc(Cl)c(Cl)c1',1.30102999566398 -'Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2',1.39794000867204 -'O=C(N)c(nccn1)c1',2.89707700320942 -'Oc1cc(O)c2C(=O)C(O)=C(c3cc(O)c(O)cc3)Oc2c1',3.30835094858673 -'CCC(O)(C)C#C',1.66275783168157 -'CC(C(NCC)=C1)=CC(C1=O2)=C(C(C2=C3)=CC(C)=C3NCC)C(=CC=C4)C(=C4)C(=O)OCC',1.07918124604762 -'O=C(NS(=O)(=O)c1cccc2)c12',3.55654370848351 -'c1cc(Cl)ccc1C2SC(=O)N(C(=O)NC3CCCCC3)C2C',2.20411998265593 -'n(c(nc(n1)NCC)NCC)c1Cl',0.698970004336019 -'O=[S](NC1CCCCC1)(=O)[O-].[Na+]',3.55654370848351 -'O=C(OCC(C1OCC(C1O)O)O)CCCCCCCCCCC',3.83777776955373 -'O(CC1O)C(C1O)C(O)COC(=O)CCCCCCCCCCCCCCCCC',3.85751341477669 -'O=S(=O)(Nc(nc(cc1C)C)n1)c(ccc(N)c2)c2',1.51851393987789 -'CCNc1nc(NC(C)(C)C)nc(SC)n1',1.17609125905568 -'Oc(c(cc(c1)C(C)(C)C)Cl)c1',2.33445375115093 -'C(C(Cl)Cl)(Cl)Cl',2.03342375548695 -'COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl',2 -'CCN(CC)C(=O)SCc1ccc(Cl)cc1',0.698970004336019 -'COC(=O)NC(=S)Nc1ccccc1NC(=S)NC(=O)OC',1.50514997831991 -'N(C(=S)SSC(N(C)C)=S)(C)C',1.17609125905568 -'c12OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CCc1c(C)c(OC(=O)C)c(C)c2C',3.30102999566398 -'Cc1cc(N)ccc1NOS(O)(=O)=O',2.26481782300954 -'C(Br)(C(Br)(Br)Br)C1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',0.477121254719662 -'O=C(O)COc(c(cc(c1Cl)Cl)Cl)c1',1 -'FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O',1.60205999132796 -'Cc1cc(C)c(N)cc1C',1.79934054945358 -'CC(O)(C(O)C(O1)C)CC1(C)OC(C(C)O2)C(C(O)C2(C)OC(C(C)C(O)CC(=O)OC(CC)C3COC(C(OC)C4OC)OC(C)C4O)C(CC=O)CC(C)C(=O)C=CC(=C3)C)N(C)C',2.69897000433602 -'c1c(Cl)cc(Cl)cc1N2C(=O)C(C)(C=C)OC2(=O)',1.86272752831797 -'O=C(OC(CCCC(O)CCCCCc1cc(O)cc2O)C)c12',-0.698970004336019 -'COC(=O)C1(C2=CC=CC=C2C3=C1C=C(C=C3)Cl)O',2.17609125905568 -'CC(C(=O)O)OC1=CC(=CC=C1)Cl',2 -'P12P3P1P23',3.16790781000148 -'C(CO)O',2.60205999132796 -'CCCCOCC(C)OCC(C)O',2.10720996964787 -'C(CO)O',3.30102999566398 -'C(CO)O',2.96378782734556 -'[O-][As](=O)([O-])[O-]',0.795880017344075 -'[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F',0.361727836017593 -'N(C(=S)SSC(N(C)C)=S)(C)C',1.06069784035361 -'COP(=O)(N)SC',-0.0457574905606751 -'N(C(=S)SSC(N(C)C)=S)(C)C',0.737987326333431 -'COP(=O)(NC(=O)(C))SC',1.54406804435028 -'C1=CC=C(C=C1)NC(=O)NC2=CN=NS2',1.47712125471966 -'CCOP(=S)(NC(C)C)OC1=CC=CC=C1C(=O)OC(C)C',-0.301029995663981 -'CC(=NOC(=O)N(C)SN(C)C(=O)ON=C(C)SC)SC',1 -'CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C',0.176091259055681 -'NC(CCCC1)C1',1.76715586608218 -'CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1',1.51188336097887 -'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',-0.301029995663981 -'CCCCC(CC)COC(=O)C1=CC=CC=C1C(=O)OCC(CC)CCCC',2.30102999566398 -'OC(=O)CNCP(O)(O)=O',3 -'C1CNC(=S)N1',-0.638272163982407 -'O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1',0.795880017344075 -'C1=CC=C2C(=C1)NC(=S)S2',2.8750612633917 -'CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl',1 -'c(c(c(c(c1Cl)Cl)Cl)Cl)(c1Cl)Cl',-0.537602002101044 -'COc1ccc(cc1)C(c2ccc(OC)cc2)C(Cl)(Cl)Cl',2.09691001300806 -'C1=CC(=CC=C1Cl)Cl',2.47712125471966 -'CC(C)OC(=O)NC1=CC(=CC=C1)Cl',2.69897000433602 -'COP(=O)(OC)OC=C(Cl)Cl',0.332438459915605 -'CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O',-0.376750709602100 -'CNC(=O)N(C)c1nnc(s1)C(C)(C)C',1.60205999132796 -'CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2',2.39794000867204 -'CC(C(=O)O)OC1=C(C=C(C=C1)Cl)Cl',0.954242509439325 -'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',1.09691001300806 -'C(#N)c(c(c(c(c1C(#N))Cl)Cl)Cl)c1Cl',0.602059991327962 -'O=C(OCC)C(O)(c(ccc(c1)Cl)c1)c(ccc(c2)Cl)c2',1.26481782300954 -'O=C(N(C)C)Nc(ccc(c1)Cl)c1',2.09691001300806 -'O=C(N(SC(Cl)(Cl)Cl)C(=O)C1CC=CC2)C12',2 -'CCc1cccc(C)c1N(C(C)COC)C(=O)CCl',2.17609125905568 -'C1=CC(=C(C=C1Cl)Cl)OCC(=O)O',0.698970004336019 -'CCNC1=NC(=NC(=N1)Cl)NC(C)(C)C#N',0.0969100130080564 -'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',0.662757831681574 -'COP(=S)(OC)OC1=CC(=C(C=C1Cl)Cl)Cl',1.69897000433602 -'C1C2C=CC1C3C2C4(C(=C(C3(C4(Cl)Cl)Cl)Cl)Cl)Cl',-2 -'CC1(C(C1C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Cl)Cl)C',1.39794000867204 -'CCN(CC)C(=O)C(C)OC1=CC=CC2=CC=CC=C21',2 -'ClC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',-0.602059991327962 -'CC(=CC(=O)NC)OP(=O)(OC)OC',-0.346787486224656 -'CC(C)C1(C)N=C(NC1(=O))c3nc2ccccc2cc3C(=O)(O)',1.30102999566398 -'CC(C)Nc1nc(Cl)nc(NC(C)C)n1',1.69897000433602 -'CC(C(=O)O)(Cl)Cl',1.69897000433602 -'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',0.8750612633917 -'O=C(NC)CSP(OC)(OC)=S',0.698970004336019 -'C12C3(C4(C5(C3(C(C1(C5(C2(C4(Cl)Cl)Cl)Cl)Cl)(Cl)Cl)Cl)Cl)Cl)Cl',-2 -'COC(=O)C1=CC=CC=C1C(=O)OC',3.30102999566398 -'CCOP(=S)(OCC)SCSC(C)(C)C',-1.30102999566398 -'CCC(C)SP(=O)(OCC)SC(C)CC',-0.602059991327962 -'CCOP(=S)(OCC)SCSC(C)(C)C',0.301029995663981 -'C1C(C(C(=O)N1C2=CC=CC(=C2)C(F)(F)F)Cl)CCl',0.698970004336019 -'O=C(O)C(C(C(=O)O)C(O1)CC2)C12',2.06069784035361 -'O=C(Oc(c(OC(C1)(C)C)c1cc2)c2)NC',0.698970004336019 -'Oc(c(c(c(c1)Cl)Cl)Cc(c(c(cc2Cl)Cl)Cl)c2O)c1Cl',0.698970004336019 -'CC1(CON(C1=O)CC2=CC=CC=C2Cl)C',1.33243845991561 -'CCC(C)N1C(=O)C(=C(NC1=O)C)Br',1.79588001734408 -'CC1=CC(=CC(=C1N(C)C)C)OC(=O)NC',0.176091259055681 -'CNC(=O)OC1=CC=CC(=C1)N=CN(C)C',1.09691001300806 -'CC1=NN(C(=O)N1C(F)F)C2=CC(=C(C=C2Cl)Cl)NS(=O)(=O)C',1.82607480270083 -'CCOP(=S)(CC)SC1=CC=CC=C1',0.698970004336019 -'CCOP(=S)(OCC)SC(CCl)N1C(=O)C2=CC=CC=C2C1=O',0.397940008672038 -'N1CC(C)(C)CNC1=NN=C(C=Cc2ccc(C(F)(F)F)cc2)C=Cc3ccc(C(F)(F)F)cc3',0.698970004336019 -'CC1=C(C(=C(C(=C1F)F)COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)F)F',0.662757831681574 -'CC1=CC(=C(C=C1)N=CN(C)C=NC2=C(C=C(C=C2)C)C)C',1.00860017176192 -'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',-0.0969100130080564 -'CC(C)N(C(C)C)C(=O)SCC(Cl)=C(Cl)Cl',1.09691001300806 -'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',0.352182518111362 -'CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2CCC(F)(F)F',1.90254677931399 -'O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12',1.60205999132796 -'CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1',1.13987908640124 -'O=C(ON=CC(SC)(C)C)NC',-1 -'ClC(Cl)(Cl)CC1(OC1)c2cc(Cl)cc(Cl)c2',1.47712125471966 -'CCC1CCCC(C(C(=O)C2CC3C(C2CC(=O)O1)CCC4C3CC(C4)OC5CC(C(C(C5OC)OC)OC)C)C)OC6CCC(C(O6)C)N(C)C',1.38021124171161 -'CC(C)(C)C(=NOC(=O)NC)CSC',0.778151250383644 -'CON=C(CC1=CN=CC=C1)C2=C(C=C(C=C2)Cl)Cl',1.65321251377534 -'CC(=CC1C(C1(C)C)C(=O)OCN2C(=O)C3=C(C2=O)CCCC3)C',2.39794000867204 -'C1COC(O1)(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl',1 -'CCCOC(=O)C1=CN=C(C=C1)C(=O)OCCC',2.39794000867204 -'CC1=CC(=NC(=N1)NC(=O)NS(=O)(=O)C2=CC=CC=C2C(=O)OC3COC3)C',1.91907809237607 -'C1=C(C(=NC(=C1Cl)Cl)OCC(=O)O)Cl',1.55630250076729 -'CCOCN1C(=C(C(=C1C(F)(F)F)Br)C#N)C2=CC=C(C=C2)Cl',1.13353890837022 -'CC(C)CC1=C(C(=NC(=C1C(=O)SC)C(F)(F)F)C(F)F)C(=O)SC',0.559906625036112 -'CC12CC1(C(=O)N(C2=O)C3=CC(=CC(=C3)Cl)Cl)C',1.17609125905568 -'CC1=CC(=C(C=C1)C(=O)OC)C2=NC(C(=O)N2)(C)C(C)C',1.69897000433602 -'COP(=S)(OC)OC1=NC(=C(C=C1Cl)Cl)Cl',0.477121254719662 -'CC(C)CC1=C(C(=NC(=C1C(=O)OC)C(F)F)C(F)(F)F)C2=NCCS2',1.64542226934909 -'CCOC(=O)C(CC1=CC(=C(C=C1Cl)F)N2C(=O)N(C(=N2)C)C(F)F)Cl',1.07918124604762 -'CC(C)=CC3C(C(=O)OCc2coc(Cc1ccccc1)c2)C3(C)C',2.09691001300806 -'CCCSP(=S)(OCC)OC1=CC=C(C=C1)SC',1.06069784035361 -'CC1=CC(=C(C(=C1)OC(=O)NC)C)C',1.77232170672292 -'CC1=CC=CC=C1COC2CC3(CCC2(O3)C)C(C)C',2.17609125905568 -'CC1=C2C(=CC=C1)SC3=NN=CN23',1.49136169383427 -'CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl',2 -'CCCN(CCC)C(=O)SCC',0.954242509439325 -'CC(C)OC(=O)C=C(C)C=CCC(C)CCCC(C)(C)OC',1.66275783168157 -'COP(=S)(OC)Oc1ccc(SC)c(C)c1',0.574031267727719 -'COC1=C(C=C(C=C1)C(=CC(=O)N2CCOCC2)C3=CC=C(C=C3)Cl)OC',1.66558099101795 -'CCSC(=O)N(CC(C)C)CC(C)C',2 -'CC(C)OP(=S)(OC(C)C)SCCNS(=O)(=O)C1=CC=CC=C1',1.17609125905568 -'CC(=CC1C(C1(C)C)C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C',2.17609125905568 -'CC1=CC(=CC(=C1C)C)OC(=O)NC',1 -'CCOP(=S)(OCC)SCSC1=CC=C(C=C1)Cl',0 -'C1CN(CCN1C(C(Cl)(Cl)Cl)NC=O)C(C(Cl)(Cl)Cl)NC=O',2 -'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',0.301029995663981 -'C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-]',2.09691001300806 -'CCCC(=NOCC)C1C(=O)CC(CC1=O)CC(C)SCC',1.21906033244886 -'ClC2(Cl)C4(Cl)C1(Cl)C5(Cl)C(Cl)(Cl)C3(Cl)C1(Cl)C2(Cl)C3(Cl)C45Cl',-0.154901959985743 -'CCN(C1CCCCC1)C(=O)SCC',0.477121254719662 -'CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2OCCCl',2.34399906905716 -'C(C(=O)O)OC1=NC(=C(C(=C1Cl)N)Cl)F',2.69897000433602 -'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC#C',1.97772360528885 -'C1C(COC1(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl)Br',0.811575005870593 -'C1=NNC(=N1)N',0.397940008672038 -'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F',1.41497334797082 -'C1=CC(=CC=C1OS(=O)(=O)C2=CC=C(C=C2)Cl)Cl',0.397940008672038 -'FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O',3 -'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',1.8750612633917 -'C1=CC(=C(C(=C1)Cl)C#N)Cl',0.397940008672038 -'C1C(O1)COC2=CC=CC=C2C3=CC=CC=C3',2.69897000433602 -'CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC',2.57403126772772 -'O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N',1.56655533088306 -'C1=CC(=C(C2=NC=C(C=C21)Cl)C(=O)O)Cl',2.87909587950007 -'CC(C)NC(=O)N1CC(=O)N(C1=O)C2=CC(=CC(=C2)Cl)Cl',1.66275783168157 -'CCCN(CCCl)C1=C(C=C(C=C1[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',2.30621050816776 -'C1=CC=C(C=C1)C2=CC=CC=C2O',3 -'O=C(N(C)C)Nc(cccc1C(F)(F)F)c1',1.17609125905568 -'C1=CC(=NC(=C1)Cl)C(Cl)(Cl)Cl',0 -'Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2',0.8750612633917 -'CC1=CC(=C(C=C1NC(=O)C)NS(=O)(=O)C(F)(F)F)C',1.44090908206522 -'C(=C(I)I)(I)I',1.69897000433602 -'C1=C(C=C(C(=C1Cl)N2C(=C(C(=N2)C#N)S(=O)C(F)(F)F)N)Cl)C(F)(F)F',-1.22184874961636 -'O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1',0.795880017344075 -'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',1.38916608436453 -'CC1=CC2=C(C=C1)N=C3C(=N2)SC(=O)S3',0.8750612633917 -'CC(C)N(C(=O)CCl)c1ccccc1',1.36172783601759 -'CC(C)C1(C(=O)NC(=N1)C2=C(C=CC=N2)C(=O)O)C',2.69897000433602 -'CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C',1.28891960566173 -'CN1CN(C(=S)SC1)C',1.47712125471966 -'ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',1.8750612633917 -'ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl',-0.698970004336019 -'CCOC(=O)CN1C2=C(C=CC=C2Cl)SC1=O',1.09691001300806 -'CCCN(CCC)C1=C(C=C(C(=C1[N+](=O)[O-])N)C(F)(F)F)[N+](=O)[O-]',1.46834733041216 -'C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N',1.60205999132796 -'CC(C)(C)C(CCC1=CC=C(C=C1)Cl)(CN2C=NC=N2)O',1.20139712432045 -'CC1=C(C=CC=C1COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)C3=CC=CC=C3',0.698970004336019 -'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',1.60205999132796 -'C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-]',2.17609125905568 -'CC1=C(C=C(C=C1C(=O)N)[N+](=O)[O-])[N+](=O)[O-]',0.795880017344075 -'CC(C)OC1=CC=CC(=C1)NC(=O)C2=CC=CC=C2C(F)(F)F',2.69897000433602 -'OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl',0.397940008672038 -'O=P(O)(O)CCCl',2.64933485871214 -'CN(C(=O)NC1=CC=C(C=C1)Br)OC',1.09691001300806 -'CC1=CC(=CC=C1)NC(=O)OC2=CC=CC(=C2)NC(=O)OC',1.39794000867204 -'CC(C)(C)C1=NN=C(S1)N2C(CN(C2=O)C)O',1.69897000433602 -'S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1',0.230448921378274 -'COC(=O)c1ccccc1S(=O)(=O)NC(=O)N(C)c2nc(OC)nc(C)n2',1.09691001300806 -'C1=CC=C(C(=C1)NC2=NC(=NC(=N2)Cl)Cl)Cl',0.0606978403536116 -'CC1=C(C=CC(=C1)OP(=S)(OC)OC)[N+](=O)[O-]',-0.337242168318426 -'COc1c(Cl)ccc(Cl)c1C(=O)(O)',2.06069784035361 -'CC1(C(C1C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Br)Br)C',0.397940008672038 -'C1=CC=C(C(=C1)C(C2=CC=C(C=C2)F)(C3=CN=CN=C3)O)Cl',0.397940008672038 -'c1ccc2nc(NC(=O)OC)n(C(=O)NCCCC)c2c1',2.06069784035361 -'CCOC(=O)COC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',1.39794000867204 -'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)C3=CC=CC=C3)O',1.39794000867204 -'CCNC(=O)NC(=O)C(=NOC)C#N',1.48144262850231 -'CCOC1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',1.60205999132796 -'CC1=NC=C(N1CCO)[N+](=O)[O-]',2.17609125905568 -'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',2.69897000433602 -'CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2',2 -'CCCCC(CN1C=NC=N1)(C2=C(C=C(C=C2)Cl)Cl)O',0.672097857935718 -'CC(C)(C)C(C(=CC1=C(C=C(C=C1)Cl)Cl)N2C=NC=N2)O',1.69897000433602 -'C1=CC(C2C1C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl)Cl',-0.42021640338319 -'C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N',1 -'CC1=NN(C(=C1C=NOCC2=CC=C(C=C2)C(=O)OC(C)(C)C)OC3=CC=CC=C3)C',0.488550716500444 -'CS(=O)(=O)C1=C(C=CC(=C1)C(F)(F)F)C(=O)C2=C(ON=C2)C3CC3',1.30102999566398 -'CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C',1.09691001300806 -'CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC',0.176091259055681 -'C1=CC(=CC=C1C(CN)O)O',2.39794000867204 -'CC1=C(C(=CC=C1)C)N(C(=O)COC)N2CCOC2=O',1.69897000433602 -'c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2',1.27300127206374 -'CCC(C)NC1=C(C=C(C=C1[N+](=O)[O-])C(C)(C)C)[N+](=O)[O-]',1.69897000433602 -'C1=CC(=CC=C1S(=O)(=O)C2=CC(=C(C=C2Cl)Cl)Cl)Cl',2.36172783601759 -'CCCCC1=C(NC(=NC1=O)NCC)C',1.39794000867204 -'n(c(nc(n1)NCC)NCC)c1Cl',0.724275869600789 -'FC(F)(F)C(C=C1N(=O)=O)=CC(N(=O)=O)=C1N(CC)CC(C)=C',1.09691001300806 -'C1CCC(C1)N(CC2=CC=C(C=C2)Cl)C(=O)NC3=CC=CC=C3',1.39794000867204 -'CS(=O)(=O)NC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',1.69897000433602 -'CCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC3=C(O2)C=C(C=C3)Cl',0.954242509439325 -'CCC1=C(C(=CC=C1)CC)N(CNC(=O)C)C(=O)CCl',1.79588001734408 -'NC(=N)NCCCCCCCCCCCC(OC(=O)C)',1.46239799789896 -'C1=CC(=CC(=C1)Cl)NC(=O)OCC#CCCl',2.65321251377534 -'CC(C)C(C(=O)OC(C(#N))c2cccc(Oc1ccccc1)c2)c3ccc(Cl)cc3',1.39794000867204 -'CC(C)C1=C(C=CC(=C1)C(C)(C)C2=CC(=C(C=C2)O)C(C)C)O',1.39794000867204 -'CCN(CC1=C(C=CC=C1Cl)F)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',1.69897000433602 -'CCCCCCCCSC(=O)OC1=CC(=NN=C1C2=CC=CC=C2)Cl',1.82930377283102 -'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',1.13987908640124 -'CCCCNC(=O)N1C2=CC=CC=C2N=C1NC(=O)OC',2.39794000867204 -'CC1=C(C(=CC=C1)C)N(C(C)C(=O)OC)C(=O)CC2=CC=CC=C2',1.66275783168157 -'CC(C)C(C1=CC=C(C=C1)OC(F)F)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3',0.778151250383644 -'Clc1ccccc1c2nnc(c3ccccc3Cl)nn2',1.30102999566398 -'CCOC(=O)NCCOC1=CC=C(C=C1)OC2=CC=CC=C2',1 -'CCC1=C(C(=CC=C1)CC)N(CC(=O)OCC)C(=O)CCl',1.69897000433602 -'c1(O2)c(CC2(C)C)cccc1OC(=O)N(C)SN(CCCC)CCCC',1.39794000867204 -'CCCCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC=C(C=C2)C(F)(F)F',0.477121254719662 -'COC1=CC(=C(C=C1Cl)OC)Cl',2.09691001300806 -'CCOP(=S)(OCC)OC1=NN(C(=N1)Cl)C(C)C',1.09691001300806 -'n(c(nc(n1)NC(C)C)NCC)c1Cl',1.39794000867204 -'CC(C)(C)C(C(=CC1=CC=C(C=C1)Cl)N2C=NC=N2)O',1.59560643486560 -'CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O)',1.69897000433602 -'c1cc(OC(F)(F)F)ccc1C(O)(C(C)C)c2cncnc2',1.08278537031645 -'COP(=O)(C(C(Cl)(Cl)Cl)O)OC',1.30102999566398 -'C1=CC(=C(C=C1C(F)(F)F)Cl)OC2=CC(=C(C=C2)[N+](=O)[O-])C(=O)O',2.09691001300806 -'CCCN(CC1CC1)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',0.698970004336019 -'CCOC(=O)C(C)OC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',1.69897000433602 -'CCSC(=O)N1CCCCCC1',1.17055505852121 -'CCC1=CC=C(C=C1)C(=O)NN(C(=O)C2=CC(=CC(=C2)C)C)C(C)(C)C',1.68124123737559 -'ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O)',1.17609125905568 -'COC(=O)C1=CC=CC=C1S(=O)(=O)NC(=O)NC2=NC(=CC(=N2)OC(F)F)OC(F)F',2.14612803567824 -'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O',1.39794000867204 -'CC1=C(C=CC(=C1)Cl)OCC(=O)O',0.602059991327962 -'COC=C(C1=CC=CC=C1OC2=NC=NC(=C2)OC3=CC=CC=C3C#N)C(=O)OC',1.79413935576777 -'C1=CC=C(C(=C1)C(C2=CC=C(C=C2)Cl)(C3=CN=CN=C3)O)Cl',0.361727836017593 -'[O-]Br(=O)=O',0.785329835010767 -'OP(=O)OCC',2.60205999132796 -'COP(N)(=O)SC',-1 -'CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1',0.176091259055681 -'CCOP(=S)(OCC)SCCSCC',-1.39794000867204 -'CCOP(=S)(OCC)SCSP(=S)(OCC)OCC',0.301029995663981 -'O=C(OCC(CCCC)CC)CCCCC(=O)OCC(CCCC)CC',3.17609125905568 -'CN(C=Nc1ccc(C)cc1C)C=Nc2ccc(C)cc2C',1 -'[C@@]14([C@@H]5OCC1=CC=C[C@@H]([C@H](O[C@H]2C[C@@H]([C@H]([C@@H](O2)C)O[C@H]3C[C@@H]([C@H]([C@@H](O3)C)O)OC)OC)C(=CC[C@@H]6C[C@H](OC([C@@H]4C=C([C@H]5O)C)=O)C[C@]7(O6)O[C@@H]([C@H](C=C7)C)[C@H](CC)C)C)C)O',0.301029995663981 -'O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12',1.54406804435028 -'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',0.0969100130080564 -'C(#N)Cl',1.84509804001426 -'C(#N)Br',2.08635983067475 -'C1=CC(=CC=C1C(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl)Cl',-0.602059991327962 -'c(cccc1)(c1)C(C)C',2.51982799377572 -'CCCN(CCC)C(=O)SCC',1.39794000867204 -'NC(CCCC1)C1',1.77815125038364 -'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',0.778151250383644 -'CC(C)OC(=O)NC1=CC(=CC=C1)Cl',3 -'COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl',1 -'COC(=O)C1=CC=C(C=C1)C(=O)OC',2.09691001300806 -'N(C(=S)NC1)C1',-0.602059991327962 -'O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1',0.397940008672038 -'c(cccc1)(c1)C=C',2.45484486000851 -'COC(=O)c1ccccc1S(=O)(=O)NC(=O)Nc2nc(OC)nc(C)n2',2.39794000867204 -'C1=CC(=CC=C1N)Cl',1.09691001300806 -'FC(F)(F)C(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cc(Oc3ccccc3)ccc2',1.09691001300806 -'C(Cl)(Br)Br',1.45484486000851 -'C=C(Cl)Cl',1.14612803567824 -'C(C=CCl)Cl',0.707570176097936 -'COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl',1.69897000433602 -'Oc(ccc(c1)C(c(ccc(O)c2)c2)(C)C)c1',1.69897000433602 -'O=C(OCc(cccc1)c1)c(c(ccc2)C(=O)OCCCC)c2',2.67209785793572 -'O=C(NCCCC1)C1',2.09691001300806 -'c(cccc1)(c1)Cl',2.07918124604762 -'C(Cl)(Cl)Cl',1.77815125038364 -'ClCCl',1.72082058177034 -'C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl',-0.903089986991944 -'OCCO',3 -'O=C(C=C(CC1(C)C)C)C1',2.25285303097989 -'C(F)(Cl)(Cl)Cl',2.54282542695918 -'CCc1cccc(CC)c1N(COC)C(=O)CCl',1.14612803567824 -'c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2',0.698970004336019 -'n1c(Cl)cc(OC)nc1NC(=O)NS(=O)(=O)c2ccccc2C(=O)OCC',2.09691001300806 -'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',0.89209460269048 -'c(cccc1)(c1)CC',2.46389298898591 -'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',1.60205999132796 -'Clc1cc(C(F)(F)F)cnc1Oc2ccc(OC(C)C(=O)OC)cc2',0 -'C#N',1.49136169383427 -'ClC(C(OC(C=C2C(=O)OC(C)C(=O)OCC)=CC=C2N(=O)=O)=C1)=CC=C1C(F)(F)F',1.69897000433602 -'c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2',1.70969386972779 -'O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N',1.65321251377534 -'CN(=CC=C1C(C=C2)=CC=N2C)C=C1',0.574031267727719 -'C1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-]',1.12417805547468 -'C(=C)Cl',0.113943352306837 -'C1CCC(=O)CC1',2.95904139232109 -'CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C',1.39794000867204 -'C1=CC(=O)NNC1(=O)',2.69897000433602 -'CCSC(=O)N1CCCCCC1',0.301029995663981 -'C(C(Cl)(Cl)Cl)(O)O',2.13033376849501 -'ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl',-1.60205999132796 -'Clc1cc(C(F)(F)F)ccc1Oc2cc(OCC)c(N(=O)(=O))cc2',1 -'c1cc(Cl)ccc1C(C(#N))(CCCC)Cn2ncnc2',0.992995098431341 -'CC1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-]',0.301029995663981 -'CC(C)OC(=O)C(C1=CC=C(C=C1)Br)(C2=CC=C(C=C2)Br)O',1.41497334797082 -'C[N+](C)(C)CCCl',2.11394335230684 -'CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl',1.93449845124357 -'CC1=NC(=NC(=C1)C2CC2)NC3=CC=CC=C3',1.55144999797288 -'N(c(cccc1)c1)c(cccc2)c2',1.39794000867204 -'CC1(C(=O)N(C(=O)O1)NC2=CC=CC=C2)C3=CC=C(C=C3)OC4=CC=CC=C4',1.22530928172586 -'CC1(CCCCC1)C(=O)NC2=C(C(=C(C=C2)O)Cl)Cl',2.46538285144842 -'C1=CC(=C2C(=C1)OC(O2)(F)F)C3=CNC=C3C#N',2.04139268515822 -'C(F)(F)(F)c1ccccc1C(=O)Nc2cccc(OC(C)C)c2',1.93951925261862 -'C(CCCCN=C(N)N)CCCNCCCCCCCCN=C(N)N',1.27875360095283 -'C1CN(C(=N1)N[N+](=O)[O-])CC2=CN=C(C=C2)Cl',1.23044892137827 -'COC(=O)C12CC3=C(C1=NN(CO2)C(=O)N(C4=CC=C(C=C4)OC(F)(F)F)C(=O)OC)C=CC(=C3)Cl',0.556302500767287 -'CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC',2.56820172406699 -'CC1=CC(=CC(=C1)C(=O)N(C(C)(C)C)NC(=O)C2=C(C(=CC=C2)OC)C)C',2.61384182187607 -'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C=C2)OC(C(OC(F)(F)F)F)(F)F)Cl)F',1.55630250076729 -'CC1=CC=C(C=C1)N(SC(F)(Cl)Cl)S(=O)(=O)N(C)C',1.25527250510331 -'CC(C)(C)C1=C(C=CC(=C1)O)O',2.35218251811136 -'CC(=NOCC1=CC=CC=C1C(=NOC)C(=O)OC)C2=CC(=CC=C2)C(F)(F)F',1.77815125038364 -'COC(=O)N(C1=CC=CC=C1COC2=NN(C=C2)C3=CC=C(C=C3)Cl)OC',0.954242509439325 -'CC(C)N1C(=NC(C)(C)C)SCN(C1=O)C2=CC=CC=C2',0.939519252618618 -'C1=CC=C(C(=C1)C2=NN=C(N=N2)C3=CC=CC=C3Cl)Cl',1.23804610312880 -'CCCC(=C1C(=O)CC(CC1=O)C2CCCSC2)NOCC',1.44715803134222 -'C1CC1NC2=NC(=C(C(=N2)N)C#N)N',1.34242268082221 -'C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3',-0.244125144327509 -'C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N',0.778151250383644 -'CCOC1=CC2=C(C=C1)NC(C=C2C)(C)C',1.07918124604762 -'C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N',1.47712125471966 -'CC1CN(CC(O1)C)CC(C)CC2=CC=C(C=C2)C(C)(C)C',0.230448921378274 -'C[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F',0.301029995663981 -'c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2',1.17609125905568 -'CN(=CC=C1C(C=C2)=CC=N2C)C=C1',0.406540180433955 -'CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2',2 -'Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2',1.98227123303957 -'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',1.47712125471966 -'CCOC1=CC=C(C=C1)C(C)(C)COCC2=CC(=CC=C2)OC3=CC=CC=C3',1.41497334797082 -'CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2',1.27875360095283 -'CC(COC1=CC=C(C=C1)OC2=CC=CC=C2)OC3=CC=CC=N3',2.14612803567824 -'CC(C)(C)C(=O)C(N1C=NC=N1)OC2=CC=C(C=C2)Cl',2.05690485133647 -'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O',2.02118929906994 -'c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2',0.903089986991944 -'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',0.778151250383644 -'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',1.07918124604762 -'ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',1.69897000433602 -'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',-0.602059991327962 -'ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl',-1 -'C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl',-0.602059991327962 -'C1(C(C(C(C(C1Cl)Cl)Cl)Cl)Cl)Cl',0.672097857935718 -'CCC(=O)Nc1ccc(Cl)c(Cl)c1',1.88081359228079 -'C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-]',2.14612803567824 -'C1C2C(COS(=O)O1)C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl',0.462397997898956 -'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',1.69897000433602 -'CC(C(=O)O)OC1=CC=C(C=C1)OC2=C(C=C(C=N2)C(F)(F)F)Cl',-1 -'CCCCC(CN1C=NC=N1)(C#N)C2=CC=C(C=C2)Cl',0.991226075692495 -'Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2',0.707570176097936 -'COP(=O)(NC(=O)(C))SC',0.397940008672038 -'CCOP(=O)(OCC)OC(=CCl)C1=C(C=C(C=C1)Cl)Cl',0.176091259055681 -'CCOP(=S)(OCC)SCCSCC',-0.657577319177794 -'O=P(O)(O)CCCl',1.07918124604762 -'CCCSP(=O)(OCC)SCCC',0.431363764158987 -'CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1',0.230448921378274 -'COP(=S)(OC)Oc1ccc(SC)c(C)c1',-0.142667503568732 -'OC(=O)C(N)CCP(C)(=O)O',0.544068044350276 -'OC(=O)CNCP(O)(O)=O',2.47712125471966 -'CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC',2.55630250076729 -'COP(N)(=O)SC',-0.537602002101044 -'CC(=CC(=O)OC)OP(=O)(OC)OC',-0.455931955649724 -'CCOP(=S)(OCC)SCSCC',-0.795880017344075 -'CCOP(=S)(OCC)SCSC(C)(C)C',-1.22184874961636 -'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',0.41161970596323 -'CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl',0 -'CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C',0.763427993562937 -'CCC1=NC(=CC(=N1)OP(=S)(OC)OC)OCC',-0.346787486224656 -'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',0.204119982655925 -'CCOP(=S)(OCC)SCN1C2=C(C=C(C=C2)Cl)OC1=O',0.301029995663981 -'COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O)',0.954242509439325 -'CCOC(=O)C1=CN2C(=CC(=N2)OP(=S)(OCC)OCC)N=C1C',0.602059991327962 -'CCOP(=S)(OCC)OC1=NN(C=N1)C2=CC=CC=C2',0.113943352306837 -'O=C(Oc(c(c(ccc1)cc2)c1)c2)NC',1.77815125038364 -'CC1=CC(=CC(=C1SC)C)OC(=O)NC',0.968482948553935 -'CNC(=O)ON=C(C)SC',1.30102999566398 -'CCCOC(=O)NCCCN(C)C',2.83250891270624 -'COC(=O)NC1=NC2=CC=CC=C2N1',1.8750612633917 -'CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C',1.08990511143940 -'CNC(=O)CCSCCSP(=O)(OC)OC',-0.267606240177031 -'N(C(=S)SSC(N(C)C)=S)(C)C',1.07918124604762 -'C1=NNC(=N1)N',0.698970004336019 -'CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O)',1.80617997398389 -'C1=CC=C(C=C1)[Sn](C2=CC=CC=C2)C3=CC=CC=C3',-0.522878745280338 -'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',0.845098040014257 -'N(C(=S)NC1)C1',0.0969100130080564 -'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F',1.39794000867204 -'CCCSC1=CC2=C(C=C1)N=C(N2)NC(=O)OC',1.30102999566398 -'C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3',2.06069784035361 -'CC1(C2C(C3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C(C=CC(=C41)Cl)O)O)O)N(C)C)O)O',3.7160033436348 -'CC1=CC(=C(C=C1NC(=O)C2=CC(=CC(=C2O)I)I)Cl)C(C#N)C3=CC=C(C=C3)Cl',1 -'CN1CC2CC1CN2C3=C(C=C4C(=C3)N(C=C(C4=O)C(=O)O)C5CC5)F',1.69897000433602 -'C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl',1.17609125905568 -'CC1=NC=C(N1C)[N+](=O)[O-]',1.17609125905568 -'CCN1CCN(CC1)C2=C(C=C3C(=C2)N(C=C(C3=O)C(=O)O)C4CC4)F',1.41497334797082 -'CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O',0 -'COCC(=O)NC1=C(C=CC(=C1)SC2=CC=CC=C2)NC(=NC(=O)OC)NC(=O)OC',1.60205999132796 -'CC1CCC2=C3N1C=C(C(=O)C3=CC(=C2)F)C(=O)O',2.60205999132796 -'COC(=O)NC1=NC2=C(N1)C=C(C=C2)S(=O)C3=CC=CC=C3',0.301029995663981 -'CC1(C2CC3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C1C=CC=C4O)O)O)N(C)C)O',2.17609125905568 -'C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3',1.47712125471966 -'CC(C)NCC(COC1=CC=CC2=C1C3=CC=CC=C3N2)O',0.845098040014257 -'C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl',1.36172783601759 -'CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O',0.397940008672038 -'COP(=S)(OC)Oc1ccc(SC)c(C)c1',-0.346787486224656 -'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',0.903089986991944 -'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',0.602059991327962 -'CC(N(C)C)CN(C(=CC=C3)C1=C3)C(=CC=C2)C(=C2)S1',1.22010808804006 -'C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-]',2.38021124171161 -'c(cccc1)(c1)C=C',2.60205999132796 +C1=C(C(=CC(=C1NN=C3C2=C(C=C([S]([O-])(=O)=O)C=C2)C=CC3=O)OC)[S]([O-])(=O)=O)C.[Na+].[Na+],3.57275546515422 +O1C(=O)C(O)=C(O)C1C(O)CO,3.48444220764241 +C1(C)=C(C=CC(C)=CC=CC(C)=CC=CC=C(C)C=CC=C(C)C(=O)OC)C(C)(C)CCC1,2.69897000433602 +c(cccc1)(c1)C(C)C,2.66464197555613 +O=C(OCCCC)c(c(ccc1)C(=O)OCCCC)c1,2.77815125038364 +O=C(OCC)c(c(ccc1)C(=O)OCC)c1,3.64689362416774 +O=C(OC(OC(OC1C)C)C1)C,2.09691001300806 +Oc(c(ccc1)C)c1C,0.778151250383644 +Oc(ccc(c1C)C)c1,1.14612803567824 +O=C(OCC)C=C,2.39445168082622 +c(cccc1)(c1)CC,2.61066016308988 +OCCO,2.39794000867204 +c(ccc1C(=O)OCC(=O)OCC)cc1C(=O)OCC,3.39794000867204 +O=C,1.91381385238372 +O=C(O)C=CC(=O)O,3.03382569395331 +OCC(O)CO,3.83777776955373 +O=C(OC)c(ccc(O)c1)c1,3.17609125905568 +O=C(OCCC)c(ccc(O)c1)c1,3.17609125905568 +CC(CCC(=O)(O))C3CCC4C2CCC1CC(O)CCC1(C)C2CCC34C,2.69897000433602 +OC(C(CCC1C)C(C)C)C1,2.77305469336426 +O=C(O)C(=C)C,2.39445168082622 +O=C(OC)c(c(O)ccc1)c1,2.55630250076729 +Oc(cccc1)c1,2.53655844257153 +O=C(OCCC)c(cc(O)c(O)c1O)c1,2.93651374247889 +OCC(O)C1C(O)=C(O)C(=O)O1,3.19145101446490 +c(cccc1)(c1)C=C,1.32221929473392 +O=Cc(occ1)c1,1.77815125038364 +NCCNc1cccc2ccccc12,1.89762709129044 +CN(C)(C)CCCl,2.43933269383026 +O=C(Nc(ccc(c1)C(=O)CCl)c1)C,3.19865708695442 +c(ccc(c1)Cl)(c1)C(c(ccc(c2)Cl)c2)C(Cl)(Cl)Cl,1.50514997831991 +CC(Oc1cc(Cl)c(Cl)cc1Cl)C(=O)(O),0.939519252618618 +O=N(=O)C(=CC=C1OC)C=C1N=NC(C(O)=C2C(=O)NC(=CC=C4)C=C4N(=O)=O)=C(C=C3)C(=C2)C=C3,3.32221929473392 +O=N(=O)C(C=C1)=CC(OCCO)=C1NCCO,2.35983548233989 +Cc1cccc(CC)c1N(C(=O)CCl)COCC,1.69897000433602 +C1=C(C(=CC=C1OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-])C(=O)[O-].[Na+],2.25527250510331 +CCc1cccc(CC)c1N(COC)C(=O)CCl,1.17609125905568 +O=C(Nc(ccc(OCC)c1N)c1)C,3.07371835034612 +Oc(ccc(N)c1)c1,2.83632411570675 +CC(N)CC(=CC=C1)C=C1,0.698970004336019 +O(c(ccc(c1)C=CC)c1)C,2.53655844257153 +COc1ccc(N)cc1,2.67577834167409 +O=C(O)c(c(N)ccc1)c1,3.43949059038968 +Clc2cccc(c2)c1ccccc1,0.602059991327962 +O=C(NC(C(=O)OC)Cc(cccc1)c1)C(N)CC(=O)O,2.16731733474818 +n1c2ccc(Cl)cc2ncc1Oc3ccc(OC(C)C(=O)OCC)cc3,0.568201724066995 +COC(=O)NS(=O)(=O)c1ccc(N)cc1,2.25527250510331 +S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O),-0.443697499232713 +CNC(=O)Oc1ccccc1OC(C)C,1.69897000433602 +CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n2cncn2,1.39794000867204 +O=S(O)(=O)C(=CC=C1)C=C1CN(CC)=C(C=C2)C=CC2=C(C(C=C3)=CC=C3N(C)C)C(C=C4)=CC=C4N(CC)CC(C=C5)=CC(=C5)S(=O)(=O)O,2.85733249643127 +c(c(cccc1)c1)(cccc2)c2,2.39794000867204 +BrC(Cl)Cl,2.11394335230684 +ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O),1.07918124604762 +O=C(Oc(c(c(ccc1)cc2)c1)c2)NC,1.19312459835446 +CC1=C(SCCO1)C(=O)Nc2ccccc2,1.47712125471966 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,-0.568636235841013 +O=C(O)CCl,1.47712125471966 +ClC(=CC=C1N)C=C1,0.778151250383644 +CC(C)OC(=O)C(O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2,0.954242509439325 +n1c(OC)nc(C)nc1NC(=O)NS(=O)(=O)c2ccccc2Cl,1.39794000867204 +OS(=O)(=O)C(C(=CC=C2)C1=C2)=CC=C1N=NC(C(O)=C3N=NC(C(C=C5)=C4C=C5)=CC=C4S(O)(=O)=O)=CC(=C3O)CO,2.8668778143375 +S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1,-0.0969100130080564 +CNP(=O)(OC)Oc1ccc(cc1Cl)C(C)(C)C,0.602059991327962 +C(C1C2C(C(O)C(O1)OC8C(OC(OC7C(OC(OC6C(OC(OC5C(C(C(OC4C(C(C(OC3C(C(C(O2)OC3CO)O)O)OC4CO)O)O)OC5CO)O)O)C(C6O)O)CO)C(C7O)O)CO)C(C8O)O)CO)O)O,3.20411998265593 +n1c(N)nc(N)nc1NC2CC2,1.17609125905568 +COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl,2.69897000433602 +O=C(O)C(Cl)(Cl)C,1.44978684698577 +Nc1cc(N)c(O)cc1,1.39794000867204 +FC(F)(Cl)Cl,2.17609125905568 +ClCCl,1.69897000433602 +O=P(OC)(OC)OC=C(Cl)Cl,0.361727836017593 +OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl,1.30102999566398 +ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl,-1.30102999566398 +CN(=C1C(C=C2)=CC=C2)N(C)C(=C1)C(C=C3)=CC=C3,2.09691001300806 +O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2,0.903089986991944 +CC1=C(C)S(=O)(=O)CCS1(=O)=O,1 +O=C(NC)CSP(OC)(OC)=S,-0.602059991327962 +COc1ccc(N)c(OC)c1,2.44090908206522 +COP(=O)OC,2 +CC(=C(N(=O)=O)C=C1N(=O)=O)C=C1,1.53147891704226 +CN(C)C(=O)C(c1ccccc1)c2ccccc2,1.47712125471966 +N(c(cccc1)c1)c(cccc2)c2,1.49136169383427 +C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3,-0.236572006437063 +CCOP(=S)(OCC)SCCSCC,-1 +NC(=S)NNC(N)=S,2.97634997900327 +O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1,0.778151250383644 +O=P(O)(O)CCCl,2.17609125905568 +O=C(OCC)C(O1)C1(c(cccc2)c2)C,2.24303804868629 +COC(=O)NC(=NC1=C2)NC1=CC(=C2)SC(C=C3)=CC=C3,1.17609125905568 +CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1,1.39794000867204 +c1cc(C(F)(F)F)cc(Cl)c1NC(C(C)C)C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,0.397940008672038 +S=P(OCC)(Sc1ccccc1)CC,0.198657086954423 +n1c(C)nc(OC)nc1NC(=O)NS(=O)(=O)c2ccsc2C(=O)OC,1.39794000867204 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,0.698970004336019 +O=N(=O)N(CN1N(=O)=O)CN(C1)N(=O)=O,0.176091259055681 +O=C(N=C(N(C1(=O))C)N(C)C)N1C(CCCC2)C2,1.69897000433602 +n(c(c(ccc1)cc2)c1O)c2,2.15533603746506 +c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2,1.60205999132796 +COc1cccc(OC)c1C(=O)Nc2onc(C(C)(CC)CC)c2,1.70500795933334 +n1c(OC)cc(OC)nc1NC(=O)NS(=O)(=O)Cc2ccccc2C(=O)OC,2.48995847942483 +CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC,1.69897000433602 +CN(C)(CCC1)CC1,2.17609125905568 +O=P(SCCCC)(SCCCC)SCCCC,0.0969100130080564 +COCC(=O)N(C(C)C(=O)OC)c1c(C)cccc1C,1.79588001734408 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,0.301029995663981 +CNC(=O)ON=C(C)SC,1 +COP(=S)(OC)Oc1ccc(cc1)N(=O)(=O),-0.602059991327962 +O=C1N(N)C(SC)=NN=C1C(C)(C)C,1.17609125905568 +COP(=O)(OC)OC(Br)C(Cl)(Cl)Br,0.301029995663981 +OC(C(N)C1O)C(C)OC1(C)OC(CC(C)(C(C2O)C(O)=O)OC(O)(C2)CC(O)CC(C)(O3)C3C=C4)C=CC=CC=CC=CCC(C)OC4=O,1.85733249643127 +O=N(=O)c(ccc(c1N)C)c1,0.903089986991944 +O=N(=O)c(c(N)ccc1N)c1,1.93951925261862 +O=C(O)C(=C(N)C=C1N(=O)=O)C=C1,3.07371835034612 +O=N(=O)c(c(c(ccc1)cc2)c1)c2,2.21748394421391 +c12c(N=Nc3ccccc3)c(O)ccc1cc(S(=O)(=O)O)cc2,2.25527250510331 +CC(C)Oc1cc(c(Cl)cc1Cl)N2N=C(OC2(=O))C(C)(C)C,0.698970004336019 +CNC(=O)ON=C(SC)C(=O)N(C)C,0.698970004336019 +CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O,0.544068044350276 +Oc(c(c(c(c1Cl)Cl)Cl)Cl)c1Cl,1 +NC(=N)NC(=N)NCCc1ccccc1,1.86332286012046 +COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O),1.30102999566398 +CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC,1.08990511143940 +ClC3C6(Cl)C4C2C1OC1C5C2C3(Cl)C(Cl)(C45)C6(Cl)Cl,-0.154901959985743 +O=C(OC(=O)c1cccc2)c12,3.07371835034612 +Nc1c(Cl)c(Cl)nc(C(=O)(O))c1Cl,1.77815125038364 +CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1,0.397940008672038 +Nc3ccc2cc1ccc(N)cc1nc2c3,1.67209785793572 +CCC(=O)Nc1ccc(Cl)c(Cl)c1,1.30102999566398 +Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2,1.39794000867204 +O=C(N)c(nccn1)c1,2.89707700320942 +Oc1cc(O)c2C(=O)C(O)=C(c3cc(O)c(O)cc3)Oc2c1,3.30835094858673 +CCC(O)(C)C#C,1.66275783168157 +CC(C(NCC)=C1)=CC(C1=O2)=C(C(C2=C3)=CC(C)=C3NCC)C(=CC=C4)C(=C4)C(=O)OCC,1.07918124604762 +O=C(NS(=O)(=O)c1cccc2)c12,3.55654370848351 +c1cc(Cl)ccc1C2SC(=O)N(C(=O)NC3CCCCC3)C2C,2.20411998265593 +n(c(nc(n1)NCC)NCC)c1Cl,0.698970004336019 +O=[S](NC1CCCCC1)(=O)[O-].[Na+],3.55654370848351 +O=C(OCC(C1OCC(C1O)O)O)CCCCCCCCCCC,3.83777776955373 +O(CC1O)C(C1O)C(O)COC(=O)CCCCCCCCCCCCCCCCC,3.85751341477669 +O=S(=O)(Nc(nc(cc1C)C)n1)c(ccc(N)c2)c2,1.51851393987789 +CCNc1nc(NC(C)(C)C)nc(SC)n1,1.17609125905568 +Oc(c(cc(c1)C(C)(C)C)Cl)c1,2.33445375115093 +C(C(Cl)Cl)(Cl)Cl,2.03342375548695 +COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl,2 +CCN(CC)C(=O)SCc1ccc(Cl)cc1,0.698970004336019 +COC(=O)NC(=S)Nc1ccccc1NC(=S)NC(=O)OC,1.50514997831991 +N(C(=S)SSC(N(C)C)=S)(C)C,1.17609125905568 +c12OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CCc1c(C)c(OC(=O)C)c(C)c2C,3.30102999566398 +Cc1cc(N)ccc1NOS(O)(=O)=O,2.26481782300954 +C(Br)(C(Br)(Br)Br)C1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,0.477121254719662 +O=C(O)COc(c(cc(c1Cl)Cl)Cl)c1,1 +FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O,1.60205999132796 +Cc1cc(C)c(N)cc1C,1.79934054945358 +CC(O)(C(O)C(O1)C)CC1(C)OC(C(C)O2)C(C(O)C2(C)OC(C(C)C(O)CC(=O)OC(CC)C3COC(C(OC)C4OC)OC(C)C4O)C(CC=O)CC(C)C(=O)C=CC(=C3)C)N(C)C,2.69897000433602 +c1c(Cl)cc(Cl)cc1N2C(=O)C(C)(C=C)OC2(=O),1.86272752831797 +O=C(OC(CCCC(O)CCCCCc1cc(O)cc2O)C)c12,-0.698970004336019 +COC(=O)C1(C2=CC=CC=C2C3=C1C=C(C=C3)Cl)O,2.17609125905568 +CC(C(=O)O)OC1=CC(=CC=C1)Cl,2 +P12P3P1P23,3.16790781000148 +C(CO)O,2.60205999132796 +CCCCOCC(C)OCC(C)O,2.10720996964787 +C(CO)O,3.30102999566398 +C(CO)O,2.96378782734556 +[O-][As](=O)([O-])[O-],0.795880017344075 +[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F,0.361727836017593 +N(C(=S)SSC(N(C)C)=S)(C)C,1.06069784035361 +COP(=O)(N)SC,-0.0457574905606751 +N(C(=S)SSC(N(C)C)=S)(C)C,0.737987326333431 +COP(=O)(NC(=O)(C))SC,1.54406804435028 +C1=CC=C(C=C1)NC(=O)NC2=CN=NS2,1.47712125471966 +CCOP(=S)(NC(C)C)OC1=CC=CC=C1C(=O)OC(C)C,-0.301029995663981 +CC(=NOC(=O)N(C)SN(C)C(=O)ON=C(C)SC)SC,1 +CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C,0.176091259055681 +NC(CCCC1)C1,1.76715586608218 +CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1,1.51188336097887 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,-0.301029995663981 +CCCCC(CC)COC(=O)C1=CC=CC=C1C(=O)OCC(CC)CCCC,2.30102999566398 +OC(=O)CNCP(O)(O)=O,3 +C1CNC(=S)N1,-0.638272163982407 +O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1,0.795880017344075 +C1=CC=C2C(=C1)NC(=S)S2,2.8750612633917 +CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl,1 +c(c(c(c(c1Cl)Cl)Cl)Cl)(c1Cl)Cl,-0.537602002101044 +COc1ccc(cc1)C(c2ccc(OC)cc2)C(Cl)(Cl)Cl,2.09691001300806 +C1=CC(=CC=C1Cl)Cl,2.47712125471966 +CC(C)OC(=O)NC1=CC(=CC=C1)Cl,2.69897000433602 +COP(=O)(OC)OC=C(Cl)Cl,0.332438459915605 +CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O,-0.376750709602100 +CNC(=O)N(C)c1nnc(s1)C(C)(C)C,1.60205999132796 +CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2,2.39794000867204 +CC(C(=O)O)OC1=C(C=C(C=C1)Cl)Cl,0.954242509439325 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,1.09691001300806 +C(#N)c(c(c(c(c1C(#N))Cl)Cl)Cl)c1Cl,0.602059991327962 +O=C(OCC)C(O)(c(ccc(c1)Cl)c1)c(ccc(c2)Cl)c2,1.26481782300954 +O=C(N(C)C)Nc(ccc(c1)Cl)c1,2.09691001300806 +O=C(N(SC(Cl)(Cl)Cl)C(=O)C1CC=CC2)C12,2 +CCc1cccc(C)c1N(C(C)COC)C(=O)CCl,2.17609125905568 +C1=CC(=C(C=C1Cl)Cl)OCC(=O)O,0.698970004336019 +CCNC1=NC(=NC(=N1)Cl)NC(C)(C)C#N,0.0969100130080564 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,0.662757831681574 +COP(=S)(OC)OC1=CC(=C(C=C1Cl)Cl)Cl,1.69897000433602 +C1C2C=CC1C3C2C4(C(=C(C3(C4(Cl)Cl)Cl)Cl)Cl)Cl,-2 +CC1(C(C1C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Cl)Cl)C,1.39794000867204 +CCN(CC)C(=O)C(C)OC1=CC=CC2=CC=CC=C21,2 +ClC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,-0.602059991327962 +CC(=CC(=O)NC)OP(=O)(OC)OC,-0.346787486224656 +CC(C)C1(C)N=C(NC1(=O))c3nc2ccccc2cc3C(=O)(O),1.30102999566398 +CC(C)Nc1nc(Cl)nc(NC(C)C)n1,1.69897000433602 +CC(C(=O)O)(Cl)Cl,1.69897000433602 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,0.8750612633917 +O=C(NC)CSP(OC)(OC)=S,0.698970004336019 +C12C3(C4(C5(C3(C(C1(C5(C2(C4(Cl)Cl)Cl)Cl)Cl)(Cl)Cl)Cl)Cl)Cl)Cl,-2 +COC(=O)C1=CC=CC=C1C(=O)OC,3.30102999566398 +CCOP(=S)(OCC)SCSC(C)(C)C,-1.30102999566398 +CCC(C)SP(=O)(OCC)SC(C)CC,-0.602059991327962 +CCOP(=S)(OCC)SCSC(C)(C)C,0.301029995663981 +C1C(C(C(=O)N1C2=CC=CC(=C2)C(F)(F)F)Cl)CCl,0.698970004336019 +O=C(O)C(C(C(=O)O)C(O1)CC2)C12,2.06069784035361 +O=C(Oc(c(OC(C1)(C)C)c1cc2)c2)NC,0.698970004336019 +Oc(c(c(c(c1)Cl)Cl)Cc(c(c(cc2Cl)Cl)Cl)c2O)c1Cl,0.698970004336019 +CC1(CON(C1=O)CC2=CC=CC=C2Cl)C,1.33243845991561 +CCC(C)N1C(=O)C(=C(NC1=O)C)Br,1.79588001734408 +CC1=CC(=CC(=C1N(C)C)C)OC(=O)NC,0.176091259055681 +CNC(=O)OC1=CC=CC(=C1)N=CN(C)C,1.09691001300806 +CC1=NN(C(=O)N1C(F)F)C2=CC(=C(C=C2Cl)Cl)NS(=O)(=O)C,1.82607480270083 +CCOP(=S)(CC)SC1=CC=CC=C1,0.698970004336019 +CCOP(=S)(OCC)SC(CCl)N1C(=O)C2=CC=CC=C2C1=O,0.397940008672038 +N1CC(C)(C)CNC1=NN=C(C=Cc2ccc(C(F)(F)F)cc2)C=Cc3ccc(C(F)(F)F)cc3,0.698970004336019 +CC1=C(C(=C(C(=C1F)F)COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)F)F,0.662757831681574 +CC1=CC(=C(C=C1)N=CN(C)C=NC2=C(C=C(C=C2)C)C)C,1.00860017176192 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,-0.0969100130080564 +CC(C)N(C(C)C)C(=O)SCC(Cl)=C(Cl)Cl,1.09691001300806 +S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O),0.352182518111362 +CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2CCC(F)(F)F,1.90254677931399 +O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12,1.60205999132796 +CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1,1.13987908640124 +O=C(ON=CC(SC)(C)C)NC,-1 +ClC(Cl)(Cl)CC1(OC1)c2cc(Cl)cc(Cl)c2,1.47712125471966 +CCC1CCCC(C(C(=O)C2CC3C(C2CC(=O)O1)CCC4C3CC(C4)OC5CC(C(C(C5OC)OC)OC)C)C)OC6CCC(C(O6)C)N(C)C,1.38021124171161 +CC(C)(C)C(=NOC(=O)NC)CSC,0.778151250383644 +CON=C(CC1=CN=CC=C1)C2=C(C=C(C=C2)Cl)Cl,1.65321251377534 +CC(=CC1C(C1(C)C)C(=O)OCN2C(=O)C3=C(C2=O)CCCC3)C,2.39794000867204 +C1COC(O1)(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl,1 +CCCOC(=O)C1=CN=C(C=C1)C(=O)OCCC,2.39794000867204 +CC1=CC(=NC(=N1)NC(=O)NS(=O)(=O)C2=CC=CC=C2C(=O)OC3COC3)C,1.91907809237607 +C1=C(C(=NC(=C1Cl)Cl)OCC(=O)O)Cl,1.55630250076729 +CCOCN1C(=C(C(=C1C(F)(F)F)Br)C#N)C2=CC=C(C=C2)Cl,1.13353890837022 +CC(C)CC1=C(C(=NC(=C1C(=O)SC)C(F)(F)F)C(F)F)C(=O)SC,0.559906625036112 +CC12CC1(C(=O)N(C2=O)C3=CC(=CC(=C3)Cl)Cl)C,1.17609125905568 +CC1=CC(=C(C=C1)C(=O)OC)C2=NC(C(=O)N2)(C)C(C)C,1.69897000433602 +COP(=S)(OC)OC1=NC(=C(C=C1Cl)Cl)Cl,0.477121254719662 +CC(C)CC1=C(C(=NC(=C1C(=O)OC)C(F)F)C(F)(F)F)C2=NCCS2,1.64542226934909 +CCOC(=O)C(CC1=CC(=C(C=C1Cl)F)N2C(=O)N(C(=N2)C)C(F)F)Cl,1.07918124604762 +CC(C)=CC3C(C(=O)OCc2coc(Cc1ccccc1)c2)C3(C)C,2.09691001300806 +CCCSP(=S)(OCC)OC1=CC=C(C=C1)SC,1.06069784035361 +CC1=CC(=C(C(=C1)OC(=O)NC)C)C,1.77232170672292 +CC1=CC=CC=C1COC2CC3(CCC2(O3)C)C(C)C,2.17609125905568 +CC1=C2C(=CC=C1)SC3=NN=CN23,1.49136169383427 +CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl,2 +CCCN(CCC)C(=O)SCC,0.954242509439325 +CC(C)OC(=O)C=C(C)C=CCC(C)CCCC(C)(C)OC,1.66275783168157 +COP(=S)(OC)Oc1ccc(SC)c(C)c1,0.574031267727719 +COC1=C(C=C(C=C1)C(=CC(=O)N2CCOCC2)C3=CC=C(C=C3)Cl)OC,1.66558099101795 +CCSC(=O)N(CC(C)C)CC(C)C,2 +CC(C)OP(=S)(OC(C)C)SCCNS(=O)(=O)C1=CC=CC=C1,1.17609125905568 +CC(=CC1C(C1(C)C)C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C,2.17609125905568 +CC1=CC(=CC(=C1C)C)OC(=O)NC,1 +CCOP(=S)(OCC)SCSC1=CC=C(C=C1)Cl,0 +C1CN(CCN1C(C(Cl)(Cl)Cl)NC=O)C(C(Cl)(Cl)Cl)NC=O,2 +C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3,0.301029995663981 +C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-],2.09691001300806 +CCCC(=NOCC)C1C(=O)CC(CC1=O)CC(C)SCC,1.21906033244886 +ClC2(Cl)C4(Cl)C1(Cl)C5(Cl)C(Cl)(Cl)C3(Cl)C1(Cl)C2(Cl)C3(Cl)C45Cl,-0.154901959985743 +CCN(C1CCCCC1)C(=O)SCC,0.477121254719662 +CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2OCCCl,2.34399906905716 +C(C(=O)O)OC1=NC(=C(C(=C1Cl)N)Cl)F,2.69897000433602 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC#C,1.97772360528885 +C1C(COC1(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl)Br,0.811575005870593 +C1=NNC(=N1)N,0.397940008672038 +C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F,1.41497334797082 +C1=CC(=CC=C1OS(=O)(=O)C2=CC=C(C=C2)Cl)Cl,0.397940008672038 +FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O,3 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C,1.8750612633917 +C1=CC(=C(C(=C1)Cl)C#N)Cl,0.397940008672038 +C1C(O1)COC2=CC=CC=C2C3=CC=CC=C3,2.69897000433602 +CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC,2.57403126772772 +O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N,1.56655533088306 +C1=CC(=C(C2=NC=C(C=C21)Cl)C(=O)O)Cl,2.87909587950007 +CC(C)NC(=O)N1CC(=O)N(C1=O)C2=CC(=CC(=C2)Cl)Cl,1.66275783168157 +CCCN(CCCl)C1=C(C=C(C=C1[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-],2.30621050816776 +C1=CC=C(C=C1)C2=CC=CC=C2O,3 +O=C(N(C)C)Nc(cccc1C(F)(F)F)c1,1.17609125905568 +C1=CC(=NC(=C1)Cl)C(Cl)(Cl)Cl,0 +Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2,0.8750612633917 +CC1=CC(=C(C=C1NC(=O)C)NS(=O)(=O)C(F)(F)F)C,1.44090908206522 +C(=C(I)I)(I)I,1.69897000433602 +C1=C(C=C(C(=C1Cl)N2C(=C(C(=N2)C#N)S(=O)C(F)(F)F)N)Cl)C(F)(F)F,-1.22184874961636 +O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1,0.795880017344075 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C,1.38916608436453 +CC1=CC2=C(C=C1)N=C3C(=N2)SC(=O)S3,0.8750612633917 +CC(C)N(C(=O)CCl)c1ccccc1,1.36172783601759 +CC(C)C1(C(=O)NC(=N1)C2=C(C=CC=N2)C(=O)O)C,2.69897000433602 +CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C,1.28891960566173 +CN1CN(C(=S)SC1)C,1.47712125471966 +ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,1.8750612633917 +ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl,-0.698970004336019 +CCOC(=O)CN1C2=C(C=CC=C2Cl)SC1=O,1.09691001300806 +CCCN(CCC)C1=C(C=C(C(=C1[N+](=O)[O-])N)C(F)(F)F)[N+](=O)[O-],1.46834733041216 +C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N,1.60205999132796 +CC(C)(C)C(CCC1=CC=C(C=C1)Cl)(CN2C=NC=N2)O,1.20139712432045 +CC1=C(C=CC=C1COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)C3=CC=CC=C3,0.698970004336019 +C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3,1.60205999132796 +C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-],2.17609125905568 +CC1=C(C=C(C=C1C(=O)N)[N+](=O)[O-])[N+](=O)[O-],0.795880017344075 +CC(C)OC1=CC=CC(=C1)NC(=O)C2=CC=CC=C2C(F)(F)F,2.69897000433602 +OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl,0.397940008672038 +O=P(O)(O)CCCl,2.64933485871214 +CN(C(=O)NC1=CC=C(C=C1)Br)OC,1.09691001300806 +CC1=CC(=CC=C1)NC(=O)OC2=CC=CC(=C2)NC(=O)OC,1.39794000867204 +CC(C)(C)C1=NN=C(S1)N2C(CN(C2=O)C)O,1.69897000433602 +S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1,0.230448921378274 +COC(=O)c1ccccc1S(=O)(=O)NC(=O)N(C)c2nc(OC)nc(C)n2,1.09691001300806 +C1=CC=C(C(=C1)NC2=NC(=NC(=N2)Cl)Cl)Cl,0.0606978403536116 +CC1=C(C=CC(=C1)OP(=S)(OC)OC)[N+](=O)[O-],-0.337242168318426 +COc1c(Cl)ccc(Cl)c1C(=O)(O),2.06069784035361 +CC1(C(C1C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Br)Br)C,0.397940008672038 +C1=CC=C(C(=C1)C(C2=CC=C(C=C2)F)(C3=CN=CN=C3)O)Cl,0.397940008672038 +c1ccc2nc(NC(=O)OC)n(C(=O)NCCCC)c2c1,2.06069784035361 +CCOC(=O)COC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],1.39794000867204 +CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)C3=CC=CC=C3)O,1.39794000867204 +CCNC(=O)NC(=O)C(=NOC)C#N,1.48144262850231 +CCOC1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],1.60205999132796 +CC1=NC=C(N1CCO)[N+](=O)[O-],2.17609125905568 +O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12,2.69897000433602 +CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2,2 +CCCCC(CN1C=NC=N1)(C2=C(C=C(C=C2)Cl)Cl)O,0.672097857935718 +CC(C)(C)C(C(=CC1=C(C=C(C=C1)Cl)Cl)N2C=NC=N2)O,1.69897000433602 +C1=CC(C2C1C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl)Cl,-0.42021640338319 +C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N,1 +CC1=NN(C(=C1C=NOCC2=CC=C(C=C2)C(=O)OC(C)(C)C)OC3=CC=CC=C3)C,0.488550716500444 +CS(=O)(=O)C1=C(C=CC(=C1)C(F)(F)F)C(=O)C2=C(ON=C2)C3CC3,1.30102999566398 +CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C,1.09691001300806 +CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC,0.176091259055681 +C1=CC(=CC=C1C(CN)O)O,2.39794000867204 +CC1=C(C(=CC=C1)C)N(C(=O)COC)N2CCOC2=O,1.69897000433602 +c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2,1.27300127206374 +CCC(C)NC1=C(C=C(C=C1[N+](=O)[O-])C(C)(C)C)[N+](=O)[O-],1.69897000433602 +C1=CC(=CC=C1S(=O)(=O)C2=CC(=C(C=C2Cl)Cl)Cl)Cl,2.36172783601759 +CCCCC1=C(NC(=NC1=O)NCC)C,1.39794000867204 +n(c(nc(n1)NCC)NCC)c1Cl,0.724275869600789 +FC(F)(F)C(C=C1N(=O)=O)=CC(N(=O)=O)=C1N(CC)CC(C)=C,1.09691001300806 +C1CCC(C1)N(CC2=CC=C(C=C2)Cl)C(=O)NC3=CC=CC=C3,1.39794000867204 +CS(=O)(=O)NC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],1.69897000433602 +CCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC3=C(O2)C=C(C=C3)Cl,0.954242509439325 +CCC1=C(C(=CC=C1)CC)N(CNC(=O)C)C(=O)CCl,1.79588001734408 +NC(=N)NCCCCCCCCCCCC(OC(=O)C),1.46239799789896 +C1=CC(=CC(=C1)Cl)NC(=O)OCC#CCCl,2.65321251377534 +CC(C)C(C(=O)OC(C(#N))c2cccc(Oc1ccccc1)c2)c3ccc(Cl)cc3,1.39794000867204 +CC(C)C1=C(C=CC(=C1)C(C)(C)C2=CC(=C(C=C2)O)C(C)C)O,1.39794000867204 +CCN(CC1=C(C=CC=C1Cl)F)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-],1.69897000433602 +CCCCCCCCSC(=O)OC1=CC(=NN=C1C2=CC=CC=C2)Cl,1.82930377283102 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C,1.13987908640124 +CCCCNC(=O)N1C2=CC=CC=C2N=C1NC(=O)OC,2.39794000867204 +CC1=C(C(=CC=C1)C)N(C(C)C(=O)OC)C(=O)CC2=CC=CC=C2,1.66275783168157 +CC(C)C(C1=CC=C(C=C1)OC(F)F)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3,0.778151250383644 +Clc1ccccc1c2nnc(c3ccccc3Cl)nn2,1.30102999566398 +CCOC(=O)NCCOC1=CC=C(C=C1)OC2=CC=CC=C2,1 +CCC1=C(C(=CC=C1)CC)N(CC(=O)OCC)C(=O)CCl,1.69897000433602 +c1(O2)c(CC2(C)C)cccc1OC(=O)N(C)SN(CCCC)CCCC,1.39794000867204 +CCCCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC=C(C=C2)C(F)(F)F,0.477121254719662 +COC1=CC(=C(C=C1Cl)OC)Cl,2.09691001300806 +CCOP(=S)(OCC)OC1=NN(C(=N1)Cl)C(C)C,1.09691001300806 +n(c(nc(n1)NC(C)C)NCC)c1Cl,1.39794000867204 +CC(C)(C)C(C(=CC1=CC=C(C=C1)Cl)N2C=NC=N2)O,1.59560643486560 +CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O),1.69897000433602 +c1cc(OC(F)(F)F)ccc1C(O)(C(C)C)c2cncnc2,1.08278537031645 +COP(=O)(C(C(Cl)(Cl)Cl)O)OC,1.30102999566398 +C1=CC(=C(C=C1C(F)(F)F)Cl)OC2=CC(=C(C=C2)[N+](=O)[O-])C(=O)O,2.09691001300806 +CCCN(CC1CC1)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-],0.698970004336019 +CCOC(=O)C(C)OC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],1.69897000433602 +CCSC(=O)N1CCCCCC1,1.17055505852121 +CCC1=CC=C(C=C1)C(=O)NN(C(=O)C2=CC(=CC(=C2)C)C)C(C)(C)C,1.68124123737559 +ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O),1.17609125905568 +COC(=O)C1=CC=CC=C1S(=O)(=O)NC(=O)NC2=NC(=CC(=N2)OC(F)F)OC(F)F,2.14612803567824 +CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O,1.39794000867204 +CC1=C(C=CC(=C1)Cl)OCC(=O)O,0.602059991327962 +COC=C(C1=CC=CC=C1OC2=NC=NC(=C2)OC3=CC=CC=C3C#N)C(=O)OC,1.79413935576777 +C1=CC=C(C(=C1)C(C2=CC=C(C=C2)Cl)(C3=CN=CN=C3)O)Cl,0.361727836017593 +[O-]Br(=O)=O,0.785329835010767 +OP(=O)OCC,2.60205999132796 +COP(N)(=O)SC,-1 +CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1,0.176091259055681 +CCOP(=S)(OCC)SCCSCC,-1.39794000867204 +CCOP(=S)(OCC)SCSP(=S)(OCC)OCC,0.301029995663981 +O=C(OCC(CCCC)CC)CCCCC(=O)OCC(CCCC)CC,3.17609125905568 +CN(C=Nc1ccc(C)cc1C)C=Nc2ccc(C)cc2C,1 +[C@@]14([C@@H]5OCC1=CC=C[C@@H]([C@H](O[C@H]2C[C@@H]([C@H]([C@@H](O2)C)O[C@H]3C[C@@H]([C@H]([C@@H](O3)C)O)OC)OC)C(=CC[C@@H]6C[C@H](OC([C@@H]4C=C([C@H]5O)C)=O)C[C@]7(O6)O[C@@H]([C@H](C=C7)C)[C@H](CC)C)C)C)O,0.301029995663981 +O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12,1.54406804435028 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,0.0969100130080564 +C(#N)Cl,1.84509804001426 +C(#N)Br,2.08635983067475 +C1=CC(=CC=C1C(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl)Cl,-0.602059991327962 +c(cccc1)(c1)C(C)C,2.51982799377572 +CCCN(CCC)C(=O)SCC,1.39794000867204 +NC(CCCC1)C1,1.77815125038364 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,0.778151250383644 +CC(C)OC(=O)NC1=CC(=CC=C1)Cl,3 +COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl,1 +COC(=O)C1=CC=C(C=C1)C(=O)OC,2.09691001300806 +N(C(=S)NC1)C1,-0.602059991327962 +O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1,0.397940008672038 +c(cccc1)(c1)C=C,2.45484486000851 +COC(=O)c1ccccc1S(=O)(=O)NC(=O)Nc2nc(OC)nc(C)n2,2.39794000867204 +C1=CC(=CC=C1N)Cl,1.09691001300806 +FC(F)(F)C(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cc(Oc3ccccc3)ccc2,1.09691001300806 +C(Cl)(Br)Br,1.45484486000851 +C=C(Cl)Cl,1.14612803567824 +C(C=CCl)Cl,0.707570176097936 +COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl,1.69897000433602 +Oc(ccc(c1)C(c(ccc(O)c2)c2)(C)C)c1,1.69897000433602 +O=C(OCc(cccc1)c1)c(c(ccc2)C(=O)OCCCC)c2,2.67209785793572 +O=C(NCCCC1)C1,2.09691001300806 +c(cccc1)(c1)Cl,2.07918124604762 +C(Cl)(Cl)Cl,1.77815125038364 +ClCCl,1.72082058177034 +C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl,-0.903089986991944 +OCCO,3 +O=C(C=C(CC1(C)C)C)C1,2.25285303097989 +C(F)(Cl)(Cl)Cl,2.54282542695918 +CCc1cccc(CC)c1N(COC)C(=O)CCl,1.14612803567824 +c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2,0.698970004336019 +n1c(Cl)cc(OC)nc1NC(=O)NS(=O)(=O)c2ccccc2C(=O)OCC,2.09691001300806 +O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2,0.89209460269048 +c(cccc1)(c1)CC,2.46389298898591 +O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12,1.60205999132796 +Clc1cc(C(F)(F)F)cnc1Oc2ccc(OC(C)C(=O)OC)cc2,0 +C#N,1.49136169383427 +ClC(C(OC(C=C2C(=O)OC(C)C(=O)OCC)=CC=C2N(=O)=O)=C1)=CC=C1C(F)(F)F,1.69897000433602 +c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2,1.70969386972779 +O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N,1.65321251377534 +CN(=CC=C1C(C=C2)=CC=N2C)C=C1,0.574031267727719 +C1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-],1.12417805547468 +C(=C)Cl,0.113943352306837 +C1CCC(=O)CC1,2.95904139232109 +CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C,1.39794000867204 +C1=CC(=O)NNC1(=O),2.69897000433602 +CCSC(=O)N1CCCCCC1,0.301029995663981 +C(C(Cl)(Cl)Cl)(O)O,2.13033376849501 +ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl,-1.60205999132796 +Clc1cc(C(F)(F)F)ccc1Oc2cc(OCC)c(N(=O)(=O))cc2,1 +c1cc(Cl)ccc1C(C(#N))(CCCC)Cn2ncnc2,0.992995098431341 +CC1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-],0.301029995663981 +CC(C)OC(=O)C(C1=CC=C(C=C1)Br)(C2=CC=C(C=C2)Br)O,1.41497334797082 +C[N+](C)(C)CCCl,2.11394335230684 +CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl,1.93449845124357 +CC1=NC(=NC(=C1)C2CC2)NC3=CC=CC=C3,1.55144999797288 +N(c(cccc1)c1)c(cccc2)c2,1.39794000867204 +CC1(C(=O)N(C(=O)O1)NC2=CC=CC=C2)C3=CC=C(C=C3)OC4=CC=CC=C4,1.22530928172586 +CC1(CCCCC1)C(=O)NC2=C(C(=C(C=C2)O)Cl)Cl,2.46538285144842 +C1=CC(=C2C(=C1)OC(O2)(F)F)C3=CNC=C3C#N,2.04139268515822 +C(F)(F)(F)c1ccccc1C(=O)Nc2cccc(OC(C)C)c2,1.93951925261862 +C(CCCCN=C(N)N)CCCNCCCCCCCCN=C(N)N,1.27875360095283 +C1CN(C(=N1)N[N+](=O)[O-])CC2=CN=C(C=C2)Cl,1.23044892137827 +COC(=O)C12CC3=C(C1=NN(CO2)C(=O)N(C4=CC=C(C=C4)OC(F)(F)F)C(=O)OC)C=CC(=C3)Cl,0.556302500767287 +CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC,2.56820172406699 +CC1=CC(=CC(=C1)C(=O)N(C(C)(C)C)NC(=O)C2=C(C(=CC=C2)OC)C)C,2.61384182187607 +C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C=C2)OC(C(OC(F)(F)F)F)(F)F)Cl)F,1.55630250076729 +CC1=CC=C(C=C1)N(SC(F)(Cl)Cl)S(=O)(=O)N(C)C,1.25527250510331 +CC(C)(C)C1=C(C=CC(=C1)O)O,2.35218251811136 +CC(=NOCC1=CC=CC=C1C(=NOC)C(=O)OC)C2=CC(=CC=C2)C(F)(F)F,1.77815125038364 +COC(=O)N(C1=CC=CC=C1COC2=NN(C=C2)C3=CC=C(C=C3)Cl)OC,0.954242509439325 +CC(C)N1C(=NC(C)(C)C)SCN(C1=O)C2=CC=CC=C2,0.939519252618618 +C1=CC=C(C(=C1)C2=NN=C(N=N2)C3=CC=CC=C3Cl)Cl,1.23804610312880 +CCCC(=C1C(=O)CC(CC1=O)C2CCCSC2)NOCC,1.44715803134222 +C1CC1NC2=NC(=C(C(=N2)N)C#N)N,1.34242268082221 +C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3,-0.244125144327509 +C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N,0.778151250383644 +CCOC1=CC2=C(C=C1)NC(C=C2C)(C)C,1.07918124604762 +C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N,1.47712125471966 +CC1CN(CC(O1)C)CC(C)CC2=CC=C(C=C2)C(C)(C)C,0.230448921378274 +C[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F,0.301029995663981 +c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2,1.17609125905568 +CN(=CC=C1C(C=C2)=CC=N2C)C=C1,0.406540180433955 +CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2,2 +Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2,1.98227123303957 +C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3,1.47712125471966 +CCOC1=CC=C(C=C1)C(C)(C)COCC2=CC(=CC=C2)OC3=CC=CC=C3,1.41497334797082 +CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2,1.27875360095283 +CC(COC1=CC=C(C=C1)OC2=CC=CC=C2)OC3=CC=CC=N3,2.14612803567824 +CC(C)(C)C(=O)C(N1C=NC=N1)OC2=CC=C(C=C2)Cl,2.05690485133647 +CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O,2.02118929906994 +c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2,0.903089986991944 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,0.778151250383644 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,1.07918124604762 +ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,1.69897000433602 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,-0.602059991327962 +ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl,-1 +C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl,-0.602059991327962 +C1(C(C(C(C(C1Cl)Cl)Cl)Cl)Cl)Cl,0.672097857935718 +CCC(=O)Nc1ccc(Cl)c(Cl)c1,1.88081359228079 +C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-],2.14612803567824 +C1C2C(COS(=O)O1)C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl,0.462397997898956 +O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12,1.69897000433602 +CC(C(=O)O)OC1=CC=C(C=C1)OC2=C(C=C(C=N2)C(F)(F)F)Cl,-1 +CCCCC(CN1C=NC=N1)(C#N)C2=CC=C(C=C2)Cl,0.991226075692495 +Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2,0.707570176097936 +COP(=O)(NC(=O)(C))SC,0.397940008672038 +CCOP(=O)(OCC)OC(=CCl)C1=C(C=C(C=C1)Cl)Cl,0.176091259055681 +CCOP(=S)(OCC)SCCSCC,-0.657577319177794 +O=P(O)(O)CCCl,1.07918124604762 +CCCSP(=O)(OCC)SCCC,0.431363764158987 +CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1,0.230448921378274 +COP(=S)(OC)Oc1ccc(SC)c(C)c1,-0.142667503568732 +OC(=O)C(N)CCP(C)(=O)O,0.544068044350276 +OC(=O)CNCP(O)(O)=O,2.47712125471966 +CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC,2.55630250076729 +COP(N)(=O)SC,-0.537602002101044 +CC(=CC(=O)OC)OP(=O)(OC)OC,-0.455931955649724 +CCOP(=S)(OCC)SCSCC,-0.795880017344075 +CCOP(=S)(OCC)SCSC(C)(C)C,-1.22184874961636 +S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O),0.41161970596323 +CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl,0 +CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C,0.763427993562937 +CCC1=NC(=CC(=N1)OP(=S)(OC)OC)OCC,-0.346787486224656 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,0.204119982655925 +CCOP(=S)(OCC)SCN1C2=C(C=C(C=C2)Cl)OC1=O,0.301029995663981 +COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O),0.954242509439325 +CCOC(=O)C1=CN2C(=CC(=N2)OP(=S)(OCC)OCC)N=C1C,0.602059991327962 +CCOP(=S)(OCC)OC1=NN(C=N1)C2=CC=CC=C2,0.113943352306837 +O=C(Oc(c(c(ccc1)cc2)c1)c2)NC,1.77815125038364 +CC1=CC(=CC(=C1SC)C)OC(=O)NC,0.968482948553935 +CNC(=O)ON=C(C)SC,1.30102999566398 +CCCOC(=O)NCCCN(C)C,2.83250891270624 +COC(=O)NC1=NC2=CC=CC=C2N1,1.8750612633917 +CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C,1.08990511143940 +CNC(=O)CCSCCSP(=O)(OC)OC,-0.267606240177031 +N(C(=S)SSC(N(C)C)=S)(C)C,1.07918124604762 +C1=NNC(=N1)N,0.698970004336019 +CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O),1.80617997398389 +C1=CC=C(C=C1)[Sn](C2=CC=CC=C2)C3=CC=CC=C3,-0.522878745280338 +O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2,0.845098040014257 +N(C(=S)NC1)C1,0.0969100130080564 +C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F,1.39794000867204 +CCCSC1=CC2=C(C=C1)N=C(N2)NC(=O)OC,1.30102999566398 +C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3,2.06069784035361 +CC1(C2C(C3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C(C=CC(=C41)Cl)O)O)O)N(C)C)O)O,3.7160033436348 +CC1=CC(=C(C=C1NC(=O)C2=CC(=CC(=C2O)I)I)Cl)C(C#N)C3=CC=C(C=C3)Cl,1 +CN1CC2CC1CN2C3=C(C=C4C(=C3)N(C=C(C4=O)C(=O)O)C5CC5)F,1.69897000433602 +C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl,1.17609125905568 +CC1=NC=C(N1C)[N+](=O)[O-],1.17609125905568 +CCN1CCN(CC1)C2=C(C=C3C(=C2)N(C=C(C3=O)C(=O)O)C4CC4)F,1.41497334797082 +CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O,0 +COCC(=O)NC1=C(C=CC(=C1)SC2=CC=CC=C2)NC(=NC(=O)OC)NC(=O)OC,1.60205999132796 +CC1CCC2=C3N1C=C(C(=O)C3=CC(=C2)F)C(=O)O,2.60205999132796 +COC(=O)NC1=NC2=C(N1)C=C(C=C2)S(=O)C3=CC=CC=C3,0.301029995663981 +CC1(C2CC3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C1C=CC=C4O)O)O)N(C)C)O,2.17609125905568 +C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3,1.47712125471966 +CC(C)NCC(COC1=CC=CC2=C1C3=CC=CC=C3N2)O,0.845098040014257 +C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl,1.36172783601759 +CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O,0.397940008672038 +COP(=S)(OC)Oc1ccc(SC)c(C)c1,-0.346787486224656 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,0.903089986991944 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,0.602059991327962 +CC(N(C)C)CN(C(=CC=C3)C1=C3)C(=CC=C2)C(=C2)S1,1.22010808804006 +C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-],2.38021124171161 +c(cccc1)(c1)C=C,2.60205999132796 diff --git a/test/data/LOAEL_log_mmol_corrected_smiles.csv b/test/data/LOAEL_log_mmol_corrected_smiles.csv index 237830e..6b85e0f 100644 --- a/test/data/LOAEL_log_mmol_corrected_smiles.csv +++ b/test/data/LOAEL_log_mmol_corrected_smiles.csv @@ -1,568 +1,568 @@ SMILES,LOAEL_log_mmol_kg_bw_day -'C1=C(C(=CC(=C1NN=C3C2=C(C=C([S]([O-])(=O)=O)C=C2)C=CC3=O)OC)[S]([O-])(=O)=O)C.[Na+].[Na+]',2.12309380508316 -'O1C(=O)C(O)=C(O)C1C(O)CO',1.76137662853832 -'C1(C)=C(C=CC(C)=CC=CC(C)=CC=CC=C(C)C=CC=C(C)C(=O)OC)C(C)(C)CCC1',2.95101092705237 -'c(cccc1)(c1)C(C)C',2.41523206875268 -'O=C(OCCCC)c(c(ccc1)C(=O)OCCCC)c1',2.66642980233607 -'O=C(OCC)c(c(ccc1)C(=O)OCC)c1',1.69992305435084 -'O=C(OC(OC(OC1C)C)C1)C',3.14412407646651 -'Oc(c(ccc1)C)c1C',4.30879341594785 -'Oc(ccc(c1C)C)c1',3.94081663065326 -'O=C(OCC)C=C',2.60605102798022 -'c(cccc1)(c1)CC',2.41532120099855 -'OCCO',2.39492662325430 -'c(ccc1C(=O)OCC(=O)OCC)cc1C(=O)OCC',2.04964162538818 -'O=C',2.56368333860036 -'O=C(O)C=CC(=O)O',2.03090237239810 -'OCC(O)CO',1.12645271808123 -'O=C(OC)c(ccc(O)c1)c1',2.00617304782278 -'O=C(OCCC)c(ccc(O)c1)c1',2.07966468441907 -'CC(CCC(=O)(O))C3CCC4C2CCC1CC(O)CCC1(C)C2CCC34C',2.87687871256153 -'OC(C(CCC1C)C(C)C)C1',2.42080757876423 -'O=C(O)C(=C)C',2.54049719303574 -'O=C(OC)c(c(O)ccc1)c1',2.62596180611118 -'Oc(cccc1)c1',2.43708305310291 -'O=C(OCCC)c(cc(O)c(O)c1O)c1',2.3902301635117 -'OCC(O)C1C(O)=C(O)C(=O)O1',2.05436782171583 -'c(cccc1)(c1)C=C',3.69543631002744 -'O=Cc(occ1)c1',3.20450009536782 -'NCCNc1cccc2ccccc12',3.37247609215110 -'CN(C)(C)CCCl',2.64921593816204 -'O=C(Nc(ccc(c1)C(=O)CCl)c1)C',2.12695072080225 -'c(ccc(c1)Cl)(c1)C(c(ccc(c2)Cl)c2)C(Cl)(Cl)Cl',4.04444942813338 -'CC(Oc1cc(Cl)c(Cl)cc1Cl)C(=O)(O)',4.491054148917 -'O=N(=O)C(=CC=C1OC)C=C1N=NC(C(O)=C2C(=O)NC(=CC=C4)C=C4N(=O)=O)=C(C=C3)C(=C2)C=C3',2.36568501290040 -'O=N(=O)C(C=C1)=CC(OCCO)=C1NCCO',3.02438986505162 -'Cc1cccc(CC)c1N(C(=O)CCl)COCC',3.73201897895503 -'C1=C(C(=CC=C1OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-])C(=O)[O-].[Na+]',3.32865137721601 -'CCc1cccc(CC)c1N(COC)C(=O)CCl',4.25489772423536 -'O=C(Nc(ccc(OCC)c1N)c1)C',2.21459876477238 -'Oc(ccc(N)c1)c1',2.20160364320713 -'CC(N)CC(=CC=C1)C=C1',4.43202666692597 -'O(c(ccc(c1)C=CC)c1)C',2.63429468422019 -'COc1ccc(N)cc1',2.41466474972438 -'O=C(O)c(c(N)ccc1)c1',1.69766082403086 -'Clc2cccc(c2)c1ccccc1',4.67360340221543 -'O=C(NC(C(=O)OC)Cc(cccc1)c1)C(N)CC(=O)O',3.30147753146833 -'n1c2ccc(Cl)cc2ncc1Oc3ccc(OC(C)C(=O)OCC)cc3',5.00327683569969 -'COC(=O)NS(=O)(=O)c1ccc(N)cc1',3.10691015775373 -'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',5.94520088604013 -'CNC(=O)Oc1ccccc1OC(C)C',3.62167823549204 -'CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n2cncn2',4.07003600375764 -'O=S(O)(=O)C(=CC=C1)C=C1CN(CC)=C(C=C2)C=CC2=C(C(C=C3)=CC=C3N(C)C)C(C=C4)=CC=C4N(CC)CC(C=C5)=CC(=C5)S(=O)(=O)O',2.99569446127058 -'c(c(cccc1)c1)(cccc2)c2',2.79016633269067 -'BrC(Cl)Cl',3.10044647372987 -'ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O)',4.46372003271591 -'O=C(Oc(c(c(ccc1)cc2)c1)c2)NC',4.11054922260167 -'CC1=C(SCCO1)C(=O)Nc2ccccc2',3.89450458533419 -'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',6.18118555259066 -'O=C(O)CCl',3.49829685836143 -'ClC(=CC=C1N)C=C1',4.32760254782945 -'CC(C)OC(=O)C(O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2',4.57623015760927 -'n1c(OC)nc(C)nc1NC(=O)NS(=O)(=O)c2ccccc2Cl',4.15566728690676 -'OS(=O)(=O)C(C(=CC=C2)C1=C2)=CC=C1N=NC(C(O)=C3N=NC(C(C=C5)=C4C=C5)=CC=C4S(O)(=O)=O)=CC(=C3O)CO',2.91745349144784 -'S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1',5.65653611167129 -'CNP(=O)(OC)Oc1ccc(cc1Cl)C(C)(C)C',4.86289269710557 -'C(C1C2C(C(O)C(O1)OC8C(OC(OC7C(OC(OC6C(OC(OC5C(C(C(OC4C(C(C(OC3C(C(C(O2)OC3CO)O)O)OC4CO)O)O)OC5CO)O)O)C(C6O)O)CO)C(C7O)O)CO)C(C8O)O)CO)O)O',2.85087205247326 -'n1c(N)nc(N)nc1NC2CC2',4.04449742637606 -'COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl',2.82212129862366 -'O=C(O)C(Cl)(Cl)C',3.70545399970477 -'Nc1cc(N)c(O)cc1',3.69597355155454 -'FC(F)(Cl)Cl',2.90638355650622 -'ClCCl',3.23010431252803 -'O=P(OC)(OC)OC=C(Cl)Cl',4.98261676287965 -'OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl',4.26774140719551 -'ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl',6.88185159467056 -'CN(=C1C(C=C2)=CC=C2)N(C)C(=C1)C(C=C3)=CC=C3',3.2998650117386 -'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',4.58922787551359 -'CC1=C(C)S(=O)(=O)CCS1(=O)=O',4.32277979319225 -'O=C(NC)CSP(OC)(OC)=S',5.96238343177818 -'COc1ccc(N)c(OC)c1',2.74428856020296 -'COP(=O)OC',3.04158586769746 -'CC(=C(N(=O)=O)C=C1N(=O)=O)C=C1',3.72891101170516 -'CN(C)C(=O)C(c1ccccc1)c2ccccc2',3.90184372972497 -'N(c(cccc1)c1)c(cccc2)c2',3.73709625897028 -'C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3',5.50194904825203 -'CCOP(=S)(OCC)SCCSCC',6.43839047104826 -'NC(=S)NNC(N)=S',2.20039466208170 -'O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1',4.58938077582749 -'O=P(O)(O)CCCl',2.98375855767924 -'O=C(OCC)C(O1)C1(c(cccc2)c2)C',3.07133013436744 -'COC(=O)NC(=NC1=C2)NC1=CC(=C2)SC(C=C3)=CC=C3',4.30008455052816 -'CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1',4.11967251914367 -'c1cc(C(F)(F)F)cc(Cl)c1NC(C(C)C)C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',5.30355258529792 -'S=P(OCC)(Sc1ccccc1)CC',5.192858916992 -'n1c(C)nc(OC)nc1NC(=O)NS(=O)(=O)c2ccsc2C(=O)OC',4.19021010110931 -'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',4.76466896003284 -'O=N(=O)N(CN1N(=O)=O)CN(C1)N(=O)=O',5.17048924956396 -'O=C(N=C(N(C1(=O))C)N(C)C)N1C(CCCC2)C2',3.70296927879496 -'n(c(c(ccc1)cc2)c1O)c2',3.00650487851870 -'c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2',3.87095923630552 -'COc1cccc(OC)c1C(=O)Nc2onc(C(C)(CC)CC)c2',3.81664542550781 -'n1c(OC)cc(OC)nc1NC(=O)NS(=O)(=O)Cc2ccccc2C(=O)OC',3.12325069281768 -'CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC',3.82001485148442 -'CN(C)(CCC1)CC1',2.88160770091708 -'O=P(SCCCC)(SCCCC)SCCCC',5.40072574498715 -'COCC(=O)N(C(C)C(=O)OC)c1c(C)cccc1C',3.65023995836629 -'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',5.17945311726922 -'CNC(=O)ON=C(C)SC',4.21007789203115 -'COP(=S)(OC)Oc1ccc(cc1)N(=O)(=O)',6.02235818715591 -'O=C1N(N)C(SC)=NN=C1C(C)(C)C',4.15490651136806 -'COP(=O)(OC)OC(Br)C(Cl)(Cl)Br',5.27964840060116 -'OC(C(N)C1O)C(C)OC1(C)OC(CC(C)(C(C2O)C(O)=O)OC(O)(C2)CC(O)CC(C)(O3)C3C=C4)C=CC=CC=CC=CCC(C)OC4=O',3.99258108069112 -'O=N(=O)c(ccc(c1N)C)c1',4.27918373941654 -'O=N(=O)c(c(N)ccc1N)c1',3.24556564669417 -'O=C(O)C(=C(N)C=C1N(=O)=O)C=C1',2.18667157840130 -'O=N(=O)c(c(c(ccc1)cc2)c1)c2',3.0209838975238 -'c12c(N=Nc3ccccc3)c(O)ccc1cc(S(=O)(=O)O)cc2',3.26105456902449 -'CC(C)Oc1cc(c(Cl)cc1Cl)N2N=C(OC2(=O))C(C)(C)C',4.83912722706429 -'CNC(=O)ON=C(SC)C(=O)N(C)C',4.64199221806157 -'CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O',4.92021372679140 -'Oc(c(c(c(c1Cl)Cl)Cl)Cl)c1Cl',4.42543075349016 -'NC(=N)NC(=N)NCCc1ccccc1',3.44898061811695 -'COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O)',4.20046887469431 -'CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC',4.38676470716829 -'ClC3C6(Cl)C4C2C1OC1C5C2C3(Cl)C(Cl)(C45)C6(Cl)Cl',5.73572355899233 -'O=C(OC(=O)c1cccc2)c12',2.09688233455707 -'Nc1c(Cl)c(Cl)nc(C(=O)(O))c1Cl',3.60469254298773 -'CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1',5.08683453410041 -'Nc3ccc2cc1ccc(N)cc1nc2c3',3.64856042750458 -'CCC(=O)Nc1ccc(Cl)c(Cl)c1',4.03758556402413 -'Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2',4.13636586052483 -'O=C(N)c(nccn1)c1',2.19322585277166 -'Oc1cc(O)c2C(=O)C(O)=C(c3cc(O)c(O)cc3)Oc2c1',2.17199481319419 -'CCC(O)(C)C#C',3.32910149752408 -'CC(C(NCC)=C1)=CC(C1=O2)=C(C(C2=C3)=CC(C)=C3NCC)C(=CC=C4)C(=C4)C(=O)OCC',4.56776852431159 -'O=C(NS(=O)(=O)c1cccc2)c12',1.70634501494627 -'c1cc(Cl)ccc1C2SC(=O)N(C(=O)NC3CCCCC3)C2C',3.34350563448343 -'n(c(nc(n1)NCC)NCC)c1Cl',4.60564260851438 -'O=[S](NC1CCCCC1)(=O)[O-].[Na+]',1.74712743618051 -'O=C(OCC(C1OCC(C1O)O)O)CCCCCCCCCCC',1.70187402783236 -'O(CC1O)C(C1O)C(O)COC(=O)CCCCCCCCCCCCCCCCC',1.77657920852493 -'O=S(=O)(Nc(nc(cc1C)C)n1)c(ccc(N)c2)c2',3.92604632938062 -'CCNc1nc(NC(C)(C)C)nc(SC)n1',4.2065674883771 -'Oc(c(cc(c1)C(C)(C)C)Cl)c1',2.93192524190336 -'C(C(Cl)Cl)(Cl)Cl',3.19149572716769 -'COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl',3.5634357799466 -'CCN(CC)C(=O)SCc1ccc(Cl)cc1',4.71227844003234 -'COC(=O)NC(=S)Nc1ccccc1NC(=S)NC(=O)OC',4.0293761165818 -'N(C(=S)SSC(N(C)C)=S)(C)C',4.20490259955842 -'c12OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CCc1c(C)c(OC(=O)C)c(C)c2C',2.37359490910830 -'Cc1cc(N)ccc1NOS(O)(=O)=O',3.07409722667645 -'C(Br)(C(Br)(Br)Br)C1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',5.34570506657104 -'O=C(O)COc(c(cc(c1Cl)Cl)Cl)c1',4.40736115725459 -'FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O',3.92334642542511 -'Cc1cc(C)c(N)cc1C',3.33165612180841 -'CC(O)(C(O)C(O1)C)CC1(C)OC(C(C)O2)C(C(O)C2(C)OC(C(C)C(O)CC(=O)OC(CC)C3COC(C(OC)C4OC)OC(C)C4O)C(CC=O)CC(C)C(=O)C=CC(=C3)C)N(C)C',3.27607248348466 -'c1c(Cl)cc(Cl)cc1N2C(=O)C(C)(C=C)OC2(=O)',3.59380666266014 -'O=C(OC(CCCC(O)CCCCCc1cc(O)cc2O)C)c12',6.20735970305 -'COC(=O)C1(C2=CC=CC=C2C3=C1C=C(C=C3)Cl)O',3.26276588262396 -'CC(C(=O)O)OC1=CC(=CC=C1)Cl',3.30237197471763 -'P12P3P1P23',1.92514612424786 -'C(CO)O',2.19080664059838 -'CCCCOCC(C)OCC(C)O',3.17218289921228 -'C(CO)O',1.49183663626236 -'C(CO)O',1.82907880458079 -'[O-][As](=O)([O-])[O-]',4.34688225631145 -'[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F',5.1159116373222 -'N(C(=S)SSC(N(C)C)=S)(C)C',4.32029601826049 -'COP(=O)(N)SC',5.19537431180606 -'N(C(=S)SSC(N(C)C)=S)(C)C',4.64300653228067 -'COP(=O)(NC(=O)(C))SC',3.71877648742193 -'C1=CC=C(C=C1)NC(=O)NC2=CN=NS2',3.86579667362138 -'CCOP(=S)(NC(C)C)OC1=CC=CC=C1C(=O)OC(C)C',5.83934493677328 -'CC(=NOC(=O)N(C)SN(C)C(=O)ON=C(C)SC)SC',4.54957865212472 -'CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C',5.3072756271046 -'NC(CCCC1)C1',3.22924248946341 -'CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1',4.00572916683684 -'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',5.91357931241363 -'CCCCC(CC)COC(=O)C1=CC=CC=C1C(=O)OCC(CC)CCCC',3.29065345190954 -'OC(=O)CNCP(O)(O)=O',2.22807446683025 -'C1CNC(=S)N1',5.64754514108144 -'O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1',4.6004830749906 -'C1=CC=C2C(=C1)NC(=S)S2',2.34830823871711 -'CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl',4.54479494223028 -'c(c(c(c(c1Cl)Cl)Cl)Cl)(c1Cl)Cl',5.99211484281248 -'COc1ccc(cc1)C(c2ccc(OC)cc2)C(Cl)(Cl)Cl',3.44172416093488 -'C1=CC(=CC=C1Cl)Cl',2.690201870583 -'CC(C)OC(=O)NC1=CC(=CC=C1)Cl',2.63075480518045 -'COP(=O)(OC)OC=C(Cl)Cl',5.01190613898164 -'CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O',5.84103248074378 -'CNC(=O)N(C)c1nnc(s1)C(C)(C)C',3.75647357868479 -'CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2',3.13153975286541 -'CC(C(=O)O)OC1=C(C=C(C=C1)Cl)Cl',4.41694364962485 -'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',4.54086743953507 -'C(#N)c(c(c(c(c1C(#N))Cl)Cl)Cl)c1Cl',4.82267631193248 -'O=C(OCC)C(O)(c(ccc(c1)Cl)c1)c(ccc(c2)Cl)c2',4.24731476483975 -'O=C(N(C)C)Nc(ccc(c1)Cl)c1',3.2011773320931 -'O=C(N(SC(Cl)(Cl)Cl)C(=O)C1CC=CC2)C12',3.47797354595327 -'CCc1cccc(C)c1N(C(C)COC)C(=O)CCl',3.27691146056582 -'C1=CC(=C(C=C1Cl)Cl)OCC(=O)O',4.64549583771218 -'CCNC1=NC(=NC(=N1)Cl)NC(C)(C)C#N',5.2845529417803 -'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',4.80088113268728 -'COP(=S)(OC)OC1=CC(=C(C=C1Cl)Cl)Cl',3.80827186579208 -'C1C2C=CC1C3C2C4(C(=C(C3(C4(Cl)Cl)Cl)Cl)Cl)Cl',7.56218566972996 -'CC1(C(C1C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Cl)Cl)C',4.19455618753918 -'CCN(CC)C(=O)C(C)OC1=CC=CC2=CC=CC=C21',3.43353645191675 -'ClC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',6.17413857281627 -'CC(=CC(=O)NC)OP(=O)(OC)OC',5.6954106911713 -'CC(C)C1(C)N=C(NC1(=O))c3nc2ccccc2cc3C(=O)(O)',4.19219820184676 -'CC(C)Nc1nc(Cl)nc(NC(C)C)n1',3.66220959497816 -'CC(C(=O)O)(Cl)Cl',3.45627084235452 -'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',4.76271618915143 -'O=C(NC)CSP(OC)(OC)=S',4.6613534361142 -'C12C3(C4(C5(C3(C(C1(C5(C2(C4(Cl)Cl)Cl)Cl)Cl)(Cl)Cl)Cl)Cl)Cl)Cl',7.70850413051807 -'COC(=O)C1=CC=CC=C1C(=O)OC',1.98718344722018 -'CCOP(=S)(OCC)SCSC(C)(C)C',6.76107133056166 -'CCC(C)SP(=O)(OCC)SC(C)CC',6.0340541201743 -'CCOP(=S)(OCC)SCSC(C)(C)C',5.1590113392337 -'C1C(C(C(=O)N1C2=CC=CC(=C2)C(F)(F)F)Cl)CCl',4.79534478918374 -'O=C(O)C(C(C(=O)O)C(O1)CC2)C12',3.20919319571953 -'O=C(Oc(c(OC(C1)(C)C)c1cc2)c2)NC',4.64591798599928 -'Oc(c(c(c(c1)Cl)Cl)Cc(c(c(cc2Cl)Cl)Cl)c2O)c1Cl',4.9105214638308 -'CC1(CON(C1=O)CC2=CC=CC=C2Cl)C',4.04722605916309 -'CCC(C)N1C(=O)C(=C(NC1=O)C)Br',3.6209530011803 -'CC1=CC(=CC(=C1N(C)C)C)OC(=O)NC',5.17081600643967 -'CNC(=O)OC1=CC=CC(=C1)N=CN(C)C',4.24798445482129 -'CC1=NN(C(=O)N1C(F)F)C2=CC(=C(C=C2Cl)Cl)NS(=O)(=O)C',3.76184922452045 -'CCOP(=S)(CC)SC1=CC=CC=C1',4.6925459996104 -'CCOP(=S)(OCC)SC(CCl)N1C(=O)C2=CC=CC=C2C1=O',5.19738625502110 -'N1CC(C)(C)CNC1=NN=C(C=Cc2ccc(C(F)(F)F)cc2)C=Cc3ccc(C(F)(F)F)cc3',4.99517458001903 -'CC1=C(C(=C(C(=C1F)F)COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)F)F',4.9591800647055 -'CC1=CC(=C(C=C1)N=CN(C)C=NC2=C(C=C(C=C2)C)C)C',4.45886884853594 -'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',5.57739312594126 -'CC(C)N(C(C)C)C(=O)SCC(Cl)=C(Cl)Cl',4.38691132629296 -'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',5.14932086869605 -'CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2CCC(F)(F)F',3.72005974473228 -'O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12',3.77865560759679 -'CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1',4.34489545637121 -'O=C(ON=CC(SC)(C)C)NC',6.27935493374302 -'ClC(Cl)(Cl)CC1(OC1)c2cc(Cl)cc(Cl)c2',4.02860782189294 -'CCC1CCCC(C(C(=O)C2CC3C(C2CC(=O)O1)CCC4C3CC(C4)OC5CC(C(C(C5OC)OC)OC)C)C)OC6CCC(C(O6)C)N(C)C',4.48549336200642 -'CC(C)(C)C(=NOC(=O)NC)CSC',4.56093515068149 -'CON=C(CC1=CN=CC=C1)C2=C(C=C(C=C2)Cl)Cl',3.81685069684023 -'CC(=CC1C(C1(C)C)C(=O)OCN2C(=O)C3=C(C2=O)CCCC3)C',3.12242048929166 -'C1COC(O1)(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl',4.47732480426449 -'CCCOC(=O)C1=CN=C(C=C1)C(=O)OCCC',3.00221511481659 -'CC1=CC(=NC(=N1)NC(=O)NS(=O)(=O)C2=CC=CC=C2C(=O)OC3COC3)C',3.68988952034363 -'C1=C(C(=NC(=C1Cl)Cl)OCC(=O)O)Cl',3.85273501931079 -'CCOCN1C(=C(C(=C1C(F)(F)F)Br)C#N)C2=CC=C(C=C2)Cl',4.47670895789257 -'CC(C)CC1=C(C(=NC(=C1C(=O)SC)C(F)(F)F)C(F)F)C(=O)SC',5.04368703263975 -'CC12CC1(C(=O)N(C2=O)C3=CC(=CC(=C3)Cl)Cl)C',4.27743796844594 -'CC1=CC(=C(C=C1)C(=O)OC)C2=NC(C(=O)N2)(C)C(C)C',3.76093729967937 -'COP(=S)(OC)OC1=NC(=C(C=C1Cl)Cl)Cl',5.03145309127161 -'CC(C)CC1=C(C(=NC(=C1C(=O)OC)C(F)F)C(F)(F)F)C2=NCCS2',3.95268441956944 -'CCOC(=O)C(CC1=CC(=C(C=C1Cl)F)N2C(=O)N(C(=N2)C)C(F)F)Cl',4.53591743757444 -'CC(C)=CC3C(C(=O)OCc2coc(Cc1ccccc1)c2)C3(C)C',3.4325717246993 -'CCCSP(=S)(OCC)OC1=CC=C(C=C1)SC',4.44776025923588 -'CC1=CC(=C(C(=C1)OC(=O)NC)C)C',3.513780491163 -'CC1=CC=CC=C1COC2CC3(CCC2(O3)C)C(C)C',3.26228942932097 -'CC1=C2C(=CC=C1)SC3=NN=CN23',3.78564431476757 -'CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl',3.55619540984755 -'CCCN(CCC)C(=O)SCC',4.32294999482974 -'CC(C)OC(=O)C=C(C)C=CCC(C)CCCC(C)(C)OC',3.82926385227003 -'COP(=S)(OC)Oc1ccc(SC)c(C)c1',4.87052572632858 -'COC1=C(C=C(C=C1)C(=CC(=O)N2CCOCC2)C3=CC=C(C=C3)Cl)OC',3.92309028461827 -'CCSC(=O)N(CC(C)C)CC(C)C',3.33720244245390 -'CC(C)OP(=S)(OC(C)C)SCCNS(=O)(=O)C1=CC=CC=C1',4.42326053700057 -'CC(=CC1C(C1(C)C)C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C',3.36853572230648 -'CC1=CC(=CC(=C1C)C)OC(=O)NC',4.28610219788592 -'CCOP(=S)(OCC)SCSC1=CC=C(C=C1)Cl',5.53512353543065 -'C1CN(CCN1C(C(Cl)(Cl)Cl)NC=O)C(C(Cl)(Cl)Cl)NC=O',3.63845107729718 -'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',5.00270088682186 -'C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-]',3.37340446386955 -'CCCC(=NOCC)C1C(=O)CC(CC1=O)CC(C)SCC',4.29612718117234 -'ClC2(Cl)C4(Cl)C1(Cl)C5(Cl)C(Cl)(Cl)C3(Cl)C1(Cl)C2(Cl)C3(Cl)C45Cl',5.89173094758972 -'CCN(C1CCCCC1)C(=O)SCC',4.85603479370532 -'CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2OCCCl',3.260038251795 -'C(C(=O)O)OC1=NC(=C(C(=C1Cl)N)Cl)F',2.70762229375841 -'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC#C',3.49996484386965 -'C1C(COC1(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl)Br',4.76483992624863 -'C1=NNC(=N1)N',4.52675248773797 -'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F',4.16607614499238 -'C1=CC(=CC=C1OS(=O)(=O)C2=CC=C(C=C2)Cl)Cl',5.08373349418451 -'FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O',2.52540641675307 -'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',3.60553192639024 -'C1=CC(=C(C(=C1)Cl)C#N)Cl',4.83761727241192 -'C1C(O1)COC2=CC=CC=C2C3=CC=CC=C3',2.65565785542345 -'CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC',2.92199532671878 -'O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N',3.97297179822463 -'C1=CC(=C(C2=NC=C(C=C21)Cl)C(=O)O)Cl',2.50482391995124 -'CC(C)NC(=O)N1CC(=O)N(C1=O)C2=CC(=CC(=C2)Cl)Cl',3.85597533208895 -'CCCN(CCCl)C1=C(C=C(C=C1[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',3.24487034075484 -'C1=CC=C(C=C1)C2=CC=CC=C2O',2.23097792739447 -'O=C(N(C)C)Nc(cccc1C(F)(F)F)c1',4.18977535089103 -'C1=CC(=NC(=C1)Cl)C(Cl)(Cl)Cl',5.36343657222619 -'Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2',4.7008945110302 -'CC1=CC(=C(C=C1NC(=O)C)NS(=O)(=O)C(F)(F)F)C',4.05086251778066 -'C(=C(I)I)(I)I',4.02664705683052 -'C1=C(C=C(C(=C1Cl)N2C(=C(C(=N2)C#N)S(=O)C(F)(F)F)N)Cl)C(F)(F)F',6.8624770260417 -'O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1',4.57165200886706 -'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',4.09142710541740 -'CC1=CC2=C(C=C1)N=C3C(=N2)SC(=O)S3',4.49470628000702 -'CC(C)N(C(=O)CCl)c1ccccc1',3.96396832169828 -'CC(C)C1(C(=O)NC(=N1)C2=C(C=CC=N2)C(=O)O)C',2.71813034538638 -'CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C',4.25443178297333 -'CN1CN(C(=S)SC1)C',3.73313384224274 -'ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',3.74434218472656 -'ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl',6.28927348401756 -'CCOC(=O)CN1C2=C(C=CC=C2Cl)SC1=O',4.33721159291063 -'CCCN(CCC)C1=C(C=C(C(=C1[N+](=O)[O-])N)C(F)(F)F)[N+](=O)[O-]',4.0760849833355 -'C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N',3.92533540454444 -'CC(C)(C)C(CCC1=CC=C(C=C1)Cl)(CN2C=NC=N2)O',4.28689742390489 -'CC1=C(C=CC=C1COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)C3=CC=CC=C3',4.92723460128442 -'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',3.70167089115788 -'C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-]',3.13990879364539 -'CC1=C(C=C(C=C1C(=O)N)[N+](=O)[O-])[N+](=O)[O-]',4.55660790505055 -'CC(C)OC1=CC=CC(=C1)NC(=O)C2=CC=CC=C2C(F)(F)F',2.81064866255668 -'OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl',5.17083139418745 -'O=P(O)(O)CCCl',2.51051495802278 -'CN(C(=O)NC1=CC=C(C=C1)Br)OC',4.31655713179121 -'CC1=CC(=CC=C1)NC(=O)OC2=CC=CC(=C2)NC(=O)OC',4.0796286862285 -'CC(C)(C)C1=NN=C(S1)N2C(CN(C2=O)C)O',3.70982035175725 -'S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1',5.32917717728496 -'COC(=O)c1ccccc1S(=O)(=O)NC(=O)N(C)c2nc(OC)nc(C)n2',4.50011608554638 -'C1=CC=C(C(=C1)NC2=NC(=NC(=N2)Cl)Cl)Cl',5.37945812670042 -'CC1=C(C=CC(=C1)OP(=S)(OC)OC)[N+](=O)[O-]',5.78008872366218 -'COc1c(Cl)ccc(Cl)c1C(=O)(O)',3.28376800169458 -'CC1(C(C1C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Br)Br)C',5.30552261110582 -'C1=CC=C(C(=C1)C(C2=CC=C(C=C2)F)(C3=CN=CN=C3)O)Cl',5.10001384041789 -'c1ccc2nc(NC(=O)OC)n(C(=O)NCCCC)c2c1',3.40217570413585 -'CCOC(=O)COC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',4.25309221972639 -'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)C3=CC=CC=C3)O',4.13022504615292 -'CCNC(=O)NC(=O)C(=NOC)C#N',3.81561566158005 -'CCOC1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',3.95628893719942 -'CC1=NC=C(N1CCO)[N+](=O)[O-]',3.05729569283336 -'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',2.77313899543591 -'CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2',3.54465374823881 -'CCCCC(CN1C=NC=N1)(C2=C(C=C(C=C2)Cl)Cl)O',4.82512253178873 -'CC(C)(C)C(C(=CC1=C(C=C(C=C1)Cl)Cl)N2C=NC=N2)O',3.81454188371475 -'C1=CC(C2C1C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl)Cl',5.9922949848715 -'C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N',4.47176647572299 -'CC1=NN(C(=C1C=NOCC2=CC=C(C=C2)C(=O)OC(C)(C)C)OC3=CC=CC=C3)C',5.13623540476555 -'CS(=O)(=O)C1=C(C=CC(=C1)C(F)(F)F)C(=O)C2=C(ON=C2)C3CC3',4.25445174537182 -'CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C',4.28018891498254 -'CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC',5.30057855955201 -'C1=CC(=CC=C1C(CN)O)O',2.78725763359614 -'CC1=C(C(=CC=C1)C)N(C(=O)COC)N2CCOC2=O',3.74554900711723 -'c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2',4.20939714153443 -'CCC(C)NC1=C(C=C(C=C1[N+](=O)[O-])C(C)(C)C)[N+](=O)[O-]',3.77134379610358 -'C1=CC(=CC=C1S(=O)(=O)C2=CC(=C(C=C2Cl)Cl)Cl)Cl',3.18978539843532 -'CCCCC1=C(NC(=NC1=O)NCC)C',3.92280444363211 -'n(c(nc(n1)NCC)NCC)c1Cl',4.58033674324961 -'FC(F)(F)C(C=C1N(=O)=O)=CC(N(=O)=O)=C1N(CC)CC(C)=C',4.42587730748324 -'C1CCC(C1)N(CC2=CC=C(C=C2)Cl)C(=O)NC3=CC=CC=C3',4.11903913677133 -'CS(=O)(=O)NC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',3.94325990345253 -'CCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC3=C(O2)C=C(C=C3)Cl',4.60419765136131 -'CCC1=C(C(=CC=C1)CC)N(CNC(=O)C)C(=O)CCl',3.67657281690409 -'NC(=N)NCCCCCCCCCCCC(OC(=O)C)',3.99309483347533 -'C1=CC(=CC(=C1)Cl)NC(=O)OCC#CCCl',2.75857660132254 -'CC(C)C(C(=O)OC(C(#N))c2cccc(Oc1ccccc1)c2)c3ccc(Cl)cc3',4.22520594870835 -'CC(C)C1=C(C=CC(=C1)C(C)(C)C2=CC(=C(C=C2)O)C(C)C)O',4.09683471023993 -'CCN(CC1=C(C=CC=C1Cl)F)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',3.92606530797808 -'CCCCCCCCSC(=O)OC1=CC(=NN=C1C2=CC=CC=C2)Cl',3.74923930876524 -'CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C',4.3407141033807 -'CCCCNC(=O)N1C2=CC=CC=C2N=C1NC(=O)OC',3.06493353581742 -'CC1=C(C(=CC=C1)C)N(C(C)C(=O)OC)C(=O)CC2=CC=CC=C2',3.84966174557959 -'CC(C)C(C1=CC=C(C=C1)OC(F)F)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3',4.87646988000983 -'Clc1ccccc1c2nnc(c3ccccc3Cl)nn2',4.1806220183605 -'CCOC(=O)NCCOC1=CC=C(C=C1)OC2=CC=CC=C2',4.4790525467538 -'CCC1=C(C(=CC=C1)CC)N(CC(=O)OCC)C(=O)CCl',3.79491137150459 -'c1(O2)c(CC2(C)C)cccc1OC(=O)N(C)SN(CCCC)CCCC',4.18246564622765 -'CCCCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC=C(C=C2)C(F)(F)F',5.10648736510651 -'COC1=CC(=C(C=C1Cl)OC)Cl',3.21917344408706 -'CCOP(=S)(OCC)OC1=NN(C(=N1)Cl)C(C)C',4.39966173548004 -'n(c(nc(n1)NC(C)C)NCC)c1Cl',3.93587643048823 -'CC(C)(C)C(C(=CC1=CC=C(C=C1)Cl)N2C=NC=N2)O',3.8694430122441 -'CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O)',3.8625999735624 -'c1cc(OC(F)(F)F)ccc1C(O)(C(C)C)c2cncnc2',4.41176854866759 -'COP(=O)(C(C(Cl)(Cl)Cl)O)OC',4.10964043198952 -'C1=CC(=C(C=C1C(F)(F)F)Cl)OC2=CC(=C(C=C2)[N+](=O)[O-])C(=O)O',3.46138721019571 -'CCCN(CC1CC1)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-]',4.8417219607834 -'CCOC(=O)C(C)OC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-]',3.96545863474241 -'CCSC(=O)N1CCCCCC1',4.10198823735002 -'CCC1=CC=C(C=C1)C(=O)NN(C(=O)C2=CC(=CC(=C2)C)C)C(C)(C)C',3.86588082257473 -'ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O)',4.36681001970786 -'COC(=O)C1=CC=CC=C1S(=O)(=O)NC(=O)NC2=NC(=CC(=N2)OC(F)F)OC(F)F',3.52443042732356 -'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O',4.07300621285581 -'CC1=C(C=CC(=C1)Cl)OCC(=O)O',4.70031198338967 -'COC=C(C1=CC=CC=C1OC2=NC=NC(=C2)OC3=CC=CC=C3C#N)C(=O)OC',3.81158305905272 -'C1=CC=C(C(=C1)C(C2=CC=C(C=C2)Cl)(C3=CN=CN=C3)O)Cl',5.15835722073531 -'[O-]Br(=O)=O',4.3215481796762 -'OP(=O)OCC',2.4395258763695 -'COP(N)(=O)SC',6.14961682124539 -'CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1',5.30586339308612 -'CCOP(=S)(OCC)SCCSCC',6.8363304797203 -'CCOP(=S)(OCC)SCSP(=S)(OCC)OCC',5.28383935473594 -'O=C(OCC(CCCC)CC)CCCCC(=O)OCC(CCCC)CC',2.39277487311710 -'CN(C=Nc1ccc(C)cc1C)C=Nc2ccc(C)cc2C',4.46746902029786 +C1=C(C(=CC(=C1NN=C3C2=C(C=C([S]([O-])(=O)=O)C=C2)C=CC3=O)OC)[S]([O-])(=O)=O)C.[Na+].[Na+],2.12309380508316 +O1C(=O)C(O)=C(O)C1C(O)CO,1.76137662853832 +C1(C)=C(C=CC(C)=CC=CC(C)=CC=CC=C(C)C=CC=C(C)C(=O)OC)C(C)(C)CCC1,2.95101092705237 +c(cccc1)(c1)C(C)C,2.41523206875268 +O=C(OCCCC)c(c(ccc1)C(=O)OCCCC)c1,2.66642980233607 +O=C(OCC)c(c(ccc1)C(=O)OCC)c1,1.69992305435084 +O=C(OC(OC(OC1C)C)C1)C,3.14412407646651 +Oc(c(ccc1)C)c1C,4.30879341594785 +Oc(ccc(c1C)C)c1,3.94081663065326 +O=C(OCC)C=C,2.60605102798022 +c(cccc1)(c1)CC,2.41532120099855 +OCCO,2.39492662325430 +c(ccc1C(=O)OCC(=O)OCC)cc1C(=O)OCC,2.04964162538818 +O=C,2.56368333860036 +O=C(O)C=CC(=O)O,2.03090237239810 +OCC(O)CO,1.12645271808123 +O=C(OC)c(ccc(O)c1)c1,2.00617304782278 +O=C(OCCC)c(ccc(O)c1)c1,2.07966468441907 +CC(CCC(=O)(O))C3CCC4C2CCC1CC(O)CCC1(C)C2CCC34C,2.87687871256153 +OC(C(CCC1C)C(C)C)C1,2.42080757876423 +O=C(O)C(=C)C,2.54049719303574 +O=C(OC)c(c(O)ccc1)c1,2.62596180611118 +Oc(cccc1)c1,2.43708305310291 +O=C(OCCC)c(cc(O)c(O)c1O)c1,2.3902301635117 +OCC(O)C1C(O)=C(O)C(=O)O1,2.05436782171583 +c(cccc1)(c1)C=C,3.69543631002744 +O=Cc(occ1)c1,3.20450009536782 +NCCNc1cccc2ccccc12,3.37247609215110 +CN(C)(C)CCCl,2.64921593816204 +O=C(Nc(ccc(c1)C(=O)CCl)c1)C,2.12695072080225 +c(ccc(c1)Cl)(c1)C(c(ccc(c2)Cl)c2)C(Cl)(Cl)Cl,4.04444942813338 +CC(Oc1cc(Cl)c(Cl)cc1Cl)C(=O)(O),4.491054148917 +O=N(=O)C(=CC=C1OC)C=C1N=NC(C(O)=C2C(=O)NC(=CC=C4)C=C4N(=O)=O)=C(C=C3)C(=C2)C=C3,2.36568501290040 +O=N(=O)C(C=C1)=CC(OCCO)=C1NCCO,3.02438986505162 +Cc1cccc(CC)c1N(C(=O)CCl)COCC,3.73201897895503 +C1=C(C(=CC=C1OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-])C(=O)[O-].[Na+],3.32865137721601 +CCc1cccc(CC)c1N(COC)C(=O)CCl,4.25489772423536 +O=C(Nc(ccc(OCC)c1N)c1)C,2.21459876477238 +Oc(ccc(N)c1)c1,2.20160364320713 +CC(N)CC(=CC=C1)C=C1,4.43202666692597 +O(c(ccc(c1)C=CC)c1)C,2.63429468422019 +COc1ccc(N)cc1,2.41466474972438 +O=C(O)c(c(N)ccc1)c1,1.69766082403086 +Clc2cccc(c2)c1ccccc1,4.67360340221543 +O=C(NC(C(=O)OC)Cc(cccc1)c1)C(N)CC(=O)O,3.30147753146833 +n1c2ccc(Cl)cc2ncc1Oc3ccc(OC(C)C(=O)OCC)cc3,5.00327683569969 +COC(=O)NS(=O)(=O)c1ccc(N)cc1,3.10691015775373 +S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O),5.94520088604013 +CNC(=O)Oc1ccccc1OC(C)C,3.62167823549204 +CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n2cncn2,4.07003600375764 +O=S(O)(=O)C(=CC=C1)C=C1CN(CC)=C(C=C2)C=CC2=C(C(C=C3)=CC=C3N(C)C)C(C=C4)=CC=C4N(CC)CC(C=C5)=CC(=C5)S(=O)(=O)O,2.99569446127058 +c(c(cccc1)c1)(cccc2)c2,2.79016633269067 +BrC(Cl)Cl,3.10044647372987 +ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O),4.46372003271591 +O=C(Oc(c(c(ccc1)cc2)c1)c2)NC,4.11054922260167 +CC1=C(SCCO1)C(=O)Nc2ccccc2,3.89450458533419 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,6.18118555259066 +O=C(O)CCl,3.49829685836143 +ClC(=CC=C1N)C=C1,4.32760254782945 +CC(C)OC(=O)C(O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2,4.57623015760927 +n1c(OC)nc(C)nc1NC(=O)NS(=O)(=O)c2ccccc2Cl,4.15566728690676 +OS(=O)(=O)C(C(=CC=C2)C1=C2)=CC=C1N=NC(C(O)=C3N=NC(C(C=C5)=C4C=C5)=CC=C4S(O)(=O)=O)=CC(=C3O)CO,2.91745349144784 +S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1,5.65653611167129 +CNP(=O)(OC)Oc1ccc(cc1Cl)C(C)(C)C,4.86289269710557 +C(C1C2C(C(O)C(O1)OC8C(OC(OC7C(OC(OC6C(OC(OC5C(C(C(OC4C(C(C(OC3C(C(C(O2)OC3CO)O)O)OC4CO)O)O)OC5CO)O)O)C(C6O)O)CO)C(C7O)O)CO)C(C8O)O)CO)O)O,2.85087205247326 +n1c(N)nc(N)nc1NC2CC2,4.04449742637606 +COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl,2.82212129862366 +O=C(O)C(Cl)(Cl)C,3.70545399970477 +Nc1cc(N)c(O)cc1,3.69597355155454 +FC(F)(Cl)Cl,2.90638355650622 +ClCCl,3.23010431252803 +O=P(OC)(OC)OC=C(Cl)Cl,4.98261676287965 +OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl,4.26774140719551 +ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl,6.88185159467056 +CN(=C1C(C=C2)=CC=C2)N(C)C(=C1)C(C=C3)=CC=C3,3.2998650117386 +O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2,4.58922787551359 +CC1=C(C)S(=O)(=O)CCS1(=O)=O,4.32277979319225 +O=C(NC)CSP(OC)(OC)=S,5.96238343177818 +COc1ccc(N)c(OC)c1,2.74428856020296 +COP(=O)OC,3.04158586769746 +CC(=C(N(=O)=O)C=C1N(=O)=O)C=C1,3.72891101170516 +CN(C)C(=O)C(c1ccccc1)c2ccccc2,3.90184372972497 +N(c(cccc1)c1)c(cccc2)c2,3.73709625897028 +C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3,5.50194904825203 +CCOP(=S)(OCC)SCCSCC,6.43839047104826 +NC(=S)NNC(N)=S,2.20039466208170 +O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1,4.58938077582749 +O=P(O)(O)CCCl,2.98375855767924 +O=C(OCC)C(O1)C1(c(cccc2)c2)C,3.07133013436744 +COC(=O)NC(=NC1=C2)NC1=CC(=C2)SC(C=C3)=CC=C3,4.30008455052816 +CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1,4.11967251914367 +c1cc(C(F)(F)F)cc(Cl)c1NC(C(C)C)C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,5.30355258529792 +S=P(OCC)(Sc1ccccc1)CC,5.192858916992 +n1c(C)nc(OC)nc1NC(=O)NS(=O)(=O)c2ccsc2C(=O)OC,4.19021010110931 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,4.76466896003284 +O=N(=O)N(CN1N(=O)=O)CN(C1)N(=O)=O,5.17048924956396 +O=C(N=C(N(C1(=O))C)N(C)C)N1C(CCCC2)C2,3.70296927879496 +n(c(c(ccc1)cc2)c1O)c2,3.00650487851870 +c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2,3.87095923630552 +COc1cccc(OC)c1C(=O)Nc2onc(C(C)(CC)CC)c2,3.81664542550781 +n1c(OC)cc(OC)nc1NC(=O)NS(=O)(=O)Cc2ccccc2C(=O)OC,3.12325069281768 +CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC,3.82001485148442 +CN(C)(CCC1)CC1,2.88160770091708 +O=P(SCCCC)(SCCCC)SCCCC,5.40072574498715 +COCC(=O)N(C(C)C(=O)OC)c1c(C)cccc1C,3.65023995836629 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,5.17945311726922 +CNC(=O)ON=C(C)SC,4.21007789203115 +COP(=S)(OC)Oc1ccc(cc1)N(=O)(=O),6.02235818715591 +O=C1N(N)C(SC)=NN=C1C(C)(C)C,4.15490651136806 +COP(=O)(OC)OC(Br)C(Cl)(Cl)Br,5.27964840060116 +OC(C(N)C1O)C(C)OC1(C)OC(CC(C)(C(C2O)C(O)=O)OC(O)(C2)CC(O)CC(C)(O3)C3C=C4)C=CC=CC=CC=CCC(C)OC4=O,3.99258108069112 +O=N(=O)c(ccc(c1N)C)c1,4.27918373941654 +O=N(=O)c(c(N)ccc1N)c1,3.24556564669417 +O=C(O)C(=C(N)C=C1N(=O)=O)C=C1,2.18667157840130 +O=N(=O)c(c(c(ccc1)cc2)c1)c2,3.0209838975238 +c12c(N=Nc3ccccc3)c(O)ccc1cc(S(=O)(=O)O)cc2,3.26105456902449 +CC(C)Oc1cc(c(Cl)cc1Cl)N2N=C(OC2(=O))C(C)(C)C,4.83912722706429 +CNC(=O)ON=C(SC)C(=O)N(C)C,4.64199221806157 +CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O,4.92021372679140 +Oc(c(c(c(c1Cl)Cl)Cl)Cl)c1Cl,4.42543075349016 +NC(=N)NC(=N)NCCc1ccccc1,3.44898061811695 +COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O),4.20046887469431 +CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC,4.38676470716829 +ClC3C6(Cl)C4C2C1OC1C5C2C3(Cl)C(Cl)(C45)C6(Cl)Cl,5.73572355899233 +O=C(OC(=O)c1cccc2)c12,2.09688233455707 +Nc1c(Cl)c(Cl)nc(C(=O)(O))c1Cl,3.60469254298773 +CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1,5.08683453410041 +Nc3ccc2cc1ccc(N)cc1nc2c3,3.64856042750458 +CCC(=O)Nc1ccc(Cl)c(Cl)c1,4.03758556402413 +Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2,4.13636586052483 +O=C(N)c(nccn1)c1,2.19322585277166 +Oc1cc(O)c2C(=O)C(O)=C(c3cc(O)c(O)cc3)Oc2c1,2.17199481319419 +CCC(O)(C)C#C,3.32910149752408 +CC(C(NCC)=C1)=CC(C1=O2)=C(C(C2=C3)=CC(C)=C3NCC)C(=CC=C4)C(=C4)C(=O)OCC,4.56776852431159 +O=C(NS(=O)(=O)c1cccc2)c12,1.70634501494627 +c1cc(Cl)ccc1C2SC(=O)N(C(=O)NC3CCCCC3)C2C,3.34350563448343 +n(c(nc(n1)NCC)NCC)c1Cl,4.60564260851438 +O=[S](NC1CCCCC1)(=O)[O-].[Na+],1.74712743618051 +O=C(OCC(C1OCC(C1O)O)O)CCCCCCCCCCC,1.70187402783236 +O(CC1O)C(C1O)C(O)COC(=O)CCCCCCCCCCCCCCCCC,1.77657920852493 +O=S(=O)(Nc(nc(cc1C)C)n1)c(ccc(N)c2)c2,3.92604632938062 +CCNc1nc(NC(C)(C)C)nc(SC)n1,4.2065674883771 +Oc(c(cc(c1)C(C)(C)C)Cl)c1,2.93192524190336 +C(C(Cl)Cl)(Cl)Cl,3.19149572716769 +COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl,3.5634357799466 +CCN(CC)C(=O)SCc1ccc(Cl)cc1,4.71227844003234 +COC(=O)NC(=S)Nc1ccccc1NC(=S)NC(=O)OC,4.0293761165818 +N(C(=S)SSC(N(C)C)=S)(C)C,4.20490259955842 +c12OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CCc1c(C)c(OC(=O)C)c(C)c2C,2.37359490910830 +Cc1cc(N)ccc1NOS(O)(=O)=O,3.07409722667645 +C(Br)(C(Br)(Br)Br)C1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,5.34570506657104 +O=C(O)COc(c(cc(c1Cl)Cl)Cl)c1,4.40736115725459 +FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O,3.92334642542511 +Cc1cc(C)c(N)cc1C,3.33165612180841 +CC(O)(C(O)C(O1)C)CC1(C)OC(C(C)O2)C(C(O)C2(C)OC(C(C)C(O)CC(=O)OC(CC)C3COC(C(OC)C4OC)OC(C)C4O)C(CC=O)CC(C)C(=O)C=CC(=C3)C)N(C)C,3.27607248348466 +c1c(Cl)cc(Cl)cc1N2C(=O)C(C)(C=C)OC2(=O),3.59380666266014 +O=C(OC(CCCC(O)CCCCCc1cc(O)cc2O)C)c12,6.20735970305 +COC(=O)C1(C2=CC=CC=C2C3=C1C=C(C=C3)Cl)O,3.26276588262396 +CC(C(=O)O)OC1=CC(=CC=C1)Cl,3.30237197471763 +P12P3P1P23,1.92514612424786 +C(CO)O,2.19080664059838 +CCCCOCC(C)OCC(C)O,3.17218289921228 +C(CO)O,1.49183663626236 +C(CO)O,1.82907880458079 +[O-][As](=O)([O-])[O-],4.34688225631145 +[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F,5.1159116373222 +N(C(=S)SSC(N(C)C)=S)(C)C,4.32029601826049 +COP(=O)(N)SC,5.19537431180606 +N(C(=S)SSC(N(C)C)=S)(C)C,4.64300653228067 +COP(=O)(NC(=O)(C))SC,3.71877648742193 +C1=CC=C(C=C1)NC(=O)NC2=CN=NS2,3.86579667362138 +CCOP(=S)(NC(C)C)OC1=CC=CC=C1C(=O)OC(C)C,5.83934493677328 +CC(=NOC(=O)N(C)SN(C)C(=O)ON=C(C)SC)SC,4.54957865212472 +CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C,5.3072756271046 +NC(CCCC1)C1,3.22924248946341 +CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1,4.00572916683684 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,5.91357931241363 +CCCCC(CC)COC(=O)C1=CC=CC=C1C(=O)OCC(CC)CCCC,3.29065345190954 +OC(=O)CNCP(O)(O)=O,2.22807446683025 +C1CNC(=S)N1,5.64754514108144 +O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1,4.6004830749906 +C1=CC=C2C(=C1)NC(=S)S2,2.34830823871711 +CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl,4.54479494223028 +c(c(c(c(c1Cl)Cl)Cl)Cl)(c1Cl)Cl,5.99211484281248 +COc1ccc(cc1)C(c2ccc(OC)cc2)C(Cl)(Cl)Cl,3.44172416093488 +C1=CC(=CC=C1Cl)Cl,2.690201870583 +CC(C)OC(=O)NC1=CC(=CC=C1)Cl,2.63075480518045 +COP(=O)(OC)OC=C(Cl)Cl,5.01190613898164 +CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O,5.84103248074378 +CNC(=O)N(C)c1nnc(s1)C(C)(C)C,3.75647357868479 +CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2,3.13153975286541 +CC(C(=O)O)OC1=C(C=C(C=C1)Cl)Cl,4.41694364962485 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,4.54086743953507 +C(#N)c(c(c(c(c1C(#N))Cl)Cl)Cl)c1Cl,4.82267631193248 +O=C(OCC)C(O)(c(ccc(c1)Cl)c1)c(ccc(c2)Cl)c2,4.24731476483975 +O=C(N(C)C)Nc(ccc(c1)Cl)c1,3.2011773320931 +O=C(N(SC(Cl)(Cl)Cl)C(=O)C1CC=CC2)C12,3.47797354595327 +CCc1cccc(C)c1N(C(C)COC)C(=O)CCl,3.27691146056582 +C1=CC(=C(C=C1Cl)Cl)OCC(=O)O,4.64549583771218 +CCNC1=NC(=NC(=N1)Cl)NC(C)(C)C#N,5.2845529417803 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,4.80088113268728 +COP(=S)(OC)OC1=CC(=C(C=C1Cl)Cl)Cl,3.80827186579208 +C1C2C=CC1C3C2C4(C(=C(C3(C4(Cl)Cl)Cl)Cl)Cl)Cl,7.56218566972996 +CC1(C(C1C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Cl)Cl)C,4.19455618753918 +CCN(CC)C(=O)C(C)OC1=CC=CC2=CC=CC=C21,3.43353645191675 +ClC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,6.17413857281627 +CC(=CC(=O)NC)OP(=O)(OC)OC,5.6954106911713 +CC(C)C1(C)N=C(NC1(=O))c3nc2ccccc2cc3C(=O)(O),4.19219820184676 +CC(C)Nc1nc(Cl)nc(NC(C)C)n1,3.66220959497816 +CC(C(=O)O)(Cl)Cl,3.45627084235452 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,4.76271618915143 +O=C(NC)CSP(OC)(OC)=S,4.6613534361142 +C12C3(C4(C5(C3(C(C1(C5(C2(C4(Cl)Cl)Cl)Cl)Cl)(Cl)Cl)Cl)Cl)Cl)Cl,7.70850413051807 +COC(=O)C1=CC=CC=C1C(=O)OC,1.98718344722018 +CCOP(=S)(OCC)SCSC(C)(C)C,6.76107133056166 +CCC(C)SP(=O)(OCC)SC(C)CC,6.0340541201743 +CCOP(=S)(OCC)SCSC(C)(C)C,5.1590113392337 +C1C(C(C(=O)N1C2=CC=CC(=C2)C(F)(F)F)Cl)CCl,4.79534478918374 +O=C(O)C(C(C(=O)O)C(O1)CC2)C12,3.20919319571953 +O=C(Oc(c(OC(C1)(C)C)c1cc2)c2)NC,4.64591798599928 +Oc(c(c(c(c1)Cl)Cl)Cc(c(c(cc2Cl)Cl)Cl)c2O)c1Cl,4.9105214638308 +CC1(CON(C1=O)CC2=CC=CC=C2Cl)C,4.04722605916309 +CCC(C)N1C(=O)C(=C(NC1=O)C)Br,3.6209530011803 +CC1=CC(=CC(=C1N(C)C)C)OC(=O)NC,5.17081600643967 +CNC(=O)OC1=CC=CC(=C1)N=CN(C)C,4.24798445482129 +CC1=NN(C(=O)N1C(F)F)C2=CC(=C(C=C2Cl)Cl)NS(=O)(=O)C,3.76184922452045 +CCOP(=S)(CC)SC1=CC=CC=C1,4.6925459996104 +CCOP(=S)(OCC)SC(CCl)N1C(=O)C2=CC=CC=C2C1=O,5.19738625502110 +N1CC(C)(C)CNC1=NN=C(C=Cc2ccc(C(F)(F)F)cc2)C=Cc3ccc(C(F)(F)F)cc3,4.99517458001903 +CC1=C(C(=C(C(=C1F)F)COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)F)F,4.9591800647055 +CC1=CC(=C(C=C1)N=CN(C)C=NC2=C(C=C(C=C2)C)C)C,4.45886884853594 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,5.57739312594126 +CC(C)N(C(C)C)C(=O)SCC(Cl)=C(Cl)Cl,4.38691132629296 +S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O),5.14932086869605 +CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2CCC(F)(F)F,3.72005974473228 +O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12,3.77865560759679 +CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1,4.34489545637121 +O=C(ON=CC(SC)(C)C)NC,6.27935493374302 +ClC(Cl)(Cl)CC1(OC1)c2cc(Cl)cc(Cl)c2,4.02860782189294 +CCC1CCCC(C(C(=O)C2CC3C(C2CC(=O)O1)CCC4C3CC(C4)OC5CC(C(C(C5OC)OC)OC)C)C)OC6CCC(C(O6)C)N(C)C,4.48549336200642 +CC(C)(C)C(=NOC(=O)NC)CSC,4.56093515068149 +CON=C(CC1=CN=CC=C1)C2=C(C=C(C=C2)Cl)Cl,3.81685069684023 +CC(=CC1C(C1(C)C)C(=O)OCN2C(=O)C3=C(C2=O)CCCC3)C,3.12242048929166 +C1COC(O1)(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl,4.47732480426449 +CCCOC(=O)C1=CN=C(C=C1)C(=O)OCCC,3.00221511481659 +CC1=CC(=NC(=N1)NC(=O)NS(=O)(=O)C2=CC=CC=C2C(=O)OC3COC3)C,3.68988952034363 +C1=C(C(=NC(=C1Cl)Cl)OCC(=O)O)Cl,3.85273501931079 +CCOCN1C(=C(C(=C1C(F)(F)F)Br)C#N)C2=CC=C(C=C2)Cl,4.47670895789257 +CC(C)CC1=C(C(=NC(=C1C(=O)SC)C(F)(F)F)C(F)F)C(=O)SC,5.04368703263975 +CC12CC1(C(=O)N(C2=O)C3=CC(=CC(=C3)Cl)Cl)C,4.27743796844594 +CC1=CC(=C(C=C1)C(=O)OC)C2=NC(C(=O)N2)(C)C(C)C,3.76093729967937 +COP(=S)(OC)OC1=NC(=C(C=C1Cl)Cl)Cl,5.03145309127161 +CC(C)CC1=C(C(=NC(=C1C(=O)OC)C(F)F)C(F)(F)F)C2=NCCS2,3.95268441956944 +CCOC(=O)C(CC1=CC(=C(C=C1Cl)F)N2C(=O)N(C(=N2)C)C(F)F)Cl,4.53591743757444 +CC(C)=CC3C(C(=O)OCc2coc(Cc1ccccc1)c2)C3(C)C,3.4325717246993 +CCCSP(=S)(OCC)OC1=CC=C(C=C1)SC,4.44776025923588 +CC1=CC(=C(C(=C1)OC(=O)NC)C)C,3.513780491163 +CC1=CC=CC=C1COC2CC3(CCC2(O3)C)C(C)C,3.26228942932097 +CC1=C2C(=CC=C1)SC3=NN=CN23,3.78564431476757 +CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl,3.55619540984755 +CCCN(CCC)C(=O)SCC,4.32294999482974 +CC(C)OC(=O)C=C(C)C=CCC(C)CCCC(C)(C)OC,3.82926385227003 +COP(=S)(OC)Oc1ccc(SC)c(C)c1,4.87052572632858 +COC1=C(C=C(C=C1)C(=CC(=O)N2CCOCC2)C3=CC=C(C=C3)Cl)OC,3.92309028461827 +CCSC(=O)N(CC(C)C)CC(C)C,3.33720244245390 +CC(C)OP(=S)(OC(C)C)SCCNS(=O)(=O)C1=CC=CC=C1,4.42326053700057 +CC(=CC1C(C1(C)C)C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C,3.36853572230648 +CC1=CC(=CC(=C1C)C)OC(=O)NC,4.28610219788592 +CCOP(=S)(OCC)SCSC1=CC=C(C=C1)Cl,5.53512353543065 +C1CN(CCN1C(C(Cl)(Cl)Cl)NC=O)C(C(Cl)(Cl)Cl)NC=O,3.63845107729718 +C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3,5.00270088682186 +C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-],3.37340446386955 +CCCC(=NOCC)C1C(=O)CC(CC1=O)CC(C)SCC,4.29612718117234 +ClC2(Cl)C4(Cl)C1(Cl)C5(Cl)C(Cl)(Cl)C3(Cl)C1(Cl)C2(Cl)C3(Cl)C45Cl,5.89173094758972 +CCN(C1CCCCC1)C(=O)SCC,4.85603479370532 +CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2OCCCl,3.260038251795 +C(C(=O)O)OC1=NC(=C(C(=C1Cl)N)Cl)F,2.70762229375841 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC#C,3.49996484386965 +C1C(COC1(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl)Br,4.76483992624863 +C1=NNC(=N1)N,4.52675248773797 +C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F,4.16607614499238 +C1=CC(=CC=C1OS(=O)(=O)C2=CC=C(C=C2)Cl)Cl,5.08373349418451 +FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O,2.52540641675307 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C,3.60553192639024 +C1=CC(=C(C(=C1)Cl)C#N)Cl,4.83761727241192 +C1C(O1)COC2=CC=CC=C2C3=CC=CC=C3,2.65565785542345 +CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC,2.92199532671878 +O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N,3.97297179822463 +C1=CC(=C(C2=NC=C(C=C21)Cl)C(=O)O)Cl,2.50482391995124 +CC(C)NC(=O)N1CC(=O)N(C1=O)C2=CC(=CC(=C2)Cl)Cl,3.85597533208895 +CCCN(CCCl)C1=C(C=C(C=C1[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-],3.24487034075484 +C1=CC=C(C=C1)C2=CC=CC=C2O,2.23097792739447 +O=C(N(C)C)Nc(cccc1C(F)(F)F)c1,4.18977535089103 +C1=CC(=NC(=C1)Cl)C(Cl)(Cl)Cl,5.36343657222619 +Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2,4.7008945110302 +CC1=CC(=C(C=C1NC(=O)C)NS(=O)(=O)C(F)(F)F)C,4.05086251778066 +C(=C(I)I)(I)I,4.02664705683052 +C1=C(C=C(C(=C1Cl)N2C(=C(C(=N2)C#N)S(=O)C(F)(F)F)N)Cl)C(F)(F)F,6.8624770260417 +O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1,4.57165200886706 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C,4.09142710541740 +CC1=CC2=C(C=C1)N=C3C(=N2)SC(=O)S3,4.49470628000702 +CC(C)N(C(=O)CCl)c1ccccc1,3.96396832169828 +CC(C)C1(C(=O)NC(=N1)C2=C(C=CC=N2)C(=O)O)C,2.71813034538638 +CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C,4.25443178297333 +CN1CN(C(=S)SC1)C,3.73313384224274 +ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,3.74434218472656 +ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl,6.28927348401756 +CCOC(=O)CN1C2=C(C=CC=C2Cl)SC1=O,4.33721159291063 +CCCN(CCC)C1=C(C=C(C(=C1[N+](=O)[O-])N)C(F)(F)F)[N+](=O)[O-],4.0760849833355 +C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N,3.92533540454444 +CC(C)(C)C(CCC1=CC=C(C=C1)Cl)(CN2C=NC=N2)O,4.28689742390489 +CC1=C(C=CC=C1COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)C3=CC=CC=C3,4.92723460128442 +C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3,3.70167089115788 +C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-],3.13990879364539 +CC1=C(C=C(C=C1C(=O)N)[N+](=O)[O-])[N+](=O)[O-],4.55660790505055 +CC(C)OC1=CC=CC(=C1)NC(=O)C2=CC=CC=C2C(F)(F)F,2.81064866255668 +OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl,5.17083139418745 +O=P(O)(O)CCCl,2.51051495802278 +CN(C(=O)NC1=CC=C(C=C1)Br)OC,4.31655713179121 +CC1=CC(=CC=C1)NC(=O)OC2=CC=CC(=C2)NC(=O)OC,4.0796286862285 +CC(C)(C)C1=NN=C(S1)N2C(CN(C2=O)C)O,3.70982035175725 +S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1,5.32917717728496 +COC(=O)c1ccccc1S(=O)(=O)NC(=O)N(C)c2nc(OC)nc(C)n2,4.50011608554638 +C1=CC=C(C(=C1)NC2=NC(=NC(=N2)Cl)Cl)Cl,5.37945812670042 +CC1=C(C=CC(=C1)OP(=S)(OC)OC)[N+](=O)[O-],5.78008872366218 +COc1c(Cl)ccc(Cl)c1C(=O)(O),3.28376800169458 +CC1(C(C1C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Br)Br)C,5.30552261110582 +C1=CC=C(C(=C1)C(C2=CC=C(C=C2)F)(C3=CN=CN=C3)O)Cl,5.10001384041789 +c1ccc2nc(NC(=O)OC)n(C(=O)NCCCC)c2c1,3.40217570413585 +CCOC(=O)COC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],4.25309221972639 +CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)C3=CC=CC=C3)O,4.13022504615292 +CCNC(=O)NC(=O)C(=NOC)C#N,3.81561566158005 +CCOC1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],3.95628893719942 +CC1=NC=C(N1CCO)[N+](=O)[O-],3.05729569283336 +O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12,2.77313899543591 +CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2,3.54465374823881 +CCCCC(CN1C=NC=N1)(C2=C(C=C(C=C2)Cl)Cl)O,4.82512253178873 +CC(C)(C)C(C(=CC1=C(C=C(C=C1)Cl)Cl)N2C=NC=N2)O,3.81454188371475 +C1=CC(C2C1C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl)Cl,5.9922949848715 +C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N,4.47176647572299 +CC1=NN(C(=C1C=NOCC2=CC=C(C=C2)C(=O)OC(C)(C)C)OC3=CC=CC=C3)C,5.13623540476555 +CS(=O)(=O)C1=C(C=CC(=C1)C(F)(F)F)C(=O)C2=C(ON=C2)C3CC3,4.25445174537182 +CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C,4.28018891498254 +CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC,5.30057855955201 +C1=CC(=CC=C1C(CN)O)O,2.78725763359614 +CC1=C(C(=CC=C1)C)N(C(=O)COC)N2CCOC2=O,3.74554900711723 +c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2,4.20939714153443 +CCC(C)NC1=C(C=C(C=C1[N+](=O)[O-])C(C)(C)C)[N+](=O)[O-],3.77134379610358 +C1=CC(=CC=C1S(=O)(=O)C2=CC(=C(C=C2Cl)Cl)Cl)Cl,3.18978539843532 +CCCCC1=C(NC(=NC1=O)NCC)C,3.92280444363211 +n(c(nc(n1)NCC)NCC)c1Cl,4.58033674324961 +FC(F)(F)C(C=C1N(=O)=O)=CC(N(=O)=O)=C1N(CC)CC(C)=C,4.42587730748324 +C1CCC(C1)N(CC2=CC=C(C=C2)Cl)C(=O)NC3=CC=CC=C3,4.11903913677133 +CS(=O)(=O)NC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],3.94325990345253 +CCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC3=C(O2)C=C(C=C3)Cl,4.60419765136131 +CCC1=C(C(=CC=C1)CC)N(CNC(=O)C)C(=O)CCl,3.67657281690409 +NC(=N)NCCCCCCCCCCCC(OC(=O)C),3.99309483347533 +C1=CC(=CC(=C1)Cl)NC(=O)OCC#CCCl,2.75857660132254 +CC(C)C(C(=O)OC(C(#N))c2cccc(Oc1ccccc1)c2)c3ccc(Cl)cc3,4.22520594870835 +CC(C)C1=C(C=CC(=C1)C(C)(C)C2=CC(=C(C=C2)O)C(C)C)O,4.09683471023993 +CCN(CC1=C(C=CC=C1Cl)F)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-],3.92606530797808 +CCCCCCCCSC(=O)OC1=CC(=NN=C1C2=CC=CC=C2)Cl,3.74923930876524 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C,4.3407141033807 +CCCCNC(=O)N1C2=CC=CC=C2N=C1NC(=O)OC,3.06493353581742 +CC1=C(C(=CC=C1)C)N(C(C)C(=O)OC)C(=O)CC2=CC=CC=C2,3.84966174557959 +CC(C)C(C1=CC=C(C=C1)OC(F)F)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3,4.87646988000983 +Clc1ccccc1c2nnc(c3ccccc3Cl)nn2,4.1806220183605 +CCOC(=O)NCCOC1=CC=C(C=C1)OC2=CC=CC=C2,4.4790525467538 +CCC1=C(C(=CC=C1)CC)N(CC(=O)OCC)C(=O)CCl,3.79491137150459 +c1(O2)c(CC2(C)C)cccc1OC(=O)N(C)SN(CCCC)CCCC,4.18246564622765 +CCCCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC=C(C=C2)C(F)(F)F,5.10648736510651 +COC1=CC(=C(C=C1Cl)OC)Cl,3.21917344408706 +CCOP(=S)(OCC)OC1=NN(C(=N1)Cl)C(C)C,4.39966173548004 +n(c(nc(n1)NC(C)C)NCC)c1Cl,3.93587643048823 +CC(C)(C)C(C(=CC1=CC=C(C=C1)Cl)N2C=NC=N2)O,3.8694430122441 +CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O),3.8625999735624 +c1cc(OC(F)(F)F)ccc1C(O)(C(C)C)c2cncnc2,4.41176854866759 +COP(=O)(C(C(Cl)(Cl)Cl)O)OC,4.10964043198952 +C1=CC(=C(C=C1C(F)(F)F)Cl)OC2=CC(=C(C=C2)[N+](=O)[O-])C(=O)O,3.46138721019571 +CCCN(CC1CC1)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-],4.8417219607834 +CCOC(=O)C(C)OC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],3.96545863474241 +CCSC(=O)N1CCCCCC1,4.10198823735002 +CCC1=CC=C(C=C1)C(=O)NN(C(=O)C2=CC(=CC(=C2)C)C)C(C)(C)C,3.86588082257473 +ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O),4.36681001970786 +COC(=O)C1=CC=CC=C1S(=O)(=O)NC(=O)NC2=NC(=CC(=N2)OC(F)F)OC(F)F,3.52443042732356 +CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O,4.07300621285581 +CC1=C(C=CC(=C1)Cl)OCC(=O)O,4.70031198338967 +COC=C(C1=CC=CC=C1OC2=NC=NC(=C2)OC3=CC=CC=C3C#N)C(=O)OC,3.81158305905272 +C1=CC=C(C(=C1)C(C2=CC=C(C=C2)Cl)(C3=CN=CN=C3)O)Cl,5.15835722073531 +[O-]Br(=O)=O,4.3215481796762 +OP(=O)OCC,2.4395258763695 +COP(N)(=O)SC,6.14961682124539 +CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1,5.30586339308612 +CCOP(=S)(OCC)SCCSCC,6.8363304797203 +CCOP(=S)(OCC)SCSP(=S)(OCC)OCC,5.28383935473594 +O=C(OCC(CCCC)CC)CCCCC(=O)OCC(CCCC)CC,2.39277487311710 +CN(C=Nc1ccc(C)cc1C)C=Nc2ccc(C)cc2C,4.46746902029786 [C@@]14([C@@H]5OCC1=CC=C[C@@H]([C@H](O[C@H]2C[C@@H]([C@H]([C@@H](O2)C)O[C@H]3C[C@@H]([C@H]([C@@H](O3)C)O)OC)OC)C(=CC[C@@H]6C[C@H](OC([C@@H]4C=C([C@H]5O)C)=O)C[C@]7(O6)O[C@@H]([C@H](C=C7)C)[C@H](CC)C)C)C)O,5.64002822248439 -'O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12',3.83664755457448 -'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',5.38357309992515 -'C(#N)Cl',2.94356799915553 -'C(#N)Br',2.93862388168010 -'C1=CC(=CC=C1C(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl)Cl',6.15165939778125 -'c(cccc1)(c1)C(C)C',2.56004605053309 -'CCCN(CCC)C(=O)SCC',3.87925249559703 -'NC(CCCC1)C1',3.21824710516194 -'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',4.83439806636601 -'CC(C)OC(=O)NC1=CC(=CC=C1)Cl',2.32972480951647 -'COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl',4.52109130295968 -'COC(=O)C1=CC=C(C=C1)C(=O)OC',3.19130342987610 -'N(C(=S)NC1)C1',5.611332968427 -'O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1',4.99842308366263 -'c(cccc1)(c1)C=C',2.56281074475285 -'COC(=O)c1ccccc1S(=O)(=O)NC(=O)Nc2nc(OC)nc(C)n2',3.18339945768247 -'C1=CC(=CC=C1N)Cl',4.00884378520503 -'FC(F)(F)C(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cc(Oc3ccccc3)ccc2',4.55615777900042 -'C(Cl)(Br)Br',3.86380195834146 -'C=C(Cl)Cl',3.84038967397096 -'C(C=CCl)Cl',4.33763486202989 -'COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl',3.86446577561058 -'Oc(ccc(c1)C(c(ccc(O)c2)c2)(C)C)c1',3.65950992099517 -'O=C(OCc(cccc1)c1)c(c(ccc2)C(=O)OCCCC)c2',2.82255713911138 -'O=C(NCCCC1)C1',2.95677386828604 -'c(cccc1)(c1)Cl',2.97219087736775 -'C(Cl)(Cl)Cl',3.29877173860401 -'ClCCl',3.20825373509371 -'C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl',6.48391158599853 -'OCCO',1.79286663192634 -'O=C(C=C(CC1(C)C)C)C1',2.88767656912200 -'C(F)(Cl)(Cl)Cl',2.59506047452425 -'CCc1cccc(CC)c1N(COC)C(=O)CCl',4.28486094761281 -'c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2',4.92723460128442 -'n1c(Cl)cc(OC)nc1NC(=O)NS(=O)(=O)c2ccccc2C(=O)OCC',3.52095051170688 -'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',4.60022325981506 -'c(cccc1)(c1)CC',2.56208837510252 -'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',3.87004900844397 -'Clc1cc(C(F)(F)F)cnc1Oc2ccc(OC(C)C(=O)OC)cc2',5.57487232351041 -'C#N',2.94040947259108 -'ClC(C(OC(C=C2C(=O)OC(C)C(=O)OCC)=CC=C2N(=O)=O)=C1)=CC=C1C(F)(F)F',3.96545863474241 -'c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2',3.77270454387038 -'O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N',3.88631461533234 -'CN(=CC=C1C(C=C2)=CC=N2C)C=C1',4.69607191571383 -'C1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-]',4.20441460583146 -'C(=C)Cl',4.68192429615426 -'C1CCC(=O)CC1',2.03281793688456 -'CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C',4.14541137996302 -'C1=CC(=O)NNC1(=O)',2.35058431121584 -'CCSC(=O)N1CCCCCC1',4.97151330020725 -'C(C(Cl)(Cl)Cl)(O)O',3.08555504738041 -'ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl',7.1923634710095 -'Clc1cc(C(F)(F)F)ccc1Oc2cc(OCC)c(N(=O)(=O))cc2',4.55834892852739 -'c1cc(Cl)ccc1C(C(#N))(CCCC)Cn2ncnc2',4.46756491519242 -'CC1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-]',5.055246608541 -'CC(C)OC(=O)C(C1=CC=C(C=C1)Br)(C2=CC=C(C=C2)Br)O',4.21658723866328 -'C[N+](C)(C)CCCl',2.97460527968547 -'CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl',3.62169695860399 -'CC1=NC(=NC(=C1)C2CC2)NC3=CC=CC=C3',3.80128998933051 -'N(c(cccc1)c1)c(cccc2)c2',3.83051794413252 -'CC1(C(=O)N(C(=O)O1)NC2=CC=CC=C2)C3=CC=C(C=C3)OC4=CC=CC=C4',4.34801416963502 -'CC1(CCCCC1)C(=O)NC2=C(C(=C(C=C2)O)Cl)Cl',3.01490626247445 -'C1=CC(=C2C(=C1)OC(O2)(F)F)C3=CNC=C3C#N',3.35338292576111 -'C(F)(F)(F)c1ccccc1C(=O)Nc2cccc(OC(C)C)c2',3.57009941427408 -'C(CCCCN=C(N)N)CCCNCCCCCCCCN=C(N)N',4.27216545257855 -'C1CN(C(=N1)N[N+](=O)[O-])CC2=CN=C(C=C2)Cl',4.17721556192143 -'COC(=O)C12CC3=C(C1=NN(CO2)C(=O)N(C4=CC=C(C=C4)OC(F)(F)F)C(=O)OC)C=CC(=C3)Cl',5.16619526358129 -'CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC',2.92782487037951 -'CC1=CC(=CC(=C1)C(=O)N(C(C)(C)C)NC(=O)C2=C(C(=CC=C2)OC)C)C',2.95255951099906 -'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C=C2)OC(C(OC(F)(F)F)F)(F)F)Cl)F',4.13628410350378 -'CC1=CC=C(C=C1)N(SC(F)(Cl)Cl)S(=O)(=O)N(C)C',4.28537828278078 -'CC(C)(C)C1=C(C=CC(=C1)O)O',2.86849281697225 -'CC(=NOCC1=CC=CC=C1C(=NOC)C(=O)OC)C2=CC(=CC=C2)C(F)(F)F',3.83290371721801 -'COC(=O)N(C1=CC=CC=C1COC2=NN(C=C2)C3=CC=C(C=C3)Cl)OC',4.63438424347854 -'CC(C)N1C(=NC(C)(C)C)SCN(C1=O)C2=CC=CC=C2',4.54540426969100 -'C1=CC=C(C(=C1)C2=NN=C(N=N2)C3=CC=CC=C3Cl)Cl',4.24360591089568 -'CCCC(=C1C(=O)CC(CC1=O)C2CCCSC2)NOCC',4.0653478352871 -'C1CC1NC2=NC(=C(C(=N2)N)C#N)N',3.93679970507275 -'C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3',5.50950218614247 -'C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N',4.69361522533935 -'CCOC1=CC2=C(C=C1)NC(C=C2C)(C)C',4.25789199055837 -'C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N',4.05027414115274 -'CC1CN(CC(O1)C)CC(C)CC2=CC=C(C=C2)C(C)(C)C',5.25168418782516 -'C[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F',5.19782165018731 -'c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2',4.29692796857781 -'CN(=CC=C1C(C=C2)=CC=N2C)C=C1',4.86356300300759 -'CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2',3.52947976153744 -'Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2',3.5520346361573 -'C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3',3.82660962776618 -'CCOC1=CC=C(C=C1)C(C)(C)COCC2=CC(=CC=C2)OC3=CC=CC=C3',4.16077781336093 -'CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2',4.26590014728598 -'CC(COC1=CC=C(C=C1)OC2=CC=CC=C2)OC3=CC=CC=N3',3.36087697276960 -'CC(C)(C)C(=O)C(N1C=NC=N1)OC2=CC=C(C=C2)Cl',3.41107116109321 -'CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O',3.44975692245790 -'c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2',4.7231146186285 -'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',4.85962620215948 -'CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C',4.5585962064955 -'ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2',3.92043344378224 -'ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl',6.21460930807761 -'ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl',6.58082159900658 -'C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl',6.18288159033454 -'C1(C(C(C(C(C1Cl)Cl)Cl)Cl)Cl)Cl',4.79154110643314 -'CCC(=O)Nc1ccc(Cl)c(Cl)c1',3.45780196740732 -'C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-]',3.32418644119937 -'C1C2C(COS(=O)O1)C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl',5.14711652367221 -'O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12',3.77313899543591 -'CC(C(=O)O)OC1=CC=C(C=C1)OC2=C(C=C(C=N2)C(F)(F)F)Cl',6.55834892852739 -'CCCCC(CN1C=NC=N1)(C#N)C2=CC=C(C=C2)Cl',4.46933393793126 -'Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2',4.86838559832397 -'COP(=O)(NC(=O)(C))SC',4.86490452310016 -'CCOP(=O)(OCC)OC(=CCl)C1=C(C=C(C=C1)Cl)Cl',5.3796920956126 -'CCOP(=S)(OCC)SCCSCC',6.09596779022605 -'O=P(O)(O)CCCl',4.0806685706873 -'CCCSP(=O)(OCC)SCCC',4.95305958493745 -'CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1',5.25150573076352 -'COP(=S)(OC)Oc1ccc(SC)c(C)c1',5.58722449762503 -'OC(=O)C(N)CCP(C)(=O)O',4.71391476838473 -'OC(=O)CNCP(O)(O)=O',2.75095321211059 -'CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC',2.96268235505315 -'COP(N)(=O)SC',5.68721882334643 -'CC(=CC(=O)OC)OP(=O)(OC)OC',5.80646736824669 -'CCOP(=S)(OCC)SCSCC',6.2114833717655 -'CCOP(=S)(OCC)SCSC(C)(C)C',6.68189008451404 -'S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O)',5.08988368084419 -'CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl',5.54479494223028 -'CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C',4.71993889259734 -'CCC1=NC(=CC(=N1)OP(=S)(OC)OC)OCC',5.8126040303238 -'S=P(OC)(OC)SCN1C(=O)SC(OC)=N1',5.27636313027728 -'CCOP(=S)(OCC)SCN1C2=C(C=C(C=C2)Cl)OC1=O',5.26459183786176 -'COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O)',4.54725636091897 -'CCOC(=O)C1=CN2C(=CC(=N2)OP(=S)(OCC)OCC)N=C1C',4.97007298557879 -'CCOP(=S)(OCC)OC1=NN(C=N1)C2=CC=CC=C2',5.38203437103643 -'O=C(Oc(c(c(ccc1)cc2)c1)c2)NC',3.52552257057249 -'CC1=CC(=CC(=C1SC)C)OC(=O)NC',4.38429231462288 -'CNC(=O)ON=C(C)SC',3.90904789636717 -'CCCOC(=O)NCCCN(C)C',2.44226598159187 -'COC(=O)NC1=NC2=CC=CC=C2N1',3.40639632281981 -'CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C',4.2871938165512 -'CNC(=O)CCSCCSP(=O)(OC)OC',5.72599715999116 -'N(C(=S)SSC(N(C)C)=S)(C)C',4.30181261256647 -'C1=NNC(=N1)N',4.22572249207399 -'CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O)',3.75539000391453 -'C1=CC=C(C=C1)[Sn](C2=CC=CC=C2)C3=CC=CC=C3',6.0669625480302 -'O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2',4.64721982249128 -'N(C(=S)NC1)C1',4.91236296409098 -'C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F',4.18310948429116 -'CCCSC1=CC2=C(C=C1)N=C(N2)NC(=O)OC',4.12275865288522 -'C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3',3.45437537377312 -'CC1(C2C(C3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C(C=CC(=C41)Cl)O)O)O)N(C)C)O)O',1.97849569899962 -'CC1=CC(=C(C=C1NC(=O)C2=CC(=CC(=C2O)I)I)Cl)C(C#N)C3=CC=C(C=C3)Cl',4.82156180249896 -'CN1CC2CC1CN2C3=C(C=C4C(=C3)N(C=C(C4=O)C(=O)O)C5CC5)F',3.85415878578584 -'C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl',4.43418336046643 -'CC1=NC=C(N1C)[N+](=O)[O-]',3.97352186635665 -'CCN1CCN(CC1)C2=C(C=C3C(=C2)N(C=C(C3=O)C(=O)O)C4CC4)F',4.14059829999974 -'CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O',5.95429183284051 -'COCC(=O)NC1=C(C=CC(=C1)SC2=CC=CC=C2)NC(=NC(=O)OC)NC(=O)OC',4.04773898332238 -'CC1CCC2=C3N1C=C(C(=O)C3=CC(=C2)F)C(=O)O',2.81499362006104 -'COC(=O)NC1=NC2=C(N1)C=C(C=C2)S(=O)C3=CC=CC=C3',5.1977587356423 -'CC1(C2CC3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C1C=CC=C4O)O)O)N(C)C)O',3.47171656401627 -'C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3',4.03795195940707 -'CC(C)NCC(COC1=CC=CC2=C1C3=CC=CC=C3N2)O',4.62967091273678 -'C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl',4.24854678350451 -'CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O',5.55635182416848 -'COP(=S)(OC)Oc1ccc(SC)c(C)c1',5.79134448028095 -'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',4.56054897737691 -'C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl',4.86157897304089 -'CC(N(C)C)CN(C(=CC=C3)C1=C3)C(=CC=C2)C(=C2)S1',4.23385066979149 -'C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-]',2.93578881098946 -'c(cccc1)(c1)C=C',2.41559561343340 +O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12,3.83664755457448 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,5.38357309992515 +C(#N)Cl,2.94356799915553 +C(#N)Br,2.93862388168010 +C1=CC(=CC=C1C(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl)Cl,6.15165939778125 +c(cccc1)(c1)C(C)C,2.56004605053309 +CCCN(CCC)C(=O)SCC,3.87925249559703 +NC(CCCC1)C1,3.21824710516194 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,4.83439806636601 +CC(C)OC(=O)NC1=CC(=CC=C1)Cl,2.32972480951647 +COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl,4.52109130295968 +COC(=O)C1=CC=C(C=C1)C(=O)OC,3.19130342987610 +N(C(=S)NC1)C1,5.611332968427 +O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1,4.99842308366263 +c(cccc1)(c1)C=C,2.56281074475285 +COC(=O)c1ccccc1S(=O)(=O)NC(=O)Nc2nc(OC)nc(C)n2,3.18339945768247 +C1=CC(=CC=C1N)Cl,4.00884378520503 +FC(F)(F)C(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cc(Oc3ccccc3)ccc2,4.55615777900042 +C(Cl)(Br)Br,3.86380195834146 +C=C(Cl)Cl,3.84038967397096 +C(C=CCl)Cl,4.33763486202989 +COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl,3.86446577561058 +Oc(ccc(c1)C(c(ccc(O)c2)c2)(C)C)c1,3.65950992099517 +O=C(OCc(cccc1)c1)c(c(ccc2)C(=O)OCCCC)c2,2.82255713911138 +O=C(NCCCC1)C1,2.95677386828604 +c(cccc1)(c1)Cl,2.97219087736775 +C(Cl)(Cl)Cl,3.29877173860401 +ClCCl,3.20825373509371 +C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl,6.48391158599853 +OCCO,1.79286663192634 +O=C(C=C(CC1(C)C)C)C1,2.88767656912200 +C(F)(Cl)(Cl)Cl,2.59506047452425 +CCc1cccc(CC)c1N(COC)C(=O)CCl,4.28486094761281 +c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2,4.92723460128442 +n1c(Cl)cc(OC)nc1NC(=O)NS(=O)(=O)c2ccccc2C(=O)OCC,3.52095051170688 +O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2,4.60022325981506 +c(cccc1)(c1)CC,2.56208837510252 +O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12,3.87004900844397 +Clc1cc(C(F)(F)F)cnc1Oc2ccc(OC(C)C(=O)OC)cc2,5.57487232351041 +C#N,2.94040947259108 +ClC(C(OC(C=C2C(=O)OC(C)C(=O)OCC)=CC=C2N(=O)=O)=C1)=CC=C1C(F)(F)F,3.96545863474241 +c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2,3.77270454387038 +O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N,3.88631461533234 +CN(=CC=C1C(C=C2)=CC=N2C)C=C1,4.69607191571383 +C1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-],4.20441460583146 +C(=C)Cl,4.68192429615426 +C1CCC(=O)CC1,2.03281793688456 +CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C,4.14541137996302 +C1=CC(=O)NNC1(=O),2.35058431121584 +CCSC(=O)N1CCCCCC1,4.97151330020725 +C(C(Cl)(Cl)Cl)(O)O,3.08555504738041 +ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl,7.1923634710095 +Clc1cc(C(F)(F)F)ccc1Oc2cc(OCC)c(N(=O)(=O))cc2,4.55834892852739 +c1cc(Cl)ccc1C(C(#N))(CCCC)Cn2ncnc2,4.46756491519242 +CC1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-],5.055246608541 +CC(C)OC(=O)C(C1=CC=C(C=C1)Br)(C2=CC=C(C=C2)Br)O,4.21658723866328 +C[N+](C)(C)CCCl,2.97460527968547 +CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl,3.62169695860399 +CC1=NC(=NC(=C1)C2CC2)NC3=CC=CC=C3,3.80128998933051 +N(c(cccc1)c1)c(cccc2)c2,3.83051794413252 +CC1(C(=O)N(C(=O)O1)NC2=CC=CC=C2)C3=CC=C(C=C3)OC4=CC=CC=C4,4.34801416963502 +CC1(CCCCC1)C(=O)NC2=C(C(=C(C=C2)O)Cl)Cl,3.01490626247445 +C1=CC(=C2C(=C1)OC(O2)(F)F)C3=CNC=C3C#N,3.35338292576111 +C(F)(F)(F)c1ccccc1C(=O)Nc2cccc(OC(C)C)c2,3.57009941427408 +C(CCCCN=C(N)N)CCCNCCCCCCCCN=C(N)N,4.27216545257855 +C1CN(C(=N1)N[N+](=O)[O-])CC2=CN=C(C=C2)Cl,4.17721556192143 +COC(=O)C12CC3=C(C1=NN(CO2)C(=O)N(C4=CC=C(C=C4)OC(F)(F)F)C(=O)OC)C=CC(=C3)Cl,5.16619526358129 +CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC,2.92782487037951 +CC1=CC(=CC(=C1)C(=O)N(C(C)(C)C)NC(=O)C2=C(C(=CC=C2)OC)C)C,2.95255951099906 +C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C=C2)OC(C(OC(F)(F)F)F)(F)F)Cl)F,4.13628410350378 +CC1=CC=C(C=C1)N(SC(F)(Cl)Cl)S(=O)(=O)N(C)C,4.28537828278078 +CC(C)(C)C1=C(C=CC(=C1)O)O,2.86849281697225 +CC(=NOCC1=CC=CC=C1C(=NOC)C(=O)OC)C2=CC(=CC=C2)C(F)(F)F,3.83290371721801 +COC(=O)N(C1=CC=CC=C1COC2=NN(C=C2)C3=CC=C(C=C3)Cl)OC,4.63438424347854 +CC(C)N1C(=NC(C)(C)C)SCN(C1=O)C2=CC=CC=C2,4.54540426969100 +C1=CC=C(C(=C1)C2=NN=C(N=N2)C3=CC=CC=C3Cl)Cl,4.24360591089568 +CCCC(=C1C(=O)CC(CC1=O)C2CCCSC2)NOCC,4.0653478352871 +C1CC1NC2=NC(=C(C(=N2)N)C#N)N,3.93679970507275 +C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3,5.50950218614247 +C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N,4.69361522533935 +CCOC1=CC2=C(C=C1)NC(C=C2C)(C)C,4.25789199055837 +C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N,4.05027414115274 +CC1CN(CC(O1)C)CC(C)CC2=CC=C(C=C2)C(C)(C)C,5.25168418782516 +C[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F,5.19782165018731 +c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2,4.29692796857781 +CN(=CC=C1C(C=C2)=CC=N2C)C=C1,4.86356300300759 +CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2,3.52947976153744 +Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2,3.5520346361573 +C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3,3.82660962776618 +CCOC1=CC=C(C=C1)C(C)(C)COCC2=CC(=CC=C2)OC3=CC=CC=C3,4.16077781336093 +CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2,4.26590014728598 +CC(COC1=CC=C(C=C1)OC2=CC=CC=C2)OC3=CC=CC=N3,3.36087697276960 +CC(C)(C)C(=O)C(N1C=NC=N1)OC2=CC=C(C=C2)Cl,3.41107116109321 +CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O,3.44975692245790 +c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2,4.7231146186285 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,4.85962620215948 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,4.5585962064955 +ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,3.92043344378224 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,6.21460930807761 +ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl,6.58082159900658 +C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl,6.18288159033454 +C1(C(C(C(C(C1Cl)Cl)Cl)Cl)Cl)Cl,4.79154110643314 +CCC(=O)Nc1ccc(Cl)c(Cl)c1,3.45780196740732 +C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-],3.32418644119937 +C1C2C(COS(=O)O1)C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl,5.14711652367221 +O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12,3.77313899543591 +CC(C(=O)O)OC1=CC=C(C=C1)OC2=C(C=C(C=N2)C(F)(F)F)Cl,6.55834892852739 +CCCCC(CN1C=NC=N1)(C#N)C2=CC=C(C=C2)Cl,4.46933393793126 +Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2,4.86838559832397 +COP(=O)(NC(=O)(C))SC,4.86490452310016 +CCOP(=O)(OCC)OC(=CCl)C1=C(C=C(C=C1)Cl)Cl,5.3796920956126 +CCOP(=S)(OCC)SCCSCC,6.09596779022605 +O=P(O)(O)CCCl,4.0806685706873 +CCCSP(=O)(OCC)SCCC,4.95305958493745 +CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1,5.25150573076352 +COP(=S)(OC)Oc1ccc(SC)c(C)c1,5.58722449762503 +OC(=O)C(N)CCP(C)(=O)O,4.71391476838473 +OC(=O)CNCP(O)(O)=O,2.75095321211059 +CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC,2.96268235505315 +COP(N)(=O)SC,5.68721882334643 +CC(=CC(=O)OC)OP(=O)(OC)OC,5.80646736824669 +CCOP(=S)(OCC)SCSCC,6.2114833717655 +CCOP(=S)(OCC)SCSC(C)(C)C,6.68189008451404 +S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O),5.08988368084419 +CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl,5.54479494223028 +CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C,4.71993889259734 +CCC1=NC(=CC(=N1)OP(=S)(OC)OC)OCC,5.8126040303238 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,5.27636313027728 +CCOP(=S)(OCC)SCN1C2=C(C=C(C=C2)Cl)OC1=O,5.26459183786176 +COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O),4.54725636091897 +CCOC(=O)C1=CN2C(=CC(=N2)OP(=S)(OCC)OCC)N=C1C,4.97007298557879 +CCOP(=S)(OCC)OC1=NN(C=N1)C2=CC=CC=C2,5.38203437103643 +O=C(Oc(c(c(ccc1)cc2)c1)c2)NC,3.52552257057249 +CC1=CC(=CC(=C1SC)C)OC(=O)NC,4.38429231462288 +CNC(=O)ON=C(C)SC,3.90904789636717 +CCCOC(=O)NCCCN(C)C,2.44226598159187 +COC(=O)NC1=NC2=CC=CC=C2N1,3.40639632281981 +CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C,4.2871938165512 +CNC(=O)CCSCCSP(=O)(OC)OC,5.72599715999116 +N(C(=S)SSC(N(C)C)=S)(C)C,4.30181261256647 +C1=NNC(=N1)N,4.22572249207399 +CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O),3.75539000391453 +C1=CC=C(C=C1)[Sn](C2=CC=CC=C2)C3=CC=CC=C3,6.0669625480302 +O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2,4.64721982249128 +N(C(=S)NC1)C1,4.91236296409098 +C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F,4.18310948429116 +CCCSC1=CC2=C(C=C1)N=C(N2)NC(=O)OC,4.12275865288522 +C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3,3.45437537377312 +CC1(C2C(C3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C(C=CC(=C41)Cl)O)O)O)N(C)C)O)O,1.97849569899962 +CC1=CC(=C(C=C1NC(=O)C2=CC(=CC(=C2O)I)I)Cl)C(C#N)C3=CC=C(C=C3)Cl,4.82156180249896 +CN1CC2CC1CN2C3=C(C=C4C(=C3)N(C=C(C4=O)C(=O)O)C5CC5)F,3.85415878578584 +C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl,4.43418336046643 +CC1=NC=C(N1C)[N+](=O)[O-],3.97352186635665 +CCN1CCN(CC1)C2=C(C=C3C(=C2)N(C=C(C3=O)C(=O)O)C4CC4)F,4.14059829999974 +CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O,5.95429183284051 +COCC(=O)NC1=C(C=CC(=C1)SC2=CC=CC=C2)NC(=NC(=O)OC)NC(=O)OC,4.04773898332238 +CC1CCC2=C3N1C=C(C(=O)C3=CC(=C2)F)C(=O)O,2.81499362006104 +COC(=O)NC1=NC2=C(N1)C=C(C=C2)S(=O)C3=CC=CC=C3,5.1977587356423 +CC1(C2CC3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C1C=CC=C4O)O)O)N(C)C)O,3.47171656401627 +C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3,4.03795195940707 +CC(C)NCC(COC1=CC=CC2=C1C3=CC=CC=C3N2)O,4.62967091273678 +C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl,4.24854678350451 +CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O,5.55635182416848 +COP(=S)(OC)Oc1ccc(SC)c(C)c1,5.79134448028095 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,4.56054897737691 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,4.86157897304089 +CC(N(C)C)CN(C(=CC=C3)C1=C3)C(=CC=C2)C(=C2)S1,4.23385066979149 +C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-],2.93578881098946 +c(cccc1)(c1)C=C,2.41559561343340 diff --git a/test/data/LOAEL_mmol_corrected_smiles.csv b/test/data/LOAEL_mmol_corrected_smiles.csv new file mode 100644 index 0000000..c6d858b --- /dev/null +++ b/test/data/LOAEL_mmol_corrected_smiles.csv @@ -0,0 +1,568 @@ +SMILES,LOAEL mmol/kg_bw/day +C1=C(C(=CC(=C1NN=C3C2=C(C=C([S]([O-])(=O)=O)C=C2)C=CC3=O)OC)[S]([O-])(=O)=O)C.[Na+].[Na+],0.007531928608839286 +O1C(=O)C(O)=C(O)C1C(O)CO,0.017323010613197083 +C1(C)=C(C=CC(C)=CC=CC(C)=CC=CC=C(C)C=CC=C(C)C(=O)OC)C(C)(C)CCC1,0.0011194097182405476 +c(cccc1)(c1)C(C)C,0.003843863272285792 +O=C(OCCCC)c(c(ccc1)C(=O)OCCCC)c1,0.0021556100397968547 +O=C(OCC)c(c(ccc1)C(=O)OCC)c1,0.019956158547022596 +O=C(OC(OC(OC1C)C)C1)C,0.0007175892491582414 +Oc(c(ccc1)C)c1C,4.911414454620217e-05 +Oc(ccc(c1C)C)c1,0.00011459967060780387 +O=C(OCC)C=C,0.002477130986890969 +c(cccc1)(c1)CC,0.00384307445956764 +OCCO,0.004027850816139285 +c(ccc1C(=O)OCC(=O)OCC)cc1C(=O)OCC,0.008919866912731327 +O=C,0.002730968314772715 +O=C(O)C=CC(=O)O,0.009313172081918767 +OCC(O)CO,0.07473899985905673 +O=C(OC)c(ccc(O)c1)c1,0.009858865736182571 +O=C(OCCC)c(ccc(O)c1)c1,0.008324062177858799 +CC(CCC(=O)(O))C3CCC4C2CCC1CC(O)CCC1(C)C2CCC34C,0.001327765217118838 +OC(C(CCC1C)C(C)C)C1,0.0037948308388560167 +O=C(O)C(=C)C,0.0028807316686731447 +O=C(OC)c(c(O)ccc1)c1,0.002366127776683785 +Oc(cccc1)c1,0.0036552488310642134 +O=C(OCCC)c(cc(O)c(O)c1O)c1,0.004071644352421929 +OCC(O)C1C(O)=C(O)C(=O)O1,0.008823323006525195 +c(cccc1)(c1)C=C,0.00020163396483810836 +O=Cc(occ1)c1,0.0006244532131552316 +NCCNc1cccc2ccccc12,0.00042415433290295584 +CN(C)(C)CCCl,0.002242766507128513 +O=C(Nc(ccc(c1)C(=O)CCl)c1)C,0.007465334624174676 +c(ccc(c1)Cl)(c1)C(c(ccc(c2)Cl)c2)C(Cl)(Cl)Cl,9.027148189044099e-05 +CC(Oc1cc(Cl)c(Cl)cc1Cl)C(=O)(O),3.2280916101231376e-05 +O=N(=O)C(=CC=C1OC)C=C1N=NC(C(O)=C2C(=O)NC(=CC=C4)C=C4N(=O)=O)=C(C=C3)C(=C2)C=C3,0.004308389780762073 +O=N(=O)C(C=C1)=CC(OCCO)=C1NCCO,0.0009453881078267498 +Cc1cccc(CC)c1N(C(=O)CCl)COCC,0.00018534506246313786 +C1=C(C(=CC=C1OC2=CC=C(C=C2Cl)C(F)(F)F)[N+](=O)[O-])C(=O)[O-].[Na+],0.0004691898654989019 +CCc1cccc(CC)c1N(COC)C(=O)CCl,5.560351873894229e-05 +O=C(Nc(ccc(OCC)c1N)c1)C,0.0061010029534003226 +Oc(ccc(N)c1)c1,0.00628631814927864 +CC(N)CC(=CC=C1)C=C1,3.6980547196719036e-05 +O(c(ccc(c1)C=CC)c1)C,0.002321161271586114 +COc1ccc(N)cc1,0.0038488877932280246 +O=C(O)c(c(N)ccc1)c1,0.0200603809445196 +Clc2cccc(c2)c1ccccc1,2.1202965065040615e-05 +O=C(NC(C(=O)OC)Cc(cccc1)c1)C(N)CC(=O)O,0.0004994850207500305 +n1c2ccc(Cl)cc2ncc1Oc3ccc(OC(C)C(=O)OCC)cc3,9.924832004782749e-06 +COC(=O)NS(=O)(=O)c1ccc(N)cc1,0.0007817895162025788 +S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O),1.1344859296501293e-06 +CNC(=O)Oc1ccccc1OC(C)C,0.00023895810443138408 +CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n2cncn2,8.510674803234926e-05 +O=S(O)(=O)C(=CC=C1)C=C1CN(CC)=C(C=C2)C=CC2=C(C(C=C3)=CC=C3N(C)C)C(C=C4)=CC=C4N(CC)CC(C=C5)=CC(=C5)S(=O)(=O)O,0.00100996317449829 +c(c(cccc1)c1)(cccc2)c2,0.0016211890708511434 +BrC(Cl)Cl,0.0007935120501519125 +ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O),3.4377949341570856e-05 +O=C(Oc(c(c(ccc1)cc2)c1)c2)NC,7.75266070321401e-05 +CC1=C(SCCO1)C(=O)Nc2ccccc2,0.00012749566387247212 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,6.588923229380691e-07 +O=C(O)CCl,0.00031747032869396124 +ClC(=CC=C1N)C=C1,4.703243372306972e-05 +CC(C)OC(=O)C(O)(c1ccc(Cl)cc1)c2ccc(Cl)cc2,2.653199106614823e-05 +n1c(OC)nc(C)nc1NC(=O)NS(=O)(=O)c2ccccc2Cl,6.987675250196435e-05 +OS(=O)(=O)C(C(=CC=C2)C1=C2)=CC=C1N=NC(C(O)=C3N=NC(C(C=C5)=C4C=C5)=CC=C4S(O)(=O)=O)=CC(=C3O)CO,0.001209334683537979 +S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1,2.205280759241576e-06 +CNP(=O)(OC)Oc1ccc(cc1Cl)C(C)(C)C,1.3712205173148265e-05 +C(C1C2C(C(O)C(O1)OC8C(OC(OC7C(OC(OC6C(OC(OC5C(C(C(OC4C(C(C(OC3C(C(C(O2)OC3CO)O)O)OC4CO)O)O)OC5CO)O)O)C(C6O)O)CO)C(C7O)O)CO)C(C8O)O)CO)O)O,0.0014097040502559495 +n1c(N)nc(N)nc1NC2CC2,9.026150563412276e-05 +COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl,0.001506186328985305 +O=C(O)C(Cl)(Cl)C,0.0001970361896096649 +Nc1cc(N)c(O)cc1,0.00020138468889932168 +FC(F)(Cl)Cl,0.0012405561997662923 +ClCCl,0.0005887022388817134 +O=P(OC)(OC)OC=C(Cl)Cl,1.0408382339127476e-05 +OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl,5.398319600278167e-05 +ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl,1.312648375209102e-07 +CN(=C1C(C=C2)=CC=C2)N(C)C(=C1)C(C=C3)=CC=C3,0.0005013430378371984 +O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2,2.574969708764491e-05 +CC1=C(C)S(=O)(=O)CCS1(=O)=O,4.755763033644171e-05 +O=C(NC)CSP(OC)(OC)=S,1.090477146170362e-06 +COc1ccc(N)c(OC)c1,0.0018018201517132695 +COP(=O)OC,0.0009086866178930357 +CC(=C(N(=O)=O)C=C1N(=O)=O)C=C1,0.00018667621570414935 +CN(C)C(=O)C(c1ccccc1)c2ccccc2,0.0001253592168358418 +N(c(cccc1)c1)c(cccc2)c2,0.00018319083450161921 +C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3,3.1481176319120814e-06 +CCOP(=S)(OCC)SCCSCC,3.644261466562107e-07 +NC(=S)NNC(N)=S,0.006303842268414047 +O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1,2.5740633090871022e-05 +O=P(O)(O)CCCl,0.0010381053812746242 +O=C(OCC)C(O1)C1(c(cccc2)c2)C,0.0008485352051922901 +COC(=O)NC(=NC1=C2)NC1=CC(=C2)SC(C=C3)=CC=C3,5.010896695954994e-05 +CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1,7.591497980909371e-05 +c1cc(C(F)(F)F)cc(Cl)c1NC(C(C)C)C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,4.971041796516284e-06 +S=P(OCC)(Sc1ccccc1)CC,6.4141791096429385e-06 +n1c(C)nc(OC)nc1NC(=O)NS(=O)(=O)c2ccsc2C(=O)OC,6.453419527613866e-05 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,1.719218358061182e-05 +O=N(=O)N(CN1N(=O)=O)CN(C1)N(=O)=O,6.753217705640154e-06 +O=C(N=C(N(C1(=O))C)N(C)C)N1C(CCCC2)C2,0.00019816672003956806 +n(c(c(ccc1)cc2)c1O)c2,0.0009851335765350196 +c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2,0.00013459866849613327 +COc1cccc(OC)c1C(=O)Nc2onc(C(C)(CC)CC)c2,0.00015252975563710417 +n1c(OC)cc(OC)nc1NC(=O)NS(=O)(=O)Cc2ccccc2C(=O)OC,0.000752920821092069 +CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC,0.0001513509490359852 +CN(C)(CCC1)CC1,0.0013133857473480218 +O=P(SCCCC)(SCCCC)SCCCC,3.9744245336126525e-06 +COCC(=O)N(C(C)C(=O)OC)c1c(C)cccc1C,0.00022374845318219082 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,6.615259463326349e-06 +CNC(=O)ON=C(C)SC,6.164844235963149e-05 +COP(=S)(OC)Oc1ccc(cc1)N(=O)(=O),9.498210994862414e-07 +O=C1N(N)C(SC)=NN=C1C(C)(C)C,6.99992664076887e-05 +COP(=O)(OC)OC(Br)C(Cl)(Cl)Br,5.252325098618077e-06 +OC(C(N)C1O)C(C)OC1(C)OC(CC(C)(C(C2O)C(O)=O)OC(O)(C2)CC(O)CC(C)(O3)C3C=C4)C=CC=CC=CC=CCC(C)OC4=O,0.0001017229436608032 +O=N(=O)c(ccc(c1N)C)c1,5.2579476836834245e-05 +O=N(=O)c(c(N)ccc1N)c1,0.0005681125108300581 +O=C(O)C(=C(N)C=C1N(=O)=O)C=C1,0.006506215164982737 +O=N(=O)c(c(c(ccc1)cc2)c1)c2,0.0009528314918084262 +c12c(N=Nc3ccccc3)c(O)ccc1cc(S(=O)(=O)O)cc2,0.0005482080783455076 +CC(C)Oc1cc(c(Cl)cc1Cl)N2N=C(OC2(=O))C(C)(C)C,1.448347496337259e-05 +CNC(=O)ON=C(SC)C(=O)N(C)C,2.2803829328479105e-05 +CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O,1.20167291684791e-05 +Oc(c(c(c(c1Cl)Cl)Cl)Cl)c1Cl,3.754648160556525e-05 +NC(=N)NC(=N)NCCc1ccccc1,0.00035564719019232516 +COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O),6.30276515448593e-05 +CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC,4.1042640430422796e-05 +ClC3C6(Cl)C4C2C1OC1C5C2C3(Cl)C(Cl)(C45)C6(Cl)Cl,1.8377077252927096e-06 +O=C(OC(=O)c1cccc2)c12,0.00800050987215652 +Nc1c(Cl)c(Cl)nc(C(=O)(O))c1Cl,0.0002484891651683468 +CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1,8.187766820693496e-06 +Nc3ccc2cc1ccc(N)cc1nc2c3,0.00022461542255370235 +CCC(=O)Nc1ccc(Cl)c(Cl)c1,9.170952329114616e-05 +Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2,7.305234130124016e-05 +O=C(N)c(nccn1)c1,0.006408762052980695 +Oc1cc(O)c2C(=O)C(O)=C(c3cc(O)c(O)cc3)Oc2c1,0.006729846937340681 +CCC(O)(C)C#C,0.00046870383012542657 +CC(C(NCC)=C1)=CC(C1=O2)=C(C(C2=C3)=CC(C)=C3NCC)C(=CC=C4)C(=C4)C(=O)OCC,2.705399937694626e-05 +O=C(NS(=O)(=O)c1cccc2)c12,0.01966323569952717 +c1cc(Cl)ccc1C2SC(=O)N(C(=O)NC3CCCCC3)C2C,0.00045341341521072437 +n(c(nc(n1)NCC)NCC)c1Cl,2.4794616275543184e-05 +O=[S](NC1CCCCC1)(=O)[O-].[Na+],0.017900805088957215 +O=C(OCC(C1OCC(C1O)O)O)CCCCCCCCCCC,0.01986671090855914 +O(CC1O)C(C1O)C(O)COC(=O)CCCCCCCCCCCCCCCCC,0.016727105323218583 +O=S(=O)(Nc(nc(cc1C)C)n1)c(ccc(N)c2)c2,0.00011856422602566643 +CCNc1nc(NC(C)(C)C)nc(SC)n1,6.21487662475519e-05 +Oc(c(cc(c1)C(C)(C)C)Cl)c1,0.0011697007223226948 +C(C(Cl)Cl)(Cl)Cl,0.000643434395429049 +COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl,0.0002732525478388646 +CCN(CC)C(=O)SCc1ccc(Cl)cc1,1.939641912620375e-05 +COC(=O)NC(=S)Nc1ccccc1NC(=S)NC(=O)OC,9.34595925699157e-05 +N(C(=S)SSC(N(C)C)=S)(C)C,6.238747379310154e-05 +c12OC(CCCC(C)CCCC(C)CCCC(C)C)(C)CCc1c(C)c(OC(=O)C)c(C)c2C,0.004230630449818796 +Cc1cc(N)ccc1NOS(O)(=O)=O,0.0008431459792705265 +C(Br)(C(Br)(Br)Br)C1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,4.511229623452442e-06 +O=C(O)COc(c(cc(c1Cl)Cl)Cl)c1,3.914162418169536e-05 +FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O,0.00011930360709302091 +Cc1cc(C)c(N)cc1C,0.0004659548946786565 +CC(O)(C(O)C(O1)C)CC1(C)OC(C(C)O2)C(C(O)C2(C)OC(C(C)C(O)CC(=O)OC(CC)C3COC(C(OC)C4OC)OC(C)C4O)C(CC=O)CC(C)C(=O)C=CC(=C3)C)N(C)C,0.0005295750507618813 +c1c(Cl)cc(Cl)cc1N2C(=O)C(C)(C=C)OC2(=O),0.00025479642918707515 +O=C(OC(CCCC(O)CCCCCc1cc(O)cc2O)C)c12,6.203550142861481e-07 +COC(=O)C1(C2=CC=CC=C2C3=C1C=C(C=C3)Cl)O,0.0005460521449219469 +CC(C(=O)O)OC1=CC(=CC=C1)Cl,0.0004984573741185808 +P12P3P1P23,0.011881024070664265 +C(CO)O,0.006444561305822786 +CCCCOCC(C)OCC(C)O,0.0006726932978936104 +C(CO)O,0.03222280652911401 +C(CO)O,0.01482249100339231 +[O-][As](=O)([O-])[O-],4.4990181342823836e-05 +[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F,7.657523930235053e-06 +N(C(=S)SSC(N(C)C)=S)(C)C,4.783039657471118e-05 +COP(=O)(N)SC,6.377136136005779e-06 +N(C(=S)SSC(N(C)C)=S)(C)C,2.2750632109884408e-05 +COP(=O)(NC(=O)(C))SC,0.00019108364303760538 +C1=CC=C(C=C1)NC(=O)NC2=CN=NS2,0.00013620822278144422 +CCOP(=S)(NC(C)C)OC1=CC=CC=C1C(=O)OC(C)C,1.4476216287421915e-06 +CC(=NOC(=O)N(C)SN(C)C(=O)ON=C(C)SC)SC,2.821118623185759e-05 +CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C,4.928609081032476e-06 +NC(CCCC1)C1,0.000589871631832977 +CN1C=C(c2ccccc2)C(=O)C(c3cc(C(F)(F)F)ccc3)=C1,9.868947375182025e-05 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,1.2201709684038252e-06 +CCCCC(CC)COC(=O)C1=CC=CC=C1C(=O)OCC(CC)CCCC,0.0005120902983161576 +OC(=O)CNCP(O)(O)=O,0.005914602100378093 +C1CNC(=S)N1,2.2514113902230536e-06 +O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1,2.5090939601491425e-05 +C1=CC=C2C(=C1)NC(=S)S2,0.004484270077422451 +CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl,2.852364730588813e-05 +c(c(c(c(c1Cl)Cl)Cl)Cl)(c1Cl)Cl,1.0183220720957906e-06 +COc1ccc(cc1)C(c2ccc(OC)cc2)C(Cl)(Cl)Cl,0.000361639482467859 +C1=CC(=CC=C1Cl)Cl,0.0020407891160090755 +CC(C)OC(=O)NC1=CC(=CC=C1)Cl,0.002340158076742 +COP(=O)(OC)OC=C(Cl)Cl,9.729574795271285e-06 +CCOP(=S)(OCC)Oc1ccc(cc1)N(=O)=O,1.442007500217475e-06 +CNC(=O)N(C)c1nnc(s1)C(C)(C)C,0.00017519690160775725 +CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2,0.0007386866446931963 +CC(C(=O)O)OC1=C(C=C(C=C1)Cl)Cl,3.828744186371015e-05 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,2.8782768221426878e-05 +C(#N)c(c(c(c(c1C(#N))Cl)Cl)Cl)c1Cl,1.504262704438716e-05 +O=C(OCC)C(O)(c(ccc(c1)Cl)c1)c(ccc(c2)Cl)c2,5.658290428731166e-05 +O=C(N(C)C)Nc(ccc(c1)Cl)c1,0.0006292491939569566 +O=C(N(SC(Cl)(Cl)Cl)C(=O)C1CC=CC2)C12,0.00033267981710061916 +CCc1cccc(C)c1N(C(C)COC)C(=O)CCl,0.0005285529966699722 +C1=CC(=C(C=C1Cl)Cl)OCC(=O)O,2.2620602193003837e-05 +CCNC1=NC(=NC(=N1)Cl)NC(C)(C)C#N,5.193343612553005e-06 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,1.581680889416305e-05 +COP(=S)(OC)OC1=CC(=C(C=C1Cl)Cl)Cl,0.00015549919110720132 +C1C2C=CC1C3C2C4(C(=C(C3(C4(Cl)Cl)Cl)Cl)Cl)Cl,2.7404023436797595e-08 +CC1(C(C1C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Cl)Cl)C,6.389160712181889e-05 +CCN(CC)C(=O)C(C)OC1=CC=CC2=CC=CC=C21,0.0003685221091522648 +ClC1C=CC2C1C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,6.696708996117785e-07 +CC(=CC(=O)NC)OP(=O)(OC)OC,2.016458594951112e-06 +CC(C)C1(C)N=C(NC1(=O))c3nc2ccccc2cc3C(=O)(O),6.42394476589514e-05 +CC(C)Nc1nc(Cl)nc(NC(C)C)n1,0.00021766590408142935 +CC(C(=O)O)(Cl)Cl,0.000349726996112295 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,1.7269660932855995e-05 +O=C(NC)CSP(OC)(OC)=S,2.1809542923407198e-05 +C12C3(C4(C5(C3(C(C1(C5(C2(C4(Cl)Cl)Cl)Cl)Cl)(Cl)Cl)Cl)Cl)Cl)Cl,1.9565721591442967e-08 +COC(=O)C1=CC=CC=C1C(=O)OC,0.010299509743336183 +CCOP(=S)(OCC)SCSC(C)(C)C,1.7335192530420976e-07 +CCC(C)SP(=O)(OCC)SC(C)CC,9.245829486467153e-07 +CCOP(=S)(OCC)SCSC(C)(C)C,6.93407701216835e-06 +C1C(C(C(=O)N1C2=CC=CC(=C2)C(F)(F)F)Cl)CCl,1.601973068976987e-05 +O=C(O)C(C(C(=O)O)C(O1)CC2)C12,0.0006177415369409428 +O=C(Oc(c(OC(C1)(C)C)c1cc2)c2)NC,2.25986249188711e-05 +Oc(c(c(c(c1)Cl)Cl)Cc(c(c(cc2Cl)Cl)Cl)c2O)c1Cl,1.2287924553323e-05 +CC1(CON(C1=O)CC2=CC=CC=C2Cl)C,8.969617860069388e-05 +CCC(C)N1C(=O)C(=C(NC1=O)C)Br,0.00023935747721355314 +CC1=CC(=CC(=C1N(C)C)C)OC(=O)NC,6.748138593450308e-06 +CNC(=O)OC1=CC=CC(=C1)N=CN(C)C,5.6495719658295366e-05 +CC1=NN(C(=O)N1C(F)F)C2=CC(=C(C=C2Cl)Cl)NS(=O)(=O)C,0.0001730417009651666 +CCOP(=S)(CC)SC1=CC=CC=C1,2.029803515709809e-05 +CCOP(=S)(OCC)SC(CCl)N1C(=O)C2=CC=CC=C2C1=O,6.347661292175554e-06 +N1CC(C)(C)CNC1=NN=C(C=Cc2ccc(C(F)(F)F)cc2)C=Cc3ccc(C(F)(F)F)cc3,1.011172895860315e-05 +CC1=C(C(=C(C(=C1F)F)COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)F)F,1.0985502703376482e-05 +CC1=CC(=C(C=C1)N=CN(C)C=NC2=C(C=C(C=C2)C)C)C,3.476411288357328e-05 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,2.646103785330524e-06 +CC(C)N(C(C)C)C(=O)SCC(Cl)=C(Cl)Cl,4.1028786650112265e-05 +S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O),7.0905370603133915e-06 +CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2CCC(F)(F)F,0.00019051986068493621 +O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12,0.0001664732247794737 +CCN(CC)c1nc(C)cc(OP(=S)(OC)OC)n1,4.519647285022815e-05 +O=C(ON=CC(SC)(C)C)NC,5.255875464343493e-07 +ClC(Cl)(Cl)CC1(OC1)c2cc(Cl)cc(Cl)c2,9.362507489225856e-05 +CCC1CCCC(C(C(=O)C2CC3C(C2CC(=O)O1)CCC4C3CC(C4)OC5CC(C(C(C5OC)OC)OC)C)C)OC6CCC(C(O6)C)N(C)C,3.269690443692059e-05 +CC(C)(C)C(=NOC(=O)NC)CSC,2.748304502244953e-05 +CON=C(CC1=CN=CC=C1)C2=C(C=C(C=C2)Cl)Cl,0.00015245767876475813 +CC(=CC1C(C1(C)C)C(=O)OCN2C(=O)C3=C(C2=O)CCCC3)C,0.0007543614918373588 +C1COC(O1)(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl,3.3317713989015466e-05 +CCCOC(=O)C1=CN=C(C=C1)C(=O)OCCC,0.0009949124950582777 +CC1=CC(=NC(=N1)NC(=O)NS(=O)(=O)C2=CC=CC=C2C(=O)OC3COC3)C,0.0002042257406025049 +C1=C(C(=NC(=C1Cl)Cl)OCC(=O)O)Cl,0.00014036698793030923 +CCOCN1C(=C(C(=C1C(F)(F)F)Br)C#N)C2=CC=C(C=C2)Cl,3.336499331006338e-05 +CC(C)CC1=C(C(=NC(=C1C(=O)SC)C(F)(F)F)C(F)F)C(=O)SC,9.043009089325258e-06 +CC12CC1(C(=O)N(C2=O)C3=CC(=CC(=C3)Cl)Cl)C,5.279126047017924e-05 +CC1=CC(=C(C=C1)C(=O)OC)C2=NC(C(=O)N2)(C)C(C)C,0.00017340543300030297 +COP(=S)(OC)OC1=NC(=C(C=C1Cl)Cl)Cl,9.30136974668287e-06 +CC(C)CC1=C(C(=NC(=C1C(=O)OC)C(F)F)C(F)(F)F)C2=NCCS2,0.00011151045308574189 +CCOC(=O)C(CC1=CC(=C(C=C1Cl)F)N2C(=O)N(C(=N2)C)C(F)F)Cl,2.9112705183968275e-05 +CC(C)=CC3C(C(=O)OCc2coc(Cc1ccccc1)c2)C3(C)C,0.00036934164172773375 +CCCSP(=S)(OCC)OC1=CC=C(C=C1)SC,3.566479571525996e-05 +CC1=CC(=C(C(=C1)OC(=O)NC)C)C,0.0003063511456860093 +CC1=CC=CC=C1COC2CC3(CCC2(O3)C)C(C)C,0.0005466515334085693 +CC1=C2C(=CC=C1)SC3=NN=CN23,0.00016381576159163087 +CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl,0.00027784628232227726 +CCCN(CCC)C(=O)SCC,4.753899597429217e-05 +CC(C)OC(=O)C=C(C)C=CCC(C)CCCC(C)(C)OC,0.00014816176662421748 +COP(=S)(OC)Oc1ccc(SC)c(C)c1,1.3473309110575038e-05 +COC1=C(C=C(C=C1)C(=CC(=O)N2CCOCC2)C3=CC=C(C=C3)Cl)OC,0.00011937399144446824 +CCSC(=O)N(CC(C)C)CC(C)C,0.00046004207912889866 +CC(C)OP(=S)(OC(C)C)SCCNS(=O)(=O)C1=CC=CC=C1,3.773457500445001e-05 +CC(=CC1C(C1(C)C)C(=O)OCC2=CC(=CC=C2)OC3=CC=CC=C3)C,0.0004280202119133742 +CC1=CC(=CC(=C1C)C)OC(=O)NC,5.1748504338852954e-05 +CCOP(=S)(OCC)SCSC1=CC=C(C=C1)Cl,2.91659726744992e-06 +C1CN(CCN1C(C(Cl)(Cl)Cl)NC=O)C(C(Cl)(Cl)Cl)NC=O,0.00022990526799413375 +C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3,9.938002763559794e-06 +C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-],0.00042324860573444577 +CCCC(=NOCC)C1C(=O)CC(CC1=O)CC(C)SCC,5.056765552287114e-05 +ClC2(Cl)C4(Cl)C1(Cl)C5(Cl)C(Cl)(Cl)C3(Cl)C1(Cl)C2(Cl)C3(Cl)C45Cl,1.2831252531880975e-06 +CCN(C1CCCCC1)C(=O)SCC,1.3930451940080122e-05 +CC1=NC(=NC(=N1)OC)NC(=O)NS(=O)(=O)C2=CC=CC=C2OCCCl,0.0005494924735209557 +C(C(=O)O)OC1=NC(=C(C(=C1Cl)N)Cl)F,0.001960549023239737 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC#C,0.0003162533656848333 +C1C(COC1(CN2C=NC=N2)C3=C(C=C(C=C3)Cl)Cl)Br,1.7185416964361658e-05 +C1=NNC(=N1)N,2.973360120532913e-05 +C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F,6.822190699642811e-05 +C1=CC(=CC=C1OS(=O)(=O)C2=CC=C(C=C2)Cl)Cl,8.246440044818333e-06 +FC(F)(F)C(=CC(N(=O)=O)=C1N(C(C)C)C(C)C)C=C1N(=O)=O,0.0029825901773255373 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C,0.0002480093611298675 +C1=CC(=C(C(=C1)Cl)C#N)Cl,1.4533918736325693e-05 +C1C(O1)COC2=CC=CC=C2C3=CC=CC=C3,0.00220974492207247 +CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC,0.001196753409055808 +O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N,0.00010642121227099495 +C1=CC(=C(C2=NC=C(C=C21)Cl)C(=O)O)Cl,0.0031273470595088652 +CC(C)NC(=O)N1CC(=O)N(C1=O)C2=CC(=CC(=C2)Cl)Cl,0.00013932359364492863 +CCCN(CCCl)C1=C(C=C(C=C1[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-],0.0005690227880626769 +C1=CC=C(C=C1)C2=CC=CC=C2O,0.005875192118782279 +O=C(N(C)C)Nc(cccc1C(F)(F)F)c1,6.459882953742444e-05 +C1=CC(=NC(=C1)Cl)C(Cl)(Cl)Cl,4.330753128362797e-06 +Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2,1.9911569269535424e-05 +CC1=CC(=C(C=C1NC(=O)C)NS(=O)(=O)C(F)(F)F)C,8.894826519325488e-05 +C(=C(I)I)(I)I,9.40487316889e-05 +C1=C(C=C(C(=C1Cl)N2C(=C(C(=N2)C#N)S(=O)C(F)(F)F)N)Cl)C(F)(F)F,1.3725335654181613e-07 +O=C(N(C)C)Nc(ccc(c1Cl)Cl)c1,2.6813159469657174e-05 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C,8.101639130242488e-05 +CC1=CC2=C(C=C1)N=C3C(=N2)SC(=O)S3,3.201059303080756e-05 +CC(C)N(C(=O)CCl)c1ccccc1,0.0001086504872549198 +CC(C)C1(C(=O)NC(=N1)C2=C(C=CC=N2)C(=O)O)C,0.0019136814830266148 +CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C,5.566320606558907e-05 +CN1CN(C(=S)SC1)C,0.0001848698793354276 +ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,0.0001801597685653181 +ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl,5.137200498000178e-07 +CCOC(=O)CN1C2=C(C=CC=C2Cl)SC1=O,4.600323862799974e-05 +CCCN(CCC)C1=C(C=C(C(=C1[N+](=O)[O-])N)C(F)(F)F)[N+](=O)[O-],8.392957359172463e-05 +C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N,0.0001187584704479041 +CC(C)(C)C(CCC1=CC=C(C=C1)Cl)(CN2C=NC=N2)O,5.165383561566422e-05 +CC1=C(C=CC=C1COC(=O)C2C(C2(C)C)C=C(C(F)(F)F)Cl)C3=CC=CC=C3,1.1824026617703973e-05 +C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3,0.0001987600552711955 +C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-],0.0007245881151318271 +CC1=C(C=C(C=C1C(=O)N)[N+](=O)[O-])[N+](=O)[O-],2.775825077363338e-05 +CC(C)OC1=CC=CC(=C1)NC(=O)C2=CC=CC=C2C(F)(F)F,0.0015465050319982663 +OC(c1ccc(Cl)cc1)(c2ccc(Cl)cc2)C(Cl)(Cl)Cl,6.747899500347761e-06 +O=P(O)(O)CCCl,0.0030866333336565456 +CN(C(=O)NC1=CC=C(C=C1)Br)OC,4.8243951057630326e-05 +CC1=CC(=CC=C1)NC(=O)OC2=CC=CC(=C2)NC(=O)OC,8.324752178787434e-05 +CC(C)(C)C1=NN=C(S1)N2C(CN(C2=O)C)O,0.0001950651330281793 +S=P(OCC)(OCC)Oc1ccc2C(C)=C(Cl)C(=O)Oc2c1,4.686221613388349e-06 +COC(=O)c1ccccc1S(=O)(=O)NC(=O)N(C)c2nc(OC)nc(C)n2,3.1614325062739156e-05 +C1=CC=C(C(=C1)NC2=NC(=NC(=N2)Cl)Cl)Cl,4.173898399328064e-06 +CC1=C(C=CC(=C1)OP(=S)(OC)OC)[N+](=O)[O-],1.6592478987816552e-06 +COc1c(Cl)ccc(Cl)c1C(=O)(O),0.000520273850439097 +CC1(C(C1C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C=C(Br)Br)C,4.948543461552819e-06 +C1=CC=C(C(=C1)C(C2=CC=C(C=C2)F)(C3=CN=CN=C3)O)Cl,7.943029208877253e-06 +c1ccc2nc(NC(=O)OC)n(C(=O)NCCCC)c2c1,0.00039611774300238816 +CCOC(=O)COC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],5.583516196615599e-05 +CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)C3=CC=CC=C3)O,7.409262028018131e-05 +CCNC(=O)NC(=O)C(=NOC)C#N,0.00015289185096526158 +CCOC1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],0.00011058877892773892 +CC1=NC=C(N1CCO)[N+](=O)[O-],0.0008764039114257181 +O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12,0.0016860133324539056 +CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2,0.000285329221701204 +CCCCC(CN1C=NC=N1)(C2=C(C=C(C=C2)Cl)Cl)O,1.4958135679074663e-05 +CC(C)(C)C(C(=CC1=C(C=C(C=C1)Cl)Cl)N2C=NC=N2)O,0.00015327033840680795 +C1=CC(C2C1C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl)Cl,1.0178997674098972e-06 +C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N,3.374687200243432e-05 +CC1=NN(C(=C1C=NOCC2=CC=C(C=C2)C(=O)OC(C)(C)C)OC3=CC=CC=C3)C,7.307428846046914e-06 +CS(=O)(=O)C1=C(C=CC(=C1)C(F)(F)F)C(=O)C2=C(ON=C2)C3CC3,5.566064755837833e-05 +CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C,5.245792224158045e-05 +CCN(CC)C(=O)C(Cl)=C(C)OP(=O)(OC)OC,5.005200052490544e-06 +C1=CC(=CC=C1C(CN)O)O,0.0016320834707547742 +CC1=C(C(=CC=C1)C)N(C(=O)COC)N2CCOC2=O,0.00017965983350851395 +c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2,6.174515120168466e-05 +CCC(C)NC1=C(C=C(C=C1[N+](=O)[O-])C(C)(C)C)[N+](=O)[O-],0.00016929970598735823 +C1=CC(=CC=C1S(=O)(=O)C2=CC(=C(C=C2Cl)Cl)Cl)Cl,0.0006459733503975096 +CCCCC1=C(NC(=NC1=O)NCC)C,0.00011945258606726158 +n(c(nc(n1)NCC)NCC)c1Cl,2.628229325207573e-05 +FC(F)(F)C(C=C1N(=O)=O)=CC(N(=O)=O)=C1N(CC)CC(C)=C,3.750789508184508e-05 +C1CCC(C1)N(CC2=CC=C(C=C2)Cl)C(=O)NC3=CC=CC=C3,7.60257762657494e-05 +CS(=O)(=O)NC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],0.00011395676094313254 +CCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC3=C(O2)C=C(C=C3)Cl,2.4877248744348747e-05 +CCC1=C(C(=CC=C1)CC)N(CNC(=O)C)C(=O)CCl,0.0002105848787792573 +NC(=N)NCCCCCCCCCCCC(OC(=O)C),0.0001016026806851265 +C1=CC(=CC(=C1)Cl)NC(=O)OCC#CCCl,0.001743505808935171 +CC(C)C(C(=O)OC(C(#N))c2cccc(Oc1ccccc1)c2)c3ccc(Cl)cc3,5.953797389131287e-05 +CC(C)C1=C(C=CC(=C1)C(C)(C)C2=CC(=C(C=C2)O)C(C)C)O,8.001387248515537e-05 +CCN(CC1=C(C=CC=C1Cl)F)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-],0.00011855904490168938 +CCCCCCCCSC(=O)OC1=CC(=NN=C1C2=CC=CC=C2)Cl,0.00017813968959673758 +CC1=C(C(=O)CC1OC(=O)C2C(C2(C)C)C=C(C)C)CC=C,4.563372244789602e-05 +CCCCNC(=O)N1C2=CC=CC=C2N=C1NC(=O)OC,0.0008611255282660687 +CC1=C(C(=CC=C1)C)N(C(C)C(=O)OC)C(=O)CC2=CC=CC=C2,0.00014136381415796835 +CC(C)C(C1=CC=C(C=C1)OC(F)F)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3,1.3290157262750028e-05 +Clc1ccccc1c2nnc(c3ccccc3Cl)nn2,6.597478470118595e-05 +CCOC(=O)NCCOC1=CC=C(C=C1)OC2=CC=CC=C2,3.318543029523173e-05 +CCC1=C(C(=CC=C1)CC)N(CC(=O)OCC)C(=O)CCl,0.00016035726058227922 +c1(O2)c(CC2(C)C)cccc1OC(=O)N(C)SN(CCCC)CCCC,6.569530810416249e-05 +CCCCOC(=O)C(C)OC1=CC=C(C=C1)OC2=NC=C(C=C2)C(F)(F)F,7.825509714262148e-06 +COC1=CC(=C(C=C1Cl)OC)Cl,0.0006037074787089256 +CCOP(=S)(OCC)OC1=NN(C(=N1)Cl)C(C)C,3.984173701864836e-05 +n(c(nc(n1)NC(C)C)NCC)c1Cl,0.00011591071091933584 +CC(C)(C)C(C(=CC1=CC=C(C=C1)Cl)N2C=NC=N2)O,0.00013506940531624235 +CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O),0.00013721450601021437 +c1cc(OC(F)(F)F)ccc1C(O)(C(C)C)c2cncnc2,3.8746408361649466e-05 +COP(=O)(C(C(Cl)(Cl)Cl)O)OC,7.76890065639098e-05 +C1=CC(=C(C=C1C(F)(F)F)Cl)OC2=CC(=C(C=C2)[N+](=O)[O-])C(=O)O,0.0003456310811217245 +CCCN(CC1CC1)C2=C(C=C(C=C2[N+](=O)[O-])C(F)(F)F)[N+](=O)[O-],1.4397200049120035e-05 +CCOC(=O)C(C)OC(=O)C1=C(C=CC(=C1)OC2=C(C=C(C=C2)C(F)(F)F)Cl)[N+](=O)[O-],0.00010827828420609173 +CCSC(=O)N1CCCCCC1,7.90700043427112e-05 +CCC1=CC=C(C=C1)C(=O)NN(C(=O)C2=CC(=CC(=C2)C)C)C(C)(C)C,0.0001361818336157604 +ClC(Cl)C(Cl)(Cl)SN2C(=O)C1CC=CCC1C2(=O),4.2972436676962935e-05 +COC(=O)C1=CC=CC=C1S(=O)(=O)NC(=O)NC2=NC(=CC(=N2)OC(F)F)OC(F)F,0.00029893004855968545 +CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O,8.452667530010769e-05 +CC1=C(C=CC(=C1)Cl)OCC(=O)O,1.9938294964743116e-05 +COC=C(C1=CC=CC=C1OC2=NC=NC(=C2)OC3=CC=CC=C3C#N)C(=O)OC,0.00015431812608561826 +C1=CC=C(C(=C1)C(C2=CC=C(C=C2)Cl)(C3=CN=CN=C3)O)Cl,6.9445287349200036e-06 +[O-]Br(=O)=O,4.769269019610272e-05 +OP(=O)OCC,0.003634746471572125 +COP(N)(=O)SC,7.085706817784122e-07 +CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1,4.944661963970053e-06 +CCOP(=S)(OCC)SCCSCC,1.4577045866248343e-07 +CCOP(=S)(OCC)SCSP(=S)(OCC)OCC,5.2018837831434275e-06 +O=C(OCC(CCCC)CC)CCCCC(=O)OCC(CCCC)CC,0.004047856676081413 +CN(C=Nc1ccc(C)cc1C)C=Nc2ccc(C)cc2C,3.4082463611346175e-05 +[C@@]14([C@@H]5OCC1=CC=C[C@@H]([C@H](O[C@H]2C[C@@H]([C@H]([C@@H](O2)C)O[C@H]3C[C@@H]([C@H]([C@@H](O3)C)O)OC)OC)C(=CC[C@@H]6C[C@H](OC([C@@H]4C=C([C@H]5O)C)=O)C[C@]7(O6)O[C@@H]([C@H](C=C7)C)[C@H](CC)C)C)C)O,2.290718786322191e-06 +O=C(N(S(=O)(=O)Nc1cccc2)C(C)C)c12,0.00014566407168203842 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,4.134537164578915e-06 +C(#N)Cl,0.0011387594679715704 +C(#N)Br,0.0011517974649126507 +C1=CC(=CC=C1C(C2=CC=C(C=C2)Cl)C(Cl)(Cl)Cl)Cl,7.052459522690668e-07 +c(cccc1)(c1)C(C)C,0.002753936673434173 +CCCN(CCC)C(=O)SCC,0.00013205276659525523 +NC(CCCC1)C1,0.0006049965454697296 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,1.4642051620845761e-05 +CC(C)OC(=O)NC1=CC(=CC=C1)Cl,0.004680316153483986 +COC(=O)c1c(Cl)c(Cl)c(C(=O)OC)c(Cl)c1Cl,3.012372657970604e-05 +COC(=O)C1=CC=C(C=C1)C(=O)OC,0.0006437193589585184 +N(C(=S)NC1)C1,2.4471862937206834e-06 +O=C(N(OC)C)Nc(ccc(c1Cl)Cl)c1,1.0036375840596738e-05 +c(cccc1)(c1)C=C,0.0027364609513743235 +COC(=O)c1ccccc1S(=O)(=O)NC(=O)Nc2nc(OC)nc(C)n2,0.0006555420309950702 +C1=CC(=CC=C1N)Cl,9.798423692306362e-05 +FC(F)(F)C(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cc(Oc3ccccc3)ccc2,2.7787035825324932e-05 +C(Cl)(Br)Br,0.00013683526627950891 +C=C(Cl)Cl,0.00014441434207713882 +C(C=CCl)Cl,4.595842510750173e-05 +COP(=O)(OC)OC(=CCl)c1cc(Cl)c(Cl)cc1Cl,0.00013662627391943267 +Oc(ccc(c1)C(c(ccc(O)c2)c2)(C)C)c1,0.00021902317939829496 +O=C(OCc(cccc1)c1)c(c(ccc2)C(=O)OCCCC)c2,0.001504675539130031 +O=C(NCCCC1)C1,0.0011046536495458942 +c(cccc1)(c1)Cl,0.001066127443097669 +C(Cl)(Cl)Cl,0.000502606685808161 +ClCCl,0.0006190792744080026 +C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl,3.2816209380227e-07 +OCCO,0.016111403264557053 +O=C(C=C(CC1(C)C)C)C1,0.001295160023171075 +C(F)(Cl)(Cl)Cl,0.002540618905481128 +CCc1cccc(CC)c1N(COC)C(=O)CCl,5.189661748967873e-05 +c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2,1.1824026617703973e-05 +n1c(Cl)cc(OC)nc1NC(=O)NS(=O)(=O)c2ccccc2C(=O)OCC,0.000301334937881614 +O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2,2.510595466045339e-05 +c(cccc1)(c1)CC,0.0027410163424857604 +O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12,0.00013488106659631142 +Clc1cc(C(F)(F)F)cnc1Oc2ccc(OC(C)C(=O)OC)cc2,2.661507390658951e-06 +C#N,0.0011470716002092733 +ClC(C(OC(C=C2C(=O)OC(C)C(=O)OCC)=CC=C2N(=O)=O)=C1)=CC=C1C(F)(F)F,0.00010827828420609173 +c1c(C(F)(F)F)cccc1N2C(=O)C(Cl)=C(NC)C=N2,0.00016877007995126964 +O=N(=O)C(C(=C1N(=O)=O)N(C(C)C)C(C)C)=CC(=C1)S(=O)(=O)N,0.00012992280391195855 +CN(=CC=C1C(C=C2)=CC=N2C)C=C1,2.0133908207418442e-05 +C1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-],6.245761469536105e-05 +C(=C)Cl,2.0800592400871593e-05 +C1CCC(=O)CC1,0.009272184465524753 +CC1(C(C1(C)C)C(=O)OC(C#N)C2=CC(=CC=C2)OC3=CC=CC=C3)C,7.154653735936876e-05 +C1=CC(=O)NNC1(=O),0.004460830164062158 +CCSC(=O)N1CCCCCC1,1.0677920910561878e-05 +C(C(Cl)(Cl)Cl)(O)O,0.0008211924590443927 +ClC2C1OC1C3C2C4(Cl)C(=C(Cl)C3(Cl)C4(Cl)Cl)Cl,6.421500622500273e-08 +Clc1cc(C(F)(F)F)ccc1Oc2cc(OCC)c(N(=O)(=O))cc2,2.764719473193427e-05 +c1cc(Cl)ccc1C(C(#N))(CCCC)Cn2ncnc2,3.407493882440337e-05 +CC1=C(C=C(C=C1[N+](=O)[O-])[N+](=O)[O-])[N+](=O)[O-],8.805487227420694e-06 +CC(C)OC(=O)C(C1=CC=C(C=C1)Br)(C2=CC=C(C=C2)Br)O,6.073132568962677e-05 +C[N+](C)(C)CCCl,0.0010602168942789236 +CCC(=C1C(=O)CC(CC1=O)CC(C)SCC)NOCC=CCl,0.00023894780279715413 +CC1=NC(=NC(=C1)C2CC2)NC3=CC=CC=C3,0.0001580192552676787 +N(c(cccc1)c1)c(cccc2)c2,0.00014773454395291703 +CC1(C(=O)N(C(=O)O1)NC2=CC=CC=C2)C3=CC=C(C=C3)OC4=CC=CC=C4,4.4873074905020916e-05 +CC1(CCCCC1)C(=O)NC2=C(C(=C(C=C2)O)Cl)Cl,0.0009662594125910585 +C1=CC(=C2C(=C1)OC(O2)(F)F)C3=CNC=C3C#N,0.0004432176780816704 +C(F)(F)(F)c1ccccc1C(=O)Nc2cccc(OC(C)C)c2,0.00026909187556769875 +C(CCCCN=C(N)N)CCCNCCCCCCCCN=C(N)N,5.343607459270991e-05 +C1CN(C(=N1)N[N+](=O)[O-])CC2=CN=C(C=C2)Cl,6.64943030028048e-05 +COC(=O)C12CC3=C(C1=NN(CO2)C(=O)N(C4=CC=C(C=C4)OC(F)(F)F)C(=O)OC)C=CC(=C3)Cl,6.8203197610829175e-06 +CC1=CC=CC=C1OCC2=CC=CC=C2C(=NOC)C(=O)OC,0.001180796696935047 +CC1=CC(=CC(=C1)C(=O)N(C(C)(C)C)NC(=O)C2=C(C(=CC=C2)OC)C)C,0.0011154252951100646 +C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C=C2)OC(C(OC(F)(F)F)F)(F)F)Cl)F,7.306609488150114e-05 +CC1=CC=C(C=C1)N(SC(F)(Cl)Cl)S(=O)(=O)N(C)C,5.183483461643306e-05 +CC(C)(C)C1=C(C=CC(=C1)O)O,0.0013536524792656423 +CC(=NOCC1=CC=CC=C1C(=NOC)C(=O)OC)C2=CC(=CC=C2)C(F)(F)F,0.00014692519736711582 +COC(=O)N(C1=CC=CC=C1COC2=NN(C=C2)C3=CC=C(C=C3)Cl)OC,2.3206826561357754e-05 +CC(C)N1C(=NC(C)(C)C)SCN(C1=O)C2=CC=CC=C2,2.8483655881816287e-05 +C1=CC=C(C(=C1)C2=NN=C(N=N2)C3=CC=CC=C3Cl)Cl,5.706818876652661e-05 +CCCC(=C1C(=O)CC(CC1=O)C2CCCSC2)NOCC,8.603044408485128e-05 +C1CC1NC2=NC(=C(C(=N2)N)C#N)N,0.00011566455596376984 +C(C=C1)(=N(C=C1)CC2)C(N2=C3)=CC=C3,3.093839741706742e-06 +C1=CC=C2C(=C1)C(=O)C3=C(C2=O)SC(=C(S3)C#N)C#N,2.0248123201460396e-05 +CCOC1=CC2=C(C=C1)NC(C=C2C)(C)C,5.522147585284529e-05 +C1=CC=C(C=C1)C(CCC2=CC=C(C=C2)Cl)(CN3C=NC=N3)C#N,8.90688528359281e-05 +CC1CN(CC(O1)C)CC(C)CC2=CC=C(C=C2)C(C)(C)C,5.60164796529038e-06 +C[Si](CN1C=NC=N1)(C2=CC=C(C=C2)F)C3=CC=C(C=C3)F,6.341300732121172e-06 +c1cc(Cl)cc(Cl)c1C(OCC=C)Cn2cncc2,5.047450068604895e-05 +CN(=CC=C1C(C=C2)=CC=N2C)C=C1,1.3691057581044662e-05 +CCCCOCCOCCOCC1=CC2=C(C=C1CCC)OCO2,0.00029547465787728373 +Clc1cc(Cl)ccc1C2(Cn3ncnc3)OC(CCC)CO2,0.00028052099059676144 +C(=CC=C1)(C2=C1)NC(=N2)C(=CS3)N=C3,0.00014907004145339663 +CCOC1=CC=C(C=C1)C(C)(C)COCC2=CC(=CC=C2)OC3=CC=CC=C3,6.905930233849184e-05 +CC(C)(C)c2ccc(OC1CCCCC1OS(=O)OCC#C)cc2,5.421255212322886e-05 +CC(COC1=CC=C(C=C1)OC2=CC=CC=C2)OC3=CC=CC=N3,0.0004356352632556389 +CC(C)(C)C(=O)C(N1C=NC=N1)OC2=CC=C(C=C2)Cl,0.0003880867710275085 +CC(C)(C)C(C(N1C=NC=N1)OC2=CC=C(C=C2)Cl)O,0.0003550120362604598 +c1ccccc1c2c(C)c(COC(=O)C3C(C)(C)C3C=C(Cl)C(F)(F)F)ccc2,1.8918442588326134e-05 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,1.3815728746284999e-05 +CC1(C(C1C(=O)OC(C#N)C2=CC(=C(C=C2)F)OC3=CC=CC=C3)C=C(Cl)Cl)C,2.763145749256989e-05 +ClC(Cl)=CC1C(C)(C)C1C(=O)OC(C(#N))c2cccc(Oc3ccccc3)c2,0.00012010651237687908 +ClC1CC2C(C1Cl)C3(Cl)C(=C(Cl)C2(Cl)C3(Cl)Cl)Cl,6.100854842019149e-07 +ClC4=C(Cl)C5(Cl)C3C1CC(C2OC12)C3C4(Cl)C5(Cl)Cl,2.625296750418199e-07 +C1C2C3C(C1C4C2O4)C5(C(=C(C3(C5(Cl)Cl)Cl)Cl)Cl)Cl,6.563241876045522e-07 +C1(C(C(C(C(C1Cl)Cl)Cl)Cl)Cl)Cl,1.6160652565775167e-05 +CCC(=O)Nc1ccc(Cl)c(Cl)c1,0.000348496188506355 +C1(=C(C(=C(C(=C1Cl)Cl)Cl)Cl)Cl)[N+](=O)[O-],0.0004740384384225777 +C1C2C(COS(=O)O1)C3(C(=C(C2(C3(Cl)Cl)Cl)Cl)Cl)Cl,7.126617932723372e-06 +O=C(N(SC(Cl)(Cl)Cl)C(=O)c1cccc2)c12,0.00016860133324539056 +CC(C(=O)O)OC1=CC=C(C=C1)OC2=C(C=C(C=N2)C(F)(F)F)Cl,2.764719473193427e-07 +CCCCC(CN1C=NC=N1)(C#N)C2=CC=C(C=C2)Cl,3.393642281292254e-05 +Clc1cc(Cl)cc(Cl)c1OCCN(CCC)C(=O)n2cncc2,1.3539867103283905e-05 +COP(=O)(NC(=O)(C))SC,1.3648831645543501e-05 +CCOP(=O)(OCC)OC(=CCl)C1=C(C=C(C=C1)Cl)Cl,4.171650386740796e-06 +CCOP(=S)(OCC)SCCSCC,8.017375226436709e-07 +O=P(O)(O)CCCl,8.30484305019692e-05 +CCCSP(=O)(OCC)SCCC,1.1141416635499232e-05 +CCOP(=O)(NC(C)C)Oc1ccc(SC)c(C)c1,5.603950225832819e-06 +COP(=S)(OC)Oc1ccc(SC)c(C)c1,2.5868753492304103e-06 +OC(=O)C(N)CCP(C)(=O)O,1.9323475088929698e-05 +OC(=O)CNCP(O)(O)=O,0.0017743806301134177 +CCOC(=O)CC(SP(=S)(OC)OC)C(=O)OCC,0.001089726833059097 +COP(N)(=O)SC,2.0548549771574144e-06 +CC(=CC(=O)OC)OP(=O)(OC)OC,1.5614663580667682e-06 +CCOP(=S)(OCC)SCSCC,6.144925589002914e-07 +CCOP(=S)(OCC)SCSC(C)(C)C,2.080223103650493e-07 +S=P(OC)(OC)SCN1N=Nc2ccccc2C1(=O),8.130482495825867e-06 +CCOP(=S)(OCC)OC1=NC(=C(C=C1Cl)Cl)Cl,2.852364730588813e-06 +CCOP(=S)(OCC)OC1=NC(=NC(=C1)C)C(C)C,1.905728844665908e-05 +CCC1=NC(=CC(=N1)OP(=S)(OC)OC)OCC,1.539557698279251e-06 +S=P(OC)(OC)SCN1C(=O)SC(OC)=N1,5.292207570661027e-06 +CCOP(=S)(OCC)SCN1C2=C(C=C(C=C2)Cl)OC1=O,5.437611333902565e-06 +COP(=S)(OC)SCN2C(=O)c1ccccc1C2(=O),2.8362443195186416e-05 +CCOC(=O)C1=CN2C(=CC(=N2)OP(=S)(OCC)OCC)N=C1C,1.0713392456492962e-05 +CCOP(=S)(OCC)OC1=NN(C=N1)C2=CC=CC=C2,4.1492120354304085e-06 +O=C(Oc(c(c(ccc1)cc2)c1)c2)NC,0.00029817925781592213 +CC1=CC(=CC(=C1SC)C)OC(=O)NC,4.12769581811153e-05 +CNC(=O)ON=C(C)SC,0.00012329688471926276 +CCCOC(=O)NCCCN(C)C,0.003611885866531263 +COC(=O)NC1=NC2=CC=CC=C2N1,0.00039228678402561883 +CC1=C(N=C(N=C1OC(=O)N(C)C)N(C)C)C,5.1618595485714984e-05 +CNC(=O)CCSCCSP(=O)(OC)OC,1.8793291063764634e-06 +N(C(=S)SSC(N(C)C)=S)(C)C,4.990997903448196e-05 +C1=NNC(=N1)N,5.9467202410658145e-05 +CCCCCCCCc1cc(N(=O)(=O))c(OC(=O)C=CC)c(c1)N(=O)(=O),0.00017563456769307506 +C1=CC=C(C=C1)[Sn](C2=CC=CC=C2)C3=CC=CC=C3,8.57111756230557e-07 +O=C(NC(=O)c(c(F)ccc1)c1F)Nc(ccc(c2)Cl)c2,2.253098495168911e-05 +N(C(=S)NC1)C1,1.2235931468603442e-05 +C1=CC(=C(C(=C1)F)C(=O)NC(=O)NC2=CC(=C(C(=C2F)Cl)F)Cl)F,6.559798749656557e-05 +CCCSC1=CC2=C(C=C1)N=C(N2)NC(=O)OC,7.537743365466673e-05 +C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3,0.00035125670755532855 +CC1(C2C(C3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C(C=CC(=C41)Cl)O)O)O)N(C)C)O)O,0.010507618609493797 +CC1=CC(=C(C=C1NC(=O)C2=CC(=CC(=C2O)I)I)Cl)C(C#N)C3=CC=C(C=C3)Cl,1.5081279803436797e-05 +CN1CC2CC1CN2C3=C(C=C4C(=C3)N(C=C(C4=O)C(=O)O)C5CC5)F,0.00013990757020924605 +C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl,3.679735812631356e-05 +CC1=NC=C(N1C)[N+](=O)[O-],0.00010628650675790856 +CCN1CCN(CC1)C2=C(C=C3C(=C2)N(C=C(C3=O)C(=O)O)C4CC4)F,7.234386376698641e-05 +CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O,1.110984927911861e-06 +COCC(=O)NC1=C(C=CC(=C1)SC2=CC=CC=C2)NC(=NC(=O)OC)NC(=O)OC,8.959030532555182e-05 +CC1CCC2=C3N1C=C(C(=O)C3=CC(=C2)F)C(=O)O,0.0015311099540615204 +COC(=O)NC1=NC2=C(N1)C=C(C=C2)S(=O)C3=CC=CC=C3,6.3422194381288265e-06 +CC1(C2CC3C(C(=O)C(=C(N)O)C(=O)C3(C(=O)C2=C(C4=C1C=CC=C4O)O)O)N(C)C)O,0.000337507506166939 +C1CN(CCN1CCCC(=O)C2=CC=C(C=C2)F)C3=CC=CC=N3,9.163218457965083e-05 +CC(C)NCC(COC1=CC=CC2=C1C3=CC=CC=C3N2)O,2.3460058312321127e-05 +C1=CC(=CC=C1C(C#N)C2=C(C=CC(=C2Cl)N3C(=O)NC(=O)C=N3)Cl)Cl,5.642261579368184e-05 +CC1C=CC=C2COC3C2(C(C=C(C3O)C)C(=O)OC4CC(CC=C(C1OC5CC(C(C(O5)C)OC6CC(C(C(O6)C)NC(=O)C)OC)OC)C)OC7(C4)C=CC(C(O7)C(C)C)C)O,2.7774623197796e-06 +COP(=S)(OC)Oc1ccc(SC)c(C)c1,1.6167970932690254e-06 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,2.7507493728979266e-05 +C(C(C(C(C1Cl)Cl)Cl)Cl)(C1Cl)Cl,1.3753746864489659e-05 +CC(N(C)C)CN(C(=CC=C3)C1=C3)C(=CC=C2)C(=C2)S1,5.8364575374860975e-05 +C1=C(C=C(C(=C1Cl)N)Cl)[N+](=O)[O-],0.001159340984210937 +c(cccc1)(c1)C=C,0.003840646949297277 diff --git a/test/experiment.rb b/test/experiment.rb index eae7fa0..17a0fae 100644 --- a/test/experiment.rb +++ b/test/experiment.rb @@ -6,7 +6,7 @@ class ExperimentTest < MiniTest::Test datasets = [ "EPAFHM.csv", "FDA_v3b_Maximum_Recommended_Daily_Dose_mmol.csv", - "LOAEL_log_mmol_corrected_smiles.csv" + "LOAEL_mmol_corrected_smiles.csv" ] model_algorithms = ["OpenTox::Model::LazarRegression"] neighbor_algorithms = ["OpenTox::Algorithm::Neighbor.fingerprint_similarity"] @@ -21,10 +21,10 @@ class ExperimentTest < MiniTest::Test :prediction_algorithms => prediction_algorithms, ) experiment.run + experiment = Experiment.find "55dda70d2b72ed6ea9000188" =begin - experiment = Experiment.find "55dc58b32b72ed14a8000008" -=end p experiment.id +=end experiment.report refute_empty experiment.crossvalidation_ids end -- cgit v1.2.3 From 66c34e4682965272060a121b6e362af67ed4be5f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 27 Aug 2015 20:28:25 +0200 Subject: Initial GUI for Nestec models --- lib/compound.rb | 2 +- lib/crossvalidation.rb | 24 +++++++++++++++++++++--- lib/dataset.rb | 2 +- lib/feature.rb | 5 ----- lib/model.rb | 32 ++++++++++++++++++++++++++------ lib/regression.rb | 5 +++-- 6 files changed, 52 insertions(+), 18 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index a819f56..8f393f5 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -133,7 +133,7 @@ module OpenTox if self.svg_id.nil? svg = obconversion(smiles,"smi","svg") file = Mongo::Grid::File.new(svg, :filename => "#{id}.svg", :content_type => "image/svg") - update(:image_id => $gridfs.insert_one(file)) + update(:svg_id => $gridfs.insert_one(file)) end $gridfs.find_one(_id: self.svg_id).data diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb index 58a9664..a10dc1d 100644 --- a/lib/crossvalidation.rb +++ b/lib/crossvalidation.rb @@ -105,9 +105,9 @@ module OpenTox field :mae, type: Float field :weighted_rmse, type: Float field :weighted_mae, type: Float - field :weighted_mae, type: Float field :r_squared, type: Float field :correlation_plot_id, type: BSON::ObjectId + field :confidence_plot_id, type: BSON::ObjectId def self.create model, n=10 cv = self.new @@ -147,7 +147,7 @@ module OpenTox predictions.each do |pred| compound_id,activity,prediction,confidence = pred if activity and prediction - error = Math.log(prediction)-Math.log(activity) + error = Math.log10(prediction)-Math.log10(activity) rmse += error**2 weighted_rmse += confidence*error**2 mae += error.abs @@ -224,9 +224,27 @@ module OpenTox end end + def confidence_plot + tmpfile = "/tmp/#{id.to_s}_confidence.svg" + sorted_predictions = predictions.sort{|a,b| b[3]<=>a[3]}.collect{|p| [(Math.log10(p[1])-Math.log10(p[2]))**2,p[3]]} + R.assign "error", sorted_predictions.collect{|p| p[0]} + #R.assign "p", predictions.collect{|p| p[2]} + R.assign "confidence", predictions.collect{|p| p[2]} + #R.eval "diff = log(m)-log(p)" + R.eval "library(ggplot2)" + R.eval "svg(filename='#{tmpfile}')" + R.eval "image = qplot(confidence,error)"#,main='#{self.name}',asp=1,xlim=range, ylim=range)" + R.eval "ggsave(file='#{tmpfile}', plot=image)" + R.eval "dev.off()" + file = Mongo::Grid::File.new(File.read(tmpfile), :filename => "#{self.id.to_s}_confidence_plot.svg") + plot_id = $gridfs.insert_one(file) + update(:confidence_plot_id => plot_id) + $gridfs.find_one(_id: confidence_plot_id).data + end + def correlation_plot unless correlation_plot_id - tmpfile = "/tmp/#{id.to_s}.svg" + tmpfile = "/tmp/#{id.to_s}_correlation.svg" x = predictions.collect{|p| p[1]} y = predictions.collect{|p| p[2]} attributes = Model::Lazar.find(self.model_id).attributes diff --git a/lib/dataset.rb b/lib/dataset.rb index 979753c..28d2120 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -118,7 +118,7 @@ module OpenTox def density_plot # TODO: create/store svg R.assign "acts", data_entries.collect{|r| r.first }#.compact - R.eval "plot(density(log(acts),na.rm= TRUE), main='log(#{features.first.name})')" + R.eval "plot(density(-log(acts),na.rm= TRUE), main='-log(#{features.first.name})')" end # Serialisation diff --git a/lib/feature.rb b/lib/feature.rb index 9521597..6fc2c06 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -2,7 +2,6 @@ module OpenTox # Basic feature class class Feature - field :name, type: String field :nominal, type: Boolean field :numeric, type: Boolean field :measured, type: Boolean @@ -85,14 +84,10 @@ module OpenTox # Feature for categorical bioassay results class NominalBioAssay < NominalFeature - # TODO: needed? move to dataset? - field :description, type: String end # Feature for quantitative bioassay results class NumericBioAssay < NumericFeature - # TODO: needed? move to dataset? - field :description, type: String end end diff --git a/lib/model.rb b/lib/model.rb index 418ec18..aed789c 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -86,7 +86,7 @@ module OpenTox acts.empty? ? nil : n << acts end neighbors.compact! # remove neighbors without training activities - predictions << Algorithm.run(prediction_algorithm, compound, neighbors) + predictions << Algorithm.run(prediction_algorithm, compound, {:neighbors => neighbors,:training_dataset_size => training_dataset.data_entries.size}) end # serialize result @@ -138,7 +138,6 @@ module OpenTox end class LazarFminerClassification < LazarClassification - def self.create training_dataset model = super(training_dataset) model.update "_type" => self.to_s # adjust class @@ -155,14 +154,12 @@ module OpenTox end class LazarRegression < Lazar - def initialize super self.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fingerprint_similarity" self.prediction_algorithm = "OpenTox::Algorithm::Regression.weighted_average" self.neighbor_algorithm_parameters = {:min_sim => 0.7} end - end class Prediction @@ -179,15 +176,38 @@ module OpenTox field :crossvalidation_id, type: BSON::ObjectId def predict object - Model::Lazar.find(model_id).predict object + Lazar.find(model_id).predict object + end + + def training_dataset + model.training_dataset + end + + def model + Lazar.find model_id end def crossvalidation CrossValidation.find crossvalidation_id end + + def self.from_csv_file file + p file + metadata_file = file.sub(/csv$/,"json") + p metadata_file + bad_request_error "No metadata file #{metadata_file}" unless File.exist? metadata_file + prediction_model = self.new JSON.parse(File.read(metadata_file)) + training_dataset = Dataset.from_csv_file file + # TODO classification + model = LazarRegression.create training_dataset + cv = RegressionCrossValidation.create model + prediction_model[:model_id] = model.id + prediction_model[:crossvalidation_id] = cv.id + prediction_model.save + prediction_model + end end end end - diff --git a/lib/regression.rb b/lib/regression.rb index 020bb3a..2580a1e 100644 --- a/lib/regression.rb +++ b/lib/regression.rb @@ -19,9 +19,10 @@ module OpenTox class Regression - def self.weighted_average compound, neighbors + def self.weighted_average compound, params weighted_sum = 0.0 sim_sum = 0.0 + neighbors = params[:neighbors] neighbors.each do |row| n,sim,acts = row acts.each do |act| @@ -29,7 +30,7 @@ module OpenTox sim_sum += sim end end - confidence = sim_sum/neighbors.size.to_f + confidence = sim_sum*neighbors.size.to_f/params[:training_dataset_size] sim_sum == 0 ? prediction = nil : prediction = 10**(weighted_sum/sim_sum) {:value => prediction,:confidence => confidence} end -- cgit v1.2.3 From 00be9d31ac01ed972fa8def036f6bc49931f6bcd Mon Sep 17 00:00:00 2001 From: gebele Date: Mon, 31 Aug 2015 12:05:20 +0200 Subject: set required RUBY version --- lazar.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lazar.gemspec b/lazar.gemspec index 8e06aa1..9664fe0 100644 --- a/lazar.gemspec +++ b/lazar.gemspec @@ -12,7 +12,7 @@ Gem::Specification.new do |s| s.license = 'GPL-3' s.rubyforge_project = "lazar" - + s.required_ruby_version = '>= 2.2.0' s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") s.extensions = %w[ext/lazar/extconf.rb] -- cgit v1.2.3 From b10d1394564fbc3a9fb7a9b5eb57038b4dcf08ed Mon Sep 17 00:00:00 2001 From: gebele Date: Tue, 1 Sep 2015 12:11:25 +0200 Subject: undo ruby version --- lazar.gemspec | 1 - 1 file changed, 1 deletion(-) diff --git a/lazar.gemspec b/lazar.gemspec index 9664fe0..fb443fe 100644 --- a/lazar.gemspec +++ b/lazar.gemspec @@ -12,7 +12,6 @@ Gem::Specification.new do |s| s.license = 'GPL-3' s.rubyforge_project = "lazar" - s.required_ruby_version = '>= 2.2.0' s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") s.extensions = %w[ext/lazar/extconf.rb] -- cgit v1.2.3 From 5b844250a7d3be05e3139e0ca3c819c3da8ee4f6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 9 Sep 2015 14:49:35 +0200 Subject: fminer classification fixed --- lib/classification.rb | 3 +- lib/crossvalidation.rb | 140 +++++++++++++++++++++++------------------------ lib/model.rb | 14 +++-- lib/validation.rb | 75 +++---------------------- test/lazar-regression.rb | 3 +- test/validation.rb | 15 +---- 6 files changed, 94 insertions(+), 156 deletions(-) diff --git a/lib/classification.rb b/lib/classification.rb index 0d47983..ab1efd8 100644 --- a/lib/classification.rb +++ b/lib/classification.rb @@ -3,7 +3,8 @@ module OpenTox class Classification - def self.weighted_majority_vote compound, neighbors + def self.weighted_majority_vote compound, params + neighbors = params[:neighbors] return {:value => nil,:confidence => nil,:warning => "Cound not find similar compounds."} if neighbors.empty? weighted_sum = {} sim_sum = 0.0 diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb index a10dc1d..90c0d75 100644 --- a/lib/crossvalidation.rb +++ b/lib/crossvalidation.rb @@ -16,6 +16,47 @@ module OpenTox def validations validation_ids.collect{|vid| Validation.find vid} end + + def model + Model::Lazar.find model_id + end + + def self.create model, n=10 + cv = self.new( + name: model.name, + model_id: model.id, + folds: n + ) + cv.save # set created_at + nr_instances = 0 + nr_unpredicted = 0 + predictions = [] + validation_class = Object.const_get(self.to_s.sub(/Cross/,'')) + training_dataset = Dataset.find model.training_dataset_id + training_dataset.folds(n).each_with_index do |fold,fold_nr| + fork do # parallel execution of validations + $logger.debug "Dataset #{training_dataset.name}: Fold #{fold_nr} started" + t = Time.now + #p validation_class#.create(model, fold[0], fold[1],cv) + validation = validation_class.create(model, fold[0], fold[1],cv) + #p validation + $logger.debug "Dataset #{training_dataset.name}, Fold #{fold_nr}: #{Time.now-t} seconds" + end + end + Process.waitall + cv.validation_ids = Validation.where(:crossvalidation_id => cv.id).distinct(:_id) + cv.validations.each do |validation| + nr_instances += validation.nr_instances + nr_unpredicted += validation.nr_unpredicted + predictions += validation.predictions + end + cv.update_attributes( + nr_instances: nr_instances, + nr_unpredicted: nr_unpredicted, + predictions: predictions + ) + cv + end end class ClassificationCrossValidation < CrossValidation @@ -30,36 +71,35 @@ module OpenTox # TODO auc, f-measure (usability??) def self.create model, n=10 - cv = self.new - cv.save # set created_at - validation_ids = [] - nr_instances = 0 - nr_unpredicted = 0 - predictions = [] - validation_class = Object.const_get(self.to_s.sub(/Cross/,'')) + cv = super model, n accept_values = Feature.find(model.prediction_feature_id).accept_values confusion_matrix = Array.new(accept_values.size,0){Array.new(accept_values.size,0)} weighted_confusion_matrix = Array.new(accept_values.size,0){Array.new(accept_values.size,0)} true_rate = {} predictivity = {} - fold_nr = 1 - training_dataset = Dataset.find model.training_dataset_id - training_dataset.folds(n).each do |fold| - t = Time.now - $logger.debug "Fold #{fold_nr}" - validation = validation_class.create(model, fold[0], fold[1]) - #validation_ids << validation.id - nr_instances += validation.nr_instances - nr_unpredicted += validation.nr_unpredicted - predictions += validation.predictions - validation.confusion_matrix.each_with_index do |r,i| - r.each_with_index do |c,j| - confusion_matrix[i][j] += c - weighted_confusion_matrix[i][j] += validation.weighted_confusion_matrix[i][j] + cv.predictions.each do |pred| + compound_id,activity,prediction,confidence = pred + if activity and prediction and confidence.numeric? + if prediction == activity + if prediction == accept_values[0] + confusion_matrix[0][0] += 1 + weighted_confusion_matrix[0][0] += confidence + elsif prediction == accept_values[1] + confusion_matrix[1][1] += 1 + weighted_confusion_matrix[1][1] += confidence + end + elsif prediction != activity + if prediction == accept_values[0] + confusion_matrix[0][1] += 1 + weighted_confusion_matrix[0][1] += confidence + elsif prediction == accept_values[1] + confusion_matrix[1][0] += 1 + weighted_confusion_matrix[1][0] += confidence + end end + else + nr_unpredicted += 1 if prediction.nil? end - $logger.debug "Fold #{fold_nr}: #{Time.now-t} seconds" - fold_nr +=1 end true_rate = {} predictivity = {} @@ -74,20 +114,13 @@ module OpenTox end end cv.update_attributes( - name: model.name, - model_id: model.id, - folds: n, - #validation_ids: validation_ids, - nr_instances: nr_instances, - nr_unpredicted: nr_unpredicted, accept_values: accept_values, confusion_matrix: confusion_matrix, weighted_confusion_matrix: weighted_confusion_matrix, - accuracy: (confusion_matrix[0][0]+confusion_matrix[1][1])/(nr_instances-nr_unpredicted).to_f, + accuracy: (confusion_matrix[0][0]+confusion_matrix[1][1])/(cv.nr_instances-cv.nr_unpredicted).to_f, weighted_accuracy: (weighted_confusion_matrix[0][0]+weighted_confusion_matrix[1][1])/confidence_sum.to_f, true_rate: true_rate, predictivity: predictivity, - predictions: predictions.sort{|a,b| b[3] <=> a[3]}, # sort according to confidence finished_at: Time.now ) cv.save @@ -110,30 +143,7 @@ module OpenTox field :confidence_plot_id, type: BSON::ObjectId def self.create model, n=10 - cv = self.new - cv.save # set created_at - #validation_ids = [] - nr_instances = 0 - nr_unpredicted = 0 - predictions = [] - validation_class = Object.const_get(self.to_s.sub(/Cross/,'')) - fold_nr = 1 - training_dataset = Dataset.find model.training_dataset_id - training_dataset.folds(n).each_with_index do |fold,fold_nr| - fork do # parallel execution of validations - $logger.debug "Dataset #{training_dataset.name}: Fold #{fold_nr} started" - t = Time.now - validation = validation_class.create(model, fold[0], fold[1],cv) - $logger.debug "Dataset #{training_dataset.name}, Fold #{fold_nr}: #{Time.now-t} seconds" - end - end - Process.waitall - cv.validation_ids = Validation.where(:crossvalidation_id => cv.id).distinct(:_id) - cv.validations.each do |validation| - nr_instances += validation.nr_instances - nr_unpredicted += validation.nr_unpredicted - predictions += validation.predictions - end + cv = super model, n rmse = 0 weighted_rmse = 0 rse = 0 @@ -143,8 +153,7 @@ module OpenTox rae = 0 weighted_rae = 0 confidence_sum = 0 - #nil_activities = [] - predictions.each do |pred| + cv.predictions.each do |pred| compound_id,activity,prediction,confidence = pred if activity and prediction error = Math.log10(prediction)-Math.log10(activity) @@ -153,15 +162,11 @@ module OpenTox mae += error.abs weighted_mae += confidence*error.abs confidence_sum += confidence - cv.predictions << pred else - # TODO: create warnings - cv.warnings << "No training activities for #{Compound.find(compound_id).smiles} in training dataset #{training_dataset.id}." - $logger.debug "No training activities for #{Compound.find(compound_id).smiles} in training dataset #{training_dataset.id}." - #nil_activities << pred + cv.warnings << "No training activities for #{Compound.find(compound_id).smiles} in training dataset #{cv.model.training_dataset_id}." + $logger.debug "No training activities for #{Compound.find(compound_id).smiles} in training dataset #{cv.model.training_dataset_id}." end end - #predictions -= nil_activities x = cv.predictions.collect{|p| p[1]} y = cv.predictions.collect{|p| p[2]} R.assign "measurement", x @@ -174,6 +179,7 @@ module OpenTox rmse = Math.sqrt(rmse/cv.predictions.size) weighted_rmse = Math.sqrt(weighted_rmse/confidence_sum) # TODO check!! +=begin cv.predictions.sort! do |a,b| relative_error_a = (a[1]-a[2]).abs/a[1].to_f relative_error_a = 1/relative_error_a if relative_error_a < 1 @@ -181,14 +187,8 @@ module OpenTox relative_error_b = 1/relative_error_b if relative_error_b < 1 [relative_error_b,b[3]] <=> [relative_error_a,a[3]] end +=end cv.update_attributes( - name: model.name, - model_id: model.id, - folds: n, - #validation_ids: validation_ids, - nr_instances: nr_instances, - nr_unpredicted: nr_unpredicted, - #predictions: predictions,#.sort{|a,b| [(b[1]-b[2]).abs/b[1].to_f,b[3]] <=> [(a[1]-a[2]).abs/a[1].to_f,a[3]]}, mae: mae, rmse: rmse, weighted_mae: weighted_mae, diff --git a/lib/model.rb b/lib/model.rb index aed789c..36011a0 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -192,15 +192,19 @@ module OpenTox end def self.from_csv_file file - p file metadata_file = file.sub(/csv$/,"json") - p metadata_file bad_request_error "No metadata file #{metadata_file}" unless File.exist? metadata_file prediction_model = self.new JSON.parse(File.read(metadata_file)) training_dataset = Dataset.from_csv_file file - # TODO classification - model = LazarRegression.create training_dataset - cv = RegressionCrossValidation.create model + model = nil + cv = nil + if training_dataset.features.first.nominal? + model = LazarFminerClassification.create training_dataset + cv = ClassificationCrossValidation.create model + elsif training_dataset.features.first.numeric? + model = LazarRegression.create training_dataset + cv = RegressionCrossValidation.create model + end prediction_model[:model_id] = model.id prediction_model[:crossvalidation_id] = cv.id prediction_model.save diff --git a/lib/validation.rb b/lib/validation.rb index 445f897..63fbd89 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -1,7 +1,6 @@ module OpenTox class Validation - #include Celluloid field :prediction_dataset_id, type: BSON::ObjectId field :crossvalidation_id, type: BSON::ObjectId @@ -18,74 +17,9 @@ module OpenTox Dataset.find test_dataset_id end - end - - class ClassificationValidation < Validation - field :accept_values, type: String - field :confusion_matrix, type: Array - field :weighted_confusion_matrix, type: Array - - def self.create model, training_set, test_set - validation = self.class.new - #feature_dataset = Dataset.find model.feature_dataset_id - # TODO check and delegate to Algorithm - #features = Algorithm.run feature_dataset.training_algorithm, training_set, feature_dataset.training_parameters - validation_model = model.class.create training_set#, features - test_set_without_activities = Dataset.new(:compound_ids => test_set.compound_ids) # just to be sure that activities cannot be used - prediction_dataset = validation_model.predict test_set_without_activities - accept_values = prediction_dataset.prediction_feature.accept_values - confusion_matrix = Array.new(accept_values.size,0){Array.new(accept_values.size,0)} - weighted_confusion_matrix = Array.new(accept_values.size,0){Array.new(accept_values.size,0)} - predictions = [] - nr_unpredicted = 0 - prediction_dataset.data_entries.each_with_index do |pe,i| - if pe[0] and pe[1] and pe[1].numeric? - prediction = pe[0] - # TODO prediction_feature, convention?? - # TODO generalize for multiple classes - activity = test_set.data_entries[i].first - confidence = prediction_dataset.data_entries[i][1] - predictions << [prediction_dataset.compound_ids[i], activity, prediction, confidence] - if prediction == activity - if prediction == accept_values[0] - confusion_matrix[0][0] += 1 - weighted_confusion_matrix[0][0] += confidence - elsif prediction == accept_values[1] - confusion_matrix[1][1] += 1 - weighted_confusion_matrix[1][1] += confidence - end - elsif prediction != activity - if prediction == accept_values[0] - confusion_matrix[0][1] += 1 - weighted_confusion_matrix[0][1] += confidence - elsif prediction == accept_values[1] - confusion_matrix[1][0] += 1 - weighted_confusion_matrix[1][0] += confidence - end - end - else - nr_unpredicted += 1 if pe[0].nil? - end - end - validation = self.new( - :prediction_dataset_id => prediction_dataset.id, - :test_dataset_id => test_set.id, - :nr_instances => test_set.compound_ids.size, - :nr_unpredicted => nr_unpredicted, - :accept_values => accept_values, - :confusion_matrix => confusion_matrix, - :weighted_confusion_matrix => weighted_confusion_matrix, - :predictions => predictions.sort{|a,b| b[3] <=> a[3]} # sort according to confidence - ) - validation.save - validation - end - end - - class RegressionValidation < Validation def self.create model, training_set, test_set, crossvalidation=nil - validation_model = Model::LazarRegression.create training_set + validation_model = model.class.create training_set#, features test_set_without_activities = Dataset.new(:compound_ids => test_set.compound_ids) # just to be sure that activities cannot be used prediction_dataset = validation_model.predict test_set_without_activities predictions = [] @@ -112,6 +46,13 @@ module OpenTox validation.save validation end + + end + + class ClassificationValidation < Validation + end + + class RegressionValidation < Validation end end diff --git a/test/lazar-regression.rb b/test/lazar-regression.rb index 4062cfd..cc7f356 100644 --- a/test/lazar-regression.rb +++ b/test/lazar-regression.rb @@ -7,8 +7,9 @@ class LazarRegressionTest < MiniTest::Test model = Model::LazarRegression.create training_dataset compound = Compound.from_smiles "CC(C)(C)CN" prediction = model.predict compound + #p prediction assert_equal 13.6, prediction[:value].round(1) - assert_equal 0.83, prediction[:confidence].round(2) + #assert_equal 0.83, prediction[:confidence].round(2) assert_equal 1, prediction[:neighbors].size end diff --git a/test/validation.rb b/test/validation.rb index 009c337..5f859c6 100644 --- a/test/validation.rb +++ b/test/validation.rb @@ -6,8 +6,6 @@ class ValidationTest < MiniTest::Test dataset = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" model = Model::LazarFminerClassification.create dataset cv = ClassificationCrossValidation.create model - p cv.accuracy - p cv.weighted_accuracy refute_empty cv.validation_ids assert cv.accuracy > 0.8 assert cv.weighted_accuracy > cv.accuracy, "Weighted accuracy (#{cv.weighted_accuracy}) larger than unweighted accuracy(#{cv.accuracy}) " @@ -17,8 +15,6 @@ class ValidationTest < MiniTest::Test dataset = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" model = Model::LazarClassification.create dataset#, features cv = ClassificationCrossValidation.create model - p cv.accuracy - p cv.weighted_accuracy assert cv.accuracy > 0.7 assert cv.weighted_accuracy > cv.accuracy, "Weighted accuracy should be larger than unweighted accuracy." end @@ -28,18 +24,13 @@ class ValidationTest < MiniTest::Test dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.csv" model = Model::LazarRegression.create dataset cv = RegressionCrossValidation.create model - p cv.rmse - p cv.weighted_rmse - p cv.mae - p cv.weighted_mae #`inkview #{cv.plot}` #puts JSON.pretty_generate(cv.misclassifications)#.collect{|l| l.join ", "}.join "\n" - p cv.misclassifications.collect{|l| l[:neighbors].size} - `inkview #{cv.plot}` + #`inkview #{cv.plot}` assert cv.rmse < 30, "RMSE > 30" - assert cv.weighted_rmse < cv.rmse, "Weighted RMSE (#{cv.weighted_rmse}) larger than unweighted RMSE(#{cv.rmse}) " + #assert cv.weighted_rmse < cv.rmse, "Weighted RMSE (#{cv.weighted_rmse}) larger than unweighted RMSE(#{cv.rmse}) " assert cv.mae < 12 - assert cv.weighted_mae < cv.mae + #assert cv.weighted_mae < cv.mae end end -- cgit v1.2.3 From 96a476a2331daa4d1d6b5ac444bbdbd2ac221a5f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 10 Sep 2015 12:54:18 +0200 Subject: tests fixed (crossvalidations may fail due to memory constraints) --- lib/compound.rb | 12 +++--------- lib/dataset.rb | 32 +------------------------------- lib/experiment.rb | 4 ++-- lib/model.rb | 7 +++++-- lib/overwrite.rb | 4 ++++ test/dataset-long.rb | 12 ++++-------- test/dataset.rb | 10 +++------- test/error.rb | 4 +--- test/experiment.rb | 5 ++--- test/feature.rb | 13 +++---------- test/lazar-long.rb | 43 +++++++++++++++++++++---------------------- test/validation.rb | 2 +- 12 files changed, 50 insertions(+), 98 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 8f393f5..6adf3c0 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -218,11 +218,6 @@ module OpenTox obconversion.write_string(obmol).gsub(/\s/,'').chomp when /sdf/ p "SDF conversion" - # has no effect - #obconversion.add_option("gen3D", OpenBabel::OBConversion::GENOPTIONS) - # segfaults with openbabel git master - #OpenBabel::OBOp.find_type("Gen3D").do(obmol) - # TODO: find disconnected structures # strip_salts # separate @@ -234,14 +229,13 @@ p "SDF conversion" print sdf if sdf.match(/.nan/) -# TODO: fix or eliminate 2d generation $logger.warn "3D generation failed for compound #{identifier}, trying to calculate 2D structure" obconversion.set_options("gen2D", OpenBabel::OBConversion::GENOPTIONS) - #OpenBabel::OBOp.find_type("Gen2D").do(obmol) sdf = obconversion.write_string(obmol) if sdf.match(/.nan/) - $logger.warn "2D generation failed for compound #{identifier}" - sdf = nil + $logger.warn "2D generation failed for compound #{identifier}, rendering without coordinates." + obconversion.remove_option("gen2D", OpenBabel::OBConversion::GENOPTIONS) + sdf = obconversion.write_string(obmol) end end sdf diff --git a/lib/dataset.rb b/lib/dataset.rb index 28d2120..851fabd 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -151,7 +151,7 @@ module OpenTox name = File.basename(file,".*") dataset = self.find_by(:source => source, :name => name) if dataset - $logger.debug "#{file} already in database." + $logger.debug "Skipping #{file}, it is already in the database (id: #{dataset.id})." else $logger.debug "Parsing #{file}." table = CSV.read file, :skip_blanks => true @@ -270,36 +270,6 @@ module OpenTox end -=begin - # TODO remove - - # Create a dataset with compounds and features - def self.create compounds, features, warnings=[], source=nil - dataset = Dataset.new(:warnings => warnings) - dataset.compounds = compounds - dataset.features = features - dataset - end - # merge dataset (i.e. append features) - def +(dataset) - bad_request_error "Dataset merge failed because the argument is not a OpenTox::Dataset but a #{dataset.class}" unless dataset.is_a? Dataset - bad_request_error "Dataset merge failed because compounds are unequal in datasets #{self.id} and #{dataset.id}" unless compound_ids == dataset.compound_ids - self.feature_ids ||= [] - self.feature_ids = self.feature_ids + dataset.feature_ids - @data_entries ||= Array.new(compound_ids.size){[]} - @data_entries.each_with_index do |row,i| - @data_entries[i] = row + dataset.fingerprint(compounds[i]) - end - self - - end - - def fingerprint(compound) - i = compound_ids.index(compound.id) - i.nil? ? nil : data_entries[i] - end -=end - # Fill unset data entries # @param any value def fill_nil_with n diff --git a/lib/experiment.rb b/lib/experiment.rb index 191e76e..2f51756 100644 --- a/lib/experiment.rb +++ b/lib/experiment.rb @@ -34,7 +34,7 @@ module OpenTox if cv $logger.debug "Creating #{cv} for #{model_algorithm}, dataset #{dataset.name}, with prediction_algorithm #{prediction_algorithm}, neighbor_algorithm #{neighbor_algorithm}, neighbor_algorithm_parameters #{neighbor_algorithm_parameter}." crossvalidation = cv.create model - crossvalidation_ids << crossvalidation.id + self.crossvalidation_ids << crossvalidation.id else $logger.warn "#{dataset.features.first} is neither nominal nor numeric." end @@ -55,7 +55,7 @@ module OpenTox def report # TODO create ggplot2 report - crossvalidation_ids.each do |id| + self.crossvalidation_ids.each do |id| cv = CrossValidation.find(id) file = "/tmp/#{id}.svg" File.open(file,"w+"){|f| f.puts cv.correlation_plot} diff --git a/lib/model.rb b/lib/model.rb index 36011a0..547144f 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -138,16 +138,19 @@ module OpenTox end class LazarFminerClassification < LazarClassification - def self.create training_dataset + field :feature_calculation_parameters, type: Hash + + def self.create training_dataset, fminer_params={} model = super(training_dataset) model.update "_type" => self.to_s # adjust class model = self.find model.id # adjust class model.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fminer_similarity" model.neighbor_algorithm_parameters = { :feature_calculation_algorithm => "OpenTox::Algorithm::Descriptor.smarts_match", - :feature_dataset_id => Algorithm::Fminer.bbrc(training_dataset).id, + :feature_dataset_id => Algorithm::Fminer.bbrc(training_dataset,fminer_params).id, :min_sim => 0.3 } + model.feature_calculation_parameters = fminer_params model.save model end diff --git a/lib/overwrite.rb b/lib/overwrite.rb index cb47527..08baa39 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -122,4 +122,8 @@ module URI false end + def self.task? uri + uri =~ /task/ and URI.valid? uri + end + end diff --git a/test/dataset-long.rb b/test/dataset-long.rb index 5463079..5c8dfb8 100644 --- a/test/dataset-long.rb +++ b/test/dataset-long.rb @@ -91,15 +91,13 @@ class DatasetLongTest < MiniTest::Test d = Dataset.from_csv_file f assert_equal 458, d.features.size d.save - p "Upload: #{Time.now-t}" + #p "Upload: #{Time.now-t}" d2 = Dataset.find d.id t = Time.now assert_equal d.features.size, d2.features.size csv = CSV.read f - csv.delete_at(248) # remove entry with InChi segfault csv.shift # remove header - refute_empty d2.warnings - assert_match /249/, d2.warnings.join + assert_empty d2.warnings assert_equal csv.size, d2.compounds.size assert_equal csv.first.size-1, d2.features.size d2.compounds.each_with_index do |compound,i| @@ -107,11 +105,9 @@ class DatasetLongTest < MiniTest::Test row.shift # remove compound assert_equal row, d2.data_entries[i] end - p "Dowload: #{Time.now-t}" + #p "Dowload: #{Time.now-t}" d2.delete - assert_raises Mongoid::Errors::DocumentNotFound do - Dataset.find d.id - end + assert_nil Dataset.find d.id end end diff --git a/test/dataset.rb b/test/dataset.rb index b5275d4..26ff219 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -64,12 +64,8 @@ class DatasetTest < MiniTest::Test assert_equal 2, new_dataset.features.size assert_equal [[1,2],[4,5],[6,7]], new_dataset.data_entries d.delete - assert_raises Mongoid::Errors::DocumentNotFound do - Dataset.find d.id - end - assert_raises Mongoid::Errors::DocumentNotFound do - Dataset.find new_dataset.id - end + assert_nil Dataset.find d.id + assert_nil Dataset.find new_dataset.id end def test_dataset_accessors @@ -78,7 +74,7 @@ class DatasetTest < MiniTest::Test new_dataset = Dataset.find d.id # get metadata assert_match "multicolumn.csv", new_dataset.source - assert_equal "multicolumn.csv", new_dataset.name + assert_equal "multicolumn", new_dataset.name # get features assert_equal 6, new_dataset.features.size assert_equal 7, new_dataset.compounds.size diff --git a/test/error.rb b/test/error.rb index 7b71b22..16a7077 100644 --- a/test/error.rb +++ b/test/error.rb @@ -4,9 +4,7 @@ class ErrorTest < MiniTest::Test def test_bad_request object = OpenTox::Feature.new - assert_raises Mongoid::Errors::DocumentNotFound do - response = OpenTox::Feature.find(object.id) - end + assert_nil OpenTox::Feature.find(object.id) end def test_error_methods diff --git a/test/experiment.rb b/test/experiment.rb index 17a0fae..c465d7b 100644 --- a/test/experiment.rb +++ b/test/experiment.rb @@ -21,11 +21,10 @@ class ExperimentTest < MiniTest::Test :prediction_algorithms => prediction_algorithms, ) experiment.run - experiment = Experiment.find "55dda70d2b72ed6ea9000188" =begin - p experiment.id -=end + p experiment experiment.report +=end refute_empty experiment.crossvalidation_ids end end diff --git a/test/feature.rb b/test/feature.rb index 71ef4c0..69204ab 100644 --- a/test/feature.rb +++ b/test/feature.rb @@ -26,16 +26,13 @@ class FeatureTest < MiniTest::Test id = @feature2.id @feature2.delete - assert_raises Mongoid::Errors::DocumentNotFound do - OpenTox::Feature.find(id) - end + assert_nil OpenTox::Feature.find(id) end def test_duplicated_features metadata = { :name => "feature duplication test", :nominal => true, - :description => "feature duplication test" } feature = NumericBioAssay.find_or_create_by metadata dup_feature = NumericBioAssay.find_or_create_by metadata @@ -44,12 +41,8 @@ class FeatureTest < MiniTest::Test assert !feature.id.nil?, "No Feature ID in #{dup_feature.inspect}" assert_equal feature.id, dup_feature.id feature.delete - assert_raises Mongoid::Errors::DocumentNotFound do - OpenTox::Feature.find(feature.id) - end - assert_raises Mongoid::Errors::DocumentNotFound do - OpenTox::Feature.find(dup_feature.id) - end + assert_nil OpenTox::Feature.find(feature.id) + assert_nil OpenTox::Feature.find(dup_feature.id) end def test_smarts_feature diff --git a/test/lazar-long.rb b/test/lazar-long.rb index 1b58319..92d7d5a 100644 --- a/test/lazar-long.rb +++ b/test/lazar-long.rb @@ -4,36 +4,37 @@ class LazarExtendedTest < MiniTest::Test def test_lazar_bbrc_ham_minfreq dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"hamster_carcinogenicity.csv") - model = OpenTox::Model::Lazar.create dataset, OpenTox::Algorithm::Fminer.bbrc(dataset, :min_frequency => 5) - feature_dataset = OpenTox::Dataset.find model.feature_dataset_id + model = Model::LazarFminerClassification.create(dataset, :min_frequency => 5) + feature_dataset = Dataset.find model.neighbor_algorithm_parameters[:feature_dataset_id] assert_equal dataset.compounds.size, feature_dataset.compounds.size - assert_equal 41, feature_dataset.features.size - assert_equal 'N-C=N', feature_dataset.features.first.smarts + assert_equal model.feature_calculation_parameters, {"min_frequency"=>5} + #TODO check frequencies, features and confidence + #assert_equal 41, feature_dataset.features.size + #assert_equal 'N-C=N', feature_dataset.features.first.smarts compound = OpenTox::Compound.from_inchi("InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H") prediction = model.predict compound assert_equal "false", prediction[:value] - assert_equal 0.12380952380952381, prediction[:confidence] + #assert_equal 0.12380952380952381, prediction[:confidence] dataset.delete model.delete feature_dataset.delete end def test_lazar_bbrc_large_ds - # TODO fminer crashes with these settings - skip "it seems that fminer aborts without further notice" dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"multi_cell_call_no_dup.csv") - feature_dataset = OpenTox::Algorithm::Fminer.bbrc dataset#, :min_frequency => 15) - model = OpenTox::Model::Lazar.create dataset, feature_dataset + model = Model::LazarFminerClassification.create dataset + feature_dataset = Dataset.find model.neighbor_algorithm_parameters[:feature_dataset_id] model.save p model.id - feature_dataset = OpenTox::CalculatedDataset.find model.feature_dataset_id assert_equal dataset.compounds.size, feature_dataset.compounds.size - assert_equal 52, feature_dataset.features.size - assert_equal '[#17&A]-[#6&A]', feature_dataset.features.first.name + #assert_equal 52, feature_dataset.features.size + #assert_equal '[#17&A]-[#6&A]', feature_dataset.features.first.name compound = OpenTox::Compound.from_inchi("InChI=1S/C10H9NO2S/c1-8-2-4-9(5-3-8)13-6-10(12)11-7-14/h2-5H,6H2,1H3") - prediction_dataset = model.predict compound - prediction = prediction_dataset.data_entries.first - assert_in_delta 0.025, prediction[:confidence], 0.001 + prediction = model.predict compound + assert_equal "1", prediction[:value] + #p prediction + #prediction = prediction_dataset.data_entries.first + #assert_in_delta 0.025, prediction[:confidence], 0.001 #assert_equal 0.025885845574483608, prediction[:confidence] # with compound change in training_dataset see: # https://github.com/opentox/opentox-test/commit/0e78c9c59d087adbd4cc58bab60fb29cbe0c1da0 @@ -41,7 +42,6 @@ class LazarExtendedTest < MiniTest::Test dataset.delete model.delete feature_dataset.delete - prediction_dataset.delete end def test_lazar_kazius @@ -49,21 +49,20 @@ class LazarExtendedTest < MiniTest::Test dataset = Dataset.from_csv_file File.join(DATA_DIR,"kazius.csv") p "Dataset upload: #{Time.now-t}" t = Time.now - feature_dataset = Algorithm::Fminer.bbrc(dataset, :min_frequency => 100) + model = Model::LazarFminerClassification.create(dataset, :min_frequency => 100) p "Feature mining: #{Time.now-t}" t = Time.now + feature_dataset = Dataset.find model.neighbor_algorithm_parameters[:feature_dataset_id] assert_equal feature_dataset.compounds.size, dataset.compounds.size - model = Model::Lazar.create dataset, feature_dataset -=begin -=end #model = Model::Lazar.find('55bcf5bf7a7838381200017e') #p model.id #prediction_times = [] 2.times do compound = Compound.from_smiles("Clc1ccccc1NN") prediction = model.predict compound - assert_equal "1", prediction[:value] - assert_in_delta 0.019858401199860445, prediction[:confidence], 0.001 + p prediction + #assert_equal "1", prediction[:value] + #assert_in_delta 0.019858401199860445, prediction[:confidence], 0.001 end #dataset.delete #feature_dataset.delete diff --git a/test/validation.rb b/test/validation.rb index 5f859c6..a4c3d80 100644 --- a/test/validation.rb +++ b/test/validation.rb @@ -7,7 +7,7 @@ class ValidationTest < MiniTest::Test model = Model::LazarFminerClassification.create dataset cv = ClassificationCrossValidation.create model refute_empty cv.validation_ids - assert cv.accuracy > 0.8 + assert cv.accuracy > 0.8, "Crossvalidation accuracy lower than 0.8" assert cv.weighted_accuracy > cv.accuracy, "Weighted accuracy (#{cv.weighted_accuracy}) larger than unweighted accuracy(#{cv.accuracy}) " end -- cgit v1.2.3 From e5c538f6c71e7c17c63d7233ef1be06a19b9e132 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 14 Sep 2015 11:44:34 +0200 Subject: classification? and regression? methods for Model::Prediction --- lib/model.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/model.rb b/lib/model.rb index 547144f..d89051a 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -194,6 +194,14 @@ module OpenTox CrossValidation.find crossvalidation_id end + def regression? + training_dataset.features.first.numeric? + end + + def classification? + training_dataset.features.first.nominal? + end + def self.from_csv_file file metadata_file = file.sub(/csv$/,"json") bad_request_error "No metadata file #{metadata_file}" unless File.exist? metadata_file -- cgit v1.2.3 From db9cb123b86be60b8dbc817fbdb79b1891dd8044 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 14 Sep 2015 13:15:46 +0200 Subject: attr_accessor :training_dataset removed in Lazar models --- lib/model.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index d89051a..4aa8642 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -25,7 +25,7 @@ module OpenTox field :neighbor_algorithm_parameters, type: Hash attr_accessor :prediction_dataset - attr_accessor :training_dataset + #attr_accessor :training_dataset # Create a lazar model from a training_dataset and a feature_dataset # @param [OpenTox::Dataset] training_dataset @@ -116,7 +116,7 @@ module OpenTox end def training_dataset - return Dataset.find(training_dataset_id) + Dataset.find(training_dataset_id) end end -- cgit v1.2.3 From 4464b69ddf82fcb6302c8595217e00238517fe5f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 14 Sep 2015 13:40:11 +0200 Subject: training_dataset moved to base Model class --- lib/model.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/model.rb b/lib/model.rb index 4aa8642..0155fc8 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -16,6 +16,10 @@ module OpenTox field :prediction_algorithm, type: String # prediction feature field :prediction_feature_id, type: BSON::ObjectId + + def training_dataset + Dataset.find(training_dataset_id) + end end class Lazar < Model @@ -24,7 +28,7 @@ module OpenTox field :neighbor_algorithm, type: String field :neighbor_algorithm_parameters, type: Hash - attr_accessor :prediction_dataset + #attr_accessor :prediction_dataset #attr_accessor :training_dataset # Create a lazar model from a training_dataset and a feature_dataset @@ -115,10 +119,6 @@ module OpenTox return prediction_dataset end - def training_dataset - Dataset.find(training_dataset_id) - end - end def training_activities -- cgit v1.2.3 From 33c2404882cbed78c1c5d9d0b60e0da4594a7fc5 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Mon, 14 Sep 2015 13:44:51 +0200 Subject: tests for Model::Prediction.[classification|regression]? --- test/prediction_models.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/prediction_models.rb b/test/prediction_models.rb index b4ad415..001ebcd 100644 --- a/test/prediction_models.rb +++ b/test/prediction_models.rb @@ -15,6 +15,8 @@ class PredictionModelTest < MiniTest::Test [:endpoint,:species,:source].each do |p| refute_empty pm[p] end + assert pm.classification? + refute pm.regression? assert pm.crossvalidation.accuracy > 0.8 prediction = pm.predict Compound.from_smiles("CCCC(NN)C") assert_equal "true", prediction[:value] -- cgit v1.2.3 From d3a4c309d48b794f2f60f44bb9a3d94f402cc82f Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Sep 2015 13:11:45 +0200 Subject: repeated crossvalidations, improved experiment reports --- lib/crossvalidation.rb | 57 +++++++++++++++++++++-------------- lib/dataset.rb | 1 + lib/error.rb | 2 +- lib/experiment.rb | 81 +++++++++++++++++++++++++------------------------- lib/lazar.rb | 5 ++-- lib/model.rb | 3 -- test/experiment.rb | 62 +++++++++++++++++++++++++++++--------- test/validation.rb | 12 ++++++++ 8 files changed, 141 insertions(+), 82 deletions(-) diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb index 90c0d75..f480932 100644 --- a/lib/crossvalidation.rb +++ b/lib/crossvalidation.rb @@ -22,7 +22,9 @@ module OpenTox end def self.create model, n=10 - cv = self.new( + model.training_dataset.features.first.nominal? ? klass = ClassificationCrossValidation : klass = RegressionCrossValidation + bad_request_error "#{dataset.features.first} is neither nominal nor numeric." unless klass + cv = klass.new( name: model.name, model_id: model.id, folds: n @@ -55,6 +57,7 @@ module OpenTox nr_unpredicted: nr_unpredicted, predictions: predictions ) + cv.statistics cv end end @@ -70,14 +73,13 @@ module OpenTox field :predictivity, type: Hash # TODO auc, f-measure (usability??) - def self.create model, n=10 - cv = super model, n + def statistics accept_values = Feature.find(model.prediction_feature_id).accept_values confusion_matrix = Array.new(accept_values.size,0){Array.new(accept_values.size,0)} weighted_confusion_matrix = Array.new(accept_values.size,0){Array.new(accept_values.size,0)} true_rate = {} predictivity = {} - cv.predictions.each do |pred| + predictions.each do |pred| compound_id,activity,prediction,confidence = pred if activity and prediction and confidence.numeric? if prediction == activity @@ -113,18 +115,16 @@ module OpenTox confidence_sum += c end end - cv.update_attributes( + update_attributes( accept_values: accept_values, confusion_matrix: confusion_matrix, weighted_confusion_matrix: weighted_confusion_matrix, - accuracy: (confusion_matrix[0][0]+confusion_matrix[1][1])/(cv.nr_instances-cv.nr_unpredicted).to_f, + accuracy: (confusion_matrix[0][0]+confusion_matrix[1][1])/(nr_instances-nr_unpredicted).to_f, weighted_accuracy: (weighted_confusion_matrix[0][0]+weighted_confusion_matrix[1][1])/confidence_sum.to_f, true_rate: true_rate, predictivity: predictivity, finished_at: Time.now ) - cv.save - cv end #Average area under roc 0.646 @@ -142,8 +142,7 @@ module OpenTox field :correlation_plot_id, type: BSON::ObjectId field :confidence_plot_id, type: BSON::ObjectId - def self.create model, n=10 - cv = super model, n + def statistics rmse = 0 weighted_rmse = 0 rse = 0 @@ -153,7 +152,7 @@ module OpenTox rae = 0 weighted_rae = 0 confidence_sum = 0 - cv.predictions.each do |pred| + predictions.each do |pred| compound_id,activity,prediction,confidence = pred if activity and prediction error = Math.log10(prediction)-Math.log10(activity) @@ -163,24 +162,24 @@ module OpenTox weighted_mae += confidence*error.abs confidence_sum += confidence else - cv.warnings << "No training activities for #{Compound.find(compound_id).smiles} in training dataset #{cv.model.training_dataset_id}." - $logger.debug "No training activities for #{Compound.find(compound_id).smiles} in training dataset #{cv.model.training_dataset_id}." + warnings << "No training activities for #{Compound.find(compound_id).smiles} in training dataset #{model.training_dataset_id}." + $logger.debug "No training activities for #{Compound.find(compound_id).smiles} in training dataset #{model.training_dataset_id}." end end - x = cv.predictions.collect{|p| p[1]} - y = cv.predictions.collect{|p| p[2]} + x = predictions.collect{|p| p[1]} + y = predictions.collect{|p| p[2]} R.assign "measurement", x R.assign "prediction", y R.eval "r <- cor(-log(measurement),-log(prediction))" r = R.eval("r").to_ruby - mae = mae/cv.predictions.size + mae = mae/predictions.size weighted_mae = weighted_mae/confidence_sum - rmse = Math.sqrt(rmse/cv.predictions.size) + rmse = Math.sqrt(rmse/predictions.size) weighted_rmse = Math.sqrt(weighted_rmse/confidence_sum) # TODO check!! =begin - cv.predictions.sort! do |a,b| + predictions.sort! do |a,b| relative_error_a = (a[1]-a[2]).abs/a[1].to_f relative_error_a = 1/relative_error_a if relative_error_a < 1 relative_error_b = (b[1]-b[2]).abs/b[1].to_f @@ -188,15 +187,14 @@ module OpenTox [relative_error_b,b[3]] <=> [relative_error_a,a[3]] end =end - cv.update_attributes( + update_attributes( mae: mae, rmse: rmse, weighted_mae: weighted_mae, weighted_rmse: weighted_rmse, - r_squared: r**2 + r_squared: r**2, + finished_at: Time.now ) - cv.save - cv end def misclassifications n=nil @@ -277,5 +275,20 @@ module OpenTox end end + class RepeatedCrossValidation + field :crossvalidation_ids, type: Array, default: [] + def self.create model, folds=10, repeats=3 + repeated_cross_validation = self.new + repeats.times do + repeated_cross_validation.crossvalidation_ids << CrossValidation.create(model, folds).id + end + repeated_cross_validation.save + repeated_cross_validation + end + def crossvalidations + crossvalidation_ids.collect{|id| CrossValidation.find(id)} + end + end + end diff --git a/lib/dataset.rb b/lib/dataset.rb index 851fabd..d884716 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -47,6 +47,7 @@ module OpenTox @data_entries = Marshal.load(data_entry_file.data) bad_request_error "Data entries (#{data_entries_id}) are not a 2D-Array" unless @data_entries.is_a? Array and @data_entries.first.is_a? Array bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries.size} rows, but dataset (#{id}) has #{compound_ids.size} compounds" unless @data_entries.size == compound_ids.size + # TODO: data_entries can be empty, poorly reproducible, mongo problem? bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries.first.size} columns, but dataset (#{id}) has #{feature_ids.size} features" unless @data_entries.first.size == feature_ids.size #$logger.debug "Retrieving data: #{Time.now-t}" end diff --git a/lib/error.rb b/lib/error.rb index 8fe8a1e..39b3c76 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -58,7 +58,7 @@ module OpenTox OpenTox.const_set error[:class],c # define global methods for raising errors, eg. bad_request_error - Object.send(:define_method, error[:method]) do |message,uri=nil,cause=nil| + Object.send(:define_method, error[:method]) do |message| raise c.new(message) end end diff --git a/lib/experiment.rb b/lib/experiment.rb index 2f51756..7849337 100644 --- a/lib/experiment.rb +++ b/lib/experiment.rb @@ -2,45 +2,22 @@ module OpenTox class Experiment field :dataset_ids, type: Array - field :model_algorithms, type: Array - field :model_ids, type: Array, default: [] - field :crossvalidation_ids, type: Array, default: [] - field :prediction_algorithms, type: Array - field :neighbor_algorithms, type: Array - field :neighbor_algorithm_parameters, type: Array + field :model_settings, type: Array + field :results, type: Hash, default: {} end - # TODO more sophisticated experimental design def run dataset_ids.each do |dataset_id| dataset = Dataset.find(dataset_id) - model_algorithms.each do |model_algorithm| - prediction_algorithms.each do |prediction_algorithm| - neighbor_algorithms.each do |neighbor_algorithm| - neighbor_algorithm_parameters.each do |neighbor_algorithm_parameter| - $logger.debug "Creating #{model_algorithm} model for dataset #{dataset.name}, with prediction_algorithm #{prediction_algorithm}, neighbor_algorithm #{neighbor_algorithm}, neighbor_algorithm_parameters #{neighbor_algorithm_parameter}." - model = Object.const_get(model_algorithm).create dataset - model.prediction_algorithm = prediction_algorithm - model.neighbor_algorithm = neighbor_algorithm - model.neighbor_algorithm_parameters = neighbor_algorithm_parameter - model.save - model_ids << model.id - cv = nil - if dataset.features.first.nominal - cv = ClassificationCrossValidation - elsif dataset.features.first.numeric - cv = RegressionCrossValidation - end - if cv - $logger.debug "Creating #{cv} for #{model_algorithm}, dataset #{dataset.name}, with prediction_algorithm #{prediction_algorithm}, neighbor_algorithm #{neighbor_algorithm}, neighbor_algorithm_parameters #{neighbor_algorithm_parameter}." - crossvalidation = cv.create model - self.crossvalidation_ids << crossvalidation.id - else - $logger.warn "#{dataset.features.first} is neither nominal nor numeric." - end - end - end - end + results[dataset_id.to_s] = [] + model_settings.each do |setting| + model = Object.const_get(setting[:algorithm]).create dataset + model.prediction_algorithm = setting[:prediction_algorithm] if setting[:prediction_algorithm] + model.neighbor_algorithm = setting[:neighbor_algorithm] if setting[:neighbor_algorithm] + model.neighbor_algorithm_parameters = setting[:neighbor_algorithm_parameter] if setting[:neighbor_algorithm_parameter] + model.save + repeated_crossvalidation = RepeatedCrossValidation.create model + results[dataset_id.to_s] << {:model_id => model.id, :repeated_crossvalidation_id => repeated_crossvalidation.id} end end save @@ -54,13 +31,37 @@ module OpenTox end def report - # TODO create ggplot2 report - self.crossvalidation_ids.each do |id| - cv = CrossValidation.find(id) - file = "/tmp/#{id}.svg" - File.open(file,"w+"){|f| f.puts cv.correlation_plot} - `inkview '#{file}'` + # TODO significances + report = {} + report[:name] = name + report[:experiment_id] = self.id.to_s + dataset_ids.each do |dataset_id| + dataset_name = Dataset.find(dataset_id).name + report[dataset_name] = [] + results[dataset_id.to_s].each do |result| + model = Model::Lazar.find(result[:model_id]) + repeated_cv = RepeatedCrossValidation.find(result[:repeated_crossvalidation_id]) + crossvalidations = repeated_cv.crossvalidations + summary = {} + [:neighbor_algorithm, :neighbor_algorithm_parameters, :prediction_algorithm].each do |key| + summary[key] = model[key] + end + summary[:nr_instances] = crossvalidations.first.nr_instances + summary[:nr_unpredicted] = crossvalidations.collect{|cv| cv.nr_unpredicted} + summary[:time] = crossvalidations.collect{|cv| cv.time} + if crossvalidations.first.is_a? ClassificationCrossValidation + summary[:accuracies] = crossvalidations.collect{|cv| cv.accuracy} + elsif crossvalidations.first.is_a? RegressionCrossValidation + summary[:r_squared] = crossvalidations.collect{|cv| cv.r_squared} + end + report[dataset_name] << summary + #p repeated_cv.crossvalidations.collect{|cv| cv.accuracy} + #file = "/tmp/#{id}.svg" + #File.open(file,"w+"){|f| f.puts cv.correlation_plot} + #`inkview '#{file}'` + end end + report end end diff --git a/lib/lazar.rb b/lib/lazar.rb index decbe69..9b02053 100644 --- a/lib/lazar.rb +++ b/lib/lazar.rb @@ -15,7 +15,8 @@ ENV["MONGOID_ENV"] ||= "development" # TODO remove config files, change default via ENV or directly in Mongoid class Mongoid.load!("#{File.expand_path(File.join(File.dirname(__FILE__),'..','mongoid.yml'))}") Mongoid.raise_not_found_error = false # return nil if no document is found -$mongo = Mongoid.default_client +$mongo = Mongo::Client.new('mongodb://127.0.0.1:27017/opentox') +#$mongo = Mongoid.default_client $gridfs = $mongo.database.fs # R setup @@ -42,7 +43,7 @@ ENV['FMINER_SILENT'] = 'true' ENV['FMINER_NR_HITS'] = 'true' # OpenTox classes and includes -CLASSES = ["Feature","Compound","Dataset","Validation","CrossValidation","Experiment"]# Algorithm and Models are modules +CLASSES = ["Feature","Compound","Dataset","Validation","CrossValidation","RepeatedCrossValidation","Experiment"]# Algorithm and Models are modules [ # be aware of the require sequence as it affects class/method overwrites "overwrite.rb", diff --git a/lib/model.rb b/lib/model.rb index 0155fc8..ddb69e4 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -28,9 +28,6 @@ module OpenTox field :neighbor_algorithm, type: String field :neighbor_algorithm_parameters, type: Hash - #attr_accessor :prediction_dataset - #attr_accessor :training_dataset - # Create a lazar model from a training_dataset and a feature_dataset # @param [OpenTox::Dataset] training_dataset # @return [OpenTox::Model::Lazar] Regression or classification model diff --git a/test/experiment.rb b/test/experiment.rb index c465d7b..cad4fa7 100644 --- a/test/experiment.rb +++ b/test/experiment.rb @@ -4,27 +4,61 @@ class ExperimentTest < MiniTest::Test def test_regression_experiment datasets = [ - "EPAFHM.csv", - "FDA_v3b_Maximum_Recommended_Daily_Dose_mmol.csv", + "EPAFHM.medi.csv", + #"EPAFHM.csv", + #"FDA_v3b_Maximum_Recommended_Daily_Dose_mmol.csv", "LOAEL_mmol_corrected_smiles.csv" + ] + experiment = Experiment.create( + :name => "Default regression for datasets #{datasets}.", + :dataset_ids => datasets.collect{|d| Dataset.from_csv_file(File.join(DATA_DIR, d)).id}, + :model_settings => [ + { + :algorithm => "OpenTox::Model::LazarRegression", + } ] - model_algorithms = ["OpenTox::Model::LazarRegression"] - neighbor_algorithms = ["OpenTox::Algorithm::Neighbor.fingerprint_similarity"] - prediction_algorithms = ["OpenTox::Algorithm::Regression.weighted_average"] - neighbor_algorithm_parameters = [{:min_sim => 0.7}] + ) + experiment.run + puts experiment.report.to_yaml + assert_equal datasets.size, experiment.results.size + experiment.results.each do |dataset_id, result| + assert_equal 1, result.size + result.each do |r| + assert_kind_of BSON::ObjectId, r[:model_id] + assert_kind_of BSON::ObjectId, r[:repeated_crossvalidation_id] + end + end + end + + def test_classification_experiment + + datasets = [ "hamster_carcinogenicity.csv" ] experiment = Experiment.create( - :name => "Regression for datasets #{datasets}.", + :name => "Fminer vs fingerprint classification for datasets #{datasets}.", :dataset_ids => datasets.collect{|d| Dataset.from_csv_file(File.join(DATA_DIR, d)).id}, - :model_algorithms => model_algorithms, - :neighbor_algorithms => neighbor_algorithms, - :neighbor_algorithm_parameters => neighbor_algorithm_parameters, - :prediction_algorithms => prediction_algorithms, + :model_settings => [ + { + :algorithm => "OpenTox::Model::LazarClassification", + },{ + :algorithm => "OpenTox::Model::LazarClassification", + :neighbor_algorithm_parameter => {:min_sim => 0.3} + }, + #{ + #:algorithm => "OpenTox::Model::LazarFminerClassification", + #} + ] ) experiment.run =begin - p experiment - experiment.report + experiment = Experiment.find "55f944a22b72ed7de2000000" =end - refute_empty experiment.crossvalidation_ids + puts experiment.report.to_yaml + experiment.results.each do |dataset_id, result| + assert_equal 2, result.size + result.each do |r| + assert_kind_of BSON::ObjectId, r[:model_id] + assert_kind_of BSON::ObjectId, r[:repeated_crossvalidation_id] + end + end end end diff --git a/test/validation.rb b/test/validation.rb index a4c3d80..dfa2c81 100644 --- a/test/validation.rb +++ b/test/validation.rb @@ -33,4 +33,16 @@ class ValidationTest < MiniTest::Test #assert cv.weighted_mae < cv.mae end + def test_repeated_crossvalidation + dataset = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" + model = Model::LazarClassification.create dataset + repeated_cv = RepeatedCrossValidation.create model + p repeated_cv + repeated_cv.crossvalidations.each do |cv| + p cv + p cv.accuracy + assert cv.accuracy > 0.7 + end + end + end -- cgit v1.2.3 From 2fdecbed76c4db8dfe3f10f825fed9772e653197 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 16 Sep 2015 16:52:18 +0200 Subject: generic openbabel fingerprints --- lib/compound.rb | 31 +++++++++++++++++++++++++++++-- test/compound.rb | 11 +++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 6adf3c0..7f175ca 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -42,6 +42,35 @@ module OpenTox compound end + def openbabel_fingerprint type="FP2" + fp = OpenBabel::OBFingerprint.find_fingerprint(type) + obmol = OpenBabel::OBMol.new + obconversion = OpenBabel::OBConversion.new + obconversion.set_in_format "smi" + obconversion.read_string obmol, smiles + result = OpenBabel::VectorUnsignedInt.new + fp.get_fingerprint(obmol,result) + # TODO: %ignore *::DescribeBits @ line 163 openbabel/scripts/openbabel-ruby.i + #p OpenBabel::OBFingerprint.describe_bits(result) + result = result.to_a + # convert result to a list of the bits that are set + # from openbabel/scripts/python/pybel.py line 830 + # see also http://openbabel.org/docs/dev/UseTheLibrary/Python_Pybel.html#fingerprints + bitsperint = OpenBabel::OBFingerprint.getbitsperint() + bits_set = [] + start = 1 + result.each do |x| + i = start + while x > 0 do + bits_set << i if (x % 2) == 1 + x >>= 1 + i += 1 + end + start += bitsperint + end + bits_set + end + # Create a compound from smiles string # @example # compound = OpenTox::Compound.from_smiles("c1ccccc1") @@ -202,8 +231,6 @@ module OpenTox $mongo["compounds"].aggregate(aggregate).collect{ |r| [r["_id"], r["tanimoto"]] } end -=begin -=end private diff --git a/test/compound.rb b/test/compound.rb index 06c19a2..6deba4e 100644 --- a/test/compound.rb +++ b/test/compound.rb @@ -97,4 +97,15 @@ print c.sdf c = Compound.from_inchi(inchi) assert_equal inchi, c.inchi end + + def test_openbabel_fingerprint + [ + "CC(=O)CC(C)C#N", + "CC(=O)CC(C)C", + "C(=O)CC(C)C#N", + ].each do |smi| + c = OpenTox::Compound.from_smiles smi + assert_equal c.openbabel_fingerprint("FP4").size, c.fp4.size + end + end end -- cgit v1.2.3 From 6ac119c32cef094d4f1c2fb5c2daa4e274401f70 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 17 Sep 2015 14:56:25 +0200 Subject: neighbor calculation moved to Compound class --- lib/compound.rb | 84 +++++++++++++++++++++++++++++++++++--------------- lib/crossvalidation.rb | 3 +- lib/dataset.rb | 2 +- lib/experiment.rb | 4 +-- lib/lazar.rb | 2 +- lib/model.rb | 24 +++++++++++---- lib/neighbor.rb | 25 --------------- lib/opentox.rb | 1 - test/compound.rb | 26 ++++++++++++++++ test/experiment.rb | 31 +++++++++++++++++-- 10 files changed, 139 insertions(+), 63 deletions(-) delete mode 100644 lib/neighbor.rb diff --git a/lib/compound.rb b/lib/compound.rb index 7f175ca..7abd913 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -19,8 +19,11 @@ module OpenTox field :png_id, type: BSON::ObjectId field :svg_id, type: BSON::ObjectId field :sdf_id, type: BSON::ObjectId + field :fp2, type: Array + field :fp3, type: Array field :fp4, type: Array field :fp4_size, type: Integer + field :maccs, type: Array index({smiles: 1}, {unique: true}) @@ -43,32 +46,35 @@ module OpenTox end def openbabel_fingerprint type="FP2" - fp = OpenBabel::OBFingerprint.find_fingerprint(type) - obmol = OpenBabel::OBMol.new - obconversion = OpenBabel::OBConversion.new - obconversion.set_in_format "smi" - obconversion.read_string obmol, smiles - result = OpenBabel::VectorUnsignedInt.new - fp.get_fingerprint(obmol,result) - # TODO: %ignore *::DescribeBits @ line 163 openbabel/scripts/openbabel-ruby.i - #p OpenBabel::OBFingerprint.describe_bits(result) - result = result.to_a - # convert result to a list of the bits that are set - # from openbabel/scripts/python/pybel.py line 830 - # see also http://openbabel.org/docs/dev/UseTheLibrary/Python_Pybel.html#fingerprints - bitsperint = OpenBabel::OBFingerprint.getbitsperint() - bits_set = [] - start = 1 - result.each do |x| - i = start - while x > 0 do - bits_set << i if (x % 2) == 1 - x >>= 1 - i += 1 + unless self.send(type.downcase.to_sym) # stored fingerprint + fp = OpenBabel::OBFingerprint.find_fingerprint(type) + obmol = OpenBabel::OBMol.new + obconversion = OpenBabel::OBConversion.new + obconversion.set_in_format "smi" + obconversion.read_string obmol, smiles + result = OpenBabel::VectorUnsignedInt.new + fp.get_fingerprint(obmol,result) + # TODO: %ignore *::DescribeBits @ line 163 openbabel/scripts/openbabel-ruby.i + #p OpenBabel::OBFingerprint.describe_bits(result) + # convert result to a list of the bits that are set + # from openbabel/scripts/python/pybel.py line 830 + # see also http://openbabel.org/docs/dev/UseTheLibrary/Python_Pybel.html#fingerprints + result = result.to_a + bitsperint = OpenBabel::OBFingerprint.getbitsperint() + bits_set = [] + start = 1 + result.each do |x| + i = start + while x > 0 do + bits_set << i if (x % 2) == 1 + x >>= 1 + i += 1 + end + start += bitsperint end - start += bitsperint + update type.downcase.to_sym, bits_set end - bits_set + self.send(type.downcase.to_sym) end # Create a compound from smiles string @@ -206,6 +212,36 @@ module OpenTox self["chemblid"] end + def fingerprint_neighbors params + bad_request_error "Incorrect parameters '#{params}' for Compound#fingerprint_neighbors. Please provide :type, :training_dataset_id, :min_sim." unless params[:type] and params[:training_dataset_id] and params[:min_sim] + neighbors = [] + query_fingerprint = self.openbabel_fingerprint params[:type] + training_dataset = Dataset.find(params[:training_dataset_id]).compounds.each do |compound| + unless self == compound + fingerprint = compound.openbabel_fingerprint params[:type] + sim = (query_fingerprint & fingerprint).size/(query_fingerprint | fingerprint).size.to_f + neighbors << [compound.id, sim] if sim >= params[:min_sim] + end + end + neighbors.sort{|a,b| b.last <=> a.last} + end + + def fminer_neighbors params + bad_request_error "Incorrect parameters for Compound#fminer_neighbors. Please provide :feature_dataset_id, :min_sim." unless params[:feature_dataset_id] and params[:min_sim] + feature_dataset = Dataset.find params[:feature_dataset_id] + query_fingerprint = Algorithm::Descriptor.smarts_match(self, feature_dataset.features) + neighbors = [] + + # find neighbors + feature_dataset.data_entries.each_with_index do |fingerprint, i| + sim = Algorithm::Similarity.tanimoto fingerprint, query_fingerprint + if sim >= params[:min_sim] + neighbors << [feature_dataset.compound_ids[i],sim] # use compound_ids, instantiation of Compounds is too time consuming + end + end + neighbors + end + def neighbors threshold=0.7 # TODO restrict to dataset # from http://blog.matt-swain.com/post/87093745652/chemical-similarity-search-in-mongodb diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb index f480932..337b434 100644 --- a/lib/crossvalidation.rb +++ b/lib/crossvalidation.rb @@ -279,7 +279,8 @@ module OpenTox field :crossvalidation_ids, type: Array, default: [] def self.create model, folds=10, repeats=3 repeated_cross_validation = self.new - repeats.times do + repeats.times do |n| + $logger.debug "Crossvalidation #{n+1} for #{model.name}" repeated_cross_validation.crossvalidation_ids << CrossValidation.create(model, folds).id end repeated_cross_validation.save diff --git a/lib/dataset.rb b/lib/dataset.rb index d884716..7d889f8 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -152,7 +152,7 @@ module OpenTox name = File.basename(file,".*") dataset = self.find_by(:source => source, :name => name) if dataset - $logger.debug "Skipping #{file}, it is already in the database (id: #{dataset.id})." + $logger.debug "Skipping import of #{file}, it is already in the database (id: #{dataset.id})." else $logger.debug "Parsing #{file}." table = CSV.read file, :skip_blanks => true diff --git a/lib/experiment.rb b/lib/experiment.rb index 7849337..985a491 100644 --- a/lib/experiment.rb +++ b/lib/experiment.rb @@ -2,7 +2,7 @@ module OpenTox class Experiment field :dataset_ids, type: Array - field :model_settings, type: Array + field :model_settings, type: Array, default: [] field :results, type: Hash, default: {} end @@ -26,7 +26,7 @@ module OpenTox def self.create params experiment = self.new $logge.debug "Experiment started ..." - experiment.run params + #experiment.run params experiment end diff --git a/lib/lazar.rb b/lib/lazar.rb index 9b02053..89b50f7 100644 --- a/lib/lazar.rb +++ b/lib/lazar.rb @@ -59,7 +59,7 @@ CLASSES = ["Feature","Compound","Dataset","Validation","CrossValidation","Repeat "bbrc.rb", "model.rb", "similarity.rb", - "neighbor.rb", + #"neighbor.rb", "classification.rb", "regression.rb", "validation.rb", diff --git a/lib/model.rb b/lib/model.rb index ddb69e4..9892f64 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -39,6 +39,7 @@ module OpenTox prediction_feature = training_dataset.features.first prediction_feature.nominal ? lazar = OpenTox::Model::LazarClassification.new : lazar = OpenTox::Model::LazarRegression.new lazar.training_dataset_id = training_dataset.id + lazar.neighbor_algorithm_parameters[:training_dataset_id] = training_dataset.id lazar.prediction_feature_id = prediction_feature.id lazar.name = "#{training_dataset.name} #{prediction_feature.name}" @@ -78,7 +79,8 @@ module OpenTox predictions << {:compound => compound, :value => database_activities, :confidence => "measured", :warning => "Compound #{compound.smiles} occurs in training dataset with activity '#{database_activities}'."} next end - neighbors = Algorithm.run(neighbor_algorithm, compound, neighbor_algorithm_parameters) + neighbors = compound.send(neighbor_algorithm, neighbor_algorithm_parameters) + #neighbors = Algorithm.run(neighbor_algorithm, compound, neighbor_algorithm_parameters) # add activities # TODO: improve efficiency, takes 3 times longer than previous version neighbors.collect! do |n| @@ -129,8 +131,12 @@ module OpenTox def initialize super self.prediction_algorithm = "OpenTox::Algorithm::Classification.weighted_majority_vote" - self.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fingerprint_similarity" - self.neighbor_algorithm_parameters = {:min_sim => 0.7} + self.neighbor_algorithm = "fingerprint_neighbors" + self.neighbor_algorithm_parameters = { + :type => "FP4", + :training_dataset_id => training_dataset_id, + :min_sim => 0.7 + } end end @@ -141,7 +147,7 @@ module OpenTox model = super(training_dataset) model.update "_type" => self.to_s # adjust class model = self.find model.id # adjust class - model.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fminer_similarity" + model.neighbor_algorithm = "fminer_neighbors" model.neighbor_algorithm_parameters = { :feature_calculation_algorithm => "OpenTox::Algorithm::Descriptor.smarts_match", :feature_dataset_id => Algorithm::Fminer.bbrc(training_dataset,fminer_params).id, @@ -154,11 +160,17 @@ module OpenTox end class LazarRegression < Lazar + def initialize super - self.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fingerprint_similarity" + #self.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fingerprint_similarity" + self.neighbor_algorithm = "fingerprint_neighbors" self.prediction_algorithm = "OpenTox::Algorithm::Regression.weighted_average" - self.neighbor_algorithm_parameters = {:min_sim => 0.7} + self.neighbor_algorithm_parameters = { + :type => "FP4", + :training_dataset_id => self.training_dataset_id, + :min_sim => 0.7 + } end end diff --git a/lib/neighbor.rb b/lib/neighbor.rb deleted file mode 100644 index d849cbf..0000000 --- a/lib/neighbor.rb +++ /dev/null @@ -1,25 +0,0 @@ -module OpenTox - module Algorithm - class Neighbor - - def self.fingerprint_similarity compound, params={} - compound.neighbors params[:min_sim] - end - - def self.fminer_similarity compound, params - feature_dataset = Dataset.find params[:feature_dataset_id] - query_fingerprint = Algorithm::Descriptor.smarts_match(compound, feature_dataset.features) - neighbors = [] - - # find neighbors - feature_dataset.data_entries.each_with_index do |fingerprint, i| - sim = Algorithm::Similarity.tanimoto fingerprint, query_fingerprint - if sim > params[:min_sim] - neighbors << [feature_dataset.compound_ids[i],sim] # use compound_ids, instantiation of Compounds is too time consuming - end - end - neighbors - end - end - end -end diff --git a/lib/opentox.rb b/lib/opentox.rb index 875487c..186c87a 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -14,7 +14,6 @@ module OpenTox store_in collection: klass.downcase.pluralize field :name, type: String field :warnings, type: Array, default: [] - end OpenTox.const_set klass,c end diff --git a/test/compound.rb b/test/compound.rb index 6deba4e..6a3c696 100644 --- a/test/compound.rb +++ b/test/compound.rb @@ -108,4 +108,30 @@ print c.sdf assert_equal c.openbabel_fingerprint("FP4").size, c.fp4.size end end + + def test_fingerprint_neighbors + types = ["FP2", "FP3", "FP4", "MACCS"] + min_sim = 0.7 + training_dataset = Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.csv") + [ + "CC(=O)CC(C)C#N", + "CC(=O)CC(C)C", + "C(=O)CC(C)C#N", + ].each do |smi| + c = OpenTox::Compound.from_smiles smi + p c.smiles + types.each do |type| + p type + neighbors = c.fingerprint_neighbors({:type => type, :training_dataset_id => training_dataset.id, :min_sim => min_sim}) + p neighbors.collect{|n| [Compound.find(n.first).smiles,n.last]} + if type == "FP4" + fp4_neighbors = c.neighbors + neighbors.each do |n| + p [Compound.find(n.first).smiles,n.last] unless fp4_neighbors.include?(n) + assert_includes fp4_neighbors, n + end + end + end + end + end end diff --git a/test/experiment.rb b/test/experiment.rb index cad4fa7..4b54768 100644 --- a/test/experiment.rb +++ b/test/experiment.rb @@ -18,7 +18,7 @@ class ExperimentTest < MiniTest::Test } ] ) - experiment.run + #experiment.run puts experiment.report.to_yaml assert_equal datasets.size, experiment.results.size experiment.results.each do |dataset_id, result| @@ -48,7 +48,7 @@ class ExperimentTest < MiniTest::Test #} ] ) - experiment.run + #experiment.run =begin experiment = Experiment.find "55f944a22b72ed7de2000000" =end @@ -61,4 +61,31 @@ class ExperimentTest < MiniTest::Test end end end + + def test_regression_fingerprints + datasets = [ + "LOAEL_mmol_corrected_smiles.csv" + ] + min_sims = [0.3,0.7] + types = ["FP2","FP3","FP4","MACCS"] + experiment = Experiment.create( + :name => "Fminer vs fingerprint classification for datasets #{datasets}.", + :dataset_ids => datasets.collect{|d| Dataset.from_csv_file(File.join(DATA_DIR, d)).id}, + ) + types.each do |type| + min_sims.each do |min_sim| + experiment.model_settings << { + :algorithm => "OpenTox::Model::LazarRegression", + :neighbor_algorithm => "fingerprint_neighbors", + :neighbor_algorithm_parameter => { + :type => type, + :min_sim => min_sim, + } + } + end + end + experiment.run + p experiment.report + + end end -- cgit v1.2.3 From 33989261450bba279b4e002e5e4ea0475d742abb Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 18 Sep 2015 13:01:59 +0200 Subject: fix for empty values --- lib/dataset.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 7d889f8..00e2bc3 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -203,7 +203,7 @@ module OpenTox feature = NominalFeature.find_or_create_by(metadata) end end - feature_ids << feature.id + feature_ids << feature.id if feature end $logger.debug "Feature values: #{Time.now-time}" @@ -245,7 +245,7 @@ module OpenTox end compound_ids << compound.id - @data_entries << Array.new(table.first.size-1) + @data_entries << Array.new(table.first.size-1) if (table.first.size-1) > 0 vals.each_with_index do |v,j| if v.blank? -- cgit v1.2.3 From 9bf81bcafaf958c02a448d3ff3410220dd791d40 Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 18 Sep 2015 13:31:05 +0200 Subject: introduced batch prediction file and test --- test/data/batch_prediction.csv | 25 +++++++++++++++++++++++++ test/dataset.rb | 13 ++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 test/data/batch_prediction.csv diff --git a/test/data/batch_prediction.csv b/test/data/batch_prediction.csv new file mode 100644 index 0000000..c9c45e1 --- /dev/null +++ b/test/data/batch_prediction.csv @@ -0,0 +1,25 @@ +SMILES, batch +CCCCCCCCOC(=O)C1=CC=C(C(=O)OCCCCCCCC)C=C1 +OCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCOC(=O)C2=CC=CC=C2C(=O)OCCCCO +C1([N+](=O)[O-])=CC=C(C)C=C1OP(=O)(OC2=C([N+](=O)[O-])C=CC(C)=C2)OC3=C([N+]([O-])=O)C=CC(C)=C3 +C1=C([N+]([O-])=O)C=CC=C1P(=O)(C2=CC([N+](=O)[O-])=CC=C2)C3=CC([N+](=O)[O-])=CC=C3 +O=C1NC(=O)NC=C1 +O=C2C1=NC3=C(C=C(C)C(C)=C3)N(C[C@H](O)[C@H](O)[C@H](O)CO)C1=NC(N2)=O +O=C1C2=C(C=CC=C2)C(=O)C3=C1C=CC=C3 +CCC1=C(Br)C(Br)=C(Br)C(Br)=C1Br +C1CCCCC1C2CCCCC2 +C1=CC(C)=CC=C1SSC2=CC=C(C)C=C2 +CCCCCCCCCCCCCO +O=C(C1=C(C=CC=C1)C(=O)OCC(CCCC)CC)OCC(CCCC)CC +CCCCCCCCOC(=O)C1=CC=CC=C1C(=O)OCCCCCCCC +CCCCCCCCCCCCCC=O +OCCCCCCCC\C=C/CCCCCCCC +CCCCCCC(=O)CCCCCC +N1=C(C2=CC=CC=C2)NC(C3=CC=CC=C3)=C1C4=CC=CC=C4 +C1=CC=CC=C1[Sn](C2=CC=CC=C2)(C3=CC=CC=C3)C4=CC=CC=C4 +C1=CC=CC=C1N(C2=CC=CC=C2)C3=CC=CC=C3 +IC1=CC=C(I)C=C1 +C1=CC(N(C)C)=CC=C1P(=O)(C2=CC=C(N(C)C)C=C2)C3=CC=C(N(C)C)C=C3 +C1=CC=CC=C1C2=CC=C(C3=CC=CC=C3)O2 +CCCCCCCCCCCC(=O)N +N1=C(CCN)C=CC=C1 diff --git a/test/dataset.rb b/test/dataset.rb index 26ff219..d30a898 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -11,7 +11,18 @@ class DatasetTest < MiniTest::Test assert_equal Dataset, datasets.first.class d1.delete end - +=begin + #TODO + def test_create_without_features_csv + d = Dataset.from_csv_file File.join(DATA_DIR,"batch_prediction.csv") + assert_equal Dataset, d.class + refute_nil d.id + dataset = Dataset.find d.id + #p dataset.compounds + assert_equal 24, d.compounds.size.to_i + d.delete + end +=end def test_create_empty d = Dataset.new assert_equal Dataset, d.class -- cgit v1.2.3 From 259cd085e053193b4c166495ae1af35cfa94bcf6 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Fri, 18 Sep 2015 14:48:39 +0200 Subject: import of datasets without features fixed --- lib/dataset.rb | 2 +- lib/experiment.rb | 61 ++++++++++++++++++++++++++++++++++++++++++++++--------- test/dataset.rb | 4 ++-- 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/lib/dataset.rb b/lib/dataset.rb index 00e2bc3..946fd90 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -245,7 +245,7 @@ module OpenTox end compound_ids << compound.id - @data_entries << Array.new(table.first.size-1) if (table.first.size-1) > 0 + table.first.size == 0 ? @data_entries << Array.new(0) : @data_entries << Array.new(table.first.size-1) vals.each_with_index do |v,j| if v.blank? diff --git a/lib/experiment.rb b/lib/experiment.rb index 985a491..0a76c53 100644 --- a/lib/experiment.rb +++ b/lib/experiment.rb @@ -32,16 +32,26 @@ module OpenTox def report # TODO significances + # statistical significances http://www.r-bloggers.com/anova-and-tukeys-test-on-r/ report = {} report[:name] = name report[:experiment_id] = self.id.to_s + report[:results] = {} + parameters = [] dataset_ids.each do |dataset_id| dataset_name = Dataset.find(dataset_id).name - report[dataset_name] = [] + report[:results][dataset_name] = {} + report[:results][dataset_name][:anova] = {} + report[:results][dataset_name][:data] = [] results[dataset_id.to_s].each do |result| model = Model::Lazar.find(result[:model_id]) repeated_cv = RepeatedCrossValidation.find(result[:repeated_crossvalidation_id]) crossvalidations = repeated_cv.crossvalidations + if crossvalidations.first.is_a? ClassificationCrossValidation + parameters = [:accuracy,:true_rate,:predictivity] + elsif crossvalidations.first.is_a? RegressionCrossValidation + parameters = [:rmse,:mae,:r_squared] + end summary = {} [:neighbor_algorithm, :neighbor_algorithm_parameters, :prediction_algorithm].each do |key| summary[key] = model[key] @@ -49,19 +59,50 @@ module OpenTox summary[:nr_instances] = crossvalidations.first.nr_instances summary[:nr_unpredicted] = crossvalidations.collect{|cv| cv.nr_unpredicted} summary[:time] = crossvalidations.collect{|cv| cv.time} - if crossvalidations.first.is_a? ClassificationCrossValidation - summary[:accuracies] = crossvalidations.collect{|cv| cv.accuracy} - elsif crossvalidations.first.is_a? RegressionCrossValidation - summary[:r_squared] = crossvalidations.collect{|cv| cv.r_squared} + parameters.each do |param| + summary[param] = crossvalidations.collect{|cv| cv.send(param)} end - report[dataset_name] << summary - #p repeated_cv.crossvalidations.collect{|cv| cv.accuracy} - #file = "/tmp/#{id}.svg" - #File.open(file,"w+"){|f| f.puts cv.correlation_plot} - #`inkview '#{file}'` + report[:results][dataset_name][:data] << summary + end + end + report[:results].each do |dataset,results| + ([:time,:nr_unpredicted]+parameters).each do |param| + experiments = [] + outcome = [] + results[:data].each_with_index do |result,i| + result[param].each do |p| + experiments << i + outcome << p + end + end + R.assign "experiment_nr",experiments.collect{|i| "Experiment #{i}"} + R.eval "experiment_nr = factor(experiment_nr)" + R.assign "outcome",outcome + R.eval "data = data.frame(experiment_nr,outcome)" + # one-way ANOVA + R.eval "fit = aov(outcome ~ experiment_nr, data=data)" + # http://stackoverflow.com/questions/3366506/extract-p-value-from-aov + p_value = R.eval("summary(fit)[[1]][['Pr(>F)']][[1]]").to_ruby + # aequivalent + # sum = R.eval("summary(fit)") + #p_value = sum.to_ruby.first.last.first +=begin + if p_value < 0.01 + p_value = "#{p_value} ***" + elsif p_value < 0.05 + p_value = "#{p_value} **" + elsif p_value < 0.1 + p_value = "#{p_value} *" + end +=end + report[:results][dataset][:anova][param] = p_value end end report end + def summary + report[:results].collect{|dataset,data| {dataset => data[:anova].select{|param,p_val| p_val < 0.1}}} + end + end diff --git a/test/dataset.rb b/test/dataset.rb index d30a898..84be547 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -11,7 +11,7 @@ class DatasetTest < MiniTest::Test assert_equal Dataset, datasets.first.class d1.delete end -=begin + #TODO def test_create_without_features_csv d = Dataset.from_csv_file File.join(DATA_DIR,"batch_prediction.csv") @@ -22,7 +22,7 @@ class DatasetTest < MiniTest::Test assert_equal 24, d.compounds.size.to_i d.delete end -=end + def test_create_empty d = Dataset.new assert_equal Dataset, d.class -- cgit v1.2.3 From d5bf97c2cb999539c56bf59aa1d7d3286745be84 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 23 Sep 2015 14:51:41 +0200 Subject: validations fixed (all models were executed with default parameters) --- lib/compound.rb | 41 ++++++++++- lib/crossvalidation.rb | 7 +- lib/dataset.rb | 40 +++++++++++ lib/descriptor.rb | 3 +- lib/experiment.rb | 162 ++++++++++++++++++++----------------------- lib/model.rb | 88 ++++++++++++++--------- lib/unique_descriptors.rb | 4 +- lib/validation.rb | 12 +++- test/compound.rb | 12 ++++ test/dataset.rb | 10 +++ test/experiment.rb | 63 +++++++++++++++-- test/lazar-physchem-short.rb | 34 ++++----- test/lazar-regression.rb | 10 +++ test/validation.rb | 66 ++++++++++++++++-- 14 files changed, 394 insertions(+), 158 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index 7abd913..d3df125 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -44,6 +44,21 @@ module OpenTox compound.save compound end + + #http://openbabel.org/docs/dev/FileFormats/MolPrint2D_format.html#molprint2d-format + def mpd + smarts = obconversion(smiles,"smi","mpd").strip.split("\t") + smarts.shift # remove Title + smarts + + end + + #http://openbabel.org/docs/dev/FileFormats/Multilevel_Neighborhoods_of_Atoms_(MNA).html + def mna level=2 + smarts = obconversion(smiles,"smi","mna","xL\"#{level}\"").split("\n") + smarts.shift # remove Title + smarts + end def openbabel_fingerprint type="FP2" unless self.send(type.downcase.to_sym) # stored fingerprint @@ -72,7 +87,7 @@ module OpenTox end start += bitsperint end - update type.downcase.to_sym, bits_set + update_attribute type.downcase.to_sym, bits_set end self.send(type.downcase.to_sym) end @@ -242,6 +257,28 @@ module OpenTox neighbors end + def physchem_neighbors params + feature_dataset = Dataset.find params[:feature_dataset_id] + query_fingerprint = Algorithm.run params[:feature_calculation_algorithm], self, params[:descriptors] + neighbors = [] + feature_dataset.data_entries.each_with_index do |fingerprint, i| + # TODO implement pearson and cosine similarity separatly + R.assign "x", query_fingerprint + R.assign "y", fingerprint + # pearson r + #sim = R.eval("cor(x,y,use='complete.obs',method='pearson')").to_ruby + #p "pearson" + #p sim + #p "cosine" + sim = R.eval("x %*% y / sqrt(x%*%x * y%*%y)").to_ruby.first + #p sim + if sim >= params[:min_sim] + neighbors << [feature_dataset.compound_ids[i],sim] # use compound_ids, instantiation of Compounds is too time consuming + end + end + neighbors + end + def neighbors threshold=0.7 # TODO restrict to dataset # from http://blog.matt-swain.com/post/87093745652/chemical-similarity-search-in-mongodb @@ -308,7 +345,7 @@ print sdf end def obconversion(identifier,input_format,output_format,option=nil) - self.class.obconversion(identifier,input_format,output_format,option=nil) + self.class.obconversion(identifier,input_format,output_format,option) end end end diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb index 337b434..4c80344 100644 --- a/lib/crossvalidation.rb +++ b/lib/crossvalidation.rb @@ -33,15 +33,12 @@ module OpenTox nr_instances = 0 nr_unpredicted = 0 predictions = [] - validation_class = Object.const_get(self.to_s.sub(/Cross/,'')) training_dataset = Dataset.find model.training_dataset_id training_dataset.folds(n).each_with_index do |fold,fold_nr| fork do # parallel execution of validations $logger.debug "Dataset #{training_dataset.name}: Fold #{fold_nr} started" t = Time.now - #p validation_class#.create(model, fold[0], fold[1],cv) - validation = validation_class.create(model, fold[0], fold[1],cv) - #p validation + validation = Validation.create(model, fold[0], fold[1],cv) $logger.debug "Dataset #{training_dataset.name}, Fold #{fold_nr}: #{Time.now-t} seconds" end end @@ -170,7 +167,7 @@ module OpenTox y = predictions.collect{|p| p[2]} R.assign "measurement", x R.assign "prediction", y - R.eval "r <- cor(-log(measurement),-log(prediction))" + R.eval "r <- cor(-log(measurement),-log(prediction),use='complete')" r = R.eval("r").to_ruby mae = mae/predictions.size diff --git a/lib/dataset.rb b/lib/dataset.rb index 946fd90..7c8ab44 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -46,6 +46,12 @@ module OpenTox else @data_entries = Marshal.load(data_entry_file.data) bad_request_error "Data entries (#{data_entries_id}) are not a 2D-Array" unless @data_entries.is_a? Array and @data_entries.first.is_a? Array + unless @data_entries.first.size == feature_ids.size + # TODO: fix (unknown) source of empty data_entries + sleep 1 + data_entry_file = $gridfs.find_one(_id: data_entries_id) + @data_entries = Marshal.load(data_entry_file.data) + end bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries.size} rows, but dataset (#{id}) has #{compound_ids.size} compounds" unless @data_entries.size == compound_ids.size # TODO: data_entries can be empty, poorly reproducible, mongo problem? bad_request_error "Data entries (#{data_entries_id}) have #{@data_entries.first.size} columns, but dataset (#{id}) has #{feature_ids.size} features" unless @data_entries.first.size == feature_ids.size @@ -281,6 +287,29 @@ module OpenTox end end end + + def scale + scaled_data_entries = Array.new(data_entries.size){Array.new(data_entries.first.size)} + centers = [] + scales = [] + feature_ids.each_with_index do |feature_id,col| + R.assign "x", data_entries.collect{|de| de[col]} + R.eval "scaled = scale(x,center=T,scale=T)" + centers[col] = R.eval("attr(scaled, 'scaled:center')").to_ruby + scales[col] = R.eval("attr(scaled, 'scaled:scale')").to_ruby + R.eval("scaled").to_ruby.each_with_index do |value,row| + scaled_data_entries[row][col] = value + end + end + scaled_dataset = ScaledDataset.new(attributes) + scaled_dataset["_id"] = BSON::ObjectId.new + scaled_dataset["_type"] = "OpenTox::ScaledDataset" + scaled_dataset.centers = centers + scaled_dataset.scales = scales + scaled_dataset.data_entries = scaled_data_entries + scaled_dataset.save_all + scaled_dataset + end end # Dataset for lazar predictions @@ -297,6 +326,17 @@ module OpenTox # Dataset for descriptors (physchem) class DescriptorDataset < Dataset field :feature_calculation_algorithm, type: String + + end + + class ScaledDataset < DescriptorDataset + + field :centers, type: Array, default: [] + field :scales, type: Array, default: [] + + def original_value value, i + value * scales[i] + centers[i] + end end # Dataset for fminer descriptors diff --git a/lib/descriptor.rb b/lib/descriptor.rb index 5ae0ef2..9733bde 100644 --- a/lib/descriptor.rb +++ b/lib/descriptor.rb @@ -16,7 +16,7 @@ module OpenTox LOG4J_JAR = File.join(JAVA_DIR,"log4j.jar") JMOL_JAR = File.join(JAVA_DIR,"Jmol.jar") - obexclude = ["cansmi","cansmiNS","formula","InChI","InChIKey","s","smarts","title"] + obexclude = ["cansmi","cansmiNS","formula","InChI","InChIKey","s","smarts","title","L5"] OBDESCRIPTORS = Hash[OpenBabel::OBDescriptor.list_as_string("descriptors").split("\n").collect do |d| name,description = d.split(/\s+/,2) ["Openbabel."+name,description] unless obexclude.include? name @@ -107,6 +107,7 @@ module OpenTox des[lib] << descriptor end des.each do |lib,descriptors| + p lib, descriptors send(lib, descriptors) end serialize diff --git a/lib/experiment.rb b/lib/experiment.rb index 0a76c53..616a273 100644 --- a/lib/experiment.rb +++ b/lib/experiment.rb @@ -4,105 +4,93 @@ module OpenTox field :dataset_ids, type: Array field :model_settings, type: Array, default: [] field :results, type: Hash, default: {} - end - def run - dataset_ids.each do |dataset_id| - dataset = Dataset.find(dataset_id) - results[dataset_id.to_s] = [] - model_settings.each do |setting| - model = Object.const_get(setting[:algorithm]).create dataset - model.prediction_algorithm = setting[:prediction_algorithm] if setting[:prediction_algorithm] - model.neighbor_algorithm = setting[:neighbor_algorithm] if setting[:neighbor_algorithm] - model.neighbor_algorithm_parameters = setting[:neighbor_algorithm_parameter] if setting[:neighbor_algorithm_parameter] - model.save - repeated_crossvalidation = RepeatedCrossValidation.create model - results[dataset_id.to_s] << {:model_id => model.id, :repeated_crossvalidation_id => repeated_crossvalidation.id} + def run + dataset_ids.each do |dataset_id| + dataset = Dataset.find(dataset_id) + results[dataset_id.to_s] = [] + model_settings.each do |setting| + model_algorithm = setting.delete :model_algorithm + model = Object.const_get(model_algorithm).create dataset, setting + #model.prediction_algorithm = setting[:prediction_algorithm] if setting[:prediction_algorithm] + #model.neighbor_algorithm = setting[:neighbor_algorithm] if setting[:neighbor_algorithm] + #model.neighbor_algorithm_parameters = setting[:neighbor_algorithm_parameter] if setting[:neighbor_algorithm_parameter] + p model + model.save + repeated_crossvalidation = RepeatedCrossValidation.create model + results[dataset_id.to_s] << {:model_id => model.id, :repeated_crossvalidation_id => repeated_crossvalidation.id} + end end + save end - save - end - - def self.create params - experiment = self.new - $logge.debug "Experiment started ..." - #experiment.run params - experiment - end - def report - # TODO significances - # statistical significances http://www.r-bloggers.com/anova-and-tukeys-test-on-r/ - report = {} - report[:name] = name - report[:experiment_id] = self.id.to_s - report[:results] = {} - parameters = [] - dataset_ids.each do |dataset_id| - dataset_name = Dataset.find(dataset_id).name - report[:results][dataset_name] = {} - report[:results][dataset_name][:anova] = {} - report[:results][dataset_name][:data] = [] - results[dataset_id.to_s].each do |result| - model = Model::Lazar.find(result[:model_id]) - repeated_cv = RepeatedCrossValidation.find(result[:repeated_crossvalidation_id]) - crossvalidations = repeated_cv.crossvalidations - if crossvalidations.first.is_a? ClassificationCrossValidation - parameters = [:accuracy,:true_rate,:predictivity] - elsif crossvalidations.first.is_a? RegressionCrossValidation - parameters = [:rmse,:mae,:r_squared] - end - summary = {} - [:neighbor_algorithm, :neighbor_algorithm_parameters, :prediction_algorithm].each do |key| - summary[key] = model[key] - end - summary[:nr_instances] = crossvalidations.first.nr_instances - summary[:nr_unpredicted] = crossvalidations.collect{|cv| cv.nr_unpredicted} - summary[:time] = crossvalidations.collect{|cv| cv.time} - parameters.each do |param| - summary[param] = crossvalidations.collect{|cv| cv.send(param)} + def report + # statistical significances http://www.r-bloggers.com/anova-and-tukeys-test-on-r/ + report = {} + report[:name] = name + report[:experiment_id] = self.id.to_s + report[:results] = {} + parameters = [] + dataset_ids.each do |dataset_id| + dataset_name = Dataset.find(dataset_id).name + report[:results][dataset_name] = {} + report[:results][dataset_name][:anova] = {} + report[:results][dataset_name][:data] = [] + results[dataset_id.to_s].each do |result| + model = Model::Lazar.find(result[:model_id]) + repeated_cv = RepeatedCrossValidation.find(result[:repeated_crossvalidation_id]) + crossvalidations = repeated_cv.crossvalidations + if crossvalidations.first.is_a? ClassificationCrossValidation + parameters = [:accuracy,:true_rate,:predictivity] + elsif crossvalidations.first.is_a? RegressionCrossValidation + parameters = [:rmse,:mae,:r_squared] + end + summary = {} + [:neighbor_algorithm, :neighbor_algorithm_parameters, :prediction_algorithm].each do |key| + summary[key] = model[key] + end + summary[:nr_instances] = crossvalidations.first.nr_instances + summary[:nr_unpredicted] = crossvalidations.collect{|cv| cv.nr_unpredicted} + summary[:time] = crossvalidations.collect{|cv| cv.time} + parameters.each do |param| + summary[param] = crossvalidations.collect{|cv| cv.send(param)} + end + report[:results][dataset_name][:data] << summary end - report[:results][dataset_name][:data] << summary end - end - report[:results].each do |dataset,results| - ([:time,:nr_unpredicted]+parameters).each do |param| - experiments = [] - outcome = [] - results[:data].each_with_index do |result,i| - result[param].each do |p| - experiments << i - outcome << p + report[:results].each do |dataset,results| + ([:time,:nr_unpredicted]+parameters).each do |param| + experiments = [] + outcome = [] + results[:data].each_with_index do |result,i| + result[param].each do |p| + experiments << i + p = nil if p.kind_of? Float and p.infinite? # TODO fix @ division by 0 + outcome << p + end end - end - R.assign "experiment_nr",experiments.collect{|i| "Experiment #{i}"} - R.eval "experiment_nr = factor(experiment_nr)" - R.assign "outcome",outcome - R.eval "data = data.frame(experiment_nr,outcome)" - # one-way ANOVA - R.eval "fit = aov(outcome ~ experiment_nr, data=data)" - # http://stackoverflow.com/questions/3366506/extract-p-value-from-aov - p_value = R.eval("summary(fit)[[1]][['Pr(>F)']][[1]]").to_ruby - # aequivalent - # sum = R.eval("summary(fit)") - #p_value = sum.to_ruby.first.last.first + R.assign "experiment_nr",experiments.collect{|i| "Experiment #{i}"} + R.eval "experiment_nr = factor(experiment_nr)" + R.assign "outcome", outcome + R.eval "data = data.frame(experiment_nr,outcome)" + # one-way ANOVA + R.eval "fit = aov(outcome ~ experiment_nr, data=data,na.action='na.omit')" + # http://stackoverflow.com/questions/3366506/extract-p-value-from-aov + p_value = R.eval("summary(fit)[[1]][['Pr(>F)']][[1]]").to_ruby + # aequivalent + # sum = R.eval("summary(fit)") + #p_value = sum.to_ruby.first.last.first + report[:results][dataset][:anova][param] = p_value =begin - if p_value < 0.01 - p_value = "#{p_value} ***" - elsif p_value < 0.05 - p_value = "#{p_value} **" - elsif p_value < 0.1 - p_value = "#{p_value} *" - end =end - report[:results][dataset][:anova][param] = p_value + end end + report end - report - end - def summary - report[:results].collect{|dataset,data| {dataset => data[:anova].select{|param,p_val| p_val < 0.1}}} + def summary + report[:results].collect{|dataset,data| {dataset => data[:anova].select{|param,p_val| p_val < 0.1}}} + end end end diff --git a/lib/model.rb b/lib/model.rb index 9892f64..817a61e 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -26,25 +26,26 @@ module OpenTox # algorithms field :neighbor_algorithm, type: String - field :neighbor_algorithm_parameters, type: Hash + field :neighbor_algorithm_parameters, type: Hash, default: {} # Create a lazar model from a training_dataset and a feature_dataset # @param [OpenTox::Dataset] training_dataset # @return [OpenTox::Model::Lazar] Regression or classification model - def self.create training_dataset + def initialize training_dataset, params={} + super params bad_request_error "More than one prediction feature found in training_dataset #{training_dataset.id}" unless training_dataset.features.size == 1 # TODO document convention prediction_feature = training_dataset.features.first - prediction_feature.nominal ? lazar = OpenTox::Model::LazarClassification.new : lazar = OpenTox::Model::LazarRegression.new - lazar.training_dataset_id = training_dataset.id - lazar.neighbor_algorithm_parameters[:training_dataset_id] = training_dataset.id - lazar.prediction_feature_id = prediction_feature.id - lazar.name = "#{training_dataset.name} #{prediction_feature.name}" - - lazar.save - lazar + # set defaults for empty parameters + self.prediction_feature_id ||= prediction_feature.id + self.training_dataset_id ||= training_dataset.id + self.name ||= "#{training_dataset.name} #{prediction_feature.name}" + self.neighbor_algorithm_parameters ||= {} + self.neighbor_algorithm_parameters[:training_dataset_id] = training_dataset.id + save + self end def predict object @@ -80,6 +81,7 @@ module OpenTox next end neighbors = compound.send(neighbor_algorithm, neighbor_algorithm_parameters) + #neighbors = Algorithm.run(neighbor_algorithm, compound, neighbor_algorithm_parameters) # add activities # TODO: improve efficiency, takes 3 times longer than previous version @@ -90,6 +92,17 @@ module OpenTox end neighbors.compact! # remove neighbors without training activities predictions << Algorithm.run(prediction_algorithm, compound, {:neighbors => neighbors,:training_dataset_size => training_dataset.data_entries.size}) +=begin +# TODO scaled dataset for physchem + p neighbor_algorithm_parameters + p (neighbor_algorithm_parameters["feature_dataset_id"]) + d = Dataset.find(neighbor_algorithm_parameters["feature_dataset_id"]) + p d + p d.class + if neighbor_algorithm_parameters["feature_dataset_id"] and Dataset.find(neighbor_algorithm_parameters["feature_dataset_id"]).kind_of? ScaledDataset + p "SCALED" + end +=end end # serialize result @@ -128,15 +141,40 @@ module OpenTox end class LazarClassification < Lazar - def initialize - super - self.prediction_algorithm = "OpenTox::Algorithm::Classification.weighted_majority_vote" - self.neighbor_algorithm = "fingerprint_neighbors" - self.neighbor_algorithm_parameters = { + + def self.create training_dataset, params={} + model = self.new training_dataset, params + model.prediction_algorithm = "OpenTox::Algorithm::Classification.weighted_majority_vote" unless model.prediction_algorithm + model.neighbor_algorithm |= "fingerprint_neighbors" + model.neighbor_algorithm_parameters ||= {} + { :type => "FP4", - :training_dataset_id => training_dataset_id, + :training_dataset_id => training_dataset.id, :min_sim => 0.7 - } + }.each do |key,value| + model.neighbor_algorithm_parameters[key] ||= value + end + model.save + model + end + end + + class LazarRegression < Lazar + + def self.create training_dataset, params={} + model = self.new training_dataset, params + #model.neighbor_algorithm ||= "fingerprint_neighbors" + #model.prediction_algorithm ||= "OpenTox::Algorithm::Regression.weighted_average" + #model.neighbor_algorithm_parameters ||= {} + #{ + #:type => "FP4", + #:training_dataset_id => training_dataset.id, + #:min_sim => 0.7 + #}.each do |key,value| + #model.neighbor_algorithm_parameters[key] ||= value + #end + model.save + model end end @@ -159,26 +197,12 @@ module OpenTox end end - class LazarRegression < Lazar - - def initialize - super - #self.neighbor_algorithm = "OpenTox::Algorithm::Neighbor.fingerprint_similarity" - self.neighbor_algorithm = "fingerprint_neighbors" - self.prediction_algorithm = "OpenTox::Algorithm::Regression.weighted_average" - self.neighbor_algorithm_parameters = { - :type => "FP4", - :training_dataset_id => self.training_dataset_id, - :min_sim => 0.7 - } - end - end - class Prediction include OpenTox include Mongoid::Document include Mongoid::Timestamps + # TODO cv -> repeated cv # TODO field Validations field :endpoint, type: String field :species, type: String diff --git a/lib/unique_descriptors.rb b/lib/unique_descriptors.rb index 676f34a..cf9cbf3 100644 --- a/lib/unique_descriptors.rb +++ b/lib/unique_descriptors.rb @@ -12,7 +12,7 @@ UNIQUEDESCRIPTORS = [ "Openbabel.HBA1", #Number of Hydrogen Bond Acceptors 1 (JoelLib) "Openbabel.HBA2", #Number of Hydrogen Bond Acceptors 2 (JoelLib) "Openbabel.HBD", #Number of Hydrogen Bond Donors (JoelLib) - "Openbabel.L5", #Lipinski Rule of Five + #"Openbabel.L5", #Lipinski Rule of Five# TODO Openbabel.L5 returns nil, investigate!!! "Openbabel.logP", #octanol/water partition coefficient "Openbabel.MP", #Melting point "Openbabel.MR", #molar refractivity @@ -56,7 +56,7 @@ UNIQUEDESCRIPTORS = [ "Cdk.LengthOverBreadth", #Calculates the ratio of length to breadth. "Cdk.LongestAliphaticChain", #Returns the number of atoms in the longest aliphatic chain "Cdk.MDE", #Evaluate molecular distance edge descriptors for C, N and O - "Cdk.MannholdLogP", #Descriptor that calculates the LogP based on a simple equation using the number of carbons and hetero atoms . + #"Cdk.MannholdLogP", #Descriptor that calculates the LogP based on a simple equation using the number of carbons and hetero atoms . "Cdk.MomentOfInertia", #Descriptor that calculates the principal moments of inertia and ratios of the principal moments. Als calculates the radius of gyration. "Cdk.PetitjeanNumber", #Descriptor that calculates the Petitjean Number of a molecule. "Cdk.PetitjeanShapeIndex", #The topological and geometric shape indices described Petitjean and Bath et al. respectively. Both measure the anisotropy in a molecule. diff --git a/lib/validation.rb b/lib/validation.rb index 63fbd89..9eebef8 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -2,6 +2,7 @@ module OpenTox class Validation + field :model_id, type: BSON::ObjectId field :prediction_dataset_id, type: BSON::ObjectId field :crossvalidation_id, type: BSON::ObjectId field :test_dataset_id, type: BSON::ObjectId @@ -17,9 +18,17 @@ module OpenTox Dataset.find test_dataset_id end + def model + Model::Lazar.find model_id + end + def self.create model, training_set, test_set, crossvalidation=nil - validation_model = model.class.create training_set#, features + atts = model.attributes.dup # do not modify attributes from original model + atts["_id"] = BSON::ObjectId.new + atts[:training_dataset_id] = training_set.id + validation_model = model.class.create training_set, atts + validation_model.save test_set_without_activities = Dataset.new(:compound_ids => test_set.compound_ids) # just to be sure that activities cannot be used prediction_dataset = validation_model.predict test_set_without_activities predictions = [] @@ -36,6 +45,7 @@ module OpenTox end end validation = self.new( + :model_id => validation_model.id, :prediction_dataset_id => prediction_dataset.id, :test_dataset_id => test_set.id, :nr_instances => test_set.compound_ids.size, diff --git a/test/compound.rb b/test/compound.rb index 6a3c696..b33a643 100644 --- a/test/compound.rb +++ b/test/compound.rb @@ -134,4 +134,16 @@ print c.sdf end end end + + def test_mna + c = OpenTox::Compound.from_smiles "N#[N+]C1=CC=CC=C1.F[B-](F)(F)F" + p c.mna 4 + end + + def test_mpd + c = OpenTox::Compound.from_smiles "N#[N+]C1=CC=CC=C1.F[B-](F)(F)F" + assert 13, c.mpd.size + assert 7, c.mpd.uniq.size + assert_equal c.mpd, c.openbabel_fingerprint("mpd") + end end diff --git a/test/dataset.rb b/test/dataset.rb index 84be547..752073e 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -202,5 +202,15 @@ class DatasetTest < MiniTest::Test assert_equal 0.00323, d2.data_entries[5][0] end + def test_scaled_dataset + original_dataset = Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.mini.csv") + scaled_dataset = original_dataset.scale + scaled_dataset.data_entries.each_with_index do |row,i| + row.each_with_index do |value,j| + assert_equal original_dataset.data_entries[i][j].round(4), scaled_dataset.original_value(value,j).round(4) if value # ignore nils + end + end + end + end diff --git a/test/experiment.rb b/test/experiment.rb index 4b54768..76a0498 100644 --- a/test/experiment.rb +++ b/test/experiment.rb @@ -63,21 +63,26 @@ class ExperimentTest < MiniTest::Test end def test_regression_fingerprints +=begin datasets = [ - "LOAEL_mmol_corrected_smiles.csv" + "EPAFHM.medi.csv", + #"LOAEL_mmol_corrected_smiles.csv" ] min_sims = [0.3,0.7] - types = ["FP2","FP3","FP4","MACCS"] + #min_sims = [0.7] + #types = ["FP2","FP3","FP4","MACCS","mpd"] + types = ["mpd","FP3"] experiment = Experiment.create( - :name => "Fminer vs fingerprint classification for datasets #{datasets}.", + :name => "Fingerprint regression with different types for datasets #{datasets}.", :dataset_ids => datasets.collect{|d| Dataset.from_csv_file(File.join(DATA_DIR, d)).id}, ) types.each do |type| min_sims.each do |min_sim| experiment.model_settings << { - :algorithm => "OpenTox::Model::LazarRegression", + :model_algorithm => "OpenTox::Model::LazarRegression", + :prediction_algorithm => "OpenTox::Algorithm::Regression.weighted_average", :neighbor_algorithm => "fingerprint_neighbors", - :neighbor_algorithm_parameter => { + :neighbor_algorithm_parameters => { :type => type, :min_sim => min_sim, } @@ -85,7 +90,53 @@ class ExperimentTest < MiniTest::Test end end experiment.run - p experiment.report +=end +#=begin + experiment = Experiment.find '56029cb92b72ed673d000000' +#=end + p experiment.id + experiment.results.each do |dataset,result| + result.each do |r| + params = Model::Lazar.find(r["model_id"])[:neighbor_algorithm_parameters] + RepeatedCrossValidation.find(r["repeated_crossvalidation_id"]).crossvalidations.each do |cv| + cv.validation_ids.each do |vid| + model_params = Model::Lazar.find(Validation.find(vid).model_id)[:neighbor_algorithm_parameters] + assert_equal params[:type], model_params[:type] + assert_equal params[:min_sim], model_params[:min_sim] + refute_equal params[:training_dataset_id], model_params[:training_dataset_id] + end + end + end + end + puts experiment.report.to_yaml + p experiment.summary + end + def test_mpd_fingerprints +=begin + datasets = [ + "EPAFHM.medi.csv", + ] + types = ["FP2","mpd"] + experiment = Experiment.create( + :name => "FP2 vs mpd fingerprint regression for datasets #{datasets}.", + :dataset_ids => datasets.collect{|d| Dataset.from_csv_file(File.join(DATA_DIR, d)).id}, + ) + types.each do |type| + experiment.model_settings << { + :algorithm => "OpenTox::Model::LazarRegression", + :neighbor_algorithm => "fingerprint_neighbors", + :neighbor_algorithm_parameter => { + :type => type, + :min_sim => 0.7, + } + } + end + experiment.run + p experiment.id +=end + experiment = Experiment.find '55ffd0c02b72ed123c000000' + p experiment + puts experiment.report.to_yaml end end diff --git a/test/lazar-physchem-short.rb b/test/lazar-physchem-short.rb index e74a4b9..59d8112 100644 --- a/test/lazar-physchem-short.rb +++ b/test/lazar-physchem-short.rb @@ -2,27 +2,29 @@ require_relative "setup.rb" class LazarPhyschemDescriptorTest < MiniTest::Test def test_epafhm - skip "Physchem Regression not yet implemented." - # check available descriptors - @descriptors = OpenTox::Algorithm::Descriptor::DESCRIPTORS.keys - assert_equal 111,@descriptors.size,"wrong number of physchem descriptors" - @descriptor_values = OpenTox::Algorithm::Descriptor::DESCRIPTOR_VALUES - # select descriptors for test - @num_features_offset = 0 - @descriptors.keep_if{|x| x=~/^Openbabel\./} - @descriptors.delete("Openbabel.L5") # TODO Openbabel.L5 does not work, investigate!!! - puts "Descriptors: #{@descriptors}" + @descriptors = OpenTox::Algorithm::Descriptor::OBDESCRIPTORS.keys + refute_empty @descriptors # UPLOAD DATA training_dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.medi.csv") - puts "Dataset: "+training_dataset.id -# feature_dataset = Algorithm::Descriptor.physchem training_dataset, @descriptors - model = Model::LazarRegression.create training_dataset#, feature_dataset - #p model + feature_dataset = Algorithm::Descriptor.physchem training_dataset, @descriptors + scaled_feature_dataset = feature_dataset.scale + model = Model::LazarRegression.create training_dataset + model.neighbor_algorithm = "physchem_neighbors" + model.neighbor_algorithm_parameters = { + :feature_calculation_algorithm => "OpenTox::Algorithm::Descriptor.physchem", + :descriptors => @descriptors, + :feature_dataset_id => scaled_feature_dataset.id, + :min_sim => 0.3 + } + model.save compound = Compound.from_smiles "CC(C)(C)CN" prediction = model.predict compound - p prediction - + refute_nil prediction[:value] + refute_nil prediction[:confidence] + prediction[:neighbors].each do |line| + assert_operator line[1], :>, 0.3 + end end end diff --git a/test/lazar-regression.rb b/test/lazar-regression.rb index cc7f356..8b2d473 100644 --- a/test/lazar-regression.rb +++ b/test/lazar-regression.rb @@ -13,6 +13,16 @@ class LazarRegressionTest < MiniTest::Test assert_equal 1, prediction[:neighbors].size end + def test_mpd_fingerprints + training_dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" + model = Model::LazarRegression.create training_dataset + model.neighbor_algorithm_parameters[:type] = "mpd" + compound = Compound.from_smiles "CCCSCCSCC" + prediction = model.predict compound + assert_equal 0.04, prediction[:value].round(2) + assert_equal 1, prediction[:neighbors].size + end + def test_local_linear_regression skip training_dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" diff --git a/test/validation.rb b/test/validation.rb index dfa2c81..9717ccc 100644 --- a/test/validation.rb +++ b/test/validation.rb @@ -20,10 +20,25 @@ class ValidationTest < MiniTest::Test end def test_regression_crossvalidation - #dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" - dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.csv" - model = Model::LazarRegression.create dataset + dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" + #dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.csv" + params = { + :prediction_algorithm => "OpenTox::Algorithm::Regression.weighted_average", + :neighbor_algorithm => "fingerprint_neighbors", + :neighbor_algorithm_parameters => { + :type => "MACCS", + :min_sim => 0.7, + } + } + model = Model::LazarRegression.create dataset, params cv = RegressionCrossValidation.create model + cv.validation_ids.each do |vid| + model = Model::Lazar.find(Validation.find(vid).model_id) + assert_equal params[:neighbor_algorithm_parameters][:type], model[:neighbor_algorithm_parameters][:type] + assert_equal params[:neighbor_algorithm_parameters][:min_sim], model[:neighbor_algorithm_parameters][:min_sim] + refute_equal params[:neighbor_algorithm_parameters][:training_dataset_id], model[:neighbor_algorithm_parameters][:training_dataset_id] + end + #`inkview #{cv.plot}` #puts JSON.pretty_generate(cv.misclassifications)#.collect{|l| l.join ", "}.join "\n" #`inkview #{cv.plot}` @@ -37,12 +52,51 @@ class ValidationTest < MiniTest::Test dataset = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" model = Model::LazarClassification.create dataset repeated_cv = RepeatedCrossValidation.create model - p repeated_cv repeated_cv.crossvalidations.each do |cv| - p cv - p cv.accuracy assert cv.accuracy > 0.7 end end + def test_crossvalidation_parameters + dataset = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" + params = { + :neighbor_algorithm_parameters => { + :min_sim => 0.3, + :type => "FP3" + } + } + model = Model::LazarClassification.create dataset, params + model.save + cv = ClassificationCrossValidation.create model + params = model.neighbor_algorithm_parameters + params = Hash[params.map{ |k, v| [k.to_s, v] }] # convert symbols to string + cv.validations.each do |validation| + assert_equal params, validation.model.neighbor_algorithm_parameters + end + end + + def test_physchem_regression_crossvalidation + + @descriptors = OpenTox::Algorithm::Descriptor::OBDESCRIPTORS.keys + refute_empty @descriptors + + # UPLOAD DATA + training_dataset = OpenTox::Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.medi.csv") + feature_dataset = Algorithm::Descriptor.physchem training_dataset, @descriptors + feature_dataset.save + scaled_feature_dataset = feature_dataset.scale + scaled_feature_dataset.save + model = Model::LazarRegression.create training_dataset + model.neighbor_algorithm = "physchem_neighbors" + model.neighbor_algorithm_parameters = { + :feature_calculation_algorithm => "OpenTox::Algorithm::Descriptor.physchem", + :descriptors => @descriptors, + :feature_dataset_id => scaled_feature_dataset.id, + :min_sim => 0.3 + } + model.save + cv = RegressionCrossValidation.create model + p cv + end + end -- cgit v1.2.3 From 341e74ee91181c4450b56ed8c5ae2ea9771ad1f0 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 24 Sep 2015 13:09:20 +0200 Subject: fixed missing model_algorithm in experiments --- lib/experiment.rb | 8 +++----- test/experiment.rb | 51 +++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/lib/experiment.rb b/lib/experiment.rb index 616a273..6910139 100644 --- a/lib/experiment.rb +++ b/lib/experiment.rb @@ -10,12 +10,10 @@ module OpenTox dataset = Dataset.find(dataset_id) results[dataset_id.to_s] = [] model_settings.each do |setting| - model_algorithm = setting.delete :model_algorithm + setting = setting.dup + model_algorithm = setting.delete :model_algorithm #if setting[:model_algorithm] model = Object.const_get(model_algorithm).create dataset, setting - #model.prediction_algorithm = setting[:prediction_algorithm] if setting[:prediction_algorithm] - #model.neighbor_algorithm = setting[:neighbor_algorithm] if setting[:neighbor_algorithm] - #model.neighbor_algorithm_parameters = setting[:neighbor_algorithm_parameter] if setting[:neighbor_algorithm_parameter] - p model + $logger.debug model model.save repeated_crossvalidation = RepeatedCrossValidation.create model results[dataset_id.to_s] << {:model_id => model.id, :repeated_crossvalidation_id => repeated_crossvalidation.id} diff --git a/test/experiment.rb b/test/experiment.rb index 76a0498..2c4073d 100644 --- a/test/experiment.rb +++ b/test/experiment.rb @@ -63,7 +63,7 @@ class ExperimentTest < MiniTest::Test end def test_regression_fingerprints -=begin +#=begin datasets = [ "EPAFHM.medi.csv", #"LOAEL_mmol_corrected_smiles.csv" @@ -90,10 +90,10 @@ class ExperimentTest < MiniTest::Test end end experiment.run -=end -#=begin - experiment = Experiment.find '56029cb92b72ed673d000000' #=end +=begin + experiment = Experiment.find '56029cb92b72ed673d000000' +=end p experiment.id experiment.results.each do |dataset,result| result.each do |r| @@ -139,4 +139,47 @@ class ExperimentTest < MiniTest::Test p experiment puts experiment.report.to_yaml end + + def test_multiple_datasets + datasets = [ + "EPAFHM.medi.csv", + "LOAEL_mmol_corrected_smiles.csv" + ] + min_sims = [0.3] + types = ["FP2"] + experiment = Experiment.create( + :name => "Fingerprint regression with mutiple datasets #{datasets}.", + :dataset_ids => datasets.collect{|d| Dataset.from_csv_file(File.join(DATA_DIR, d)).id}, + ) + types.each do |type| + min_sims.each do |min_sim| + experiment.model_settings << { + :model_algorithm => "OpenTox::Model::LazarRegression", + :prediction_algorithm => "OpenTox::Algorithm::Regression.weighted_average", + :neighbor_algorithm => "fingerprint_neighbors", + :neighbor_algorithm_parameters => { + :type => type, + :min_sim => min_sim, + } + } + end + end + experiment.run + p experiment.id + experiment.results.each do |dataset,result| + result.each do |r| + params = Model::Lazar.find(r["model_id"])[:neighbor_algorithm_parameters] + RepeatedCrossValidation.find(r["repeated_crossvalidation_id"]).crossvalidations.each do |cv| + cv.validation_ids.each do |vid| + model_params = Model::Lazar.find(Validation.find(vid).model_id)[:neighbor_algorithm_parameters] + assert_equal params[:type], model_params[:type] + assert_equal params[:min_sim], model_params[:min_sim] + refute_equal params[:training_dataset_id], model_params[:training_dataset_id] + end + end + end + end + puts experiment.report.to_yaml + p experiment.summary + end end -- cgit v1.2.3 From be95000d7c14174286ddc8f1717c4b6c46e0c1cc Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 24 Sep 2015 15:41:18 +0200 Subject: mean method for Arrays --- lib/overwrite.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 08baa39..8234cbf 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -87,6 +87,10 @@ class Array (sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0 end + def mean + self.inject{ |sum, el| sum + el }.to_f / self.size + end + end module URI -- cgit v1.2.3 From 35a2b39803e3c84fbc37277d486a28d7de26d0df Mon Sep 17 00:00:00 2001 From: gebele Date: Fri, 25 Sep 2015 11:09:35 +0200 Subject: added helper method 'dimension' for nested arrays --- lib/overwrite.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/overwrite.rb b/lib/overwrite.rb index 8234cbf..be90c56 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -9,6 +9,11 @@ class Object def numeric? true if Float(self) rescue false end + + # Returns dimension of nested arrays + def dimension + self.class == Array ? 1 + self[0].dimension : 0 + end end class Numeric -- cgit v1.2.3 From d0dd879cfbdab90f928beb3fe031aa552808b030 Mon Sep 17 00:00:00 2001 From: gebele Date: Wed, 30 Sep 2015 14:49:08 +0200 Subject: fixed typo --- lib/model.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/model.rb b/lib/model.rb index 817a61e..427f620 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -145,7 +145,7 @@ module OpenTox def self.create training_dataset, params={} model = self.new training_dataset, params model.prediction_algorithm = "OpenTox::Algorithm::Classification.weighted_majority_vote" unless model.prediction_algorithm - model.neighbor_algorithm |= "fingerprint_neighbors" + model.neighbor_algorithm ||= "fingerprint_neighbors" model.neighbor_algorithm_parameters ||= {} { :type => "FP4", -- cgit v1.2.3 From 8d2f1c8a0f6cc9f7a481d1117bf8b3351130b1ea Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 7 Oct 2015 12:34:02 +0200 Subject: generalised fingerprints --- lib/compound.rb | 171 ++++++++++++++++++++++++------------------- lib/crossvalidation.rb | 5 ++ lib/dataset.rb | 4 +- lib/experiment.rb | 5 ++ lib/feature.rb | 2 + lib/model.rb | 42 ++++++----- test/compound.rb | 50 ++++++++----- test/dataset.rb | 1 + test/descriptor.rb | 12 +-- test/experiment.rb | 121 ++++++++++++++++++++++++++++-- test/lazar-physchem-short.rb | 1 + test/lazar-regression.rb | 14 ++-- test/prediction_models.rb | 21 +++--- test/validation.rb | 5 +- 14 files changed, 309 insertions(+), 145 deletions(-) diff --git a/lib/compound.rb b/lib/compound.rb index d3df125..7a3dc5c 100644 --- a/lib/compound.rb +++ b/lib/compound.rb @@ -9,6 +9,8 @@ module OpenTox class Compound include OpenTox + DEFAULT_FINGERPRINT = "MP2D" + field :inchi, type: String field :smiles, type: String field :inchikey, type: String @@ -19,77 +21,64 @@ module OpenTox field :png_id, type: BSON::ObjectId field :svg_id, type: BSON::ObjectId field :sdf_id, type: BSON::ObjectId - field :fp2, type: Array - field :fp3, type: Array - field :fp4, type: Array - field :fp4_size, type: Integer - field :maccs, type: Array + field :fingerprints, type: Hash, default: {} + field :default_fingerprint_size, type: Integer index({smiles: 1}, {unique: true}) # Overwrites standard Mongoid method to create fingerprints before database insertion def self.find_or_create_by params compound = self.find_or_initialize_by params - unless compound.fp4 and !compound.fp4.empty? - compound.fp4_size = 0 - compound.fp4 = [] - fingerprint = FingerprintSmarts.fingerprint - Algorithm::Descriptor.smarts_match(compound, fingerprint).each_with_index do |m,i| - if m > 0 - compound.fp4 << fingerprint[i].id - compound.fp4_size += 1 - end - end - end + compound.default_fingerprint_size = compound.fingerprint(DEFAULT_FINGERPRINT) compound.save compound end - - #http://openbabel.org/docs/dev/FileFormats/MolPrint2D_format.html#molprint2d-format - def mpd - smarts = obconversion(smiles,"smi","mpd").strip.split("\t") - smarts.shift # remove Title - smarts - - end - - #http://openbabel.org/docs/dev/FileFormats/Multilevel_Neighborhoods_of_Atoms_(MNA).html - def mna level=2 - smarts = obconversion(smiles,"smi","mna","xL\"#{level}\"").split("\n") - smarts.shift # remove Title - smarts - end - def openbabel_fingerprint type="FP2" - unless self.send(type.downcase.to_sym) # stored fingerprint - fp = OpenBabel::OBFingerprint.find_fingerprint(type) - obmol = OpenBabel::OBMol.new - obconversion = OpenBabel::OBConversion.new - obconversion.set_in_format "smi" - obconversion.read_string obmol, smiles - result = OpenBabel::VectorUnsignedInt.new - fp.get_fingerprint(obmol,result) - # TODO: %ignore *::DescribeBits @ line 163 openbabel/scripts/openbabel-ruby.i - #p OpenBabel::OBFingerprint.describe_bits(result) - # convert result to a list of the bits that are set - # from openbabel/scripts/python/pybel.py line 830 - # see also http://openbabel.org/docs/dev/UseTheLibrary/Python_Pybel.html#fingerprints - result = result.to_a - bitsperint = OpenBabel::OBFingerprint.getbitsperint() - bits_set = [] - start = 1 - result.each do |x| - i = start - while x > 0 do - bits_set << i if (x % 2) == 1 - x >>= 1 - i += 1 + def fingerprint type="MP2D" + unless fingerprints[type] + return [] unless self.smiles + #http://openbabel.org/docs/dev/FileFormats/MolPrint2D_format.html#molprint2d-format + if type == "MP2D" + fp = obconversion(smiles,"smi","mpd").strip.split("\t") + name = fp.shift # remove Title + fingerprints[type] = fp + #http://openbabel.org/docs/dev/FileFormats/Multilevel_Neighborhoods_of_Atoms_(MNA).html + elsif type== "MNA" + level = 2 # TODO: level as parameter, evaluate level 1, see paper + fp = obconversion(smiles,"smi","mna","xL\"#{level}\"").split("\n") + fp.shift # remove Title + fingerprints[type] = fp + else # standard fingerprints + fp = OpenBabel::OBFingerprint.find_fingerprint(type) + obmol = OpenBabel::OBMol.new + obconversion = OpenBabel::OBConversion.new + obconversion.set_in_format "smi" + obconversion.read_string obmol, self.smiles + result = OpenBabel::VectorUnsignedInt.new + fp.get_fingerprint(obmol,result) + # TODO: %ignore *::DescribeBits @ line 163 openbabel/scripts/openbabel-ruby.i + #p OpenBabel::OBFingerprint.describe_bits(result) + # convert result to a list of the bits that are set + # from openbabel/scripts/python/pybel.py line 830 + # see also http://openbabel.org/docs/dev/UseTheLibrary/Python_Pybel.html#fingerprints + result = result.to_a + bitsperint = OpenBabel::OBFingerprint.getbitsperint() + bits_set = [] + start = 1 + result.each do |x| + i = start + while x > 0 do + bits_set << i if (x % 2) == 1 + x >>= 1 + i += 1 + end + start += bitsperint end - start += bitsperint + fingerprints[type] = bits_set end - update_attribute type.downcase.to_sym, bits_set + save end - self.send(type.downcase.to_sym) + fingerprints[type] end # Create a compound from smiles string @@ -100,7 +89,8 @@ module OpenTox def self.from_smiles smiles smiles = obconversion(smiles,"smi","can") if smiles.empty? - Compound.find_or_create_by(:warning => "SMILES parsing failed for '#{smiles}', this may be caused by an incorrect SMILES string.") + return nil + #Compound.find_or_create_by(:warning => "SMILES parsing failed for '#{smiles}', this may be caused by an incorrect SMILES string.") else Compound.find_or_create_by :smiles => obconversion(smiles,"smi","can") end @@ -146,7 +136,7 @@ module OpenTox result = obconversion(smiles,"smi","inchi") #result = `echo "#{self.smiles}" | "#{File.join(File.dirname(__FILE__),"..","openbabel","bin","babel")}" -ismi - -oinchi`.chomp - update(:inchi => result.chomp) unless result.empty? + update(:inchi => result.chomp) if result and !result.empty? end self["inchi"] end @@ -227,20 +217,47 @@ module OpenTox self["chemblid"] end - def fingerprint_neighbors params - bad_request_error "Incorrect parameters '#{params}' for Compound#fingerprint_neighbors. Please provide :type, :training_dataset_id, :min_sim." unless params[:type] and params[:training_dataset_id] and params[:min_sim] + def fingerprint_count_neighbors params + # TODO fix neighbors = [] - query_fingerprint = self.openbabel_fingerprint params[:type] + query_fingerprint = self.fingerprint params[:type] training_dataset = Dataset.find(params[:training_dataset_id]).compounds.each do |compound| unless self == compound - fingerprint = compound.openbabel_fingerprint params[:type] - sim = (query_fingerprint & fingerprint).size/(query_fingerprint | fingerprint).size.to_f - neighbors << [compound.id, sim] if sim >= params[:min_sim] + candidate_fingerprint = compound.fingerprint params[:type] + features = (query_fingerprint + candidate_fingerprint).uniq + min_sum = 0 + max_sum = 0 + features.each do |f| + min,max = [query_fingerprint.count(f),candidate_fingerprint.count(f)].minmax + min_sum += min + max_sum += max + end + max_sum == 0 ? sim = 0 : sim = min_sum/max_sum.to_f + neighbors << [compound.id, sim] if sim and sim >= params[:min_sim] end end neighbors.sort{|a,b| b.last <=> a.last} end + def fingerprint_neighbors params + bad_request_error "Incorrect parameters '#{params}' for Compound#fingerprint_neighbors. Please provide :type, :training_dataset_id, :min_sim." unless params[:type] and params[:training_dataset_id] and params[:min_sim] + neighbors = [] + #if params[:type] == DEFAULT_FINGERPRINT + #neighbors = db_neighbors params + #p neighbors + #else + query_fingerprint = self.fingerprint params[:type] + training_dataset = Dataset.find(params[:training_dataset_id]).compounds.each do |compound| + unless self == compound + candidate_fingerprint = compound.fingerprint params[:type] + sim = (query_fingerprint & candidate_fingerprint).size/(query_fingerprint | candidate_fingerprint).size.to_f + neighbors << [compound.id, sim] if sim >= params[:min_sim] + end + end + #end + neighbors.sort{|a,b| b.last <=> a.last} + end + def fminer_neighbors params bad_request_error "Incorrect parameters for Compound#fminer_neighbors. Please provide :feature_dataset_id, :min_sim." unless params[:feature_dataset_id] and params[:min_sim] feature_dataset = Dataset.find params[:feature_dataset_id] @@ -248,8 +265,8 @@ module OpenTox neighbors = [] # find neighbors - feature_dataset.data_entries.each_with_index do |fingerprint, i| - sim = Algorithm::Similarity.tanimoto fingerprint, query_fingerprint + feature_dataset.data_entries.each_with_index do |candidate_fingerprint, i| + sim = Algorithm::Similarity.tanimoto candidate_fingerprint, query_fingerprint if sim >= params[:min_sim] neighbors << [feature_dataset.compound_ids[i],sim] # use compound_ids, instantiation of Compounds is too time consuming end @@ -261,10 +278,10 @@ module OpenTox feature_dataset = Dataset.find params[:feature_dataset_id] query_fingerprint = Algorithm.run params[:feature_calculation_algorithm], self, params[:descriptors] neighbors = [] - feature_dataset.data_entries.each_with_index do |fingerprint, i| + feature_dataset.data_entries.each_with_index do |candidate_fingerprint, i| # TODO implement pearson and cosine similarity separatly R.assign "x", query_fingerprint - R.assign "y", fingerprint + R.assign "y", candidate_fingerprint # pearson r #sim = R.eval("cor(x,y,use='complete.obs',method='pearson')").to_ruby #p "pearson" @@ -279,10 +296,12 @@ module OpenTox neighbors end - def neighbors threshold=0.7 + def db_neighbors params + p "DB NEIGHBORS" + p params # TODO restrict to dataset # from http://blog.matt-swain.com/post/87093745652/chemical-similarity-search-in-mongodb - qn = fp4.size + qn = fingerprint(params[:type]).size #qmin = qn * threshold #qmax = qn / threshold #not sure if it is worth the effort of keeping feature counts up to date (compound deletions, additions, ...) @@ -292,12 +311,12 @@ module OpenTox {'$match' => {'_id' => {'$ne' => self.id}}}, # remove self {'$project' => { 'tanimoto' => {'$let' => { - 'vars' => {'common' => {'$size' => {'$setIntersection' => ['$fp4', fp4]}}}, - 'in' => {'$divide' => ['$$common', {'$subtract' => [{'$add' => [qn, '$fp4_size']}, '$$common']}]} + 'vars' => {'common' => {'$size' => {'$setIntersection' => ["'$#{DEFAULT_FINGERPRINT}'", DEFAULT_FINGERPRINT]}}}, + 'in' => {'$divide' => ['$$common', {'$subtract' => [{'$add' => [qn, '$default_fingerprint_size']}, '$$common']}]} }}, '_id' => 1 }}, - {'$match' => {'tanimoto' => {'$gte' => threshold}}}, + {'$match' => {'tanimoto' => {'$gte' => params[:min_sim]}}}, {'$sort' => {'tanimoto' => -1}} ] @@ -312,12 +331,12 @@ module OpenTox obconversion.set_options(option, OpenBabel::OBConversion::OUTOPTIONS) if option obmol = OpenBabel::OBMol.new obconversion.set_in_and_out_formats input_format, output_format + return nil if identifier.nil? obconversion.read_string obmol, identifier case output_format when /smi|can|inchi/ obconversion.write_string(obmol).gsub(/\s/,'').chomp when /sdf/ -p "SDF conversion" # TODO: find disconnected structures # strip_salts # separate diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb index 4c80344..6dc8d7f 100644 --- a/lib/crossvalidation.rb +++ b/lib/crossvalidation.rb @@ -54,6 +54,7 @@ module OpenTox nr_unpredicted: nr_unpredicted, predictions: predictions ) + $logger.debug "Nr unpredicted: #{nr_unpredicted}" cv.statistics cv end @@ -122,6 +123,7 @@ module OpenTox predictivity: predictivity, finished_at: Time.now ) + $logger.debug "Accuracy #{accuracy}" end #Average area under roc 0.646 @@ -192,6 +194,9 @@ module OpenTox r_squared: r**2, finished_at: Time.now ) + $logger.debug "R^2 #{r**2}" + $logger.debug "RMSE #{rmse}" + $logger.debug "MAE #{mae}" end def misclassifications n=nil diff --git a/lib/dataset.rb b/lib/dataset.rb index 7c8ab44..60f3bb5 100644 --- a/lib/dataset.rb +++ b/lib/dataset.rb @@ -266,8 +266,8 @@ module OpenTox end compounds.duplicates.each do |compound| positions = [] - compounds.each_with_index{|c,i| positions << i+1 if !c.blank? and c.inchi == compound.inchi} - warnings << "Duplicate compound #{compound.inchi} at rows #{positions.join(', ')}. Entries are accepted, assuming that measurements come from independent experiments." + compounds.each_with_index{|c,i| positions << i+1 if !c.blank? and c.inchi and c.inchi == compound.inchi} + warnings << "Duplicate compound #{compound.smiles} at rows #{positions.join(', ')}. Entries are accepted, assuming that measurements come from independent experiments." end $logger.debug "Value parsing: #{Time.now-time} (Compound creation: #{compound_time})" diff --git a/lib/experiment.rb b/lib/experiment.rb index 6910139..0dfdf86 100644 --- a/lib/experiment.rb +++ b/lib/experiment.rb @@ -34,6 +34,7 @@ module OpenTox report[:results][dataset_name] = {} report[:results][dataset_name][:anova] = {} report[:results][dataset_name][:data] = [] + # TODO results[dataset_id.to_s] does not exist results[dataset_id.to_s].each do |result| model = Model::Lazar.find(result[:model_id]) repeated_cv = RepeatedCrossValidation.find(result[:repeated_crossvalidation_id]) @@ -67,6 +68,7 @@ module OpenTox outcome << p end end + begin R.assign "experiment_nr",experiments.collect{|i| "Experiment #{i}"} R.eval "experiment_nr = factor(experiment_nr)" R.assign "outcome", outcome @@ -78,6 +80,9 @@ module OpenTox # aequivalent # sum = R.eval("summary(fit)") #p_value = sum.to_ruby.first.last.first + rescue + p_value = nil + end report[:results][dataset][:anova][param] = p_value =begin =end diff --git a/lib/feature.rb b/lib/feature.rb index 6fc2c06..13fa6d1 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -47,6 +47,7 @@ module OpenTox class FingerprintSmarts < Smarts field :count, type: Integer def self.fingerprint +=begin @@fp4 ||= OpenTox::FingerprintSmarts.all unless @@fp4.size == 306 @@fp4 = [] @@ -72,6 +73,7 @@ module OpenTox end end @@fp4 +=end end end diff --git a/lib/model.rb b/lib/model.rb index 817a61e..cd88e0c 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -82,7 +82,6 @@ module OpenTox end neighbors = compound.send(neighbor_algorithm, neighbor_algorithm_parameters) - #neighbors = Algorithm.run(neighbor_algorithm, compound, neighbor_algorithm_parameters) # add activities # TODO: improve efficiency, takes 3 times longer than previous version neighbors.collect! do |n| @@ -145,12 +144,12 @@ module OpenTox def self.create training_dataset, params={} model = self.new training_dataset, params model.prediction_algorithm = "OpenTox::Algorithm::Classification.weighted_majority_vote" unless model.prediction_algorithm - model.neighbor_algorithm |= "fingerprint_neighbors" + model.neighbor_algorithm ||= "fingerprint_neighbors" model.neighbor_algorithm_parameters ||= {} { - :type => "FP4", + :type => "MP2D", :training_dataset_id => training_dataset.id, - :min_sim => 0.7 + :min_sim => 0.1 }.each do |key,value| model.neighbor_algorithm_parameters[key] ||= value end @@ -163,16 +162,19 @@ module OpenTox def self.create training_dataset, params={} model = self.new training_dataset, params - #model.neighbor_algorithm ||= "fingerprint_neighbors" - #model.prediction_algorithm ||= "OpenTox::Algorithm::Regression.weighted_average" - #model.neighbor_algorithm_parameters ||= {} - #{ + model.neighbor_algorithm ||= "fingerprint_neighbors" + model.prediction_algorithm ||= "OpenTox::Algorithm::Regression.weighted_average" + model.neighbor_algorithm_parameters ||= {} + { + :type => "MP2D", + :training_dataset_id => training_dataset.id, + :min_sim => 0.1 #:type => "FP4", #:training_dataset_id => training_dataset.id, #:min_sim => 0.7 - #}.each do |key,value| - #model.neighbor_algorithm_parameters[key] ||= value - #end + }.each do |key,value| + model.neighbor_algorithm_parameters[key] ||= value + end model.save model end @@ -209,7 +211,7 @@ module OpenTox field :source, type: String field :unit, type: String field :model_id, type: BSON::ObjectId - field :crossvalidation_id, type: BSON::ObjectId + field :repeated_crossvalidation_id, type: BSON::ObjectId def predict object Lazar.find(model_id).predict object @@ -223,8 +225,12 @@ module OpenTox Lazar.find model_id end - def crossvalidation - CrossValidation.find crossvalidation_id + def repeated_crossvalidation + RepeatedCrossValidation.find repeated_crossvalidation_id + end + + def crossvalidations + repeated_crossvalidation.crossvalidations end def regression? @@ -241,16 +247,14 @@ module OpenTox prediction_model = self.new JSON.parse(File.read(metadata_file)) training_dataset = Dataset.from_csv_file file model = nil - cv = nil if training_dataset.features.first.nominal? - model = LazarFminerClassification.create training_dataset - cv = ClassificationCrossValidation.create model + #model = LazarFminerClassification.create training_dataset + model = LazarClassification.create training_dataset elsif training_dataset.features.first.numeric? model = LazarRegression.create training_dataset - cv = RegressionCrossValidation.create model end prediction_model[:model_id] = model.id - prediction_model[:crossvalidation_id] = cv.id + prediction_model[:repeated_crossvalidation_id] = RepeatedCrossValidation.create(model).id prediction_model.save prediction_model end diff --git a/test/compound.rb b/test/compound.rb index b33a643..036f384 100644 --- a/test/compound.rb +++ b/test/compound.rb @@ -77,17 +77,16 @@ print c.sdf def test_fingerprint c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" - assert c.fp4.collect{|fid| Feature.find(fid).name}.include? ("1,3-Tautomerizable") - assert_equal c.fp4.size, c.fp4_size + assert_equal 9, c.fingerprint("FP4").size end def test_neighbors d = Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.csv") d.compounds.each do |c| - refute_nil c.fp4 + refute_nil c.fingerprint("MP2D") end c = d.compounds[371] - n = c.neighbors + n = c.fingerprint_neighbors({:type => "FP4", :min_sim => 0.7, :training_dataset_id => d.id }) assert n.size >= 18, "Neighbors size (#{n.size}) should be larger than 17" end @@ -105,7 +104,7 @@ print c.sdf "C(=O)CC(C)C#N", ].each do |smi| c = OpenTox::Compound.from_smiles smi - assert_equal c.openbabel_fingerprint("FP4").size, c.fp4.size + refute_nil c.fingerprint("FP4") end end @@ -119,17 +118,10 @@ print c.sdf "C(=O)CC(C)C#N", ].each do |smi| c = OpenTox::Compound.from_smiles smi - p c.smiles types.each do |type| - p type neighbors = c.fingerprint_neighbors({:type => type, :training_dataset_id => training_dataset.id, :min_sim => min_sim}) - p neighbors.collect{|n| [Compound.find(n.first).smiles,n.last]} - if type == "FP4" - fp4_neighbors = c.neighbors - neighbors.each do |n| - p [Compound.find(n.first).smiles,n.last] unless fp4_neighbors.include?(n) - assert_includes fp4_neighbors, n - end + unless type == "FP2" and smi == "CC(=O)CC(C)C#N" or smi == "C(=O)CC(C)C#N" and (type == "FP2" or type == "MACCS") + refute_empty neighbors end end end @@ -137,13 +129,35 @@ print c.sdf def test_mna c = OpenTox::Compound.from_smiles "N#[N+]C1=CC=CC=C1.F[B-](F)(F)F" - p c.mna 4 + assert_equal 18, c.fingerprint("MNA").size + assert_equal 9, c.fingerprint("MNA").uniq.size end def test_mpd c = OpenTox::Compound.from_smiles "N#[N+]C1=CC=CC=C1.F[B-](F)(F)F" - assert 13, c.mpd.size - assert 7, c.mpd.uniq.size - assert_equal c.mpd, c.openbabel_fingerprint("mpd") + assert 13, c.fingerprint("MP2D").size + assert 7, c.fingerprint("MP2D").uniq.size + end + + def test_fingerprint_count_neighbors + types = ["MP2D", "MNA"] + min_sim = 0.0 + training_dataset = Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.csv") + [ + "CC(=O)CC(C)C#N", + "CC(=O)CC(C)C", + "C(=O)CC(C)C#N", + ].each do |smi| + c = OpenTox::Compound.from_smiles smi + types.each do |type| + neighbors = c.fingerprint_count_neighbors({:type => type, :training_dataset_id => training_dataset.id, :min_sim => min_sim}) + if type == "FP4" + fp4_neighbors = c.neighbors + neighbors.each do |n| + assert_includes fp4_neighbors, n + end + end + end + end end end diff --git a/test/dataset.rb b/test/dataset.rb index 752073e..60f917c 100644 --- a/test/dataset.rb +++ b/test/dataset.rb @@ -168,6 +168,7 @@ class DatasetTest < MiniTest::Test def test_from_csv2 File.open("#{DATA_DIR}/temp_test.csv", "w+") { |file| file.write("SMILES,Hamster\nCC=O,true\n ,true\nO=C(N),true") } dataset = Dataset.from_csv_file "#{DATA_DIR}/temp_test.csv" + p dataset.warnings assert_equal "Cannot parse SMILES compound ' ' at position 3, all entries are ignored.", dataset.warnings.join File.delete "#{DATA_DIR}/temp_test.csv" dataset.features.each{|f| feature = Feature.find f.id; feature.delete} diff --git a/test/descriptor.rb b/test/descriptor.rb index 2d6ff08..58149a7 100644 --- a/test/descriptor.rb +++ b/test/descriptor.rb @@ -5,17 +5,17 @@ class DescriptorTest < MiniTest::Test def test_list # check available descriptors @descriptors = OpenTox::Algorithm::Descriptor::DESCRIPTORS.keys - assert_equal 111,@descriptors.size,"wrong num physchem descriptors" + assert_equal 110,@descriptors.size,"wrong num physchem descriptors" @descriptor_values = OpenTox::Algorithm::Descriptor::DESCRIPTOR_VALUES - assert_equal 356,@descriptor_values.size,"wrong num physchem descriptors" + assert_equal 355,@descriptor_values.size,"wrong num physchem descriptors" sum = 0 [ @descriptors, @descriptor_values ].each do |desc| - {"Openbabel"=>16,"Cdk"=>(desc==@descriptors ? 50 : 295),"Joelib"=>45}.each do |k,v| + {"Openbabel"=>15,"Cdk"=>(desc==@descriptors ? 50 : 295),"Joelib"=>45}.each do |k,v| assert_equal v,desc.select{|x| x=~/^#{k}\./}.size,"wrong num #{k} descriptors" sum += v end end - assert_equal (111+356),sum + assert_equal (465),sum end def test_smarts @@ -59,9 +59,9 @@ class DescriptorTest < MiniTest::Test def test_compound_all c = OpenTox::Compound.from_smiles "CC(=O)CC(C)C#N" result = OpenTox::Algorithm::Descriptor.physchem c - assert_equal 332, result.size + assert_equal 330, result.size assert_equal 30.8723, result[2] - assert_equal 1.12518, result[328] + assert_equal 5, result[328] end def test_compound_descriptor_parameters diff --git a/test/experiment.rb b/test/experiment.rb index 2c4073d..b49f349 100644 --- a/test/experiment.rb +++ b/test/experiment.rb @@ -70,8 +70,8 @@ class ExperimentTest < MiniTest::Test ] min_sims = [0.3,0.7] #min_sims = [0.7] - #types = ["FP2","FP3","FP4","MACCS","mpd"] - types = ["mpd","FP3"] + #types = ["FP2","FP3","FP4","MACCS","MP2D"] + types = ["MP2D","FP3"] experiment = Experiment.create( :name => "Fingerprint regression with different types for datasets #{datasets}.", :dataset_ids => datasets.collect{|d| Dataset.from_csv_file(File.join(DATA_DIR, d)).id}, @@ -113,13 +113,12 @@ class ExperimentTest < MiniTest::Test end def test_mpd_fingerprints -=begin datasets = [ "EPAFHM.medi.csv", ] - types = ["FP2","mpd"] + types = ["FP2","MP2D"] experiment = Experiment.create( - :name => "FP2 vs mpd fingerprint regression for datasets #{datasets}.", + :name => "FP2 vs MP2D fingerprint regression for datasets #{datasets}.", :dataset_ids => datasets.collect{|d| Dataset.from_csv_file(File.join(DATA_DIR, d)).id}, ) types.each do |type| @@ -134,8 +133,9 @@ class ExperimentTest < MiniTest::Test end experiment.run p experiment.id +=begin =end - experiment = Experiment.find '55ffd0c02b72ed123c000000' + #experiment = Experiment.find '55ffd0c02b72ed123c000000' p experiment puts experiment.report.to_yaml end @@ -182,4 +182,113 @@ class ExperimentTest < MiniTest::Test puts experiment.report.to_yaml p experiment.summary end + + def test_mpd_mna_regression_fingerprints + datasets = [ + "EPAFHM.medi.csv", + #"hamster_carcinogenicity.csv" + ] + min_sims = [0.0,0.3] + types = ["MP2D","MNA"] + neighbor_algos = [ + "fingerprint_neighbors", + "fingerprint_count_neighbors", + ] + experiment = Experiment.create( + :name => "MNA vs MPD descriptors", + :dataset_ids => datasets.collect{|d| Dataset.from_csv_file(File.join(DATA_DIR, d)).id}, + ) + types.each do |type| + min_sims.each do |min_sim| + neighbor_algos.each do |neighbor_algo| + experiment.model_settings << { + :model_algorithm => "OpenTox::Model::LazarRegression", + :prediction_algorithm => "OpenTox::Algorithm::Regression.weighted_average", + :neighbor_algorithm => neighbor_algo, + :neighbor_algorithm_parameters => { + :type => type, + :min_sim => min_sim, + } + } + end + end + end + experiment.run +#=end +=begin + experiment = Experiment.find '56029cb92b72ed673d000000' +=end + p experiment.id + puts experiment.report.to_yaml + #p experiment.summary + experiment.results.each do |dataset,result| + result.each do |r| + p r + # TODO fix r["model_id"] + params = Model::Lazar.find(r["model_id"])[:neighbor_algorithm_parameters] + RepeatedCrossValidation.find(r["repeated_crossvalidation_id"]).crossvalidations.each do |cv| + cv.validation_ids.each do |vid| + model_params = Model::Lazar.find(Validation.find(vid).model_id)[:neighbor_algorithm_parameters] + assert_equal params[:type], model_params[:type] + assert_equal params[:min_sim], model_params[:min_sim] + refute_equal params[:training_dataset_id], model_params[:training_dataset_id] + end + end + end + end + end + + def test_mpd_mna_classification_fingerprints + datasets = [ + #"EPAFHM.medi.csv", + "hamster_carcinogenicity.csv" + ] + min_sims = [0.0,0.3] + types = ["MP2D","MNA"] + neighbor_algos = [ + "fingerprint_count_neighbors", + "fingerprint_neighbors", + ] + experiment = Experiment.create( + :name => "MNA vs MPD descriptors", + :dataset_ids => datasets.collect{|d| Dataset.from_csv_file(File.join(DATA_DIR, d)).id}, + ) + types.each do |type| + min_sims.each do |min_sim| + neighbor_algos.each do |neighbor_algo| + experiment.model_settings << { + :model_algorithm => "OpenTox::Model::LazarClassification", + :prediction_algorithm => "OpenTox::Algorithm::Classification.weighted_majority_vote", + :neighbor_algorithm => neighbor_algo, + :neighbor_algorithm_parameters => { + :type => type, + :min_sim => min_sim, + } + } + end + end + end + experiment.run +#=end +=begin + experiment = Experiment.find '56029cb92b72ed673d000000' +=end + p experiment.id + puts experiment.report.to_yaml + #p experiment.summary + experiment.results.each do |dataset,result| + result.each do |r| + # TODO fix r["model_id"] + params = Model::Lazar.find(r["model_id"])[:neighbor_algorithm_parameters] + RepeatedCrossValidation.find(r["repeated_crossvalidation_id"]).crossvalidations.each do |cv| + cv.validation_ids.each do |vid| + model_params = Model::Lazar.find(Validation.find(vid).model_id)[:neighbor_algorithm_parameters] + assert_equal params[:type], model_params[:type] + assert_equal params[:min_sim], model_params[:min_sim] + refute_equal params[:training_dataset_id], model_params[:training_dataset_id] + end + end + end + end + end end diff --git a/test/lazar-physchem-short.rb b/test/lazar-physchem-short.rb index 59d8112..d6c2159 100644 --- a/test/lazar-physchem-short.rb +++ b/test/lazar-physchem-short.rb @@ -3,6 +3,7 @@ require_relative "setup.rb" class LazarPhyschemDescriptorTest < MiniTest::Test def test_epafhm + skip @descriptors = OpenTox::Algorithm::Descriptor::OBDESCRIPTORS.keys refute_empty @descriptors diff --git a/test/lazar-regression.rb b/test/lazar-regression.rb index 8b2d473..4f5a332 100644 --- a/test/lazar-regression.rb +++ b/test/lazar-regression.rb @@ -4,23 +4,21 @@ class LazarRegressionTest < MiniTest::Test def test_weighted_average training_dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" - model = Model::LazarRegression.create training_dataset + model = Model::LazarRegression.create training_dataset, {:neighbor_algorithm_parameters => {:min_sim => 0}} compound = Compound.from_smiles "CC(C)(C)CN" prediction = model.predict compound - #p prediction - assert_equal 13.6, prediction[:value].round(1) - #assert_equal 0.83, prediction[:confidence].round(2) - assert_equal 1, prediction[:neighbors].size + assert_equal 7.2, prediction[:value].round(1) + assert_equal 91, prediction[:neighbors].size end def test_mpd_fingerprints training_dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" model = Model::LazarRegression.create training_dataset - model.neighbor_algorithm_parameters[:type] = "mpd" + model.neighbor_algorithm_parameters[:type] = "MP2D" compound = Compound.from_smiles "CCCSCCSCC" prediction = model.predict compound - assert_equal 0.04, prediction[:value].round(2) - assert_equal 1, prediction[:neighbors].size + assert_equal 0.02, prediction[:value].round(2) + assert_equal 3, prediction[:neighbors].size end def test_local_linear_regression diff --git a/test/prediction_models.rb b/test/prediction_models.rb index 001ebcd..1b9e788 100644 --- a/test/prediction_models.rb +++ b/test/prediction_models.rb @@ -3,21 +3,24 @@ require_relative "setup.rb" class PredictionModelTest < MiniTest::Test def test_prediction_model - dataset = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" - model = Model::LazarFminerClassification.create dataset - cv = ClassificationCrossValidation.create model - metadata = JSON.parse(File.read("#{DATA_DIR}/hamster_carcinogenicity.json")) + pm = Model::Prediction.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" + #dataset = Dataset.from_csv_file "#{DATA_DIR}/hamster_carcinogenicity.csv" + #model = Model::LazarFminerClassification.create dataset + #cv = ClassificationCrossValidation.create model + #metadata = JSON.parse(File.read("#{DATA_DIR}/hamster_carcinogenicity.json")) - metadata[:model_id] = model.id - metadata[:crossvalidation_id] = cv.id - pm = Model::Prediction.new(metadata) - pm.save + #metadata[:model_id] = model.id + #metadata[:crossvalidation_id] = cv.id + #pm = Model::Prediction.new(metadata) + #pm.save [:endpoint,:species,:source].each do |p| refute_empty pm[p] end assert pm.classification? refute pm.regression? - assert pm.crossvalidation.accuracy > 0.8 + pm.crossvalidations.each do |cv| + assert cv.accuracy > 0.75 + end prediction = pm.predict Compound.from_smiles("CCCC(NN)C") assert_equal "true", prediction[:value] pm.delete diff --git a/test/validation.rb b/test/validation.rb index 9717ccc..af5ea60 100644 --- a/test/validation.rb +++ b/test/validation.rb @@ -16,7 +16,9 @@ class ValidationTest < MiniTest::Test model = Model::LazarClassification.create dataset#, features cv = ClassificationCrossValidation.create model assert cv.accuracy > 0.7 - assert cv.weighted_accuracy > cv.accuracy, "Weighted accuracy should be larger than unweighted accuracy." + p cv.nr_unpredicted + p cv.accuracy + #assert cv.weighted_accuracy > cv.accuracy, "Weighted accuracy should be larger than unweighted accuracy." end def test_regression_crossvalidation @@ -76,6 +78,7 @@ class ValidationTest < MiniTest::Test end def test_physchem_regression_crossvalidation + skip @descriptors = OpenTox::Algorithm::Descriptor::OBDESCRIPTORS.keys refute_empty @descriptors -- cgit v1.2.3 From 72e2a77fb0b72f7d525ce4b51fc03c8ee9920da2 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Wed, 7 Oct 2015 12:45:10 +0200 Subject: confidence = similarity to nearest neighbor --- lib/classification.rb | 4 +++- lib/regression.rb | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/classification.rb b/lib/classification.rb index ab1efd8..0a32126 100644 --- a/lib/classification.rb +++ b/lib/classification.rb @@ -8,8 +8,10 @@ module OpenTox return {:value => nil,:confidence => nil,:warning => "Cound not find similar compounds."} if neighbors.empty? weighted_sum = {} sim_sum = 0.0 + confidence = 0.0 neighbors.each do |row| n,sim,acts = row + confidence = sim if sim > confidence # distance to nearest neighbor acts.each do |act| weighted_sum[act] ||= 0 weighted_sum[act] += sim @@ -22,7 +24,7 @@ module OpenTox sim_sum = weighted_sum[weighted_sum.keys[0]] sim_sum -= weighted_sum[weighted_sum.keys[1]] sim_sum > 0 ? prediction = weighted_sum.keys[0] : prediction = weighted_sum.keys[1] - confidence = (sim_sum/neighbors.size).abs + #confidence = (sim_sum/neighbors.size).abs return {:value => prediction,:confidence => confidence} else bad_request_error "Cannot predict more than 2 classes, multinomial classifications is not yet implemented. Received classes were: '#{weighted.sum.keys}'" diff --git a/lib/regression.rb b/lib/regression.rb index 2580a1e..9062a9e 100644 --- a/lib/regression.rb +++ b/lib/regression.rb @@ -22,15 +22,18 @@ module OpenTox def self.weighted_average compound, params weighted_sum = 0.0 sim_sum = 0.0 + confidence = 0.0 neighbors = params[:neighbors] neighbors.each do |row| n,sim,acts = row + confidence = sim if sim > confidence # distance to nearest neighbor + # TODO add LOO errors acts.each do |act| weighted_sum += sim*Math.log10(act) sim_sum += sim end end - confidence = sim_sum*neighbors.size.to_f/params[:training_dataset_size] + #confidence = sim_sum*neighbors.size.to_f/params[:training_dataset_size] sim_sum == 0 ? prediction = nil : prediction = 10**(weighted_sum/sim_sum) {:value => prediction,:confidence => confidence} end -- cgit v1.2.3 From 6bde559981fa11ffd265af708956f9d4ee6c9a89 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 8 Oct 2015 10:32:31 +0200 Subject: crossvalidation plots, original classification confidence --- lib/classification.rb | 4 +- lib/crossvalidation.rb | 111 ++++++++++++++++++++++++++----------------------- lib/lazar.rb | 3 ++ lib/model.rb | 4 +- lib/overwrite.rb | 10 +++++ lib/regression.rb | 8 ++++ lib/validation.rb | 4 +- test/compound.rb | 13 ++++++ test/setup.rb | 4 +- test/validation.rb | 36 ++++++++++++---- 10 files changed, 129 insertions(+), 68 deletions(-) diff --git a/lib/classification.rb b/lib/classification.rb index 0a32126..b4b2e59 100644 --- a/lib/classification.rb +++ b/lib/classification.rb @@ -11,7 +11,7 @@ module OpenTox confidence = 0.0 neighbors.each do |row| n,sim,acts = row - confidence = sim if sim > confidence # distance to nearest neighbor + #confidence = sim if sim > confidence # distance to nearest neighbor acts.each do |act| weighted_sum[act] ||= 0 weighted_sum[act] += sim @@ -24,7 +24,7 @@ module OpenTox sim_sum = weighted_sum[weighted_sum.keys[0]] sim_sum -= weighted_sum[weighted_sum.keys[1]] sim_sum > 0 ? prediction = weighted_sum.keys[0] : prediction = weighted_sum.keys[1] - #confidence = (sim_sum/neighbors.size).abs + confidence = (sim_sum/neighbors.size).abs return {:value => prediction,:confidence => confidence} else bad_request_error "Cannot predict more than 2 classes, multinomial classifications is not yet implemented. Received classes were: '#{weighted.sum.keys}'" diff --git a/lib/crossvalidation.rb b/lib/crossvalidation.rb index 6dc8d7f..cbffb7c 100644 --- a/lib/crossvalidation.rb +++ b/lib/crossvalidation.rb @@ -52,7 +52,7 @@ module OpenTox cv.update_attributes( nr_instances: nr_instances, nr_unpredicted: nr_unpredicted, - predictions: predictions + predictions: predictions.sort{|a,b| b[3] <=> a[3]} # sort according to confidence ) $logger.debug "Nr unpredicted: #{nr_unpredicted}" cv.statistics @@ -69,6 +69,7 @@ module OpenTox field :weighted_accuracy, type: Float field :true_rate, type: Hash field :predictivity, type: Hash + field :confidence_plot_id, type: BSON::ObjectId # TODO auc, f-measure (usability??) def statistics @@ -126,6 +127,30 @@ module OpenTox $logger.debug "Accuracy #{accuracy}" end + def confidence_plot + tmpfile = "/tmp/#{id.to_s}_confidence.svg" + accuracies = [] + confidences = [] + correct_predictions = 0 + incorrect_predictions = 0 + predictions.each do |p| + if p[1] and p[2] + p[1] == p [2] ? correct_predictions += 1 : incorrect_predictions += 1 + accuracies << correct_predictions/(correct_predictions+incorrect_predictions).to_f + confidences << p[3] + + end + end + R.assign "accuracy", accuracies + R.assign "confidence", confidences + R.eval "image = qplot(confidence,accuracy)+ylab('accumulated accuracy')+scale_x_reverse()" + R.eval "ggsave(file='#{tmpfile}', plot=image)" + file = Mongo::Grid::File.new(File.read(tmpfile), :filename => "#{self.id.to_s}_confidence_plot.svg") + plot_id = $gridfs.insert_one(file) + update(:confidence_plot_id => plot_id) + $gridfs.find_one(_id: confidence_plot_id).data + end + #Average area under roc 0.646 #Area under roc 0.646 #F measure carcinogen: 0.769, noncarcinogen: 0.348 @@ -176,16 +201,6 @@ module OpenTox weighted_mae = weighted_mae/confidence_sum rmse = Math.sqrt(rmse/predictions.size) weighted_rmse = Math.sqrt(weighted_rmse/confidence_sum) - # TODO check!! -=begin - predictions.sort! do |a,b| - relative_error_a = (a[1]-a[2]).abs/a[1].to_f - relative_error_a = 1/relative_error_a if relative_error_a < 1 - relative_error_b = (b[1]-b[2]).abs/b[1].to_f - relative_error_b = 1/relative_error_b if relative_error_b < 1 - [relative_error_b,b[3]] <=> [relative_error_a,a[3]] - end -=end update_attributes( mae: mae, rmse: rmse, @@ -201,44 +216,46 @@ module OpenTox def misclassifications n=nil #n = predictions.size unless n - n = 20 unless n + n ||= 10 model = Model::Lazar.find(self.model_id) training_dataset = Dataset.find(model.training_dataset_id) prediction_feature = training_dataset.features.first - predictions[0..n-1].collect do |p| - compound = Compound.find(p[0]) - neighbors = compound.neighbors.collect do |n| - neighbor = Compound.find(n[0]) - values = training_dataset.values(neighbor,prediction_feature) - { :smiles => neighbor.smiles, :fingerprint => neighbor.fp4.collect{|id| Smarts.find(id).name},:similarity => n[1], :measurements => values} + predictions.collect do |p| + unless p.include? nil + compound = Compound.find(p[0]) + neighbors = compound.send(model.neighbor_algorithm,model.neighbor_algorithm_parameters) + neighbors.collect! do |n| + neighbor = Compound.find(n[0]) + values = training_dataset.values(neighbor,prediction_feature) + { :smiles => neighbor.smiles, :similarity => n[1], :measurements => values} + end + { + :smiles => compound.smiles, + #:fingerprint => compound.fp4.collect{|id| Smarts.find(id).name}, + :measured => p[1], + :predicted => p[2], + #:relative_error => (Math.log10(p[1])-Math.log10(p[2])).abs/Math.log10(p[1]).to_f.abs, + :log_error => (Math.log10(p[1])-Math.log10(p[2])).abs, + :relative_error => (p[1]-p[2]).abs/p[1], + :confidence => p[3], + :neighbors => neighbors + } end - { - :smiles => compound.smiles, - :fingerprint => compound.fp4.collect{|id| Smarts.find(id).name}, - :measured => p[1], - :predicted => p[2], - :relative_error => (p[1]-p[2]).abs/p[1].to_f, - :confidence => p[3], - :neighbors => neighbors - } - end + end.compact.sort{|a,b| p a; b[:relative_error] <=> a[:relative_error]}[0..n-1] end def confidence_plot tmpfile = "/tmp/#{id.to_s}_confidence.svg" - sorted_predictions = predictions.sort{|a,b| b[3]<=>a[3]}.collect{|p| [(Math.log10(p[1])-Math.log10(p[2]))**2,p[3]]} + sorted_predictions = predictions.collect{|p| [(Math.log10(p[1])-Math.log10(p[2])).abs,p[3]] if p[1] and p[2]}.compact R.assign "error", sorted_predictions.collect{|p| p[0]} - #R.assign "p", predictions.collect{|p| p[2]} - R.assign "confidence", predictions.collect{|p| p[2]} - #R.eval "diff = log(m)-log(p)" - R.eval "library(ggplot2)" - R.eval "svg(filename='#{tmpfile}')" - R.eval "image = qplot(confidence,error)"#,main='#{self.name}',asp=1,xlim=range, ylim=range)" + R.assign "confidence", sorted_predictions.collect{|p| p[1]} + # TODO fix axis names + R.eval "image = qplot(confidence,error)" + R.eval "image = image + stat_smooth(method='lm', se=FALSE)" R.eval "ggsave(file='#{tmpfile}', plot=image)" - R.eval "dev.off()" - file = Mongo::Grid::File.new(File.read(tmpfile), :filename => "#{self.id.to_s}_confidence_plot.svg") - plot_id = $gridfs.insert_one(file) - update(:confidence_plot_id => plot_id) + file = Mongo::Grid::File.new(File.read(tmpfile), :filename => "#{self.id.to_s}_confidence_plot.svg") + plot_id = $gridfs.insert_one(file) + update(:confidence_plot_id => plot_id) $gridfs.find_one(_id: confidence_plot_id).data end @@ -250,29 +267,17 @@ module OpenTox attributes = Model::Lazar.find(self.model_id).attributes attributes.delete_if{|key,_| key.match(/_id|_at/) or ["_id","creator","name"].include? key} attributes = attributes.values.collect{|v| v.is_a?(String) ? v.sub(/OpenTox::/,'') : v}.join("\n") - p "'"+attributes - R.eval "library(ggplot2)" - R.eval "library(grid)" - R.eval "library(gridExtra)" R.assign "measurement", x R.assign "prediction", y - #R.eval "error <- log(Measurement)-log(Prediction)" - #R.eval "rmse <- sqrt(mean(error^2, na.rm=T))" - #R.eval "mae <- mean(abs(error), na.rm=T)" - #R.eval "r <- cor(-log(prediction),-log(measurement))" - R.eval "svg(filename='#{tmpfile}')" R.eval "all = c(-log(measurement),-log(prediction))" R.eval "range = c(min(all), max(all))" R.eval "image = qplot(-log(prediction),-log(measurement),main='#{self.name}',asp=1,xlim=range, ylim=range)" - R.eval "image = image + geom_abline(intercept=0, slope=1) + stat_smooth(method='lm', se=FALSE)" - R.eval "text = textGrob(paste('RMSE: ', '#{rmse.round(2)},','MAE:','#{mae.round(2)},','r^2: ','#{r_squared.round(2)}','\n\n','#{attributes}'),just=c('left','top'),check.overlap = T)" - R.eval "grid.arrange(image, text, ncol=2)" - R.eval "dev.off()" + R.eval "image = image + geom_abline(intercept=0, slope=1)" + R.eval "ggsave(file='#{tmpfile}', plot=image)" file = Mongo::Grid::File.new(File.read(tmpfile), :filename => "#{self.id.to_s}_correlation_plot.svg") plot_id = $gridfs.insert_one(file) update(:correlation_plot_id => plot_id) end - p correlation_plot_id $gridfs.find_one(_id: correlation_plot_id).data end end diff --git a/lib/lazar.rb b/lib/lazar.rb index 89b50f7..f801062 100644 --- a/lib/lazar.rb +++ b/lib/lazar.rb @@ -21,6 +21,9 @@ $gridfs = $mongo.database.fs # R setup R = Rserve::Connection.new +R.eval "library(ggplot2)" +R.eval "library(grid)" +R.eval "library(gridExtra)" # Logger setup STDOUT.sync = true # for redirection, etc see http://stackoverflow.com/questions/8549443/why-doesnt-logger-output-to-stdout-get-redirected-to-files diff --git a/lib/model.rb b/lib/model.rb index cd88e0c..98433d0 100644 --- a/lib/model.rb +++ b/lib/model.rb @@ -48,7 +48,7 @@ module OpenTox self end - def predict object + def predict object, use_database_values=true t = Time.now at = Time.now @@ -75,7 +75,7 @@ module OpenTox compounds.each_with_index do |compound,c| t = Time.new database_activities = training_dataset.values(compound,prediction_feature) - if database_activities and !database_activities.empty? + if use_database_values and database_activities and !database_activities.empty? database_activities = database_activities.first if database_activities.size == 1 predictions << {:compound => compound, :value => database_activities, :confidence => "measured", :warning => "Compound #{compound.smiles} occurs in training dataset with activity '#{database_activities}'."} next diff --git a/lib/overwrite.rb b/lib/overwrite.rb index be90c56..c92ad2b 100644 --- a/lib/overwrite.rb +++ b/lib/overwrite.rb @@ -96,6 +96,16 @@ class Array self.inject{ |sum, el| sum + el }.to_f / self.size end + def sample_variance + m = self.mean + sum = self.inject(0){|accum, i| accum +(i-m)**2 } + sum/(self.length - 1).to_f + end + + def standard_deviation + Math.sqrt(self.sample_variance) + end + end module URI diff --git a/lib/regression.rb b/lib/regression.rb index 9062a9e..868c25f 100644 --- a/lib/regression.rb +++ b/lib/regression.rb @@ -24,16 +24,24 @@ module OpenTox sim_sum = 0.0 confidence = 0.0 neighbors = params[:neighbors] + activities = [] neighbors.each do |row| n,sim,acts = row confidence = sim if sim > confidence # distance to nearest neighbor # TODO add LOO errors acts.each do |act| weighted_sum += sim*Math.log10(act) + activities << act sim_sum += sim end end + #R.assign "activities", activities + #R.eval "cv = cv(activities)" + #confidence /= activities.standard_deviation#/activities.mean #confidence = sim_sum*neighbors.size.to_f/params[:training_dataset_size] + #confidence = sim_sum/neighbors.size.to_f + #confidence = neighbors.size.to_f + confidence = 0 if confidence.nan? sim_sum == 0 ? prediction = nil : prediction = 10**(weighted_sum/sim_sum) {:value => prediction,:confidence => confidence} end diff --git a/lib/validation.rb b/lib/validation.rb index 9eebef8..c52ffc0 100644 --- a/lib/validation.rb +++ b/lib/validation.rb @@ -39,7 +39,7 @@ module OpenTox activity = activities[i] prediction = de.first confidence = de[1] - predictions << [prediction_dataset.compound_ids[i], activity, prediction,confidence] + predictions << [prediction_dataset.compound_ids[i], activity, prediction, de[1]] else nr_unpredicted += 1 end @@ -50,7 +50,7 @@ module OpenTox :test_dataset_id => test_set.id, :nr_instances => test_set.compound_ids.size, :nr_unpredicted => nr_unpredicted, - :predictions => predictions.sort{|a,b| b[3] <=> a[3]} # sort according to confidence + :predictions => predictions#.sort{|a,b| p a; b[3] <=> a[3]} # sort according to confidence ) validation.crossvalidation_id = crossvalidation.id if crossvalidation validation.save diff --git a/test/compound.rb b/test/compound.rb index 036f384..24356d3 100644 --- a/test/compound.rb +++ b/test/compound.rb @@ -160,4 +160,17 @@ print c.sdf end end end + + def test_fingerprint_db_neighbors + training_dataset = Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.csv") + [ + "CC(=O)CC(C)C#N", + "CC(=O)CC(C)C", + "C(=O)CC(C)C#N", + ].each do |smi| + c = OpenTox::Compound.from_smiles smi + neighbors = c.db_neighbors(:training_dataset_id => training_dataset.id, :min_sim => 0.2) + p neighbors + end + end end diff --git a/test/setup.rb b/test/setup.rb index 3dad683..ba1b7af 100644 --- a/test/setup.rb +++ b/test/setup.rb @@ -3,5 +3,7 @@ require_relative '../lib/lazar.rb' include OpenTox TEST_DIR ||= File.expand_path(File.dirname(__FILE__)) DATA_DIR ||= File.join(TEST_DIR,"data") +Mongoid.configure.connect_to("test") +$mongo = Mongo::Client.new('mongodb://127.0.0.1:27017/test') #$mongo.database.drop -#$gridfs = $mongo.database.fs # recreate GridFS indexes +$gridfs = $mongo.database.fs diff --git a/test/validation.rb b/test/validation.rb index af5ea60..6764a32 100644 --- a/test/validation.rb +++ b/test/validation.rb @@ -16,11 +16,35 @@ class ValidationTest < MiniTest::Test model = Model::LazarClassification.create dataset#, features cv = ClassificationCrossValidation.create model assert cv.accuracy > 0.7 + File.open("tmp.svg","w+"){|f| f.puts cv.confidence_plot} + `inkview tmp.svg` p cv.nr_unpredicted p cv.accuracy #assert cv.weighted_accuracy > cv.accuracy, "Weighted accuracy should be larger than unweighted accuracy." end + def test_default_regression_crossvalidation + dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" + model = Model::LazarRegression.create dataset + cv = RegressionCrossValidation.create model + #cv = RegressionCrossValidation.find '561503262b72ed54fd000001' + p cv.id + File.open("tmp.svg","w+"){|f| f.puts cv.correlation_plot} + `inkview tmp.svg` + File.open("tmp.svg","w+"){|f| f.puts cv.confidence_plot} + `inkview tmp.svg` + + #puts cv.misclassifications.to_yaml + p cv.rmse + p cv.weighted_rmse + assert cv.rmse < 1.5, "RMSE > 1.5" + #assert cv.weighted_rmse < cv.rmse, "Weighted RMSE (#{cv.weighted_rmse}) larger than unweighted RMSE(#{cv.rmse}) " + p cv.mae + p cv.weighted_mae + assert cv.mae < 1 + #assert cv.weighted_mae < cv.mae + end + def test_regression_crossvalidation dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.medi.csv" #dataset = Dataset.from_csv_file "#{DATA_DIR}/EPAFHM.csv" @@ -41,13 +65,8 @@ class ValidationTest < MiniTest::Test refute_equal params[:neighbor_algorithm_parameters][:training_dataset_id], model[:neighbor_algorithm_parameters][:training_dataset_id] end - #`inkview #{cv.plot}` - #puts JSON.pretty_generate(cv.misclassifications)#.collect{|l| l.join ", "}.join "\n" - #`inkview #{cv.plot}` - assert cv.rmse < 30, "RMSE > 30" - #assert cv.weighted_rmse < cv.rmse, "Weighted RMSE (#{cv.weighted_rmse}) larger than unweighted RMSE(#{cv.rmse}) " - assert cv.mae < 12 - #assert cv.weighted_mae < cv.mae + assert cv.rmse < 1.5, "RMSE > 30" + assert cv.mae < 1 end def test_repeated_crossvalidation @@ -55,7 +74,8 @@ class ValidationTest < MiniTest::Test model = Model::LazarClassification.create dataset repeated_cv = RepeatedCrossValidation.create model repeated_cv.crossvalidations.each do |cv| - assert cv.accuracy > 0.7 + assert_operator cv.accuracy, :>, 0.7, "model accuracy < 0.7, this may happen by chance due to an unfavorable training/test set split" + assert_operator cv.weighted_accuracy, :>, cv.accuracy end end -- cgit v1.2.3 From e3217075b602a950a0ee995fcfa731d97b5ba3eb Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 8 Oct 2015 10:36:34 +0200 Subject: version bump, experiment tests skipped --- VERSION | 2 +- test/compound.rb | 1 + test/experiment.rb | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d169b2f..c5d54ec 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.8 +0.0.9 diff --git a/test/compound.rb b/test/compound.rb index 24356d3..22c152b 100644 --- a/test/compound.rb +++ b/test/compound.rb @@ -162,6 +162,7 @@ print c.sdf end def test_fingerprint_db_neighbors + skip training_dataset = Dataset.from_csv_file File.join(DATA_DIR,"EPAFHM.csv") [ "CC(=O)CC(C)C#N", diff --git a/test/experiment.rb b/test/experiment.rb index b49f349..528112d 100644 --- a/test/experiment.rb +++ b/test/experiment.rb @@ -3,6 +3,7 @@ require_relative "setup.rb" class ExperimentTest < MiniTest::Test def test_regression_experiment + skip datasets = [ "EPAFHM.medi.csv", #"EPAFHM.csv", @@ -32,6 +33,7 @@ class ExperimentTest < MiniTest::Test def test_classification_experiment + skip datasets = [ "hamster_carcinogenicity.csv" ] experiment = Experiment.create( :name => "Fminer vs fingerprint classification for datasets #{datasets}.", @@ -63,6 +65,7 @@ class ExperimentTest < MiniTest::Test end def test_regression_fingerprints + skip #=begin datasets = [ "EPAFHM.medi.csv", @@ -113,6 +116,7 @@ class ExperimentTest < MiniTest::Test end def test_mpd_fingerprints + skip datasets = [ "EPAFHM.medi.csv", ] @@ -141,6 +145,7 @@ class ExperimentTest < MiniTest::Test end def test_multiple_datasets + skip datasets = [ "EPAFHM.medi.csv", "LOAEL_mmol_corrected_smiles.csv" @@ -184,6 +189,7 @@ class ExperimentTest < MiniTest::Test end def test_mpd_mna_regression_fingerprints + skip datasets = [ "EPAFHM.medi.csv", #"hamster_carcinogenicity.csv" @@ -239,6 +245,7 @@ class ExperimentTest < MiniTest::Test end def test_mpd_mna_classification_fingerprints + skip datasets = [ #"EPAFHM.medi.csv", "hamster_carcinogenicity.csv" -- cgit v1.2.3