Mercurial > repos > deepakjadmin > mayatool3_test2
comparison lib/MolecularDescriptors/MolecularDescriptorsGenerator.pm @ 0:4816e4a8ae95 draft default tip
Uploaded
| author | deepakjadmin |
|---|---|
| date | Wed, 20 Jan 2016 09:23:18 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:4816e4a8ae95 |
|---|---|
| 1 package MolecularDescriptors::MolecularDescriptorsGenerator; | |
| 2 # | |
| 3 # $RCSfile: MolecularDescriptorsGenerator.pm,v $ | |
| 4 # $Date: 2015/02/28 20:49:20 $ | |
| 5 # $Revision: 1.13 $ | |
| 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 ObjectProperty; | |
| 34 use TextUtil (); | |
| 35 use FileUtil (); | |
| 36 use Molecule; | |
| 37 use MolecularDescriptors::MolecularDescriptors; | |
| 38 | |
| 39 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); | |
| 40 | |
| 41 @ISA = qw(ObjectProperty Exporter); | |
| 42 @EXPORT = qw(); | |
| 43 @EXPORT_OK = qw(GetAvailableDescriptorClassNames GetAvailableClassAndDescriptorNames GetAvailableDescriptorNames GetAvailableDescriptorNamesForDescriptorClass GetAvailableClassNameForDescriptorName GetRuleOf5DescriptorNames GetRuleOf3DescriptorNames IsDescriptorClassNameAvailable IsDescriptorNameAvailable); | |
| 44 | |
| 45 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]); | |
| 46 | |
| 47 # Setup class variables... | |
| 48 my($ClassName, %DescriptorsDataMap); | |
| 49 _InitializeClass(); | |
| 50 | |
| 51 # Overload Perl functions... | |
| 52 use overload '""' => 'StringifyMolecularDescriptorsGenerator'; | |
| 53 | |
| 54 # Class constructor... | |
| 55 sub new { | |
| 56 my($Class, %NamesAndValues) = @_; | |
| 57 | |
| 58 # Initialize object... | |
| 59 my $This = {}; | |
| 60 bless $This, ref($Class) || $Class; | |
| 61 $This->_InitializeMolecularDescriptorsGenerator(); | |
| 62 | |
| 63 $This->_InitializeMolecularDescriptorsGeneratorProperties(%NamesAndValues); | |
| 64 | |
| 65 return $This; | |
| 66 } | |
| 67 | |
| 68 # Initialize class ... | |
| 69 sub _InitializeClass { | |
| 70 #Class name... | |
| 71 $ClassName = __PACKAGE__; | |
| 72 | |
| 73 # Load available molecular descriptor classes... | |
| 74 _LoadMolecularDescriptorsData(); | |
| 75 | |
| 76 } | |
| 77 | |
| 78 # Initialize object data... | |
| 79 # | |
| 80 sub _InitializeMolecularDescriptorsGenerator { | |
| 81 my($This) = @_; | |
| 82 | |
| 83 # Type of desciptors to generate... | |
| 84 # | |
| 85 # The current release of MayaChemTools supports generation of four sets of | |
| 86 # descriptors: All available descriptors, rule of 5 or 3 descriptors or a specified | |
| 87 # set of descriptors. | |
| 88 # | |
| 89 # Possible values: All, RuleOf5, RuleOf3 or Specify | |
| 90 # | |
| 91 # RuleOf5 [ Ref 91 ] descriptor names: MolecularWeight, HydrogenBondDonors, HydrogenBondAcceptors, | |
| 92 # SLogP. RuleOf5 states: MolecularWeight <= 500, HydrogenBondDonors <= 5, HydrogenBondAcceptors <= 10, | |
| 93 # and logP <= 5. | |
| 94 # | |
| 95 # RuleOf3 [ Ref 92 ] descriptor names: MolecularWeight, RotatableBonds, HydrogenBondDonors, | |
| 96 # HydrogenBondAcceptors, SLogP, TPSA. RuleOf3 states: MolecularWeight <= 300, RotatableBonds <= 3, | |
| 97 # HydrogenBondDonors <= 3, HydrogenBondAcceptors <= 3, logP <= 3, and TPSA <= 60. | |
| 98 # | |
| 99 # For Specify value of Mode, a set of descritor names must be specified using | |
| 100 # DescriptorNames parameter. | |
| 101 # | |
| 102 # Default: All | |
| 103 # | |
| 104 $This->{Mode} = ''; | |
| 105 | |
| 106 # Descriptor names used to generate descriptor values during a specified descriptor | |
| 107 # generation mode... | |
| 108 # | |
| 109 @{$This->{DescriptorNames}} = (); | |
| 110 | |
| 111 # Descriptor calculation control parameters for specified descriptor class names... | |
| 112 # | |
| 113 # These parameters are passed on to appropriate descriptor classes during | |
| 114 # instantiations of descriptor class objects. | |
| 115 # | |
| 116 %{$This->{DescriptorClassParameters}} = (); | |
| 117 | |
| 118 $This->{DescriptorClassesInstantiated} = 0; | |
| 119 | |
| 120 # Descriptor class names and objects corresponding to specified descriptor names... | |
| 121 # | |
| 122 @{$This->{DescriptorClassNames}} = (); | |
| 123 %{$This->{DescriptorClassObjects}} = (); | |
| 124 | |
| 125 # Descriptor values generated for specified descriptor names... | |
| 126 # | |
| 127 @{$This->{DescriptorValues}} = (); | |
| 128 | |
| 129 return $This; | |
| 130 } | |
| 131 | |
| 132 # Initialize object properties... | |
| 133 # | |
| 134 sub _InitializeMolecularDescriptorsGeneratorProperties { | |
| 135 my($This, %NamesAndValues) = @_; | |
| 136 | |
| 137 my($Name, $Value, $MethodName); | |
| 138 while (($Name, $Value) = each %NamesAndValues) { | |
| 139 $MethodName = "Set${Name}"; | |
| 140 $This->$MethodName($Value); | |
| 141 } | |
| 142 | |
| 143 # Set default value for Mode... | |
| 144 if (!$This->{Mode}) { | |
| 145 $This->{Mode} = 'All'; | |
| 146 } | |
| 147 | |
| 148 $This->_CheckAndInitializeDescriptorNames(); | |
| 149 | |
| 150 return $This; | |
| 151 } | |
| 152 | |
| 153 # Set descriptors generation mode...... | |
| 154 # | |
| 155 sub SetMode { | |
| 156 my($This, $Value) = @_; | |
| 157 | |
| 158 # All - all available descriptors | |
| 159 # Specify - Specified set of descriptors | |
| 160 | |
| 161 if ($Value !~ /^(All|RuleOf5|RuleOf3|Specify)$/i) { | |
| 162 croak "Error: ${ClassName}->SetMode: Mode value, $Value, is not valid; Supported values: All, RuleOf5, RuleOf3 or Specify..."; | |
| 163 } | |
| 164 | |
| 165 $This->{Mode} = $Value; | |
| 166 | |
| 167 return $This; | |
| 168 } | |
| 169 | |
| 170 # Set descriptor names to use for generating descriptor values using an array | |
| 171 # or reference to an array... | |
| 172 # | |
| 173 sub SetDescriptorNames { | |
| 174 my($This, @Values) = @_; | |
| 175 | |
| 176 if ($This->{Mode} =~ /^All$/i) { | |
| 177 croak "Error: ${ClassName}->SetDescriptorNames: Descriptor names cann't be specified during \"All\" value of descsriptors generation \"Mode\"..."; | |
| 178 } | |
| 179 | |
| 180 if (!@Values) { | |
| 181 return; | |
| 182 } | |
| 183 | |
| 184 my($FirstValue, $TypeOfFirstValue); | |
| 185 | |
| 186 $FirstValue = $Values[0]; | |
| 187 $TypeOfFirstValue = ref $FirstValue; | |
| 188 | |
| 189 @{$This->{DescriptorNames}} = (); | |
| 190 | |
| 191 if ($TypeOfFirstValue =~ /^ARRAY/) { | |
| 192 # Initialize using array refernce... | |
| 193 push @{$This->{DescriptorNames}}, @{$FirstValue}; | |
| 194 } | |
| 195 else { | |
| 196 # It's a list of values... | |
| 197 push @{$This->{DescriptorNames}}, @Values; | |
| 198 } | |
| 199 | |
| 200 # Make sure specified descriptor names are valid... | |
| 201 $This->_ValidateDescriptorNames(); | |
| 202 | |
| 203 return $This; | |
| 204 } | |
| 205 | |
| 206 # Get descriptor names as an array... | |
| 207 # | |
| 208 sub GetDescriptorNames { | |
| 209 my($This) = @_; | |
| 210 | |
| 211 return wantarray ? @{$This->{DescriptorNames}} : scalar @{$This->{DescriptorNames}}; | |
| 212 } | |
| 213 | |
| 214 # Get all descriptor values as an array... | |
| 215 # | |
| 216 sub GetDescriptorValues { | |
| 217 my($This) = @_; | |
| 218 | |
| 219 if ($This->{DescriptorsGenerated}) { | |
| 220 return wantarray ? @{$This->{DescriptorValues}} : scalar @{$This->{DescriptorValues}}; | |
| 221 } | |
| 222 else { | |
| 223 my(@DescriptorValues); | |
| 224 | |
| 225 @DescriptorValues = ('None') x scalar @{$This->{DescriptorNames}}; | |
| 226 | |
| 227 return wantarray ? @DescriptorValues : scalar @DescriptorValues; | |
| 228 } | |
| 229 } | |
| 230 | |
| 231 # Get descriptor value for a specified descriptor name... | |
| 232 # | |
| 233 sub GetDescriptorValueByName { | |
| 234 my($This, $Name) = @_; | |
| 235 my(%NamesAndValues); | |
| 236 | |
| 237 %NamesAndValues = $This->GetDescriptorNamesAndValues(); | |
| 238 | |
| 239 return exists $NamesAndValues{$Name} ? $NamesAndValues{$Name} : 'None'; | |
| 240 | |
| 241 } | |
| 242 | |
| 243 # Get calculated molecular descriptor names sand values as a hash with names | |
| 244 # and values as key/value pairs... | |
| 245 # | |
| 246 sub GetDescriptorNamesAndValues { | |
| 247 my($This) = @_; | |
| 248 my(%NamesAndValues); | |
| 249 | |
| 250 %NamesAndValues = (); | |
| 251 @NamesAndValues{ @{$This->{DescriptorNames}} } = $This->GetDescriptorValues(); | |
| 252 | |
| 253 return %NamesAndValues; | |
| 254 } | |
| 255 | |
| 256 # Set up descriptor calculation control parameters for a specified descriptor class name... | |
| 257 # | |
| 258 # The specified parameter names and values are simply passed on to specified descriptor | |
| 259 # class during instantiation of descriptor class object without any performing any validation | |
| 260 # of parameter names and associated values. It's up to the appropriate descriptor class methods | |
| 261 # to validate these parameters and values. | |
| 262 # | |
| 263 # In addition to specified parameter names and values, the parameter hash must also contain | |
| 264 # descriptor class name as key and value pair with DescriptorClassName as key with class | |
| 265 # name as value. | |
| 266 # | |
| 267 sub SetDescriptorClassParameters { | |
| 268 my($This, %NamesAndValues) = @_; | |
| 269 my($DescriptorClassName, $Name, $Value); | |
| 270 | |
| 271 if (!exists $NamesAndValues{DescriptorClassName}) { | |
| 272 croak "Error: ${ClassName}->_SetDescriptorNameParameters: Can't set descriptor class name paramaters: DescriptorClassName is not specified..."; | |
| 273 } | |
| 274 | |
| 275 $DescriptorClassName = $NamesAndValues{DescriptorClassName}; | |
| 276 if (!IsDescriptorClassNameAvailable($DescriptorClassName)) { | |
| 277 carp "Warning: ${ClassName}->_SetDescriptorClassParameters: Can't set descriptor class name paramaters: Specified descriptor class name, $DescriptorClassName, is not available..."; | |
| 278 return $This; | |
| 279 } | |
| 280 | |
| 281 if (exists $This->{DescriptorClassParameters}{$DescriptorClassName}) { | |
| 282 carp "Warning: ${ClassName}->SetDescriptorClassParameters: Class name parameters for $DescriptorClassName have already been specified: Replacing previous values..."; | |
| 283 } | |
| 284 | |
| 285 %{$This->{DescriptorClassParameters}{$DescriptorClassName}} = (); | |
| 286 NAME: while (($Name, $Value) = each %NamesAndValues) { | |
| 287 if ($Name =~ /^DescriptorClassName$/) { | |
| 288 next NAME; | |
| 289 } | |
| 290 $This->{DescriptorClassParameters}{$DescriptorClassName}{$Name} = $Value; | |
| 291 } | |
| 292 | |
| 293 return $This; | |
| 294 } | |
| 295 | |
| 296 # Get descriptor name parameters as a reference to hash of hashes with hash | |
| 297 # keys corresponding to class name and class parameter name with hash value | |
| 298 # as class parameter value... | |
| 299 # | |
| 300 sub GetDescriptorClassParameters { | |
| 301 my($This) = @_; | |
| 302 | |
| 303 return \%{$This->{DescriptorClassParameters}}; | |
| 304 } | |
| 305 | |
| 306 # Get available descriptor class names as an array. | |
| 307 # | |
| 308 # This functionality can be either invoked as a class function or an | |
| 309 # object method. | |
| 310 # | |
| 311 sub GetAvailableDescriptorClassNames { | |
| 312 | |
| 313 return wantarray ? @{$DescriptorsDataMap{ClassNames}} : scalar @{$DescriptorsDataMap{ClassNames}}; | |
| 314 } | |
| 315 | |
| 316 # Get available descriptors class and descriptors names as a hash containing key/value | |
| 317 # pairs corresponding to class name and an array of descriptor names available for the | |
| 318 # class. | |
| 319 # | |
| 320 # This functionality can be either invoked as a class function or an | |
| 321 # object method. | |
| 322 # | |
| 323 sub GetAvailableClassAndDescriptorNames { | |
| 324 my($DescriptorClassName, @DescriptorNames, %ClassAndDescriptorNames); | |
| 325 | |
| 326 %ClassAndDescriptorNames = (); | |
| 327 for $DescriptorClassName (@{$DescriptorsDataMap{ClassNames}}) { | |
| 328 @{$ClassAndDescriptorNames{$DescriptorClassName}} = (); | |
| 329 push @{$ClassAndDescriptorNames{$DescriptorClassName}}, @{$DescriptorsDataMap{ClassToDescriptorNames}{$DescriptorClassName}}; | |
| 330 } | |
| 331 | |
| 332 return %ClassAndDescriptorNames; | |
| 333 } | |
| 334 | |
| 335 # Get available descriptor names as an array. | |
| 336 # | |
| 337 # This functionality can be either invoked as a class function or an | |
| 338 # object method. | |
| 339 # | |
| 340 sub GetAvailableDescriptorNames { | |
| 341 my(@DescriptorNames); | |
| 342 | |
| 343 @DescriptorNames = (); | |
| 344 push @DescriptorNames, map { @{$DescriptorsDataMap{ClassToDescriptorNames}{$_}} } @{$DescriptorsDataMap{ClassNames}}; | |
| 345 | |
| 346 return wantarray ? @DescriptorNames : scalar @DescriptorNames; | |
| 347 } | |
| 348 | |
| 349 # Is it a valid descriptors class name? | |
| 350 # | |
| 351 # This functionality can be either invoked as a class function or an | |
| 352 # object method. | |
| 353 # | |
| 354 sub IsDescriptorClassNameAvailable { | |
| 355 my($FirstParameter, $SecondParameter) = @_; | |
| 356 my($This, $DescriptorClassName); | |
| 357 | |
| 358 if ((@_ == 2) && (_IsMolecularDescriptorsGenerator($FirstParameter))) { | |
| 359 ($This, $DescriptorClassName) = ($FirstParameter, $SecondParameter); | |
| 360 } | |
| 361 else { | |
| 362 ($DescriptorClassName) = ($FirstParameter); | |
| 363 } | |
| 364 | |
| 365 return (exists $DescriptorsDataMap{ClassToDescriptorNames}{$DescriptorClassName}) ? 1 : 0; | |
| 366 } | |
| 367 | |
| 368 # Is it a valid descriptor name? | |
| 369 # | |
| 370 # This functionality can be either invoked as a class function or an | |
| 371 # object method. | |
| 372 # | |
| 373 sub IsDescriptorNameAvailable { | |
| 374 my($FirstParameter, $SecondParameter) = @_; | |
| 375 my($This, $DescriptorName); | |
| 376 | |
| 377 if ((@_ == 2) && (_IsMolecularDescriptorsGenerator($FirstParameter))) { | |
| 378 ($This, $DescriptorName) = ($FirstParameter, $SecondParameter); | |
| 379 } | |
| 380 else { | |
| 381 ($DescriptorName) = ($FirstParameter); | |
| 382 } | |
| 383 | |
| 384 return (exists $DescriptorsDataMap{DescriptorToClassName}{$DescriptorName}) ? 1 : 0; | |
| 385 } | |
| 386 | |
| 387 # Get available descriptors names for a descriptor class as an array. | |
| 388 # | |
| 389 # This functionality can be either invoked as a class function or an | |
| 390 # object method. | |
| 391 # | |
| 392 sub GetAvailableDescriptorNamesForDescriptorClass { | |
| 393 my($FirstParameter, $SecondParameter) = @_; | |
| 394 my($This, $DescriptorClassName, @DescriptorNames); | |
| 395 | |
| 396 if ((@_ == 2) && (_IsMolecularDescriptorsGenerator($FirstParameter))) { | |
| 397 ($This, $DescriptorClassName) = ($FirstParameter, $SecondParameter); | |
| 398 } | |
| 399 else { | |
| 400 ($DescriptorClassName) = ($FirstParameter); | |
| 401 } | |
| 402 | |
| 403 @DescriptorNames = (); | |
| 404 if (exists $DescriptorsDataMap{ClassToDescriptorNames}{$DescriptorClassName}) { | |
| 405 push @DescriptorNames, @{$DescriptorsDataMap{ClassToDescriptorNames}{$DescriptorClassName}}; | |
| 406 } | |
| 407 | |
| 408 return wantarray ? @DescriptorNames : scalar @DescriptorNames; | |
| 409 } | |
| 410 | |
| 411 # Get available descriptors class name for a descriptor name. | |
| 412 # | |
| 413 # This functionality can be either invoked as a class function or an | |
| 414 # object method. | |
| 415 # | |
| 416 sub GetAvailableClassNameForDescriptorName { | |
| 417 my($FirstParameter, $SecondParameter) = @_; | |
| 418 my($This, $DescriptorClassName, $DescriptorName); | |
| 419 | |
| 420 if ((@_ == 2) && (_IsMolecularDescriptorsGenerator($FirstParameter))) { | |
| 421 ($This, $DescriptorName) = ($FirstParameter, $SecondParameter); | |
| 422 } | |
| 423 else { | |
| 424 ($DescriptorName) = ($FirstParameter); | |
| 425 } | |
| 426 | |
| 427 $DescriptorClassName = ''; | |
| 428 if (exists $DescriptorsDataMap{DescriptorToClassName}{$DescriptorName}) { | |
| 429 $DescriptorClassName = $DescriptorsDataMap{DescriptorToClassName}{$DescriptorName}; | |
| 430 } | |
| 431 | |
| 432 return $DescriptorClassName; | |
| 433 } | |
| 434 | |
| 435 # Get RuleOf5 descriptor names as an array. | |
| 436 # | |
| 437 # This functionality can be either invoked as a class function or an | |
| 438 # object method. | |
| 439 # | |
| 440 sub GetRuleOf5DescriptorNames { | |
| 441 my(@DescriptorNames); | |
| 442 | |
| 443 @DescriptorNames = qw(MolecularWeight HydrogenBondDonors HydrogenBondAcceptors SLogP); | |
| 444 | |
| 445 return wantarray ? @DescriptorNames : scalar @DescriptorNames; | |
| 446 } | |
| 447 | |
| 448 # Get RuleOf3 descriptor names as an array. | |
| 449 # | |
| 450 # This functionality can be either invoked as a class function or an | |
| 451 # object method. | |
| 452 # | |
| 453 sub GetRuleOf3DescriptorNames { | |
| 454 my(@DescriptorNames); | |
| 455 | |
| 456 @DescriptorNames = qw(MolecularWeight RotatableBonds HydrogenBondDonors HydrogenBondAcceptors SLogP TPSA); | |
| 457 | |
| 458 return wantarray ? @DescriptorNames : scalar @DescriptorNames; | |
| 459 } | |
| 460 | |
| 461 | |
| 462 # Set molecule object... | |
| 463 # | |
| 464 sub SetMolecule { | |
| 465 my($This, $Molecule) = @_; | |
| 466 | |
| 467 $This->{Molecule} = $Molecule; | |
| 468 | |
| 469 # Weaken the reference to disable increment of reference count... | |
| 470 Scalar::Util::weaken($This->{Molecule}); | |
| 471 | |
| 472 return $This; | |
| 473 } | |
| 474 | |
| 475 # Generate specified molecular descriptors... | |
| 476 # | |
| 477 # After instantiating descriptor class objects at first invocation and initialializing | |
| 478 # descriptor values during subsequent invocations, GenerateDescriptors method | |
| 479 # provided by each descriptor class is used to calculate descriptor values for | |
| 480 # specified descriptors. | |
| 481 # | |
| 482 sub GenerateDescriptors { | |
| 483 my($This) = @_; | |
| 484 my($DescriptorClassName, $DescriptorClassObject); | |
| 485 | |
| 486 # Initialize descriptor values... | |
| 487 $This->_InitializeDescriptorValues(); | |
| 488 | |
| 489 # Instantiate decriptor classed corresponding to specified descriptors... | |
| 490 if (!$This->{DescriptorClassesInstantiated}) { | |
| 491 $This->_InstantiateDescriptorClasses(); | |
| 492 } | |
| 493 | |
| 494 # Check availability of molecule... | |
| 495 if (!$This->{Molecule}) { | |
| 496 carp "Warning: ${ClassName}->GenerateDescriptors: $This->{Type} molecular descriptors generation didn't succeed: Molecule data is not available: Molecule object hasn't been set..."; | |
| 497 return undef; | |
| 498 } | |
| 499 | |
| 500 # Calculate descriptor values... | |
| 501 for $DescriptorClassName (@{$This->{DescriptorClassNames}}) { | |
| 502 $DescriptorClassObject = $This->{DescriptorClassObjects}{$DescriptorClassName}; | |
| 503 | |
| 504 $DescriptorClassObject->SetMolecule($This->{Molecule}); | |
| 505 $DescriptorClassObject->GenerateDescriptors(); | |
| 506 | |
| 507 if (!$DescriptorClassObject->IsDescriptorsGenerationSuccessful()) { | |
| 508 return undef; | |
| 509 } | |
| 510 } | |
| 511 | |
| 512 # Set final descriptor values... | |
| 513 $This->_SetFinalDescriptorValues(); | |
| 514 | |
| 515 return $This; | |
| 516 } | |
| 517 | |
| 518 # Initialize descriptor values... | |
| 519 # | |
| 520 sub _InitializeDescriptorValues { | |
| 521 my($This) = @_; | |
| 522 | |
| 523 $This->{DescriptorsGenerated} = 0; | |
| 524 | |
| 525 @{$This->{DescriptorValues}} = (); | |
| 526 | |
| 527 return $This; | |
| 528 } | |
| 529 | |
| 530 # Setup final descriptor values... | |
| 531 # | |
| 532 sub _SetFinalDescriptorValues { | |
| 533 my($This) = @_; | |
| 534 my($DescriptorName, $DescriptorClassName, $DescriptorClassObject); | |
| 535 | |
| 536 $This->{DescriptorsGenerated} = 1; | |
| 537 | |
| 538 @{$This->{DescriptorValues}} = (); | |
| 539 | |
| 540 if ($This->{Mode} =~ /^All$/i) { | |
| 541 # Set descriptor values for all available descriptors... | |
| 542 for $DescriptorClassName (@{$This->{DescriptorClassNames}}) { | |
| 543 $DescriptorClassObject = $This->{DescriptorClassObjects}{$DescriptorClassName}; | |
| 544 | |
| 545 push @{$This->{DescriptorValues}}, $DescriptorClassObject->GetDescriptorValues(); | |
| 546 } | |
| 547 } | |
| 548 else { | |
| 549 # Set descriptor values for a subset of available descriptors... | |
| 550 for $DescriptorName (@{$This->{DescriptorNames}}) { | |
| 551 $DescriptorClassName = $DescriptorsDataMap{DescriptorToClassName}{$DescriptorName}; | |
| 552 $DescriptorClassObject = $This->{DescriptorClassObjects}{$DescriptorClassName}; | |
| 553 | |
| 554 push @{$This->{DescriptorValues}}, $DescriptorClassObject->GetDescriptorValueByName($DescriptorName); | |
| 555 } | |
| 556 } | |
| 557 | |
| 558 return $This; | |
| 559 } | |
| 560 | |
| 561 # Is descriptors generation successful? | |
| 562 # | |
| 563 # Notes: | |
| 564 # . After successful generation of descriptor values by each descriptor class | |
| 565 # corresponding to specified descriptor names, DescriptorsCalculated to 1; | |
| 566 # otherwise, it's set to 0. | |
| 567 # | |
| 568 sub IsDescriptorsGenerationSuccessful { | |
| 569 my($This) = @_; | |
| 570 | |
| 571 return $This->{DescriptorsGenerated} ? 1 : 0; | |
| 572 } | |
| 573 | |
| 574 # Check and set default descriptor names for generating descriptor values... | |
| 575 # | |
| 576 sub _CheckAndInitializeDescriptorNames { | |
| 577 my($This) = @_; | |
| 578 | |
| 579 if ($This->{Mode} =~ /^(All|RuleOf5|RuleOf3)$/i) { | |
| 580 if (@{$This->{DescriptorNames}}) { | |
| 581 croak "Error: ${ClassName}->_CheckAndInitializeDescriptorNames: Descriptor names can't be specified during \"All, RuleOf5 or RuleOf3\" values of descsriptors generation \"Mode\"..."; | |
| 582 } | |
| 583 } | |
| 584 | |
| 585 if ($This->{Mode} =~ /^All$/i) { | |
| 586 @{$This->{DescriptorNames}} = GetAvailableDescriptorNames(); | |
| 587 } | |
| 588 elsif ($This->{Mode} =~ /^RuleOf5$/i) { | |
| 589 @{$This->{DescriptorNames}} = GetRuleOf5DescriptorNames(); | |
| 590 } | |
| 591 elsif ($This->{Mode} =~ /^RuleOf3$/i) { | |
| 592 @{$This->{DescriptorNames}} = GetRuleOf3DescriptorNames(); | |
| 593 } | |
| 594 elsif ($This->{Mode} =~ /^Specify$/i) { | |
| 595 if (!@{$This->{DescriptorNames}}) { | |
| 596 croak "Error: ${ClassName}->_CheckAndInitializeDescriptorNames: DescriptorNames must be specified during Specify value for Mode..."; | |
| 597 } | |
| 598 } | |
| 599 else { | |
| 600 croak "Error: ${ClassName}->_CheckAndInitializeDescriptorNames: Mode value, $This->{Mode}, is not valid..."; | |
| 601 } | |
| 602 } | |
| 603 | |
| 604 # Instantiate descriptor classes corresponding to specified descriptor names... | |
| 605 # | |
| 606 sub _InstantiateDescriptorClasses { | |
| 607 my($This) = @_; | |
| 608 my($DescriptorClassName, $DescriptorName, $DescriptorClassPath); | |
| 609 | |
| 610 $This->{DescriptorClassesInstantiated} = 1; | |
| 611 | |
| 612 @{$This->{DescriptorClassNames}} = (); | |
| 613 %{$This->{DescriptorClassObjects}} = (); | |
| 614 | |
| 615 NAME: for $DescriptorName (@{$This->{DescriptorNames}}) { | |
| 616 $DescriptorClassName = $DescriptorsDataMap{DescriptorToClassName}{$DescriptorName}; | |
| 617 | |
| 618 if (exists $This->{DescriptorClassObjects}{$DescriptorClassName}) { | |
| 619 next NAME; | |
| 620 } | |
| 621 push @{$This->{DescriptorClassNames}}, $DescriptorClassName; | |
| 622 | |
| 623 $DescriptorClassPath = $DescriptorsDataMap{ClassNameToClassPath}{$DescriptorClassName}; | |
| 624 | |
| 625 if (exists $This->{DescriptorClassParameters}{$DescriptorClassName}) { | |
| 626 $This->{DescriptorClassObjects}{$DescriptorClassName} = $DescriptorClassPath->new(%{$This->{DescriptorClassParameters}{$DescriptorClassName}}); | |
| 627 } | |
| 628 else { | |
| 629 $This->{DescriptorClassObjects}{$DescriptorClassName} = $DescriptorClassPath->new(); | |
| 630 } | |
| 631 } | |
| 632 | |
| 633 return $This; | |
| 634 } | |
| 635 | |
| 636 # Return a string containg data for MolecularDescriptorsGenerator object... | |
| 637 # | |
| 638 sub StringifyMolecularDescriptorsGenerator { | |
| 639 my($This) = @_; | |
| 640 my($TheString, $NamesAndValuesString, $Name, $Value, @NamesAndValuesInfo, %NamesAndValues); | |
| 641 | |
| 642 # Type of MolecularDescriptors... | |
| 643 $TheString = "MolecularDescriptorsGenerator: Mode - $This->{Mode}; SpecifiedDescriptorNames - < @{$This->{DescriptorNames}} >; AvailableMolecularDescriptorClassNames - < @{$DescriptorsDataMap{ClassNames}} >"; | |
| 644 | |
| 645 @NamesAndValuesInfo = (); | |
| 646 %NamesAndValues = $This->GetDescriptorNamesAndValues(); | |
| 647 | |
| 648 for $Name (@{$This->{DescriptorNames}}) { | |
| 649 $Value = $NamesAndValues{$Name}; | |
| 650 $Value = (TextUtil::IsEmpty($Value) || $Value =~ /^None$/i) ? 'None' : $Value; | |
| 651 push @NamesAndValuesInfo, "$Name - $Value"; | |
| 652 } | |
| 653 if (@NamesAndValuesInfo) { | |
| 654 $TheString .= "Names - Values: <" . TextUtil::JoinWords(\@NamesAndValuesInfo, ", ", 0) . ">"; | |
| 655 } | |
| 656 else { | |
| 657 $TheString .= "Names - Values: < None>"; | |
| 658 } | |
| 659 | |
| 660 return $TheString; | |
| 661 } | |
| 662 | |
| 663 # Is it a MolecularDescriptorsGenerator object? | |
| 664 sub _IsMolecularDescriptorsGenerator { | |
| 665 my($Object) = @_; | |
| 666 | |
| 667 return (Scalar::Util::blessed($Object) && $Object->isa($ClassName)) ? 1 : 0; | |
| 668 } | |
| 669 | |
| 670 # Validate descriptor names for generating descriptor values... | |
| 671 # | |
| 672 sub _ValidateDescriptorNames { | |
| 673 my($This) = @_; | |
| 674 my($DescriptorName); | |
| 675 | |
| 676 for $DescriptorName (@{$This->{DescriptorNames}}) { | |
| 677 if (!exists $DescriptorsDataMap{DescriptorToClassName}{$DescriptorName}) { | |
| 678 croak "Error: ${ClassName}->_SetAndValidateDescriptorNames: Specified descriptor name, $DescriptorName, is not valid..."; | |
| 679 } | |
| 680 } | |
| 681 | |
| 682 return $This; | |
| 683 } | |
| 684 | |
| 685 # | |
| 686 # Load available molecular descriptors data... | |
| 687 # | |
| 688 # All available molecular descriptors classes are automatically detected in | |
| 689 # MolecularDescriptors directory under <MayaChemTools>/lib directory and | |
| 690 # information about available descriptor names is retrieved from each descriptor | |
| 691 # class using function GetDescriptorNames. The following %DescriptorsDataMap | |
| 692 # is setup containing all available molecular descriptors data: | |
| 693 # | |
| 694 # @{$DescriptorsDataMap{ClassNames}} | |
| 695 # %{$DescriptorsDataMap{ClassNameToPath}} | |
| 696 # %{$DescriptorsDataMap{ClassToDescriptorNames}} | |
| 697 # %{$DescriptorsDataMap{DescriptorToClassName}} | |
| 698 # | |
| 699 # GenerateDescriptors method is invoked fo each specified descriptor class | |
| 700 # object to calculate descriptor values for specified descriptors. After successful | |
| 701 # calculation of descriptors, GetDescriptorValues or GetDescriptorValueByName | |
| 702 # methods provided by descriptor objects are used to retrieve calculated | |
| 703 # descriptor values. | |
| 704 # | |
| 705 sub _LoadMolecularDescriptorsData { | |
| 706 | |
| 707 %DescriptorsDataMap = (); | |
| 708 | |
| 709 _RetrieveAndLoadDescriptorClasses(); | |
| 710 _SetupDescriptorsDataMap(); | |
| 711 } | |
| 712 | |
| 713 # | |
| 714 # Retrieve available molecular descriptors classes from MolecularDescriptors directory under | |
| 715 # <MayaChemTools>/lib directory... | |
| 716 # | |
| 717 sub _RetrieveAndLoadDescriptorClasses { | |
| 718 my($DescriptorsDirName, $MayaChemToolsLibDir, $DescriptorsDirPath, $IncludeDirName, $DescriptorClassName, $DescriptorClassPath, $DescriptorsClassFileName, @FileNames, @DescriptorsClassFileNames); | |
| 719 | |
| 720 @{$DescriptorsDataMap{ClassNames}} = (); | |
| 721 %{$DescriptorsDataMap{ClassNameToPath}} = (); | |
| 722 | |
| 723 $DescriptorsDirName = "MolecularDescriptors"; | |
| 724 $MayaChemToolsLibDir = FileUtil::GetMayaChemToolsLibDirName(); | |
| 725 | |
| 726 $DescriptorsDirPath = "$MayaChemToolsLibDir/$DescriptorsDirName"; | |
| 727 | |
| 728 if (! -d "$DescriptorsDirPath") { | |
| 729 croak "Error: ${ClassName}::_RetrieveAndLoadDescriptorClasses: MayaChemTools package molecular descriptors directory, $DescriptorsDirPath, is missing: Possible installation problems..."; | |
| 730 } | |
| 731 | |
| 732 @FileNames = ("$DescriptorsDirPath/*"); | |
| 733 $IncludeDirName = 0; | |
| 734 @DescriptorsClassFileNames = FileUtil::ExpandFileNames(\@FileNames, "pm", $IncludeDirName); | |
| 735 | |
| 736 if (!@DescriptorsClassFileNames) { | |
| 737 croak "Error: ${ClassName}::_RetrieveAndLoadDescriptorClasses: MayaChemTools package molecular descriptors directory, $DescriptorsDirPath, doesn't contain any molecular descriptor class: Possible installation problems..."; | |
| 738 } | |
| 739 | |
| 740 FILENAME: for $DescriptorsClassFileName (sort @DescriptorsClassFileNames) { | |
| 741 if ($DescriptorsClassFileName !~ /\.pm/) { | |
| 742 croak "Error: ${ClassName}::_RetrieveAndLoadDescriptorClasses: MayaChemTools package molecular descriptors directory, $DescriptorsDirPath, contains invalid class file name $DescriptorsClassFileName: Possible installation problems..."; | |
| 743 } | |
| 744 | |
| 745 # Ignore base class and descriptors generator class... | |
| 746 if ($DescriptorsClassFileName =~ /^(MolecularDescriptorsGenerator\.pm|MolecularDescriptors\.pm)$/) { | |
| 747 next FILENAME; | |
| 748 } | |
| 749 | |
| 750 ($DescriptorClassName) = split /\./, $DescriptorsClassFileName; | |
| 751 $DescriptorClassPath = "${DescriptorsDirName}::${DescriptorClassName}"; | |
| 752 | |
| 753 # Load descriptors class... | |
| 754 eval "use $DescriptorClassPath"; | |
| 755 | |
| 756 if ($@) { | |
| 757 croak "Error: ${ClassName}::_RetrieveAndLoadDescriptorClasses: use $DescriptorClassPath failed: $@ ..."; | |
| 758 } | |
| 759 | |
| 760 push @{$DescriptorsDataMap{ClassNames}}, $DescriptorClassName; | |
| 761 | |
| 762 $DescriptorsDataMap{ClassNameToClassPath}{$DescriptorClassName} = $DescriptorClassPath; | |
| 763 } | |
| 764 } | |
| 765 | |
| 766 # | |
| 767 # Setup descriptors data map using loaded descriptor classes... | |
| 768 # | |
| 769 sub _SetupDescriptorsDataMap { | |
| 770 my($DescriptorClassName, $DescriptorName, $DescriptorClassPath, @DescriptorNames); | |
| 771 | |
| 772 # Class to decriptor names map... | |
| 773 %{$DescriptorsDataMap{ClassToDescriptorNames}} = (); | |
| 774 | |
| 775 # Descriptor to class name map... | |
| 776 %{$DescriptorsDataMap{DescriptorToClassName}} = (); | |
| 777 | |
| 778 for $DescriptorClassName (@{$DescriptorsDataMap{ClassNames}}) { | |
| 779 $DescriptorClassPath = $DescriptorsDataMap{ClassNameToClassPath}{$DescriptorClassName}; | |
| 780 | |
| 781 @DescriptorNames = $DescriptorClassPath->GetDescriptorNames(); | |
| 782 | |
| 783 if (!@DescriptorNames) { | |
| 784 croak "Error: ${ClassName}::_SetupDescriptorsDataMap: Molecular descriptor class $DescriptorClassName doesn't provide any descriptor names..."; | |
| 785 } | |
| 786 | |
| 787 if (exists $DescriptorsDataMap{ClassToDescriptorNames}{$DescriptorClassName} ) { | |
| 788 croak "Error: ${ClassName}::_SetupDescriptorsDataMap: Molecular descriptor class $DescriptorClassName has already been processed..."; | |
| 789 } | |
| 790 | |
| 791 @{$DescriptorsDataMap{ClassToDescriptorNames}{$DescriptorClassName}} = (); | |
| 792 @{$DescriptorsDataMap{ClassToDescriptorNames}{$DescriptorClassName}} = @DescriptorNames; | |
| 793 | |
| 794 for $DescriptorName (@DescriptorNames) { | |
| 795 if (exists $DescriptorsDataMap{DescriptorToClassName}{$DescriptorName}) { | |
| 796 croak "Error: ${ClassName}::_SetupDescriptorsDataMap: Molecular descriptor name, $DescriptorName, in class name, $DescriptorClassName, has already been provided by class name $DescriptorsDataMap{DescriptorToClassName}{$DescriptorName}..."; | |
| 797 } | |
| 798 | |
| 799 $DescriptorsDataMap{DescriptorToClassName}{$DescriptorName} = $DescriptorClassName; | |
| 800 } | |
| 801 } | |
| 802 } | |
| 803 | |
| 804 1; | |
| 805 | |
| 806 __END__ | |
| 807 | |
| 808 =head1 NAME | |
| 809 | |
| 810 MolecularDescriptorsGenerator | |
| 811 | |
| 812 =head1 SYNOPSIS | |
| 813 | |
| 814 use MolecularDescriptors::MolecularDescriptorsGenerator; | |
| 815 | |
| 816 use MolecularDescriptors::MolecularDescriptorsGenerator qw(:all); | |
| 817 | |
| 818 =head1 DESCRIPTION | |
| 819 | |
| 820 B<MolecularDescriptorsGenerator> class provides the following methods: | |
| 821 | |
| 822 new, GenerateDescriptors, GetAvailableClassAndDescriptorNames, | |
| 823 GetAvailableClassNameForDescriptorName, GetAvailableDescriptorClassNames, | |
| 824 GetAvailableDescriptorNames, GetAvailableDescriptorNamesForDescriptorClass, | |
| 825 GetDescriptorClassParameters, GetDescriptorNames, GetDescriptorNamesAndValues, | |
| 826 GetDescriptorValueByName, GetDescriptorValues, GetRuleOf3DescriptorNames, | |
| 827 GetRuleOf5DescriptorNames, IsDescriptorClassNameAvailable, | |
| 828 IsDescriptorNameAvailable, IsDescriptorsGenerationSuccessful, | |
| 829 SetDescriptorClassParameters, SetDescriptorNames, SetMode, SetMolecule, | |
| 830 StringifyMolecularDescriptorsGenerator | |
| 831 | |
| 832 B<MolecularDescriptorsGenerator> is derived from is derived from B<ObjectProperty> | |
| 833 base class that provides methods not explicitly defined in B<MolecularDescriptorsGenerator> | |
| 834 or B<ObjectProperty> classes using Perl's AUTOLOAD functionality. These methods are | |
| 835 generated on-the-fly for a specified object property: | |
| 836 | |
| 837 Set<PropertyName>(<PropertyValue>); | |
| 838 $PropertyValue = Get<PropertyName>(); | |
| 839 Delete<PropertyName>(); | |
| 840 | |
| 841 B<MolecularDescriptorsGenerator> is designed to provide a plug-in environment for | |
| 842 molecular descriptors development. The molecular descriptor class modules available | |
| 843 in B<MolecularDescriptors> directory under B<MayaChemTools/lib> directory are | |
| 844 automatically detected and loaded into the system. The descriptor names provided | |
| 845 by each descriptor class module through its B<GetDescriptorNames> function are | |
| 846 retrieved and are made available for calculations of their values for a specified | |
| 847 molecule. | |
| 848 | |
| 849 Any combination of available descriptor names can be specified during calculation | |
| 850 of descriptor values using B<GenerateDescriptors> method. The current release of | |
| 851 MayaChemTools supports generation of four sets of descriptors: All available | |
| 852 descriptors, rule of 5 or 3 descriptors, or a specified set of descriptor names. | |
| 853 | |
| 854 RuleOf5 [ Ref 91 ] descriptor names are: MolecularWeight, HydrogenBondDonors, | |
| 855 HydrogenBondAcceptors, SLogP. RuleOf5 states: MolecularWeight <= 500, | |
| 856 HydrogenBondDonors <= 5, HydrogenBondAcceptors <= 10, and logP <= 5. | |
| 857 | |
| 858 RuleOf3 [ Ref 92 ] descriptor names are: MolecularWeight, RotatableBonds, | |
| 859 HydrogenBondDonors, HydrogenBondAcceptors, SLogP, TPSA. RuleOf3 states: | |
| 860 MolecularWeight <= 300, RotatableBonds <= 3, HydrogenBondDonors <= 3, | |
| 861 HydrogenBondAcceptors <= 3, logP <= 3, and TPSA <= 60. | |
| 862 | |
| 863 Before calculation of a specified set of descriptors by B<GenerateDescriptors> | |
| 864 method, a set of descriptor calculation control parameters for a specific descriptor | |
| 865 class name can be set using B<SetDescriptorClassParameters> method. The specified | |
| 866 control parameter names and values are simply passed on to specified descriptor | |
| 867 class during instantiation of descriptor class object without performing any validation | |
| 868 of parameter names and associated values. It's up to the appropriate descriptor class methods | |
| 869 to validate these parameters and values. In addition to specified parameter names and | |
| 870 values, the parameter hash must also contain descriptor class name as key and | |
| 871 value pair with DescriptorClassName as key with class name as value. | |
| 872 | |
| 873 =head2 METHODS | |
| 874 | |
| 875 =over 4 | |
| 876 | |
| 877 =item B<new> | |
| 878 | |
| 879 $NewMolecularDescriptorsGenerator = new MolecularDescriptors:: | |
| 880 MolecularDescriptorsGenerator( | |
| 881 %NamesAndValues); | |
| 882 | |
| 883 Using specified I<MolecularDescriptorsGenerator> property names and values hash, B<new> | |
| 884 method creates a new object and returns a reference to newly created B<MolecularDescriptorsGenerator> | |
| 885 object. By default, the following properties are initialized: | |
| 886 | |
| 887 Mode = 'All' | |
| 888 @{$This->{DescriptorNames}} = () | |
| 889 %{$This->{DescriptorClassParameters}} = () | |
| 890 @{$This->{DescriptorClassNames}} = () | |
| 891 %{$This->{DescriptorClassObjects}} = () | |
| 892 @{$This->{DescriptorValues}} = () | |
| 893 | |
| 894 Examples: | |
| 895 | |
| 896 $MolecularDescriptorsGenerator = new MolecularDescriptors:: | |
| 897 MolecularDescriptorsGenerator( | |
| 898 'Molecule' => $Molecule); | |
| 899 | |
| 900 @DescriptorNames = qw(MolecularWeight HydrogenBondDonors Fsp3Carbons) | |
| 901 $MolecularDescriptorsGenerator = new MolecularDescriptors:: | |
| 902 MolecularDescriptorsGenerator( | |
| 903 'Mode' => 'Specify', | |
| 904 'DescriptorNames' => \@DescriptorNames); | |
| 905 | |
| 906 $MolecularDescriptorsGenerator->SetDescriptorClassParameters( | |
| 907 'DescriptorClassName' => 'WeightAndMassDescriptors', | |
| 908 'WeightPrecision' => 2, | |
| 909 'MassPrecision' => 2); | |
| 910 | |
| 911 $MolecularDescriptorsGenerator->SetDescriptorClassParameters( | |
| 912 'DescriptorClassName' => 'HydrogenBondsDescriptors', | |
| 913 'HydrogenBondsType' => 'HBondsType1'); | |
| 914 | |
| 915 $MolecularDescriptorsGenerator->SetMolecule($Molecule); | |
| 916 $MolecularDescriptorsGenerator->GenerateDescriptors(); | |
| 917 print "MolecularDescriptorsGenerator: $MolecularDescriptorsGenerator\n"; | |
| 918 | |
| 919 | |
| 920 =item B<GenerateDescriptors> | |
| 921 | |
| 922 $MolecularDescriptorsGenerator->GenerateDescriptors(); | |
| 923 | |
| 924 Calculates descriptor values for specified descriptors and returns I<MolecularDescriptorsGenerator>. | |
| 925 | |
| 926 Descriptor class objects are instantiated only once at first invocation. During | |
| 927 subsequent calls to B<GenerateDescriptors> method, descriptor values are | |
| 928 initialized and B<GenerateDescriptors> method provided by descriptor class is | |
| 929 used to calculate descriptor values for specified descriptors. | |
| 930 | |
| 931 =item B<GetAvailableClassAndDescriptorNames> | |
| 932 | |
| 933 %ClassAndDescriptorNames = $MolecularDescriptorsGenerator-> | |
| 934 GetAvailableClassAndDescriptorNames(); | |
| 935 %ClassAndDescriptorNames = MolecularDescriptors:: | |
| 936 MolecularDescriptorsGenerator:: | |
| 937 GetAvailableClassAndDescriptorNames(); | |
| 938 | |
| 939 Returns available descriptors class and descriptors names as a hash containing key | |
| 940 and value pairs corresponding to class name and an array of descriptor names | |
| 941 available for the class. | |
| 942 | |
| 943 =item B<GetAvailableClassNameForDescriptorName> | |
| 944 | |
| 945 $DescriptorClassName = $MolecularDescriptorsGenerator-> | |
| 946 GetAvailableClassNameForDescriptorName($DescriptorName); | |
| 947 | |
| 948 $DescriptorClassName = MolecularDescriptors::MolecularDescriptorsGenerator:: | |
| 949 GetAvailableClassNameForDescriptorName($DescriptorName); | |
| 950 | |
| 951 Returns available descriptor class name for a descriptor name. | |
| 952 | |
| 953 =item B<GetAvailableDescriptorClassNames> | |
| 954 | |
| 955 $Return = $MolecularDescriptorsGenerator->GetAvailableDescriptorClassNames(); | |
| 956 | |
| 957 @DescriptorClassNames = $MolecularDescriptorsGenerator-> | |
| 958 GetAvailableDescriptorClassNames(); | |
| 959 @DescriptorClassNames = MolecularDescriptors:: | |
| 960 MolecularDescriptorsGenerator:: | |
| 961 GetAvailableDescriptorClassNames(); | |
| 962 | |
| 963 Returns available descriptor class names as an array or number of available descriptor | |
| 964 class names in scalar context. | |
| 965 | |
| 966 =item B<GetAvailableDescriptorNames> | |
| 967 | |
| 968 @DescriptorNames = $MolecularDescriptorsGenerator-> | |
| 969 GetAvailableDescriptorNames(); | |
| 970 @DescriptorNames = MolecularDescriptors:: | |
| 971 MolecularDescriptorsGenerator:: | |
| 972 GetAvailableDescriptorNames(); | |
| 973 | |
| 974 Returns available descriptor names as an array or number of available descriptor | |
| 975 names in scalar context. | |
| 976 | |
| 977 =item B<GetAvailableDescriptorNamesForDescriptorClass> | |
| 978 | |
| 979 @DescriptorNames = $MolecularDescriptorsGenerator-> | |
| 980 GetAvailableDescriptorNamesForDescriptorClass($DescriptorClassName); | |
| 981 @DescriptorNames = MolecularDescriptors:: | |
| 982 MolecularDescriptorsGenerator:: | |
| 983 GetAvailableDescriptorNamesForDescriptorClass($DescriptorClassName); | |
| 984 | |
| 985 Returns available descriptors names for a descriptor class as an array or number | |
| 986 of available descriptor names in scalar context. | |
| 987 | |
| 988 =item B<GetDescriptorClassParameters> | |
| 989 | |
| 990 $DescriptorClassParametersRef = $MolecularDescriptorsGenerator-> | |
| 991 GetDescriptorClassParameters(); | |
| 992 $DescriptorClassParametersRef = MolecularDescriptors:: | |
| 993 MolecularDescriptorsGenerator:: | |
| 994 GetDescriptorClassParameters(); | |
| 995 | |
| 996 Returns descriptor name parameters as a reference to hash of hashes with hash | |
| 997 keys corresponding to class name and class parameter name with hash value | |
| 998 as class parameter value. | |
| 999 | |
| 1000 =item B<GetDescriptorNames> | |
| 1001 | |
| 1002 @DescriptorNames = $MolecularDescriptorsGenerator->GetDescriptorNames(); | |
| 1003 @DescriptorNames = MolecularDescriptors::MolecularDescriptorsGenerator:: | |
| 1004 GetDescriptorNames(); | |
| 1005 | |
| 1006 Returns all available descriptor names as an array or number of available descriptors | |
| 1007 in scalar context. | |
| 1008 | |
| 1009 =item B<GetDescriptorNamesAndValues> | |
| 1010 | |
| 1011 %NamesAndValues = $MolecularDescriptorsGenerator-> | |
| 1012 GetDescriptorNamesAndValues(); | |
| 1013 | |
| 1014 Returns calculated molecular descriptor names and values as a hash with descriptor | |
| 1015 names and values as hash key and value pairs. | |
| 1016 | |
| 1017 =item B<GetDescriptorValueByName> | |
| 1018 | |
| 1019 $Value = $MolecularDescriptorsGenerator-> | |
| 1020 GetDescriptorValueByName($Name); | |
| 1021 | |
| 1022 Returns calculated descriptor values for a specified descriptor name. | |
| 1023 | |
| 1024 =item B<GetDescriptorValues> | |
| 1025 | |
| 1026 @DescriptorValues = $MolecularDescriptorsGenerator->GetDescriptorValues(); | |
| 1027 | |
| 1028 Returns all calculated descriptor values as an array corresponding to specified | |
| 1029 descriptor names. | |
| 1030 | |
| 1031 =item B<GetRuleOf3DescriptorNames> | |
| 1032 | |
| 1033 @DescriptorNames = $MolecularDescriptorsGenerator-> | |
| 1034 GetRuleOf3DescriptorNames(); | |
| 1035 @DescriptorNames = MolecularDescriptors:: | |
| 1036 MolecularDescriptorsGenerator:: | |
| 1037 GetRuleOf3DescriptorNames(); | |
| 1038 | |
| 1039 Returns rule of 3 descriptor names as an array or number of rule of 3 descriptors in scalar | |
| 1040 context. | |
| 1041 | |
| 1042 RuleOf3 [ Ref 92 ] descriptor names are: MolecularWeight, RotatableBonds, | |
| 1043 HydrogenBondDonors, HydrogenBondAcceptors, SLogP, TPSA. RuleOf3 states: | |
| 1044 MolecularWeight <= 300, RotatableBonds <= 3, HydrogenBondDonors <= 3, | |
| 1045 HydrogenBondAcceptors <= 3, logP <= 3, and TPSA <= 60. | |
| 1046 | |
| 1047 =item B<GetRuleOf5DescriptorNames> | |
| 1048 | |
| 1049 @DescriptorNames = $MolecularDescriptorsGenerator-> | |
| 1050 GetRuleOf5DescriptorNames(); | |
| 1051 @DescriptorNames = $MolecularDescriptorsGenerator:: | |
| 1052 GetRuleOf5DescriptorNames(); | |
| 1053 | |
| 1054 Returns rule of 5 descriptor names as an array or number of rule of 4 descriptors in scalar | |
| 1055 context. | |
| 1056 | |
| 1057 RuleOf5 [ Ref 91 ] descriptor names are: MolecularWeight, HydrogenBondDonors, | |
| 1058 HydrogenBondAcceptors, SLogP. RuleOf5 states: MolecularWeight <= 500, | |
| 1059 HydrogenBondDonors <= 5, HydrogenBondAcceptors <= 10, and logP <= 5. | |
| 1060 | |
| 1061 =item B<IsDescriptorClassNameAvailable> | |
| 1062 | |
| 1063 $Status = $MolecularDescriptorsGenerator-> | |
| 1064 IsDescriptorClassNameAvailable($ClassName); | |
| 1065 $Status = MolecularDescriptors:: | |
| 1066 MolecularDescriptorsGenerator:: | |
| 1067 IsDescriptorClassNameAvailable($ClassName); | |
| 1068 | |
| 1069 Returns 1 or 0 based on whether specified descriptor class name is available. | |
| 1070 | |
| 1071 =item B<IsDescriptorNameAvailable> | |
| 1072 | |
| 1073 $Status = $MolecularDescriptorsGenerator-> | |
| 1074 IsDescriptorNameAvailable($DescriptorName); | |
| 1075 $Status = MolecularDescriptors:: | |
| 1076 MolecularDescriptorsGenerator:: | |
| 1077 IsDescriptorNameAvailable($DescriptorName); | |
| 1078 | |
| 1079 Returns 1 or 0 based on whether specified descriptor name is available. | |
| 1080 | |
| 1081 =item B<IsDescriptorsGenerationSuccessful> | |
| 1082 | |
| 1083 $Status = $MolecularDescriptorsGenerator-> | |
| 1084 IsDescriptorsGenerationSuccessful(); | |
| 1085 | |
| 1086 Returns 1 or 0 based on whether descriptors generation is successful. | |
| 1087 | |
| 1088 =item B<SetDescriptorClassParameters> | |
| 1089 | |
| 1090 $MolecularDescriptorsGenerator->SetDescriptorClassParameters( | |
| 1091 %NamesAndValues); | |
| 1092 | |
| 1093 Sets descriptor calculation control parameters for a specified descriptor class name | |
| 1094 and returns I<MolecularDescriptorsGenerator>. | |
| 1095 | |
| 1096 The specified parameter names and values are simply passed on to specified descriptor | |
| 1097 class during instantiation of descriptor class object without any performing any validation | |
| 1098 of parameter names and associated values. It's up to the appropriate descriptor class methods | |
| 1099 to validate these parameters and values. | |
| 1100 | |
| 1101 In addition to specified parameter names and values, the parameter hash must also contain | |
| 1102 descriptor class name as key and value pair with DescriptorClassName as key with class | |
| 1103 name as value. | |
| 1104 | |
| 1105 =item B<SetDescriptorNames> | |
| 1106 | |
| 1107 $MolecularDescriptorsGenerator->SetDescriptorNames(@Names); | |
| 1108 $MolecularDescriptorsGenerator->SetDescriptorNames(\@Names); | |
| 1109 | |
| 1110 Sets descriptor names to use for generating descriptor values using an array | |
| 1111 or reference to an array and returns I<MolecularDescriptorsGenerator>. | |
| 1112 | |
| 1113 =item B<SetMode> | |
| 1114 | |
| 1115 $MolecularDescriptorsGenerator->SetMode($Mode); | |
| 1116 | |
| 1117 Sets descriptors generation mode and returns I<MolecularDescriptorsGenerator>. | |
| 1118 Possible I<Mode> values: I<All, RuleOf5, RuleOf3, Specify>. | |
| 1119 | |
| 1120 =item B<SetMolecule> | |
| 1121 | |
| 1122 $MolecularDescriptorsGenerator->SetMolecule($Molecule); | |
| 1123 | |
| 1124 Sets molecule to use during calculation of molecular descriptors and returns | |
| 1125 I<MolecularDescriptorsGenerator>. | |
| 1126 | |
| 1127 =item B<StringifyMolecularDescriptorsGenerator> | |
| 1128 | |
| 1129 $String = $MolecularDescriptorsGenerator->StringifyMolecularDescriptorsGenerator(); | |
| 1130 | |
| 1131 Returns a string containing information about I<MolecularDescriptorsGenerator> object. | |
| 1132 | |
| 1133 =back | |
| 1134 | |
| 1135 =head1 AUTHOR | |
| 1136 | |
| 1137 Manish Sud <msud@san.rr.com> | |
| 1138 | |
| 1139 =head1 SEE ALSO | |
| 1140 | |
| 1141 MolecularDescriptors.pm | |
| 1142 | |
| 1143 =head1 COPYRIGHT | |
| 1144 | |
| 1145 Copyright (C) 2015 Manish Sud. All rights reserved. | |
| 1146 | |
| 1147 This file is part of MayaChemTools. | |
| 1148 | |
| 1149 MayaChemTools is free software; you can redistribute it and/or modify it under | |
| 1150 the terms of the GNU Lesser General Public License as published by the Free | |
| 1151 Software Foundation; either version 3 of the License, or (at your option) | |
| 1152 any later version. | |
| 1153 | |
| 1154 =cut |
