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