Mercurial > repos > deepakjadmin > mayatool3_test3
comparison mayachemtools/lib/Fingerprints/TopologicalAtomPairsFingerprints.pm @ 0:73ae111cf86f draft
Uploaded
| author | deepakjadmin |
|---|---|
| date | Wed, 20 Jan 2016 11:55:01 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:73ae111cf86f |
|---|---|
| 1 package Fingerprints::TopologicalAtomPairsFingerprints; | |
| 2 # | |
| 3 # $RCSfile: TopologicalAtomPairsFingerprints.pm,v $ | |
| 4 # $Date: 2015/02/28 20:48:54 $ | |
| 5 # $Revision: 1.30 $ | |
| 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 Fingerprints::Fingerprints; | |
| 33 use TextUtil (); | |
| 34 use Molecule; | |
| 35 use AtomTypes::AtomicInvariantsAtomTypes; | |
| 36 use AtomTypes::DREIDINGAtomTypes; | |
| 37 use AtomTypes::EStateAtomTypes; | |
| 38 use AtomTypes::FunctionalClassAtomTypes; | |
| 39 use AtomTypes::MMFF94AtomTypes; | |
| 40 use AtomTypes::SLogPAtomTypes; | |
| 41 use AtomTypes::SYBYLAtomTypes; | |
| 42 use AtomTypes::TPSAAtomTypes; | |
| 43 use AtomTypes::UFFAtomTypes; | |
| 44 | |
| 45 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); | |
| 46 | |
| 47 @ISA = qw(Fingerprints::Fingerprints Exporter); | |
| 48 @EXPORT = qw(); | |
| 49 @EXPORT_OK = qw(); | |
| 50 | |
| 51 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]); | |
| 52 | |
| 53 # Setup class variables... | |
| 54 my($ClassName); | |
| 55 _InitializeClass(); | |
| 56 | |
| 57 # Overload Perl functions... | |
| 58 use overload '""' => 'StringifyTopologicalAtomPairsFingerprints'; | |
| 59 | |
| 60 # Class constructor... | |
| 61 sub new { | |
| 62 my($Class, %NamesAndValues) = @_; | |
| 63 | |
| 64 # Initialize object... | |
| 65 my $This = $Class->SUPER::new(); | |
| 66 bless $This, ref($Class) || $Class; | |
| 67 $This->_InitializeTopologicalAtomPairsFingerprints(); | |
| 68 | |
| 69 $This->_InitializeTopologicalAtomPairsFingerprintsProperties(%NamesAndValues); | |
| 70 | |
| 71 return $This; | |
| 72 } | |
| 73 | |
| 74 # Initialize object data... | |
| 75 # | |
| 76 sub _InitializeTopologicalAtomPairsFingerprints { | |
| 77 my($This) = @_; | |
| 78 | |
| 79 # Type of fingerprint... | |
| 80 $This->{Type} = 'TopologicalAtomPairs'; | |
| 81 | |
| 82 # Type of vector... | |
| 83 $This->{VectorType} = 'FingerprintsVector'; | |
| 84 | |
| 85 # Type of FingerprintsVector... | |
| 86 $This->{FingerprintsVectorType} = 'NumericalValues'; | |
| 87 | |
| 88 # Minimum and maximum bond distance between atom paris... | |
| 89 $This->{MinDistance} = 1; | |
| 90 $This->{MaxDistance} = 10; | |
| 91 | |
| 92 # Atom identifier type to use for atom IDs in atom pairs... | |
| 93 # | |
| 94 # Currently supported values are: AtomicInvariantsAtomTypes, DREIDINGAtomTypes, | |
| 95 # EStateAtomTypes, FunctionalClassAtomTypes, MMFF94AtomTypes, SLogPAtomTypes, | |
| 96 # SYBYLAtomTypes, TPSAAtomTypes, UFFAtomTypes | |
| 97 # | |
| 98 $This->{AtomIdentifierType} = ''; | |
| 99 | |
| 100 # Atom types assigned to each heavy atom... | |
| 101 # | |
| 102 %{$This->{AssignedAtomTypes}} = (); | |
| 103 | |
| 104 # All atom pairs between minimum and maximum distance... | |
| 105 # | |
| 106 @{$This->{AtomPairsIDs}} = (); | |
| 107 %{$This->{AtomPairsCount}} = (); | |
| 108 } | |
| 109 | |
| 110 # Initialize class ... | |
| 111 sub _InitializeClass { | |
| 112 #Class name... | |
| 113 $ClassName = __PACKAGE__; | |
| 114 } | |
| 115 | |
| 116 # Initialize object properties.... | |
| 117 sub _InitializeTopologicalAtomPairsFingerprintsProperties { | |
| 118 my($This, %NamesAndValues) = @_; | |
| 119 | |
| 120 my($Name, $Value, $MethodName); | |
| 121 while (($Name, $Value) = each %NamesAndValues) { | |
| 122 $MethodName = "Set${Name}"; | |
| 123 $This->$MethodName($Value); | |
| 124 } | |
| 125 | |
| 126 # Make sure molecule object was specified... | |
| 127 if (!exists $NamesAndValues{Molecule}) { | |
| 128 croak "Error: ${ClassName}->New: Object can't be instantiated without specifying molecule..."; | |
| 129 } | |
| 130 if (!exists $NamesAndValues{AtomIdentifierType}) { | |
| 131 croak "Error: ${ClassName}->New: Object can't be instantiated without specifying AtomIdentifierType..."; | |
| 132 } | |
| 133 | |
| 134 $This->_InitializeFingerprintsVector(); | |
| 135 | |
| 136 return $This; | |
| 137 } | |
| 138 | |
| 139 # Set minimum distance for atom pairs... | |
| 140 # | |
| 141 sub SetMinDistance { | |
| 142 my($This, $Value) = @_; | |
| 143 | |
| 144 if (!TextUtil::IsPositiveInteger($Value)) { | |
| 145 croak "Error: ${ClassName}->SetMinDistance: MinDistance value, $Value, is not valid: It must be a positive integer..."; | |
| 146 } | |
| 147 $This->{MinDistance} = $Value; | |
| 148 | |
| 149 return $This; | |
| 150 } | |
| 151 | |
| 152 # Set maximum distance for atom pairs... | |
| 153 # | |
| 154 sub SetMaxDistance { | |
| 155 my($This, $Value) = @_; | |
| 156 | |
| 157 if (!TextUtil::IsPositiveInteger($Value)) { | |
| 158 croak "Error: ${ClassName}->SetMaxDistance: MaxDistance value, $Value, is not valid: It must be a positive integer..."; | |
| 159 } | |
| 160 $This->{MaxDistance} = $Value; | |
| 161 | |
| 162 return $This; | |
| 163 } | |
| 164 | |
| 165 # Set atom identifier type.. | |
| 166 # | |
| 167 sub SetAtomIdentifierType { | |
| 168 my($This, $IdentifierType) = @_; | |
| 169 | |
| 170 if ($IdentifierType !~ /^(AtomicInvariantsAtomTypes|DREIDINGAtomTypes|EStateAtomTypes|FunctionalClassAtomTypes|MMFF94AtomTypes|SLogPAtomTypes|SYBYLAtomTypes|TPSAAtomTypes|UFFAtomTypes)$/i) { | |
| 171 croak "Error: ${ClassName}->SetAtomIdentifierType: Specified value, $IdentifierType, for AtomIdentifierType is not vaild. Supported types in current release of MayaChemTools: AtomicInvariantsAtomTypes, DREIDINGAtomTypes, EStateAtomTypes, FunctionalClassAtomTypes, MMFF94AtomTypes, SLogPAtomTypes, SYBYLAtomTypes, TPSAAtomTypes, and UFFAtomTypes."; | |
| 172 } | |
| 173 | |
| 174 if ($This->{AtomIdentifierType}) { | |
| 175 croak "Error: ${ClassName}->SeAtomIdentifierType: Can't change intial atom identifier type: It's already set..."; | |
| 176 } | |
| 177 | |
| 178 $This->{AtomIdentifierType} = $IdentifierType; | |
| 179 | |
| 180 # Initialize atom identifier type information... | |
| 181 $This->_InitializeAtomIdentifierTypeInformation(); | |
| 182 | |
| 183 return $This; | |
| 184 } | |
| 185 | |
| 186 # Generate fingerprints description... | |
| 187 # | |
| 188 sub GetDescription { | |
| 189 my($This) = @_; | |
| 190 | |
| 191 # Is description explicity set? | |
| 192 if (exists $This->{Description}) { | |
| 193 return $This->{Description}; | |
| 194 } | |
| 195 | |
| 196 # Generate fingerprints description... | |
| 197 | |
| 198 return "$This->{Type}:$This->{AtomIdentifierType}:MinDistance$This->{MinDistance}:MaxDistance$This->{MaxDistance}"; | |
| 199 } | |
| 200 | |
| 201 # Generate topological atom pairs [ Ref 57, Ref 59, Ref 72 ] fingerprints... | |
| 202 # | |
| 203 # Methodology: | |
| 204 # . Generate a distance matrix. | |
| 205 # . Assign atom types to all the atoms. | |
| 206 # . Using distance matrix and atom types, count occurrence of | |
| 207 # unique atom pairs within specified distance range - It corresponds to the | |
| 208 # correlation-vector for the atom pairs. | |
| 209 # | |
| 210 # Notes: | |
| 211 # . Hydrogen atoms are ignored during the fingerprint generation. | |
| 212 # | |
| 213 sub GenerateFingerprints { | |
| 214 my($This) = @_; | |
| 215 | |
| 216 if ($This->{MinDistance} > $This->{MaxDistance}) { | |
| 217 croak "Error: ${ClassName}->GenerateTopologicalAtomPairsFingerprints: No fingerpritns generated: MinDistance, $This->{MinDistance}, must be <= MaxDistance, $This->{MaxDistance}..."; | |
| 218 } | |
| 219 | |
| 220 # Cache appropriate molecule data... | |
| 221 $This->_SetupMoleculeDataCache(); | |
| 222 | |
| 223 # Generate distance matrix... | |
| 224 if (!$This->_SetupDistanceMatrix()) { | |
| 225 carp "Warning: ${ClassName}->GenerateFingerprints: $This->{AtomIdentifierType} fingerprints generation didn't succeed: Couldn't generate distance matrix..."; | |
| 226 return $This; | |
| 227 } | |
| 228 | |
| 229 # Assign atom types to all heavy atoms... | |
| 230 if (!$This->_AssignAtomTypes()) { | |
| 231 carp "Warning: ${ClassName}->GenerateFingerprints: $This->{AtomIdentifierType} fingerprints generation didn't succeed: Couldn't assign valid $This->{AtomIdentifierType} to all atoms..."; | |
| 232 return $This; | |
| 233 } | |
| 234 | |
| 235 # Intialize values of toplogical atom pairs... | |
| 236 $This->_InitializeToplogicalAtomPairs(); | |
| 237 | |
| 238 # Count atom pairs... | |
| 239 $This->_GenerateAndCountAtomPairs(); | |
| 240 | |
| 241 # Set final fingerprints... | |
| 242 $This->_SetFinalFingerprints(); | |
| 243 | |
| 244 # Clear cached molecule data... | |
| 245 $This->_ClearMoleculeDataCache(); | |
| 246 | |
| 247 return $This; | |
| 248 } | |
| 249 | |
| 250 # Setup distance matrix... | |
| 251 # | |
| 252 sub _SetupDistanceMatrix { | |
| 253 my($This) = @_; | |
| 254 | |
| 255 $This->{DistanceMatrix} = $This->GetMolecule()->GetDistanceMatrix(); | |
| 256 | |
| 257 if (!$This->{DistanceMatrix}) { | |
| 258 return undef; | |
| 259 } | |
| 260 | |
| 261 return $This; | |
| 262 } | |
| 263 | |
| 264 # Assign appropriate atom types to all heavy atoms... | |
| 265 # | |
| 266 sub _AssignAtomTypes { | |
| 267 my($This) = @_; | |
| 268 my($SpecifiedAtomTypes, $Atom, $AtomID, $IgnoreHydrogens); | |
| 269 | |
| 270 %{$This->{AssignedAtomTypes}} = (); | |
| 271 $IgnoreHydrogens = 1; | |
| 272 | |
| 273 $SpecifiedAtomTypes = undef; | |
| 274 | |
| 275 IDENTIFIERTYPE: { | |
| 276 if ($This->{AtomIdentifierType} =~ /^AtomicInvariantsAtomTypes$/i) { | |
| 277 $SpecifiedAtomTypes = new AtomTypes::AtomicInvariantsAtomTypes('Molecule' => $This->{Molecule}, 'IgnoreHydrogens' => $IgnoreHydrogens, 'AtomicInvariantsToUse' => $This->{AtomicInvariantsToUse}); | |
| 278 last IDENTIFIERTYPE; | |
| 279 } | |
| 280 | |
| 281 if ($This->{AtomIdentifierType} =~ /^DREIDINGAtomTypes$/i) { | |
| 282 $SpecifiedAtomTypes = new AtomTypes::DREIDINGAtomTypes('Molecule' => $This->{Molecule}, 'IgnoreHydrogens' => $IgnoreHydrogens); | |
| 283 last IDENTIFIERTYPE; | |
| 284 } | |
| 285 | |
| 286 if ($This->{AtomIdentifierType} =~ /^EStateAtomTypes$/i) { | |
| 287 $SpecifiedAtomTypes = new AtomTypes::EStateAtomTypes('Molecule' => $This->{Molecule}, 'IgnoreHydrogens' => $IgnoreHydrogens); | |
| 288 last IDENTIFIERTYPE; | |
| 289 } | |
| 290 | |
| 291 if ($This->{AtomIdentifierType} =~ /^FunctionalClassAtomTypes$/i) { | |
| 292 $SpecifiedAtomTypes = new AtomTypes::FunctionalClassAtomTypes('Molecule' => $This->{Molecule}, 'IgnoreHydrogens' => $IgnoreHydrogens, 'FunctionalClassesToUse' => $This->{FunctionalClassesToUse}); | |
| 293 last IDENTIFIERTYPE; | |
| 294 } | |
| 295 | |
| 296 if ($This->{AtomIdentifierType} =~ /^MMFF94AtomTypes$/i) { | |
| 297 $SpecifiedAtomTypes = new AtomTypes::MMFF94AtomTypes('Molecule' => $This->{Molecule}, 'IgnoreHydrogens' => $IgnoreHydrogens); | |
| 298 last IDENTIFIERTYPE; | |
| 299 } | |
| 300 | |
| 301 if ($This->{AtomIdentifierType} =~ /^SLogPAtomTypes$/i) { | |
| 302 $SpecifiedAtomTypes = new AtomTypes::SLogPAtomTypes('Molecule' => $This->{Molecule}, 'IgnoreHydrogens' => $IgnoreHydrogens); | |
| 303 last IDENTIFIERTYPE; | |
| 304 } | |
| 305 if ($This->{AtomIdentifierType} =~ /^SYBYLAtomTypes$/i) { | |
| 306 $SpecifiedAtomTypes = new AtomTypes::SYBYLAtomTypes('Molecule' => $This->{Molecule}, 'IgnoreHydrogens' => $IgnoreHydrogens); | |
| 307 last IDENTIFIERTYPE; | |
| 308 } | |
| 309 | |
| 310 if ($This->{AtomIdentifierType} =~ /^TPSAAtomTypes$/i) { | |
| 311 $SpecifiedAtomTypes = new AtomTypes::TPSAAtomTypes('Molecule' => $This->{Molecule}, 'IgnorePhosphorus' => 0, 'IgnoreSulfur' => 0); | |
| 312 last IDENTIFIERTYPE; | |
| 313 } | |
| 314 | |
| 315 if ($This->{AtomIdentifierType} =~ /^UFFAtomTypes$/i) { | |
| 316 $SpecifiedAtomTypes = new AtomTypes::UFFAtomTypes('Molecule' => $This->{Molecule}, 'IgnoreHydrogens' => $IgnoreHydrogens); | |
| 317 last IDENTIFIERTYPE; | |
| 318 } | |
| 319 | |
| 320 croak "Error: ${ClassName}->_AssignAtomTypes: Unknown atom indentifier type $This->{AtomIdentifierType}..."; | |
| 321 } | |
| 322 | |
| 323 # Assign atom types... | |
| 324 $SpecifiedAtomTypes->AssignAtomTypes(); | |
| 325 | |
| 326 # Make sure atom types assignment is successful... | |
| 327 if (!$SpecifiedAtomTypes->IsAtomTypesAssignmentSuccessful()) { | |
| 328 return undef; | |
| 329 } | |
| 330 | |
| 331 # Collect assigned atom types... | |
| 332 ATOM: for $Atom (@{$This->{Atoms}}) { | |
| 333 if ($Atom->IsHydrogen()) { | |
| 334 next ATOM; | |
| 335 } | |
| 336 $AtomID = $Atom->GetID(); | |
| 337 $This->{AssignedAtomTypes}{$AtomID} = $SpecifiedAtomTypes->GetAtomType($Atom); | |
| 338 } | |
| 339 | |
| 340 return $This; | |
| 341 } | |
| 342 | |
| 343 # Initialize topological atom pairs between specified distance range... | |
| 344 # | |
| 345 sub _InitializeToplogicalAtomPairs { | |
| 346 my($This) = @_; | |
| 347 my($Distance); | |
| 348 | |
| 349 @{$This->{AtomPairsIDs}} = (); | |
| 350 %{$This->{AtomPairsCount}} = (); | |
| 351 | |
| 352 for $Distance ($This->{MinDistance} .. $This->{MaxDistance}) { | |
| 353 %{$This->{AtomPairsCount}{$Distance}} = (); | |
| 354 } | |
| 355 | |
| 356 return $This; | |
| 357 } | |
| 358 | |
| 359 # Count atom pairs between mininum and maximum distance at each | |
| 360 # distance using distance matrix and atom types assiged to each heavy | |
| 361 # atom. | |
| 362 # | |
| 363 # Notes: | |
| 364 # . The row and column indices of distance matrix correspond to atom indices. | |
| 365 # . Distance value of BigNumber implies the atom is not connected to any other atom. | |
| 366 # . Due to symmetric nature of distance matrix, only upper or lower triangular matrix | |
| 367 # needs to be processed during identification and count of atom pairs. | |
| 368 # | |
| 369 sub _GenerateAndCountAtomPairs { | |
| 370 my($This) = @_; | |
| 371 | |
| 372 my($NumOfRows, $NumOfCols, $RowIndex, $ColIndex, $DistanceMatrix, $Distance, $AtomID1, $AtomID2, $AtomType1, $AtomType2, $SkipIndexCheck, $CountIncrement); | |
| 373 | |
| 374 $DistanceMatrix = $This->{DistanceMatrix}; | |
| 375 ($NumOfRows, $NumOfCols) = $DistanceMatrix->GetSize(); | |
| 376 $SkipIndexCheck = 0; | |
| 377 | |
| 378 ROWINDEX: for $RowIndex (0 .. ($NumOfRows - 1) ) { | |
| 379 $AtomID1 = $This->{AtomIndexToID}{$RowIndex}; | |
| 380 if ( !(exists($This->{AssignedAtomTypes}{$AtomID1})) ) { | |
| 381 next ROWINDEX; | |
| 382 } | |
| 383 $AtomType1 = $This->{AssignedAtomTypes}{$AtomID1}; | |
| 384 | |
| 385 COLINDEX: for $ColIndex (($RowIndex + 1) .. ($NumOfCols - 1) ) { | |
| 386 $AtomID2 = $This->{AtomIndexToID}{$ColIndex}; | |
| 387 if ( !(exists($This->{AssignedAtomTypes}{$AtomID2})) ) { | |
| 388 next COLINDEX; | |
| 389 } | |
| 390 $Distance = $DistanceMatrix->GetValue($RowIndex, $ColIndex, $SkipIndexCheck); | |
| 391 if ($Distance < $This->{MinDistance} || $Distance > $This->{MaxDistance}) { | |
| 392 next COLINDEX; | |
| 393 } | |
| 394 $AtomType2 = $This->{AssignedAtomTypes}{$AtomID2}; | |
| 395 | |
| 396 if ($AtomType1 le $AtomType2) { | |
| 397 $This->_SetAtomPairsCount($Distance, $AtomType1, $AtomType2); | |
| 398 } | |
| 399 else { | |
| 400 $This->_SetAtomPairsCount($Distance, $AtomType2, $AtomType1); | |
| 401 } | |
| 402 } | |
| 403 } | |
| 404 return $This; | |
| 405 } | |
| 406 | |
| 407 # Set atom paris count for a specific atom ID pair at a specific distance... | |
| 408 # | |
| 409 sub _SetAtomPairsCount { | |
| 410 my($This, $Distance, $AtomType1, $AtomType2) = @_; | |
| 411 | |
| 412 if (! exists $This->{AtomPairsCount}{$Distance}{$AtomType1}) { | |
| 413 %{$This->{AtomPairsCount}{$Distance}{$AtomType1}} = (); | |
| 414 $This->{AtomPairsCount}{$Distance}{$AtomType1}{$AtomType2} = 1; | |
| 415 return $This; | |
| 416 } | |
| 417 | |
| 418 if (exists $This->{AtomPairsCount}{$Distance}{$AtomType1}{$AtomType2}) { | |
| 419 $This->{AtomPairsCount}{$Distance}{$AtomType1}{$AtomType2} += 1; | |
| 420 } | |
| 421 else { | |
| 422 $This->{AtomPairsCount}{$Distance}{$AtomType1}{$AtomType2} = 1; | |
| 423 } | |
| 424 | |
| 425 return $This; | |
| 426 } | |
| 427 | |
| 428 # Set final fingerpritns vector... | |
| 429 # | |
| 430 sub _SetFinalFingerprints { | |
| 431 my($This) = @_; | |
| 432 my($Distance, $AtomType1, $AtomType2, $Value, @Values); | |
| 433 | |
| 434 # Mark successful generation of fingerprints... | |
| 435 $This->{FingerprintsGenerated} = 1; | |
| 436 | |
| 437 @Values = (); | |
| 438 @{$This->{AtomPairsIDs}} = (); | |
| 439 | |
| 440 for $Distance ($This->{MinDistance} .. $This->{MaxDistance}) { | |
| 441 for $AtomType1 (sort keys %{$This->{AtomPairsCount}{$Distance}} ) { | |
| 442 for $AtomType2 (sort keys %{$This->{AtomPairsCount}{$Distance}{$AtomType1}} ) { | |
| 443 push @{$This->{AtomPairsIDs}}, "${AtomType1}-D${Distance}-${AtomType2}"; | |
| 444 $Value = $This->{AtomPairsCount}{$Distance}{$AtomType1}{$AtomType2}; | |
| 445 push @Values, $Value; | |
| 446 } | |
| 447 } | |
| 448 } | |
| 449 | |
| 450 # Add AtomPairsIDs and values to fingerprint vector... | |
| 451 $This->{FingerprintsVector}->AddValueIDs(\@{$This->{AtomPairsIDs}}); | |
| 452 $This->{FingerprintsVector}->AddValues(\@Values); | |
| 453 | |
| 454 return $This; | |
| 455 } | |
| 456 | |
| 457 # Get atom pair IDs corresponding to atom pairs count values in fingerprint | |
| 458 # vector as an array or reference to an array... | |
| 459 # | |
| 460 # AtomPairIDs list differes in molecules and is generated during finalization | |
| 461 # of fingerprints to make sure the fingerprint vector containing count values | |
| 462 # matches the atom pairs array. | |
| 463 # | |
| 464 sub GetAtomPairIDs { | |
| 465 my($This) = @_; | |
| 466 | |
| 467 return wantarray ? @{$This->{AtomPairsIDs}} : \@{$This->{AtomPairsIDs}}; | |
| 468 } | |
| 469 | |
| 470 # Cache appropriate molecule data... | |
| 471 # | |
| 472 sub _SetupMoleculeDataCache { | |
| 473 my($This) = @_; | |
| 474 | |
| 475 # Get all atoms including hydrogens to correctly map atom indices to atom IDs for | |
| 476 # usage of distance matrix. The hydrogen atoms are ignored during processing... | |
| 477 # | |
| 478 @{$This->{Atoms}} = $This->GetMolecule()->GetAtoms(); | |
| 479 | |
| 480 # Get all atom IDs... | |
| 481 my(@AtomIDs); | |
| 482 @AtomIDs = (); | |
| 483 @AtomIDs = map { $_->GetID() } @{$This->{Atoms}}; | |
| 484 | |
| 485 # Set AtomIndex to AtomID hash... | |
| 486 %{$This->{AtomIndexToID}} = (); | |
| 487 @{$This->{AtomIndexToID}}{ (0 .. $#AtomIDs) } = @AtomIDs; | |
| 488 | |
| 489 return $This; | |
| 490 } | |
| 491 | |
| 492 # Clear cached molecule data... | |
| 493 # | |
| 494 sub _ClearMoleculeDataCache { | |
| 495 my($This) = @_; | |
| 496 | |
| 497 @{$This->{Atoms}} = (); | |
| 498 | |
| 499 return $This; | |
| 500 } | |
| 501 | |
| 502 # Set atomic invariants to use for atom identifiers... | |
| 503 # | |
| 504 sub SetAtomicInvariantsToUse { | |
| 505 my($This, @Values) = @_; | |
| 506 my($FirstValue, $TypeOfFirstValue, $AtomicInvariant, $SpecifiedAtomicInvariant, $AtomicInvariantValue, @SpecifiedAtomicInvariants, @AtomicInvariantsToUse); | |
| 507 | |
| 508 if (!@Values) { | |
| 509 carp "Warning: ${ClassName}->SetAtomicInvariantsToUse: No values specified..."; | |
| 510 return; | |
| 511 } | |
| 512 | |
| 513 $FirstValue = $Values[0]; | |
| 514 $TypeOfFirstValue = ref $FirstValue; | |
| 515 | |
| 516 @SpecifiedAtomicInvariants = (); | |
| 517 @AtomicInvariantsToUse = (); | |
| 518 | |
| 519 if ($TypeOfFirstValue =~ /^ARRAY/) { | |
| 520 push @SpecifiedAtomicInvariants, @{$FirstValue}; | |
| 521 } | |
| 522 else { | |
| 523 push @SpecifiedAtomicInvariants, @Values; | |
| 524 } | |
| 525 | |
| 526 # Make sure specified AtomicInvariants are valid... | |
| 527 for $SpecifiedAtomicInvariant (@SpecifiedAtomicInvariants) { | |
| 528 if (!AtomTypes::AtomicInvariantsAtomTypes::IsAtomicInvariantAvailable($SpecifiedAtomicInvariant)) { | |
| 529 croak "Error: ${ClassName}->SetAtomicInvariantsToUse: Specified atomic invariant, $SpecifiedAtomicInvariant, is not supported...\n "; | |
| 530 } | |
| 531 $AtomicInvariant = $SpecifiedAtomicInvariant; | |
| 532 push @AtomicInvariantsToUse, $AtomicInvariant; | |
| 533 } | |
| 534 | |
| 535 # Set atomic invariants to use... | |
| 536 @{$This->{AtomicInvariantsToUse}} = (); | |
| 537 push @{$This->{AtomicInvariantsToUse}}, @AtomicInvariantsToUse; | |
| 538 | |
| 539 return $This; | |
| 540 } | |
| 541 | |
| 542 # Set functional classes to use for atom identifiers... | |
| 543 # | |
| 544 sub SetFunctionalClassesToUse { | |
| 545 my($This, @Values) = @_; | |
| 546 my($FirstValue, $TypeOfFirstValue, $FunctionalClass, $SpecifiedFunctionalClass, @SpecifiedFunctionalClasses, @FunctionalClassesToUse); | |
| 547 | |
| 548 if (!@Values) { | |
| 549 carp "Warning: ${ClassName}->SetFunctionalClassesToUse: No values specified..."; | |
| 550 return; | |
| 551 } | |
| 552 | |
| 553 if ($This->{AtomIdentifierType} !~ /^FunctionalClassAtomTypes$/i) { | |
| 554 carp "Warning: ${ClassName}->SetFunctionalClassesToUse: FunctionalClassesToUse can't be set for InitialAtomIdentifierType of $This->{AtomIdentifierType}..."; | |
| 555 return; | |
| 556 } | |
| 557 | |
| 558 $FirstValue = $Values[0]; | |
| 559 $TypeOfFirstValue = ref $FirstValue; | |
| 560 | |
| 561 @SpecifiedFunctionalClasses = (); | |
| 562 @FunctionalClassesToUse = (); | |
| 563 | |
| 564 if ($TypeOfFirstValue =~ /^ARRAY/) { | |
| 565 push @SpecifiedFunctionalClasses, @{$FirstValue}; | |
| 566 } | |
| 567 else { | |
| 568 push @SpecifiedFunctionalClasses, @Values; | |
| 569 } | |
| 570 | |
| 571 # Make sure specified FunctionalClasses are valid... | |
| 572 for $SpecifiedFunctionalClass (@SpecifiedFunctionalClasses) { | |
| 573 if (!AtomTypes::FunctionalClassAtomTypes::IsFunctionalClassAvailable($SpecifiedFunctionalClass)) { | |
| 574 croak "Error: ${ClassName}->SetFunctionalClassesToUse: Specified functional class, $SpecifiedFunctionalClass, is not supported...\n "; | |
| 575 } | |
| 576 push @FunctionalClassesToUse, $SpecifiedFunctionalClass; | |
| 577 } | |
| 578 | |
| 579 # Set functional classes to use... | |
| 580 @{$This->{FunctionalClassesToUse}} = (); | |
| 581 push @{$This->{FunctionalClassesToUse}}, @FunctionalClassesToUse; | |
| 582 | |
| 583 return $This; | |
| 584 } | |
| 585 | |
| 586 # Initialize atom indentifier type information... | |
| 587 # | |
| 588 # Current supported values: | |
| 589 # | |
| 590 # AtomicInvariantsAtomTypes, DREIDINGAtomTypes, EStateAtomTypes, FunctionalClassAtomTypes, | |
| 591 # MMFF94AtomTypes, SLogPAtomTypes, SYBYLAtomTypes, TPSAAtomTypes, UFFAtomTypes | |
| 592 # | |
| 593 sub _InitializeAtomIdentifierTypeInformation { | |
| 594 my($This) = @_; | |
| 595 | |
| 596 if ($This->{AtomIdentifierType} =~ /^AtomicInvariantsAtomTypes$/i) { | |
| 597 $This->_InitializeAtomicInvariantsAtomTypesInformation(); | |
| 598 } | |
| 599 elsif ($This->{AtomIdentifierType} =~ /^FunctionalClassAtomTypes$/i) { | |
| 600 $This->_InitializeFunctionalClassAtomTypesInformation(); | |
| 601 } | |
| 602 elsif ($This->{AtomIdentifierType} =~ /^(DREIDINGAtomTypes|EStateAtomTypes|MMFF94AtomTypes|SLogPAtomTypes|SYBYLAtomTypes|TPSAAtomTypes|UFFAtomTypes)$/i) { | |
| 603 # Nothing to do for now... | |
| 604 } | |
| 605 else { | |
| 606 croak "Error: ${ClassName}->_InitializeAtomIdentifierTypeInformation: Unknown atom indentifier type $This->{AtomIdentifierType}..."; | |
| 607 } | |
| 608 | |
| 609 return $This; | |
| 610 } | |
| 611 | |
| 612 # Initialize atomic invariants atom types to use for generating atom identifiers... | |
| 613 # | |
| 614 # Let: | |
| 615 # AS = Atom symbol corresponding to element symbol | |
| 616 # | |
| 617 # X<n> = Number of non-hydrogen atom neighbors or heavy atoms attached to atom | |
| 618 # BO<n> = Sum of bond orders to non-hydrogen atom neighbors or heavy atoms attached to atom | |
| 619 # LBO<n> = Largest bond order of non-hydrogen atom neighbors or heavy atoms attached to atom | |
| 620 # SB<n> = Number of single bonds to non-hydrogen atom neighbors or heavy atoms attached to atom | |
| 621 # DB<n> = Number of double bonds to non-hydrogen atom neighbors or heavy atoms attached to atom | |
| 622 # TB<n> = Number of triple bonds to non-hydrogen atom neighbors or heavy atoms attached to atom | |
| 623 # H<n> = Number of implicit and explicit hydrogens for atom | |
| 624 # Ar = Aromatic annotation indicating whether atom is aromatic | |
| 625 # RA = Ring atom annotation indicating whether atom is a ring | |
| 626 # FC<+n/-n> = Formal charge assigned to atom | |
| 627 # MN<n> = Mass number indicating isotope other than most abundant isotope | |
| 628 # SM<n> = Spin multiplicity of atom. Possible values: 1 (singlet), 2 (doublet) or 3 (triplet) | |
| 629 # | |
| 630 # AtomTypeIDx = Atomic invariants atom type for atom x | |
| 631 # AtomTypeIDy = Atomic invariants atom type for atom y | |
| 632 # Dn = Topological distance between atom x and y | |
| 633 # | |
| 634 # Then: | |
| 635 # | |
| 636 # Atom pair AtomID generated by AtomTypes::AtomicInvariantsAtomTypes class corresponds to: | |
| 637 # | |
| 638 # AS.X<n>.BO<n>.LBO<n>.<SB><n>.<DB><n>.<TB><n>.H<n>.Ar.RA.FC<+n/-n>.MN<n>.SM<n> | |
| 639 # | |
| 640 # AtomPairID corresponds to: | |
| 641 # | |
| 642 # AtomTypeIDx-D<n>-AtomTypeIDy | |
| 643 # | |
| 644 # Except for AS which is a required atomic invariant in atom pair AtomIDs, all other atomic invariants are | |
| 645 # optional. Default atomic invariants used for AtomID are: AS, X<n>, BO<n>, H<n>, FC<+n/-n>. | |
| 646 # AtomID specification doesn't include atomic invariants with zero or undefined values. | |
| 647 # | |
| 648 # Examples of atom pair AtomIDs: | |
| 649 # | |
| 650 # O.X1.BO1.H1 - Hydroxyl oxygen in carboxylate with attached hydrogen and no explicit charge | |
| 651 # O.X1.BO1.FC-1 - Hydroxyl ozygen in carboxylate with explicit negative charge | |
| 652 # O.X1.BO2 - Carbonyl oxygen in carboxylate with double bond to carbon | |
| 653 # O.X2.BO2 - Hydroxyl ozygen in carboxylate attached to carbonyl carbon and another heavy atom | |
| 654 # | |
| 655 # C.X2.BO3.H1.Ar - Aromatic carbon | |
| 656 # | |
| 657 # Examples of AtomPairIDs: | |
| 658 # | |
| 659 # C.X2.BO2.H3-D1-O.X1.BO1 - Carbon with two heavy atom neighbors attached to oxygen at bond distance 1(methanol) | |
| 660 # | |
| 661 # C.X2.BO3.H1.Ar-D3-C.X2.BO3.H1.Ar - Two aromatic carbons at bond distance 3 where each carbon has | |
| 662 # two heavy atom neighbors and bond order of 3 (benzene) | |
| 663 # | |
| 664 sub _InitializeAtomicInvariantsAtomTypesInformation { | |
| 665 my($This) = @_; | |
| 666 | |
| 667 # Default atomic invariants to use for generating atom neighborhood atom IDs: AS, X, BO, H, FC | |
| 668 # | |
| 669 @{$This->{AtomicInvariantsToUse}} = (); | |
| 670 @{$This->{AtomicInvariantsToUse}} = ('AS', 'X', 'BO', 'H', 'FC'); | |
| 671 | |
| 672 return $This; | |
| 673 } | |
| 674 | |
| 675 # Initialize functional class atom types, generated by AtomTypes::FunctionalClassAtomTypes | |
| 676 # class, to use for generating atom identifiers... | |
| 677 # | |
| 678 # Let: | |
| 679 # HBD: HydrogenBondDonor | |
| 680 # HBA: HydrogenBondAcceptor | |
| 681 # PI : PositivelyIonizable | |
| 682 # NI : NegativelyIonizable | |
| 683 # Ar : Aromatic | |
| 684 # Hal : Halogen | |
| 685 # H : Hydrophobic | |
| 686 # RA : RingAtom | |
| 687 # CA : ChainAtom | |
| 688 # | |
| 689 # Then: | |
| 690 # | |
| 691 # Functiononal class atom type specification for an atom corresponds to: | |
| 692 # | |
| 693 # Ar.CA.H.HBA.HBD.Hal.NI.PI.RA | |
| 694 # | |
| 695 # Default functional classes used are: HBD, HBA, PI, NI, Ar, Hal | |
| 696 # | |
| 697 # FunctionalAtomTypes are assigned using the following definitions [ Ref 60-61, Ref 65-66 ]: | |
| 698 # | |
| 699 # HydrogenBondDonor: NH, NH2, OH | |
| 700 # HydrogenBondAcceptor: N[!H], O | |
| 701 # PositivelyIonizable: +, NH2 | |
| 702 # NegativelyIonizable: -, C(=O)OH, S(=O)OH, P(=O)OH | |
| 703 # | |
| 704 sub _InitializeFunctionalClassAtomTypesInformation { | |
| 705 my($This) = @_; | |
| 706 | |
| 707 # Default functional class atom typess to use for generating atom identifiers | |
| 708 # are: HBD, HBA, PI, NI, Ar, Hal | |
| 709 # | |
| 710 @{$This->{FunctionalClassesToUse}} = (); | |
| 711 @{$This->{FunctionalClassesToUse}} = ('HBD', 'HBA', 'PI', 'NI', 'Ar', 'Hal'); | |
| 712 | |
| 713 return $This; | |
| 714 } | |
| 715 | |
| 716 # Return a string containg data for TopologicalAtomPairsFingerprints object... | |
| 717 # | |
| 718 sub StringifyTopologicalAtomPairsFingerprints { | |
| 719 my($This) = @_; | |
| 720 my($FingerprintsString); | |
| 721 | |
| 722 # Type of fingerprint... | |
| 723 $FingerprintsString = "Fingerprint type: $This->{Type}; AtomIdentifierType: $This->{AtomIdentifierType}"; | |
| 724 | |
| 725 # Min and max distance... | |
| 726 $FingerprintsString .= "; MinDistance: $This->{MinDistance}; MaxDistance: $This->{MaxDistance}"; | |
| 727 | |
| 728 if ($This->{AtomIdentifierType} =~ /^AtomicInvariantsAtomTypes$/i) { | |
| 729 my($AtomicInvariant, @AtomicInvariants, @AtomicInvariantsOrder, %AvailableAtomicInvariants); | |
| 730 | |
| 731 @AtomicInvariantsOrder = AtomTypes::AtomicInvariantsAtomTypes::GetAtomicInvariantsOrder(); | |
| 732 %AvailableAtomicInvariants = AtomTypes::AtomicInvariantsAtomTypes::GetAvailableAtomicInvariants(); | |
| 733 | |
| 734 for $AtomicInvariant (@AtomicInvariantsOrder) { | |
| 735 push @AtomicInvariants, "$AtomicInvariant: $AvailableAtomicInvariants{$AtomicInvariant}"; | |
| 736 } | |
| 737 | |
| 738 $FingerprintsString .= "; AtomicInvariantsToUse: <" . TextUtil::JoinWords(\@{$This->{AtomicInvariantsToUse}}, ", ", 0) . ">"; | |
| 739 $FingerprintsString .= "; AtomicInvariantsOrder: <" . TextUtil::JoinWords(\@AtomicInvariantsOrder, ", ", 0) . ">"; | |
| 740 $FingerprintsString .= "; AvailableAtomicInvariants: <" . TextUtil::JoinWords(\@AtomicInvariants, ", ", 0) . ">"; | |
| 741 } | |
| 742 elsif ($This->{AtomIdentifierType} =~ /^FunctionalClassAtomTypes$/i) { | |
| 743 my($FunctionalClass, @FunctionalClasses, @FunctionalClassesOrder, %AvailableFunctionalClasses); | |
| 744 | |
| 745 @FunctionalClassesOrder = AtomTypes::FunctionalClassAtomTypes::GetFunctionalClassesOrder(); | |
| 746 %AvailableFunctionalClasses = AtomTypes::FunctionalClassAtomTypes::GetAvailableFunctionalClasses(); | |
| 747 | |
| 748 for $FunctionalClass (@FunctionalClassesOrder) { | |
| 749 push @FunctionalClasses, "$FunctionalClass: $AvailableFunctionalClasses{$FunctionalClass}"; | |
| 750 } | |
| 751 | |
| 752 $FingerprintsString .= "; FunctionalClassesToUse: <" . TextUtil::JoinWords(\@{$This->{FunctionalClassesToUse}}, ", ", 0) . ">"; | |
| 753 $FingerprintsString .= "; FunctionalClassesOrder: <" . TextUtil::JoinWords(\@FunctionalClassesOrder, ", ", 0) . ">"; | |
| 754 $FingerprintsString .= "; AvailableFunctionalClasses: <" . TextUtil::JoinWords(\@FunctionalClasses, ", ", 0) . ">"; | |
| 755 } | |
| 756 | |
| 757 # Total number of atom pairs... | |
| 758 $FingerprintsString .= "; NumOfAtomPairs: " . $This->{FingerprintsVector}->GetNumOfValues(); | |
| 759 | |
| 760 # FingerprintsVector... | |
| 761 $FingerprintsString .= "; FingerprintsVector: < $This->{FingerprintsVector} >"; | |
| 762 | |
| 763 return $FingerprintsString; | |
| 764 } | |
| 765 | |
| 766 1; | |
| 767 | |
| 768 __END__ | |
| 769 | |
| 770 =head1 NAME | |
| 771 | |
| 772 TopologicalAtomPairsFingerprints | |
| 773 | |
| 774 =head1 SYNOPSIS | |
| 775 | |
| 776 use Fingerprints::TopologicalAtomPairsFingerprints; | |
| 777 | |
| 778 use Fingerprints::TopologicalAtomPairsFingerprints qw(:all); | |
| 779 | |
| 780 =head1 DESCRIPTION | |
| 781 | |
| 782 B<TopologicalAtomPairsFingerprints> [ Ref 57, Ref 59, Ref 72 ] class provides the following methods: | |
| 783 | |
| 784 new, GenerateFingerprints, GetAtomPairIDs, GetDescription, SetAtomIdentifierType, | |
| 785 SetAtomicInvariantsToUse, SetFunctionalClassesToUse, SetMaxDistance, | |
| 786 SetMinDistance, StringifyTopologicalAtomPairsFingerprints | |
| 787 | |
| 788 B<TopologicalAtomPairsFingerprints> is derived from B<Fingerprints> class which in turn | |
| 789 is derived from B<ObjectProperty> base class that provides methods not explicitly defined | |
| 790 in B<TopologicalAtomPairsFingerprints>, B<Fingerprints> or B<ObjectProperty> classes using Perl's | |
| 791 AUTOLOAD functionality. These methods are generated on-the-fly for a specified object property: | |
| 792 | |
| 793 Set<PropertyName>(<PropertyValue>); | |
| 794 $PropertyValue = Get<PropertyName>(); | |
| 795 Delete<PropertyName>(); | |
| 796 | |
| 797 The current release of MayaChemTools supports generation of B<AtomTypesFingerpritns> | |
| 798 corresponding to following B<AtomtomIdentifierTypes>: | |
| 799 | |
| 800 AtomicInvariantsAtomTypes, DREIDINGAtomTypes, EStateAtomTypes, | |
| 801 FunctionalClassAtomTypes, MMFF94AtomTypes, SLogPAtomTypes, | |
| 802 SYBYLAtomTypes, TPSAAtomTypes, UFFAtomTypes | |
| 803 | |
| 804 Based on the values specified for B<AtomIdentifierType> along with other specified | |
| 805 parameters such as B<AtomicInvariantsToUse> and B<FunctionalClassesToUse>, initial | |
| 806 atom types are assigned to all non-hydrogen atoms in a molecule. Using the distance | |
| 807 matrix for the molecule and initial atom types assigned to non-hydrogen atoms, all unique atom | |
| 808 pairs within B<MinDistance> and B<MaxDistance> are identified and counted. An atom pair | |
| 809 identifier is generated for each unique atom pair; the format of atom pair identifier is: | |
| 810 | |
| 811 <AtomType1>-D<n>-<AtomType2> | |
| 812 | |
| 813 AtomType1, AtomType2: Atom types assigned to atom1 and atom2 | |
| 814 D: Distance between atom1 and atom2 | |
| 815 | |
| 816 where AtomType1 <= AtomType2 | |
| 817 | |
| 818 The atom pair identifiers for all unique atom pairs corresponding to non-hydrogen atoms constitute | |
| 819 topological atom pairs fingerprints of the molecule. | |
| 820 | |
| 821 The current release of MayaChemTools generates the following types of topological atom pairs | |
| 822 fingerprints vector strings: | |
| 823 | |
| 824 FingerprintsVector;TopologicalAtomPairs:AtomicInvariantsAtomTypes:MinD | |
| 825 istance1:MaxDistance10;223;NumericalValues;IDsAndValuesString;C.X1.BO1 | |
| 826 .H3-D1-C.X3.BO3.H1 C.X2.BO2.H2-D1-C.X2.BO2.H2 C.X2.BO2.H2-D1-C.X3.BO3. | |
| 827 H1 C.X2.BO2.H2-D1-C.X3.BO4 C.X2.BO2.H2-D1-N.X3.BO3 C.X2.BO3.H1-D1-...; | |
| 828 2 1 4 1 1 10 8 1 2 6 1 2 2 1 2 1 2 2 1 2 1 5 1 10 12 2 2 1 2 1 9 1 3 1 | |
| 829 1 1 2 2 1 3 6 1 6 14 2 2 2 3 1 3 1 8 2 2 1 3 2 6 1 2 2 5 1 3 1 23 1... | |
| 830 | |
| 831 FingerprintsVector;TopologicalAtomPairs:AtomicInvariantsAtomTypes:MinD | |
| 832 istance1:MaxDistance10;223;NumericalValues;IDsAndValuesPairsString;C.X | |
| 833 1.BO1.H3-D1-C.X3.BO3.H1 2 C.X2.BO2.H2-D1-C.X2.BO2.H2 1 C.X2.BO2.H2-D1- | |
| 834 C.X3.BO3.H1 4 C.X2.BO2.H2-D1-C.X3.BO4 1 C.X2.BO2.H2-D1-N.X3.BO3 1 C.X2 | |
| 835 .BO3.H1-D1-C.X2.BO3.H1 10 C.X2.BO3.H1-D1-C.X3.BO4 8 C.X3.BO3.H1-D1-C.X | |
| 836 3.BO4 1 C.X3.BO3.H1-D1-O.X1.BO1.H1 2 C.X3.BO4-D1-C.X3.BO4 6 C.X3.BO... | |
| 837 | |
| 838 FingerprintsVector;TopologicalAtomPairs:DREIDINGAtomTypes:MinDistance1 | |
| 839 :MaxDistance10;157;NumericalValues;IDsAndValuesString;C_2-D1-C_3 C_2-D | |
| 840 1-C_R C_2-D1-N_3 C_2-D1-O_2 C_2-D1-O_3 C_3-D1-C_3 C_3-D1-C_R C_3-D1-N_ | |
| 841 R C_3-D1-O_3 C_R-D1-C_R C_R-D1-F_ C_R-D1-N_3 C_R-D1-N_R C_2-D2-C_3 C_2 | |
| 842 1 1 1 2 1 7 1 1 2 23 1 1 2 1 3 5 5 2 1 5 28 2 3 3 1 1 1 2 4 1 1 4 9 3 | |
| 843 1 4 24 2 4 3 3 4 5 5 14 1 1 2 3 22 1 3 4 4 1 1 1 1 2 2 5 1 4 21 3 1... | |
| 844 | |
| 845 FingerprintsVector;TopologicalAtomPairs:EStateAtomTypes:MinDistance1:M | |
| 846 axDistance10;251;NumericalValues;IDsAndValuesString;aaCH-D1-aaCH aaCH- | |
| 847 D1-aasC aasC-D1-aasC aasC-D1-aasN aasC-D1-dssC aasC-D1-sF aasC-D1-ssNH | |
| 848 aasC-D1-sssCH aasN-D1-ssCH2 dO-D1-dssC dssC-D1-sOH dssC-D1-ssCH2 d...; | |
| 849 10 8 5 2 1 1 1 1 1 2 1 1 1 2 2 1 4 10 12 2 2 6 3 1 3 2 2 1 1 1 1 1 1 1 | |
| 850 1 1 5 2 1 1 6 12 2 2 2 2 6 1 3 2 2 5 2 2 1 2 1 1 1 1 1 1 3 1 3 19 2... | |
| 851 | |
| 852 FingerprintsVector;TopologicalAtomPairs:FunctionalClassAtomTypes:MinDi | |
| 853 stance1:MaxDistance10;144;NumericalValues;IDsAndValuesString;Ar-D1-Ar | |
| 854 Ar-D1-Ar.HBA Ar-D1-HBD Ar-D1-Hal Ar-D1-None Ar.HBA-D1-None HBA-D1-NI H | |
| 855 BA-D1-None HBA.HBD-D1-NI HBA.HBD-D1-None HBD-D1-None NI-D1-None No...; | |
| 856 23 2 1 1 2 1 1 1 1 2 1 1 7 28 3 1 3 2 8 2 1 1 1 5 1 5 24 3 3 4 2 13 4 | |
| 857 1 1 4 1 5 22 4 4 3 1 19 1 1 1 1 1 2 2 3 1 1 8 25 4 5 2 3 1 26 1 4 1 ... | |
| 858 | |
| 859 FingerprintsVector;TopologicalAtomPairs:MMFF94AtomTypes:MinDistance1:M | |
| 860 axDistance10;227;NumericalValues;IDsAndValuesPairsString;C5A-D1-C5B 2 | |
| 861 C5A-D1-CB 1 C5A-D1-CR 1 C5A-D1-N5 2 C5B-D1-C5B 1 C5B-D1-C=ON 1 C5B-D1- | |
| 862 CB 1 C=ON-D1-NC=O 1 C=ON-D1-O=CN 1 CB-D1-CB 18 CB-D1-F 1 CB-D1-NC=O 1 | |
| 863 COO-D1-CR 1 COO-D1-O=CO 1 COO-D1-OC=O 1 CR-D1-CR 7 CR-D1-N5 1 CR-D1-OR | |
| 864 2 C5A-D2-C5A 1 C5A-D2-C5B 2 C5A-D2-C=ON 1 C5A-D2-CB 3 C5A-D2-CR 4 ... | |
| 865 | |
| 866 FingerprintsVector;TopologicalAtomPairs:SLogPAtomTypes:MinDistance1:Ma | |
| 867 xDistance10;329;NumericalValues;IDsAndValuesPairsString;C1-D1-C10 1 C1 | |
| 868 -D1-C11 2 C1-D1-C5 1 C1-D1-CS 4 C10-D1-N11 1 C11-D1-C21 1 C14-D1-C18 2 | |
| 869 C14-D1-F 1 C18-D1-C18 10 C18-D1-C20 4 C18-D1-C22 2 C20-D1-C20 3 C20-D | |
| 870 1-C21 1 C20-D1-N11 1 C21-D1-C21 1 C21-D1-C5 1 C21-D1-N11 1 C22-D1-N4 1 | |
| 871 C5-D1-N4 1 C5-D1-O10 1 C5-D1-O2 1 C5-D1-O9 1 CS-D1-O2 2 C1-D2-C1 3... | |
| 872 | |
| 873 FingerprintsVector;TopologicalAtomPairs:SYBYLAtomTypes:MinDistance1:Ma | |
| 874 xDistance10;159;NumericalValues;IDsAndValuesPairsString;C.2-D1-C.3 1 C | |
| 875 .2-D1-C.ar 1 C.2-D1-N.am 1 C.2-D1-O.2 1 C.2-D1-O.co2 2 C.3-D1-C.3 7 C. | |
| 876 3-D1-C.ar 1 C.3-D1-N.ar 1 C.3-D1-O.3 2 C.ar-D1-C.ar 23 C.ar-D1-F 1 C.a | |
| 877 r-D1-N.am 1 C.ar-D1-N.ar 2 C.2-D2-C.3 1 C.2-D2-C.ar 3 C.3-D2-C.3 5 C.3 | |
| 878 -D2-C.ar 5 C.3-D2-N.ar 2 C.3-D2-O.3 4 C.3-D2-O.co2 2 C.ar-D2-C.ar 2... | |
| 879 | |
| 880 FingerprintsVector;TopologicalAtomPairs:TPSAAtomTypes:MinDistance1:Max | |
| 881 Distance10;64;NumericalValues;IDsAndValuesPairsString;N21-D1-None 3 N7 | |
| 882 -D1-None 2 None-D1-None 34 None-D1-O3 2 None-D1-O4 3 N21-D2-None 5 N7- | |
| 883 D2-None 3 N7-D2-O3 1 None-D2-None 44 None-D2-O3 2 None-D2-O4 5 O3-D2-O | |
| 884 4 1 N21-D3-None 7 N7-D3-None 4 None-D3-None 45 None-D3-O3 4 None-D3-O4 | |
| 885 5 N21-D4-N7 1 N21-D4-None 5 N21-D4-O3 1 N21-D4-O4 1 N7-D4-None 4 N... | |
| 886 | |
| 887 FingerprintsVector;TopologicalAtomPairs:UFFAtomTypes:MinDistance1:MaxD | |
| 888 istance10;157;NumericalValues;IDsAndValuesPairsString;C_2-D1-C_3 1 C_2 | |
| 889 -D1-C_R 1 C_2-D1-N_3 1 C_2-D1-O_2 2 C_2-D1-O_3 1 C_3-D1-C_3 7 C_3-D1-C | |
| 890 _R 1 C_3-D1-N_R 1 C_3-D1-O_3 2 C_R-D1-C_R 23 C_R-D1-F_ 1 C_R-D1-N_3 1 | |
| 891 C_R-D1-N_R 2 C_2-D2-C_3 1 C_2-D2-C_R 3 C_3-D2-C_3 5 C_3-D2-C_R 5 C_3-D | |
| 892 2-N_R 2 C_3-D2-O_2 1 C_3-D2-O_3 5 C_R-D2-C_R 28 C_R-D2-F_ 2 C_R-D2-... | |
| 893 | |
| 894 =head2 METHODS | |
| 895 | |
| 896 =over 4 | |
| 897 | |
| 898 =item B<new> | |
| 899 | |
| 900 $NewTopologicalAtomPairsFingerprints = new TopologicalAtomPairsFingerprints( | |
| 901 %NamesAndValues); | |
| 902 | |
| 903 Using specified I<TopologicalAtomPairsFingerprints> property names and values hash, B<new> | |
| 904 method creates a new object and returns a reference to newly created B<TopologicalAtomPairsFingerprints> | |
| 905 object. By default, the following properties are initialized: | |
| 906 | |
| 907 Molecule = '' | |
| 908 Type = 'TopologicalAtomPairs' | |
| 909 MinDistance = 1 | |
| 910 MaxDistance = 10 | |
| 911 AtomIdentifierType = '' | |
| 912 AtomicInvariantsToUse = ['AS', 'X', 'BO', 'H', 'FC'] | |
| 913 FunctionalClassesToUse = ['HBD', 'HBA', 'PI', 'NI', 'Ar', 'Hal'] | |
| 914 | |
| 915 Examples: | |
| 916 | |
| 917 $TopologicalAtomPairsFingerprints = new TopologicalAtomPairsFingerprints( | |
| 918 'Molecule' => $Molecule, | |
| 919 'AtomIdentifierType' => | |
| 920 'AtomicInvariantsAtomTypes'); | |
| 921 | |
| 922 $TopologicalAtomPairsFingerprints = new TopologicalAtomPairsFingerprints( | |
| 923 'Molecule' => $Molecule, | |
| 924 'MinDistance' => 1, | |
| 925 'MaxDistance' => 10, | |
| 926 'AtomIdentifierType' => | |
| 927 'AtomicInvariantsAtomTypes', | |
| 928 'AtomicInvariantsToUse' => | |
| 929 ['AS', 'X', 'BO', 'H', 'FC'] ); | |
| 930 | |
| 931 $TopologicalAtomPairsFingerprints = new TopologicalAtomPairsFingerprints( | |
| 932 'Molecule' => $Molecule, | |
| 933 'AtomIdentifierType' => | |
| 934 'EStateAtomTypes'); | |
| 935 | |
| 936 $TopologicalAtomPairsFingerprints = new TopologicalAtomPairsFingerprints( | |
| 937 'Molecule' => $Molecule, | |
| 938 'AtomIdentifierType' => | |
| 939 'SLogPAtomTypes'); | |
| 940 | |
| 941 $TopologicalAtomPairsFingerprints = new TopologicalAtomPairsFingerprints( | |
| 942 'Molecule' => $Molecule, | |
| 943 'MinDistance' => 1, | |
| 944 'MaxDistance' => 10, | |
| 945 'AtomIdentifierType' => | |
| 946 'FunctionalClassAtomTypes', | |
| 947 'FunctionalClassesToUse' => | |
| 948 ['HBD', 'HBA', 'PI', 'NI', 'Ar', 'Hal']); | |
| 949 | |
| 950 | |
| 951 $TopologicalAtomPairsFingerprints->GenerateFingerprints(); | |
| 952 print "$TopologicalAtomPairsFingerprints\n"; | |
| 953 | |
| 954 =item B<GetDescription> | |
| 955 | |
| 956 $Description = $TopologicalAtomPairsFingerprints->GetDescription(); | |
| 957 | |
| 958 Returns a string containing description of topological atom pairs fingerprints fingerprints. | |
| 959 | |
| 960 =item B<GenerateFingerprints> | |
| 961 | |
| 962 $TopologicalAtomPairsFingerprints->GenerateFingerprints(); | |
| 963 | |
| 964 Generates topological atom pairs fingerprints and returns I<TopologicalAtomPairsFingerprints>. | |
| 965 | |
| 966 =item B<GetAtomPairIDs> | |
| 967 | |
| 968 $AtomPairIDsRef = $TopologicalAtomPairsFingerprints->GetAtomPairIDs(); | |
| 969 @AtomPairIDs = $TopologicalAtomPairsFingerprints->GetAtomPairIDs(); | |
| 970 | |
| 971 Returns atom pair IDs corresponding to atom pairs count values in topological atom pairs | |
| 972 fingerprints vector as an array or reference to an array. | |
| 973 | |
| 974 =item B<SetAtomIdentifierType> | |
| 975 | |
| 976 $TopologicalAtomPairsFingerprints->SetAtomIdentifierType($IdentifierType); | |
| 977 | |
| 978 Sets atom I<IdentifierType> to use during atom pairs fingerprints generation and | |
| 979 returns I<TopologicalAtomPairsFingerprints>. | |
| 980 | |
| 981 Possible values: I<AtomicInvariantsAtomTypes, DREIDINGAtomTypes, EStateAtomTypes, | |
| 982 FunctionalClassAtomTypes, MMFF94AtomTypes, SLogPAtomTypes, SYBYLAtomTypes, | |
| 983 TPSAAtomTypes, UFFAtomTypes>. | |
| 984 | |
| 985 =item B<SetAtomicInvariantsToUse> | |
| 986 | |
| 987 $TopologicalAtomPairsFingerprints->SetAtomicInvariantsToUse($ValuesRef); | |
| 988 $TopologicalAtomPairsFingerprints->SetAtomicInvariantsToUse(@Values); | |
| 989 | |
| 990 Sets atomic invariants to use during I<AtomicInvariantsAtomTypes> value of I<AtomIdentifierType> | |
| 991 for topological atom pairs fingerprints generation and returns I<TopologicalAtomPairsFingerprints>. | |
| 992 | |
| 993 Possible values for atomic invariants are: I<AS, X, BO, LBO, SB, DB, TB, | |
| 994 H, Ar, RA, FC, MN, SM>. Default value: I<AS,X,BO,H,FC>. | |
| 995 | |
| 996 The atomic invariants abbreviations correspond to: | |
| 997 | |
| 998 AS = Atom symbol corresponding to element symbol | |
| 999 | |
| 1000 X<n> = Number of non-hydrogen atom neighbors or heavy atoms | |
| 1001 BO<n> = Sum of bond orders to non-hydrogen atom neighbors or heavy atoms | |
| 1002 LBO<n> = Largest bond order of non-hydrogen atom neighbors or heavy atoms | |
| 1003 SB<n> = Number of single bonds to non-hydrogen atom neighbors or heavy atoms | |
| 1004 DB<n> = Number of double bonds to non-hydrogen atom neighbors or heavy atoms | |
| 1005 TB<n> = Number of triple bonds to non-hydrogen atom neighbors or heavy atoms | |
| 1006 H<n> = Number of implicit and explicit hydrogens for atom | |
| 1007 Ar = Aromatic annotation indicating whether atom is aromatic | |
| 1008 RA = Ring atom annotation indicating whether atom is a ring | |
| 1009 FC<+n/-n> = Formal charge assigned to atom | |
| 1010 MN<n> = Mass number indicating isotope other than most abundant isotope | |
| 1011 SM<n> = Spin multiplicity of atom. Possible values: 1 (singlet), 2 (doublet) or | |
| 1012 3 (triplet) | |
| 1013 | |
| 1014 Atom type generated by AtomTypes::AtomicInvariantsAtomTypes class corresponds to: | |
| 1015 | |
| 1016 AS.X<n>.BO<n>.LBO<n>.<SB><n>.<DB><n>.<TB><n>.H<n>.Ar.RA.FC<+n/-n>.MN<n>.SM<n> | |
| 1017 | |
| 1018 Except for AS which is a required atomic invariant in atom types, all other atomic invariants are | |
| 1019 optional. Atom type specification doesn't include atomic invariants with zero or undefined values. | |
| 1020 | |
| 1021 In addition to usage of abbreviations for specifying atomic invariants, the following descriptive words | |
| 1022 are also allowed: | |
| 1023 | |
| 1024 X : NumOfNonHydrogenAtomNeighbors or NumOfHeavyAtomNeighbors | |
| 1025 BO : SumOfBondOrdersToNonHydrogenAtoms or SumOfBondOrdersToHeavyAtoms | |
| 1026 LBO : LargestBondOrderToNonHydrogenAtoms or LargestBondOrderToHeavyAtoms | |
| 1027 SB : NumOfSingleBondsToNonHydrogenAtoms or NumOfSingleBondsToHeavyAtoms | |
| 1028 DB : NumOfDoubleBondsToNonHydrogenAtoms or NumOfDoubleBondsToHeavyAtoms | |
| 1029 TB : NumOfTripleBondsToNonHydrogenAtoms or NumOfTripleBondsToHeavyAtoms | |
| 1030 H : NumOfImplicitAndExplicitHydrogens | |
| 1031 Ar : Aromatic | |
| 1032 RA : RingAtom | |
| 1033 FC : FormalCharge | |
| 1034 MN : MassNumber | |
| 1035 SM : SpinMultiplicity | |
| 1036 | |
| 1037 I<AtomTypes::AtomicInvariantsAtomTypes> module is used to assign atomic invariant | |
| 1038 atom types. | |
| 1039 | |
| 1040 =item B<SetFunctionalClassesToUse> | |
| 1041 | |
| 1042 $TopologicalAtomPairsFingerprints->SetFunctionalClassesToUse($ValuesRef); | |
| 1043 $TopologicalAtomPairsFingerprints->SetFunctionalClassesToUse(@Values); | |
| 1044 | |
| 1045 Sets functional classes invariants to use during I<FunctionalClassAtomTypes> value of I<AtomIdentifierType> | |
| 1046 for topological atom pairs fingerprints generation and returns I<TopologicalAtomPairsFingerprints>. | |
| 1047 | |
| 1048 Possible values for atom functional classes are: I<Ar, CA, H, HBA, HBD, Hal, NI, PI, RA>. | |
| 1049 Default value [ Ref 24 ]: I<HBD,HBA,PI,NI,Ar,Hal>. | |
| 1050 | |
| 1051 The functional class abbreviations correspond to: | |
| 1052 | |
| 1053 HBD: HydrogenBondDonor | |
| 1054 HBA: HydrogenBondAcceptor | |
| 1055 PI : PositivelyIonizable | |
| 1056 NI : NegativelyIonizable | |
| 1057 Ar : Aromatic | |
| 1058 Hal : Halogen | |
| 1059 H : Hydrophobic | |
| 1060 RA : RingAtom | |
| 1061 CA : ChainAtom | |
| 1062 | |
| 1063 Functional class atom type specification for an atom corresponds to: | |
| 1064 | |
| 1065 Ar.CA.H.HBA.HBD.Hal.NI.PI.RA or None | |
| 1066 | |
| 1067 I<AtomTypes::FunctionalClassAtomTypes> module is used to assign functional class atom | |
| 1068 types. It uses following definitions [ Ref 60-61, Ref 65-66 ]: | |
| 1069 | |
| 1070 HydrogenBondDonor: NH, NH2, OH | |
| 1071 HydrogenBondAcceptor: N[!H], O | |
| 1072 PositivelyIonizable: +, NH2 | |
| 1073 NegativelyIonizable: -, C(=O)OH, S(=O)OH, P(=O)OH | |
| 1074 | |
| 1075 =item B<SetMaxDistance> | |
| 1076 | |
| 1077 $TopologicalAtomPairsFingerprints->SetMaxDistance($Distance); | |
| 1078 | |
| 1079 Sets maximum distance to use during topological atom pairs fingerprints generation and | |
| 1080 returns I<TopologicalAtomPairsFingerprints>. | |
| 1081 | |
| 1082 =item B<SetMinDistance> | |
| 1083 | |
| 1084 $TopologicalAtomPairsFingerprints->SetMinDistance($Distance); | |
| 1085 | |
| 1086 Sets minimum distance to use during topological atom pairs fingerprints generation and | |
| 1087 returns I<TopologicalAtomPairsFingerprints>. | |
| 1088 | |
| 1089 =item B<StringifyTopologicalAtomPairsFingerprints> | |
| 1090 | |
| 1091 $String = $TopologicalAtomPairsFingerprints-> | |
| 1092 StringifyTopologicalAtomPairsFingerprints(); | |
| 1093 | |
| 1094 Returns a string containing information about I<TopologicalAtomPairsFingerprints> object. | |
| 1095 | |
| 1096 =back | |
| 1097 | |
| 1098 =head1 AUTHOR | |
| 1099 | |
| 1100 Manish Sud <msud@san.rr.com> | |
| 1101 | |
| 1102 =head1 SEE ALSO | |
| 1103 | |
| 1104 Fingerprints.pm, FingerprintsStringUtil.pm, AtomNeighborhoodsFingerprints.pm, | |
| 1105 AtomTypesFingerprints.pm, EStateIndiciesFingerprints.pm, ExtendedConnectivityFingerprints.pm, | |
| 1106 MACCSKeys.pm, PathLengthFingerprints.pm, TopologicalAtomTripletsFingerprints.pm, | |
| 1107 TopologicalAtomTorsionsFingerprints.pm, TopologicalPharmacophoreAtomPairsFingerprints.pm, | |
| 1108 TopologicalPharmacophoreAtomTripletsFingerprints.pm | |
| 1109 | |
| 1110 =head1 COPYRIGHT | |
| 1111 | |
| 1112 Copyright (C) 2015 Manish Sud. All rights reserved. | |
| 1113 | |
| 1114 This file is part of MayaChemTools. | |
| 1115 | |
| 1116 MayaChemTools is free software; you can redistribute it and/or modify it under | |
| 1117 the terms of the GNU Lesser General Public License as published by the Free | |
| 1118 Software Foundation; either version 3 of the License, or (at your option) | |
| 1119 any later version. | |
| 1120 | |
| 1121 =cut |
