// // Copyright (c) 2016, Novartis Institutes for BioMedical Research Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials provided // with the distribution. // * Neither the name of Novartis Institutes for BioMedical Research Inc. // nor the names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // #include "Property.h" #include #include #include #include #include #include #include #ifdef RDK_THREADSAFE_SSS #include #include #include #endif namespace RDKit { namespace Descriptors { namespace { void _registerDescriptors() { REGISTER_DESCRIPTOR(exactmw, calcExactMW); REGISTER_DESCRIPTOR(lipinskiHBA, calcLipinskiHBA); REGISTER_DESCRIPTOR(lipinskiHBD, calcLipinskiHBD); REGISTER_DESCRIPTOR(NumRotatableBonds, calcNumRotatableBonds); REGISTER_DESCRIPTOR(NumHBD, calcNumHBD); REGISTER_DESCRIPTOR(NumHBA, calcNumHBA); REGISTER_DESCRIPTOR(NumHeteroatoms, calcNumHeteroatoms); REGISTER_DESCRIPTOR(NumAmideBonds, calcNumAmideBonds); REGISTER_DESCRIPTOR(FractionCSP3, calcFractionCSP3); REGISTER_DESCRIPTOR(NumRings, calcNumRings); REGISTER_DESCRIPTOR(NumAromaticRings, calcNumAromaticRings); REGISTER_DESCRIPTOR(NumAliphaticRings, calcNumAliphaticRings); REGISTER_DESCRIPTOR(NumSaturatedRings, calcNumSaturatedRings); REGISTER_DESCRIPTOR(NumHeterocycles, calcNumHeterocycles); REGISTER_DESCRIPTOR(NumAromaticHeterocycles, calcNumAromaticHeterocycles); REGISTER_DESCRIPTOR(NumSaturatedHeterocycles, calcNumSaturatedHeterocycles); REGISTER_DESCRIPTOR(NumAliphaticHeterocycles, calcNumAliphaticHeterocycles); REGISTER_DESCRIPTOR(NumSpiroAtoms, calcNumSpiroAtoms); REGISTER_DESCRIPTOR(NumBridgeheadAtoms, calcNumBridgeheadAtoms); REGISTER_DESCRIPTOR(NumAtomStereoCenters, numAtomStereoCenters); REGISTER_DESCRIPTOR(NumUnspecifiedAtomStereoCenters, numUnspecifiedAtomStereoCenters); REGISTER_DESCRIPTOR(labuteASA, calcLabuteASA); REGISTER_DESCRIPTOR(tpsa, calcTPSA); REGISTER_DESCRIPTOR(CrippenClogP, calcClogP); REGISTER_DESCRIPTOR(CrippenMR, calcMR); }; } void registerDescriptors() { #ifdef RDK_THREADSAFE_SSS static boost::once_flag once = BOOST_ONCE_INIT; boost::call_once(&_registerDescriptors, once); #else static bool initialized = false; if(!initialized) { _registerDescriptors(); initialized=true; } #endif } std::vector > Properties::registry; int Properties::registerProperty(PropertyFunctor *prop) { for(size_t i=0; igetName() == prop->getName()) { Properties::registry[i] = boost::shared_ptr(prop); return i; } } // XXX Add mutex? Properties::registry.push_back( boost::shared_ptr(prop) ); return Properties::registry.size(); } std::vector Properties::getAvailableProperties() { registerDescriptors(); std::vector names; BOOST_FOREACH(boost::shared_ptr prop, Properties::registry) { names.push_back(prop->getName()); } return names; } boost::shared_ptr Properties::getProperty(const std::string &name) { registerDescriptors(); BOOST_FOREACH(boost::shared_ptr prop, Properties::registry) { if (prop.get() && prop->getName() == name) { return prop; } } throw KeyErrorException(name); } Properties::Properties() : m_properties() { registerDescriptors(); BOOST_FOREACH(boost::shared_ptr prop, Properties::registry) { m_properties.push_back(prop); } } Properties::Properties(const std::vector &propNames) { registerDescriptors(); BOOST_FOREACH(const std::string &name, propNames) { m_properties.push_back( Properties::getProperty(name) ); } } std::vector Properties::getPropertyNames() const { std::vector names; BOOST_FOREACH(boost::shared_ptr prop, m_properties) { names.push_back(prop->getName()); } return names; } std::vector Properties::computeProperties(const RDKit::ROMol &mol, bool annotate) const { std::vector res; res.reserve(m_properties.size()); BOOST_FOREACH(boost::shared_ptr prop, m_properties) { res.push_back((*prop)(mol)); if (annotate) { mol.setProp(prop->getName(), (*prop)(mol)); } } return res; } void Properties::annotateProperties(RDKit::ROMol &mol) const { BOOST_FOREACH(boost::shared_ptr prop, m_properties) { mol.setProp(prop->getName(), (*prop)(mol)); } } PROP_RANGE_QUERY *makePropertyRangeQuery(const std::string &name, double min, double max) { PROP_RANGE_QUERY *filter = new PROP_RANGE_QUERY(min, max); filter->setDataFunc( Properties::getProperty(name)->d_dataFunc ); return filter; } } }