Mercurial > repos > deepakjadmin > mayatool3_test3
diff mayachemtools/lib/AtomicDescriptors/AtomicDescriptors.pm @ 0:73ae111cf86f draft
Uploaded
author | deepakjadmin |
---|---|
date | Wed, 20 Jan 2016 11:55:01 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mayachemtools/lib/AtomicDescriptors/AtomicDescriptors.pm Wed Jan 20 11:55:01 2016 -0500 @@ -0,0 +1,305 @@ +package AtomicDescriptors::AtomicDescriptors; +# +# $RCSfile: AtomicDescriptors.pm,v $ +# $Date: 2015/02/28 20:47:48 $ +# $Revision: 1.17 $ +# +# Author: Manish Sud <msud@san.rr.com> +# +# Copyright (C) 2015 Manish Sud. All rights reserved. +# +# This file is part of MayaChemTools. +# +# MayaChemTools is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 3 of the License, or (at your option) any +# later version. +# +# MayaChemTools is distributed in the hope that it will be useful, but without +# any warranty; without even the implied warranty of merchantability of fitness +# for a particular purpose. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or +# write to the Free Software Foundation Inc., 59 Temple Place, Suite 330, +# Boston, MA, 02111-1307, USA. +# + +use strict; +use Carp; +use Exporter; +use Scalar::Util (); +use ObjectProperty; +use TextUtil (); + +use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); + +@ISA = qw(ObjectProperty Exporter); +@EXPORT = qw(); +@EXPORT_OK = qw(); + +%EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]); + +# Setup class variables... +my($ClassName); +_InitializeClass(); + +# Class constructor... +sub new { + my($Class, %PropertyNamesAndValues) = @_; + + # Initialize object... + my $This = {}; + bless $This, ref($Class) || $Class; + $This->_InitializeAtomicDescriptors(); + + $This->_InitializeAtomicDescriptorsProperties(%PropertyNamesAndValues); + + return $This; +} + +# Initialize object data... +# +sub _InitializeAtomicDescriptors { + my($This) = @_; + + # Molecule object... + $This->{Molecule} = ''; + + # Type of atomic descriptors... + $This->{Type} = ''; + + # By default, atomic decriptor values are also calculated for hydrogens... + $This->{IgnoreHydrogens} = 0; + + # Calculated atomic descriptor values hash. Instead of assigning the calculated values to Atom + # objects, these values are stored in the current object in a hash with atom ID and atomic descriptor + # values as key/value pairs. + # + # Unlike molecular descriptors, no descriptor names are assigned to individual atomic descriptor + # values. + # + %{$This->{DescriptorValues}} = (); +} + +# Initialize class ... +sub _InitializeClass { + #Class name... + $ClassName = __PACKAGE__; +} + +# Initialize object properties.... +sub _InitializeAtomicDescriptorsProperties { + my($This, %PropertiesNamesAndValues) = @_; + + my($Name, $Value, $MethodName); + while (($Name, $Value) = each %PropertiesNamesAndValues) { + $MethodName = "Set${Name}"; + $This->$MethodName($Value); + } + + return $This; +} + +# Initialize descriptor values for all atoms in a molecule... +# +sub _InitializeDescriptorValues { + my($This) = @_; + + if (!$This->{Molecule}) { + return $This; + } + + # Assign 'None' to all atomic descriptor values... + # + my($Atom, $AtomID); + + ATOM: for $Atom ($This->{Molecule}->GetAtoms()) { + $AtomID = $Atom->GetID(); + $This->{DescriptorValues}{$AtomID} = 'None'; + } + + return $This; +} + +# Set molecule object and make sure it's not already set... +# +sub SetMolecule { + my($This, $Molecule) = @_; + + if ($This->{Molecule}) { + croak "Error: ${ClassName}->SetMolecule: Can't change molecule object: It's already set..."; + } + $This->{Molecule} = $Molecule; + + # Weaken the reference to disable increment of reference count... + Scalar::Util::weaken($This->{Molecule}); + + return $This; +} + +# Set type and make sure it's not already set... +# +sub SetType { + my($This, $Type) = @_; + + if ($This->{Type}) { + croak "Error: ${ClassName}->SetType: Can't change AtomicDescriptors type: It's already set..."; + } + $This->{Type} = $Type; + + return $This; +} + +# Set specific atomic descriptor value... +# +sub SetDescriptorValue { + my($This, $Atom, $AtomicDescriptor) = @_; + my($AtomID); + + $AtomID = $Atom->GetID(); + $This->{DescriptorValues}{$AtomID} = $AtomicDescriptor; + + return $This; +} + +# Get specific atomic descriptor value... +# +sub GetDescriptorValue { + my($This, $Atom) = @_; + my($AtomID); + + $AtomID = $Atom->GetID(); + + return exists $This->{DescriptorValues}{$AtomID} ? $This->{DescriptorValues}{$AtomID} : 'None'; +} + +# Get calculated atomic descriptor values as a hash with atom ID and atomic descriptor +# values as key/value pairs... +# +sub GetDescriptorValues { + my($This) = @_; + + return %{$This->{DescriptorValues}}; +} + +# Are all atomic descriptor values successfully calculated? +# +# Notes: +# . Dynamic checking of calculated descriptor values for atoms eliminates the need +# to check and synchronize valid descriptor values during SetDescriptorValue. +# +sub IsDescriptorsGenerationSuccessful { + my($This) = @_; + my($Atom, $DescriptorValue, @Atoms); + + ATOM: for $Atom ($This->{Molecule}->GetAtoms()) { + if ($This->{IgnoreHydrogens} && $Atom->IsHydrogen()) { + next ATOM; + } + $DescriptorValue = $This->GetDescriptorValue($Atom); + if ($DescriptorValue =~ /^None$/i) { + return 0; + } + } + + return 1; +} + +1; + +__END__ + +=head1 NAME + +AtomicDescriptors - AtomicDescriptors class + +=head1 SYNOPSIS + +use AtomicDescriptors::AtomicDescriptors; + +use AtomicDescriptors::AtomicDescriptors qw(:all); + +=head1 DESCRIPTION + +B<AtomicDescriptors> base class used to derive all other atomic descriptors classes provides the following methods: + +new, GetDescriptorValue, GetDescriptorValues, +IsDescriptorsGenerationSuccessful, SetDescriptorValue + +B<AtomicDescriptors> class is derived from B<ObjectProperty> base class which provides methods not +explicitly defined in B<Fingerprints> or B<ObjectProperty> classes using Perl's AUTOLOAD functionality. +These methods are generated on-the-fly for a specified object property: + + Set<PropertyName>(<PropertyValue>); + $PropertyValue = Get<PropertyName>(); + Delete<PropertyName>(); + +=head2 METHODS + +=over 4 + +=item B<new> + + $NewAtomicDescriptors = new AtomicDescriptors:: + AtomicDescriptors(%NamesAndValues); + +Using specified I<AtomicDescriptors> property names and values hash, B<new> method creates a new object +and returns a reference to newly created B<AtomicDescriptors> object. By default, following properties are +initialized: + + Molecule = ''; + Type = ''; + IgnoreHydrogens = 0; + +=item B<GetDescriptorValue> + + $Value = $AtomicDescriptors->GetDescriptorValue($Atom); + +Returns calculated atomic descriptor I<Value> for specified I<Atom>. + +=item B<GetDescriptorValues> + + %Values = $AtomicDescriptors->GetDescriptorValues(); + +Returns calculated atomic descriptor values for all atoms as a hash with atom ID +and atomic descriptor values as key/value pairs. + +=item B<IsDescriptorsGenerationSuccessful> + + $Status = $AtomicDescriptors-> + IsDescriptorsGenerationSuccessful(); + +Returns 1 or 0 based on whether atomic desctiptors calculations was successful. +For a successful atomic descriptors calculation, all atoms must have a value of other +than a string I<None>. + +=item B<SetDescriptorValue> + + $AtomicDescriptors->SetDescriptorValue($Atom, $Value); + +Sets specified atomic descriptor I<Value> for I<Atom> and returns I<$AtomicDescriptors>. + +=back + +=head1 AUTHOR + +Manish Sud <msud@san.rr.com> + +=head1 SEE ALSO + +demo + +=head1 COPYRIGHT + +Copyright (C) 2015 Manish Sud. All rights reserved. + +This file is part of MayaChemTools. + +MayaChemTools is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or (at your option) +any later version. + +=cut