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