Mercurial > repos > deepakjadmin > mayatool3_test2
diff lib/Fingerprints/Fingerprints.pm @ 0:4816e4a8ae95 draft default tip
Uploaded
author | deepakjadmin |
---|---|
date | Wed, 20 Jan 2016 09:23:18 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Fingerprints/Fingerprints.pm Wed Jan 20 09:23:18 2016 -0500 @@ -0,0 +1,602 @@ +package Fingerprints::Fingerprints; +# +# $RCSfile: Fingerprints.pm,v $ +# $Date: 2015/02/28 20:48:54 $ +# $Revision: 1.33 $ +# +# 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 MathUtil (); +use TextUtil (); +use Fingerprints::FingerprintsBitVector; +use Fingerprints::FingerprintsVector; + +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, %NamesAndValues) = @_; + + # Initialize object... + my $This = {}; + bless $This, ref($Class) || $Class; + $This->_InitializeFingerprints(); + + $This->_InitializeFingerprintsProperties(%NamesAndValues); + + return $This; +} + +# Initialize object data... +# +sub _InitializeFingerprints { + my($This) = @_; + + # Molecule object... + $This->{Molecule} = ''; + + # Type of fingerprints... + $This->{Type} = ''; + + # Type of fingerprints vector: FingerprintsBitVector or FingerprintsVector... + $This->{VectorType} = ''; + + # Marks successful generation of fingerprints... + $This->{FingerprintsGenerated} = 0; + + # Initialize values for FingerprintsBitVector... + _InitializeClassValuesForFingerprintsBitVector(); + + # Initialize values for FingerprintsVector... + _InitializeClassValuesForFingerprintsVector(); +} + +# Initialize class ... +sub _InitializeClass { + #Class name... + $ClassName = __PACKAGE__; +} + +# Initialize class values specific to FingerprintsBitVector... +# +sub _InitializeClassValuesForFingerprintsBitVector { + my($This) = @_; + + # Size of FingerprintsBitVector... + $This->{Size} = ''; + + # Min/Max sizes used for folding FingerprintsBitVector... + $This->{MinSize} = ''; + $This->{MaxSize} = ''; + + # FingerprintsBitVector... + $This->{FingerprintsBitVector} = ''; +} + +# Initialize class values specific to FingerprintsVector... +# +sub _InitializeClassValuesForFingerprintsVector { + my($This) = @_; + + # Types of FingerprintsVector values: OrderedNumericalValues, NumericalValues or AlphaNumericalValues. + $This->{FingerprintsVectorType} = ''; + + # Fingerprints vector... + $This->{FingerprintsVector} = ''; +} + +# Initialize object properties.... +sub _InitializeFingerprintsProperties { + my($This, %NamesAndValues) = @_; + + my($Name, $Value, $MethodName); + while (($Name, $Value) = each %NamesAndValues) { + $MethodName = "Set${Name}"; + $This->$MethodName($Value); + } + + 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 fingerprint type: It's already set..."; + } + $This->{Type} = $Type; + + return $This; +} + +# Is fingerprints generation successful? +# +# Notes: +# . The specific fingerprints generation class sets the value of FingerprinsGenerated +# to 1 after the successful generation of fingerprints; otherwise, it's set to 0. +# +sub IsFingerprintsGenerationSuccessful { + my($This) = @_; + + return $This->{FingerprintsGenerated} ? 1 : 0; +} + +# Set vector type and make sure it's not already set... +# +sub SetVectorType { + my($This, $VectorType) = @_; + + if ($This->{VectorType}) { + croak "Error: ${ClassName}->SetVectorType: Can't change fingerprint vector type: It's already set..."; + } + if ($VectorType !~ /^(FingerprintsBitVector|FingerprintsVector)$/i) { + croak "Error: ${ClassName}->SetVectorType: Specified value, $VectorType, for Type is not vaild. Supported types in current release of MayaChemTools: FingerprintsBitVector and FingerprintsVector..."; + } + $This->{VectorType} = $VectorType; + + return $This; +} + +# +# Methods/functions for FingerprintsBitVector... +# + +# Initialize fingerprint bit vector... +sub _InitializeFingerprintsBitVector { + my($This) = @_; + + if ($This->{VectorType} !~ /^FingerprintsBitVector$/i) { + croak "Error: ${ClassName}->_InitializeFingerprintsBitVector: Can't initialize fingerprints bit vector: VectorType must be FingerprintsBitVector..."; + } + + if ($This->{Size}) { + $This->{FingerprintsBitVector} = new Fingerprints::FingerprintsBitVector($This->{Size}); + } + return $This; +} + +# Set size... +# +sub SetSize { + my($This, $Size) = @_; + + if ($This->{MinSize} && $Size < $This->{MinSize}) { + croak "Error: ${ClassName}->SetSize: Fingerprint size value, $Size, is not valid : It must be >= $This->{MinSize}..."; + } + if ($This->{MaxSize} && $Size > $This->{MaxSize}) { + croak "Error: ${ClassName}->SetSize: Fingerprint size value, $Size, is not valid: It must be <= $This->{MaxSize}..."; + } + + $This->{Size} = $Size; + + return $This; +} + +# Set FingerprintsBitVector object and make sure it's not already set... +# +sub SetFingerprintsBitVector { + my($This, $FingerprintsBitVector) = @_; + + if ($This->{FingerprintsBitVector}) { + croak "Error: ${ClassName}->SetFingerprintsBitVector: Can't change FingerprintsBitVector object: It's already set..."; + } + $This->{FingerprintsBitVector} = $FingerprintsBitVector; + + return $This; +} + +# Fold fingerprints by recursively reducing its size by half untill bit density is greater than or equal to +# specified bit density... +# +sub FoldFingerprintsByBitDensity { + my($This, $BitDensity) = @_; + + if (!($BitDensity >= 0 && $BitDensity <= 1)) { + croak "Error: ${ClassName}->FoldFingerprintsByBitDensity: Specified bit density, $BitDensity, is not valid: It must be > 0 && <= 1 ..."; + } + + return $This->_FoldFingerprintsBitVector('ByDensity', $BitDensity); +} + +# Fold fingerprints by recursively reducing its size by half untill size is less than or equal to +# specified size... +# +sub FoldFingerprintsBySize { + my($This, $Size, $CheckSizeValue) = @_; + + if (!defined $CheckSizeValue) { + $CheckSizeValue = 1; + } + + if ($CheckSizeValue) { + if (!TextUtil::IsPositiveInteger($Size)) { + croak "Error: ${ClassName}->FoldFingerprintsBySize: Specified size, $Size, is not valid: It must be a positive integer"; + } + if (!($Size >= $This->{MinSize} && $Size < $This->{Size})) { + croak "Error: ${ClassName}->FoldFingerprintsBySize: Specified size, $Size, is not valid: It must be greater than or equal to minimum size of $This->{MinSize} and less than current size of $This->{Size}..."; + } + if (!TextUtil::IsNumberPowerOfNumber($Size, 2)) { + croak "Error: ${ClassName}->FoldFingerprintsBySize: Specified size value, $Size, must be power of 2..."; + } + } + + return $This->_FoldFingerprintsBitVector('BySize', $Size); +} + +# Fold fingerprints bit vector using specified size of bit density... +# +sub _FoldFingerprintsBitVector { + my($This, $Mode, $Value) = @_; + + if (!$This->{FingerprintsBitVector}) { + return $This; + } + my($FingerprintsBitVector, $FoldedFingerprintsBitVector); + + $FoldedFingerprintsBitVector = ''; + $FingerprintsBitVector = $This->{FingerprintsBitVector}; + MODE: { + if ($Mode =~ /^BySize$/i) { $FoldedFingerprintsBitVector = $FingerprintsBitVector->FoldFingerprintsBitVectorBySize($Value); last MODE; } + if ($Mode =~ /^ByDensity$/i) { $FoldedFingerprintsBitVector = $FingerprintsBitVector->FoldFingerprintsBitVectorByDensity($Value); last MODE; } + $FoldedFingerprintsBitVector = ''; + } + if ($FoldedFingerprintsBitVector) { + $This->{FingerprintsBitVector} = $FoldedFingerprintsBitVector; + $This->{Size} = $FoldedFingerprintsBitVector->GetSize(); + } + return $This; +} + +# Get fingerprints as a binary ascii string containing 0s and 1s... +# +sub GetFingerprintBitsAsBinaryString { + my($This, $BitOrder) = @_; + + return $This->_GetFingerprintBitsAsString('Binary', $BitOrder); +} + +# Get fingerprints as a hexadecimal string... +# +sub GetFingerprintBitsAsHexadecimalString { + my($This, $BitOrder) = @_; + + return $This->_GetFingerprintBitsAsString('Hexadecimal', $BitOrder); +} + +# Get fingerprints as a raw binary string containing packed bit values for each +# byte... +# +sub GetFingerprintBitsAsRawBinaryString { + my($This, $BitOrder) = @_; + + return $This->_GetFingerprintBitsAsString('RawBinary', $BitOrder); +} + +# Get fingerprint bits as a string... +# +sub _GetFingerprintBitsAsString { + my($This, $Format) = @_; + + if (!$This->{FingerprintsBitVector}) { + return undef; + } + FORMAT : { + if ($Format =~ /^(Binary|Bin|BinaryString)$/i) { return $This->{FingerprintsBitVector}->GetBitsAsBinaryString(); last FORMAT; } + if ($Format =~ /^(Hexadecimal|Hex|HexadecimalString)$/i) { return $This->{FingerprintsBitVector}->GetBitsAsHexadecimalString(); last FORMAT; } + if ($Format =~ /^(RawBinary|RawBin|RawBinaryString)$/i) { return $This->{FingerprintsBitVector}->GetBitsAsRawBinaryString(); last FORMAT; } + croak "Error: ${ClassName}->_GetFingerprintBitsAsString: Specified bit vector string format, $Format, is not supported. Value values: Binary, Bin, BinaryString, Hexdecimal, Hex, HexadecimalString, RawBinary, RawBin, RawBinaryString..."; + } + return undef; +} + +# +# Methods/functions for FingerprintsVector... +# + +# Initialize fingerprint vector... +sub _InitializeFingerprintsVector { + my($This) = @_; + + if ($This->{VectorType} !~ /^FingerprintsVector$/i) { + croak "Error: ${ClassName}->_InitializeFingerprintsVector: Can't initialize fingerprints vector: VectorType must be FingerprintsVector..."; + } + + if ($This->{FingerprintsVectorType}) { + $This->{FingerprintsVector} = new Fingerprints::FingerprintsVector('Type' => $This->{FingerprintsVectorType}); + } + return $This; +} + +# Set FingerprintsVector object and make sure it's not already set... +# +sub SetFingerprintsVector { + my($This, $FingerprintsVector) = @_; + + if ($This->{FingerprintsVector}) { + croak "Error: ${ClassName}->SetFingerprintsVector: Can't change FingerprintsVector object: It's already set..."; + } + $This->{FingerprintsVector} = $FingerprintsVector; + + return $This; +} + +# Types of FingerprintsVector values: OrderedNumericalValues, NumericalValues or AlphaNumericalValues. +# +sub SetFingerprintsVectorType { + my($This, $FingerprintsVectorType) = @_; + + if ($This->{FingerprintsVectorType}) { + croak "Error: ${ClassName}->SetFingerprintsVector: Can't change FingerprintsVectorType: It's already set..."; + } + if ($FingerprintsVectorType !~ /^(OrderedNumericalValues|NumericalValues|AlphaNumericalValues)$/i) { + croak "Error: ${ClassName}->SetFingerprintsVectorType: Specified value, $FingerprintsVectorType, for Type is not vaild. Supported types in current release of MayaChemTools: OrderedNumericalValues, NumericalValues or AlphaNumericalValues"; + } + $This->{FingerprintsVectorType} = $FingerprintsVectorType; + + return $This; +} + +# Get fingerprints vector values as an array or reference to an array... +# +sub GetFingerprintsVectorValues { + my($This) = @_; + + if (!$This->{FingerprintsVector}) { + return undef; + } + return $This->{FingerprintsVector}->GetValues(); +} + +# Get fingerprints vector value IDs as an array or reference to an array... +# +sub GetFingerprintsVectorValueIDs { + my($This) = @_; + + if (!$This->{FingerprintsVector}) { + return undef; + } + return $This->{FingerprintsVector}->GetValueIDs(); +} + +1; + +__END__ + +=head1 NAME + +Fingerprints - Fingerprints class + +=head1 SYNOPSIS + +use Fingerprints::Fingerprints; + +use Fingerprints::Fingerprints qw(:all); + +=head1 DESCRIPTION + +B<Fingerprints> class provides the following methods: + +new, FoldFingerprintsByBitDensity, FoldFingerprintsBySize, +GetFingerprintBitsAsBinaryString, GetFingerprintBitsAsHexadecimalString, +GetFingerprintBitsAsRawBinaryString, GetFingerprintsVectorValueIDs, +GetFingerprintsVectorValues, IsFingerprintsGenerationSuccessful, +SetFingerprintsBitVector, SetFingerprintsVector, SetFingerprintsVectorType, +SetMolecule, SetSize, SetType, SetVectorType + +B<Fingerprints> class is used as a base class for various specific fingerprint classes such as +B<AtomNeighborhoodsFingerprints>, B<AtomTypesFingerprints>, B<EStateIndiciesFingerprints>, +B<PathLengthFingerprints>, B<ExtendedConnectivityFingerprints>, B<MACCSKeys> and so on. +It implements functionality common to fingerprint classes. + +B<Fingerprints> 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>(); + +B<Fingerprints> class uses B<FingerprintsBitVector> class to provide bits manipulation functionality. + +=head2 METHODS + +=over 4 + +=item B<new> + + $NewFingerprints = new Fingerprints(%NamesAndValues); + +Using specified I<Fingerprints> property names and values hash, B<new> method creates a new object +and returns a reference to newly created B<Fingerprints> object. By default, following properties are +initialized: + + Molecule = ''; + Type = ''; + VectorType = ''; + Size = ''; + MinSize = ''; + MaxSize = ''; + FingerprintsBitVector = ''; + FingerprintsVectorType = ''; + FingerprintsVector = ''; + +=item B<FoldFingerprintsByBitDensity> + + $Fingerprints->FoldFingerprintsByBitDensity($BitDensity); + +Folds fingerprints by recursively reducing its size by half until bit density is greater than or equal to +specified I<BitDensity> and returns I<Fingerprints>. + +=item B<FoldFingerprintsBySize> + + $Fingerprints->FoldFingerprintsBySize($Size, [$CheckSizeValue]); + +Fold fingerprints by recursively reducing its size by half until size is less than or equal to specified +I<Size> and returns I<Fingerprints>. By default, value I<Size> is checked to make sure it's: + + >= MinSize and < Size and IsPowerOfTwo + +=item B<GetFingerprintBitsAsBinaryString> + + $BinaryASCIIString = + $Fingerprints->GetFingerprintBitsAsBinaryString(); + +Returns fingerprints as a binary ASCII string containing 0s and 1s. + +=item B<GetFingerprintBitsAsHexadecimalString> + + $HexadecimalString = + $Fingerprints->GetFingerprintBitsAsHexadecimalString(); + +Returns fingerprints as a hexadecimal string + +=item B<GetFingerprintBitsAsRawBinaryString> + + $RawBinaryString = + $Fingerprints->GetFingerprintBitsAsRawBinaryString(); + +Returns fingerprints as a raw binary string containing packed bit values for each byte. + +=item B<GetFingerprintsVectorValueIDs> + + $ValueIDsRef = $Fingerprints->GetFingerprintsVectorValueIDs(); + @ValueIDs = $Fingerprints->GetFingerprintsVectorValueIDs(); + +Returns fingerprints vector value IDs as an array or reference to an array. + +=item B<GetFingerprintsVectorValues> + + $ValuesRef = $Fingerprints->GetFingerprintsVectorValues(); + @Values = $Fingerprints->GetFingerprintsVectorValues(); + +Returns fingerprints vector values as an array or reference to an array. + +=item B<IsFingerprintsGenerationSuccessful> + + $Return = $Fingerprints->IsFingerprintsGenerationSuccessful(); + +Returns 1 or 0 based on whether fingerprints were successfully generated. + +=item B<SetFingerprintsBitVector> + + $Fingerprints->SetFingerprintsBitVector($FingerprintsBitVector); + +Sets I<FingerprintsBitVector> object for I<Fingerprints> and returns I<Fingerprints>. + +=item B<SetFingerprintsVector> + + $Fingerprints->SetFingerprintsVector(); + +Sets I<FingerprintsVector> object for I<Fingerprints> and returns I<Fingerprints>. + +=item B<SetFingerprintsVectorType> + + $Fingerprints->SetFingerprintsVectorType($VectorType); + +Sets I<FingerprintsVector> type for I<Fingerprints> and returns I<Fingerprints>. Possible +I<VectorType> values: I<OrderedNumericalValues, NumericalValues or AlphaNumericalValues>. + +=item B<SetMolecule> + + $Fingerprints->SetMolecule($Molecule); + +Sets I<Molecule> object for I<Fingerprints> and returns I<Fingerprints>. + +=item B<SetSize> + + $Fingerprints->SetSize($Size); + +Sets I<Size> of fingerprints and returns I<Fingerprints>. + +=item B<SetType> + + $Fingerprints->SetType($Type); + +Sets I<Type> of fingerprints and returns I<Fingerprints>. + +=item B<SetVectorType> + + $Fingerprints->SetVectorType($Type); + +Sets I<Type> of fingerprints vector and returns I<Fingerprints>. Possible I<Type> values: +I<FingerprintsBitVector or FingerprintsVector>. + +=back + +=head1 AUTHOR + +Manish Sud <msud@san.rr.com> + +=head1 SEE ALSO + +FingerprintsStringUtil.pm, AtomNeighborhoodsFingerprints.pm, AtomTypesFingerprints.pm, +EStateIndiciesFingerprints.pm, ExtendedConnectivityFingerprints.pm, MACCSKeys.pm, +PathLengthFingerprints.pm, TopologicalAtomPairsFingerprints.pm, TopologicalAtomTripletsFingerprints.pm, +TopologicalAtomTorsionsFingerprints.pm, TopologicalPharmacophoreAtomPairsFingerprints.pm, +TopologicalPharmacophoreAtomTripletsFingerprints.pm + +=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