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