comparison lib/Fingerprints/MACCSKeys.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::MACCSKeys;
2 #
3 # $RCSfile: MACCSKeys.pm,v $
4 # $Date: 2015/02/28 20:48:54 $
5 # $Revision: 1.33 $
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 PeriodicTable;
36
37 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
38
39 @ISA = qw(Fingerprints::Fingerprints Exporter);
40 @EXPORT = qw();
41 @EXPORT_OK = qw();
42
43 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]);
44
45 # Setup class variables...
46 my($ClassName);
47 _InitializeClass();
48
49 # Overload Perl functions...
50 use overload '""' => 'StringifyMACCSKeys';
51
52 # Class constructor...
53 sub new {
54 my($Class, %NamesAndValues) = @_;
55
56 # Initialize object...
57 my $This = $Class->SUPER::new();
58 bless $This, ref($Class) || $Class;
59 $This->_InitializeMACCSKeys();
60
61 $This->_InitializeMACCSKeysProperties(%NamesAndValues);
62
63 return $This;
64 }
65
66 # Initialize object data...
67 #
68 sub _InitializeMACCSKeys {
69 my($This) = @_;
70
71 # Type of fingerprint to generate:
72 #
73 # MACCSKeyBits - A bit vector indicating presence/absence of keys
74 # MACCSKeyCount - A vector containing count of keys
75 #
76 $This->{Type} = '';
77 $This->{KeyBits} = '';
78
79 # Size of key set: 166 or 322...
80 $This->{Size} = '';
81 }
82
83 # Initialize class ...
84 sub _InitializeClass {
85 #Class name...
86 $ClassName = __PACKAGE__;
87 }
88
89 # Initialize object properties....
90 sub _InitializeMACCSKeysProperties {
91 my($This, %NamesAndValues) = @_;
92
93 my($Name, $Value, $MethodName);
94 while (($Name, $Value) = each %NamesAndValues) {
95 $MethodName = "Set${Name}";
96 $This->$MethodName($Value);
97 }
98
99 # Make sure molecule object was specified...
100 if (!exists $NamesAndValues{Molecule}) {
101 croak "Error: ${ClassName}->New: Object can't be instantiated without specifying molecule...";
102 }
103
104 # Make sure type and size were specified...
105 if (!exists $NamesAndValues{Type}) {
106 croak "Error: ${ClassName}->New: Object can't be instantiated without specifying type...";
107 }
108 if (!exists $NamesAndValues{Size}) {
109 croak "Error: ${ClassName}->New: Object can't be instantiated without specifying size...";
110 }
111
112 # Make sure approriate size is specified...
113 if ($NamesAndValues{Size} !~ /^(166|322)$/) {
114 croak "Error: ${ClassName}->New: The current release of MayaChemTools doesn't support MDL MACCS $NamesAndValues{Size} keys...";
115 }
116
117 if ($This->{Type} =~ /^MACCSKeyBits$/i) {
118 $This->_InitializeMACCSKeyBits();
119 }
120 elsif ($This->{Type} =~ /^MACCSKeyCount$/i) {
121 $This->_InitializeMACCSKeyCounts();
122 }
123 else {
124 croak "Error: ${ClassName}->_InitializeMACCSKeysProperties: Unknown MACCS keys type: $This->{Type}; Supported type keys: MACCSKeyBits or MACCSKeyCount......";
125 }
126
127 return $This;
128 }
129
130 # Initialize MACCS key bits...
131 #
132 sub _InitializeMACCSKeyBits {
133 my($This) = @_;
134
135 $This->{KeyBits} = 1;
136
137 # Vector type...
138 $This->{VectorType} = 'FingerprintsBitVector';
139
140 $This->_InitializeFingerprintsBitVector();
141
142 return $This;
143 }
144
145 # Initialize MACCS key counts...
146 #
147 sub _InitializeMACCSKeyCounts {
148 my($This) = @_;
149
150 $This->{KeyBits} = 0;
151
152 # Vector type and type of values...
153 $This->{VectorType} = 'FingerprintsVector';
154 $This->{FingerprintsVectorType} = 'OrderedNumericalValues';
155
156 $This->_InitializeFingerprintsVector();
157
158 # Initialize values to zero...
159 my(@Values);
160 @Values = (0) x $This->{Size};
161 $This->{FingerprintsVector}->AddValues(\@Values);
162
163 return $This;
164 }
165
166 # Set type...
167 #
168 sub SetType {
169 my($This, $Type) = @_;
170
171 if ($This->{Type}) {
172 croak "Error: ${ClassName}->SetType: Can't change type: It's already set...";
173 }
174
175 if ($Type =~ /^MACCSKeyBits$/i) {
176 $This->{Type} = 'MACCSKeyBits';;
177 $This->{KeyBits} = 1;
178 }
179 elsif ($Type =~ /^MACCSKeyCount$/i) {
180 $This->{Type} = 'MACCSKeyCount';;
181 $This->{KeyBits} = 0;
182 }
183 else {
184 croak "Error: ${ClassName}->SetType: Unknown type MACCS keys: $Type; Supported type keys: MACCSKeyBits or MACCSKeyCount...";
185 }
186 return $This;
187 }
188
189 # Set size...
190 #
191 sub SetSize {
192 my($This, $Value) = @_;
193
194 if ($This->{Size}) {
195 croak "Error: ${ClassName}->SetSize: Can't change size: It's already set...";
196 }
197 if (!TextUtil::IsPositiveInteger($Value)) {
198 croak "Error: ${ClassName}->SetSize: Size value, $Value, is not valid: It must be a positive integer...";
199 }
200 if ($Value !~ /^(166|322)/i) {
201 croak "Error: ${ClassName}->Size: The current release of MayaChemTools doesn't support MDL MACCS $Value keys...";
202 }
203 $This->{Size} = $Value;
204
205 return $This;
206 }
207
208 # Generate description...
209 #
210 sub GetDescription {
211 my($This) = @_;
212
213 # Is description explicity set?
214 if (exists $This->{Description}) {
215 return $This->{Description};
216 }
217
218 return "$This->{Type}";
219 }
220
221 # Generate MDL MACCS keys..
222 #
223 sub GenerateMACCSKeys {
224 my($This) = @_;
225
226 # Cache appropriate molecule data...
227 $This->_SetupMoleculeDataCache();
228
229 if ($This->{Size} == 166) {
230 $This->_GenerateMACCS166Keys();
231 }
232 elsif ($This->{Size} == 322) {
233 $This->_GenerateMACCS322Keys();
234 }
235 else {
236 croak "Error: ${ClassName}->GenerateMACCSKeys: The current release of MayaChemTools doesn't support MDL MACCS $This->{Size} keys...";
237 }
238
239 $This->{FingerprintsGenerated} = 1;
240
241 # Clear cached molecule data...
242 $This->_ClearMoleculeDataCache();
243
244 return $This;
245 }
246
247 # Setup GenerateFingerprints method in order to be consistent with all other
248 # fingerprints classes implemented in the current release of MayaChemTools...
249 #
250 sub GenerateFingerprints {
251 my($This) = @_;
252
253 return $This->GenerateMACCSKeys();
254 }
255
256 # Generate MDL MACCS 166 keys...
257 #
258 # Information on the 166 keys [ Ref. 45-47 ]:
259 #
260 # Atom symbols:
261 #
262 # A : Any valid perodic table element symbol
263 # Q : Hetro atoms; any non-C or non-H atom
264 # X : Halogens; F, Cl, Br, I
265 # Z : Others; other than H, C, N, O, Si, P, S, F, Cl, Br, I
266 #
267 # Bond types:
268 #
269 # - : Single
270 # = : Double
271 # T : Triple
272 # # : Triple
273 # ~ : Single or double query bond
274 # % : An aromatic query bond
275 #
276 # None : Any bond type; no explict bond specified
277 #
278 # $ : Ring bond; $ before a bond type specifies ring bond
279 # ! : Chain or non-ring bond; ! before a bond type specifies chain bond
280 #
281 # @ : A ring linkage and the number following it specifies the
282 # atoms position in the line, thus @1 means linked back to the first atom in
283 # the list.
284 #
285 # Aromatic: Kekule or Arom5
286 #
287 # Kekule: Bonds in 6-membered rings with alternalte single/double bonds or perimeter
288 # bonds
289 #
290 # Arom5: Bonds in 5-membered rings with two double bonds and a hetro atom at
291 # the apex of the ring.
292 #
293 # Index Key Description
294 # 1 ISOTOPE
295 # 2 103 < ATOMIC NO. < 256
296 # 3 GROUP IVA,VA,VIA PERIODS 4-6 (Ge...)
297 # 4 ACTINIDE
298 # 5 GROUP IIIB,IVB (Sc...)
299 # 6 LANTHANIDE
300 # 7 GROUP VB,VIB,VIIB (V...)
301 # 8 QAAA@1
302 # 9 GROUP VIII (Fe...)
303 # 10 GROUP IIA (ALKALINE EARTH)
304 # 11 4M RING
305 # 12 GROUP IB,IIB (Cu...)
306 # 13 ON(C)C
307 # 14 S-S
308 # 15 OC(O)O
309 # 16 QAA@1
310 # 17 CTC
311 # 18 GROUP IIIA (B...)
312 # 19 7M RING
313 # 20 SI
314 # 21 C=C(Q)Q
315 # 22 3M RING
316 # 23 NC(O)O
317 # 24 N-O
318 # 25 NC(N)N
319 # 26 C$=C($A)$A
320 # 27 I
321 # 28 QCH2Q
322 # 29 P
323 # 30 CQ(C)(C)A
324 # 31 QX
325 # 32 CSN
326 # 33 NS
327 # 34 CH2=A
328 # 35 GROUP IA (ALKALI METAL)
329 # 36 S HETEROCYCLE
330 # 37 NC(O)N
331 # 38 NC(C)N
332 # 39 OS(O)O
333 # 40 S-O
334 # 41 CTN
335 # 42 F
336 # 43 QHAQH
337 # 44 OTHER
338 # 45 C=CN
339 # 46 BR
340 # 47 SAN
341 # 48 OQ(O)O
342 # 49 CHARGE
343 # 50 C=C(C)C
344 # 51 CSO
345 # 52 NN
346 # 53 QHAAAQH
347 # 54 QHAAQH
348 # 55 OSO
349 # 56 ON(O)C
350 # 57 O HETEROCYCLE
351 # 58 QSQ
352 # 59 Snot%A%A
353 # 60 S=O
354 # 61 AS(A)A
355 # 62 A$A!A$A
356 # 63 N=O
357 # 64 A$A!S
358 # 65 C%N
359 # 66 CC(C)(C)A
360 # 67 QS
361 # 68 QHQH (&...)
362 # 69 QQH
363 # 70 QNQ
364 # 71 NO
365 # 72 OAAO
366 # 73 S=A
367 # 74 CH3ACH3
368 # 75 A!N$A
369 # 76 C=C(A)A
370 # 77 NAN
371 # 78 C=N
372 # 79 NAAN
373 # 80 NAAAN
374 # 81 SA(A)A
375 # 82 ACH2QH
376 # 83 QAAAA@1
377 # 84 NH2
378 # 85 CN(C)C
379 # 86 CH2QCH2
380 # 87 X!A$A
381 # 88 S
382 # 89 OAAAO
383 # 90 QHAACH2A
384 # 91 QHAAACH2A
385 # 92 OC(N)C
386 # 93 QCH3
387 # 94 QN
388 # 95 NAAO
389 # 96 5M RING
390 # 97 NAAAO
391 # 98 QAAAAA@1
392 # 99 C=C
393 # 100 ACH2N
394 # 101 8M RING
395 # 102 QO
396 # 103 CL
397 # 104 QHACH2A
398 # 105 A$A($A)$A
399 # 106 QA(Q)Q
400 # 107 XA(A)A
401 # 108 CH3AAACH2A
402 # 109 ACH2O
403 # 110 NCO
404 # 111 NACH2A
405 # 112 AA(A)(A)A
406 # 113 Onot%A%A
407 # 114 CH3CH2A
408 # 115 CH3ACH2A
409 # 116 CH3AACH2A
410 # 117 NAO
411 # 118 ACH2CH2A > 1
412 # 119 N=A
413 # 120 HETEROCYCLIC ATOM > 1 (&...)
414 # 121 N HETEROCYCLE
415 # 122 AN(A)A
416 # 123 OCO
417 # 124 QQ
418 # 125 AROMATIC RING > 1
419 # 126 A!O!A
420 # 127 A$A!O > 1 (&...)
421 # 128 ACH2AAACH2A
422 # 129 ACH2AACH2A
423 # 130 QQ > 1 (&...)
424 # 131 QH > 1
425 # 132 OACH2A
426 # 133 A$A!N
427 # 134 X (HALOGEN)
428 # 135 Nnot%A%A
429 # 136 O=A > 1
430 # 137 HETEROCYCLE
431 # 138 QCH2A > 1 (&...)
432 # 139 OH
433 # 140 O > 3 (&...)
434 # 141 CH3 > 2 (&...)
435 # 142 N > 1
436 # 143 A$A!O
437 # 144 Anot%A%Anot%A
438 # 145 6M RING > 1
439 # 146 O > 2
440 # 147 ACH2CH2A
441 # 148 AQ(A)A
442 # 149 CH3 > 1
443 # 150 A!A$A!A
444 # 151 NH
445 # 152 OC(C)C
446 # 153 QCH2A
447 # 154 C=O
448 # 155 A!CH2!A
449 # 156 NA(A)A
450 # 157 C-O
451 # 158 C-N
452 # 159 O > 1
453 # 160 CH3
454 # 161 N
455 # 162 AROMATIC
456 # 163 6M RING
457 # 164 O
458 # 165 RING
459 # 166 FRAGMENTS
460 #
461 sub _GenerateMACCS166Keys {
462 my($This) = @_;
463 my($KeyNum, $KeyIndex, $MethodName, $KeyValue, $SkipPosCheck);
464
465 $SkipPosCheck = 1;
466
467 # Generate and set key values...
468 KEYNUM: for $KeyNum (1 .. 166) {
469 $MethodName = "_Generate166KeySetKey${KeyNum}";
470 $KeyValue = $This->$MethodName();
471
472 if (!$KeyValue) {
473 next KEYNUM;
474 }
475 $KeyIndex = $KeyNum - 1;
476 if ($This->{KeyBits}) {
477 $This->{FingerprintsBitVector}->SetBit($KeyIndex, $SkipPosCheck);
478 }
479 else {
480 $This->{FingerprintsVector}->SetValue($KeyIndex, $KeyValue, $SkipPosCheck);
481 }
482 }
483
484 # Add key labels for MACCSKeyCount...
485 if (!$This->{KeyBits}) {
486 $This->_SetMACCSKeyCountValueIDs();
487 }
488
489 return $This;
490 }
491
492 # Generate MDL MACCS 322 keys...
493 #
494 # MDL MACCS 322 key set is defined in tables 1, 2 and 3 by: Joseph L. Durant; Burton A. Leland;
495 # Douglas R. Henry; James G. Nourse. Reoptimization of MDL Keys for Use in Drug Discovery [ Ref. 46 ].
496 #
497 # Atom symbols:
498 #
499 # A : Any valid perodic table element symbol
500 # Q : Hetro atoms; any non-C or non-H atom
501 # X : Others; other than H, C, N, O, Si, P, S, F, Cl, Br, I
502 # Z is neither defined nor used
503 #
504 # Atom symbol, X, used for 322 keys [ Ref 46 ] doesn't refer to Halogens as it does for 166 keys. In
505 # order to keep the definition of 322 keys consistent with the published definitions, the symbol X is
506 # used to imply "others" atoms, but it's internally mapped to symbol X as defined for 166 keys
507 # during the generation of key values.
508 #
509 # The keys include:
510 #
511 # o 26 atom properties of type P, as listed in Table 1
512 # o 32 one-atom environments, as listed in Table 3
513 # o 264 atom-bond-atom combinations listed in Table 4
514 #
515 # Total number of keys in three tables: 322
516 #
517 # Removal of two rare properties in Table 1 number 21 and 22 results in a 320 keyset.
518 #
519 # Atom properties-based keys (26):
520 #
521 # Index Description
522 # 1 A(AAA) or AA(A)A - atom with at least three neighbors
523 # 2 Q - heteroatom
524 # 3 Anot%not-A - atom involved in one or more multiple bonds, not aromatic
525 # 4 A(AAAA) or AA(A)(A)A - atom with at least four neighbors
526 # 5 A(QQ) or QA(Q) - atom with at least two heteroatom neighbors
527 # 6 A(QQQ) or QA(Q)Q - atom with at least three heteroatom neighbors
528 # 7 QH - heteroatom with at least one hydrogen attached
529 # 8 CH2(AA) or ACH2A - carbon with at least two single bonds and at least two hydrogens attached
530 # 9 CH3(A) or ACH3 - carbon with at least one single bond and at least three hydrogens attached
531 # 10 Halogen
532 # 11 A(-A-A-A) or A-A(-A)-A - atom has at least three single bonds
533 # 12 AAAAAA@1 > 2 - atom is in at least two different six-membered rings
534 # 13 A($A$A$A) or A$A($A)$A - atom has more than two ring bonds
535 # 14 A$A!A$A - atom is at a ring/chain boundary. When a comparison is done
536 # with another atom the path passes through the chain bond.
537 # 15 Anot%A%Anot%A - atom is at an aromatic/nonaromatic boundary. When a
538 # comparison is done with another atom the path
539 # passes through the aromatic bond.
540 # 16 A!A!A - atom with more than one chain bond
541 # 17 A!A$A!A - atom is at a ring/chain boundary. When a comparison is done
542 # with another atom the path passes through the ring bond.
543 # 18 A%Anot%A%A - atom is at an aromatic/nonaromatic boundary. When a
544 # comparison is done with another atom the
545 # path passes through the nonaromatic bond.
546 # 19 HETEROCYCLE - atom is a heteroatom in a ring.
547 # 20 rare properties: atom with five or more neighbors, atom in
548 # four or more rings, or atom types other than
549 # H, C, N, O, S, F, Cl, Br, or I
550 # 21 rare properties: atom has a charge, is an isotope, has two or
551 # more multiple bonds, or has a triple bond.
552 # 22 N - nitrogen
553 # 23 S - sulfur
554 # 24 O - oxygen
555 # 25 A(AA)A(A)A(AA) - atom has two neighbors, each with three or more neighbors
556 # (including the central atom).
557 # 26 CHACH2 - atom has two hydrocarbon (CH2) neighbors
558 #
559 #
560 # Atomic environments properties-based keys (32):
561 #
562 # Index Key Description
563 # 27 C(CC)
564 # 28 C(CCC)
565 # 29 C(CN)
566 # 30 C(CCN)
567 # 31 C(NN)
568 # 32 C(NNC)
569 # 33 C(NNN)
570 # 34 C(CO)
571 # 35 C(CCO)
572 # 36 C(NO)
573 # 37 C(NCO)
574 # 38 C(NNO)
575 # 39 C(OO)
576 # 40 C(COO)
577 # 41 C(NOO)
578 # 42 C(OOO)
579 # 43 Q(CC)
580 # 44 Q(CCC)
581 # 45 Q(CN)
582 # 46 Q(CCN)
583 # 47 Q(NN)
584 # 48 Q(CNN)
585 # 49 Q(NNN)
586 # 50 Q(CO)
587 # 51 Q(CCO)
588 # 52 Q(NO)
589 # 53 Q(CNO)
590 # 54 Q(NNO)
591 # 55 Q(OO)
592 # 56 Q(COO)
593 # 57 Q(NOO)
594 # 58 Q(OOO)
595 #
596 # Note: The first symbol is the central atom, with atoms bonded to the
597 # central atom listed in parentheses. Q is any non-C, non-H atom. If
598 # only two atoms are in parentheses, there is no implication concerning
599 # the other atoms bonded to the central atom.
600 #
601 # Atom-Bond-Atom properties-based keys: (264)
602 #
603 # Index Key Description
604 # 59 C-C
605 # 60 C-N
606 # 61 C-O
607 # 62 C-S
608 # 63 C-Cl
609 # 64 C-P
610 # 65 C-F
611 # 66 C-Br
612 # 67 C-Si
613 # 68 C-I
614 # 69 C-X
615 # 70 N-N
616 # 71 N-O
617 # 72 N-S
618 # 73 N-Cl
619 # 74 N-P
620 # 75 N-F
621 # 76 N-Br
622 # 77 N-Si
623 # 78 N-I
624 # 79 N-X
625 # 80 O-O
626 # 81 O-S
627 # 82 O-Cl
628 # 83 O-P
629 # 84 O-F
630 # 85 O-Br
631 # 86 O-Si
632 # 87 O-I
633 # 88 O-X
634 # 89 S-S
635 # 90 S-Cl
636 # 91 S-P
637 # 92 S-F
638 # 93 S-Br
639 # 94 S-Si
640 # 95 S-I
641 # 96 S-X
642 # 97 Cl-Cl
643 # 98 Cl-P
644 # 99 Cl-F
645 # 100 Cl-Br
646 # 101 Cl-Si
647 # 102 Cl-I
648 # 103 Cl-X
649 # 104 P-P
650 # 105 P-F
651 # 106 P-Br
652 # 107 P-Si
653 # 108 P-I
654 # 109 P-X
655 # 110 F-F
656 # 111 F-Br
657 # 112 F-Si
658 # 113 F-I
659 # 114 F-X
660 # 115 Br-Br
661 # 116 Br-Si
662 # 117 Br-I
663 # 118 Br-X
664 # 119 Si-Si
665 # 120 Si-I
666 # 121 Si-X
667 # 122 I-I
668 # 123 I-X
669 # 124 X-X
670 # 125 C=C
671 # 126 C=N
672 # 127 C=O
673 # 128 C=S
674 # 129 C=Cl
675 # 130 C=P
676 # 131 C=F
677 # 132 C=Br
678 # 133 C=Si
679 # 134 C=I
680 # 135 C=X
681 # 136 N=N
682 # 137 N=O
683 # 138 N=S
684 # 139 N=Cl
685 # 140 N=P
686 # 141 N=F
687 # 142 N=Br
688 # 143 N=Si
689 # 144 N=I
690 # 145 N=X
691 # 146 O=O
692 # 147 O=S
693 # 148 O=Cl
694 # 149 O=P
695 # 150 O=F
696 # 151 O=Br
697 # 152 O=Si
698 # 153 O=I
699 # 154 O=X
700 # 155 S=S
701 # 156 S=Cl
702 # 157 S=P
703 # 158 S=F
704 # 159 S=Br
705 # 160 S=Si
706 # 161 S=I
707 # 162 S=X
708 # 163 Cl=Cl
709 # 164 Cl=P
710 # 165 Cl=F
711 # 166 Cl=Br
712 # 167 Cl=Si
713 # 168 Cl=I
714 # 169 Cl=X
715 # 170 P=P
716 # 171 P=F
717 # 172 P=Br
718 # 173 P=Si
719 # 174 P=I
720 # 175 P=X
721 # 176 F=F
722 # 177 F=Br
723 # 178 F=Si
724 # 179 F=I
725 # 180 F=X
726 # 181 Br=Br
727 # 182 Br=Si
728 # 183 Br=I
729 # 184 Br=X
730 # 185 Si=Si
731 # 186 Si=I
732 # 187 Si=X
733 # 188 I=I
734 # 189 I=X
735 # 190 X=X
736 # 191 C#C
737 # 192 C#N
738 # 193 C#O
739 # 194 C#S
740 # 195 C#Cl
741 # 196 C#P
742 # 197 C#F
743 # 198 C#Br
744 # 199 C#Si
745 # 200 C#I
746 # 201 C#X
747 # 202 N#N
748 # 203 N#O
749 # 204 N#S
750 # 205 N#Cl
751 # 206 N#P
752 # 207 N#F
753 # 208 N#Br
754 # 209 N#Si
755 # 210 N#I
756 # 211 N#X
757 # 212 O#O
758 # 213 O#S
759 # 214 O#Cl
760 # 215 O#P
761 # 216 O#F
762 # 217 O#Br
763 # 218 O#Si
764 # 219 O#I
765 # 220 O#X
766 # 221 S#S
767 # 222 S#Cl
768 # 223 S#P
769 # 224 S#F
770 # 225 S#Br
771 # 226 S#Si
772 # 227 S#I
773 # 228 S#X
774 # 229 Cl#Cl
775 # 230 Cl#P
776 # 231 Cl#F
777 # 232 Cl#Br
778 # 233 Cl#Si
779 # 234 Cl#I
780 # 235 Cl#X
781 # 236 P#P
782 # 237 P#F
783 # 238 P#Br
784 # 239 P#Si
785 # 240 P#I
786 # 241 P#X
787 # 242 F#F
788 # 243 F#Br
789 # 244 F#Si
790 # 245 F#I
791 # 246 F#X
792 # 247 Br#Br
793 # 248 Br#Si
794 # 249 Br#I
795 # 250 Br#X
796 # 251 Si#Si
797 # 252 Si#I
798 # 253 Si#X
799 # 254 I#I
800 # 255 I#X
801 # 256 X#X
802 # 257 C$C
803 # 258 C$N
804 # 259 C$O
805 # 260 C$S
806 # 261 C$Cl
807 # 262 C$P
808 # 263 C$F
809 # 264 C$Br
810 # 265 C$Si
811 # 266 C$I
812 # 267 C$X
813 # 268 N$N
814 # 269 N$O
815 # 270 N$S
816 # 271 N$Cl
817 # 272 N$P
818 # 273 N$F
819 # 274 N$Br
820 # 275 N$Si
821 # 276 N$I
822 # 277 N$X
823 # 278 O$O
824 # 279 O$S
825 # 280 O$Cl
826 # 281 O$P
827 # 282 O$F
828 # 283 O$Br
829 # 284 O$Si
830 # 285 O$I
831 # 286 O$X
832 # 287 S$S
833 # 288 S$Cl
834 # 289 S$P
835 # 290 S$F
836 # 291 S$Br
837 # 292 S$Si
838 # 293 S$I
839 # 294 S$X
840 # 295 Cl$Cl
841 # 296 Cl$P
842 # 297 Cl$F
843 # 298 Cl$Br
844 # 299 Cl$Si
845 # 300 Cl$I
846 # 301 Cl$X
847 # 302 P$P
848 # 303 P$F
849 # 304 P$Br
850 # 305 P$Si
851 # 306 P$I
852 # 307 P$X
853 # 308 F$F
854 # 309 F$Br
855 # 310 F$Si
856 # 311 F$I
857 # 312 F$X
858 # 313 Br$Br
859 # 314 Br$Si
860 # 315 Br$I
861 # 316 Br$X
862 # 317 Si$Si
863 # 318 Si$I
864 # 319 Si$X
865 # 320 I$I
866 # 321 I$X
867 # 322 X$X
868 #
869 # Note: Instead of using '%' as rind bond as mentioned in the article [ Ref. 46 ], MayaChemTools
870 # used '$' as a symbol for ring bond to follow conventions used for MACCS 166 keys; the symbol '%'
871 # is used to indicate an aromatic query bond.
872 #
873 sub _GenerateMACCS322Keys {
874 my($This) = @_;
875 my($KeyNum, $KeyIndex, $MethodName, $KeyValue, $SkipPosCheck);
876
877 $SkipPosCheck = 1;
878
879 # Generate and set key values...
880 KEYNUM: for $KeyNum (1 .. 322) {
881 $MethodName = "_Generate322KeySetKey${KeyNum}";
882 $KeyValue = $This->$MethodName();
883
884 if (!$KeyValue) {
885 next KEYNUM;
886 }
887 $KeyIndex = $KeyNum - 1;
888 if ($This->{KeyBits}) {
889 $This->{FingerprintsBitVector}->SetBit($KeyIndex, $SkipPosCheck);
890 }
891 else {
892 $This->{FingerprintsVector}->SetValue($KeyIndex, $KeyValue, $SkipPosCheck);
893 }
894 }
895
896 # Add key labels for MACCSKeyCount...
897 if (!$This->{KeyBits}) {
898 $This->_SetMACCSKeyCountValueIDs();
899 }
900 return $This;
901 }
902
903 # Set MACCS key count value IDs for fingerprint vector. The value IDs labels format
904 # is: Key<KeyNum>.
905 #
906 # By default, no value IDs are set for fingerprint vector values.
907 #
908 sub _SetMACCSKeyCountValueIDs {
909 my($This) = @_;
910
911 if (!$This->{FingerprintsVector}) {
912 return;
913 }
914 my(@ValueIDs);
915
916 @ValueIDs = map { "Key$_"; } (1 .. $This->{Size});
917 $This->{FingerprintsVector}->AddValueIDs(\@ValueIDs);
918
919 return $This;
920 }
921
922 ##################################
923 #
924 # Implementation of MDL MACCS 166 keys...
925 #
926 ##################################
927
928 # Generate key 1 value as 1/0 indicating its presence/absence or count of its
929 # presence in a molecule.
930 #
931 # Key 1 description: ISOTOPE
932 #
933 sub _Generate166KeySetKey1 {
934 my($This) = @_;
935 my($Atom, $KeyValue);
936
937 $KeyValue = 0;
938 ATOM: for $Atom (@{$This->{Atoms}}) {
939 if ($Atom->IsIsotope()) {
940 if ($This->{KeyBits}) {
941 $KeyValue = 1;
942 last ATOM;
943 }
944 $KeyValue++;
945 }
946 }
947 return $KeyValue;
948 }
949
950 # Generate key 2 value as 1/0 indicating its presence/absence or count of its
951 # presence in a molecule.
952 #
953 # Key 2 description: 103 < ATOMIC NO. < 256
954 #
955 sub _Generate166KeySetKey2 {
956 my($This) = @_;
957 my($Atom, $AtomicNumber, $KeyValue);
958
959 $KeyValue = 0;
960 ATOM: for $Atom (@{$This->{Atoms}}) {
961 $AtomicNumber = $Atom->GetAtomicNumber();
962 if ($AtomicNumber > 103 && $AtomicNumber < 256) {
963 if ($This->{KeyBits}) {
964 $KeyValue = 1;
965 last ATOM;
966 }
967 $KeyValue++;
968 }
969 }
970 return $KeyValue;
971 }
972
973 # Generate key 3 value as 1/0 indicating its presence/absence or count of its
974 # presence in a molecule.
975 #
976 # Key 3 description: GROUP IVA,VA,VIA (GroupNumber: 14, 15, 16) PERIODS 4-6 (Ge...)
977 #
978 sub _Generate166KeySetKey3 {
979 my($This) = @_;
980 my($Atom, $KeyValue, $AtomicNumber, $GroupNumber, $PeriodNumber);
981
982 $KeyValue = 0;
983 ATOM: for $Atom (@{$This->{Atoms}}) {
984 $AtomicNumber = $Atom->GetAtomicNumber();
985 if ($AtomicNumber) {
986 $GroupNumber = PeriodicTable::GetElementGroupNumber($AtomicNumber);
987 $PeriodNumber = PeriodicTable::GetElementPeriodNumber($AtomicNumber);
988 if ($PeriodNumber =~ /^(4|5|6)$/ && $GroupNumber =~ /^(14|15|16)$/) {
989 if ($This->{KeyBits}) {
990 $KeyValue = 1;
991 last ATOM;
992 }
993 $KeyValue++;
994 }
995 }
996 }
997 return $KeyValue;
998 }
999
1000 # Generate key 4 value as 1/0 indicating its presence/absence or count of its
1001 # presence in a molecule.
1002 #
1003 # Key 4 description: ACTINIDE
1004 #
1005 sub _Generate166KeySetKey4 {
1006 my($This) = @_;
1007 my($Atom, $AtomicNumber, $KeyValue);
1008
1009 $KeyValue = 0;
1010 ATOM: for $Atom (@{$This->{Atoms}}) {
1011 $AtomicNumber = $Atom->GetAtomicNumber();
1012 if ($AtomicNumber >= 89 && $AtomicNumber <= 103) {
1013 if ($This->{KeyBits}) {
1014 $KeyValue = 1;
1015 last ATOM;
1016 }
1017 $KeyValue++;
1018 }
1019 }
1020 return $KeyValue;
1021 }
1022
1023 # Generate key 5 value as 1/0 indicating its presence/absence or count of its
1024 # presence in a molecule.
1025 #
1026 # Key 5 description: GROUP IIIB,IVB (Sc...)
1027 #
1028 sub _Generate166KeySetKey5 {
1029 my($This) = @_;
1030 my($Atom, $KeyValue, $AtomicNumber, $GroupNumber);
1031
1032 $KeyValue = 0;
1033 ATOM: for $Atom (@{$This->{Atoms}}) {
1034 $AtomicNumber = $Atom->GetAtomicNumber();
1035 if ($AtomicNumber) {
1036 $GroupNumber = PeriodicTable::GetElementGroupNumber($AtomicNumber);
1037 if ($GroupNumber =~ /^(3|4)$/) {
1038 if ($This->{KeyBits}) {
1039 $KeyValue = 1;
1040 last ATOM;
1041 }
1042 $KeyValue++;
1043 }
1044 }
1045 }
1046 return $KeyValue;
1047 }
1048
1049 # Generate key 6 value as 1/0 indicating its presence/absence or count of its
1050 # presence in a molecule.
1051 #
1052 # Key 6 description: LANTHANIDE
1053 #
1054 sub _Generate166KeySetKey6 {
1055 my($This) = @_;
1056 my($Atom, $AtomicNumber, $KeyValue);
1057
1058 $KeyValue = 0;
1059 ATOM: for $Atom (@{$This->{Atoms}}) {
1060 $AtomicNumber = $Atom->GetAtomicNumber();
1061 if ($AtomicNumber >= 57 && $AtomicNumber <= 71) {
1062 if ($This->{KeyBits}) {
1063 $KeyValue = 1;
1064 last ATOM;
1065 }
1066 $KeyValue++;
1067 }
1068 }
1069 return $KeyValue;
1070 }
1071
1072 # Generate key 7 value as 1/0 indicating its presence/absence or count of its
1073 # presence in a molecule.
1074 #
1075 # Key 7 description: GROUP VB,VIB,VIIB (V...)
1076 #
1077 sub _Generate166KeySetKey7 {
1078 my($This) = @_;
1079 my($Atom, $KeyValue, $AtomicNumber, $GroupNumber);
1080
1081 $KeyValue = 0;
1082 ATOM: for $Atom (@{$This->{Atoms}}) {
1083 $AtomicNumber = $Atom->GetAtomicNumber();
1084 if ($AtomicNumber) {
1085 $GroupNumber = PeriodicTable::GetElementGroupNumber($AtomicNumber);
1086 if ($GroupNumber =~ /^(5|6|7)$/) {
1087 if ($This->{KeyBits}) {
1088 $KeyValue = 1;
1089 last ATOM;
1090 }
1091 $KeyValue++;
1092 }
1093 }
1094 }
1095 return $KeyValue;
1096 }
1097
1098 # Generate key 8 value as 1/0 indicating its presence/absence or count of its
1099 # presence in a molecule.
1100 #
1101 # Key 8 description: QAAA@1
1102 #
1103 sub _Generate166KeySetKey8 {
1104 my($This) = @_;
1105 my($Atom, $KeyValue, $RingSize);
1106
1107 $RingSize = 4;
1108 $KeyValue = 0;
1109 ATOM: for $Atom (@{$This->{Atoms}}) {
1110 if ($This->_IsHeteroAtom($Atom) && $Atom->IsInRingOfSize($RingSize)) {
1111 if ($This->{KeyBits}) {
1112 $KeyValue = 1;
1113 last ATOM;
1114 }
1115 $KeyValue++;
1116 }
1117 }
1118 return $KeyValue;
1119 }
1120
1121 # Generate key 9 value as 1/0 indicating its presence/absence or count of its
1122 # presence in a molecule.
1123 #
1124 # Key 9 description: GROUP VIII (Fe...)
1125 #
1126 sub _Generate166KeySetKey9 {
1127 my($This) = @_;
1128 my($Atom, $KeyValue, $AtomicNumber, $GroupNumber);
1129
1130 $KeyValue = 0;
1131 ATOM: for $Atom (@{$This->{Atoms}}) {
1132 $AtomicNumber = $Atom->GetAtomicNumber();
1133 if ($AtomicNumber) {
1134 $GroupNumber = PeriodicTable::GetElementGroupNumber($AtomicNumber);
1135 if ($GroupNumber =~ /^(8|9|10)$/) {
1136 if ($This->{KeyBits}) {
1137 $KeyValue = 1;
1138 last ATOM;
1139 }
1140 $KeyValue++;
1141 }
1142 }
1143 }
1144 return $KeyValue;
1145 }
1146
1147 # Generate key 10 value as 1/0 indicating its presence/absence or count of its
1148 # presence in a molecule.
1149 #
1150 # Key 10 description: GROUP IIA (ALKALINE EARTH)
1151 #
1152 sub _Generate166KeySetKey10 {
1153 my($This) = @_;
1154 my($Atom, $KeyValue, $AtomicNumber, $GroupNumber);
1155
1156 $KeyValue = 0;
1157 ATOM: for $Atom (@{$This->{Atoms}}) {
1158 $AtomicNumber = $Atom->GetAtomicNumber();
1159 if ($AtomicNumber) {
1160 $GroupNumber = PeriodicTable::GetElementGroupNumber($AtomicNumber);
1161 if ($GroupNumber =~ /^2$/) {
1162 if ($This->{KeyBits}) {
1163 $KeyValue = 1;
1164 last ATOM;
1165 }
1166 $KeyValue++;
1167 }
1168 }
1169 }
1170 return $KeyValue;
1171 }
1172
1173 # Generate key 11 value as 1/0 indicating its presence/absence or count of its
1174 # presence in a molecule.
1175 #
1176 # Key 11 description: 4M RING
1177 #
1178 sub _Generate166KeySetKey11 {
1179 my($This) = @_;
1180 my($Molecule, $KeyValue, $RingSize, $NumOfRings);
1181
1182 $RingSize = 4;
1183 $Molecule = $This->GetMolecule();
1184 $NumOfRings = $Molecule->GetNumOfRingsWithSize($RingSize);
1185
1186 if ($This->{KeyBits}) {
1187 $KeyValue = $NumOfRings ? 1 : 0;
1188 }
1189 else {
1190 $KeyValue = $NumOfRings;
1191 }
1192 return $KeyValue;
1193 }
1194
1195 # Generate key 12 value as 1/0 indicating its presence/absence or count of its
1196 # presence in a molecule.
1197 #
1198 # Key 12 description: GROUP IB,IIB (Cu...)
1199 #
1200 sub _Generate166KeySetKey12 {
1201 my($This) = @_;
1202 my($Atom, $KeyValue, $AtomicNumber, $GroupNumber);
1203
1204 $KeyValue = 0;
1205 ATOM: for $Atom (@{$This->{Atoms}}) {
1206 $AtomicNumber = $Atom->GetAtomicNumber();
1207 if ($AtomicNumber) {
1208 $GroupNumber = PeriodicTable::GetElementGroupNumber($AtomicNumber);
1209 if ($GroupNumber =~ /^(11|12)$/) {
1210 if ($This->{KeyBits}) {
1211 $KeyValue = 1;
1212 last ATOM;
1213 }
1214 $KeyValue++;
1215 }
1216 }
1217 }
1218 return $KeyValue;
1219 }
1220
1221 # Generate key 13 value as 1/0 indicating its presence/absence or count of its
1222 # presence in a molecule.
1223 #
1224 # Key 13 description: ON(C)C
1225 #
1226 sub _Generate166KeySetKey13 {
1227 my($This) = @_;
1228 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1229
1230 $CentralAtomSymbol = 'N';
1231 @NbrAtomSymbols = ('O', 'C', 'C');
1232 @NbrBondSymbols = (undef, undef, undef);
1233
1234 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1235 }
1236
1237 # Generate key 14 value as 1/0 indicating its presence/absence or count of its
1238 # presence in a molecule.
1239 #
1240 # Key 14 description: S-S
1241 #
1242 sub _Generate166KeySetKey14 {
1243 my($This) = @_;
1244 my($BondOrder) = 1;
1245
1246 return $This->_DetectBondKeys('S', 'S', $BondOrder);
1247 }
1248
1249 # Generate key 15 value as 1/0 indicating its presence/absence or count of its
1250 # presence in a molecule.
1251 #
1252 # Key 15 description: OC(O)O
1253 #
1254 sub _Generate166KeySetKey15 {
1255 my($This) = @_;
1256 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1257
1258 $CentralAtomSymbol = 'C';
1259 @NbrAtomSymbols = ('O', 'O', 'O');
1260 @NbrBondSymbols = (undef, undef, undef);
1261
1262 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1263 }
1264
1265 # Generate key 16 value as 1/0 indicating its presence/absence or count of its
1266 # presence in a molecule.
1267 #
1268 # Key 16 description: QAA@1
1269 #
1270 sub _Generate166KeySetKey16 {
1271 my($This) = @_;
1272 my($Atom, $KeyValue, $RingSize);
1273
1274 $RingSize = 3;
1275 $KeyValue = 0;
1276 ATOM: for $Atom (@{$This->{Atoms}}) {
1277 if ($This->_IsHeteroAtom($Atom) && $Atom->IsInRingOfSize($RingSize)) {
1278 if ($This->{KeyBits}) {
1279 $KeyValue = 1;
1280 last ATOM;
1281 }
1282 $KeyValue++;
1283 }
1284 }
1285 return $KeyValue;
1286 }
1287
1288 # Generate key 17 value as 1/0 indicating its presence/absence or count of its
1289 # presence in a molecule.
1290 #
1291 # Key 17 description: CTC
1292 #
1293 sub _Generate166KeySetKey17 {
1294 my($This) = @_;
1295 my($BondOrder) = 3;
1296
1297 return $This->_DetectBondKeys('C', 'C', $BondOrder);
1298 }
1299
1300 # Generate key 18 value as 1/0 indicating its presence/absence or count of its
1301 # presence in a molecule.
1302 #
1303 # Key 18 description: GROUP IIIA (B...)
1304 #
1305 sub _Generate166KeySetKey18 {
1306 my($This) = @_;
1307 my($Atom, $KeyValue, $AtomicNumber, $GroupNumber);
1308
1309 $KeyValue = 0;
1310 ATOM: for $Atom (@{$This->{Atoms}}) {
1311 $AtomicNumber = $Atom->GetAtomicNumber();
1312 if ($AtomicNumber) {
1313 $GroupNumber = PeriodicTable::GetElementGroupNumber($AtomicNumber);
1314 if ($GroupNumber =~ /^13$/) {
1315 if ($This->{KeyBits}) {
1316 $KeyValue = 1;
1317 last ATOM;
1318 }
1319 $KeyValue++;
1320 }
1321 }
1322 }
1323 return $KeyValue;
1324 }
1325
1326 # Generate key 19 value as 1/0 indicating its presence/absence or count of its
1327 # presence in a molecule.
1328 #
1329 # Key 19 description: 7M RING
1330 #
1331 sub _Generate166KeySetKey19 {
1332 my($This) = @_;
1333 my($Molecule, $KeyValue, $RingSize, $NumOfRings);
1334
1335 $RingSize = 7;
1336 $Molecule = $This->GetMolecule();
1337 $NumOfRings = $Molecule->GetNumOfRingsWithSize($RingSize);
1338
1339 $KeyValue = 0;
1340 if ($NumOfRings) {
1341 $KeyValue = ($This->{KeyBits}) ? 1 : $NumOfRings;
1342 }
1343 return $KeyValue;
1344 }
1345
1346 # Generate key 20 value as 1/0 indicating its presence/absence or count of its
1347 # presence in a molecule.
1348 #
1349 # Key 20 description: SI
1350 #
1351 sub _Generate166KeySetKey20 {
1352 my($This) = @_;
1353
1354 return $This->_DetectAtomKeys('Si');
1355 }
1356
1357 # Generate key 21 value as 1/0 indicating its presence/absence or count of its
1358 # presence in a molecule.
1359 #
1360 # Key 21 description: C=C(Q)Q
1361 #
1362 sub _Generate166KeySetKey21 {
1363 my($This) = @_;
1364 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1365
1366 $CentralAtomSymbol = 'C';
1367 @NbrAtomSymbols = ('C', 'Q', 'Q');
1368 @NbrBondSymbols = ('=', undef, undef);
1369
1370 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1371 }
1372
1373 # Generate key 22 value as 1/0 indicating its presence/absence or count of its
1374 # presence in a molecule.
1375 #
1376 # Key 22 description: 3M RING
1377 #
1378 sub _Generate166KeySetKey22 {
1379 my($This) = @_;
1380 my($Molecule, $KeyValue, $RingSize, $NumOfRings);
1381
1382 $RingSize = 3;
1383 $Molecule = $This->GetMolecule();
1384 $NumOfRings = $Molecule->GetNumOfRingsWithSize($RingSize);
1385
1386 if ($This->{KeyBits}) {
1387 $KeyValue = $NumOfRings ? 1 : 0;
1388 }
1389 else {
1390 $KeyValue = $NumOfRings;
1391 }
1392 return $KeyValue;
1393 }
1394
1395 # Generate key 23 value as 1/0 indicating its presence/absence or count of its
1396 # presence in a molecule.
1397 #
1398 # Key 23 description: NC(O)O
1399 #
1400 sub _Generate166KeySetKey23 {
1401 my($This) = @_;
1402 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1403
1404 $CentralAtomSymbol = 'C';
1405 @NbrAtomSymbols = ('N', 'O', 'O');
1406 @NbrBondSymbols = (undef, undef, undef);
1407
1408 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1409 }
1410
1411 # Generate key 24 value as 1/0 indicating its presence/absence or count of its
1412 # presence in a molecule.
1413 #
1414 # Key 24 description: N-O
1415 #
1416 sub _Generate166KeySetKey24 {
1417 my($This) = @_;
1418 my($BondOrder) = 1;
1419
1420 return $This->_DetectBondKeys('N', 'O', $BondOrder);
1421 }
1422
1423 # Generate key 25 value as 1/0 indicating its presence/absence or count of its
1424 # presence in a molecule.
1425 #
1426 # Key 25 description: NC(N)N
1427 #
1428 sub _Generate166KeySetKey25 {
1429 my($This) = @_;
1430 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1431
1432 $CentralAtomSymbol = 'C';
1433 @NbrAtomSymbols = ('N', 'N', 'N');
1434 @NbrBondSymbols = (undef, undef, undef);
1435
1436 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1437 }
1438
1439 # Generate key 26 value as 1/0 indicating its presence/absence or count of its
1440 # presence in a molecule.
1441 #
1442 # Key 26 description: C$=C($A)$A
1443 #
1444 sub _Generate166KeySetKey26 {
1445 my($This) = @_;
1446 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1447
1448 $CentralAtomSymbol = 'C';
1449 @NbrAtomSymbols = ('C', 'A', 'A');
1450 @NbrBondSymbols = ('$=', '$', '$');
1451
1452 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1453 }
1454
1455 # Generate key 27 value as 1/0 indicating its presence/absence or count of its
1456 # presence in a molecule.
1457 #
1458 # Key 27 description: I
1459 #
1460 sub _Generate166KeySetKey27 {
1461 my($This) = @_;
1462
1463 return $This->_DetectAtomKeys('I');
1464 }
1465
1466 # Generate key 28 value as 1/0 indicating its presence/absence or count of its
1467 # presence in a molecule.
1468 #
1469 # Key 28 description: QCH2Q
1470 #
1471 sub _Generate166KeySetKey28 {
1472 my($This) = @_;
1473 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols);
1474
1475 $CentralAtomSymbol = 'C';
1476 @NbrAtomSymbols = ('Q', 'Q');
1477 @NbrBondSymbols = (undef, undef);
1478 $MinKeyCount = undef;
1479 $CentralAtomMinHydrogenCount = 2;
1480
1481 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount);
1482 }
1483
1484 # Generate key 29 value as 1/0 indicating its presence/absence or count of its
1485 # presence in a molecule.
1486 #
1487 # Key 29 description: P
1488 #
1489 sub _Generate166KeySetKey29 {
1490 my($This) = @_;
1491
1492 return $This->_DetectAtomKeys('P');
1493 }
1494
1495 # Generate key 30 value as 1/0 indicating its presence/absence or count of its
1496 # presence in a molecule.
1497 #
1498 # Key 30 description: CQ(C)(C)A
1499 #
1500 sub _Generate166KeySetKey30 {
1501 my($This) = @_;
1502 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1503
1504 $CentralAtomSymbol = 'Q';
1505 @NbrAtomSymbols = ('C', 'C', 'C', 'A');
1506 @NbrBondSymbols = (undef, undef, undef, undef);
1507
1508 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1509 }
1510
1511 # Generate key 31 value as 1/0 indicating its presence/absence or count of its
1512 # presence in a molecule.
1513 #
1514 # Key 31 description: QX
1515 #
1516 sub _Generate166KeySetKey31 {
1517 my($This) = @_;
1518
1519 return $This->_DetectBondKeys('Q', 'X');
1520 }
1521
1522 # Generate key 32 value as 1/0 indicating its presence/absence or count of its
1523 # presence in a molecule.
1524 #
1525 # Key 32 description: CSN
1526 #
1527 sub _Generate166KeySetKey32 {
1528 my($This) = @_;
1529 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1530
1531 $CentralAtomSymbol = 'S';
1532 @NbrAtomSymbols = ('C', 'N');
1533 @NbrBondSymbols = (undef, undef);
1534
1535 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1536 }
1537
1538 # Generate key 33 value as 1/0 indicating its presence/absence or count of its
1539 # presence in a molecule.
1540 #
1541 # Key 33 description: NS
1542 #
1543 sub _Generate166KeySetKey33 {
1544 my($This) = @_;
1545
1546 return $This->_DetectBondKeys('N', 'S');
1547 }
1548
1549 # Generate key 34 value as 1/0 indicating its presence/absence or count of its
1550 # presence in a molecule.
1551 #
1552 # Key 34 description: CH2=A
1553 #
1554 sub _Generate166KeySetKey34 {
1555 my($This) = @_;
1556 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols);
1557
1558 $CentralAtomSymbol = 'C';
1559 @NbrAtomSymbols = ('A');
1560 @NbrBondSymbols = ('=');
1561 $MinKeyCount = undef;
1562 $CentralAtomMinHydrogenCount = 2;
1563
1564 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount);
1565 }
1566
1567 # Generate key 35 value as 1/0 indicating its presence/absence or count of its
1568 # presence in a molecule.
1569 #
1570 # Key 35 description: GROUP IA (ALKALI METAL)
1571 #
1572 sub _Generate166KeySetKey35 {
1573 my($This) = @_;
1574 my($Atom, $KeyValue, $AtomicNumber, $GroupNumber);
1575
1576 $KeyValue = 0;
1577 ATOM: for $Atom (@{$This->{Atoms}}) {
1578 $AtomicNumber = $Atom->GetAtomicNumber();
1579 if ($AtomicNumber) {
1580 $GroupNumber = PeriodicTable::GetElementGroupNumber($AtomicNumber);
1581 if ($GroupNumber =~ /^1$/) {
1582 if ($This->{KeyBits}) {
1583 $KeyValue = 1;
1584 last ATOM;
1585 }
1586 $KeyValue++;
1587 }
1588 }
1589 }
1590 return $KeyValue;
1591 }
1592
1593 # Generate key 36 value as 1/0 indicating its presence/absence or count of its
1594 # presence in a molecule.
1595 #
1596 # Key 36 description: S HETEROCYCLE
1597 #
1598 sub _Generate166KeySetKey36 {
1599 my($This) = @_;
1600 my($MinKeyCount, $IsInRing) = (1, 1);
1601
1602 return $This->_DetectAtomKeys('S', $MinKeyCount, $IsInRing);
1603 }
1604
1605 # Generate key 37 value as 1/0 indicating its presence/absence or count of its
1606 # presence in a molecule.
1607 #
1608 # Key 37 description: NC(O)N
1609 #
1610 sub _Generate166KeySetKey37 {
1611 my($This) = @_;
1612 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1613
1614 $CentralAtomSymbol = 'C';
1615 @NbrAtomSymbols = ('N', 'O', 'N');
1616 @NbrBondSymbols = (undef, undef, undef);
1617
1618 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1619 }
1620
1621 # Generate key 38 value as 1/0 indicating its presence/absence or count of its
1622 # presence in a molecule.
1623 #
1624 # Key 38 description: NC(C)N
1625 #
1626 sub _Generate166KeySetKey38 {
1627 my($This) = @_;
1628 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1629
1630 $CentralAtomSymbol = 'C';
1631 @NbrAtomSymbols = ('N', 'C', 'N');
1632 @NbrBondSymbols = (undef, undef, undef);
1633
1634 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1635 }
1636
1637 # Generate key 39 value as 1/0 indicating its presence/absence or count of its
1638 # presence in a molecule.
1639 #
1640 # Key 39 description: OS(O)O
1641 #
1642 sub _Generate166KeySetKey39 {
1643 my($This) = @_;
1644 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1645
1646 $CentralAtomSymbol = 'S';
1647 @NbrAtomSymbols = ('O', 'O', 'O');
1648 @NbrBondSymbols = (undef, undef, undef);
1649
1650 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1651 }
1652
1653 # Generate key 40 value as 1/0 indicating its presence/absence or count of its
1654 # presence in a molecule.
1655 #
1656 # Key 40 description: S-O
1657 #
1658 sub _Generate166KeySetKey40 {
1659 my($This) = @_;
1660 my($BondOrder) = 1;
1661
1662 return $This->_DetectBondKeys('S', 'O', $BondOrder);
1663 }
1664
1665 # Generate key 41 value as 1/0 indicating its presence/absence or count of its
1666 # presence in a molecule.
1667 #
1668 # Key 41 description: CTN
1669 #
1670 sub _Generate166KeySetKey41 {
1671 my($This) = @_;
1672 my($BondOrder) = 3;
1673
1674 return $This->_DetectBondKeys('C', 'N', $BondOrder);
1675 }
1676
1677 # Generate key 42 value as 1/0 indicating its presence/absence or count of its
1678 # presence in a molecule.
1679 #
1680 # Key 42 description: F
1681 #
1682 sub _Generate166KeySetKey42 {
1683 my($This) = @_;
1684
1685 return $This->_DetectAtomKeys('F');
1686 }
1687
1688 # Generate key 43 value as 1/0 indicating its presence/absence or count of its
1689 # presence in a molecule.
1690 #
1691 # Key 43 description: QHAQH
1692 #
1693 sub _Generate166KeySetKey43 {
1694 my($This) = @_;
1695 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols, @NbrAtomMinHydrogenCount);
1696
1697 $CentralAtomSymbol = 'A';
1698 $CentralAtomMinHydrogenCount = undef;
1699
1700 @NbrAtomSymbols = ('Q', 'Q');
1701 @NbrBondSymbols = (undef, undef);
1702 @NbrAtomMinHydrogenCount = (1, 1);
1703
1704 $MinKeyCount = undef;
1705
1706 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount, \@NbrAtomMinHydrogenCount);
1707 }
1708
1709 # Generate key 44 value as 1/0 indicating its presence/absence or count of its
1710 # presence in a molecule.
1711 #
1712 # Key 44 description: OTHER
1713 #
1714 sub _Generate166KeySetKey44 {
1715 my($This) = @_;
1716
1717 return $This->_DetectAtomKeys('Z');
1718 }
1719
1720 # Generate key 45 value as 1/0 indicating its presence/absence or count of its
1721 # presence in a molecule.
1722 #
1723 # Key 45 description: C=CN
1724 #
1725 sub _Generate166KeySetKey45 {
1726 my($This) = @_;
1727 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1728
1729 $CentralAtomSymbol = 'C';
1730 @NbrAtomSymbols = ('C', 'N');
1731 @NbrBondSymbols = ('=', undef);
1732
1733 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1734 }
1735
1736 # Generate key 46 value as 1/0 indicating its presence/absence or count of its
1737 # presence in a molecule.
1738 #
1739 # Key 46 description: BR
1740 #
1741 sub _Generate166KeySetKey46 {
1742 my($This) = @_;
1743
1744 return $This->_DetectAtomKeys('Br');
1745 }
1746
1747 # Generate key 47 value as 1/0 indicating its presence/absence or count of its
1748 # presence in a molecule.
1749 #
1750 # Key 47 description: SAN
1751 #
1752 sub _Generate166KeySetKey47 {
1753 my($This) = @_;
1754 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1755
1756 $CentralAtomSymbol = 'A';
1757 @NbrAtomSymbols = ('S', 'N');
1758 @NbrBondSymbols = (undef, undef);
1759
1760 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1761 }
1762
1763 # Generate key 48 value as 1/0 indicating its presence/absence or count of its
1764 # presence in a molecule.
1765 #
1766 # Key 48 description: OQ(O)O
1767 #
1768 sub _Generate166KeySetKey48 {
1769 my($This) = @_;
1770 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1771
1772 $CentralAtomSymbol = 'Q';
1773 @NbrAtomSymbols = ('O', 'O', 'O');
1774 @NbrBondSymbols = (undef, undef, undef);
1775
1776 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1777 }
1778
1779 # Generate key 49 value as 1/0 indicating its presence/absence or count of its
1780 # presence in a molecule.
1781 #
1782 # Key 49 description: CHARGE
1783 #
1784 sub _Generate166KeySetKey49 {
1785 my($This) = @_;
1786 my($Molecule, $KeyValue);
1787
1788 $Molecule = $This->GetMolecule();
1789 $KeyValue = $Molecule->GetFormalCharge() ? 1 : 0;
1790
1791 return $KeyValue;
1792 }
1793
1794 # Generate key 50 value as 1/0 indicating its presence/absence or count of its
1795 # presence in a molecule.
1796 #
1797 # Key 50 description: C=C(C)C
1798 #
1799 sub _Generate166KeySetKey50 {
1800 my($This) = @_;
1801 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1802
1803 $CentralAtomSymbol = 'C';
1804 @NbrAtomSymbols = ('C', 'C', 'C');
1805 @NbrBondSymbols = ('=', undef, undef);
1806
1807 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1808 }
1809
1810 # Generate key 51 value as 1/0 indicating its presence/absence or count of its
1811 # presence in a molecule.
1812 #
1813 # Key 51 description: CSO
1814 #
1815 sub _Generate166KeySetKey51 {
1816 my($This) = @_;
1817 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1818
1819 $CentralAtomSymbol = 'S';
1820 @NbrAtomSymbols = ('C', 'O');
1821 @NbrBondSymbols = (undef, undef);
1822
1823 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1824 }
1825
1826 # Generate key 52 value as 1/0 indicating its presence/absence or count of its
1827 # presence in a molecule.
1828 #
1829 # Key 52 description: NN
1830 #
1831 sub _Generate166KeySetKey52 {
1832 my($This) = @_;
1833
1834 return $This->_DetectBondKeys('N', 'N');
1835 }
1836
1837 # Generate key 53 value as 1/0 indicating its presence/absence or count of its
1838 # presence in a molecule.
1839 #
1840 # Key 53 description: QHAAAQH
1841 #
1842 sub _Generate166KeySetKey53 {
1843 my($This) = @_;
1844 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
1845
1846 @CentralAtomsSymbols = ('Q', 'A', 'A', 'A', 'Q');
1847 @CentralAtomsBondSymbols = (undef, undef, undef, undef);
1848 @CentralAtomsMinHydrogenCount = (1, undef, undef, undef, 1);
1849
1850 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
1851 }
1852
1853 # Generate key 54 value as 1/0 indicating its presence/absence or count of its
1854 # presence in a molecule.
1855 #
1856 # Key 54 description: QHAAQH
1857 #
1858 sub _Generate166KeySetKey54 {
1859 my($This) = @_;
1860 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
1861
1862 @CentralAtomsSymbols = ('Q', 'A', 'A', 'Q');
1863 @CentralAtomsBondSymbols = (undef, undef, undef);
1864 @CentralAtomsMinHydrogenCount = (1, undef, undef, 1);
1865
1866 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
1867 }
1868
1869 # Generate key 55 value as 1/0 indicating its presence/absence or count of its
1870 # presence in a molecule.
1871 #
1872 # Key 55 description: OSO
1873 #
1874 sub _Generate166KeySetKey55 {
1875 my($This) = @_;
1876 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1877
1878 $CentralAtomSymbol = 'S';
1879 @NbrAtomSymbols = ('O', 'O');
1880 @NbrBondSymbols = (undef, undef);
1881
1882 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1883 }
1884
1885 # Generate key 56 value as 1/0 indicating its presence/absence or count of its
1886 # presence in a molecule.
1887 #
1888 # Key 56 description: ON(O)C
1889 #
1890 sub _Generate166KeySetKey56 {
1891 my($This) = @_;
1892 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1893
1894 $CentralAtomSymbol = 'N';
1895 @NbrAtomSymbols = ('O', 'O', 'C');
1896 @NbrBondSymbols = (undef, undef, undef);
1897
1898 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1899 }
1900
1901 # Generate key 57 value as 1/0 indicating its presence/absence or count of its
1902 # presence in a molecule.
1903 #
1904 # Key 57 description: O HETEROCYCLE
1905 #
1906 sub _Generate166KeySetKey57 {
1907 my($This) = @_;
1908 my($MinKeyCount, $IsInRing) = (undef, 1);
1909
1910 return $This->_DetectAtomKeys('O', $MinKeyCount, $IsInRing);
1911 }
1912
1913 # Generate key 58 value as 1/0 indicating its presence/absence or count of its
1914 # presence in a molecule.
1915 #
1916 # Key 58 description: QSQ
1917 #
1918 sub _Generate166KeySetKey58 {
1919 my($This) = @_;
1920 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1921
1922 $CentralAtomSymbol = 'S';
1923 @NbrAtomSymbols = ('Q', 'Q');
1924 @NbrBondSymbols = (undef, undef);
1925
1926 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1927 }
1928
1929 # Generate key 59 value as 1/0 indicating its presence/absence or count of its
1930 # presence in a molecule.
1931 #
1932 # Key 59 description: Snot%A%A
1933 #
1934 sub _Generate166KeySetKey59 {
1935 my($This) = @_;
1936 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1937
1938 $CentralAtomSymbol = 'A';
1939 @NbrAtomSymbols = ('S', 'A');
1940 @NbrBondSymbols = ('not%', '%');
1941
1942 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1943 }
1944
1945 # Generate key 60 value as 1/0 indicating its presence/absence or count of its
1946 # presence in a molecule.
1947 #
1948 # Key 60 description: S=O
1949 #
1950 sub _Generate166KeySetKey60 {
1951 my($This) = @_;
1952 my($BondOrder) = 2;
1953
1954 return $This->_DetectBondKeys('S', 'O', $BondOrder);
1955 }
1956
1957 # Generate key 61 value as 1/0 indicating its presence/absence or count of its
1958 # presence in a molecule.
1959 #
1960 # Key 61 description: AS(A)A
1961 #
1962 sub _Generate166KeySetKey61 {
1963 my($This) = @_;
1964 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
1965
1966 $CentralAtomSymbol = 'S';
1967 @NbrAtomSymbols = ('A', 'A', 'A');
1968 @NbrBondSymbols = (undef, undef, undef);
1969
1970 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
1971 }
1972
1973 # Generate key 62 value as 1/0 indicating its presence/absence or count of its
1974 # presence in a molecule.
1975 #
1976 # Key 62 description: A$A!A$A
1977 #
1978 sub _Generate166KeySetKey62 {
1979 my($This) = @_;
1980 my($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, @NbrAtomsSymbols, @NbrAtomsBondSymbols);
1981
1982 ($BondAtomSymbol1, $BondAtomSymbol2) = ('A', 'A');
1983 $BondSymbol = '!';
1984
1985 @NbrAtomsSymbols = (['A'], ['A']);
1986 @NbrAtomsBondSymbols = (['$'], ['$']);
1987 return $This->_DetectBondNeighborhoodKeys($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, \@NbrAtomsSymbols, \@NbrAtomsBondSymbols);
1988 }
1989
1990 # Generate key 63 value as 1/0 indicating its presence/absence or count of its
1991 # presence in a molecule.
1992 #
1993 # Key 63 description: N=O
1994 #
1995 sub _Generate166KeySetKey63 {
1996 my($This) = @_;
1997 my($BondOrder) = 2;
1998
1999 return $This->_DetectBondKeys('N', 'O', $BondOrder);
2000 }
2001
2002 # Generate key 64 value as 1/0 indicating its presence/absence or count of its
2003 # presence in a molecule.
2004 #
2005 # Key 64 description: A$A!S
2006 #
2007 sub _Generate166KeySetKey64 {
2008 my($This) = @_;
2009 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2010
2011 $CentralAtomSymbol = 'A';
2012 @NbrAtomSymbols = ('A', 'S');
2013 @NbrBondSymbols = ('$', '!');
2014
2015 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2016 }
2017
2018 # Generate key 65 value as 1/0 indicating its presence/absence or count of its
2019 # presence in a molecule.
2020 #
2021 # Key 65 description: C%N
2022 #
2023 sub _Generate166KeySetKey65 {
2024 my($This) = @_;
2025 my($BondSymbol) = '%';
2026
2027 return $This->_DetectBondKeys('C', 'N', $BondSymbol);
2028 }
2029
2030 # Generate key 66 value as 1/0 indicating its presence/absence or count of its
2031 # presence in a molecule.
2032 #
2033 # Key 66 description: CC(C)(C)A
2034 #
2035 sub _Generate166KeySetKey66 {
2036 my($This) = @_;
2037 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2038
2039 $CentralAtomSymbol = 'C';
2040 @NbrAtomSymbols = ('C', 'C', 'C', 'A');
2041 @NbrBondSymbols = (undef, undef, undef, undef);
2042
2043 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2044 }
2045
2046 # Generate key 67 value as 1/0 indicating its presence/absence or count of its
2047 # presence in a molecule.
2048 #
2049 # Key 67 description: QS
2050 #
2051 sub _Generate166KeySetKey67 {
2052 my($This) = @_;
2053
2054 return $This->_DetectBondKeys('Q', 'S');
2055 }
2056
2057 # Generate key 68 value as 1/0 indicating its presence/absence or count of its
2058 # presence in a molecule.
2059 #
2060 # Key 68 description: QHQH (&...)
2061 #
2062 sub _Generate166KeySetKey68 {
2063 my($This) = @_;
2064 my($AtomSymbol1, $AtomSymbol2, $BondSymbol) = ('Q', 'Q', undef);
2065 my($MinKeyCount) = undef;
2066 my($Atom1MinHydrogenCount, $Atom2MinHydrogenCount) = (1, 1);
2067
2068 return $This->_DetectBondKeys($AtomSymbol1, $AtomSymbol2, $BondSymbol, $MinKeyCount, $Atom1MinHydrogenCount, $Atom2MinHydrogenCount);
2069 }
2070
2071 # Generate key 69 value as 1/0 indicating its presence/absence or count of its
2072 # presence in a molecule.
2073 #
2074 # Key 69 description: QQH
2075 #
2076 sub _Generate166KeySetKey69 {
2077 my($This) = @_;
2078 my($AtomSymbol1, $AtomSymbol2, $BondSymbol) = ('Q', 'Q', undef);
2079 my($MinKeyCount) = undef;
2080 my($Atom1MinHydrogenCount, $Atom2MinHydrogenCount) = (undef, 1);
2081
2082 return $This->_DetectBondKeys($AtomSymbol1, $AtomSymbol2, $BondSymbol, $MinKeyCount, $Atom1MinHydrogenCount, $Atom2MinHydrogenCount);
2083 }
2084
2085 # Generate key 70 value as 1/0 indicating its presence/absence or count of its
2086 # presence in a molecule.
2087 #
2088 # Key 70 description: QNQ
2089 #
2090 sub _Generate166KeySetKey70 {
2091 my($This) = @_;
2092 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2093
2094 $CentralAtomSymbol = 'N';
2095 @NbrAtomSymbols = ('Q', 'Q');
2096 @NbrBondSymbols = (undef, undef);
2097
2098 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2099 }
2100
2101 # Generate key 71 value as 1/0 indicating its presence/absence or count of its
2102 # presence in a molecule.
2103 #
2104 # Key 71 description: NO
2105 #
2106 sub _Generate166KeySetKey71 {
2107 my($This) = @_;
2108
2109 return $This->_DetectBondKeys('N', 'O');
2110 }
2111
2112 # Generate key 72 value as 1/0 indicating its presence/absence or count of its
2113 # presence in a molecule.
2114 #
2115 # Key 72 description: OAAO
2116 #
2117 sub _Generate166KeySetKey72 {
2118 my($This) = @_;
2119 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols);
2120
2121 @CentralAtomsSymbols = ('O', 'A', 'A', 'O');
2122 @CentralAtomsBondSymbols = (undef, undef, undef);
2123
2124 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols);
2125 }
2126
2127 # Generate key 73 value as 1/0 indicating its presence/absence or count of its
2128 # presence in a molecule.
2129 #
2130 # Key 73 description: S=A
2131 #
2132 sub _Generate166KeySetKey73 {
2133 my($This) = @_;
2134 my($BondOrder) = 2;
2135
2136 return $This->_DetectBondKeys('S', 'A', $BondOrder);
2137 }
2138
2139 # Generate key 74 value as 1/0 indicating its presence/absence or count of its
2140 # presence in a molecule.
2141 #
2142 # Key 74 description: CH3ACH3
2143 #
2144 sub _Generate166KeySetKey74 {
2145 my($This) = @_;
2146 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols, @NbrAtomMinHydrogenCount);
2147
2148 $CentralAtomSymbol = 'A';
2149 $CentralAtomMinHydrogenCount = undef;
2150
2151 @NbrAtomSymbols = ('C', 'C');
2152 @NbrBondSymbols = (undef, undef);
2153 @NbrAtomMinHydrogenCount = (3, 3);
2154
2155 $MinKeyCount = undef;
2156
2157 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount, \@NbrAtomMinHydrogenCount);
2158 }
2159
2160 # Generate key 75 value as 1/0 indicating its presence/absence or count of its
2161 # presence in a molecule.
2162 #
2163 # Key 75 description: A!N$A
2164 #
2165 sub _Generate166KeySetKey75 {
2166 my($This) = @_;
2167 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2168
2169 $CentralAtomSymbol = 'N';
2170 @NbrAtomSymbols = ('A', 'A');
2171 @NbrBondSymbols = ('!', '$');
2172
2173 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2174 }
2175
2176 # Generate key 76 value as 1/0 indicating its presence/absence or count of its
2177 # presence in a molecule.
2178 #
2179 # Key 76 description: C=C(A)A
2180 #
2181 sub _Generate166KeySetKey76 {
2182 my($This) = @_;
2183 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2184
2185 $CentralAtomSymbol = 'C';
2186 @NbrAtomSymbols = ('C', 'A', 'A');
2187 @NbrBondSymbols = ('=', undef, undef);
2188
2189 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2190 }
2191
2192 # Generate key 77 value as 1/0 indicating its presence/absence or count of its
2193 # presence in a molecule.
2194 #
2195 # Key 77 description: NAN
2196 #
2197 sub _Generate166KeySetKey77 {
2198 my($This) = @_;
2199 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2200
2201 $CentralAtomSymbol = 'A';
2202 @NbrAtomSymbols = ('N', 'N');
2203 @NbrBondSymbols = (undef, undef);
2204
2205 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2206 }
2207
2208 # Generate key 78 value as 1/0 indicating its presence/absence or count of its
2209 # presence in a molecule.
2210 #
2211 # Key 78 description: C=N
2212 #
2213 sub _Generate166KeySetKey78 {
2214 my($This) = @_;
2215 my($BondOrder) = 2;
2216
2217 return $This->_DetectBondKeys('C', 'N', $BondOrder);
2218 }
2219
2220 # Generate key 79 value as 1/0 indicating its presence/absence or count of its
2221 # presence in a molecule.
2222 #
2223 # Key 79 description: NAAN
2224 #
2225 sub _Generate166KeySetKey79 {
2226 my($This) = @_;
2227 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols);
2228
2229 @CentralAtomsSymbols = ('N', 'A', 'A', 'N');
2230 @CentralAtomsBondSymbols = (undef, undef, undef);
2231
2232 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols);
2233 }
2234
2235 # Generate key 80 value as 1/0 indicating its presence/absence or count of its
2236 # presence in a molecule.
2237 #
2238 # Key 80 description: NAAAN
2239 #
2240 sub _Generate166KeySetKey80 {
2241 my($This) = @_;
2242 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols);
2243
2244 @CentralAtomsSymbols = ('N', 'A', 'A', 'A', 'N');
2245 @CentralAtomsBondSymbols = (undef, undef, undef, undef);
2246
2247 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols);
2248 }
2249
2250 # Generate key 81 value as 1/0 indicating its presence/absence or count of its
2251 # presence in a molecule.
2252 #
2253 # Key 81 description: SA(A)A
2254 #
2255 sub _Generate166KeySetKey81 {
2256 my($This) = @_;
2257 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2258
2259 $CentralAtomSymbol = 'A';
2260 @NbrAtomSymbols = ('S', 'A', 'A');
2261 @NbrBondSymbols = (undef, undef, undef);
2262
2263 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2264 }
2265
2266 # Generate key 82 value as 1/0 indicating its presence/absence or count of its
2267 # presence in a molecule.
2268 #
2269 # Key 82 description: ACH2QH
2270 #
2271 sub _Generate166KeySetKey82 {
2272 my($This) = @_;
2273 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols, @NbrAtomMinHydrogenCount);
2274
2275 $CentralAtomSymbol = 'C';
2276 $CentralAtomMinHydrogenCount = 2;
2277
2278 @NbrAtomSymbols = ('A', 'Q');
2279 @NbrBondSymbols = (undef, undef);
2280 @NbrAtomMinHydrogenCount = (undef, 1);
2281
2282 $MinKeyCount = undef;
2283
2284 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount, \@NbrAtomMinHydrogenCount);
2285 }
2286
2287 # Generate key 83 value as 1/0 indicating its presence/absence or count of its
2288 # presence in a molecule.
2289 #
2290 # Key 83 description: QAAAA@1
2291 #
2292 sub _Generate166KeySetKey83 {
2293 my($This) = @_;
2294 my($Atom, $KeyValue, $RingSize);
2295
2296 $RingSize = 5;
2297 $KeyValue = 0;
2298 ATOM: for $Atom (@{$This->{Atoms}}) {
2299 if ($This->_IsHeteroAtom($Atom) && $Atom->IsInRingOfSize($RingSize)) {
2300 if ($This->{KeyBits}) {
2301 $KeyValue = 1;
2302 last ATOM;
2303 }
2304 $KeyValue++;
2305 }
2306 }
2307 return $KeyValue;
2308 }
2309
2310 # Generate key 84 value as 1/0 indicating its presence/absence or count of its
2311 # presence in a molecule.
2312 #
2313 # Key 84 description: NH2
2314 #
2315 sub _Generate166KeySetKey84 {
2316 my($This) = @_;
2317 my($MinKeyCount, $IsInRing, $MinHydrogenCount) = (undef, undef, 2);
2318
2319 return $This->_DetectAtomKeys('N', $MinKeyCount, $IsInRing, $MinHydrogenCount);
2320 }
2321
2322 # Generate key 85 value as 1/0 indicating its presence/absence or count of its
2323 # presence in a molecule.
2324 #
2325 # Key 85 description: CN(C)C
2326 #
2327 sub _Generate166KeySetKey85 {
2328 my($This) = @_;
2329 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2330
2331 $CentralAtomSymbol = 'N';
2332 @NbrAtomSymbols = ('C', 'C', 'C');
2333 @NbrBondSymbols = (undef, undef, undef);
2334
2335 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2336 }
2337
2338 # Generate key 86 value as 1/0 indicating its presence/absence or count of its
2339 # presence in a molecule.
2340 #
2341 # Key 86 description: CH2QCH2
2342 #
2343 sub _Generate166KeySetKey86 {
2344 my($This) = @_;
2345 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols, @NbrAtomMinHydrogenCount);
2346
2347 $CentralAtomSymbol = 'Q';
2348 $CentralAtomMinHydrogenCount = undef;
2349
2350 @NbrAtomSymbols = ('C', 'C');
2351 @NbrBondSymbols = (undef, undef);
2352 @NbrAtomMinHydrogenCount = (2, 2);
2353
2354 $MinKeyCount = undef;
2355
2356 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount, \@NbrAtomMinHydrogenCount);
2357 }
2358
2359 # Generate key 87 value as 1/0 indicating its presence/absence or count of its
2360 # presence in a molecule.
2361 #
2362 # Key 87 description: X!A$A
2363 #
2364 sub _Generate166KeySetKey87 {
2365 my($This) = @_;
2366 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2367
2368 $CentralAtomSymbol = 'A';
2369 @NbrAtomSymbols = ('X', 'A');
2370 @NbrBondSymbols = ('!', '$');
2371
2372 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2373 }
2374
2375 # Generate key 88 value as 1/0 indicating its presence/absence or count of its
2376 # presence in a molecule.
2377 #
2378 # Key 88 description: S
2379 #
2380 sub _Generate166KeySetKey88 {
2381 my($This) = @_;
2382
2383 return $This->_DetectAtomKeys('S');
2384 }
2385
2386 # Generate key 89 value as 1/0 indicating its presence/absence or count of its
2387 # presence in a molecule.
2388 #
2389 # Key 89 description: OAAAO
2390 #
2391 sub _Generate166KeySetKey89 {
2392 my($This) = @_;
2393 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols);
2394
2395 @CentralAtomsSymbols = ('O', 'A', 'A', 'A', 'O');
2396 @CentralAtomsBondSymbols = (undef, undef, undef, undef);
2397
2398 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols);
2399 }
2400
2401 # Generate key 90 value as 1/0 indicating its presence/absence or count of its
2402 # presence in a molecule.
2403 #
2404 # Key 90 description: QHAACH2A
2405 #
2406 sub _Generate166KeySetKey90 {
2407 my($This) = @_;
2408 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
2409
2410 @CentralAtomsSymbols = ('Q', 'A', 'A', 'C', 'A');
2411 @CentralAtomsBondSymbols = (undef, undef, undef, undef);
2412 @CentralAtomsMinHydrogenCount = (1, undef, undef, 2, undef);
2413
2414 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
2415 }
2416
2417 # Generate key 91 value as 1/0 indicating its presence/absence or count of its
2418 # presence in a molecule.
2419 #
2420 # Key 91 description: QHAAACH2A
2421 #
2422 sub _Generate166KeySetKey91 {
2423 my($This) = @_;
2424 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
2425
2426 @CentralAtomsSymbols = ('Q', 'A', 'A', 'A', 'C', 'A');
2427 @CentralAtomsBondSymbols = (undef, undef, undef, undef, undef);
2428 @CentralAtomsMinHydrogenCount = (1, undef, undef, undef, 2, undef);
2429
2430 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
2431 }
2432
2433 # Generate key 92 value as 1/0 indicating its presence/absence or count of its
2434 # presence in a molecule.
2435 #
2436 # Key 92 description: OC(N)C
2437 #
2438 sub _Generate166KeySetKey92 {
2439 my($This) = @_;
2440 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2441
2442 $CentralAtomSymbol = 'C';
2443 @NbrAtomSymbols = ('O', 'N', 'C');
2444 @NbrBondSymbols = (undef, undef, undef);
2445
2446 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2447 }
2448
2449 # Generate key 93 value as 1/0 indicating its presence/absence or count of its
2450 # presence in a molecule.
2451 #
2452 # Key 93 description: QCH3
2453 #
2454 sub _Generate166KeySetKey93 {
2455 my($This) = @_;
2456 my($AtomSymbol1, $AtomSymbol2, $BondSymbol) = ('Q', 'C', undef);
2457 my($MinKeyCount) = undef;
2458 my($Atom1MinHydrogenCount, $Atom2MinHydrogenCount) = (undef, 3);
2459
2460 return $This->_DetectBondKeys($AtomSymbol1, $AtomSymbol2, $BondSymbol, $MinKeyCount, $Atom1MinHydrogenCount, $Atom2MinHydrogenCount);
2461 }
2462
2463 # Generate key 94 value as 1/0 indicating its presence/absence or count of its
2464 # presence in a molecule.
2465 #
2466 # Key 94 description: QN
2467 #
2468 sub _Generate166KeySetKey94 {
2469 my($This) = @_;
2470
2471 return $This->_DetectBondKeys('Q', 'N');
2472 }
2473
2474 # Generate key 95 value as 1/0 indicating its presence/absence or count of its
2475 # presence in a molecule.
2476 #
2477 # Key 95 description: NAAO
2478 #
2479 sub _Generate166KeySetKey95 {
2480 my($This) = @_;
2481 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols);
2482
2483 @CentralAtomsSymbols = ('N', 'A', 'A', 'O');
2484 @CentralAtomsBondSymbols = (undef, undef, undef);
2485
2486 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols);
2487 }
2488
2489 # Generate key 96 value as 1/0 indicating its presence/absence or count of its
2490 # presence in a molecule.
2491 #
2492 # Key 96 description: 5M RING
2493 #
2494 sub _Generate166KeySetKey96 {
2495 my($This) = @_;
2496 my($Molecule, $KeyValue, $RingSize, $NumOfRings);
2497
2498 $RingSize = 5;
2499 $Molecule = $This->GetMolecule();
2500 $NumOfRings = $Molecule->GetNumOfRingsWithSize($RingSize);
2501
2502 if ($This->{KeyBits}) {
2503 $KeyValue = $NumOfRings ? 1 : 0;
2504 }
2505 else {
2506 $KeyValue = $NumOfRings;
2507 }
2508 return $KeyValue;
2509 }
2510
2511 # Generate key 97 value as 1/0 indicating its presence/absence or count of its
2512 # presence in a molecule.
2513 #
2514 # Key 97 description: NAAAO
2515 #
2516 sub _Generate166KeySetKey97 {
2517 my($This) = @_;
2518 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols);
2519
2520 @CentralAtomsSymbols = ('N', 'A', 'A', 'A', 'O');
2521 @CentralAtomsBondSymbols = (undef, undef, undef, undef);
2522
2523 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols);
2524 }
2525
2526 # Generate key 98 value as 1/0 indicating its presence/absence or count of its
2527 # presence in a molecule.
2528 #
2529 # Key 98 description: QAAAAA@1
2530 #
2531 sub _Generate166KeySetKey98 {
2532 my($This) = @_;
2533 my($Atom, $KeyValue, $RingSize);
2534
2535 $RingSize = 6;
2536 $KeyValue = 0;
2537 ATOM: for $Atom (@{$This->{Atoms}}) {
2538 if ($This->_IsHeteroAtom($Atom) && $Atom->IsInRingOfSize($RingSize)) {
2539 if ($This->{KeyBits}) {
2540 $KeyValue = 1;
2541 last ATOM;
2542 }
2543 $KeyValue++;
2544 }
2545 }
2546 return $KeyValue;
2547 }
2548
2549 # Generate key 99 value as 1/0 indicating its presence/absence or count of its
2550 # presence in a molecule.
2551 #
2552 # Key 99 description: C=C
2553 #
2554 sub _Generate166KeySetKey99 {
2555 my($This) = @_;
2556 my($BondOrder) = 2;
2557
2558 return $This->_DetectBondKeys('C', 'C', $BondOrder);
2559 }
2560
2561 # Generate key 100 value as 1/0 indicating its presence/absence or count of its
2562 # presence in a molecule.
2563 #
2564 # Key 100 description: ACH2N
2565 #
2566 sub _Generate166KeySetKey100 {
2567 my($This) = @_;
2568 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols);
2569
2570 $CentralAtomSymbol = 'C';
2571 $CentralAtomMinHydrogenCount = 2;
2572
2573 @NbrAtomSymbols = ('A', 'N');
2574 @NbrBondSymbols = (undef, undef);
2575
2576 $MinKeyCount = undef;
2577
2578 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount);
2579 }
2580
2581 # Generate key 101 value as 1/0 indicating its presence/absence or count of its
2582 # presence in a molecule.
2583 #
2584 # Key 101 description: 8M RING
2585 #
2586 sub _Generate166KeySetKey101 {
2587 my($This) = @_;
2588 my($Molecule, $KeyValue, $RingSize, $NumOfRings);
2589
2590 $RingSize = 8;
2591 $Molecule = $This->GetMolecule();
2592 $NumOfRings = $Molecule->GetNumOfRingsWithSize($RingSize);
2593
2594 if ($This->{KeyBits}) {
2595 $KeyValue = $NumOfRings ? 1 : 0;
2596 }
2597 else {
2598 $KeyValue = $NumOfRings;
2599 }
2600 return $KeyValue;
2601 }
2602
2603 # Generate key 102 value as 1/0 indicating its presence/absence or count of its
2604 # presence in a molecule.
2605 #
2606 # Key 102 description: QO
2607 #
2608 sub _Generate166KeySetKey102 {
2609 my($This) = @_;
2610
2611 return $This->_DetectBondKeys('Q', 'O');
2612 }
2613
2614 # Generate key 103 value as 1/0 indicating its presence/absence or count of its
2615 # presence in a molecule.
2616 #
2617 # Key 103 description: CL
2618 #
2619 sub _Generate166KeySetKey103 {
2620 my($This) = @_;
2621
2622 return $This->_DetectAtomKeys('Cl');
2623 }
2624
2625 # Generate key 104 value as 1/0 indicating its presence/absence or count of its
2626 # presence in a molecule.
2627 #
2628 # Key 104 description: QHACH2A
2629 #
2630 sub _Generate166KeySetKey104 {
2631 my($This) = @_;
2632 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
2633
2634 @CentralAtomsSymbols = ('Q', 'A', 'C', 'A');
2635 @CentralAtomsBondSymbols = (undef, undef, undef);
2636 @CentralAtomsMinHydrogenCount = (1, undef, 2, undef);
2637
2638 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
2639 }
2640
2641 # Generate key 105 value as 1/0 indicating its presence/absence or count of its
2642 # presence in a molecule.
2643 #
2644 # Key 105 description: A$A($A)$A
2645 #
2646 sub _Generate166KeySetKey105 {
2647 my($This) = @_;
2648 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2649
2650 $CentralAtomSymbol = 'A';
2651 @NbrAtomSymbols = ('A', 'A', 'A');
2652 @NbrBondSymbols = ('$', '$', '$');
2653
2654 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2655 }
2656
2657 # Generate key 106 value as 1/0 indicating its presence/absence or count of its
2658 # presence in a molecule.
2659 #
2660 # Key 106 description: QA(Q)Q
2661 #
2662 sub _Generate166KeySetKey106 {
2663 my($This) = @_;
2664 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2665
2666 $CentralAtomSymbol = 'A';
2667 @NbrAtomSymbols = ('Q', 'Q', 'Q');
2668 @NbrBondSymbols = (undef, undef, undef);
2669
2670 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2671 }
2672
2673 # Generate key 107 value as 1/0 indicating its presence/absence or count of its
2674 # presence in a molecule.
2675 #
2676 # Key 107 description: XA(A)A
2677 #
2678 sub _Generate166KeySetKey107 {
2679 my($This) = @_;
2680 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2681
2682 $CentralAtomSymbol = 'A';
2683 @NbrAtomSymbols = ('X', 'A', 'A');
2684 @NbrBondSymbols = (undef, undef, undef);
2685
2686 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2687 }
2688
2689 # Generate key 108 value as 1/0 indicating its presence/absence or count of its
2690 # presence in a molecule.
2691 #
2692 # Key 108 description: CH3AAACH2A
2693 #
2694 sub _Generate166KeySetKey108 {
2695 my($This) = @_;
2696 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
2697
2698 @CentralAtomsSymbols = ('C', 'A', 'A', 'A', 'C', 'A');
2699 @CentralAtomsBondSymbols = (undef, undef, undef, undef, undef);
2700 @CentralAtomsMinHydrogenCount = (3, undef, undef, undef, 1, undef);
2701
2702 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
2703 }
2704
2705 # Generate key 109 value as 1/0 indicating its presence/absence or count of its
2706 # presence in a molecule.
2707 #
2708 # Key 109 description: ACH2O
2709 #
2710 sub _Generate166KeySetKey109 {
2711 my($This) = @_;
2712 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols);
2713
2714 $CentralAtomSymbol = 'C';
2715 $CentralAtomMinHydrogenCount = 2;
2716
2717 @NbrAtomSymbols = ('A', 'O');
2718 @NbrBondSymbols = (undef, undef);
2719
2720 $MinKeyCount = undef;
2721
2722 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount);
2723 }
2724
2725 # Generate key 110 value as 1/0 indicating its presence/absence or count of its
2726 # presence in a molecule.
2727 #
2728 # Key 110 description: NCO
2729 #
2730 sub _Generate166KeySetKey110 {
2731 my($This) = @_;
2732 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2733
2734 $CentralAtomSymbol = 'C';
2735 @NbrAtomSymbols = ('N', 'O');
2736 @NbrBondSymbols = (undef, undef);
2737
2738 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2739 }
2740
2741 # Generate key 111 value as 1/0 indicating its presence/absence or count of its
2742 # presence in a molecule.
2743 #
2744 # Key 111 description: NACH2A
2745 #
2746 sub _Generate166KeySetKey111 {
2747 my($This) = @_;
2748 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
2749
2750 @CentralAtomsSymbols = ('N', 'A', 'C', 'A');
2751 @CentralAtomsBondSymbols = (undef, undef, undef);
2752 @CentralAtomsMinHydrogenCount = (undef, undef, 2, undef);
2753
2754 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
2755 }
2756
2757 # Generate key 112 value as 1/0 indicating its presence/absence or count of its
2758 # presence in a molecule.
2759 #
2760 # Key 112 description: AA(A)(A)A
2761 #
2762 sub _Generate166KeySetKey112 {
2763 my($This) = @_;
2764 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2765
2766 $CentralAtomSymbol = 'A';
2767 @NbrAtomSymbols = ('A', 'A', 'A', 'A');
2768 @NbrBondSymbols = (undef, undef, undef, undef);
2769
2770 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2771 }
2772
2773 # Generate key 113 value as 1/0 indicating its presence/absence or count of its
2774 # presence in a molecule.
2775 #
2776 # Key 113 description: Onot%A%A
2777 #
2778 sub _Generate166KeySetKey113 {
2779 my($This) = @_;
2780 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2781
2782 $CentralAtomSymbol = 'A';
2783 @NbrAtomSymbols = ('O', 'A');
2784 @NbrBondSymbols = ('not%', '%');
2785
2786 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2787 }
2788
2789 # Generate key 114 value as 1/0 indicating its presence/absence or count of its
2790 # presence in a molecule.
2791 #
2792 # Key 114 description: CH3CH2A
2793 #
2794 sub _Generate166KeySetKey114 {
2795 my($This) = @_;
2796 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols, @NbrAtomMinHydrogenCount);
2797
2798 $CentralAtomSymbol = 'C';
2799 $CentralAtomMinHydrogenCount = 2;
2800
2801 @NbrAtomSymbols = ('C', 'A');
2802 @NbrBondSymbols = (undef, undef);
2803 @NbrAtomMinHydrogenCount = (3, undef);
2804
2805 $MinKeyCount = undef;
2806
2807 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount, \@NbrAtomMinHydrogenCount);
2808 }
2809
2810 # Generate key 115 value as 1/0 indicating its presence/absence or count of its
2811 # presence in a molecule.
2812 #
2813 # Key 115 description: CH3ACH2A
2814 #
2815 sub _Generate166KeySetKey115 {
2816 my($This) = @_;
2817 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
2818
2819 @CentralAtomsSymbols = ('C', 'A', 'C', 'A');
2820 @CentralAtomsBondSymbols = (undef, undef, undef);
2821 @CentralAtomsMinHydrogenCount = (3, undef, 2, undef);
2822
2823 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
2824 }
2825
2826 # Generate key 116 value as 1/0 indicating its presence/absence or count of its
2827 # presence in a molecule.
2828 #
2829 # Key 116 description: CH3AACH2A
2830 #
2831 sub _Generate166KeySetKey116 {
2832 my($This) = @_;
2833 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
2834
2835 @CentralAtomsSymbols = ('C', 'A', 'A', 'C', 'A');
2836 @CentralAtomsBondSymbols = (undef, undef, undef, undef);
2837 @CentralAtomsMinHydrogenCount = (3, undef, undef, 2, undef);
2838
2839 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
2840 }
2841
2842 # Generate key 117 value as 1/0 indicating its presence/absence or count of its
2843 # presence in a molecule.
2844 #
2845 # Key 117 description: NAO
2846 #
2847 sub _Generate166KeySetKey117 {
2848 my($This) = @_;
2849 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2850
2851 $CentralAtomSymbol = 'A';
2852 @NbrAtomSymbols = ('N', 'O');
2853 @NbrBondSymbols = (undef, undef);
2854
2855 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2856 }
2857
2858 # Generate key 118 value as 1/0 indicating its presence/absence or count of its
2859 # presence in a molecule.
2860 #
2861 # Key 118 description: ACH2CH2A > 1
2862 #
2863 sub _Generate166KeySetKey118 {
2864 my($This) = @_;
2865 my($MinKeyCount, @CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
2866
2867 $MinKeyCount = 2;
2868 @CentralAtomsSymbols = ('A', 'C', 'C', 'A');
2869 @CentralAtomsBondSymbols = (undef, undef, undef);
2870 @CentralAtomsMinHydrogenCount = (undef, 2, 2, undef);
2871
2872 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount, $MinKeyCount);
2873 }
2874
2875 # Generate key 119 value as 1/0 indicating its presence/absence or count of its
2876 # presence in a molecule.
2877 #
2878 # Key 119 description: N=A
2879 #
2880 sub _Generate166KeySetKey119 {
2881 my($This) = @_;
2882 my($BondOrder) = 2;
2883
2884 return $This->_DetectBondKeys('N', 'A', $BondOrder);
2885 }
2886
2887 # Generate key 120 value as 1/0 indicating its presence/absence or count of its
2888 # presence in a molecule.
2889 #
2890 # Key 120 description: HETEROCYCLIC ATOM > 1 (&...)
2891 #
2892 sub _Generate166KeySetKey120 {
2893 my($This) = @_;
2894 my($MinKeyCount, $IsInRing) = (2, 1);
2895
2896 return $This->_DetectAtomKeys('Q', $MinKeyCount, $IsInRing);
2897 }
2898
2899 # Generate key 121 value as 1/0 indicating its presence/absence or count of its
2900 # presence in a molecule.
2901 #
2902 # Key 121 description: N HETEROCYCLE
2903 #
2904 sub _Generate166KeySetKey121 {
2905 my($This) = @_;
2906 my($MinKeyCount, $IsInRing) = (undef, 1);
2907
2908 return $This->_DetectAtomKeys('N', $MinKeyCount, $IsInRing);
2909 }
2910
2911 # Generate key 122 value as 1/0 indicating its presence/absence or count of its
2912 # presence in a molecule.
2913 #
2914 # Key 122 description: AN(A)A
2915 #
2916 sub _Generate166KeySetKey122 {
2917 my($This) = @_;
2918 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2919
2920 $CentralAtomSymbol = 'N';
2921 @NbrAtomSymbols = ('A', 'A', 'A');
2922 @NbrBondSymbols = (undef, undef, undef);
2923
2924 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2925 }
2926
2927 # Generate key 123 value as 1/0 indicating its presence/absence or count of its
2928 # presence in a molecule.
2929 #
2930 # Key 123 description: OCO
2931 #
2932 sub _Generate166KeySetKey123 {
2933 my($This) = @_;
2934 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2935
2936 $CentralAtomSymbol = 'C';
2937 @NbrAtomSymbols = ('O', 'O');
2938 @NbrBondSymbols = (undef, undef);
2939
2940 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2941 }
2942
2943 # Generate key 124 value as 1/0 indicating its presence/absence or count of its
2944 # presence in a molecule.
2945 #
2946 # Key 124 description: QQ
2947 #
2948 sub _Generate166KeySetKey124 {
2949 my($This) = @_;
2950
2951 return $This->_DetectBondKeys('Q', 'Q');
2952 }
2953
2954 # Generate key 125 value as 1/0 indicating its presence/absence or count of its
2955 # presence in a molecule.
2956 #
2957 # Key 125 description: AROMATIC RING > 1
2958 #
2959 sub _Generate166KeySetKey125 {
2960 my($This) = @_;
2961 my($Molecule, $NumOfAromaticRings, $KeyValue);
2962
2963 $Molecule = $This->GetMolecule();
2964 $NumOfAromaticRings = $Molecule->GetNumOfAromaticRings();
2965
2966 if ($This->{KeyBits}) {
2967 $KeyValue = ($NumOfAromaticRings > 1) ? 1 : 0;
2968 }
2969 else {
2970 $KeyValue = $NumOfAromaticRings;
2971 }
2972 return $KeyValue;
2973 }
2974
2975 # Generate key 126 value as 1/0 indicating its presence/absence or count of its
2976 # presence in a molecule.
2977 #
2978 # Key 126 description: A!O!A
2979 #
2980 sub _Generate166KeySetKey126 {
2981 my($This) = @_;
2982 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
2983
2984 $CentralAtomSymbol = 'O';
2985 @NbrAtomSymbols = ('A', 'A');
2986 @NbrBondSymbols = ('!', '!');
2987
2988 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
2989 }
2990
2991 # Generate key 127 value as 1/0 indicating its presence/absence or count of its
2992 # presence in a molecule.
2993 #
2994 # Key 127 description: A$A!O > 1 (&...)
2995 #
2996 sub _Generate166KeySetKey127 {
2997 my($This) = @_;
2998 my($CentralAtomSymbol, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols);
2999
3000 $CentralAtomSymbol = 'A';
3001 @NbrAtomSymbols = ('A', 'O');
3002 @NbrBondSymbols = ('$', '!');
3003 $MinKeyCount = 2;
3004
3005 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount);
3006 }
3007
3008 # Generate key 128 value as 1/0 indicating its presence/absence or count of its
3009 # presence in a molecule.
3010 #
3011 # Key 128 description: ACH2AAACH2A
3012 #
3013 sub _Generate166KeySetKey128 {
3014 my($This) = @_;
3015 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
3016
3017 @CentralAtomsSymbols = ('A', 'C', 'A', 'A', 'A', 'C', 'A');
3018 @CentralAtomsBondSymbols = (undef, undef, undef, undef, undef, undef);
3019 @CentralAtomsMinHydrogenCount = (undef, 2, undef, undef, undef, 2, undef);
3020
3021 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
3022 }
3023
3024 # Generate key 129 value as 1/0 indicating its presence/absence or count of its
3025 # presence in a molecule.
3026 #
3027 # Key 129 description: ACH2AACH2A
3028 #
3029 sub _Generate166KeySetKey129 {
3030 my($This) = @_;
3031 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
3032
3033 @CentralAtomsSymbols = ('A', 'C', 'A', 'A', 'C', 'A');
3034 @CentralAtomsBondSymbols = (undef, undef, undef, undef, undef);
3035 @CentralAtomsMinHydrogenCount = (undef, 2, undef, undef, 2, undef);
3036
3037 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
3038 }
3039
3040 # Generate key 130 value as 1/0 indicating its presence/absence or count of its
3041 # presence in a molecule.
3042 #
3043 # Key 130 description: QQ > 1 (&...)
3044 #
3045 sub _Generate166KeySetKey130 {
3046 my($This) = @_;
3047 my($BondOrder, $MinKeyCount) = (undef, 2);
3048
3049 return $This->_DetectBondKeys('Q', 'Q', $BondOrder, $MinKeyCount);
3050 }
3051
3052 # Generate key 131 value as 1/0 indicating its presence/absence or count of its
3053 # presence in a molecule.
3054 #
3055 # Key 131 description: QH > 1
3056 #
3057 sub _Generate166KeySetKey131 {
3058 my($This) = @_;
3059 my($MinKeyCount, $IsInRing, $MinHydrogenCount) = (2, undef, 1);
3060
3061 return $This->_DetectAtomKeys('Q', $MinKeyCount, $IsInRing, $MinHydrogenCount);
3062 }
3063
3064 # Generate key 132 value as 1/0 indicating its presence/absence or count of its
3065 # presence in a molecule.
3066 #
3067 # Key 132 description: OACH2A
3068 #
3069 sub _Generate166KeySetKey132 {
3070 my($This) = @_;
3071 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
3072
3073 @CentralAtomsSymbols = ('O', 'A', 'C', 'A');
3074 @CentralAtomsBondSymbols = (undef, undef, undef);
3075 @CentralAtomsMinHydrogenCount = (undef, undef, 2, undef);
3076
3077 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
3078 }
3079
3080 # Generate key 133 value as 1/0 indicating its presence/absence or count of its
3081 # presence in a molecule.
3082 #
3083 # Key 133 description: A$A!N
3084 #
3085 sub _Generate166KeySetKey133 {
3086 my($This) = @_;
3087 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
3088
3089 $CentralAtomSymbol = 'A';
3090 @NbrAtomSymbols = ('A', 'N');
3091 @NbrBondSymbols = ('$', '!');
3092
3093 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3094 }
3095
3096 # Generate key 134 value as 1/0 indicating its presence/absence or count of its
3097 # presence in a molecule.
3098 #
3099 # Key 134 description: X (HALOGEN)
3100 #
3101 sub _Generate166KeySetKey134 {
3102 my($This) = @_;
3103
3104 return $This->_DetectAtomKeys('X');
3105 }
3106
3107 # Generate key 135 value as 1/0 indicating its presence/absence or count of its
3108 # presence in a molecule.
3109 #
3110 # Key 135 description: Nnot%A%A
3111 #
3112 sub _Generate166KeySetKey135 {
3113 my($This) = @_;
3114 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
3115
3116 $CentralAtomSymbol = 'A';
3117 @NbrAtomSymbols = ('N', 'A');
3118 @NbrBondSymbols = ('not%', '%');
3119
3120 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3121 }
3122
3123 # Generate key 136 value as 1/0 indicating its presence/absence or count of its
3124 # presence in a molecule.
3125 #
3126 # Key 136 description: O=A > 1
3127 #
3128 sub _Generate166KeySetKey136 {
3129 my($This) = @_;
3130 my($BondOrder, $MinKeyCount) = (2, 2);
3131
3132 return $This->_DetectBondKeys('O', 'A', $BondOrder, $MinKeyCount);
3133 }
3134
3135 # Generate key 137 value as 1/0 indicating its presence/absence or count of its
3136 # presence in a molecule.
3137 #
3138 # Key 137 description: HETEROCYCLE
3139 #
3140 sub _Generate166KeySetKey137 {
3141 my($This) = @_;
3142 my($MinKeyCount, $IsInRing) = (1, 1);
3143
3144 return $This->_DetectAtomKeys('Q', $MinKeyCount, $IsInRing);
3145 }
3146
3147 # Generate key 138 value as 1/0 indicating its presence/absence or count of its
3148 # presence in a molecule.
3149 #
3150 # Key 138 description: QCH2A > 1 (&...)
3151 #
3152 sub _Generate166KeySetKey138 {
3153 my($This) = @_;
3154 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols);
3155
3156 $CentralAtomSymbol = 'C';
3157 @NbrAtomSymbols = ('Q', 'A');
3158 @NbrBondSymbols = (undef, undef);
3159 $MinKeyCount = 2;
3160 $CentralAtomMinHydrogenCount = 2;
3161
3162 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount);
3163 }
3164
3165 # Generate key 139 value as 1/0 indicating its presence/absence or count of its
3166 # presence in a molecule.
3167 #
3168 # Key 139 description: OH
3169 #
3170 sub _Generate166KeySetKey139 {
3171 my($This) = @_;
3172 my($MinKeyCount, $IsInRing, $MinHydrogenCount) = (undef, undef, 1);
3173
3174 return $This->_DetectAtomKeys('O', $MinKeyCount, $IsInRing, $MinHydrogenCount);
3175 }
3176
3177 # Generate key 140 value as 1/0 indicating its presence/absence or count of its
3178 # presence in a molecule.
3179 #
3180 # Key 140 description: O > 3 (&...)
3181 #
3182 sub _Generate166KeySetKey140 {
3183 my($This) = @_;
3184 my($MinKeyCount) = 4;
3185
3186 return $This->_DetectAtomKeys('O', $MinKeyCount);
3187 }
3188
3189 # Generate key 141 value as 1/0 indicating its presence/absence or count of its
3190 # presence in a molecule.
3191 #
3192 # Key 141 description: CH3 > 2 (&...)
3193 #
3194 sub _Generate166KeySetKey141 {
3195 my($This) = @_;
3196 my($MinKeyCount, $IsInRing, $MinHydrogenCount) = (3, undef, 3);
3197
3198 return $This->_DetectAtomKeys('C', $MinKeyCount, $IsInRing, $MinHydrogenCount);
3199 }
3200
3201 # Generate key 142 value as 1/0 indicating its presence/absence or count of its
3202 # presence in a molecule.
3203 #
3204 # Key 142 description: N > 1
3205 #
3206 sub _Generate166KeySetKey142 {
3207 my($This) = @_;
3208 my($MinKeyCount) = 2;
3209
3210 return $This->_DetectAtomKeys('N', $MinKeyCount);
3211 }
3212
3213 # Generate key 143 value as 1/0 indicating its presence/absence or count of its
3214 # presence in a molecule.
3215 #
3216 # Key 143 description: A$A!O
3217 #
3218 sub _Generate166KeySetKey143 {
3219 my($This) = @_;
3220 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
3221
3222 $CentralAtomSymbol = 'A';
3223 @NbrAtomSymbols = ('A', 'O');
3224 @NbrBondSymbols = ('$', '!');
3225
3226 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3227 }
3228
3229 # Generate key 144 value as 1/0 indicating its presence/absence or count of its
3230 # presence in a molecule.
3231 #
3232 # Key 144 description: Anot%A%Anot%A
3233 #
3234 sub _Generate166KeySetKey144 {
3235 my($This) = @_;
3236 my($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, @NbrAtomsSymbols, @NbrAtomsBondSymbols);
3237
3238 ($BondAtomSymbol1, $BondAtomSymbol2) = ('A', 'A');
3239 $BondSymbol = '%';
3240
3241 @NbrAtomsSymbols = (['A'], ['A']);
3242 @NbrAtomsBondSymbols = (['not%'], ['not%']);
3243 return $This->_DetectBondNeighborhoodKeys($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, \@NbrAtomsSymbols, \@NbrAtomsBondSymbols);
3244 }
3245
3246 # Generate key 145 value as 1/0 indicating its presence/absence or count of its
3247 # presence in a molecule.
3248 #
3249 # Key 145 description: 6M RING > 1
3250 #
3251 sub _Generate166KeySetKey145 {
3252 my($This) = @_;
3253 my($Molecule, $KeyValue, $RingSize, $NumOfRings);
3254
3255 $RingSize = 6;
3256 $Molecule = $This->GetMolecule();
3257 $NumOfRings = $Molecule->GetNumOfRingsWithSize($RingSize);
3258
3259 if ($This->{KeyBits}) {
3260 $KeyValue = ($NumOfRings > 1) ? 1 : 0;
3261 }
3262 else {
3263 $KeyValue = $NumOfRings;
3264 }
3265 return $KeyValue;
3266 }
3267
3268 # Generate key 146 value as 1/0 indicating its presence/absence or count of its
3269 # presence in a molecule.
3270 #
3271 # Key 146 description: O > 2
3272 #
3273 sub _Generate166KeySetKey146 {
3274 my($This) = @_;
3275 my($MinKeyCount) = 3;
3276
3277 return $This->_DetectAtomKeys('O', $MinKeyCount);
3278 }
3279
3280 # Generate key 147 value as 1/0 indicating its presence/absence or count of its
3281 # presence in a molecule.
3282 #
3283 # Key 147 description: ACH2CH2A
3284 #
3285 sub _Generate166KeySetKey147 {
3286 my($This) = @_;
3287 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount);
3288
3289 @CentralAtomsSymbols = ('A', 'C', 'C', 'A');
3290 @CentralAtomsBondSymbols = (undef, undef, undef);
3291 @CentralAtomsMinHydrogenCount = (undef, 2, 2, undef);
3292
3293 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount);
3294 }
3295
3296 # Generate key 148 value as 1/0 indicating its presence/absence or count of its
3297 # presence in a molecule.
3298 #
3299 # Key 148 description: AQ(A)A
3300 #
3301 sub _Generate166KeySetKey148 {
3302 my($This) = @_;
3303 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
3304
3305 $CentralAtomSymbol = 'Q';
3306 @NbrAtomSymbols = ('A', 'A', 'A');
3307 @NbrBondSymbols = (undef, undef, undef);
3308
3309 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3310 }
3311
3312 # Generate key 149 value as 1/0 indicating its presence/absence or count of its
3313 # presence in a molecule.
3314 #
3315 # Key 149 description: CH3 > 1
3316 #
3317 sub _Generate166KeySetKey149 {
3318 my($This) = @_;
3319 my($MinKeyCount, $IsInRing, $MinHydrogenCount) = (2, undef, 3);
3320
3321 return $This->_DetectAtomKeys('C', $MinKeyCount, $IsInRing, $MinHydrogenCount);
3322 }
3323
3324 # Generate key 150 value as 1/0 indicating its presence/absence or count of its
3325 # presence in a molecule.
3326 #
3327 # Key 150 description: A!A$A!A
3328 #
3329 sub _Generate166KeySetKey150 {
3330 my($This) = @_;
3331 my(@CentralAtomsSymbols, @CentralAtomsBondSymbols);
3332
3333 @CentralAtomsSymbols = ('A', 'A', 'A', 'A');
3334 @CentralAtomsBondSymbols = ('!', '$', '!');
3335
3336 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols);
3337 }
3338
3339 # Generate key 151 value as 1/0 indicating its presence/absence or count of its
3340 # presence in a molecule.
3341 #
3342 # Key 151 description: NH
3343 #
3344 sub _Generate166KeySetKey151 {
3345 my($This) = @_;
3346 my($MinKeyCount, $IsInRing, $MinHydrogenCount) = (undef, undef, 1);
3347
3348 return $This->_DetectAtomKeys('N', $MinKeyCount, $IsInRing, $MinHydrogenCount);
3349 }
3350
3351 # Generate key 152 value as 1/0 indicating its presence/absence or count of its
3352 # presence in a molecule.
3353 #
3354 # Key 152 description: OC(C)C
3355 #
3356 sub _Generate166KeySetKey152 {
3357 my($This) = @_;
3358 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
3359
3360 $CentralAtomSymbol = 'C';
3361 @NbrAtomSymbols = ('O', 'C', 'C');
3362 @NbrBondSymbols = (undef, undef, undef);
3363
3364 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3365 }
3366
3367 # Generate key 153 value as 1/0 indicating its presence/absence or count of its
3368 # presence in a molecule.
3369 #
3370 # Key 153 description: QCH2A
3371 #
3372 sub _Generate166KeySetKey153 {
3373 my($This) = @_;
3374 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols);
3375
3376 $CentralAtomSymbol = 'C';
3377 @NbrAtomSymbols = ('Q', 'A');
3378 @NbrBondSymbols = (undef, undef);
3379 $MinKeyCount = undef;
3380 $CentralAtomMinHydrogenCount = 2;
3381
3382 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount);
3383 }
3384
3385 # Generate key 154 value as 1/0 indicating its presence/absence or count of its
3386 # presence in a molecule.
3387 #
3388 # Key 154 description: C=O
3389 #
3390 sub _Generate166KeySetKey154 {
3391 my($This) = @_;
3392 my($BondOrder) = 2;
3393
3394 return $This->_DetectBondKeys('C', 'O', $BondOrder);
3395 }
3396
3397 # Generate key 155 value as 1/0 indicating its presence/absence or count of its
3398 # presence in a molecule.
3399 #
3400 # Key 155 description: A!CH2!A
3401 #
3402 sub _Generate166KeySetKey155 {
3403 my($This) = @_;
3404 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols);
3405
3406 $CentralAtomSymbol = 'C';
3407 @NbrAtomSymbols = ('A', 'A');
3408 @NbrBondSymbols = ('!', '!');
3409 $MinKeyCount = undef;
3410 $CentralAtomMinHydrogenCount = 2;
3411
3412 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount);
3413 }
3414
3415 # Generate key 156 value as 1/0 indicating its presence/absence or count of its
3416 # presence in a molecule.
3417 #
3418 # Key 156 description: NA(A)A
3419 #
3420 sub _Generate166KeySetKey156 {
3421 my($This) = @_;
3422 my($MinKeyCount, @CentralAtomsSymbols, @CentralAtomsBondSymbols, @CentralAtomsMinHydrogenCount, @CentralAtomNbrsAtomSymbols, @CentralAtomNbrsBondSymbols);
3423
3424 @CentralAtomsSymbols = ('N', 'A', 'A');
3425 @CentralAtomsBondSymbols = (undef, undef);
3426 @CentralAtomsMinHydrogenCount = (undef, undef, undef);
3427
3428 @CentralAtomNbrsAtomSymbols = (undef, ['A'], undef);
3429 @CentralAtomNbrsBondSymbols = (undef, undef, undef);
3430 $MinKeyCount = undef;
3431
3432 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, \@CentralAtomsBondSymbols, \@CentralAtomsMinHydrogenCount, $MinKeyCount, \@CentralAtomNbrsAtomSymbols, \@CentralAtomNbrsBondSymbols);
3433 }
3434
3435 # Generate key 157 value as 1/0 indicating its presence/absence or count of its
3436 # presence in a molecule.
3437 #
3438 # Key 157 description: C-O
3439 #
3440 sub _Generate166KeySetKey157 {
3441 my($This) = @_;
3442 my($BondOrder) = 1;
3443
3444 return $This->_DetectBondKeys('C', 'O', $BondOrder);
3445 }
3446
3447 # Generate key 158 value as 1/0 indicating its presence/absence or count of its
3448 # presence in a molecule.
3449 #
3450 # Key 158 description: C-N
3451 #
3452 sub _Generate166KeySetKey158 {
3453 my($This) = @_;
3454 my($BondOrder) = 1;
3455
3456 return $This->_DetectBondKeys('C', 'N', $BondOrder);
3457 }
3458
3459 # Generate key 159 value as 1/0 indicating its presence/absence or count of its
3460 # presence in a molecule.
3461 #
3462 # Key 159 description: O > 1
3463 #
3464 sub _Generate166KeySetKey159 {
3465 my($This) = @_;
3466 my($MinKeyCount) = 2;
3467
3468 return $This->_DetectAtomKeys('O', $MinKeyCount);
3469 }
3470
3471 # Generate key 160 value as 1/0 indicating its presence/absence or count of its
3472 # presence in a molecule.
3473 #
3474 # Key 160 description: CH3
3475 #
3476 sub _Generate166KeySetKey160 {
3477 my($This) = @_;
3478 my($MinKeyCount, $IsInRing, $MinHydrogenCount) = (undef, undef, 3);
3479
3480 return $This->_DetectAtomKeys('C', $MinKeyCount, $IsInRing, $MinHydrogenCount);
3481 }
3482
3483 # Generate key 161 value as 1/0 indicating its presence/absence or count of its
3484 # presence in a molecule.
3485 #
3486 # Key 161 description: N
3487 #
3488 sub _Generate166KeySetKey161 {
3489 my($This) = @_;
3490
3491 return $This->_DetectAtomKeys('N');
3492 }
3493
3494 # Generate key 162 value as 1/0 indicating its presence/absence or count of its
3495 # presence in a molecule.
3496 #
3497 # Key 162 description: AROMATIC
3498 #
3499 sub _Generate166KeySetKey162 {
3500 my($This) = @_;
3501 my($Atom, $Molecule, $KeyValue);
3502
3503 # Check molecule aromatic property...
3504 $Molecule = $This->GetMolecule();
3505 if ($Molecule->IsAromatic()) {
3506 return 1;
3507 }
3508
3509 # Check aromatic property of each atom...
3510 $KeyValue = 1;
3511 ATOM: for $Atom (@{$This->{Atoms}}) {
3512 if (!$Atom->IsAromatic()) {
3513 $KeyValue = 0;
3514 last ATOM;
3515 }
3516 }
3517 return $KeyValue;
3518 }
3519
3520 # Generate key 163 value as 1/0 indicating its presence/absence or count of its
3521 # presence in a molecule.
3522 #
3523 # Key 163 description: 6M RING
3524 #
3525 sub _Generate166KeySetKey163 {
3526 my($This) = @_;
3527 my($Molecule, $KeyValue, $RingSize, $NumOfRings);
3528
3529 $RingSize = 6;
3530 $Molecule = $This->GetMolecule();
3531 $NumOfRings = $Molecule->GetNumOfRingsWithSize($RingSize);
3532
3533 if ($This->{KeyBits}) {
3534 $KeyValue = $NumOfRings ? 1 : 0;
3535 }
3536 else {
3537 $KeyValue = $NumOfRings;
3538 }
3539 return $KeyValue;
3540 }
3541
3542 # Generate key 164 value as 1/0 indicating its presence/absence or count of its
3543 # presence in a molecule.
3544 #
3545 # Key 164 description: O
3546 #
3547 sub _Generate166KeySetKey164 {
3548 my($This) = @_;
3549
3550 return $This->_DetectAtomKeys('O');
3551 }
3552
3553 # Generate key 165 value as 1/0 indicating its presence/absence or count of its
3554 # presence in a molecule.
3555 #
3556 # Key 165 description: RING
3557 #
3558 sub _Generate166KeySetKey165 {
3559 my($This) = @_;
3560 my($Molecule, $KeyValue, $NumOfRings);
3561
3562 $Molecule = $This->GetMolecule();
3563 $NumOfRings = $Molecule->GetNumOfRings();
3564
3565 if ($This->{KeyBits}) {
3566 $KeyValue = $NumOfRings ? 1 : 0;
3567 }
3568 else {
3569 $KeyValue = $NumOfRings;
3570 }
3571 return $KeyValue;
3572 }
3573
3574 # Generate key 166 value as 1/0 indicating its presence/absence or count of its
3575 # presence in a molecule.
3576 #
3577 # Key 166 description: FRAGMENTS
3578 #
3579 sub _Generate166KeySetKey166 {
3580 my($This) = @_;
3581 my($Molecule, $KeyValue, $NumOfComponents);
3582
3583 $Molecule = $This->GetMolecule();
3584 $NumOfComponents = $Molecule->GetNumOfConnectedComponents();
3585
3586 if ($This->{KeyBits}) {
3587 $KeyValue = ($NumOfComponents > 1) ? 1 : 0;
3588 }
3589 else {
3590 $KeyValue = $NumOfComponents;
3591 }
3592 return $KeyValue;
3593 }
3594
3595 ##################################
3596 #
3597 # Implementation of MDL MACCS 322 keys...
3598 #
3599 ##################################
3600
3601 # Generate 322 keyset key 1 value as 1/0 indicating its presence/absence or
3602 # count of its presence in a molecule.
3603 #
3604 # Key 1 description: A(AAA) or AA(A)A - atom with at least three neighbors
3605 #
3606 sub _Generate322KeySetKey1 {
3607 my($This) = @_;
3608 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
3609
3610 $CentralAtomSymbol = 'A';
3611 @NbrAtomSymbols = ('A', 'A', 'A');
3612 @NbrBondSymbols = (undef, undef, undef);
3613
3614 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3615 }
3616
3617 # Generate 322 keyset key 2 value as 1/0 indicating its presence/absence or
3618 # count of its presence in a molecule.
3619 #
3620 # Key 2 description: Q - heteroatom
3621 #
3622 sub _Generate322KeySetKey2 {
3623 my($This) = @_;
3624
3625 return $This->_DetectAtomKeys('Q');
3626 }
3627
3628 # Generate 322 keyset key 3 value as 1/0 indicating its presence/absence or
3629 # count of its presence in a molecule.
3630 #
3631 # Key 3 description: Anot%not-A - atom involved in one or more multiple bonds, not aromatic
3632 #
3633 sub _Generate322KeySetKey3 {
3634 my($This) = @_;
3635 my($BondSymbol) = 'not%not-';
3636
3637 return $This->_DetectBondKeys('A', 'A', $BondSymbol);
3638 }
3639
3640 # Generate 322 keyset key 4 value as 1/0 indicating its presence/absence or
3641 # count of its presence in a molecule.
3642 #
3643 # Key 4 description: A(AAAA) or AA(A)(A)A - atom with at least four neighbors
3644 #
3645 sub _Generate322KeySetKey4 {
3646 my($This) = @_;
3647 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
3648
3649 $CentralAtomSymbol = 'A';
3650 @NbrAtomSymbols = ('A', 'A', 'A', 'A');
3651 @NbrBondSymbols = (undef, undef, undef, undef);
3652
3653 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3654 }
3655
3656 # Generate 322 keyset key 5 value as 1/0 indicating its presence/absence or
3657 # count of its presence in a molecule.
3658 #
3659 # Key 5 description: A(QQ) or QA(Q) - atom with at least two heteroatom neighbors
3660 #
3661 sub _Generate322KeySetKey5 {
3662 my($This) = @_;
3663 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
3664
3665 $CentralAtomSymbol = 'A';
3666 @NbrAtomSymbols = ('Q', 'Q');
3667 @NbrBondSymbols = (undef, undef);
3668
3669 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3670 }
3671
3672 # Generate 322 keyset key 6 value as 1/0 indicating its presence/absence or
3673 # count of its presence in a molecule.
3674 #
3675 # Key 6 description: A(QQQ) or QA(Q)Q - atom with at least three heteroatom neighbors
3676 #
3677 sub _Generate322KeySetKey6 {
3678 my($This) = @_;
3679 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
3680
3681 $CentralAtomSymbol = 'A';
3682 @NbrAtomSymbols = ('Q', 'Q', 'Q');
3683 @NbrBondSymbols = (undef, undef, undef);
3684
3685 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3686 }
3687
3688 # Generate 322 keyset key 7 value as 1/0 indicating its presence/absence or
3689 # count of its presence in a molecule.
3690 #
3691 # Key 7 description: QH - heteroatom with at least one hydrogen attached
3692 #
3693 sub _Generate322KeySetKey7 {
3694 my($This) = @_;
3695 my($MinKeyCount, $IsInRing, $MinHydrogenCount) = (undef, undef, 1);
3696
3697 return $This->_DetectAtomKeys('Q', $MinKeyCount, $IsInRing, $MinHydrogenCount);
3698 }
3699
3700 # Generate 322 keyset key 8 value as 1/0 indicating its presence/absence or
3701 # count of its presence in a molecule.
3702 #
3703 # Key 8 description: CH2(AA) or ACH2A - carbon with at least two single bonds and at least two hydrogens attached
3704 #
3705 sub _Generate322KeySetKey8 {
3706 my($This) = @_;
3707 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols);
3708
3709 $CentralAtomSymbol = 'C';
3710 @NbrAtomSymbols = ('A', 'A');
3711 @NbrBondSymbols = (undef, undef);
3712 $MinKeyCount = undef;
3713 $CentralAtomMinHydrogenCount = 2;
3714
3715 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount);
3716 }
3717
3718 # Generate 322 keyset key 9 value as 1/0 indicating its presence/absence or
3719 # count of its presence in a molecule.
3720 #
3721 # Key 9 description: CH3(A) or ACH3 - carbon with at least one single bond and at least three hydrogens attached
3722 #
3723 sub _Generate322KeySetKey9 {
3724 my($This) = @_;
3725 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols);
3726
3727 $CentralAtomSymbol = 'C';
3728 @NbrAtomSymbols = ('A');
3729 @NbrBondSymbols = (undef);
3730 $MinKeyCount = undef;
3731 $CentralAtomMinHydrogenCount = 3;
3732
3733 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount);
3734 }
3735
3736 # Generate 322 keyset key 10 value as 1/0 indicating its presence/absence or
3737 # count of its presence in a molecule.
3738 #
3739 # Key 10 description: Halogen
3740 #
3741 sub _Generate322KeySetKey10 {
3742 my($This) = @_;
3743
3744 return $This->_DetectAtomKeys('X');
3745 }
3746
3747 # Generate 322 keyset key 11 value as 1/0 indicating its presence/absence or
3748 # count of its presence in a molecule.
3749 #
3750 # Key 11 description: A(-A-A-A) or A-A(-A)-A - atom has at least three single bonds
3751 #
3752 sub _Generate322KeySetKey11 {
3753 my($This) = @_;
3754 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
3755
3756 $CentralAtomSymbol = 'A';
3757 @NbrAtomSymbols = ('A', 'A', 'A');
3758 @NbrBondSymbols = ('-', '-', '-');
3759
3760 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3761 }
3762
3763 # Generate 322 keyset key 12 value as 1/0 indicating its presence/absence or
3764 # count of its presence in a molecule.
3765 #
3766 # Key 12 description: AAAAAA@1 >= 2 - atom is in at least two different six-membered rings
3767 #
3768 sub _Generate322KeySetKey12 {
3769 my($This) = @_;
3770 my($Atom, $KeyValue, $RingSize, $NumOfRings);
3771
3772 $RingSize = 6;
3773 $KeyValue = 0;
3774
3775 ATOM: for $Atom (@{$This->{Atoms}}) {
3776 if (!$This->_IsAtom($Atom)) {
3777 next ATOM;
3778 }
3779 $NumOfRings = $Atom->GetNumOfRingsWithSize($RingSize);
3780 if ($NumOfRings >= 2) {
3781 $KeyValue++;
3782 if ($This->{KeyBits}) {
3783 $KeyValue = 1;
3784 last ATOM;
3785 }
3786 }
3787 }
3788 return $KeyValue;
3789 }
3790
3791 # Generate 322 keyset key 13 value as 1/0 indicating its presence/absence or
3792 # count of its presence in a molecule.
3793 #
3794 # Key 13 description: A($A$A$A) or A$A($A)$A - atom has more than two ring bonds (at least three ring bonds)
3795 #
3796 sub _Generate322KeySetKey13 {
3797 my($This) = @_;
3798 my($CentralAtomSymbol, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols);
3799
3800 $CentralAtomSymbol = 'A';
3801 @NbrAtomSymbols = ('A', 'A', 'A');
3802 @NbrBondSymbols = ('$', '$', '$');
3803
3804 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3805 }
3806
3807 # Generate 322 keyset key 14 value as 1/0 indicating its presence/absence or
3808 # count of its presence in a molecule.
3809 #
3810 # Key 14 description: A$A!A$A - atom is at a ring/chain boundary. When a comparison is
3811 # done with another atom the path passes through the chain bond.
3812 #
3813 sub _Generate322KeySetKey14 {
3814 my($This) = @_;
3815 my($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, @NbrAtomsSymbols, @NbrAtomsBondSymbols);
3816
3817 ($BondAtomSymbol1, $BondAtomSymbol2) = ('A', 'A');
3818 $BondSymbol = '!';
3819
3820 @NbrAtomsSymbols = (['A'], ['A']);
3821 @NbrAtomsBondSymbols = (['$'], ['$']);
3822 return $This->_DetectBondNeighborhoodKeys($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, \@NbrAtomsSymbols, \@NbrAtomsBondSymbols);
3823 }
3824
3825 # Generate 322 keyset key 15 value as 1/0 indicating its presence/absence or
3826 # count of its presence in a molecule.
3827 #
3828 # Key 15 description: Anot%A%Anot%A - atom is at an aromatic/nonaromatic boundary.
3829 # When a comparison is done with another atom the path passes through the aromatic bond.
3830 #
3831 sub _Generate322KeySetKey15 {
3832 my($This) = @_;
3833 my($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, @NbrAtomsSymbols, @NbrAtomsBondSymbols);
3834
3835 ($BondAtomSymbol1, $BondAtomSymbol2) = ('A', 'A');
3836 $BondSymbol = '%';
3837
3838 @NbrAtomsSymbols = (['A'], ['A']);
3839 @NbrAtomsBondSymbols = (['not%'], ['not%']);
3840 return $This->_DetectBondNeighborhoodKeys($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, \@NbrAtomsSymbols, \@NbrAtomsBondSymbols);
3841 }
3842
3843 # Generate 322 keyset key 16 value as 1/0 indicating its presence/absence or
3844 # count of its presence in a molecule.
3845 #
3846 # Key 16 description: A!A!A - atom with more than one chain bond
3847 #
3848 sub _Generate322KeySetKey16 {
3849 my($This) = @_;
3850 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
3851
3852 $CentralAtomSymbol = 'A';
3853 @NbrAtomSymbols = ('A', 'A');
3854 @NbrBondSymbols = ('!', '!');
3855
3856 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
3857 }
3858
3859 # Generate 322 keyset key 17 value as 1/0 indicating its presence/absence or
3860 # count of its presence in a molecule.
3861 #
3862 # Key 17 description: A!A$A!A - atom is at a ring/chain boundary. When a comparison
3863 # is done with another atom the path passes through the ring bond.
3864 #
3865 sub _Generate322KeySetKey17 {
3866 my($This) = @_;
3867 my($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, @NbrAtomsSymbols, @NbrAtomsBondSymbols);
3868
3869 ($BondAtomSymbol1, $BondAtomSymbol2) = ('A', 'A');
3870 $BondSymbol = '$';
3871
3872 @NbrAtomsSymbols = (['A'], ['A']);
3873 @NbrAtomsBondSymbols = (['!'], ['!']);
3874 return $This->_DetectBondNeighborhoodKeys($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, \@NbrAtomsSymbols, \@NbrAtomsBondSymbols);
3875 }
3876
3877 # Generate 322 keyset key 18 value as 1/0 indicating its presence/absence or
3878 # count of its presence in a molecule.
3879 #
3880 # Key 18 description: A%Anot%A%A - atom is at an aromatic/nonaromatic boundary.
3881 # When a comparison is done with another atom the path passes through
3882 # the nonaromatic bond
3883 #
3884 sub _Generate322KeySetKey18 {
3885 my($This) = @_;
3886 my($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, @NbrAtomsSymbols, @NbrAtomsBondSymbols);
3887
3888 ($BondAtomSymbol1, $BondAtomSymbol2) = ('A', 'A');
3889 $BondSymbol = 'not%';
3890
3891 @NbrAtomsSymbols = (['A'], ['A']);
3892 @NbrAtomsBondSymbols = (['%'], ['%']);
3893 return $This->_DetectBondNeighborhoodKeys($BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, \@NbrAtomsSymbols, \@NbrAtomsBondSymbols);
3894 }
3895
3896 # Generate 322 keyset key 19 value as 1/0 indicating its presence/absence or
3897 # count of its presence in a molecule.
3898 #
3899 # Key 19 description: HETEROCYCLE - atom is a heteroatom in a ring.
3900 #
3901 sub _Generate322KeySetKey19 {
3902 my($This) = @_;
3903 my($MinKeyCount, $IsInRing) = (undef, 1);
3904
3905 return $This->_DetectAtomKeys('Q', $MinKeyCount, $IsInRing);
3906 }
3907
3908 # Generate 322 keyset key 20 value as 1/0 indicating its presence/absence or
3909 # count of its presence in a molecule.
3910 #
3911 # Key 20 description: rare properties: atom with five or more neighbors, atom in four
3912 # or more rings, or atom types other than H, C, N, O, S, F, Cl, Br, or I
3913 #
3914 sub _Generate322KeySetKey20 {
3915 my($This) = @_;
3916 my($Atom, $KeyValue);
3917
3918 $KeyValue = 0;
3919 ATOM: for $Atom (@{$This->{Atoms}}) {
3920 if (!($Atom->GetAtomicNumber() !~ /^(1|6|7|8|9|16|17|35|53)$/) || ($Atom->GetNumOfRings() >= 4) || ($Atom->GetNumOfNeighbors() >= 5) ) {
3921 next ATOM;
3922 }
3923 $KeyValue++;
3924 if ($This->{KeyBits}) {
3925 $KeyValue = 1;
3926 last ATOM;
3927 }
3928 }
3929 return $KeyValue;
3930 }
3931
3932 # Generate 322 keyset key 21 value as 1/0 indicating its presence/absence or
3933 # count of its presence in a molecule.
3934 #
3935 # Key 21 description: rare properties: atom has a charge, is an isotope, has
3936 # two or more multiple bonds, or has a triple bond.
3937 #
3938 sub _Generate322KeySetKey21 {
3939 my($This) = @_;
3940 my($Atom, $KeyValue);
3941
3942 $KeyValue = 0;
3943 ATOM: for $Atom (@{$This->{Atoms}}) {
3944 if ( !($Atom->IsIsotope() || $Atom->GetFormalCharge()) ) {
3945 # Look for multiple and triple bonds...
3946 my($Bond, $NumOfTripleBonds, $NumOfMultipleBonds);
3947
3948 ($NumOfTripleBonds, $NumOfMultipleBonds) = (0, 0);
3949 BOND: for $Bond ($Atom->GetBonds()) {
3950 if ($Bond->IsSingle()) { next BOND; }
3951 if ($Bond->IsDouble()) { $NumOfMultipleBonds++; next BOND; }
3952 if ($Bond->IsTriple()) { $NumOfTripleBonds++; next BOND; }
3953 }
3954 if ( !($NumOfTripleBonds || ($NumOfMultipleBonds >= 2)) ) {
3955 next ATOM;
3956 }
3957 }
3958 $KeyValue++;
3959 if ($This->{KeyBits}) {
3960 $KeyValue = 1;
3961 last ATOM;
3962 }
3963 }
3964 return $KeyValue;
3965 }
3966
3967 # Generate 322 keyset key 22 value as 1/0 indicating its presence/absence or
3968 # count of its presence in a molecule.
3969 #
3970 # Key 22 description: N - nitrogen
3971 #
3972 sub _Generate322KeySetKey22 {
3973 my($This) = @_;
3974
3975 return $This->_DetectAtomKeys('N');
3976 }
3977
3978 # Generate 322 keyset key 23 value as 1/0 indicating its presence/absence or
3979 # count of its presence in a molecule.
3980 #
3981 # Key 23 description: S - sulfur
3982 #
3983 sub _Generate322KeySetKey23 {
3984 my($This) = @_;
3985
3986 return $This->_DetectAtomKeys('S');
3987 }
3988
3989 # Generate 322 keyset key 24 value as 1/0 indicating its presence/absence or
3990 # count of its presence in a molecule.
3991 #
3992 # Key 24 description: O - oxygen
3993 #
3994 sub _Generate322KeySetKey24 {
3995 my($This) = @_;
3996
3997 return $This->_DetectAtomKeys('O');
3998 }
3999
4000 # Generate 322 keyset key 25 value as 1/0 indicating its presence/absence or
4001 # count of its presence in a molecule.
4002 #
4003 # Key 25 description: A(AA)A(A)A(AA) - atom has two neighbors, each with
4004 # three or more neighbors (including the central atom).
4005 #
4006 sub _Generate322KeySetKey25 {
4007 my($This) = @_;
4008 my($MinKeyCount, @CentralAtomsSymbols, @NbrAtomsSymbols);
4009
4010 @CentralAtomsSymbols = ('A', 'A', 'A');
4011 @NbrAtomsSymbols = (['A', 'A'], ['A'], ['A', 'A']);
4012
4013 return $This->_DetectExtendedAtomNeighborhoodKeys(\@CentralAtomsSymbols, undef, undef, undef, \@NbrAtomsSymbols);
4014 }
4015
4016 # Generate 322 keyset key 26 value as 1/0 indicating its presence/absence or
4017 # count of its presence in a molecule.
4018 #
4019 # Key 26 description: CH2ACH2 - atom has two hydrocarbon (CH2) neighbors
4020 #
4021 sub _Generate322KeySetKey26 {
4022 my($This) = @_;
4023 my($CentralAtomSymbol, $CentralAtomMinHydrogenCount, $MinKeyCount, @NbrAtomSymbols, @NbrBondSymbols, @NbrAtomMinHydrogenCount);
4024
4025 $CentralAtomSymbol = 'A';
4026 $CentralAtomMinHydrogenCount = undef;
4027
4028 @NbrAtomSymbols = ('C', 'C');
4029 @NbrBondSymbols = (undef, undef);
4030 @NbrAtomMinHydrogenCount = (2, 2);
4031
4032 $MinKeyCount = undef;
4033
4034 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinKeyCount, $CentralAtomMinHydrogenCount, \@NbrAtomMinHydrogenCount);
4035 }
4036
4037 # Generate 322 keyset key 27 value as 1/0 indicating its presence/absence or
4038 # count of its presence in a molecule.
4039 #
4040 # Key 27 description: C(CC)
4041 #
4042 sub _Generate322KeySetKey27 {
4043 my($This) = @_;
4044 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4045
4046 $CentralAtomSymbol = 'C';
4047 @NbrAtomSymbols = ('C', 'C');
4048 @NbrBondSymbols = (undef, undef);
4049
4050 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4051 }
4052
4053 # Generate 322 keyset key 28 value as 1/0 indicating its presence/absence or
4054 # count of its presence in a molecule.
4055 #
4056 # Key 28 description: C(CCC)
4057 #
4058 sub _Generate322KeySetKey28 {
4059 my($This) = @_;
4060 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4061
4062 $CentralAtomSymbol = 'C';
4063 @NbrAtomSymbols = ('C', 'C', 'C');
4064 @NbrBondSymbols = (undef, undef, undef);
4065
4066 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4067 }
4068
4069 # Generate 322 keyset key 29 value as 1/0 indicating its presence/absence or
4070 # count of its presence in a molecule.
4071 #
4072 # Key 29 description: C(CN)
4073 #
4074 sub _Generate322KeySetKey29 {
4075 my($This) = @_;
4076 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4077
4078 $CentralAtomSymbol = 'C';
4079 @NbrAtomSymbols = ('C', 'N');
4080 @NbrBondSymbols = (undef, undef);
4081
4082 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4083 }
4084
4085 # Generate 322 keyset key 30 value as 1/0 indicating its presence/absence or
4086 # count of its presence in a molecule.
4087 #
4088 # Key 30 description: C(CCN)
4089 #
4090 sub _Generate322KeySetKey30 {
4091 my($This) = @_;
4092 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4093
4094 $CentralAtomSymbol = 'C';
4095 @NbrAtomSymbols = ('C', 'C', 'N');
4096 @NbrBondSymbols = (undef, undef, undef);
4097
4098 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4099 }
4100
4101 # Generate 322 keyset key 31 value as 1/0 indicating its presence/absence or
4102 # count of its presence in a molecule.
4103 #
4104 # Key 31 description: C(NN)
4105 #
4106 sub _Generate322KeySetKey31 {
4107 my($This) = @_;
4108 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4109
4110 $CentralAtomSymbol = 'C';
4111 @NbrAtomSymbols = ('N', 'N');
4112 @NbrBondSymbols = (undef, undef);
4113
4114 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4115 }
4116
4117 # Generate 322 keyset key 32 value as 1/0 indicating its presence/absence or
4118 # count of its presence in a molecule.
4119 #
4120 # Key 32 description: C(NNC)
4121 #
4122 sub _Generate322KeySetKey32 {
4123 my($This) = @_;
4124 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4125
4126 $CentralAtomSymbol = 'C';
4127 @NbrAtomSymbols = ('N', 'N', 'C');
4128 @NbrBondSymbols = (undef, undef, undef);
4129
4130 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4131 }
4132
4133 # Generate 322 keyset key 33 value as 1/0 indicating its presence/absence or
4134 # count of its presence in a molecule.
4135 #
4136 # Key 33 description: C(NNN)
4137 #
4138 sub _Generate322KeySetKey33 {
4139 my($This) = @_;
4140 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4141
4142 $CentralAtomSymbol = 'C';
4143 @NbrAtomSymbols = ('N', 'N', 'N');
4144 @NbrBondSymbols = (undef, undef, undef);
4145
4146 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4147 }
4148
4149 # Generate 322 keyset key 34 value as 1/0 indicating its presence/absence or
4150 # count of its presence in a molecule.
4151 #
4152 # Key 34 description: C(CO)
4153 #
4154 sub _Generate322KeySetKey34 {
4155 my($This) = @_;
4156 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4157
4158 $CentralAtomSymbol = 'C';
4159 @NbrAtomSymbols = ('C', 'O');
4160 @NbrBondSymbols = (undef, undef);
4161
4162 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4163 }
4164
4165 # Generate 322 keyset key 35 value as 1/0 indicating its presence/absence or
4166 # count of its presence in a molecule.
4167 #
4168 # Key 35 description: C(CCO)
4169 #
4170 sub _Generate322KeySetKey35 {
4171 my($This) = @_;
4172 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4173
4174 $CentralAtomSymbol = 'C';
4175 @NbrAtomSymbols = ('C', 'C', 'O');
4176 @NbrBondSymbols = (undef, undef, undef);
4177
4178 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4179 }
4180
4181 # Generate 322 keyset key 36 value as 1/0 indicating its presence/absence or
4182 # count of its presence in a molecule.
4183 #
4184 # Key 36 description: C(NO)
4185 #
4186 sub _Generate322KeySetKey36 {
4187 my($This) = @_;
4188 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4189
4190 $CentralAtomSymbol = 'C';
4191 @NbrAtomSymbols = ('N', 'O');
4192 @NbrBondSymbols = (undef, undef);
4193
4194 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4195 }
4196
4197 # Generate 322 keyset key 37 value as 1/0 indicating its presence/absence or
4198 # count of its presence in a molecule.
4199 #
4200 # Key 37 description: C(NCO)
4201 #
4202 sub _Generate322KeySetKey37 {
4203 my($This) = @_;
4204 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4205
4206 $CentralAtomSymbol = 'C';
4207 @NbrAtomSymbols = ('N', 'C', 'O');
4208 @NbrBondSymbols = (undef, undef, undef);
4209
4210 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4211 }
4212
4213 # Generate 322 keyset key 38 value as 1/0 indicating its presence/absence or
4214 # count of its presence in a molecule.
4215 #
4216 # Key 38 description: C(NNO)
4217 #
4218 sub _Generate322KeySetKey38 {
4219 my($This) = @_;
4220 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4221
4222 $CentralAtomSymbol = 'C';
4223 @NbrAtomSymbols = ('N', 'N', 'O');
4224 @NbrBondSymbols = (undef, undef, undef);
4225
4226 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4227 }
4228
4229 # Generate 322 keyset key 39 value as 1/0 indicating its presence/absence or
4230 # count of its presence in a molecule.
4231 #
4232 # Key 39 description: C(OO)
4233 #
4234 sub _Generate322KeySetKey39 {
4235 my($This) = @_;
4236 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4237
4238 $CentralAtomSymbol = 'C';
4239 @NbrAtomSymbols = ('O', 'O');
4240 @NbrBondSymbols = (undef, undef);
4241
4242 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4243 }
4244
4245 # Generate 322 keyset key 40 value as 1/0 indicating its presence/absence or
4246 # count of its presence in a molecule.
4247 #
4248 # Key 40 description: C(COO)
4249 #
4250 sub _Generate322KeySetKey40 {
4251 my($This) = @_;
4252 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4253
4254 $CentralAtomSymbol = 'C';
4255 @NbrAtomSymbols = ('C', 'O', 'O');
4256 @NbrBondSymbols = (undef, undef, undef);
4257
4258 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4259 }
4260
4261 # Generate 322 keyset key 41 value as 1/0 indicating its presence/absence or
4262 # count of its presence in a molecule.
4263 #
4264 # Key 41 description: C(NOO)
4265 #
4266 sub _Generate322KeySetKey41 {
4267 my($This) = @_;
4268 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4269
4270 $CentralAtomSymbol = 'C';
4271 @NbrAtomSymbols = ('N', 'O', 'O');
4272 @NbrBondSymbols = (undef, undef, undef);
4273
4274 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4275 }
4276
4277 # Generate 322 keyset key 42 value as 1/0 indicating its presence/absence or
4278 # count of its presence in a molecule.
4279 #
4280 # Key 42 description: C(OOO)
4281 #
4282 sub _Generate322KeySetKey42 {
4283 my($This) = @_;
4284 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4285
4286 $CentralAtomSymbol = 'C';
4287 @NbrAtomSymbols = ('O', 'O', 'O');
4288 @NbrBondSymbols = (undef, undef, undef);
4289
4290 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4291 }
4292
4293 # Generate 322 keyset key 43 value as 1/0 indicating its presence/absence or
4294 # count of its presence in a molecule.
4295 #
4296 # Key 43 description: Q(CC)
4297 #
4298 sub _Generate322KeySetKey43 {
4299 my($This) = @_;
4300 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4301
4302 $CentralAtomSymbol = 'Q';
4303 @NbrAtomSymbols = ('C', 'C');
4304 @NbrBondSymbols = (undef, undef);
4305
4306 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4307 }
4308
4309 # Generate 322 keyset key 44 value as 1/0 indicating its presence/absence or
4310 # count of its presence in a molecule.
4311 #
4312 # Key 44 description: Q(CCC)
4313 #
4314 sub _Generate322KeySetKey44 {
4315 my($This) = @_;
4316 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4317
4318 $CentralAtomSymbol = 'Q';
4319 @NbrAtomSymbols = ('C', 'C', 'C');
4320 @NbrBondSymbols = (undef, undef, undef);
4321
4322 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4323 }
4324
4325 # Generate 322 keyset key 45 value as 1/0 indicating its presence/absence or
4326 # count of its presence in a molecule.
4327 #
4328 # Key 45 description: Q(CN)
4329 #
4330 sub _Generate322KeySetKey45 {
4331 my($This) = @_;
4332 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4333
4334 $CentralAtomSymbol = 'Q';
4335 @NbrAtomSymbols = ('C', 'N');
4336 @NbrBondSymbols = (undef, undef);
4337
4338 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4339 }
4340
4341 # Generate 322 keyset key 46 value as 1/0 indicating its presence/absence or
4342 # count of its presence in a molecule.
4343 #
4344 # Key 46 description: Q(CCN)
4345 #
4346 sub _Generate322KeySetKey46 {
4347 my($This) = @_;
4348 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4349
4350 $CentralAtomSymbol = 'Q';
4351 @NbrAtomSymbols = ('C', 'C', 'N');
4352 @NbrBondSymbols = (undef, undef, undef);
4353
4354 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4355 }
4356
4357 # Generate 322 keyset key 47 value as 1/0 indicating its presence/absence or
4358 # count of its presence in a molecule.
4359 #
4360 # Key 47 description: Q(NN)
4361 #
4362 sub _Generate322KeySetKey47 {
4363 my($This) = @_;
4364 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4365
4366 $CentralAtomSymbol = 'Q';
4367 @NbrAtomSymbols = ('N', 'N');
4368 @NbrBondSymbols = (undef, undef);
4369
4370 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4371 }
4372
4373 # Generate 322 keyset key 48 value as 1/0 indicating its presence/absence or
4374 # count of its presence in a molecule.
4375 #
4376 # Key 48 description: Q(CNN)
4377 #
4378 sub _Generate322KeySetKey48 {
4379 my($This) = @_;
4380 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4381
4382 $CentralAtomSymbol = 'Q';
4383 @NbrAtomSymbols = ('C', 'N', 'N');
4384 @NbrBondSymbols = (undef, undef, undef);
4385
4386 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4387 }
4388
4389 # Generate 322 keyset key 49 value as 1/0 indicating its presence/absence or
4390 # count of its presence in a molecule.
4391 #
4392 # Key 49 description: Q(NNN)
4393 #
4394 sub _Generate322KeySetKey49 {
4395 my($This) = @_;
4396 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4397
4398 $CentralAtomSymbol = 'Q';
4399 @NbrAtomSymbols = ('N', 'N', 'N');
4400 @NbrBondSymbols = (undef, undef, undef);
4401
4402 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4403 }
4404
4405 # Generate 322 keyset key 50 value as 1/0 indicating its presence/absence or
4406 # count of its presence in a molecule.
4407 #
4408 # Key 50 description: Q(CO)
4409 #
4410 sub _Generate322KeySetKey50 {
4411 my($This) = @_;
4412 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4413
4414 $CentralAtomSymbol = 'Q';
4415 @NbrAtomSymbols = ('C', 'O');
4416 @NbrBondSymbols = (undef, undef);
4417
4418 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4419 }
4420
4421 # Generate 322 keyset key 51 value as 1/0 indicating its presence/absence or
4422 # count of its presence in a molecule.
4423 #
4424 # Key 51 description: Q(CCO)
4425 #
4426 sub _Generate322KeySetKey51 {
4427 my($This) = @_;
4428 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4429
4430 $CentralAtomSymbol = 'Q';
4431 @NbrAtomSymbols = ('C', 'C', 'O');
4432 @NbrBondSymbols = (undef, undef, undef);
4433
4434 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4435 }
4436
4437 # Generate 322 keyset key 52 value as 1/0 indicating its presence/absence or
4438 # count of its presence in a molecule.
4439 #
4440 # Key 52 description: Q(NO)
4441 #
4442 sub _Generate322KeySetKey52 {
4443 my($This) = @_;
4444 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4445
4446 $CentralAtomSymbol = 'Q';
4447 @NbrAtomSymbols = ('N', 'O');
4448 @NbrBondSymbols = (undef, undef);
4449
4450 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4451 }
4452
4453 # Generate 322 keyset key 53 value as 1/0 indicating its presence/absence or
4454 # count of its presence in a molecule.
4455 #
4456 # Key 53 description: Q(CNO)
4457 #
4458 sub _Generate322KeySetKey53 {
4459 my($This) = @_;
4460 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4461
4462 $CentralAtomSymbol = 'Q';
4463 @NbrAtomSymbols = ('C', 'N', 'O');
4464 @NbrBondSymbols = (undef, undef, undef);
4465
4466 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4467 }
4468
4469 # Generate 322 keyset key 54 value as 1/0 indicating its presence/absence or
4470 # count of its presence in a molecule.
4471 #
4472 # Key 54 description: Q(NNO)
4473 #
4474 sub _Generate322KeySetKey54 {
4475 my($This) = @_;
4476 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4477
4478 $CentralAtomSymbol = 'Q';
4479 @NbrAtomSymbols = ('N', 'N', 'O');
4480 @NbrBondSymbols = (undef, undef, undef);
4481
4482 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4483 }
4484
4485 # Generate 322 keyset key 55 value as 1/0 indicating its presence/absence or
4486 # count of its presence in a molecule.
4487 #
4488 # Key 55 description: Q(OO)
4489 #
4490 sub _Generate322KeySetKey55 {
4491 my($This) = @_;
4492 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4493
4494 $CentralAtomSymbol = 'Q';
4495 @NbrAtomSymbols = ('O', 'O');
4496 @NbrBondSymbols = (undef, undef);
4497
4498 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4499 }
4500
4501 # Generate 322 keyset key 56 value as 1/0 indicating its presence/absence or
4502 # count of its presence in a molecule.
4503 #
4504 # Key 56 description: Q(COO)
4505 #
4506 sub _Generate322KeySetKey56 {
4507 my($This) = @_;
4508 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4509
4510 $CentralAtomSymbol = 'Q';
4511 @NbrAtomSymbols = ('C', 'O', 'O');
4512 @NbrBondSymbols = (undef, undef, undef);
4513
4514 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4515 }
4516
4517 # Generate 322 keyset key 57 value as 1/0 indicating its presence/absence or
4518 # count of its presence in a molecule.
4519 #
4520 # Key 57 description: Q(NOO)
4521 #
4522 sub _Generate322KeySetKey57 {
4523 my($This) = @_;
4524 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4525
4526 $CentralAtomSymbol = 'Q';
4527 @NbrAtomSymbols = ('N', 'O', 'O');
4528 @NbrBondSymbols = (undef, undef, undef);
4529
4530 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4531 }
4532
4533 # Generate 322 keyset key 58 value as 1/0 indicating its presence/absence or
4534 # count of its presence in a molecule.
4535 #
4536 # Key 58 description: Q(OOO)
4537 #
4538 sub _Generate322KeySetKey58 {
4539 my($This) = @_;
4540 my($CentralAtomSymbol, @NbrAtomSymbols, @NbrBondSymbols);
4541
4542 $CentralAtomSymbol = 'Q';
4543 @NbrAtomSymbols = ('O', 'O', 'O');
4544 @NbrBondSymbols = (undef, undef, undef);
4545
4546 return $This->_DetectAtomNeighborhoodKeys($CentralAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols);
4547 }
4548
4549 # Generate 322 keyset key 59 value as 1/0 indicating its presence/absence or
4550 # count of its presence in a molecule.
4551 #
4552 # Key 59 description: C-C
4553 #
4554 sub _Generate322KeySetKey59 {
4555 my($This) = @_;
4556 my($BondSymbol) = '-';
4557
4558 return $This->_DetectBondKeys('C', 'C', $BondSymbol);
4559 }
4560
4561 # Generate 322 keyset key 60 value as 1/0 indicating its presence/absence or
4562 # count of its presence in a molecule.
4563 #
4564 # Key 60 description: C-N
4565 #
4566 sub _Generate322KeySetKey60 {
4567 my($This) = @_;
4568 my($BondSymbol) = '-';
4569
4570 return $This->_DetectBondKeys('C', 'N', $BondSymbol);
4571 }
4572
4573 # Generate 322 keyset key 61 value as 1/0 indicating its presence/absence or
4574 # count of its presence in a molecule.
4575 #
4576 # Key 61 description: C-O
4577 #
4578 sub _Generate322KeySetKey61 {
4579 my($This) = @_;
4580 my($BondSymbol) = '-';
4581
4582 return $This->_DetectBondKeys('C', 'O', $BondSymbol);
4583 }
4584
4585 # Generate 322 keyset key 62 value as 1/0 indicating its presence/absence or
4586 # count of its presence in a molecule.
4587 #
4588 # Key 62 description: C-S
4589 #
4590 sub _Generate322KeySetKey62 {
4591 my($This) = @_;
4592 my($BondSymbol) = '-';
4593
4594 return $This->_DetectBondKeys('C', 'S', $BondSymbol);
4595 }
4596
4597 # Generate 322 keyset key 63 value as 1/0 indicating its presence/absence or
4598 # count of its presence in a molecule.
4599 #
4600 # Key 63 description: C-Cl
4601 #
4602 sub _Generate322KeySetKey63 {
4603 my($This) = @_;
4604 my($BondSymbol) = '-';
4605
4606 return $This->_DetectBondKeys('C', 'Cl', $BondSymbol);
4607 }
4608
4609 # Generate 322 keyset key 64 value as 1/0 indicating its presence/absence or
4610 # count of its presence in a molecule.
4611 #
4612 # Key 64 description: C-P
4613 #
4614 sub _Generate322KeySetKey64 {
4615 my($This) = @_;
4616 my($BondSymbol) = '-';
4617
4618 return $This->_DetectBondKeys('C', 'P', $BondSymbol);
4619 }
4620
4621 # Generate 322 keyset key 65 value as 1/0 indicating its presence/absence or
4622 # count of its presence in a molecule.
4623 #
4624 # Key 65 description: C-F
4625 #
4626 sub _Generate322KeySetKey65 {
4627 my($This) = @_;
4628 my($BondSymbol) = '-';
4629
4630 return $This->_DetectBondKeys('C', 'F', $BondSymbol);
4631 }
4632
4633 # Generate 322 keyset key 66 value as 1/0 indicating its presence/absence or
4634 # count of its presence in a molecule.
4635 #
4636 # Key 66 description: C-Br
4637 #
4638 sub _Generate322KeySetKey66 {
4639 my($This) = @_;
4640 my($BondSymbol) = '-';
4641
4642 return $This->_DetectBondKeys('C', 'Br', $BondSymbol);
4643 }
4644
4645 # Generate 322 keyset key 67 value as 1/0 indicating its presence/absence or
4646 # count of its presence in a molecule.
4647 #
4648 # Key 67 description: C-Si
4649 #
4650 sub _Generate322KeySetKey67 {
4651 my($This) = @_;
4652 my($BondSymbol) = '-';
4653
4654 return $This->_DetectBondKeys('C', 'Si', $BondSymbol);
4655 }
4656
4657 # Generate 322 keyset key 68 value as 1/0 indicating its presence/absence or
4658 # count of its presence in a molecule.
4659 #
4660 # Key 68 description: C-I
4661 #
4662 sub _Generate322KeySetKey68 {
4663 my($This) = @_;
4664 my($BondSymbol) = '-';
4665
4666 return $This->_DetectBondKeys('C', 'I', $BondSymbol);
4667 }
4668
4669 # Generate 322 keyset key 69 value as 1/0 indicating its presence/absence or
4670 # count of its presence in a molecule.
4671 #
4672 # Key 69 description: C-X
4673 #
4674 sub _Generate322KeySetKey69 {
4675 my($This) = @_;
4676 my($BondSymbol) = '-';
4677
4678 return $This->_DetectBondKeys('C', 'Z', $BondSymbol);
4679 }
4680
4681 # Generate 322 keyset key 70 value as 1/0 indicating its presence/absence or
4682 # count of its presence in a molecule.
4683 #
4684 # Key 70 description: N-N
4685 #
4686 sub _Generate322KeySetKey70 {
4687 my($This) = @_;
4688 my($BondSymbol) = '-';
4689
4690 return $This->_DetectBondKeys('N', 'N', $BondSymbol);
4691 }
4692
4693 # Generate 322 keyset key 71 value as 1/0 indicating its presence/absence or
4694 # count of its presence in a molecule.
4695 #
4696 # Key 71 description: N-O
4697 #
4698 sub _Generate322KeySetKey71 {
4699 my($This) = @_;
4700 my($BondSymbol) = '-';
4701
4702 return $This->_DetectBondKeys('N', 'O', $BondSymbol);
4703 }
4704
4705 # Generate 322 keyset key 72 value as 1/0 indicating its presence/absence or
4706 # count of its presence in a molecule.
4707 #
4708 # Key 72 description: N-S
4709 #
4710 sub _Generate322KeySetKey72 {
4711 my($This) = @_;
4712 my($BondSymbol) = '-';
4713
4714 return $This->_DetectBondKeys('N', 'S', $BondSymbol);
4715 }
4716
4717 # Generate 322 keyset key 73 value as 1/0 indicating its presence/absence or
4718 # count of its presence in a molecule.
4719 #
4720 # Key 73 description: N-Cl
4721 #
4722 sub _Generate322KeySetKey73 {
4723 my($This) = @_;
4724 my($BondSymbol) = '-';
4725
4726 return $This->_DetectBondKeys('N', 'Cl', $BondSymbol);
4727 }
4728
4729 # Generate 322 keyset key 74 value as 1/0 indicating its presence/absence or
4730 # count of its presence in a molecule.
4731 #
4732 # Key 74 description: N-P
4733 #
4734 sub _Generate322KeySetKey74 {
4735 my($This) = @_;
4736 my($BondSymbol) = '-';
4737
4738 return $This->_DetectBondKeys('N', 'P', $BondSymbol);
4739 }
4740
4741 # Generate 322 keyset key 75 value as 1/0 indicating its presence/absence or
4742 # count of its presence in a molecule.
4743 #
4744 # Key 75 description: N-F
4745 #
4746 sub _Generate322KeySetKey75 {
4747 my($This) = @_;
4748 my($BondSymbol) = '-';
4749
4750 return $This->_DetectBondKeys('N', 'F', $BondSymbol);
4751 }
4752
4753 # Generate 322 keyset key 76 value as 1/0 indicating its presence/absence or
4754 # count of its presence in a molecule.
4755 #
4756 # Key 76 description: N-Br
4757 #
4758 sub _Generate322KeySetKey76 {
4759 my($This) = @_;
4760 my($BondSymbol) = '-';
4761
4762 return $This->_DetectBondKeys('N', 'Br', $BondSymbol);
4763 }
4764
4765 # Generate 322 keyset key 77 value as 1/0 indicating its presence/absence or
4766 # count of its presence in a molecule.
4767 #
4768 # Key 77 description: N-Si
4769 #
4770 sub _Generate322KeySetKey77 {
4771 my($This) = @_;
4772 my($BondSymbol) = '-';
4773
4774 return $This->_DetectBondKeys('N', 'Si', $BondSymbol);
4775 }
4776
4777 # Generate 322 keyset key 78 value as 1/0 indicating its presence/absence or
4778 # count of its presence in a molecule.
4779 #
4780 # Key 78 description: N-I
4781 #
4782 sub _Generate322KeySetKey78 {
4783 my($This) = @_;
4784 my($BondSymbol) = '-';
4785
4786 return $This->_DetectBondKeys('N', 'I', $BondSymbol);
4787 }
4788
4789 # Generate 322 keyset key 79 value as 1/0 indicating its presence/absence or
4790 # count of its presence in a molecule.
4791 #
4792 # Key 79 description: N-X
4793 #
4794 sub _Generate322KeySetKey79 {
4795 my($This) = @_;
4796 my($BondSymbol) = '-';
4797
4798 return $This->_DetectBondKeys('N', 'Z', $BondSymbol);
4799 }
4800
4801 # Generate 322 keyset key 80 value as 1/0 indicating its presence/absence or
4802 # count of its presence in a molecule.
4803 #
4804 # Key 80 description: O-O
4805 #
4806 sub _Generate322KeySetKey80 {
4807 my($This) = @_;
4808 my($BondSymbol) = '-';
4809
4810 return $This->_DetectBondKeys('O', 'O', $BondSymbol);
4811 }
4812
4813 # Generate 322 keyset key 81 value as 1/0 indicating its presence/absence or
4814 # count of its presence in a molecule.
4815 #
4816 # Key 81 description: O-S
4817 #
4818 sub _Generate322KeySetKey81 {
4819 my($This) = @_;
4820 my($BondSymbol) = '-';
4821
4822 return $This->_DetectBondKeys('O', 'S', $BondSymbol);
4823 }
4824
4825 # Generate 322 keyset key 82 value as 1/0 indicating its presence/absence or
4826 # count of its presence in a molecule.
4827 #
4828 # Key 82 description: O-Cl
4829 #
4830 sub _Generate322KeySetKey82 {
4831 my($This) = @_;
4832 my($BondSymbol) = '-';
4833
4834 return $This->_DetectBondKeys('O', 'Cl', $BondSymbol);
4835 }
4836
4837 # Generate 322 keyset key 83 value as 1/0 indicating its presence/absence or
4838 # count of its presence in a molecule.
4839 #
4840 # Key 83 description: O-P
4841 #
4842 sub _Generate322KeySetKey83 {
4843 my($This) = @_;
4844 my($BondSymbol) = '-';
4845
4846 return $This->_DetectBondKeys('O', 'P', $BondSymbol);
4847 }
4848
4849 # Generate 322 keyset key 84 value as 1/0 indicating its presence/absence or
4850 # count of its presence in a molecule.
4851 #
4852 # Key 84 description: O-F
4853 #
4854 sub _Generate322KeySetKey84 {
4855 my($This) = @_;
4856 my($BondSymbol) = '-';
4857
4858 return $This->_DetectBondKeys('O', 'F', $BondSymbol);
4859 }
4860
4861 # Generate 322 keyset key 85 value as 1/0 indicating its presence/absence or
4862 # count of its presence in a molecule.
4863 #
4864 # Key 85 description: O-Br
4865 #
4866 sub _Generate322KeySetKey85 {
4867 my($This) = @_;
4868 my($BondSymbol) = '-';
4869
4870 return $This->_DetectBondKeys('O', 'Br', $BondSymbol);
4871 }
4872
4873 # Generate 322 keyset key 86 value as 1/0 indicating its presence/absence or
4874 # count of its presence in a molecule.
4875 #
4876 # Key 86 description: O-Si
4877 #
4878 sub _Generate322KeySetKey86 {
4879 my($This) = @_;
4880 my($BondSymbol) = '-';
4881
4882 return $This->_DetectBondKeys('O', 'Si', $BondSymbol);
4883 }
4884
4885 # Generate 322 keyset key 87 value as 1/0 indicating its presence/absence or
4886 # count of its presence in a molecule.
4887 #
4888 # Key 87 description: O-I
4889 #
4890 sub _Generate322KeySetKey87 {
4891 my($This) = @_;
4892 my($BondSymbol) = '-';
4893
4894 return $This->_DetectBondKeys('O', 'I', $BondSymbol);
4895 }
4896
4897 # Generate 322 keyset key 88 value as 1/0 indicating its presence/absence or
4898 # count of its presence in a molecule.
4899 #
4900 # Key 88 description: O-X
4901 #
4902 sub _Generate322KeySetKey88 {
4903 my($This) = @_;
4904 my($BondSymbol) = '-';
4905
4906 return $This->_DetectBondKeys('O', 'Z', $BondSymbol);
4907 }
4908
4909 # Generate 322 keyset key 89 value as 1/0 indicating its presence/absence or
4910 # count of its presence in a molecule.
4911 #
4912 # Key 89 description: S-S
4913 #
4914 sub _Generate322KeySetKey89 {
4915 my($This) = @_;
4916 my($BondSymbol) = '-';
4917
4918 return $This->_DetectBondKeys('S', 'S', $BondSymbol);
4919 }
4920
4921 # Generate 322 keyset key 90 value as 1/0 indicating its presence/absence or
4922 # count of its presence in a molecule.
4923 #
4924 # Key 90 description: S-Cl
4925 #
4926 sub _Generate322KeySetKey90 {
4927 my($This) = @_;
4928 my($BondSymbol) = '-';
4929
4930 return $This->_DetectBondKeys('S', 'Cl', $BondSymbol);
4931 }
4932
4933 # Generate 322 keyset key 91 value as 1/0 indicating its presence/absence or
4934 # count of its presence in a molecule.
4935 #
4936 # Key 91 description: S-P
4937 #
4938 sub _Generate322KeySetKey91 {
4939 my($This) = @_;
4940 my($BondSymbol) = '-';
4941
4942 return $This->_DetectBondKeys('S', 'P', $BondSymbol);
4943 }
4944
4945 # Generate 322 keyset key 92 value as 1/0 indicating its presence/absence or
4946 # count of its presence in a molecule.
4947 #
4948 # Key 92 description: S-F
4949 #
4950 sub _Generate322KeySetKey92 {
4951 my($This) = @_;
4952 my($BondSymbol) = '-';
4953
4954 return $This->_DetectBondKeys('S', 'F', $BondSymbol);
4955 }
4956
4957 # Generate 322 keyset key 93 value as 1/0 indicating its presence/absence or
4958 # count of its presence in a molecule.
4959 #
4960 # Key 93 description: S-Br
4961 #
4962 sub _Generate322KeySetKey93 {
4963 my($This) = @_;
4964 my($BondSymbol) = '-';
4965
4966 return $This->_DetectBondKeys('S', 'Br', $BondSymbol);
4967 }
4968
4969 # Generate 322 keyset key 94 value as 1/0 indicating its presence/absence or
4970 # count of its presence in a molecule.
4971 #
4972 # Key 94 description: S-Si
4973 #
4974 sub _Generate322KeySetKey94 {
4975 my($This) = @_;
4976 my($BondSymbol) = '-';
4977
4978 return $This->_DetectBondKeys('S', 'Si', $BondSymbol);
4979 }
4980
4981 # Generate 322 keyset key 95 value as 1/0 indicating its presence/absence or
4982 # count of its presence in a molecule.
4983 #
4984 # Key 95 description: S-I
4985 #
4986 sub _Generate322KeySetKey95 {
4987 my($This) = @_;
4988 my($BondSymbol) = '-';
4989
4990 return $This->_DetectBondKeys('S', 'I', $BondSymbol);
4991 }
4992
4993 # Generate 322 keyset key 96 value as 1/0 indicating its presence/absence or
4994 # count of its presence in a molecule.
4995 #
4996 # Key 96 description: S-X
4997 #
4998 sub _Generate322KeySetKey96 {
4999 my($This) = @_;
5000 my($BondSymbol) = '-';
5001
5002 return $This->_DetectBondKeys('S', 'Z', $BondSymbol);
5003 }
5004
5005 # Generate 322 keyset key 97 value as 1/0 indicating its presence/absence or
5006 # count of its presence in a molecule.
5007 #
5008 # Key 97 description: Cl-Cl
5009 #
5010 sub _Generate322KeySetKey97 {
5011 my($This) = @_;
5012 my($BondSymbol) = '-';
5013
5014 return $This->_DetectBondKeys('Cl', 'Cl', $BondSymbol);
5015 }
5016
5017 # Generate 322 keyset key 98 value as 1/0 indicating its presence/absence or
5018 # count of its presence in a molecule.
5019 #
5020 # Key 98 description: Cl-P
5021 #
5022 sub _Generate322KeySetKey98 {
5023 my($This) = @_;
5024 my($BondSymbol) = '-';
5025
5026 return $This->_DetectBondKeys('Cl', 'P', $BondSymbol);
5027 }
5028
5029 # Generate 322 keyset key 99 value as 1/0 indicating its presence/absence or
5030 # count of its presence in a molecule.
5031 #
5032 # Key 99 description: Cl-F
5033 #
5034 sub _Generate322KeySetKey99 {
5035 my($This) = @_;
5036 my($BondSymbol) = '-';
5037
5038 return $This->_DetectBondKeys('Cl', 'F', $BondSymbol);
5039 }
5040
5041 # Generate 322 keyset key 100 value as 1/0 indicating its presence/absence or
5042 # count of its presence in a molecule.
5043 #
5044 # Key 100 description: Cl-Br
5045 #
5046 sub _Generate322KeySetKey100 {
5047 my($This) = @_;
5048 my($BondSymbol) = '-';
5049
5050 return $This->_DetectBondKeys('Cl', 'Br', $BondSymbol);
5051 }
5052
5053 # Generate 322 keyset key 101 value as 1/0 indicating its presence/absence or
5054 # count of its presence in a molecule.
5055 #
5056 # Key 101 description: Cl-Si
5057 #
5058 sub _Generate322KeySetKey101 {
5059 my($This) = @_;
5060 my($BondSymbol) = '-';
5061
5062 return $This->_DetectBondKeys('Cl', 'Si', $BondSymbol);
5063 }
5064
5065 # Generate 322 keyset key 102 value as 1/0 indicating its presence/absence or
5066 # count of its presence in a molecule.
5067 #
5068 # Key 102 description: Cl-I
5069 #
5070 sub _Generate322KeySetKey102 {
5071 my($This) = @_;
5072 my($BondSymbol) = '-';
5073
5074 return $This->_DetectBondKeys('Cl', 'I', $BondSymbol);
5075 }
5076
5077 # Generate 322 keyset key 103 value as 1/0 indicating its presence/absence or
5078 # count of its presence in a molecule.
5079 #
5080 # Key 103 description: Cl-X
5081 #
5082 sub _Generate322KeySetKey103 {
5083 my($This) = @_;
5084 my($BondSymbol) = '-';
5085
5086 return $This->_DetectBondKeys('Cl', 'Z', $BondSymbol);
5087 }
5088
5089 # Generate 322 keyset key 104 value as 1/0 indicating its presence/absence or
5090 # count of its presence in a molecule.
5091 #
5092 # Key 104 description: P-P
5093 #
5094 sub _Generate322KeySetKey104 {
5095 my($This) = @_;
5096 my($BondSymbol) = '-';
5097
5098 return $This->_DetectBondKeys('P', 'P', $BondSymbol);
5099 }
5100
5101 # Generate 322 keyset key 105 value as 1/0 indicating its presence/absence or
5102 # count of its presence in a molecule.
5103 #
5104 # Key 105 description: P-F
5105 #
5106 sub _Generate322KeySetKey105 {
5107 my($This) = @_;
5108 my($BondSymbol) = '-';
5109
5110 return $This->_DetectBondKeys('P', 'F', $BondSymbol);
5111 }
5112
5113 # Generate 322 keyset key 106 value as 1/0 indicating its presence/absence or
5114 # count of its presence in a molecule.
5115 #
5116 # Key 106 description: P-Br
5117 #
5118 sub _Generate322KeySetKey106 {
5119 my($This) = @_;
5120 my($BondSymbol) = '-';
5121
5122 return $This->_DetectBondKeys('P', 'Br', $BondSymbol);
5123 }
5124
5125 # Generate 322 keyset key 107 value as 1/0 indicating its presence/absence or
5126 # count of its presence in a molecule.
5127 #
5128 # Key 107 description: P-Si
5129 #
5130 sub _Generate322KeySetKey107 {
5131 my($This) = @_;
5132 my($BondSymbol) = '-';
5133
5134 return $This->_DetectBondKeys('P', 'Si', $BondSymbol);
5135 }
5136
5137 # Generate 322 keyset key 108 value as 1/0 indicating its presence/absence or
5138 # count of its presence in a molecule.
5139 #
5140 # Key 108 description: P-I
5141 #
5142 sub _Generate322KeySetKey108 {
5143 my($This) = @_;
5144 my($BondSymbol) = '-';
5145
5146 return $This->_DetectBondKeys('P', 'I', $BondSymbol);
5147 }
5148
5149 # Generate 322 keyset key 109 value as 1/0 indicating its presence/absence or
5150 # count of its presence in a molecule.
5151 #
5152 # Key 109 description: P-X
5153 #
5154 sub _Generate322KeySetKey109 {
5155 my($This) = @_;
5156 my($BondSymbol) = '-';
5157
5158 return $This->_DetectBondKeys('P', 'Z', $BondSymbol);
5159 }
5160
5161 # Generate 322 keyset key 110 value as 1/0 indicating its presence/absence or
5162 # count of its presence in a molecule.
5163 #
5164 # Key 110 description: F-F
5165 #
5166 sub _Generate322KeySetKey110 {
5167 my($This) = @_;
5168 my($BondSymbol) = '-';
5169
5170 return $This->_DetectBondKeys('F', 'F', $BondSymbol);
5171 }
5172
5173 # Generate 322 keyset key 111 value as 1/0 indicating its presence/absence or
5174 # count of its presence in a molecule.
5175 #
5176 # Key 111 description: F-Br
5177 #
5178 sub _Generate322KeySetKey111 {
5179 my($This) = @_;
5180 my($BondSymbol) = '-';
5181
5182 return $This->_DetectBondKeys('F', 'Br', $BondSymbol);
5183 }
5184
5185 # Generate 322 keyset key 112 value as 1/0 indicating its presence/absence or
5186 # count of its presence in a molecule.
5187 #
5188 # Key 112 description: F-Si
5189 #
5190 sub _Generate322KeySetKey112 {
5191 my($This) = @_;
5192 my($BondSymbol) = '-';
5193
5194 return $This->_DetectBondKeys('F', 'Si', $BondSymbol);
5195 }
5196
5197 # Generate 322 keyset key 113 value as 1/0 indicating its presence/absence or
5198 # count of its presence in a molecule.
5199 #
5200 # Key 113 description: F-I
5201 #
5202 sub _Generate322KeySetKey113 {
5203 my($This) = @_;
5204 my($BondSymbol) = '-';
5205
5206 return $This->_DetectBondKeys('F', 'I', $BondSymbol);
5207 }
5208
5209 # Generate 322 keyset key 114 value as 1/0 indicating its presence/absence or
5210 # count of its presence in a molecule.
5211 #
5212 # Key 114 description: F-X
5213 #
5214 sub _Generate322KeySetKey114 {
5215 my($This) = @_;
5216 my($BondSymbol) = '-';
5217
5218 return $This->_DetectBondKeys('F', 'Z', $BondSymbol);
5219 }
5220
5221 # Generate 322 keyset key 115 value as 1/0 indicating its presence/absence or
5222 # count of its presence in a molecule.
5223 #
5224 # Key 115 description: Br-Br
5225 #
5226 sub _Generate322KeySetKey115 {
5227 my($This) = @_;
5228 my($BondSymbol) = '-';
5229
5230 return $This->_DetectBondKeys('Br', 'Br', $BondSymbol);
5231 }
5232
5233 # Generate 322 keyset key 116 value as 1/0 indicating its presence/absence or
5234 # count of its presence in a molecule.
5235 #
5236 # Key 116 description: Br-Si
5237 #
5238 sub _Generate322KeySetKey116 {
5239 my($This) = @_;
5240 my($BondSymbol) = '-';
5241
5242 return $This->_DetectBondKeys('Br', 'Si', $BondSymbol);
5243 }
5244
5245 # Generate 322 keyset key 117 value as 1/0 indicating its presence/absence or
5246 # count of its presence in a molecule.
5247 #
5248 # Key 117 description: Br-I
5249 #
5250 sub _Generate322KeySetKey117 {
5251 my($This) = @_;
5252 my($BondSymbol) = '-';
5253
5254 return $This->_DetectBondKeys('Br', 'I', $BondSymbol);
5255 }
5256
5257 # Generate 322 keyset key 118 value as 1/0 indicating its presence/absence or
5258 # count of its presence in a molecule.
5259 #
5260 # Key 118 description: Br-X
5261 #
5262 sub _Generate322KeySetKey118 {
5263 my($This) = @_;
5264 my($BondSymbol) = '-';
5265
5266 return $This->_DetectBondKeys('Br', 'Z', $BondSymbol);
5267 }
5268
5269 # Generate 322 keyset key 119 value as 1/0 indicating its presence/absence or
5270 # count of its presence in a molecule.
5271 #
5272 # Key 119 description: Si-Si
5273 #
5274 sub _Generate322KeySetKey119 {
5275 my($This) = @_;
5276 my($BondSymbol) = '-';
5277
5278 return $This->_DetectBondKeys('Si', 'Si', $BondSymbol);
5279 }
5280
5281 # Generate 322 keyset key 120 value as 1/0 indicating its presence/absence or
5282 # count of its presence in a molecule.
5283 #
5284 # Key 120 description: Si-I
5285 #
5286 sub _Generate322KeySetKey120 {
5287 my($This) = @_;
5288 my($BondSymbol) = '-';
5289
5290 return $This->_DetectBondKeys('Si', 'I', $BondSymbol);
5291 }
5292
5293 # Generate 322 keyset key 121 value as 1/0 indicating its presence/absence or
5294 # count of its presence in a molecule.
5295 #
5296 # Key 121 description: Si-X
5297 #
5298 sub _Generate322KeySetKey121 {
5299 my($This) = @_;
5300 my($BondSymbol) = '-';
5301
5302 return $This->_DetectBondKeys('Si', 'Z', $BondSymbol);
5303 }
5304
5305 # Generate 322 keyset key 122 value as 1/0 indicating its presence/absence or
5306 # count of its presence in a molecule.
5307 #
5308 # Key 122 description: I-I
5309 #
5310 sub _Generate322KeySetKey122 {
5311 my($This) = @_;
5312 my($BondSymbol) = '-';
5313
5314 return $This->_DetectBondKeys('I', 'I', $BondSymbol);
5315 }
5316
5317 # Generate 322 keyset key 123 value as 1/0 indicating its presence/absence or
5318 # count of its presence in a molecule.
5319 #
5320 # Key 123 description: I-X
5321 #
5322 sub _Generate322KeySetKey123 {
5323 my($This) = @_;
5324 my($BondSymbol) = '-';
5325
5326 return $This->_DetectBondKeys('I', 'Z', $BondSymbol);
5327 }
5328
5329 # Generate 322 keyset key 124 value as 1/0 indicating its presence/absence or
5330 # count of its presence in a molecule.
5331 #
5332 # Key 124 description: X-X
5333 #
5334 sub _Generate322KeySetKey124 {
5335 my($This) = @_;
5336 my($BondSymbol) = '-';
5337
5338 return $This->_DetectBondKeys('Z', 'Z', $BondSymbol);
5339 }
5340
5341 # Generate 322 keyset key 125 value as 1/0 indicating its presence/absence or
5342 # count of its presence in a molecule.
5343 #
5344 # Key 125 description: C=C
5345 #
5346 sub _Generate322KeySetKey125 {
5347 my($This) = @_;
5348 my($BondSymbol) = '=';
5349
5350 return $This->_DetectBondKeys('C', 'C', $BondSymbol);
5351 }
5352
5353 # Generate 322 keyset key 126 value as 1/0 indicating its presence/absence or
5354 # count of its presence in a molecule.
5355 #
5356 # Key 126 description: C=N
5357 #
5358 sub _Generate322KeySetKey126 {
5359 my($This) = @_;
5360 my($BondSymbol) = '=';
5361
5362 return $This->_DetectBondKeys('C', 'N', $BondSymbol);
5363 }
5364
5365 # Generate 322 keyset key 127 value as 1/0 indicating its presence/absence or
5366 # count of its presence in a molecule.
5367 #
5368 # Key 127 description: C=O
5369 #
5370 sub _Generate322KeySetKey127 {
5371 my($This) = @_;
5372 my($BondSymbol) = '=';
5373
5374 return $This->_DetectBondKeys('C', 'O', $BondSymbol);
5375 }
5376
5377 # Generate 322 keyset key 128 value as 1/0 indicating its presence/absence or
5378 # count of its presence in a molecule.
5379 #
5380 # Key 128 description: C=S
5381 #
5382 sub _Generate322KeySetKey128 {
5383 my($This) = @_;
5384 my($BondSymbol) = '=';
5385
5386 return $This->_DetectBondKeys('C', 'S', $BondSymbol);
5387 }
5388
5389 # Generate 322 keyset key 129 value as 1/0 indicating its presence/absence or
5390 # count of its presence in a molecule.
5391 #
5392 # Key 129 description: C=Cl
5393 #
5394 sub _Generate322KeySetKey129 {
5395 my($This) = @_;
5396 my($BondSymbol) = '=';
5397
5398 return $This->_DetectBondKeys('C', 'Cl', $BondSymbol);
5399 }
5400
5401 # Generate 322 keyset key 130 value as 1/0 indicating its presence/absence or
5402 # count of its presence in a molecule.
5403 #
5404 # Key 130 description: C=P
5405 #
5406 sub _Generate322KeySetKey130 {
5407 my($This) = @_;
5408 my($BondSymbol) = '=';
5409
5410 return $This->_DetectBondKeys('C', 'P', $BondSymbol);
5411 }
5412
5413 # Generate 322 keyset key 131 value as 1/0 indicating its presence/absence or
5414 # count of its presence in a molecule.
5415 #
5416 # Key 131 description: C=F
5417 #
5418 sub _Generate322KeySetKey131 {
5419 my($This) = @_;
5420 my($BondSymbol) = '=';
5421
5422 return $This->_DetectBondKeys('C', 'F', $BondSymbol);
5423 }
5424
5425 # Generate 322 keyset key 132 value as 1/0 indicating its presence/absence or
5426 # count of its presence in a molecule.
5427 #
5428 # Key 132 description: C=Br
5429 #
5430 sub _Generate322KeySetKey132 {
5431 my($This) = @_;
5432 my($BondSymbol) = '=';
5433
5434 return $This->_DetectBondKeys('C', 'Br', $BondSymbol);
5435 }
5436
5437 # Generate 322 keyset key 133 value as 1/0 indicating its presence/absence or
5438 # count of its presence in a molecule.
5439 #
5440 # Key 133 description: C=Si
5441 #
5442 sub _Generate322KeySetKey133 {
5443 my($This) = @_;
5444 my($BondSymbol) = '=';
5445
5446 return $This->_DetectBondKeys('C', 'Si', $BondSymbol);
5447 }
5448
5449 # Generate 322 keyset key 134 value as 1/0 indicating its presence/absence or
5450 # count of its presence in a molecule.
5451 #
5452 # Key 134 description: C=I
5453 #
5454 sub _Generate322KeySetKey134 {
5455 my($This) = @_;
5456 my($BondSymbol) = '=';
5457
5458 return $This->_DetectBondKeys('C', 'I', $BondSymbol);
5459 }
5460
5461 # Generate 322 keyset key 135 value as 1/0 indicating its presence/absence or
5462 # count of its presence in a molecule.
5463 #
5464 # Key 135 description: C=X
5465 #
5466 sub _Generate322KeySetKey135 {
5467 my($This) = @_;
5468 my($BondSymbol) = '=';
5469
5470 return $This->_DetectBondKeys('C', 'Z', $BondSymbol);
5471 }
5472
5473 # Generate 322 keyset key 136 value as 1/0 indicating its presence/absence or
5474 # count of its presence in a molecule.
5475 #
5476 # Key 136 description: N=N
5477 #
5478 sub _Generate322KeySetKey136 {
5479 my($This) = @_;
5480 my($BondSymbol) = '=';
5481
5482 return $This->_DetectBondKeys('N', 'N', $BondSymbol);
5483 }
5484
5485 # Generate 322 keyset key 137 value as 1/0 indicating its presence/absence or
5486 # count of its presence in a molecule.
5487 #
5488 # Key 137 description: N=O
5489 #
5490 sub _Generate322KeySetKey137 {
5491 my($This) = @_;
5492 my($BondSymbol) = '=';
5493
5494 return $This->_DetectBondKeys('N', 'O', $BondSymbol);
5495 }
5496
5497 # Generate 322 keyset key 138 value as 1/0 indicating its presence/absence or
5498 # count of its presence in a molecule.
5499 #
5500 # Key 138 description: N=S
5501 #
5502 sub _Generate322KeySetKey138 {
5503 my($This) = @_;
5504 my($BondSymbol) = '=';
5505
5506 return $This->_DetectBondKeys('N', 'S', $BondSymbol);
5507 }
5508
5509 # Generate 322 keyset key 139 value as 1/0 indicating its presence/absence or
5510 # count of its presence in a molecule.
5511 #
5512 # Key 139 description: N=Cl
5513 #
5514 sub _Generate322KeySetKey139 {
5515 my($This) = @_;
5516 my($BondSymbol) = '=';
5517
5518 return $This->_DetectBondKeys('N', 'Cl', $BondSymbol);
5519 }
5520
5521 # Generate 322 keyset key 140 value as 1/0 indicating its presence/absence or
5522 # count of its presence in a molecule.
5523 #
5524 # Key 140 description: N=P
5525 #
5526 sub _Generate322KeySetKey140 {
5527 my($This) = @_;
5528 my($BondSymbol) = '=';
5529
5530 return $This->_DetectBondKeys('N', 'P', $BondSymbol);
5531 }
5532
5533 # Generate 322 keyset key 141 value as 1/0 indicating its presence/absence or
5534 # count of its presence in a molecule.
5535 #
5536 # Key 141 description: N=F
5537 #
5538 sub _Generate322KeySetKey141 {
5539 my($This) = @_;
5540 my($BondSymbol) = '=';
5541
5542 return $This->_DetectBondKeys('N', 'F', $BondSymbol);
5543 }
5544
5545 # Generate 322 keyset key 142 value as 1/0 indicating its presence/absence or
5546 # count of its presence in a molecule.
5547 #
5548 # Key 142 description: N=Br
5549 #
5550 sub _Generate322KeySetKey142 {
5551 my($This) = @_;
5552 my($BondSymbol) = '=';
5553
5554 return $This->_DetectBondKeys('N', 'Br', $BondSymbol);
5555 }
5556
5557 # Generate 322 keyset key 143 value as 1/0 indicating its presence/absence or
5558 # count of its presence in a molecule.
5559 #
5560 # Key 143 description: N=Si
5561 #
5562 sub _Generate322KeySetKey143 {
5563 my($This) = @_;
5564 my($BondSymbol) = '=';
5565
5566 return $This->_DetectBondKeys('N', 'Si', $BondSymbol);
5567 }
5568
5569 # Generate 322 keyset key 144 value as 1/0 indicating its presence/absence or
5570 # count of its presence in a molecule.
5571 #
5572 # Key 144 description: N=I
5573 #
5574 sub _Generate322KeySetKey144 {
5575 my($This) = @_;
5576 my($BondSymbol) = '=';
5577
5578 return $This->_DetectBondKeys('N', 'I', $BondSymbol);
5579 }
5580
5581 # Generate 322 keyset key 145 value as 1/0 indicating its presence/absence or
5582 # count of its presence in a molecule.
5583 #
5584 # Key 145 description: N=X
5585 #
5586 sub _Generate322KeySetKey145 {
5587 my($This) = @_;
5588 my($BondSymbol) = '=';
5589
5590 return $This->_DetectBondKeys('N', 'Z', $BondSymbol);
5591 }
5592
5593 # Generate 322 keyset key 146 value as 1/0 indicating its presence/absence or
5594 # count of its presence in a molecule.
5595 #
5596 # Key 146 description: O=O
5597 #
5598 sub _Generate322KeySetKey146 {
5599 my($This) = @_;
5600 my($BondSymbol) = '=';
5601
5602 return $This->_DetectBondKeys('O', 'O', $BondSymbol);
5603 }
5604
5605 # Generate 322 keyset key 147 value as 1/0 indicating its presence/absence or
5606 # count of its presence in a molecule.
5607 #
5608 # Key 147 description: O=S
5609 #
5610 sub _Generate322KeySetKey147 {
5611 my($This) = @_;
5612 my($BondSymbol) = '=';
5613
5614 return $This->_DetectBondKeys('O', 'S', $BondSymbol);
5615 }
5616
5617 # Generate 322 keyset key 148 value as 1/0 indicating its presence/absence or
5618 # count of its presence in a molecule.
5619 #
5620 # Key 148 description: O=Cl
5621 #
5622 sub _Generate322KeySetKey148 {
5623 my($This) = @_;
5624 my($BondSymbol) = '=';
5625
5626 return $This->_DetectBondKeys('O', 'Cl', $BondSymbol);
5627 }
5628
5629 # Generate 322 keyset key 149 value as 1/0 indicating its presence/absence or
5630 # count of its presence in a molecule.
5631 #
5632 # Key 149 description: O=P
5633 #
5634 sub _Generate322KeySetKey149 {
5635 my($This) = @_;
5636 my($BondSymbol) = '=';
5637
5638 return $This->_DetectBondKeys('O', 'P', $BondSymbol);
5639 }
5640
5641 # Generate 322 keyset key 150 value as 1/0 indicating its presence/absence or
5642 # count of its presence in a molecule.
5643 #
5644 # Key 150 description: O=F
5645 #
5646 sub _Generate322KeySetKey150 {
5647 my($This) = @_;
5648 my($BondSymbol) = '=';
5649
5650 return $This->_DetectBondKeys('O', 'F', $BondSymbol);
5651 }
5652
5653 # Generate 322 keyset key 151 value as 1/0 indicating its presence/absence or
5654 # count of its presence in a molecule.
5655 #
5656 # Key 151 description: O=Br
5657 #
5658 sub _Generate322KeySetKey151 {
5659 my($This) = @_;
5660 my($BondSymbol) = '=';
5661
5662 return $This->_DetectBondKeys('O', 'Br', $BondSymbol);
5663 }
5664
5665 # Generate 322 keyset key 152 value as 1/0 indicating its presence/absence or
5666 # count of its presence in a molecule.
5667 #
5668 # Key 152 description: O=Si
5669 #
5670 sub _Generate322KeySetKey152 {
5671 my($This) = @_;
5672 my($BondSymbol) = '=';
5673
5674 return $This->_DetectBondKeys('O', 'Si', $BondSymbol);
5675 }
5676
5677 # Generate 322 keyset key 153 value as 1/0 indicating its presence/absence or
5678 # count of its presence in a molecule.
5679 #
5680 # Key 153 description: O=I
5681 #
5682 sub _Generate322KeySetKey153 {
5683 my($This) = @_;
5684 my($BondSymbol) = '=';
5685
5686 return $This->_DetectBondKeys('O', 'I', $BondSymbol);
5687 }
5688
5689 # Generate 322 keyset key 154 value as 1/0 indicating its presence/absence or
5690 # count of its presence in a molecule.
5691 #
5692 # Key 154 description: O=X
5693 #
5694 sub _Generate322KeySetKey154 {
5695 my($This) = @_;
5696 my($BondSymbol) = '=';
5697
5698 return $This->_DetectBondKeys('O', 'Z', $BondSymbol);
5699 }
5700
5701 # Generate 322 keyset key 155 value as 1/0 indicating its presence/absence or
5702 # count of its presence in a molecule.
5703 #
5704 # Key 155 description: S=S
5705 #
5706 sub _Generate322KeySetKey155 {
5707 my($This) = @_;
5708 my($BondSymbol) = '=';
5709
5710 return $This->_DetectBondKeys('S', 'S', $BondSymbol);
5711 }
5712
5713 # Generate 322 keyset key 156 value as 1/0 indicating its presence/absence or
5714 # count of its presence in a molecule.
5715 #
5716 # Key 156 description: S=Cl
5717 #
5718 sub _Generate322KeySetKey156 {
5719 my($This) = @_;
5720 my($BondSymbol) = '=';
5721
5722 return $This->_DetectBondKeys('S', 'Cl', $BondSymbol);
5723 }
5724
5725 # Generate 322 keyset key 157 value as 1/0 indicating its presence/absence or
5726 # count of its presence in a molecule.
5727 #
5728 # Key 157 description: S=P
5729 #
5730 sub _Generate322KeySetKey157 {
5731 my($This) = @_;
5732 my($BondSymbol) = '=';
5733
5734 return $This->_DetectBondKeys('S', 'P', $BondSymbol);
5735 }
5736
5737 # Generate 322 keyset key 158 value as 1/0 indicating its presence/absence or
5738 # count of its presence in a molecule.
5739 #
5740 # Key 158 description: S=F
5741 #
5742 sub _Generate322KeySetKey158 {
5743 my($This) = @_;
5744 my($BondSymbol) = '=';
5745
5746 return $This->_DetectBondKeys('S', 'F', $BondSymbol);
5747 }
5748
5749 # Generate 322 keyset key 159 value as 1/0 indicating its presence/absence or
5750 # count of its presence in a molecule.
5751 #
5752 # Key 159 description: S=Br
5753 #
5754 sub _Generate322KeySetKey159 {
5755 my($This) = @_;
5756 my($BondSymbol) = '=';
5757
5758 return $This->_DetectBondKeys('S', 'Br', $BondSymbol);
5759 }
5760
5761 # Generate 322 keyset key 160 value as 1/0 indicating its presence/absence or
5762 # count of its presence in a molecule.
5763 #
5764 # Key 160 description: S=Si
5765 #
5766 sub _Generate322KeySetKey160 {
5767 my($This) = @_;
5768 my($BondSymbol) = '=';
5769
5770 return $This->_DetectBondKeys('S', 'Si', $BondSymbol);
5771 }
5772
5773 # Generate 322 keyset key 161 value as 1/0 indicating its presence/absence or
5774 # count of its presence in a molecule.
5775 #
5776 # Key 161 description: S=I
5777 #
5778 sub _Generate322KeySetKey161 {
5779 my($This) = @_;
5780 my($BondSymbol) = '=';
5781
5782 return $This->_DetectBondKeys('S', 'I', $BondSymbol);
5783 }
5784
5785 # Generate 322 keyset key 162 value as 1/0 indicating its presence/absence or
5786 # count of its presence in a molecule.
5787 #
5788 # Key 162 description: S=X
5789 #
5790 sub _Generate322KeySetKey162 {
5791 my($This) = @_;
5792 my($BondSymbol) = '=';
5793
5794 return $This->_DetectBondKeys('S', 'Z', $BondSymbol);
5795 }
5796
5797 # Generate 322 keyset key 163 value as 1/0 indicating its presence/absence or
5798 # count of its presence in a molecule.
5799 #
5800 # Key 163 description: Cl=Cl
5801 #
5802 sub _Generate322KeySetKey163 {
5803 my($This) = @_;
5804 my($BondSymbol) = '=';
5805
5806 return $This->_DetectBondKeys('Cl', 'Cl', $BondSymbol);
5807 }
5808
5809 # Generate 322 keyset key 164 value as 1/0 indicating its presence/absence or
5810 # count of its presence in a molecule.
5811 #
5812 # Key 164 description: Cl=P
5813 #
5814 sub _Generate322KeySetKey164 {
5815 my($This) = @_;
5816 my($BondSymbol) = '=';
5817
5818 return $This->_DetectBondKeys('Cl', 'P', $BondSymbol);
5819 }
5820
5821 # Generate 322 keyset key 165 value as 1/0 indicating its presence/absence or
5822 # count of its presence in a molecule.
5823 #
5824 # Key 165 description: Cl=F
5825 #
5826 sub _Generate322KeySetKey165 {
5827 my($This) = @_;
5828 my($BondSymbol) = '=';
5829
5830 return $This->_DetectBondKeys('Cl', 'F', $BondSymbol);
5831 }
5832
5833 # Generate 322 keyset key 166 value as 1/0 indicating its presence/absence or
5834 # count of its presence in a molecule.
5835 #
5836 # Key 166 description: Cl=Br
5837 #
5838 sub _Generate322KeySetKey166 {
5839 my($This) = @_;
5840 my($BondSymbol) = '=';
5841
5842 return $This->_DetectBondKeys('Cl', 'Br', $BondSymbol);
5843 }
5844
5845 # Generate 322 keyset key 167 value as 1/0 indicating its presence/absence or
5846 # count of its presence in a molecule.
5847 #
5848 # Key 167 description: Cl=Si
5849 #
5850 sub _Generate322KeySetKey167 {
5851 my($This) = @_;
5852 my($BondSymbol) = '=';
5853
5854 return $This->_DetectBondKeys('Cl', 'Si', $BondSymbol);
5855 }
5856
5857 # Generate 322 keyset key 168 value as 1/0 indicating its presence/absence or
5858 # count of its presence in a molecule.
5859 #
5860 # Key 168 description: Cl=I
5861 #
5862 sub _Generate322KeySetKey168 {
5863 my($This) = @_;
5864 my($BondSymbol) = '=';
5865
5866 return $This->_DetectBondKeys('Cl', 'I', $BondSymbol);
5867 }
5868
5869 # Generate 322 keyset key 169 value as 1/0 indicating its presence/absence or
5870 # count of its presence in a molecule.
5871 #
5872 # Key 169 description: Cl=X
5873 #
5874 sub _Generate322KeySetKey169 {
5875 my($This) = @_;
5876 my($BondSymbol) = '=';
5877
5878 return $This->_DetectBondKeys('Cl', 'Z', $BondSymbol);
5879 }
5880
5881 # Generate 322 keyset key 170 value as 1/0 indicating its presence/absence or
5882 # count of its presence in a molecule.
5883 #
5884 # Key 170 description: P=P
5885 #
5886 sub _Generate322KeySetKey170 {
5887 my($This) = @_;
5888 my($BondSymbol) = '=';
5889
5890 return $This->_DetectBondKeys('P', 'P', $BondSymbol);
5891 }
5892
5893 # Generate 322 keyset key 171 value as 1/0 indicating its presence/absence or
5894 # count of its presence in a molecule.
5895 #
5896 # Key 171 description: P=F
5897 #
5898 sub _Generate322KeySetKey171 {
5899 my($This) = @_;
5900 my($BondSymbol) = '=';
5901
5902 return $This->_DetectBondKeys('P', 'F', $BondSymbol);
5903 }
5904
5905 # Generate 322 keyset key 172 value as 1/0 indicating its presence/absence or
5906 # count of its presence in a molecule.
5907 #
5908 # Key 172 description: P=Br
5909 #
5910 sub _Generate322KeySetKey172 {
5911 my($This) = @_;
5912 my($BondSymbol) = '=';
5913
5914 return $This->_DetectBondKeys('P', 'Br', $BondSymbol);
5915 }
5916
5917 # Generate 322 keyset key 173 value as 1/0 indicating its presence/absence or
5918 # count of its presence in a molecule.
5919 #
5920 # Key 173 description: P=Si
5921 #
5922 sub _Generate322KeySetKey173 {
5923 my($This) = @_;
5924 my($BondSymbol) = '=';
5925
5926 return $This->_DetectBondKeys('P', 'Si', $BondSymbol);
5927 }
5928
5929 # Generate 322 keyset key 174 value as 1/0 indicating its presence/absence or
5930 # count of its presence in a molecule.
5931 #
5932 # Key 174 description: P=I
5933 #
5934 sub _Generate322KeySetKey174 {
5935 my($This) = @_;
5936 my($BondSymbol) = '=';
5937
5938 return $This->_DetectBondKeys('P', 'I', $BondSymbol);
5939 }
5940
5941 # Generate 322 keyset key 175 value as 1/0 indicating its presence/absence or
5942 # count of its presence in a molecule.
5943 #
5944 # Key 175 description: P=X
5945 #
5946 sub _Generate322KeySetKey175 {
5947 my($This) = @_;
5948 my($BondSymbol) = '=';
5949
5950 return $This->_DetectBondKeys('P', 'Z', $BondSymbol);
5951 }
5952
5953 # Generate 322 keyset key 176 value as 1/0 indicating its presence/absence or
5954 # count of its presence in a molecule.
5955 #
5956 # Key 176 description: F=F
5957 #
5958 sub _Generate322KeySetKey176 {
5959 my($This) = @_;
5960 my($BondSymbol) = '=';
5961
5962 return $This->_DetectBondKeys('F', 'F', $BondSymbol);
5963 }
5964
5965 # Generate 322 keyset key 177 value as 1/0 indicating its presence/absence or
5966 # count of its presence in a molecule.
5967 #
5968 # Key 177 description: F=Br
5969 #
5970 sub _Generate322KeySetKey177 {
5971 my($This) = @_;
5972 my($BondSymbol) = '=';
5973
5974 return $This->_DetectBondKeys('F', 'Br', $BondSymbol);
5975 }
5976
5977 # Generate 322 keyset key 178 value as 1/0 indicating its presence/absence or
5978 # count of its presence in a molecule.
5979 #
5980 # Key 178 description: F=Si
5981 #
5982 sub _Generate322KeySetKey178 {
5983 my($This) = @_;
5984 my($BondSymbol) = '=';
5985
5986 return $This->_DetectBondKeys('F', 'Si', $BondSymbol);
5987 }
5988
5989 # Generate 322 keyset key 179 value as 1/0 indicating its presence/absence or
5990 # count of its presence in a molecule.
5991 #
5992 # Key 179 description: F=I
5993 #
5994 sub _Generate322KeySetKey179 {
5995 my($This) = @_;
5996 my($BondSymbol) = '=';
5997
5998 return $This->_DetectBondKeys('F', 'I', $BondSymbol);
5999 }
6000
6001 # Generate 322 keyset key 180 value as 1/0 indicating its presence/absence or
6002 # count of its presence in a molecule.
6003 #
6004 # Key 180 description: F=X
6005 #
6006 sub _Generate322KeySetKey180 {
6007 my($This) = @_;
6008 my($BondSymbol) = '=';
6009
6010 return $This->_DetectBondKeys('F', 'Z', $BondSymbol);
6011 }
6012
6013 # Generate 322 keyset key 181 value as 1/0 indicating its presence/absence or
6014 # count of its presence in a molecule.
6015 #
6016 # Key 181 description: Br=Br
6017 #
6018 sub _Generate322KeySetKey181 {
6019 my($This) = @_;
6020 my($BondSymbol) = '=';
6021
6022 return $This->_DetectBondKeys('Br', 'Br', $BondSymbol);
6023 }
6024
6025 # Generate 322 keyset key 182 value as 1/0 indicating its presence/absence or
6026 # count of its presence in a molecule.
6027 #
6028 # Key 182 description: Br=Si
6029 #
6030 sub _Generate322KeySetKey182 {
6031 my($This) = @_;
6032 my($BondSymbol) = '=';
6033
6034 return $This->_DetectBondKeys('Br', 'Si', $BondSymbol);
6035 }
6036
6037 # Generate 322 keyset key 183 value as 1/0 indicating its presence/absence or
6038 # count of its presence in a molecule.
6039 #
6040 # Key 183 description: Br=I
6041 #
6042 sub _Generate322KeySetKey183 {
6043 my($This) = @_;
6044 my($BondSymbol) = '=';
6045
6046 return $This->_DetectBondKeys('Br', 'I', $BondSymbol);
6047 }
6048
6049 # Generate 322 keyset key 184 value as 1/0 indicating its presence/absence or
6050 # count of its presence in a molecule.
6051 #
6052 # Key 184 description: Br=X
6053 #
6054 sub _Generate322KeySetKey184 {
6055 my($This) = @_;
6056 my($BondSymbol) = '=';
6057
6058 return $This->_DetectBondKeys('Br', 'Z', $BondSymbol);
6059 }
6060
6061 # Generate 322 keyset key 185 value as 1/0 indicating its presence/absence or
6062 # count of its presence in a molecule.
6063 #
6064 # Key 185 description: Si=Si
6065 #
6066 sub _Generate322KeySetKey185 {
6067 my($This) = @_;
6068 my($BondSymbol) = '=';
6069
6070 return $This->_DetectBondKeys('Si', 'Si', $BondSymbol);
6071 }
6072
6073 # Generate 322 keyset key 186 value as 1/0 indicating its presence/absence or
6074 # count of its presence in a molecule.
6075 #
6076 # Key 186 description: Si=I
6077 #
6078 sub _Generate322KeySetKey186 {
6079 my($This) = @_;
6080 my($BondSymbol) = '=';
6081
6082 return $This->_DetectBondKeys('Si', 'I', $BondSymbol);
6083 }
6084
6085 # Generate 322 keyset key 187 value as 1/0 indicating its presence/absence or
6086 # count of its presence in a molecule.
6087 #
6088 # Key 187 description: Si=X
6089 #
6090 sub _Generate322KeySetKey187 {
6091 my($This) = @_;
6092 my($BondSymbol) = '=';
6093
6094 return $This->_DetectBondKeys('Si', 'Z', $BondSymbol);
6095 }
6096
6097 # Generate 322 keyset key 188 value as 1/0 indicating its presence/absence or
6098 # count of its presence in a molecule.
6099 #
6100 # Key 188 description: I=I
6101 #
6102 sub _Generate322KeySetKey188 {
6103 my($This) = @_;
6104 my($BondSymbol) = '=';
6105
6106 return $This->_DetectBondKeys('I', 'I', $BondSymbol);
6107 }
6108
6109 # Generate 322 keyset key 189 value as 1/0 indicating its presence/absence or
6110 # count of its presence in a molecule.
6111 #
6112 # Key 189 description: I=X
6113 #
6114 sub _Generate322KeySetKey189 {
6115 my($This) = @_;
6116 my($BondSymbol) = '=';
6117
6118 return $This->_DetectBondKeys('I', 'Z', $BondSymbol);
6119 }
6120
6121 # Generate 322 keyset key 190 value as 1/0 indicating its presence/absence or
6122 # count of its presence in a molecule.
6123 #
6124 # Key 190 description: X=X
6125 #
6126 sub _Generate322KeySetKey190 {
6127 my($This) = @_;
6128 my($BondSymbol) = '=';
6129
6130 return $This->_DetectBondKeys('Z', 'Z', $BondSymbol);
6131 }
6132
6133 # Generate 322 keyset key 191 value as 1/0 indicating its presence/absence or
6134 # count of its presence in a molecule.
6135 #
6136 # Key 191 description: C#C
6137 #
6138 sub _Generate322KeySetKey191 {
6139 my($This) = @_;
6140 my($BondSymbol) = '#';
6141
6142 return $This->_DetectBondKeys('C', 'C', $BondSymbol);
6143 }
6144
6145 # Generate 322 keyset key 192 value as 1/0 indicating its presence/absence or
6146 # count of its presence in a molecule.
6147 #
6148 # Key 192 description: C#N
6149 #
6150 sub _Generate322KeySetKey192 {
6151 my($This) = @_;
6152 my($BondSymbol) = '#';
6153
6154 return $This->_DetectBondKeys('C', 'N', $BondSymbol);
6155 }
6156
6157 # Generate 322 keyset key 193 value as 1/0 indicating its presence/absence or
6158 # count of its presence in a molecule.
6159 #
6160 # Key 193 description: C#O
6161 #
6162 sub _Generate322KeySetKey193 {
6163 my($This) = @_;
6164 my($BondSymbol) = '#';
6165
6166 return $This->_DetectBondKeys('C', 'O', $BondSymbol);
6167 }
6168
6169 # Generate 322 keyset key 194 value as 1/0 indicating its presence/absence or
6170 # count of its presence in a molecule.
6171 #
6172 # Key 194 description: C#S
6173 #
6174 sub _Generate322KeySetKey194 {
6175 my($This) = @_;
6176 my($BondSymbol) = '#';
6177
6178 return $This->_DetectBondKeys('C', 'S', $BondSymbol);
6179 }
6180
6181 # Generate 322 keyset key 195 value as 1/0 indicating its presence/absence or
6182 # count of its presence in a molecule.
6183 #
6184 # Key 195 description: C#Cl
6185 #
6186 sub _Generate322KeySetKey195 {
6187 my($This) = @_;
6188 my($BondSymbol) = '#';
6189
6190 return $This->_DetectBondKeys('C', 'Cl', $BondSymbol);
6191 }
6192
6193 # Generate 322 keyset key 196 value as 1/0 indicating its presence/absence or
6194 # count of its presence in a molecule.
6195 #
6196 # Key 196 description: C#P
6197 #
6198 sub _Generate322KeySetKey196 {
6199 my($This) = @_;
6200 my($BondSymbol) = '#';
6201
6202 return $This->_DetectBondKeys('C', 'P', $BondSymbol);
6203 }
6204
6205 # Generate 322 keyset key 197 value as 1/0 indicating its presence/absence or
6206 # count of its presence in a molecule.
6207 #
6208 # Key 197 description: C#F
6209 #
6210 sub _Generate322KeySetKey197 {
6211 my($This) = @_;
6212 my($BondSymbol) = '#';
6213
6214 return $This->_DetectBondKeys('C', 'F', $BondSymbol);
6215 }
6216
6217 # Generate 322 keyset key 198 value as 1/0 indicating its presence/absence or
6218 # count of its presence in a molecule.
6219 #
6220 # Key 198 description: C#Br
6221 #
6222 sub _Generate322KeySetKey198 {
6223 my($This) = @_;
6224 my($BondSymbol) = '#';
6225
6226 return $This->_DetectBondKeys('C', 'Br', $BondSymbol);
6227 }
6228
6229 # Generate 322 keyset key 199 value as 1/0 indicating its presence/absence or
6230 # count of its presence in a molecule.
6231 #
6232 # Key 199 description: C#Si
6233 #
6234 sub _Generate322KeySetKey199 {
6235 my($This) = @_;
6236 my($BondSymbol) = '#';
6237
6238 return $This->_DetectBondKeys('C', 'Si', $BondSymbol);
6239 }
6240
6241 # Generate 322 keyset key 200 value as 1/0 indicating its presence/absence or
6242 # count of its presence in a molecule.
6243 #
6244 # Key 200 description: C#I
6245 #
6246 sub _Generate322KeySetKey200 {
6247 my($This) = @_;
6248 my($BondSymbol) = '#';
6249
6250 return $This->_DetectBondKeys('C', 'I', $BondSymbol);
6251 }
6252
6253 # Generate 322 keyset key 201 value as 1/0 indicating its presence/absence or
6254 # count of its presence in a molecule.
6255 #
6256 # Key 201 description: C#X
6257 #
6258 sub _Generate322KeySetKey201 {
6259 my($This) = @_;
6260 my($BondSymbol) = '#';
6261
6262 return $This->_DetectBondKeys('C', 'Z', $BondSymbol);
6263 }
6264
6265 # Generate 322 keyset key 202 value as 1/0 indicating its presence/absence or
6266 # count of its presence in a molecule.
6267 #
6268 # Key 202 description: N#N
6269 #
6270 sub _Generate322KeySetKey202 {
6271 my($This) = @_;
6272 my($BondSymbol) = '#';
6273
6274 return $This->_DetectBondKeys('N', 'N', $BondSymbol);
6275 }
6276
6277 # Generate 322 keyset key 203 value as 1/0 indicating its presence/absence or
6278 # count of its presence in a molecule.
6279 #
6280 # Key 203 description: N#O
6281 #
6282 sub _Generate322KeySetKey203 {
6283 my($This) = @_;
6284 my($BondSymbol) = '#';
6285
6286 return $This->_DetectBondKeys('N', 'O', $BondSymbol);
6287 }
6288
6289 # Generate 322 keyset key 204 value as 1/0 indicating its presence/absence or
6290 # count of its presence in a molecule.
6291 #
6292 # Key 204 description: N#S
6293 #
6294 sub _Generate322KeySetKey204 {
6295 my($This) = @_;
6296 my($BondSymbol) = '#';
6297
6298 return $This->_DetectBondKeys('N', 'S', $BondSymbol);
6299 }
6300
6301 # Generate 322 keyset key 205 value as 1/0 indicating its presence/absence or
6302 # count of its presence in a molecule.
6303 #
6304 # Key 205 description: N#Cl
6305 #
6306 sub _Generate322KeySetKey205 {
6307 my($This) = @_;
6308 my($BondSymbol) = '#';
6309
6310 return $This->_DetectBondKeys('N', 'Cl', $BondSymbol);
6311 }
6312
6313 # Generate 322 keyset key 206 value as 1/0 indicating its presence/absence or
6314 # count of its presence in a molecule.
6315 #
6316 # Key 206 description: N#P
6317 #
6318 sub _Generate322KeySetKey206 {
6319 my($This) = @_;
6320 my($BondSymbol) = '#';
6321
6322 return $This->_DetectBondKeys('N', 'P', $BondSymbol);
6323 }
6324
6325 # Generate 322 keyset key 207 value as 1/0 indicating its presence/absence or
6326 # count of its presence in a molecule.
6327 #
6328 # Key 207 description: N#F
6329 #
6330 sub _Generate322KeySetKey207 {
6331 my($This) = @_;
6332 my($BondSymbol) = '#';
6333
6334 return $This->_DetectBondKeys('N', 'F', $BondSymbol);
6335 }
6336
6337 # Generate 322 keyset key 208 value as 1/0 indicating its presence/absence or
6338 # count of its presence in a molecule.
6339 #
6340 # Key 208 description: N#Br
6341 #
6342 sub _Generate322KeySetKey208 {
6343 my($This) = @_;
6344 my($BondSymbol) = '#';
6345
6346 return $This->_DetectBondKeys('N', 'Br', $BondSymbol);
6347 }
6348
6349 # Generate 322 keyset key 209 value as 1/0 indicating its presence/absence or
6350 # count of its presence in a molecule.
6351 #
6352 # Key 209 description: N#Si
6353 #
6354 sub _Generate322KeySetKey209 {
6355 my($This) = @_;
6356 my($BondSymbol) = '#';
6357
6358 return $This->_DetectBondKeys('N', 'Si', $BondSymbol);
6359 }
6360
6361 # Generate 322 keyset key 210 value as 1/0 indicating its presence/absence or
6362 # count of its presence in a molecule.
6363 #
6364 # Key 210 description: N#I
6365 #
6366 sub _Generate322KeySetKey210 {
6367 my($This) = @_;
6368 my($BondSymbol) = '#';
6369
6370 return $This->_DetectBondKeys('N', 'I', $BondSymbol);
6371 }
6372
6373 # Generate 322 keyset key 211 value as 1/0 indicating its presence/absence or
6374 # count of its presence in a molecule.
6375 #
6376 # Key 211 description: N#X
6377 #
6378 sub _Generate322KeySetKey211 {
6379 my($This) = @_;
6380 my($BondSymbol) = '#';
6381
6382 return $This->_DetectBondKeys('N', 'Z', $BondSymbol);
6383 }
6384
6385 # Generate 322 keyset key 212 value as 1/0 indicating its presence/absence or
6386 # count of its presence in a molecule.
6387 #
6388 # Key 212 description: O#O
6389 #
6390 sub _Generate322KeySetKey212 {
6391 my($This) = @_;
6392 my($BondSymbol) = '#';
6393
6394 return $This->_DetectBondKeys('O', 'O', $BondSymbol);
6395 }
6396
6397 # Generate 322 keyset key 213 value as 1/0 indicating its presence/absence or
6398 # count of its presence in a molecule.
6399 #
6400 # Key 213 description: O#S
6401 #
6402 sub _Generate322KeySetKey213 {
6403 my($This) = @_;
6404 my($BondSymbol) = '#';
6405
6406 return $This->_DetectBondKeys('O', 'S', $BondSymbol);
6407 }
6408
6409 # Generate 322 keyset key 214 value as 1/0 indicating its presence/absence or
6410 # count of its presence in a molecule.
6411 #
6412 # Key 214 description: O#Cl
6413 #
6414 sub _Generate322KeySetKey214 {
6415 my($This) = @_;
6416 my($BondSymbol) = '#';
6417
6418 return $This->_DetectBondKeys('O', 'Cl', $BondSymbol);
6419 }
6420
6421 # Generate 322 keyset key 215 value as 1/0 indicating its presence/absence or
6422 # count of its presence in a molecule.
6423 #
6424 # Key 215 description: O#P
6425 #
6426 sub _Generate322KeySetKey215 {
6427 my($This) = @_;
6428 my($BondSymbol) = '#';
6429
6430 return $This->_DetectBondKeys('O', 'P', $BondSymbol);
6431 }
6432
6433 # Generate 322 keyset key 216 value as 1/0 indicating its presence/absence or
6434 # count of its presence in a molecule.
6435 #
6436 # Key 216 description: O#F
6437 #
6438 sub _Generate322KeySetKey216 {
6439 my($This) = @_;
6440 my($BondSymbol) = '#';
6441
6442 return $This->_DetectBondKeys('O', 'F', $BondSymbol);
6443 }
6444
6445 # Generate 322 keyset key 217 value as 1/0 indicating its presence/absence or
6446 # count of its presence in a molecule.
6447 #
6448 # Key 217 description: O#Br
6449 #
6450 sub _Generate322KeySetKey217 {
6451 my($This) = @_;
6452 my($BondSymbol) = '#';
6453
6454 return $This->_DetectBondKeys('O', 'Br', $BondSymbol);
6455 }
6456
6457 # Generate 322 keyset key 218 value as 1/0 indicating its presence/absence or
6458 # count of its presence in a molecule.
6459 #
6460 # Key 218 description: O#Si
6461 #
6462 sub _Generate322KeySetKey218 {
6463 my($This) = @_;
6464 my($BondSymbol) = '#';
6465
6466 return $This->_DetectBondKeys('O', 'Si', $BondSymbol);
6467 }
6468
6469 # Generate 322 keyset key 219 value as 1/0 indicating its presence/absence or
6470 # count of its presence in a molecule.
6471 #
6472 # Key 219 description: O#I
6473 #
6474 sub _Generate322KeySetKey219 {
6475 my($This) = @_;
6476 my($BondSymbol) = '#';
6477
6478 return $This->_DetectBondKeys('O', 'I', $BondSymbol);
6479 }
6480
6481 # Generate 322 keyset key 220 value as 1/0 indicating its presence/absence or
6482 # count of its presence in a molecule.
6483 #
6484 # Key 220 description: O#X
6485 #
6486 sub _Generate322KeySetKey220 {
6487 my($This) = @_;
6488 my($BondSymbol) = '#';
6489
6490 return $This->_DetectBondKeys('O', 'Z', $BondSymbol);
6491 }
6492
6493 # Generate 322 keyset key 221 value as 1/0 indicating its presence/absence or
6494 # count of its presence in a molecule.
6495 #
6496 # Key 221 description: S#S
6497 #
6498 sub _Generate322KeySetKey221 {
6499 my($This) = @_;
6500 my($BondSymbol) = '#';
6501
6502 return $This->_DetectBondKeys('S', 'S', $BondSymbol);
6503 }
6504
6505 # Generate 322 keyset key 222 value as 1/0 indicating its presence/absence or
6506 # count of its presence in a molecule.
6507 #
6508 # Key 222 description: S#Cl
6509 #
6510 sub _Generate322KeySetKey222 {
6511 my($This) = @_;
6512 my($BondSymbol) = '#';
6513
6514 return $This->_DetectBondKeys('S', 'Cl', $BondSymbol);
6515 }
6516
6517 # Generate 322 keyset key 223 value as 1/0 indicating its presence/absence or
6518 # count of its presence in a molecule.
6519 #
6520 # Key 223 description: S#P
6521 #
6522 sub _Generate322KeySetKey223 {
6523 my($This) = @_;
6524 my($BondSymbol) = '#';
6525
6526 return $This->_DetectBondKeys('S', 'P', $BondSymbol);
6527 }
6528
6529 # Generate 322 keyset key 224 value as 1/0 indicating its presence/absence or
6530 # count of its presence in a molecule.
6531 #
6532 # Key 224 description: S#F
6533 #
6534 sub _Generate322KeySetKey224 {
6535 my($This) = @_;
6536 my($BondSymbol) = '#';
6537
6538 return $This->_DetectBondKeys('S', 'F', $BondSymbol);
6539 }
6540
6541 # Generate 322 keyset key 225 value as 1/0 indicating its presence/absence or
6542 # count of its presence in a molecule.
6543 #
6544 # Key 225 description: S#Br
6545 #
6546 sub _Generate322KeySetKey225 {
6547 my($This) = @_;
6548 my($BondSymbol) = '#';
6549
6550 return $This->_DetectBondKeys('S', 'Br', $BondSymbol);
6551 }
6552
6553 # Generate 322 keyset key 226 value as 1/0 indicating its presence/absence or
6554 # count of its presence in a molecule.
6555 #
6556 # Key 226 description: S#Si
6557 #
6558 sub _Generate322KeySetKey226 {
6559 my($This) = @_;
6560 my($BondSymbol) = '#';
6561
6562 return $This->_DetectBondKeys('S', 'Si', $BondSymbol);
6563 }
6564
6565 # Generate 322 keyset key 227 value as 1/0 indicating its presence/absence or
6566 # count of its presence in a molecule.
6567 #
6568 # Key 227 description: S#I
6569 #
6570 sub _Generate322KeySetKey227 {
6571 my($This) = @_;
6572 my($BondSymbol) = '#';
6573
6574 return $This->_DetectBondKeys('S', 'I', $BondSymbol);
6575 }
6576
6577 # Generate 322 keyset key 228 value as 1/0 indicating its presence/absence or
6578 # count of its presence in a molecule.
6579 #
6580 # Key 228 description: S#X
6581 #
6582 sub _Generate322KeySetKey228 {
6583 my($This) = @_;
6584 my($BondSymbol) = '#';
6585
6586 return $This->_DetectBondKeys('S', 'Z', $BondSymbol);
6587 }
6588
6589 # Generate 322 keyset key 229 value as 1/0 indicating its presence/absence or
6590 # count of its presence in a molecule.
6591 #
6592 # Key 229 description: Cl#Cl
6593 #
6594 sub _Generate322KeySetKey229 {
6595 my($This) = @_;
6596 my($BondSymbol) = '#';
6597
6598 return $This->_DetectBondKeys('Cl', 'Cl', $BondSymbol);
6599 }
6600
6601 # Generate 322 keyset key 230 value as 1/0 indicating its presence/absence or
6602 # count of its presence in a molecule.
6603 #
6604 # Key 230 description: Cl#P
6605 #
6606 sub _Generate322KeySetKey230 {
6607 my($This) = @_;
6608 my($BondSymbol) = '#';
6609
6610 return $This->_DetectBondKeys('Cl', 'P', $BondSymbol);
6611 }
6612
6613 # Generate 322 keyset key 231 value as 1/0 indicating its presence/absence or
6614 # count of its presence in a molecule.
6615 #
6616 # Key 231 description: Cl#F
6617 #
6618 sub _Generate322KeySetKey231 {
6619 my($This) = @_;
6620 my($BondSymbol) = '#';
6621
6622 return $This->_DetectBondKeys('Cl', 'F', $BondSymbol);
6623 }
6624
6625 # Generate 322 keyset key 232 value as 1/0 indicating its presence/absence or
6626 # count of its presence in a molecule.
6627 #
6628 # Key 232 description: Cl#Br
6629 #
6630 sub _Generate322KeySetKey232 {
6631 my($This) = @_;
6632 my($BondSymbol) = '#';
6633
6634 return $This->_DetectBondKeys('Cl', 'Br', $BondSymbol);
6635 }
6636
6637 # Generate 322 keyset key 233 value as 1/0 indicating its presence/absence or
6638 # count of its presence in a molecule.
6639 #
6640 # Key 233 description: Cl#Si
6641 #
6642 sub _Generate322KeySetKey233 {
6643 my($This) = @_;
6644 my($BondSymbol) = '#';
6645
6646 return $This->_DetectBondKeys('Cl', 'Si', $BondSymbol);
6647 }
6648
6649 # Generate 322 keyset key 234 value as 1/0 indicating its presence/absence or
6650 # count of its presence in a molecule.
6651 #
6652 # Key 234 description: Cl#I
6653 #
6654 sub _Generate322KeySetKey234 {
6655 my($This) = @_;
6656 my($BondSymbol) = '#';
6657
6658 return $This->_DetectBondKeys('Cl', 'I', $BondSymbol);
6659 }
6660
6661 # Generate 322 keyset key 235 value as 1/0 indicating its presence/absence or
6662 # count of its presence in a molecule.
6663 #
6664 # Key 235 description: Cl#X
6665 #
6666 sub _Generate322KeySetKey235 {
6667 my($This) = @_;
6668 my($BondSymbol) = '#';
6669
6670 return $This->_DetectBondKeys('Cl', 'Z', $BondSymbol);
6671 }
6672
6673 # Generate 322 keyset key 236 value as 1/0 indicating its presence/absence or
6674 # count of its presence in a molecule.
6675 #
6676 # Key 236 description: P#P
6677 #
6678 sub _Generate322KeySetKey236 {
6679 my($This) = @_;
6680 my($BondSymbol) = '#';
6681
6682 return $This->_DetectBondKeys('P', 'P', $BondSymbol);
6683 }
6684
6685 # Generate 322 keyset key 237 value as 1/0 indicating its presence/absence or
6686 # count of its presence in a molecule.
6687 #
6688 # Key 237 description: P#F
6689 #
6690 sub _Generate322KeySetKey237 {
6691 my($This) = @_;
6692 my($BondSymbol) = '#';
6693
6694 return $This->_DetectBondKeys('P', 'F', $BondSymbol);
6695 }
6696
6697 # Generate 322 keyset key 238 value as 1/0 indicating its presence/absence or
6698 # count of its presence in a molecule.
6699 #
6700 # Key 238 description: P#Br
6701 #
6702 sub _Generate322KeySetKey238 {
6703 my($This) = @_;
6704 my($BondSymbol) = '#';
6705
6706 return $This->_DetectBondKeys('P', 'Br', $BondSymbol);
6707 }
6708
6709 # Generate 322 keyset key 239 value as 1/0 indicating its presence/absence or
6710 # count of its presence in a molecule.
6711 #
6712 # Key 239 description: P#Si
6713 #
6714 sub _Generate322KeySetKey239 {
6715 my($This) = @_;
6716 my($BondSymbol) = '#';
6717
6718 return $This->_DetectBondKeys('P', 'Si', $BondSymbol);
6719 }
6720
6721 # Generate 322 keyset key 240 value as 1/0 indicating its presence/absence or
6722 # count of its presence in a molecule.
6723 #
6724 # Key 240 description: P#I
6725 #
6726 sub _Generate322KeySetKey240 {
6727 my($This) = @_;
6728 my($BondSymbol) = '#';
6729
6730 return $This->_DetectBondKeys('P', 'I', $BondSymbol);
6731 }
6732
6733 # Generate 322 keyset key 241 value as 1/0 indicating its presence/absence or
6734 # count of its presence in a molecule.
6735 #
6736 # Key 241 description: P#X
6737 #
6738 sub _Generate322KeySetKey241 {
6739 my($This) = @_;
6740 my($BondSymbol) = '#';
6741
6742 return $This->_DetectBondKeys('P', 'Z', $BondSymbol);
6743 }
6744
6745 # Generate 322 keyset key 242 value as 1/0 indicating its presence/absence or
6746 # count of its presence in a molecule.
6747 #
6748 # Key 242 description: F#F
6749 #
6750 sub _Generate322KeySetKey242 {
6751 my($This) = @_;
6752 my($BondSymbol) = '#';
6753
6754 return $This->_DetectBondKeys('F', 'F', $BondSymbol);
6755 }
6756
6757 # Generate 322 keyset key 243 value as 1/0 indicating its presence/absence or
6758 # count of its presence in a molecule.
6759 #
6760 # Key 243 description: F#Br
6761 #
6762 sub _Generate322KeySetKey243 {
6763 my($This) = @_;
6764 my($BondSymbol) = '#';
6765
6766 return $This->_DetectBondKeys('F', 'Br', $BondSymbol);
6767 }
6768
6769 # Generate 322 keyset key 244 value as 1/0 indicating its presence/absence or
6770 # count of its presence in a molecule.
6771 #
6772 # Key 244 description: F#Si
6773 #
6774 sub _Generate322KeySetKey244 {
6775 my($This) = @_;
6776 my($BondSymbol) = '#';
6777
6778 return $This->_DetectBondKeys('F', 'Si', $BondSymbol);
6779 }
6780
6781 # Generate 322 keyset key 245 value as 1/0 indicating its presence/absence or
6782 # count of its presence in a molecule.
6783 #
6784 # Key 245 description: F#I
6785 #
6786 sub _Generate322KeySetKey245 {
6787 my($This) = @_;
6788 my($BondSymbol) = '#';
6789
6790 return $This->_DetectBondKeys('F', 'I', $BondSymbol);
6791 }
6792
6793 # Generate 322 keyset key 246 value as 1/0 indicating its presence/absence or
6794 # count of its presence in a molecule.
6795 #
6796 # Key 246 description: F#X
6797 #
6798 sub _Generate322KeySetKey246 {
6799 my($This) = @_;
6800 my($BondSymbol) = '#';
6801
6802 return $This->_DetectBondKeys('F', 'Z', $BondSymbol);
6803 }
6804
6805 # Generate 322 keyset key 247 value as 1/0 indicating its presence/absence or
6806 # count of its presence in a molecule.
6807 #
6808 # Key 247 description: Br#Br
6809 #
6810 sub _Generate322KeySetKey247 {
6811 my($This) = @_;
6812 my($BondSymbol) = '#';
6813
6814 return $This->_DetectBondKeys('Br', 'Br', $BondSymbol);
6815 }
6816
6817 # Generate 322 keyset key 248 value as 1/0 indicating its presence/absence or
6818 # count of its presence in a molecule.
6819 #
6820 # Key 248 description: Br#Si
6821 #
6822 sub _Generate322KeySetKey248 {
6823 my($This) = @_;
6824 my($BondSymbol) = '#';
6825
6826 return $This->_DetectBondKeys('Br', 'Si', $BondSymbol);
6827 }
6828
6829 # Generate 322 keyset key 249 value as 1/0 indicating its presence/absence or
6830 # count of its presence in a molecule.
6831 #
6832 # Key 249 description: Br#I
6833 #
6834 sub _Generate322KeySetKey249 {
6835 my($This) = @_;
6836 my($BondSymbol) = '#';
6837
6838 return $This->_DetectBondKeys('Br', 'I', $BondSymbol);
6839 }
6840
6841 # Generate 322 keyset key 250 value as 1/0 indicating its presence/absence or
6842 # count of its presence in a molecule.
6843 #
6844 # Key 250 description: Br#X
6845 #
6846 sub _Generate322KeySetKey250 {
6847 my($This) = @_;
6848 my($BondSymbol) = '#';
6849
6850 return $This->_DetectBondKeys('Br', 'Z', $BondSymbol);
6851 }
6852
6853 # Generate 322 keyset key 251 value as 1/0 indicating its presence/absence or
6854 # count of its presence in a molecule.
6855 #
6856 # Key 251 description: Si#Si
6857 #
6858 sub _Generate322KeySetKey251 {
6859 my($This) = @_;
6860 my($BondSymbol) = '#';
6861
6862 return $This->_DetectBondKeys('Si', 'Si', $BondSymbol);
6863 }
6864
6865 # Generate 322 keyset key 252 value as 1/0 indicating its presence/absence or
6866 # count of its presence in a molecule.
6867 #
6868 # Key 252 description: Si#I
6869 #
6870 sub _Generate322KeySetKey252 {
6871 my($This) = @_;
6872 my($BondSymbol) = '#';
6873
6874 return $This->_DetectBondKeys('Si', 'I', $BondSymbol);
6875 }
6876
6877 # Generate 322 keyset key 253 value as 1/0 indicating its presence/absence or
6878 # count of its presence in a molecule.
6879 #
6880 # Key 253 description: Si#X
6881 #
6882 sub _Generate322KeySetKey253 {
6883 my($This) = @_;
6884 my($BondSymbol) = '#';
6885
6886 return $This->_DetectBondKeys('Si', 'Z', $BondSymbol);
6887 }
6888
6889 # Generate 322 keyset key 254 value as 1/0 indicating its presence/absence or
6890 # count of its presence in a molecule.
6891 #
6892 # Key 254 description: I#I
6893 #
6894 sub _Generate322KeySetKey254 {
6895 my($This) = @_;
6896 my($BondSymbol) = '#';
6897
6898 return $This->_DetectBondKeys('I', 'I', $BondSymbol);
6899 }
6900
6901 # Generate 322 keyset key 255 value as 1/0 indicating its presence/absence or
6902 # count of its presence in a molecule.
6903 #
6904 # Key 255 description: I#X
6905 #
6906 sub _Generate322KeySetKey255 {
6907 my($This) = @_;
6908 my($BondSymbol) = '#';
6909
6910 return $This->_DetectBondKeys('I', 'Z', $BondSymbol);
6911 }
6912
6913 # Generate 322 keyset key 256 value as 1/0 indicating its presence/absence or
6914 # count of its presence in a molecule.
6915 #
6916 # Key 256 description: X#X
6917 #
6918 sub _Generate322KeySetKey256 {
6919 my($This) = @_;
6920 my($BondSymbol) = '#';
6921
6922 return $This->_DetectBondKeys('Z', 'Z', $BondSymbol);
6923 }
6924
6925 # Generate 322 keyset key 257 value as 1/0 indicating its presence/absence or
6926 # count of its presence in a molecule.
6927 #
6928 # Key 257 description: C$C
6929 #
6930 sub _Generate322KeySetKey257 {
6931 my($This) = @_;
6932 my($BondSymbol) = '$';
6933
6934 return $This->_DetectBondKeys('C', 'C', $BondSymbol);
6935 }
6936
6937 # Generate 322 keyset key 258 value as 1/0 indicating its presence/absence or
6938 # count of its presence in a molecule.
6939 #
6940 # Key 258 description: C$N
6941 #
6942 sub _Generate322KeySetKey258 {
6943 my($This) = @_;
6944 my($BondSymbol) = '$';
6945
6946 return $This->_DetectBondKeys('C', 'N', $BondSymbol);
6947 }
6948
6949 # Generate 322 keyset key 259 value as 1/0 indicating its presence/absence or
6950 # count of its presence in a molecule.
6951 #
6952 # Key 259 description: C$O
6953 #
6954 sub _Generate322KeySetKey259 {
6955 my($This) = @_;
6956 my($BondSymbol) = '$';
6957
6958 return $This->_DetectBondKeys('C', 'O', $BondSymbol);
6959 }
6960
6961 # Generate 322 keyset key 260 value as 1/0 indicating its presence/absence or
6962 # count of its presence in a molecule.
6963 #
6964 # Key 260 description: C$S
6965 #
6966 sub _Generate322KeySetKey260 {
6967 my($This) = @_;
6968 my($BondSymbol) = '$';
6969
6970 return $This->_DetectBondKeys('C', 'S', $BondSymbol);
6971 }
6972
6973 # Generate 322 keyset key 261 value as 1/0 indicating its presence/absence or
6974 # count of its presence in a molecule.
6975 #
6976 # Key 261 description: C$Cl
6977 #
6978 sub _Generate322KeySetKey261 {
6979 my($This) = @_;
6980 my($BondSymbol) = '$';
6981
6982 return $This->_DetectBondKeys('C', 'Cl', $BondSymbol);
6983 }
6984
6985 # Generate 322 keyset key 262 value as 1/0 indicating its presence/absence or
6986 # count of its presence in a molecule.
6987 #
6988 # Key 262 description: C$P
6989 #
6990 sub _Generate322KeySetKey262 {
6991 my($This) = @_;
6992 my($BondSymbol) = '$';
6993
6994 return $This->_DetectBondKeys('C', 'P', $BondSymbol);
6995 }
6996
6997 # Generate 322 keyset key 263 value as 1/0 indicating its presence/absence or
6998 # count of its presence in a molecule.
6999 #
7000 # Key 263 description: C$F
7001 #
7002 sub _Generate322KeySetKey263 {
7003 my($This) = @_;
7004 my($BondSymbol) = '$';
7005
7006 return $This->_DetectBondKeys('C', 'F', $BondSymbol);
7007 }
7008
7009 # Generate 322 keyset key 264 value as 1/0 indicating its presence/absence or
7010 # count of its presence in a molecule.
7011 #
7012 # Key 264 description: C$Br
7013 #
7014 sub _Generate322KeySetKey264 {
7015 my($This) = @_;
7016 my($BondSymbol) = '$';
7017
7018 return $This->_DetectBondKeys('C', 'Br', $BondSymbol);
7019 }
7020
7021 # Generate 322 keyset key 265 value as 1/0 indicating its presence/absence or
7022 # count of its presence in a molecule.
7023 #
7024 # Key 265 description: C$Si
7025 #
7026 sub _Generate322KeySetKey265 {
7027 my($This) = @_;
7028 my($BondSymbol) = '$';
7029
7030 return $This->_DetectBondKeys('C', 'Si', $BondSymbol);
7031 }
7032
7033 # Generate 322 keyset key 266 value as 1/0 indicating its presence/absence or
7034 # count of its presence in a molecule.
7035 #
7036 # Key 266 description: C$I
7037 #
7038 sub _Generate322KeySetKey266 {
7039 my($This) = @_;
7040 my($BondSymbol) = '$';
7041
7042 return $This->_DetectBondKeys('C', 'I', $BondSymbol);
7043 }
7044
7045 # Generate 322 keyset key 267 value as 1/0 indicating its presence/absence or
7046 # count of its presence in a molecule.
7047 #
7048 # Key 267 description: C$X
7049 #
7050 sub _Generate322KeySetKey267 {
7051 my($This) = @_;
7052 my($BondSymbol) = '$';
7053
7054 return $This->_DetectBondKeys('C', 'Z', $BondSymbol);
7055 }
7056
7057 # Generate 322 keyset key 268 value as 1/0 indicating its presence/absence or
7058 # count of its presence in a molecule.
7059 #
7060 # Key 268 description: N$N
7061 #
7062 sub _Generate322KeySetKey268 {
7063 my($This) = @_;
7064 my($BondSymbol) = '$';
7065
7066 return $This->_DetectBondKeys('N', 'N', $BondSymbol);
7067 }
7068
7069 # Generate 322 keyset key 269 value as 1/0 indicating its presence/absence or
7070 # count of its presence in a molecule.
7071 #
7072 # Key 269 description: N$O
7073 #
7074 sub _Generate322KeySetKey269 {
7075 my($This) = @_;
7076 my($BondSymbol) = '$';
7077
7078 return $This->_DetectBondKeys('N', 'O', $BondSymbol);
7079 }
7080
7081 # Generate 322 keyset key 270 value as 1/0 indicating its presence/absence or
7082 # count of its presence in a molecule.
7083 #
7084 # Key 270 description: N$S
7085 #
7086 sub _Generate322KeySetKey270 {
7087 my($This) = @_;
7088 my($BondSymbol) = '$';
7089
7090 return $This->_DetectBondKeys('N', 'S', $BondSymbol);
7091 }
7092
7093 # Generate 322 keyset key 271 value as 1/0 indicating its presence/absence or
7094 # count of its presence in a molecule.
7095 #
7096 # Key 271 description: N$Cl
7097 #
7098 sub _Generate322KeySetKey271 {
7099 my($This) = @_;
7100 my($BondSymbol) = '$';
7101
7102 return $This->_DetectBondKeys('N', 'Cl', $BondSymbol);
7103 }
7104
7105 # Generate 322 keyset key 272 value as 1/0 indicating its presence/absence or
7106 # count of its presence in a molecule.
7107 #
7108 # Key 272 description: N$P
7109 #
7110 sub _Generate322KeySetKey272 {
7111 my($This) = @_;
7112 my($BondSymbol) = '$';
7113
7114 return $This->_DetectBondKeys('N', 'P', $BondSymbol);
7115 }
7116
7117 # Generate 322 keyset key 273 value as 1/0 indicating its presence/absence or
7118 # count of its presence in a molecule.
7119 #
7120 # Key 273 description: N$F
7121 #
7122 sub _Generate322KeySetKey273 {
7123 my($This) = @_;
7124 my($BondSymbol) = '$';
7125
7126 return $This->_DetectBondKeys('N', 'F', $BondSymbol);
7127 }
7128
7129 # Generate 322 keyset key 274 value as 1/0 indicating its presence/absence or
7130 # count of its presence in a molecule.
7131 #
7132 # Key 274 description: N$Br
7133 #
7134 sub _Generate322KeySetKey274 {
7135 my($This) = @_;
7136 my($BondSymbol) = '$';
7137
7138 return $This->_DetectBondKeys('N', 'Br', $BondSymbol);
7139 }
7140
7141 # Generate 322 keyset key 275 value as 1/0 indicating its presence/absence or
7142 # count of its presence in a molecule.
7143 #
7144 # Key 275 description: N$Si
7145 #
7146 sub _Generate322KeySetKey275 {
7147 my($This) = @_;
7148 my($BondSymbol) = '$';
7149
7150 return $This->_DetectBondKeys('N', 'Si', $BondSymbol);
7151 }
7152
7153 # Generate 322 keyset key 276 value as 1/0 indicating its presence/absence or
7154 # count of its presence in a molecule.
7155 #
7156 # Key 276 description: N$I
7157 #
7158 sub _Generate322KeySetKey276 {
7159 my($This) = @_;
7160 my($BondSymbol) = '$';
7161
7162 return $This->_DetectBondKeys('N', 'I', $BondSymbol);
7163 }
7164
7165 # Generate 322 keyset key 277 value as 1/0 indicating its presence/absence or
7166 # count of its presence in a molecule.
7167 #
7168 # Key 277 description: N$X
7169 #
7170 sub _Generate322KeySetKey277 {
7171 my($This) = @_;
7172 my($BondSymbol) = '$';
7173
7174 return $This->_DetectBondKeys('N', 'Z', $BondSymbol);
7175 }
7176
7177 # Generate 322 keyset key 278 value as 1/0 indicating its presence/absence or
7178 # count of its presence in a molecule.
7179 #
7180 # Key 278 description: O$O
7181 #
7182 sub _Generate322KeySetKey278 {
7183 my($This) = @_;
7184 my($BondSymbol) = '$';
7185
7186 return $This->_DetectBondKeys('O', 'O', $BondSymbol);
7187 }
7188
7189 # Generate 322 keyset key 279 value as 1/0 indicating its presence/absence or
7190 # count of its presence in a molecule.
7191 #
7192 # Key 279 description: O$S
7193 #
7194 sub _Generate322KeySetKey279 {
7195 my($This) = @_;
7196 my($BondSymbol) = '$';
7197
7198 return $This->_DetectBondKeys('O', 'S', $BondSymbol);
7199 }
7200
7201 # Generate 322 keyset key 280 value as 1/0 indicating its presence/absence or
7202 # count of its presence in a molecule.
7203 #
7204 # Key 280 description: O$Cl
7205 #
7206 sub _Generate322KeySetKey280 {
7207 my($This) = @_;
7208 my($BondSymbol) = '$';
7209
7210 return $This->_DetectBondKeys('O', 'Cl', $BondSymbol);
7211 }
7212
7213 # Generate 322 keyset key 281 value as 1/0 indicating its presence/absence or
7214 # count of its presence in a molecule.
7215 #
7216 # Key 281 description: O$P
7217 #
7218 sub _Generate322KeySetKey281 {
7219 my($This) = @_;
7220 my($BondSymbol) = '$';
7221
7222 return $This->_DetectBondKeys('O', 'P', $BondSymbol);
7223 }
7224
7225 # Generate 322 keyset key 282 value as 1/0 indicating its presence/absence or
7226 # count of its presence in a molecule.
7227 #
7228 # Key 282 description: O$F
7229 #
7230 sub _Generate322KeySetKey282 {
7231 my($This) = @_;
7232 my($BondSymbol) = '$';
7233
7234 return $This->_DetectBondKeys('O', 'F', $BondSymbol);
7235 }
7236
7237 # Generate 322 keyset key 283 value as 1/0 indicating its presence/absence or
7238 # count of its presence in a molecule.
7239 #
7240 # Key 283 description: O$Br
7241 #
7242 sub _Generate322KeySetKey283 {
7243 my($This) = @_;
7244 my($BondSymbol) = '$';
7245
7246 return $This->_DetectBondKeys('O', 'Br', $BondSymbol);
7247 }
7248
7249 # Generate 322 keyset key 284 value as 1/0 indicating its presence/absence or
7250 # count of its presence in a molecule.
7251 #
7252 # Key 284 description: O$Si
7253 #
7254 sub _Generate322KeySetKey284 {
7255 my($This) = @_;
7256 my($BondSymbol) = '$';
7257
7258 return $This->_DetectBondKeys('O', 'Si', $BondSymbol);
7259 }
7260
7261 # Generate 322 keyset key 285 value as 1/0 indicating its presence/absence or
7262 # count of its presence in a molecule.
7263 #
7264 # Key 285 description: O$I
7265 #
7266 sub _Generate322KeySetKey285 {
7267 my($This) = @_;
7268 my($BondSymbol) = '$';
7269
7270 return $This->_DetectBondKeys('O', 'I', $BondSymbol);
7271 }
7272
7273 # Generate 322 keyset key 286 value as 1/0 indicating its presence/absence or
7274 # count of its presence in a molecule.
7275 #
7276 # Key 286 description: O$X
7277 #
7278 sub _Generate322KeySetKey286 {
7279 my($This) = @_;
7280 my($BondSymbol) = '$';
7281
7282 return $This->_DetectBondKeys('O', 'Z', $BondSymbol);
7283 }
7284
7285 # Generate 322 keyset key 287 value as 1/0 indicating its presence/absence or
7286 # count of its presence in a molecule.
7287 #
7288 # Key 287 description: S$S
7289 #
7290 sub _Generate322KeySetKey287 {
7291 my($This) = @_;
7292 my($BondSymbol) = '$';
7293
7294 return $This->_DetectBondKeys('S', 'S', $BondSymbol);
7295 }
7296
7297 # Generate 322 keyset key 288 value as 1/0 indicating its presence/absence or
7298 # count of its presence in a molecule.
7299 #
7300 # Key 288 description: S$Cl
7301 #
7302 sub _Generate322KeySetKey288 {
7303 my($This) = @_;
7304 my($BondSymbol) = '$';
7305
7306 return $This->_DetectBondKeys('S', 'Cl', $BondSymbol);
7307 }
7308
7309 # Generate 322 keyset key 289 value as 1/0 indicating its presence/absence or
7310 # count of its presence in a molecule.
7311 #
7312 # Key 289 description: S$P
7313 #
7314 sub _Generate322KeySetKey289 {
7315 my($This) = @_;
7316 my($BondSymbol) = '$';
7317
7318 return $This->_DetectBondKeys('S', 'P', $BondSymbol);
7319 }
7320
7321 # Generate 322 keyset key 290 value as 1/0 indicating its presence/absence or
7322 # count of its presence in a molecule.
7323 #
7324 # Key 290 description: S$F
7325 #
7326 sub _Generate322KeySetKey290 {
7327 my($This) = @_;
7328 my($BondSymbol) = '$';
7329
7330 return $This->_DetectBondKeys('S', 'F', $BondSymbol);
7331 }
7332
7333 # Generate 322 keyset key 291 value as 1/0 indicating its presence/absence or
7334 # count of its presence in a molecule.
7335 #
7336 # Key 291 description: S$Br
7337 #
7338 sub _Generate322KeySetKey291 {
7339 my($This) = @_;
7340 my($BondSymbol) = '$';
7341
7342 return $This->_DetectBondKeys('S', 'Br', $BondSymbol);
7343 }
7344
7345 # Generate 322 keyset key 292 value as 1/0 indicating its presence/absence or
7346 # count of its presence in a molecule.
7347 #
7348 # Key 292 description: S$Si
7349 #
7350 sub _Generate322KeySetKey292 {
7351 my($This) = @_;
7352 my($BondSymbol) = '$';
7353
7354 return $This->_DetectBondKeys('S', 'Si', $BondSymbol);
7355 }
7356
7357 # Generate 322 keyset key 293 value as 1/0 indicating its presence/absence or
7358 # count of its presence in a molecule.
7359 #
7360 # Key 293 description: S$I
7361 #
7362 sub _Generate322KeySetKey293 {
7363 my($This) = @_;
7364 my($BondSymbol) = '$';
7365
7366 return $This->_DetectBondKeys('S', 'I', $BondSymbol);
7367 }
7368
7369 # Generate 322 keyset key 294 value as 1/0 indicating its presence/absence or
7370 # count of its presence in a molecule.
7371 #
7372 # Key 294 description: S$X
7373 #
7374 sub _Generate322KeySetKey294 {
7375 my($This) = @_;
7376 my($BondSymbol) = '$';
7377
7378 return $This->_DetectBondKeys('S', 'Z', $BondSymbol);
7379 }
7380
7381 # Generate 322 keyset key 295 value as 1/0 indicating its presence/absence or
7382 # count of its presence in a molecule.
7383 #
7384 # Key 295 description: Cl$Cl
7385 #
7386 sub _Generate322KeySetKey295 {
7387 my($This) = @_;
7388 my($BondSymbol) = '$';
7389
7390 return $This->_DetectBondKeys('Cl', 'Cl', $BondSymbol);
7391 }
7392
7393 # Generate 322 keyset key 296 value as 1/0 indicating its presence/absence or
7394 # count of its presence in a molecule.
7395 #
7396 # Key 296 description: Cl$P
7397 #
7398 sub _Generate322KeySetKey296 {
7399 my($This) = @_;
7400 my($BondSymbol) = '$';
7401
7402 return $This->_DetectBondKeys('Cl', 'P', $BondSymbol);
7403 }
7404
7405 # Generate 322 keyset key 297 value as 1/0 indicating its presence/absence or
7406 # count of its presence in a molecule.
7407 #
7408 # Key 297 description: Cl$F
7409 #
7410 sub _Generate322KeySetKey297 {
7411 my($This) = @_;
7412 my($BondSymbol) = '$';
7413
7414 return $This->_DetectBondKeys('Cl', 'F', $BondSymbol);
7415 }
7416
7417 # Generate 322 keyset key 298 value as 1/0 indicating its presence/absence or
7418 # count of its presence in a molecule.
7419 #
7420 # Key 298 description: Cl$Br
7421 #
7422 sub _Generate322KeySetKey298 {
7423 my($This) = @_;
7424 my($BondSymbol) = '$';
7425
7426 return $This->_DetectBondKeys('Cl', 'Br', $BondSymbol);
7427 }
7428
7429 # Generate 322 keyset key 299 value as 1/0 indicating its presence/absence or
7430 # count of its presence in a molecule.
7431 #
7432 # Key 299 description: Cl$Si
7433 #
7434 sub _Generate322KeySetKey299 {
7435 my($This) = @_;
7436 my($BondSymbol) = '$';
7437
7438 return $This->_DetectBondKeys('Cl', 'Si', $BondSymbol);
7439 }
7440
7441 # Generate 322 keyset key 300 value as 1/0 indicating its presence/absence or
7442 # count of its presence in a molecule.
7443 #
7444 # Key 300 description: Cl$I
7445 #
7446 sub _Generate322KeySetKey300 {
7447 my($This) = @_;
7448 my($BondSymbol) = '$';
7449
7450 return $This->_DetectBondKeys('Cl', 'I', $BondSymbol);
7451 }
7452
7453 # Generate 322 keyset key 301 value as 1/0 indicating its presence/absence or
7454 # count of its presence in a molecule.
7455 #
7456 # Key 301 description: Cl$X
7457 #
7458 sub _Generate322KeySetKey301 {
7459 my($This) = @_;
7460 my($BondSymbol) = '$';
7461
7462 return $This->_DetectBondKeys('Cl', 'Z', $BondSymbol);
7463 }
7464
7465 # Generate 322 keyset key 302 value as 1/0 indicating its presence/absence or
7466 # count of its presence in a molecule.
7467 #
7468 # Key 302 description: P$P
7469 #
7470 sub _Generate322KeySetKey302 {
7471 my($This) = @_;
7472 my($BondSymbol) = '$';
7473
7474 return $This->_DetectBondKeys('P', 'P', $BondSymbol);
7475 }
7476
7477 # Generate 322 keyset key 303 value as 1/0 indicating its presence/absence or
7478 # count of its presence in a molecule.
7479 #
7480 # Key 303 description: P$F
7481 #
7482 sub _Generate322KeySetKey303 {
7483 my($This) = @_;
7484 my($BondSymbol) = '$';
7485
7486 return $This->_DetectBondKeys('P', 'F', $BondSymbol);
7487 }
7488
7489 # Generate 322 keyset key 304 value as 1/0 indicating its presence/absence or
7490 # count of its presence in a molecule.
7491 #
7492 # Key 304 description: P$Br
7493 #
7494 sub _Generate322KeySetKey304 {
7495 my($This) = @_;
7496 my($BondSymbol) = '$';
7497
7498 return $This->_DetectBondKeys('P', 'Br', $BondSymbol);
7499 }
7500
7501 # Generate 322 keyset key 305 value as 1/0 indicating its presence/absence or
7502 # count of its presence in a molecule.
7503 #
7504 # Key 305 description: P$Si
7505 #
7506 sub _Generate322KeySetKey305 {
7507 my($This) = @_;
7508 my($BondSymbol) = '$';
7509
7510 return $This->_DetectBondKeys('P', 'Si', $BondSymbol);
7511 }
7512
7513 # Generate 322 keyset key 306 value as 1/0 indicating its presence/absence or
7514 # count of its presence in a molecule.
7515 #
7516 # Key 306 description: P$I
7517 #
7518 sub _Generate322KeySetKey306 {
7519 my($This) = @_;
7520 my($BondSymbol) = '$';
7521
7522 return $This->_DetectBondKeys('P', 'I', $BondSymbol);
7523 }
7524
7525 # Generate 322 keyset key 307 value as 1/0 indicating its presence/absence or
7526 # count of its presence in a molecule.
7527 #
7528 # Key 307 description: P$X
7529 #
7530 sub _Generate322KeySetKey307 {
7531 my($This) = @_;
7532 my($BondSymbol) = '$';
7533
7534 return $This->_DetectBondKeys('P', 'Z', $BondSymbol);
7535 }
7536
7537 # Generate 322 keyset key 308 value as 1/0 indicating its presence/absence or
7538 # count of its presence in a molecule.
7539 #
7540 # Key 308 description: F$F
7541 #
7542 sub _Generate322KeySetKey308 {
7543 my($This) = @_;
7544 my($BondSymbol) = '$';
7545
7546 return $This->_DetectBondKeys('F', 'F', $BondSymbol);
7547 }
7548
7549 # Generate 322 keyset key 309 value as 1/0 indicating its presence/absence or
7550 # count of its presence in a molecule.
7551 #
7552 # Key 309 description: F$Br
7553 #
7554 sub _Generate322KeySetKey309 {
7555 my($This) = @_;
7556 my($BondSymbol) = '$';
7557
7558 return $This->_DetectBondKeys('F', 'Br', $BondSymbol);
7559 }
7560
7561 # Generate 322 keyset key 310 value as 1/0 indicating its presence/absence or
7562 # count of its presence in a molecule.
7563 #
7564 # Key 310 description: F$Si
7565 #
7566 sub _Generate322KeySetKey310 {
7567 my($This) = @_;
7568 my($BondSymbol) = '$';
7569
7570 return $This->_DetectBondKeys('F', 'Si', $BondSymbol);
7571 }
7572
7573 # Generate 322 keyset key 311 value as 1/0 indicating its presence/absence or
7574 # count of its presence in a molecule.
7575 #
7576 # Key 311 description: F$I
7577 #
7578 sub _Generate322KeySetKey311 {
7579 my($This) = @_;
7580 my($BondSymbol) = '$';
7581
7582 return $This->_DetectBondKeys('F', 'I', $BondSymbol);
7583 }
7584
7585 # Generate 322 keyset key 312 value as 1/0 indicating its presence/absence or
7586 # count of its presence in a molecule.
7587 #
7588 # Key 312 description: F$X
7589 #
7590 sub _Generate322KeySetKey312 {
7591 my($This) = @_;
7592 my($BondSymbol) = '$';
7593
7594 return $This->_DetectBondKeys('F', 'Z', $BondSymbol);
7595 }
7596
7597 # Generate 322 keyset key 313 value as 1/0 indicating its presence/absence or
7598 # count of its presence in a molecule.
7599 #
7600 # Key 313 description: Br$Br
7601 #
7602 sub _Generate322KeySetKey313 {
7603 my($This) = @_;
7604 my($BondSymbol) = '$';
7605
7606 return $This->_DetectBondKeys('Br', 'Br', $BondSymbol);
7607 }
7608
7609 # Generate 322 keyset key 314 value as 1/0 indicating its presence/absence or
7610 # count of its presence in a molecule.
7611 #
7612 # Key 314 description: Br$Si
7613 #
7614 sub _Generate322KeySetKey314 {
7615 my($This) = @_;
7616 my($BondSymbol) = '$';
7617
7618 return $This->_DetectBondKeys('Br', 'Si', $BondSymbol);
7619 }
7620
7621 # Generate 322 keyset key 315 value as 1/0 indicating its presence/absence or
7622 # count of its presence in a molecule.
7623 #
7624 # Key 315 description: Br$I
7625 #
7626 sub _Generate322KeySetKey315 {
7627 my($This) = @_;
7628 my($BondSymbol) = '$';
7629
7630 return $This->_DetectBondKeys('Br', 'I', $BondSymbol);
7631 }
7632
7633 # Generate 322 keyset key 316 value as 1/0 indicating its presence/absence or
7634 # count of its presence in a molecule.
7635 #
7636 # Key 316 description: Br$X
7637 #
7638 sub _Generate322KeySetKey316 {
7639 my($This) = @_;
7640 my($BondSymbol) = '$';
7641
7642 return $This->_DetectBondKeys('Br', 'Z', $BondSymbol);
7643 }
7644
7645 # Generate 322 keyset key 317 value as 1/0 indicating its presence/absence or
7646 # count of its presence in a molecule.
7647 #
7648 # Key 317 description: Si$Si
7649 #
7650 sub _Generate322KeySetKey317 {
7651 my($This) = @_;
7652 my($BondSymbol) = '$';
7653
7654 return $This->_DetectBondKeys('Si', 'Si', $BondSymbol);
7655 }
7656
7657 # Generate 322 keyset key 318 value as 1/0 indicating its presence/absence or
7658 # count of its presence in a molecule.
7659 #
7660 # Key 318 description: Si$I
7661 #
7662 sub _Generate322KeySetKey318 {
7663 my($This) = @_;
7664 my($BondSymbol) = '$';
7665
7666 return $This->_DetectBondKeys('Si', 'I', $BondSymbol);
7667 }
7668
7669 # Generate 322 keyset key 319 value as 1/0 indicating its presence/absence or
7670 # count of its presence in a molecule.
7671 #
7672 # Key 319 description: Si$X
7673 #
7674 sub _Generate322KeySetKey319 {
7675 my($This) = @_;
7676 my($BondSymbol) = '$';
7677
7678 return $This->_DetectBondKeys('Si', 'Z', $BondSymbol);
7679 }
7680
7681 # Generate 322 keyset key 320 value as 1/0 indicating its presence/absence or
7682 # count of its presence in a molecule.
7683 #
7684 # Key 320 description: I$I
7685 #
7686 sub _Generate322KeySetKey320 {
7687 my($This) = @_;
7688 my($BondSymbol) = '$';
7689
7690 return $This->_DetectBondKeys('I', 'I', $BondSymbol);
7691 }
7692
7693 # Generate 322 keyset key 321 value as 1/0 indicating its presence/absence or
7694 # count of its presence in a molecule.
7695 #
7696 # Key 321 description: I$X
7697 #
7698 sub _Generate322KeySetKey321 {
7699 my($This) = @_;
7700 my($BondSymbol) = '$';
7701
7702 return $This->_DetectBondKeys('I', 'Z', $BondSymbol);
7703 }
7704
7705 # Generate 322 keyset key 322 value as 1/0 indicating its presence/absence or
7706 # count of its presence in a molecule.
7707 #
7708 # Key 322 description: X$X
7709 #
7710 sub _Generate322KeySetKey322 {
7711 my($This) = @_;
7712 my($BondSymbol) = '$';
7713
7714 return $This->_DetectBondKeys('Z', 'Z', $BondSymbol);
7715 }
7716
7717 # A : Any valid perodic table elemnet symbol
7718 sub _IsAtom {
7719 my($This, $Atom) = @_;
7720
7721 return $Atom->GetAtomicNumber() ? 1 : 0;
7722 }
7723
7724 # Q : Hetro atoms; any non-C or non-H atom
7725 sub _IsHeteroAtom {
7726 my($This, $Atom) = @_;
7727
7728 return ($Atom->GetAtomicNumber() =~ /^(1|6)$/) ? 0 : 1;
7729 }
7730
7731 # X : Halogens; F, Cl, Br, I
7732 sub _IsHalogenAtom {
7733 my($This, $Atom) = @_;
7734
7735 return ($Atom->GetAtomicNumber() =~ /^(9|17|35|53)$/) ? 1 : 0;
7736 }
7737
7738 # Z : Others; other than H, C, N, O, Si, P, S, F, Cl, Br, I
7739 sub _IsOtherAtom {
7740 my($This, $Atom) = @_;
7741
7742 return ($Atom->GetAtomicNumber() =~ /^(1|6|7|8|9|14|15|16|17|35|53)$/) ? 0 : 1;
7743 }
7744
7745 # Detect atom keys like Cl, Br and so on...
7746 #
7747 sub _DetectAtomKeys {
7748 my($This, $AtomSymbol, $MinKeyCount, $IsInRing, $MinHydrogenCount) = @_;
7749 my($Atom, $KeyValue);
7750
7751 $KeyValue = 0;
7752 ATOM: for $Atom (@{$This->{Atoms}}) {
7753 if (!$This->_DoesAtomMatchesSymbol($Atom, $AtomSymbol)) {
7754 next ATOM;
7755 }
7756 if (defined($IsInRing) && $IsInRing && !$Atom->IsInRing()) {
7757 next ATOM;
7758 }
7759 if (defined $MinHydrogenCount) {
7760 if (!$This->_DoesAtomMinHydrogenCountMatch($Atom, $MinHydrogenCount)) {
7761 next ATOM;
7762 }
7763 }
7764 $KeyValue++;
7765 if (defined($MinKeyCount) && $KeyValue < $MinKeyCount) {
7766 next ATOM;
7767 }
7768 if ($This->{KeyBits}) {
7769 $KeyValue = 1;
7770 last ATOM;
7771 }
7772 }
7773 return $KeyValue;
7774 }
7775
7776 # Detect bond keys like S-S, N-O and so on...
7777 #
7778 sub _DetectBondKeys {
7779 my($This, $AtomSymbol1, $AtomSymbol2, $BondSymbol, $MinKeyCount, $Atom1MinHydrogenCount, $Atom2MinHydrogenCount) = @_;
7780 my($Atom1, $Atom2, $Bond, $KeyValue, $MatchSpecifiedAtomOrder);
7781
7782 $MatchSpecifiedAtomOrder = 0;
7783
7784 $KeyValue = 0;
7785 BOND: for $Bond (@{$This->{Bonds}}) {
7786 ($Atom1, $Atom2) = $Bond->GetAtoms();
7787 if (!$This->_DoBondAtomsMatchBondSymbols($Atom1, $Atom2, $AtomSymbol1, $AtomSymbol2, $BondSymbol, $MatchSpecifiedAtomOrder, $Atom1MinHydrogenCount, $Atom2MinHydrogenCount)) {
7788 next BOND;
7789 }
7790 $KeyValue++;
7791 if (defined($MinKeyCount) && $KeyValue < $MinKeyCount) {
7792 next BOND;
7793 }
7794 if ($This->{KeyBits}) {
7795 $KeyValue = 1;
7796 last BOND;
7797 }
7798 }
7799 return $KeyValue;
7800 }
7801
7802 # Detect atom neighborhood keys like ON(C)C, OC(O)O and so on.
7803 #
7804 sub _DetectAtomNeighborhoodKeys {
7805 my($This, $CentralAtomSymbol, $NbrAtomSymbolsRef, $NbrBondSymbolsRef, $MinKeyCount, $CentralAtomMinHydrogenCount, $NbrAtomMinHydrogenCountRef) = @_;
7806 my($KeyValue, $CentralAtom);
7807
7808 $KeyValue = 0;
7809
7810 CENTRALATOM: for $CentralAtom (@{$This->{Atoms}}) {
7811 if (!$This->_DoesAtomNeighborhoodMatch($CentralAtom, $CentralAtomSymbol, $NbrAtomSymbolsRef, $NbrBondSymbolsRef, $CentralAtomMinHydrogenCount, $NbrAtomMinHydrogenCountRef)) {
7812 next CENTRALATOM;
7813 }
7814 $KeyValue++;
7815 if (defined($MinKeyCount) && $KeyValue < $MinKeyCount) {
7816 next CENTRALATOM;
7817 }
7818 if ($This->{KeyBits}) {
7819 $KeyValue = 1;
7820 last CENTRALATOM;
7821 }
7822 }
7823 return $KeyValue;
7824 }
7825
7826 # Detect bond neighborhood keys like A%Anot%A%A and so on.
7827 #
7828 sub _DetectBondNeighborhoodKeys {
7829 my($This, $BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, $NbrAtomSymbolsRef, $NbrBondSymbolsRef, $MinKeyCount, $BondAtomMinHydrogenCountRef, $NbrsMinHydrogenCountRef) = @_;
7830 my($BondAtomIndex, $BondAtom1, $BondAtom2, $MatchedBondAtom1, $MatchedBondAtom2, $BondAtom, $Bond, $KeyValue, $BondAtomSymbol, $MatchSpecifiedAtomOrder, $BondAtom1MinHydrogenCount, $BondAtom2MinHydrogenCount, $MinHydrogenCount, @NbrsToExcludeFromMatch, @NbrAtomSymbols, @NbrBondSymbols, @NbrMinHydrogenCount, );
7831
7832 $MatchSpecifiedAtomOrder = 1;
7833 ($BondAtom1MinHydrogenCount, $BondAtom2MinHydrogenCount) = defined($BondAtomMinHydrogenCountRef) ? ( @{$BondAtomMinHydrogenCountRef} ) : (undef, undef);
7834
7835 $KeyValue = 0;
7836 BOND: for $Bond (@{$This->{Bonds}}) {
7837 ($BondAtom1, $BondAtom2) = $Bond->GetAtoms();
7838
7839 # Match bond first...
7840 if ($This->_DoBondAtomsMatchBondSymbols($BondAtom1, $BondAtom2, $BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, $MatchSpecifiedAtomOrder, $BondAtom1MinHydrogenCount, $BondAtom2MinHydrogenCount)) {
7841 ($MatchedBondAtom1, $MatchedBondAtom2) = ($BondAtom1, $BondAtom2);
7842 }
7843 elsif ($This->_DoBondAtomsMatchBondSymbols($BondAtom2, $BondAtom1, $BondAtomSymbol1, $BondAtomSymbol2, $BondSymbol, $MatchSpecifiedAtomOrder, $BondAtom1MinHydrogenCount, $BondAtom2MinHydrogenCount)) {
7844 ($MatchedBondAtom1, $MatchedBondAtom2) = ($BondAtom2, $BondAtom1);
7845 }
7846 else {
7847 next BOND;
7848 }
7849 # Match neighbors of bonded atoms...
7850 for $BondAtomIndex (0 .. 1) {
7851 $MinHydrogenCount = undef;
7852 @NbrsToExcludeFromMatch = ();
7853
7854 if ($BondAtomIndex == 0) {
7855 $BondAtom = $MatchedBondAtom1;
7856 $BondAtomSymbol = $BondAtomSymbol1;
7857 push @NbrsToExcludeFromMatch, $MatchedBondAtom2;
7858 }
7859 elsif ($BondAtomIndex == 1) {
7860 $BondAtom = $MatchedBondAtom2;
7861 $BondAtomSymbol = $BondAtomSymbol2;
7862 push @NbrsToExcludeFromMatch, $MatchedBondAtom1;
7863 }
7864
7865 @NbrAtomSymbols = (defined($NbrAtomSymbolsRef) && defined($NbrAtomSymbolsRef->[$BondAtomIndex])) ? @{$NbrAtomSymbolsRef->[$BondAtomIndex]} : ();
7866 @NbrBondSymbols = (defined($NbrBondSymbolsRef) && defined($NbrBondSymbolsRef->[$BondAtomIndex]) ) ? @{$NbrBondSymbolsRef->[$BondAtomIndex]} : ();
7867 @NbrMinHydrogenCount = (defined($NbrsMinHydrogenCountRef) && defined($NbrsMinHydrogenCountRef->[$BondAtomIndex]) ) ? @{$NbrsMinHydrogenCountRef->[$BondAtomIndex]} : ();
7868 if (!$This->_DoesAtomNeighborhoodMatch($BondAtom, $BondAtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinHydrogenCount, \@NbrMinHydrogenCount, \@NbrsToExcludeFromMatch)) {
7869 next BOND;
7870 }
7871 }
7872 $KeyValue++;
7873 if (defined($MinKeyCount) && $KeyValue < $MinKeyCount) {
7874 next BOND;
7875 }
7876 if ($This->{KeyBits}) {
7877 $KeyValue = 1;
7878 last BOND;
7879 }
7880 }
7881 return $KeyValue;
7882 }
7883
7884 # Detect extended atom neighborhood keys like QHAQH, QHAAQH, and so on...
7885 #
7886 sub _DetectExtendedAtomNeighborhoodKeys {
7887 my($This, $CentralAtomsSymbolsRef, $CentralAtomsBondSymbolsRef, $CentralAtomsMinHydrogenCountRef, $MinKeyCount, $NbrAtomSymbolsRef, $NbrBondSymbolsRef, $NbrsMinHydrogenCountRef) = @_;
7888 my($KeyValue, $Molecule, $FirstCentralAtomIndex, $LastCentralAtomIndex, $NumOfCentralAtoms);
7889
7890 $KeyValue = 0;
7891
7892 $Molecule = $This->GetMolecule();
7893 $NumOfCentralAtoms = @{$CentralAtomsSymbolsRef};
7894 $FirstCentralAtomIndex = 0;
7895 $LastCentralAtomIndex = $NumOfCentralAtoms - 1;
7896
7897 # Retrieve first central atom information...
7898 my($FirstCentralAtomSymbol, $FirstCentralAtomMinHydrogenCount);
7899 $FirstCentralAtomSymbol = $CentralAtomsSymbolsRef->[$FirstCentralAtomIndex];
7900 $FirstCentralAtomMinHydrogenCount = defined($CentralAtomsMinHydrogenCountRef) ? $CentralAtomsMinHydrogenCountRef->[$FirstCentralAtomIndex] : undef;
7901
7902 # Retrieve last central atom information...
7903 my($LastCentralAtomSymbol, $LastCentralAtomMinHydrogenCount);
7904 $LastCentralAtomSymbol = $CentralAtomsSymbolsRef->[$LastCentralAtomIndex];
7905 $LastCentralAtomMinHydrogenCount = defined($CentralAtomsMinHydrogenCountRef) ? $CentralAtomsMinHydrogenCountRef->[$LastCentralAtomIndex] : undef;
7906
7907 my($Atom, $AtomPathRef, $AtomPathsRef, $FirstAtomIndex, $LastAtomIndex, $AtomIndex, $FirstPathAtom, $LastPathAtom, $FirstPathAtomID, $LastPathAtomID, $DetectedPathID, $PathAtom, $NextPathAtom, $PreviousPathAtom, $AtomSymbol, $NextAtomSymbol, $BondSymbol, $MatchSpecifiedAtomOrder, $MinHydrogenCount, @NbrsToExcludeFromMatch, @NbrAtomSymbols, @NbrBondSymbols, @NbrMinHydrogenCount, %AlreadyDetectedPaths);
7908
7909 # Go over all the atoms...
7910 #
7911 ATOM: for $Atom (@{$This->{Atoms}}) {
7912 # Match first central atom...
7913 if (!$This->_DoesAtomNeighborhoodMatch($Atom, $FirstCentralAtomSymbol, undef, undef, $FirstCentralAtomMinHydrogenCount, undef)) {
7914 next ATOM;
7915 }
7916 # Get atom paths starting from matched central atom with length equal to NumOfCentralAtoms...
7917 #
7918 $AtomPathsRef = $Molecule->GetAllAtomPathsStartingAtWithLength($Atom, $NumOfCentralAtoms);
7919 if (!(defined($AtomPathsRef) && @{$AtomPathsRef})) {
7920 next ATOM;
7921 }
7922 ATOMPATH: for $AtomPathRef (@{$AtomPathsRef}) {
7923 $FirstAtomIndex = 0;
7924 $FirstPathAtom = $AtomPathRef->[$FirstAtomIndex];
7925 $LastAtomIndex = @{$AtomPathRef} - 1;
7926 $LastPathAtom = $AtomPathRef->[$LastAtomIndex];
7927
7928 # Match last central atom to the last atom in path...
7929 if (!$This->_DoesAtomNeighborhoodMatch($LastPathAtom, $LastCentralAtomSymbol, undef, undef, $LastCentralAtomMinHydrogenCount, undef)) {
7930 next ATOMPATH;
7931 }
7932
7933 # Match other path atoms with central atoms..
7934 for $AtomIndex ($FirstAtomIndex .. $LastAtomIndex) {
7935 $PathAtom = $AtomPathRef->[$AtomIndex];
7936 $AtomSymbol = $CentralAtomsSymbolsRef->[$AtomIndex];
7937 $MinHydrogenCount = defined($CentralAtomsMinHydrogenCountRef) ? $CentralAtomsMinHydrogenCountRef->[$AtomIndex] : undef;
7938
7939 @NbrsToExcludeFromMatch = ();
7940 if ($AtomIndex == $FirstAtomIndex) {
7941 $NextPathAtom = $AtomPathRef->[$AtomIndex + 1]; $PreviousPathAtom = undef;
7942 push @NbrsToExcludeFromMatch, $NextPathAtom;
7943 }
7944 elsif ($AtomIndex == $LastAtomIndex) {
7945 $NextPathAtom = undef; $PreviousPathAtom = $AtomPathRef->[$AtomIndex - 1];
7946 push @NbrsToExcludeFromMatch, $PreviousPathAtom;
7947 }
7948 else {
7949 $NextPathAtom = $AtomPathRef->[$AtomIndex + 1]; $PreviousPathAtom = $AtomPathRef->[$AtomIndex - 1];
7950 push @NbrsToExcludeFromMatch, ($PreviousPathAtom, $NextPathAtom);
7951 }
7952
7953 @NbrAtomSymbols = (defined($NbrAtomSymbolsRef) && defined($NbrAtomSymbolsRef->[$AtomIndex])) ? @{$NbrAtomSymbolsRef->[$AtomIndex]} : ();
7954 @NbrBondSymbols = (defined($NbrBondSymbolsRef) && defined($NbrBondSymbolsRef->[$AtomIndex]) ) ? @{$NbrBondSymbolsRef->[$AtomIndex]} : ();
7955 @NbrMinHydrogenCount = (defined($NbrsMinHydrogenCountRef) && defined($NbrsMinHydrogenCountRef->[$AtomIndex]) ) ? @{$NbrsMinHydrogenCountRef->[$AtomIndex]} : ();
7956
7957 if (!$This->_DoesAtomNeighborhoodMatch($PathAtom, $AtomSymbol, \@NbrAtomSymbols, \@NbrBondSymbols, $MinHydrogenCount, \@NbrMinHydrogenCount, \@NbrsToExcludeFromMatch)) {
7958 next ATOMPATH;
7959 }
7960 # Match path bond symbols...
7961 if (defined($CentralAtomsBondSymbolsRef) && ($AtomIndex < $LastAtomIndex)) {
7962 $NextAtomSymbol = $CentralAtomsSymbolsRef->[$AtomIndex + 1];
7963 $BondSymbol = $CentralAtomsBondSymbolsRef->[$AtomIndex];
7964 $MatchSpecifiedAtomOrder = 1;
7965 if (!$This->_DoBondAtomsMatchBondSymbols($PathAtom, $NextPathAtom, $AtomSymbol, $NextAtomSymbol, $BondSymbol, $MatchSpecifiedAtomOrder)) {
7966 next ATOMPATH;
7967 }
7968 }
7969 }
7970 # Keep track of the first and last atom ID in the matched path to avoid double counting of paths...
7971 if (defined($MinKeyCount) || !$This->{KeyBits}) {
7972 $FirstPathAtomID = $FirstPathAtom->GetID(); $LastPathAtomID = $LastPathAtom->GetID();
7973 $DetectedPathID = ($FirstPathAtomID < $LastPathAtomID) ? "${FirstPathAtomID}-${LastPathAtomID}" : "${LastPathAtomID}-${FirstPathAtomID}";
7974 if (exists $AlreadyDetectedPaths{$DetectedPathID}) {
7975 $AlreadyDetectedPaths{$DetectedPathID} += 1;
7976 next ATOMPATH;
7977 }
7978 $AlreadyDetectedPaths{$DetectedPathID} = 1;
7979 }
7980
7981 $KeyValue++;
7982 if (defined($MinKeyCount) && $KeyValue < $MinKeyCount) {
7983 next ATOMPATH;
7984 }
7985 if ($This->{KeyBits}) {
7986 $KeyValue = 1;
7987 last ATOM;
7988 }
7989 }
7990 }
7991 return $KeyValue;
7992 }
7993
7994 # Go over the atoms attached to central atom and match 'em against specified
7995 # neighborhood atom symbol and bond symbols...
7996 #
7997 sub _DoesAtomNeighborhoodMatch {
7998 my($This, $CentralAtom, $CentralAtomSymbol, $NbrAtomSymbolsRef, $NbrBondSymbolsRef, $CentralAtomMinHydrogenCount, $NbrAtomMinHydrogenCountRef, $NbrsToExcludeRef) = @_;
7999
8000 # Match central atom first...
8001 if (!$This->_DoesAtomMatchesSymbol($CentralAtom, $CentralAtomSymbol)) {
8002 return 0;
8003 }
8004 if (defined $CentralAtomMinHydrogenCount) {
8005 if (!$This->_DoesAtomMinHydrogenCountMatch($CentralAtom, $CentralAtomMinHydrogenCount)) {
8006 return 0;
8007 }
8008 }
8009 if (!defined $NbrAtomSymbolsRef) {
8010 # No neighbors to match...
8011 return 1;
8012 }
8013
8014 # Match neighbors...
8015 my($NbrAtom, $Index, $NbrAtomSymbol, $NbrBondSymbol, $NbrAtomMinHydrogenCount, $NbrAtomMatchCount, $MinNbrAtomMatchCount, $MatchSpecifiedAtomOrder, @CentralAtomNeighbors, %NbrAtomAlreadyMatchedMap);
8016
8017 $MinNbrAtomMatchCount = @$NbrAtomSymbolsRef;
8018 if (!$MinNbrAtomMatchCount) {
8019 # No neighbors to match...
8020 return 1;
8021 }
8022
8023 $NbrAtomMatchCount = 0;
8024
8025 %NbrAtomAlreadyMatchedMap = ();
8026 $MatchSpecifiedAtomOrder = 1;
8027
8028 @CentralAtomNeighbors = ();
8029 if (defined($NbrsToExcludeRef) && @{$NbrsToExcludeRef}) {
8030 push @CentralAtomNeighbors, $CentralAtom->GetNeighbors(@{$NbrsToExcludeRef});
8031 }
8032 else {
8033 push @CentralAtomNeighbors, $CentralAtom->GetNeighbors();
8034 }
8035
8036 NBRATOM: for $NbrAtom (@CentralAtomNeighbors) {
8037 NBRATOMSYMBOL: for $Index (0 .. ($MinNbrAtomMatchCount - 1)) {
8038 if (exists $NbrAtomAlreadyMatchedMap{$Index}) {
8039 next NBRATOMSYMBOL;
8040 }
8041 $NbrAtomSymbol = $NbrAtomSymbolsRef->[$Index];
8042 $NbrBondSymbol = $NbrBondSymbolsRef->[$Index];
8043 if (!$This->_DoBondAtomsMatchBondSymbols($CentralAtom, $NbrAtom, $CentralAtomSymbol, $NbrAtomSymbol, $NbrBondSymbol, $MatchSpecifiedAtomOrder)) {
8044 next NBRATOMSYMBOL;
8045 }
8046
8047 if (defined($NbrAtomMinHydrogenCountRef) && $NbrAtomMinHydrogenCountRef->[$Index]) {
8048 $NbrAtomMinHydrogenCount = $NbrAtomMinHydrogenCountRef->[$Index];
8049 if (!$This->_DoesAtomMinHydrogenCountMatch($NbrAtom, $NbrAtomMinHydrogenCount)) {
8050 next NBRATOMSYMBOL;
8051 }
8052 }
8053 $NbrAtomAlreadyMatchedMap{$Index} = $Index;
8054 $NbrAtomMatchCount++;
8055
8056 if ($NbrAtomMatchCount == $MinNbrAtomMatchCount) {
8057 last NBRATOM;
8058 }
8059 next NBRATOM;
8060 }
8061 }
8062
8063 return ($NbrAtomMatchCount == $MinNbrAtomMatchCount) ? 1 : 0;
8064 }
8065
8066 # Checks whether bond atoms match bond symbols...
8067 #
8068 sub _DoBondAtomsMatchBondSymbols {
8069 my($This, $Atom1, $Atom2, $AtomSymbol1, $AtomSymbol2, $BondSymbol, $MatchSpecifiedAtomOrder, $Atom1MinHydrogenCount, $Atom2MinHydrogenCount) = @_;
8070 my($Status, $ReverseMinHydrogenCountMatch);
8071
8072 $ReverseMinHydrogenCountMatch = 0;
8073
8074 if (defined($MatchSpecifiedAtomOrder) && $MatchSpecifiedAtomOrder) {
8075 if (!($This->_DoesAtomMatchesSymbol($Atom1, $AtomSymbol1) && $This->_DoesAtomMatchesSymbol($Atom2, $AtomSymbol2))) {
8076 return 0;
8077 }
8078 }
8079 else {
8080 if ($This->_DoesAtomMatchesSymbol($Atom1, $AtomSymbol1) && $This->_DoesAtomMatchesSymbol($Atom2, $AtomSymbol2)) {
8081 $ReverseMinHydrogenCountMatch = 0;
8082 }
8083 elsif ($This->_DoesAtomMatchesSymbol($Atom1, $AtomSymbol2) && $This->_DoesAtomMatchesSymbol($Atom2, $AtomSymbol1)) {
8084 $ReverseMinHydrogenCountMatch = 1;
8085 }
8086 else {
8087 return 0;
8088 }
8089 }
8090
8091 # Match any hydrogen count...
8092 if (defined($Atom1MinHydrogenCount) || defined($Atom2MinHydrogenCount)) {
8093 my($MinHydrogenCountMatchAtom1, $MinHydrogenCountMatchAtom2);
8094
8095 ($MinHydrogenCountMatchAtom1, $MinHydrogenCountMatchAtom2) = $ReverseMinHydrogenCountMatch ? ($Atom2, $Atom1) : ($Atom1, $Atom2);
8096 if (defined $Atom1MinHydrogenCount ) {
8097 if (!$This->_DoesAtomMinHydrogenCountMatch($MinHydrogenCountMatchAtom1, $Atom1MinHydrogenCount)) {
8098 return 0;
8099 }
8100 }
8101 if (defined $Atom2MinHydrogenCount ) {
8102 if (!$This->_DoesAtomMinHydrogenCountMatch($MinHydrogenCountMatchAtom2, $Atom2MinHydrogenCount)) {
8103 return 0;
8104 }
8105 }
8106 }
8107
8108 if (defined($BondSymbol) && $BondSymbol) {
8109 my($Bond);
8110 $Bond = $Atom1->GetBondToAtom($Atom2);
8111 if (!$This->_DoesBondMatchesSymbol($Bond, $BondSymbol)) {
8112 return 0;
8113 }
8114 }
8115 return 1;
8116 }
8117
8118 # Match both implicit and explicit hydrogens on central atom...
8119 sub _DoesAtomMinHydrogenCountMatch {
8120 my($This, $Atom, $MinHydrogenCount) = @_;
8121
8122 if (!(defined($MinHydrogenCount) && $MinHydrogenCount)) {
8123 return 0;
8124 }
8125 return ($Atom->GetNumOfHydrogens() < $MinHydrogenCount) ? 0 : 1;
8126 }
8127
8128 # Checks whether atom matches supported symbol...
8129 #
8130 sub _DoesAtomMatchesSymbol {
8131 my($This, $Atom, $Symbol) = @_;
8132 my($Status);
8133
8134 $Status = 0;
8135 SYMBOL: {
8136 if ($Symbol =~ /^Q$/i) { $Status = $This->_IsHeteroAtom($Atom) ? 1 : 0; last SYMBOL; }
8137 if ($Symbol =~ /^X$/i) { $Status = $This->_IsHalogenAtom($Atom) ? 1 : 0; last SYMBOL; }
8138 if ($Symbol =~ /^Z$/i) { $Status = $This->_IsOtherAtom($Atom) ? 1 : 0; last SYMBOL; }
8139 if ($Symbol =~ /^A$/i) { $Status = $This->_IsAtom($Atom) ? 1 : 0; last SYMBOL; }
8140 $Status = ($Atom->GetAtomSymbol() =~ /^$Symbol$/i) ? 1 : 0;
8141 }
8142 return $Status;
8143 }
8144
8145 # Checks whether bond matches supported symbol...
8146 #
8147 sub _DoesBondMatchesSymbol {
8148 my($This, $Bond, $Symbol) = @_;
8149 my($Status, $BondOrder);
8150
8151 $Status = 0;
8152 SYMBOL: {
8153 if ($Symbol =~ /^(1|-)$/i) { $Status = $Bond->IsSingle() ? 1 : 0; last SYMBOL; }
8154 if ($Symbol =~ /^(2|=)$/i) { $Status = $Bond->IsDouble() ? 1 : 0; last SYMBOL; }
8155 if ($Symbol =~ /^(3|#|T)$/i) { $Status = $Bond->IsTriple() ? 1 : 0; last SYMBOL; }
8156 if ($Symbol =~ /^(1.5|%)$/i) { $Status = $Bond->IsAromatic() ? 1 : 0; last SYMBOL; }
8157
8158 if ($Symbol =~ /^\~$/i) { $Status = ($Bond->IsSingle() || $Bond->IsDouble()) ? 1 : 0; last SYMBOL; }
8159
8160 if ($Symbol =~ /^\$$/i) { $Status = $Bond->IsInRing() ? 1 : 0; last SYMBOL; }
8161 if ($Symbol =~ /^\!$/i) { $Status = $Bond->IsInRing() ? 0 : 1; last SYMBOL; }
8162
8163 if ($Symbol =~ /^(\$-)$/i) { $Status = ($Bond->IsInRing() && $Bond->IsSingle()) ? 1 : 0; last SYMBOL; }
8164 if ($Symbol =~ /^(\$=)$/i) { $Status = ($Bond->IsInRing() && $Bond->IsDouble()) ? 1 : 0; last SYMBOL; }
8165 if ($Symbol =~ /^(\$#|\$T)$/i) { $Status = ($Bond->IsInRing() && $Bond->IsTriple()) ? 1 : 0; last SYMBOL; }
8166
8167 if ($Symbol =~ /^(not%)$/i) { $Status = $Bond->IsAromatic() ? 0 : 1; last SYMBOL; }
8168 if ($Symbol =~ /^(not%not-)$/i) { $Status = $Bond->IsAromatic() ? 0 : ($Bond->IsSingle() ? 0 : 1); last SYMBOL; }
8169 if ($Symbol =~ /^(not%not=)$/i) { $Status = $Bond->IsAromatic() ? 0 : ($Bond->IsDouble() ? 0 : 1); last SYMBOL; }
8170
8171 $Status = 0;
8172 }
8173 return $Status;
8174 }
8175
8176 # Cache appropriate molecule data...
8177 #
8178 sub _SetupMoleculeDataCache {
8179 my($This) = @_;
8180
8181 @{$This->{Atoms}} = $This->GetMolecule()->GetAtoms();
8182 @{$This->{Bonds}} = $This->GetMolecule()->GetBonds();
8183
8184 return $This;
8185 }
8186
8187 # Clear cached molecule data...
8188 #
8189 sub _ClearMoleculeDataCache {
8190 my($This) = @_;
8191
8192 @{$This->{Atoms}} = ();
8193 @{$This->{Bonds}} = ();
8194
8195 return $This;
8196 }
8197
8198 # Return a string containg data for MACCSKeys object...
8199 sub StringifyMACCSKeys {
8200 my($This) = @_;
8201 my($MACCSKeysString);
8202
8203 # Type of Keys...
8204 $MACCSKeysString = "Type: $This->{Type}; Size: $This->{Size}";
8205
8206 if ($This->{Type} =~ /^MACCSKeyBits$/i) {
8207 $MACCSKeysString .= "; FingerprintsBitVector: < $This->{FingerprintsBitVector} >";
8208 }
8209 elsif ($This->{Type} =~ /^MACCSKeyCount$/i) {
8210 $MACCSKeysString .= "; FingerprintsVector: < $This->{FingerprintsVector} >";
8211 }
8212
8213 return $MACCSKeysString;
8214 }
8215
8216 1;
8217
8218 __END__
8219
8220 =head1 NAME
8221
8222 MACCSKeys
8223
8224 =head1 SYNOPSIS
8225
8226 use Fingerprints::MACCSKeys;
8227
8228 use Fingerprints::MACCSKeys qw(:all);
8229
8230 =head1 DESCRIPTION
8231
8232 B<MACCSKeys> [ Ref 45-47 ] class provides the following methods:
8233
8234 new, GenerateFingerprints, GenerateMACCSKeys, GetDescription, SetSize, SetType,
8235 StringifyMACCSKeys
8236
8237 B<MACCSKeys> is derived from B<Fingerprints> class which in turn is derived from
8238 B<ObjectProperty> base class that provides methods not explicitly defined in B<MACCSKeys>,
8239 B<Fingerprints> or B<ObjectProperty> classes using Perl's AUTOLOAD functionality. These
8240 methods are generated on-the-fly for a specified object property:
8241
8242 Set<PropertyName>(<PropertyValue>);
8243 $PropertyValue = Get<PropertyName>();
8244 Delete<PropertyName>();
8245
8246 For each MACCS (Molecular ACCess System) keys definition, atoms are processed to
8247 determine their membership to the key and the appropriate molecular fingerprints strings
8248 are generated. An atom can belong to multiple MACCS keys.
8249
8250 For I<MACCSKeyBits> value of B<Type> option, a fingerprint bit-vector string containing
8251 zeros and ones is generated and for I<MACCSKeyCount> value, a fingerprint vector string
8252 corresponding to number of MACCS keys [ Ref 45-47 ] is generated.
8253
8254 I<MACCSKeyBits or MACCSKeyCount> values for B<Type> along with two possible
8255 I<166 | 322> values of B<Size> supports generation of four different types of MACCS
8256 keys fingerprint: I<MACCS166KeyBits, MACCS166KeyCount, MACCS322KeyBits, MACCS322KeyCount>.
8257
8258 The current release of MayaChemTools generates the following types of MACCS keys
8259 fingerprints bit-vector and vector strings:
8260
8261 FingerprintsBitVector;MACCSKeyBits;166;BinaryString;Ascending;00000000
8262 0000000000000000000000000000000001001000010010000000010010000000011100
8263 0100101010111100011011000100110110000011011110100110111111111111011111
8264 11111111111110111000
8265
8266 FingerprintsBitVector;MACCSKeyBits;166;HexadecimalString;Ascending;000
8267 000000021210210e845f8d8c60b79dffbffffd1
8268
8269 FingerprintsBitVector;MACCSKeyBits;322;BinaryString;Ascending;11101011
8270 1110011111100101111111000111101100110000000000000011100010000000000000
8271 0000000000000000000000000000000000000000000000101000000000000000000000
8272 0000000000000000000000000000000000000000000000000000000000000000000000
8273 0000000000000000000000000000000000000011000000000000000000000000000000
8274 0000000000000000000000000000000000000000
8275
8276 FingerprintsBitVector;MACCSKeyBits;322;HexadecimalString;Ascending;7d7
8277 e7af3edc000c1100000000000000500000000000000000000000000000000300000000
8278 000000000
8279
8280 FingerprintsVector;MACCSKeyCount;166;OrderedNumericalValues;ValuesStri
8281 ng;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8282 0 0 0 0 0 0 0 1 0 0 3 0 0 0 0 4 0 0 2 0 0 0 0 0 0 0 0 2 0 0 2 0 0 0 0
8283 0 0 0 0 1 1 8 0 0 0 1 0 0 1 0 1 0 1 0 3 1 3 1 0 0 0 1 2 0 11 1 0 0 0
8284 5 0 0 1 2 0 1 1 0 0 0 0 0 1 1 0 1 1 1 1 0 4 0 0 1 1 0 4 6 1 1 1 2 1 1
8285 3 5 2 2 0 5 3 5 1 1 2 5 1 2 1 2 4 8 3 5 5 2 2 0 3 5 4 1
8286
8287 FingerprintsVector;MACCSKeyCount;322;OrderedNumericalValues;ValuesStri
8288 ng;14 8 2 0 2 0 4 4 2 1 4 0 0 2 5 10 5 2 1 0 0 2 0 5 13 3 28 5 5 3 0 0
8289 0 4 2 1 1 0 1 1 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 5 3 0 0 0 1 0
8290 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8291 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 0 2 0 0 0 0 0 0 0 0 0
8292 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
8293
8294 =head2 METHODS
8295
8296 =over 4
8297
8298 =item B<new>
8299
8300 $NewMACCSKeys = new MACCSKeys(%NamesAndValues);
8301
8302 Using specified I<MACCSKeys> property names and values hash, B<new> method creates a new object
8303 and returns a reference to newly created B<PathLengthFingerprints> object. By default, the
8304 following properties are initialized:
8305
8306 Molecule = '';
8307 Type = ''
8308 Size = ''
8309
8310 Examples:
8311
8312 $MACCSKeys = new MACCSKeys('Molecule' => $Molecule,
8313 'Type' => 'MACCSKeyBits',
8314 'Size' => 166);
8315
8316 $MACCSKeys = new MACCSKeys('Molecule' => $Molecule,
8317 'Type' => 'MACCSKeyCount',
8318 'Size' => 166);
8319
8320 $MACCSKeys = new MACCSKeys('Molecule' => $Molecule,
8321 'Type' => 'MACCSKeyBit',
8322 'Size' => 322);
8323
8324 $MACCSKeys = new MACCSKeys('Molecule' => $Molecule,
8325 'Type' => 'MACCSKeyCount',
8326 'Size' => 322);
8327
8328 $MACCSKeys->GenerateMACCSKeys();
8329 print "$MACCSKeys\n";
8330
8331 =item B<GetDescription>
8332
8333 $Description = $MACCSKeys->GetDescription();
8334
8335 Returns a string containing description of MACCS keys fingerprints.
8336
8337 =item B<GenerateMACCSKeys or GenerateFingerprints>
8338
8339 $MACCSKeys = $MACCSKeys->GenerateMACCSKeys();
8340
8341 Generates MACCS keys fingerprints and returns I<MACCSKeys>.
8342
8343 For I<MACCSKeyBits> value of B<Type>, a fingerprint bit-vector string containing
8344 zeros and ones is generated and for I<MACCSKeyCount> value, a fingerprint vector string
8345 corresponding to number of MACCS keys is generated.
8346
8347 I<MACCSKeyBits or MACCSKeyCount> values for B<Type> option along with two possible
8348 I<166 | 322> values of B<Size> supports generation of four different types of MACCS
8349 keys fingerprint: I<MACCS166KeyBits, MACCS166KeyCount, MACCS322KeyBits, MACCS322KeyCount>.
8350
8351 Definition of MACCS keys uses the following atom and bond symbols to define atom and
8352 bond environments:
8353
8354 Atom symbols for 166 keys [ Ref 47 ]:
8355
8356 A : Any valid periodic table element symbol
8357 Q : Hetro atoms; any non-C or non-H atom
8358 X : Halogens; F, Cl, Br, I
8359 Z : Others; other than H, C, N, O, Si, P, S, F, Cl, Br, I
8360
8361 Atom symbols for 322 keys [ Ref 46 ]:
8362
8363 A : Any valid periodic table element symbol
8364 Q : Hetro atoms; any non-C or non-H atom
8365 X : Others; other than H, C, N, O, Si, P, S, F, Cl, Br, I
8366 Z is neither defined nor used
8367
8368 Bond types:
8369
8370 - : Single
8371 = : Double
8372 T : Triple
8373 # : Triple
8374 ~ : Single or double query bond
8375 % : An aromatic query bond
8376
8377 None : Any bond type; no explicit bond specified
8378
8379 $ : Ring bond; $ before a bond type specifies ring bond
8380 ! : Chain or non-ring bond; ! before a bond type specifies chain bond
8381
8382 @ : A ring linkage and the number following it specifies the
8383 atoms position in the line, thus @1 means linked back to the first
8384 atom in the list.
8385
8386 Aromatic: Kekule or Arom5
8387
8388 Kekule: Bonds in 6-membered rings with alternate single/double bonds
8389 or perimeter bonds
8390 Arom5: Bonds in 5-membered rings with two double bonds and a hetro
8391 atom at the apex of the ring.
8392
8393 MACCS 166 keys [ Ref 45-47 ] are defined as follows:
8394
8395 Key Description
8396
8397 1 ISOTOPE
8398 2 103 < ATOMIC NO. < 256
8399 3 GROUP IVA,VA,VIA PERIODS 4-6 (Ge...)
8400 4 ACTINIDE
8401 5 GROUP IIIB,IVB (Sc...)
8402 6 LANTHANIDE
8403 7 GROUP VB,VIB,VIIB (V...)
8404 8 QAAA@1
8405 9 GROUP VIII (Fe...)
8406 10 GROUP IIA (ALKALINE EARTH)
8407 11 4M RING
8408 12 GROUP IB,IIB (Cu...)
8409 13 ON(C)C
8410 14 S-S
8411 15 OC(O)O
8412 16 QAA@1
8413 17 CTC
8414 18 GROUP IIIA (B...)
8415 19 7M RING
8416 20 SI
8417 21 C=C(Q)Q
8418 22 3M RING
8419 23 NC(O)O
8420 24 N-O
8421 25 NC(N)N
8422 26 C$=C($A)$A
8423 27 I
8424 28 QCH2Q
8425 29 P
8426 30 CQ(C)(C)A
8427 31 QX
8428 32 CSN
8429 33 NS
8430 34 CH2=A
8431 35 GROUP IA (ALKALI METAL)
8432 36 S HETEROCYCLE
8433 37 NC(O)N
8434 38 NC(C)N
8435 39 OS(O)O
8436 40 S-O
8437 41 CTN
8438 42 F
8439 43 QHAQH
8440 44 OTHER
8441 45 C=CN
8442 46 BR
8443 47 SAN
8444 48 OQ(O)O
8445 49 CHARGE
8446 50 C=C(C)C
8447 51 CSO
8448 52 NN
8449 53 QHAAAQH
8450 54 QHAAQH
8451 55 OSO
8452 56 ON(O)C
8453 57 O HETEROCYCLE
8454 58 QSQ
8455 59 Snot%A%A
8456 60 S=O
8457 61 AS(A)A
8458 62 A$A!A$A
8459 63 N=O
8460 64 A$A!S
8461 65 C%N
8462 66 CC(C)(C)A
8463 67 QS
8464 68 QHQH (&...)
8465 69 QQH
8466 70 QNQ
8467 71 NO
8468 72 OAAO
8469 73 S=A
8470 74 CH3ACH3
8471 75 A!N$A
8472 76 C=C(A)A
8473 77 NAN
8474 78 C=N
8475 79 NAAN
8476 80 NAAAN
8477 81 SA(A)A
8478 82 ACH2QH
8479 83 QAAAA@1
8480 84 NH2
8481 85 CN(C)C
8482 86 CH2QCH2
8483 87 X!A$A
8484 88 S
8485 89 OAAAO
8486 90 QHAACH2A
8487 91 QHAAACH2A
8488 92 OC(N)C
8489 93 QCH3
8490 94 QN
8491 95 NAAO
8492 96 5M RING
8493 97 NAAAO
8494 98 QAAAAA@1
8495 99 C=C
8496 100 ACH2N
8497 101 8M RING
8498 102 QO
8499 103 CL
8500 104 QHACH2A
8501 105 A$A($A)$A
8502 106 QA(Q)Q
8503 107 XA(A)A
8504 108 CH3AAACH2A
8505 109 ACH2O
8506 110 NCO
8507 111 NACH2A
8508 112 AA(A)(A)A
8509 113 Onot%A%A
8510 114 CH3CH2A
8511 115 CH3ACH2A
8512 116 CH3AACH2A
8513 117 NAO
8514 118 ACH2CH2A > 1
8515 119 N=A
8516 120 HETEROCYCLIC ATOM > 1 (&...)
8517 121 N HETEROCYCLE
8518 122 AN(A)A
8519 123 OCO
8520 124 QQ
8521 125 AROMATIC RING > 1
8522 126 A!O!A
8523 127 A$A!O > 1 (&...)
8524 128 ACH2AAACH2A
8525 129 ACH2AACH2A
8526 130 QQ > 1 (&...)
8527 131 QH > 1
8528 132 OACH2A
8529 133 A$A!N
8530 134 X (HALOGEN)
8531 135 Nnot%A%A
8532 136 O=A > 1
8533 137 HETEROCYCLE
8534 138 QCH2A > 1 (&...)
8535 139 OH
8536 140 O > 3 (&...)
8537 141 CH3 > 2 (&...)
8538 142 N > 1
8539 143 A$A!O
8540 144 Anot%A%Anot%A
8541 145 6M RING > 1
8542 146 O > 2
8543 147 ACH2CH2A
8544 148 AQ(A)A
8545 149 CH3 > 1
8546 150 A!A$A!A
8547 151 NH
8548 152 OC(C)C
8549 153 QCH2A
8550 154 C=O
8551 155 A!CH2!A
8552 156 NA(A)A
8553 157 C-O
8554 158 C-N
8555 159 O > 1
8556 160 CH3
8557 161 N
8558 162 AROMATIC
8559 163 6M RING
8560 164 O
8561 165 RING
8562 166 FRAGMENTS
8563
8564 MACCS 322 keys set as defined in tables 1, 2 and 3 [ Ref 46 ] include:
8565
8566 o 26 atom properties of type P, as listed in Table 1
8567 o 32 one-atom environments, as listed in Table 3
8568 o 264 atom-bond-atom combinations listed in Table 4
8569
8570 Total number of keys in three tables is : 322
8571
8572 Atom symbol, X, used for 322 keys [ Ref 46 ] doesn't refer to Halogens as it does for 166 keys. In
8573 order to keep the definition of 322 keys consistent with the published definitions, the symbol X is
8574 used to imply "others" atoms, but it's internally mapped to symbol X as defined for 166 keys
8575 during the generation of key values.
8576
8577 Atom properties-based keys (26):
8578
8579 Key Description
8580 1 A(AAA) or AA(A)A - atom with at least three neighbors
8581 2 Q - heteroatom
8582 3 Anot%not-A - atom involved in one or more multiple bonds, not aromatic
8583 4 A(AAAA) or AA(A)(A)A - atom with at least four neighbors
8584 5 A(QQ) or QA(Q) - atom with at least two heteroatom neighbors
8585 6 A(QQQ) or QA(Q)Q - atom with at least three heteroatom neighbors
8586 7 QH - heteroatom with at least one hydrogen attached
8587 8 CH2(AA) or ACH2A - carbon with at least two single bonds and at least
8588 two hydrogens attached
8589 9 CH3(A) or ACH3 - carbon with at least one single bond and at least three
8590 hydrogens attached
8591 10 Halogen
8592 11 A(-A-A-A) or A-A(-A)-A - atom has at least three single bonds
8593 12 AAAAAA@1 > 2 - atom is in at least two different six-membered rings
8594 13 A($A$A$A) or A$A($A)$A - atom has more than two ring bonds
8595 14 A$A!A$A - atom is at a ring/chain boundary. When a comparison is done
8596 with another atom the path passes through the chain bond.
8597 15 Anot%A%Anot%A - atom is at an aromatic/nonaromatic boundary. When a
8598 comparison is done with another atom the path
8599 passes through the aromatic bond.
8600 16 A!A!A - atom with more than one chain bond
8601 17 A!A$A!A - atom is at a ring/chain boundary. When a comparison is done
8602 with another atom the path passes through the ring bond.
8603 18 A%Anot%A%A - atom is at an aromatic/nonaromatic boundary. When a
8604 comparison is done with another atom the
8605 path passes through the nonaromatic bond.
8606 19 HETEROCYCLE - atom is a heteroatom in a ring.
8607 20 rare properties: atom with five or more neighbors, atom in
8608 four or more rings, or atom types other than
8609 H, C, N, O, S, F, Cl, Br, or I
8610 21 rare properties: atom has a charge, is an isotope, has two or
8611 more multiple bonds, or has a triple bond.
8612 22 N - nitrogen
8613 23 S - sulfur
8614 24 O - oxygen
8615 25 A(AA)A(A)A(AA) - atom has two neighbors, each with three or
8616 more neighbors (including the central atom).
8617 26 CHACH2 - atom has two hydrocarbon (CH2) neighbors
8618
8619 Atomic environments properties-based keys (32):
8620
8621 Key Description
8622 27 C(CC)
8623 28 C(CCC)
8624 29 C(CN)
8625 30 C(CCN)
8626 31 C(NN)
8627 32 C(NNC)
8628 33 C(NNN)
8629 34 C(CO)
8630 35 C(CCO)
8631 36 C(NO)
8632 37 C(NCO)
8633 38 C(NNO)
8634 39 C(OO)
8635 40 C(COO)
8636 41 C(NOO)
8637 42 C(OOO)
8638 43 Q(CC)
8639 44 Q(CCC)
8640 45 Q(CN)
8641 46 Q(CCN)
8642 47 Q(NN)
8643 48 Q(CNN)
8644 49 Q(NNN)
8645 50 Q(CO)
8646 51 Q(CCO)
8647 52 Q(NO)
8648 53 Q(CNO)
8649 54 Q(NNO)
8650 55 Q(OO)
8651 56 Q(COO)
8652 57 Q(NOO)
8653 58 Q(OOO)
8654
8655 Note: The first symbol is the central atom, with atoms bonded to the central atom listed in
8656 parentheses. Q is any non-C, non-H atom. If only two atoms are in parentheses, there is
8657 no implication concerning the other atoms bonded to the central atom.
8658
8659 Atom-Bond-Atom properties-based keys: (264)
8660
8661 Key Description
8662 59 C-C
8663 60 C-N
8664 61 C-O
8665 62 C-S
8666 63 C-Cl
8667 64 C-P
8668 65 C-F
8669 66 C-Br
8670 67 C-Si
8671 68 C-I
8672 69 C-X
8673 70 N-N
8674 71 N-O
8675 72 N-S
8676 73 N-Cl
8677 74 N-P
8678 75 N-F
8679 76 N-Br
8680 77 N-Si
8681 78 N-I
8682 79 N-X
8683 80 O-O
8684 81 O-S
8685 82 O-Cl
8686 83 O-P
8687 84 O-F
8688 85 O-Br
8689 86 O-Si
8690 87 O-I
8691 88 O-X
8692 89 S-S
8693 90 S-Cl
8694 91 S-P
8695 92 S-F
8696 93 S-Br
8697 94 S-Si
8698 95 S-I
8699 96 S-X
8700 97 Cl-Cl
8701 98 Cl-P
8702 99 Cl-F
8703 100 Cl-Br
8704 101 Cl-Si
8705 102 Cl-I
8706 103 Cl-X
8707 104 P-P
8708 105 P-F
8709 106 P-Br
8710 107 P-Si
8711 108 P-I
8712 109 P-X
8713 110 F-F
8714 111 F-Br
8715 112 F-Si
8716 113 F-I
8717 114 F-X
8718 115 Br-Br
8719 116 Br-Si
8720 117 Br-I
8721 118 Br-X
8722 119 Si-Si
8723 120 Si-I
8724 121 Si-X
8725 122 I-I
8726 123 I-X
8727 124 X-X
8728 125 C=C
8729 126 C=N
8730 127 C=O
8731 128 C=S
8732 129 C=Cl
8733 130 C=P
8734 131 C=F
8735 132 C=Br
8736 133 C=Si
8737 134 C=I
8738 135 C=X
8739 136 N=N
8740 137 N=O
8741 138 N=S
8742 139 N=Cl
8743 140 N=P
8744 141 N=F
8745 142 N=Br
8746 143 N=Si
8747 144 N=I
8748 145 N=X
8749 146 O=O
8750 147 O=S
8751 148 O=Cl
8752 149 O=P
8753 150 O=F
8754 151 O=Br
8755 152 O=Si
8756 153 O=I
8757 154 O=X
8758 155 S=S
8759 156 S=Cl
8760 157 S=P
8761 158 S=F
8762 159 S=Br
8763 160 S=Si
8764 161 S=I
8765 162 S=X
8766 163 Cl=Cl
8767 164 Cl=P
8768 165 Cl=F
8769 166 Cl=Br
8770 167 Cl=Si
8771 168 Cl=I
8772 169 Cl=X
8773 170 P=P
8774 171 P=F
8775 172 P=Br
8776 173 P=Si
8777 174 P=I
8778 175 P=X
8779 176 F=F
8780 177 F=Br
8781 178 F=Si
8782 179 F=I
8783 180 F=X
8784 181 Br=Br
8785 182 Br=Si
8786 183 Br=I
8787 184 Br=X
8788 185 Si=Si
8789 186 Si=I
8790 187 Si=X
8791 188 I=I
8792 189 I=X
8793 190 X=X
8794 191 C#C
8795 192 C#N
8796 193 C#O
8797 194 C#S
8798 195 C#Cl
8799 196 C#P
8800 197 C#F
8801 198 C#Br
8802 199 C#Si
8803 200 C#I
8804 201 C#X
8805 202 N#N
8806 203 N#O
8807 204 N#S
8808 205 N#Cl
8809 206 N#P
8810 207 N#F
8811 208 N#Br
8812 209 N#Si
8813 210 N#I
8814 211 N#X
8815 212 O#O
8816 213 O#S
8817 214 O#Cl
8818 215 O#P
8819 216 O#F
8820 217 O#Br
8821 218 O#Si
8822 219 O#I
8823 220 O#X
8824 221 S#S
8825 222 S#Cl
8826 223 S#P
8827 224 S#F
8828 225 S#Br
8829 226 S#Si
8830 227 S#I
8831 228 S#X
8832 229 Cl#Cl
8833 230 Cl#P
8834 231 Cl#F
8835 232 Cl#Br
8836 233 Cl#Si
8837 234 Cl#I
8838 235 Cl#X
8839 236 P#P
8840 237 P#F
8841 238 P#Br
8842 239 P#Si
8843 240 P#I
8844 241 P#X
8845 242 F#F
8846 243 F#Br
8847 244 F#Si
8848 245 F#I
8849 246 F#X
8850 247 Br#Br
8851 248 Br#Si
8852 249 Br#I
8853 250 Br#X
8854 251 Si#Si
8855 252 Si#I
8856 253 Si#X
8857 254 I#I
8858 255 I#X
8859 256 X#X
8860 257 C$C
8861 258 C$N
8862 259 C$O
8863 260 C$S
8864 261 C$Cl
8865 262 C$P
8866 263 C$F
8867 264 C$Br
8868 265 C$Si
8869 266 C$I
8870 267 C$X
8871 268 N$N
8872 269 N$O
8873 270 N$S
8874 271 N$Cl
8875 272 N$P
8876 273 N$F
8877 274 N$Br
8878 275 N$Si
8879 276 N$I
8880 277 N$X
8881 278 O$O
8882 279 O$S
8883 280 O$Cl
8884 281 O$P
8885 282 O$F
8886 283 O$Br
8887 284 O$Si
8888 285 O$I
8889 286 O$X
8890 287 S$S
8891 288 S$Cl
8892 289 S$P
8893 290 S$F
8894 291 S$Br
8895 292 S$Si
8896 293 S$I
8897 294 S$X
8898 295 Cl$Cl
8899 296 Cl$P
8900 297 Cl$F
8901 298 Cl$Br
8902 299 Cl$Si
8903 300 Cl$I
8904 301 Cl$X
8905 302 P$P
8906 303 P$F
8907 304 P$Br
8908 305 P$Si
8909 306 P$I
8910 307 P$X
8911 308 F$F
8912 309 F$Br
8913 310 F$Si
8914 311 F$I
8915 312 F$X
8916 313 Br$Br
8917 314 Br$Si
8918 315 Br$I
8919 316 Br$X
8920 317 Si$Si
8921 318 Si$I
8922 319 Si$X
8923 320 I$I
8924 321 I$X
8925 322 X$X
8926
8927 =item B<SetSize>
8928
8929 $MACCSKeys->SetSize($Size);
8930
8931 Sets size of MACCS keys and returns I<MACCSKeys>. Possible values: I<166 or 322>.
8932
8933 =item B<SetType>
8934
8935 $MACCSKeys->SetType($Type);
8936
8937 Sets type of MACCS keys and returns I<MACCSKeys>. Possible values: I<MACCSKeysBits or
8938 MACCSKeysCount>.
8939
8940 =item B<StringifyMACCSKeys>
8941
8942 $String = $MACCSKeys->StringifyMACCSKeys();
8943
8944 Returns a string containing information about I<MACCSKeys> object.
8945
8946 =back
8947
8948 =head1 AUTHOR
8949
8950 Manish Sud <msud@san.rr.com>
8951
8952 =head1 SEE ALSO
8953
8954 Fingerprints.pm, FingerprintsStringUtil.pm, AtomNeighborhoodsFingerprints.pm,
8955 AtomTypesFingerprints.pm, EStateIndiciesFingerprints.pm, ExtendedConnectivityFingerprints.pm,
8956 PathLengthFingerprints.pm, TopologicalAtomPairsFingerprints.pm, TopologicalAtomTripletsFingerprints.pm,
8957 TopologicalAtomTorsionsFingerprints.pm, TopologicalPharmacophoreAtomPairsFingerprints.pm,
8958 TopologicalPharmacophoreAtomTripletsFingerprints.pm
8959
8960 =head1 COPYRIGHT
8961
8962 Copyright (C) 2015 Manish Sud. All rights reserved.
8963
8964 This file is part of MayaChemTools.
8965
8966 MayaChemTools is free software; you can redistribute it and/or modify it under
8967 the terms of the GNU Lesser General Public License as published by the Free
8968 Software Foundation; either version 3 of the License, or (at your option)
8969 any later version.
8970
8971 =cut