0
|
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
|