MayaChemTools

   1 package MolecularDescriptors::RingsCountDescriptors;
   2 #
   3 # $RCSfile: RingsCountDescriptors.pm,v $
   4 # $Date: 2015/02/28 20:49:20 $
   5 # $Revision: 1.10 $
   6 #
   7 # Author: Manish Sud <msud@san.rr.com>
   8 #
   9 # Copyright (C) 2015 Manish Sud. All rights reserved.
  10 #
  11 # This file is part of MayaChemTools.
  12 #
  13 # MayaChemTools is free software; you can redistribute it and/or modify it under
  14 # the terms of the GNU Lesser General Public License as published by the Free
  15 # Software Foundation; either version 3 of the License, or (at your option) any
  16 # later version.
  17 #
  18 # MayaChemTools is distributed in the hope that it will be useful, but without
  19 # any warranty; without even the implied warranty of merchantability of fitness
  20 # for a particular purpose.  See the GNU Lesser General Public License for more
  21 # details.
  22 #
  23 # You should have received a copy of the GNU Lesser General Public License
  24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or
  25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,
  26 # Boston, MA, 02111-1307, USA.
  27 #
  28 
  29 use strict;
  30 use Carp;
  31 use Exporter;
  32 use Scalar::Util ();
  33 use Molecule;
  34 use MolecularDescriptors::MolecularDescriptors;
  35 
  36 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  37 
  38 @ISA = qw(MolecularDescriptors::MolecularDescriptors Exporter);
  39 @EXPORT = qw();
  40 @EXPORT_OK = qw(GetDescriptorNames);
  41 
  42 %EXPORT_TAGS = (all  => [@EXPORT, @EXPORT_OK]);
  43 
  44 # Setup class variables...
  45 my($ClassName, @DescriptorNames);
  46 _InitializeClass();
  47 
  48 # Overload Perl functions...
  49 use overload '""' => 'StringifyRingsCountDescriptors';
  50 
  51 # Class constructor...
  52 sub new {
  53   my($Class, %NamesAndValues) = @_;
  54 
  55   # Initialize object...
  56   my $This = $Class->SUPER::new();
  57   bless $This, ref($Class) || $Class;
  58   $This->_InitializeRingsCountDescriptors();
  59 
  60   $This->_InitializeRingsCountDescriptorsProperties(%NamesAndValues);
  61 
  62   return $This;
  63 }
  64 
  65 # Initialize class ...
  66 sub _InitializeClass {
  67   #Class name...
  68   $ClassName = __PACKAGE__;
  69 
  70   # Descriptor names...
  71   @DescriptorNames = ('Rings', 'AromaticRings');
  72 
  73 }
  74 
  75 # Get descriptor names as an array.
  76 #
  77 # This functionality can be either invoked as a class function or an
  78 # object method.
  79 #
  80 sub GetDescriptorNames {
  81   return @DescriptorNames;
  82 }
  83 
  84 # Initialize object data...
  85 #
  86 sub _InitializeRingsCountDescriptors {
  87   my($This) = @_;
  88 
  89   # Type of MolecularDescriptor...
  90   $This->{Type} = 'RingsCount';
  91 
  92   # Intialize descriptor names and values...
  93   $This->_InitializeDescriptorNamesAndValues(@DescriptorNames);
  94 
  95   return $This;
  96 }
  97 
  98 # Initialize object properties...
  99 #
 100 sub _InitializeRingsCountDescriptorsProperties {
 101   my($This, %NamesAndValues) = @_;
 102 
 103   my($Name, $Value, $MethodName);
 104   while (($Name, $Value) = each  %NamesAndValues) {
 105     $MethodName = "Set${Name}";
 106     $This->$MethodName($Value);
 107   }
 108 
 109   return $This;
 110 }
 111 
 112 # Generate molecular weight and exact mass values...
 113 #
 114 sub GenerateDescriptors {
 115   my($This) = @_;
 116 
 117   # Initialize descriptor values...
 118   $This->_InitializeDescriptorValues();
 119 
 120   # Check availability of molecule...
 121   if (!$This->{Molecule}) {
 122     carp "Warning: ${ClassName}->GenerateDescriptors: $This->{Type} molecular descriptors generation didn't succeed: Molecule data is not available: Molecule object hasn't been set...";
 123     return undef;
 124   }
 125 
 126   # Calculate descriptor values...
 127   if (!$This->_CalculateDescriptorValues()) {
 128     carp "Warning: ${ClassName}->GenerateDescriptors: $This->{Type} molecular descriptors generation didn't succeed...";
 129     return undef;
 130   }
 131 
 132   # Set final descriptor values...
 133   $This->_SetFinalDescriptorValues();
 134 
 135   return $This;
 136 }
 137 
 138 # Calculate molecular weight and exact mass values..
 139 #
 140 sub _CalculateDescriptorValues {
 141   my($This) = @_;
 142   my($MolecularWeight, $ExactMass);
 143 
 144   $This->{Rings} = $This->{Molecule}->GetNumOfRings();
 145   $This->{AromaticRings} = $This->{Molecule}->GetNumOfAromaticRings();
 146 
 147   return $This;
 148 }
 149 
 150 # Setup final descriptor values...
 151 #
 152 sub _SetFinalDescriptorValues {
 153   my($This) = @_;
 154 
 155   $This->{DescriptorsGenerated} = 1;
 156 
 157   $This->SetDescriptorValues($This->{Rings}, $This->{AromaticRings});
 158 
 159   return $This;
 160 }
 161 
 162 # Return a string containg data for RingsCountDescriptors object...
 163 #
 164 sub StringifyRingsCountDescriptors {
 165   my($This) = @_;
 166   my($TheString);
 167 
 168   $TheString = "MolecularDescriptorType: $This->{Type}; " . $This->_StringifyDescriptorNamesAndValues();
 169 
 170   return $TheString;
 171 }
 172 
 173 # Is it a RingsCountDescriptors object?
 174 sub _IsRingsCountDescriptors {
 175   my($Object) = @_;
 176 
 177   return (Scalar::Util::blessed($Object) && $Object->isa($ClassName)) ? 1 : 0;
 178 }
 179