       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