comparison lib/Fingerprints/Fingerprints.pm @ 0:4816e4a8ae95 draft default tip

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 09:23:18 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4816e4a8ae95
1 package Fingerprints::Fingerprints;
2 #
3 # $RCSfile: Fingerprints.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 Scalar::Util ();
33 use ObjectProperty;
34 use MathUtil ();
35 use TextUtil ();
36 use Fingerprints::FingerprintsBitVector;
37 use Fingerprints::FingerprintsVector;
38
39 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
40
41 @ISA = qw(ObjectProperty Exporter);
42 @EXPORT = qw();
43 @EXPORT_OK = qw();
44
45 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]);
46
47 # Setup class variables...
48 my($ClassName);
49 _InitializeClass();
50
51 # Class constructor...
52 sub new {
53 my($Class, %NamesAndValues) = @_;
54
55 # Initialize object...
56 my $This = {};
57 bless $This, ref($Class) || $Class;
58 $This->_InitializeFingerprints();
59
60 $This->_InitializeFingerprintsProperties(%NamesAndValues);
61
62 return $This;
63 }
64
65 # Initialize object data...
66 #
67 sub _InitializeFingerprints {
68 my($This) = @_;
69
70 # Molecule object...
71 $This->{Molecule} = '';
72
73 # Type of fingerprints...
74 $This->{Type} = '';
75
76 # Type of fingerprints vector: FingerprintsBitVector or FingerprintsVector...
77 $This->{VectorType} = '';
78
79 # Marks successful generation of fingerprints...
80 $This->{FingerprintsGenerated} = 0;
81
82 # Initialize values for FingerprintsBitVector...
83 _InitializeClassValuesForFingerprintsBitVector();
84
85 # Initialize values for FingerprintsVector...
86 _InitializeClassValuesForFingerprintsVector();
87 }
88
89 # Initialize class ...
90 sub _InitializeClass {
91 #Class name...
92 $ClassName = __PACKAGE__;
93 }
94
95 # Initialize class values specific to FingerprintsBitVector...
96 #
97 sub _InitializeClassValuesForFingerprintsBitVector {
98 my($This) = @_;
99
100 # Size of FingerprintsBitVector...
101 $This->{Size} = '';
102
103 # Min/Max sizes used for folding FingerprintsBitVector...
104 $This->{MinSize} = '';
105 $This->{MaxSize} = '';
106
107 # FingerprintsBitVector...
108 $This->{FingerprintsBitVector} = '';
109 }
110
111 # Initialize class values specific to FingerprintsVector...
112 #
113 sub _InitializeClassValuesForFingerprintsVector {
114 my($This) = @_;
115
116 # Types of FingerprintsVector values: OrderedNumericalValues, NumericalValues or AlphaNumericalValues.
117 $This->{FingerprintsVectorType} = '';
118
119 # Fingerprints vector...
120 $This->{FingerprintsVector} = '';
121 }
122
123 # Initialize object properties....
124 sub _InitializeFingerprintsProperties {
125 my($This, %NamesAndValues) = @_;
126
127 my($Name, $Value, $MethodName);
128 while (($Name, $Value) = each %NamesAndValues) {
129 $MethodName = "Set${Name}";
130 $This->$MethodName($Value);
131 }
132
133 return $This;
134 }
135
136 # Set molecule object and make sure it's not already set...
137 #
138 sub SetMolecule {
139 my($This, $Molecule) = @_;
140
141 if ($This->{Molecule}) {
142 croak "Error: ${ClassName}->SetMolecule: Can't change molecule object: It's already set...";
143 }
144 $This->{Molecule} = $Molecule;
145
146 # Weaken the reference to disable increment of reference count...
147 Scalar::Util::weaken($This->{Molecule});
148
149 return $This;
150 }
151
152 # Set type and make sure it's not already set...
153 #
154 sub SetType {
155 my($This, $Type) = @_;
156
157 if ($This->{Type}) {
158 croak "Error: ${ClassName}->SetType: Can't change fingerprint type: It's already set...";
159 }
160 $This->{Type} = $Type;
161
162 return $This;
163 }
164
165 # Is fingerprints generation successful?
166 #
167 # Notes:
168 # . The specific fingerprints generation class sets the value of FingerprinsGenerated
169 # to 1 after the successful generation of fingerprints; otherwise, it's set to 0.
170 #
171 sub IsFingerprintsGenerationSuccessful {
172 my($This) = @_;
173
174 return $This->{FingerprintsGenerated} ? 1 : 0;
175 }
176
177 # Set vector type and make sure it's not already set...
178 #
179 sub SetVectorType {
180 my($This, $VectorType) = @_;
181
182 if ($This->{VectorType}) {
183 croak "Error: ${ClassName}->SetVectorType: Can't change fingerprint vector type: It's already set...";
184 }
185 if ($VectorType !~ /^(FingerprintsBitVector|FingerprintsVector)$/i) {
186 croak "Error: ${ClassName}->SetVectorType: Specified value, $VectorType, for Type is not vaild. Supported types in current release of MayaChemTools: FingerprintsBitVector and FingerprintsVector...";
187 }
188 $This->{VectorType} = $VectorType;
189
190 return $This;
191 }
192
193 #
194 # Methods/functions for FingerprintsBitVector...
195 #
196
197 # Initialize fingerprint bit vector...
198 sub _InitializeFingerprintsBitVector {
199 my($This) = @_;
200
201 if ($This->{VectorType} !~ /^FingerprintsBitVector$/i) {
202 croak "Error: ${ClassName}->_InitializeFingerprintsBitVector: Can't initialize fingerprints bit vector: VectorType must be FingerprintsBitVector...";
203 }
204
205 if ($This->{Size}) {
206 $This->{FingerprintsBitVector} = new Fingerprints::FingerprintsBitVector($This->{Size});
207 }
208 return $This;
209 }
210
211 # Set size...
212 #
213 sub SetSize {
214 my($This, $Size) = @_;
215
216 if ($This->{MinSize} && $Size < $This->{MinSize}) {
217 croak "Error: ${ClassName}->SetSize: Fingerprint size value, $Size, is not valid : It must be >= $This->{MinSize}...";
218 }
219 if ($This->{MaxSize} && $Size > $This->{MaxSize}) {
220 croak "Error: ${ClassName}->SetSize: Fingerprint size value, $Size, is not valid: It must be <= $This->{MaxSize}...";
221 }
222
223 $This->{Size} = $Size;
224
225 return $This;
226 }
227
228 # Set FingerprintsBitVector object and make sure it's not already set...
229 #
230 sub SetFingerprintsBitVector {
231 my($This, $FingerprintsBitVector) = @_;
232
233 if ($This->{FingerprintsBitVector}) {
234 croak "Error: ${ClassName}->SetFingerprintsBitVector: Can't change FingerprintsBitVector object: It's already set...";
235 }
236 $This->{FingerprintsBitVector} = $FingerprintsBitVector;
237
238 return $This;
239 }
240
241 # Fold fingerprints by recursively reducing its size by half untill bit density is greater than or equal to
242 # specified bit density...
243 #
244 sub FoldFingerprintsByBitDensity {
245 my($This, $BitDensity) = @_;
246
247 if (!($BitDensity >= 0 && $BitDensity <= 1)) {
248 croak "Error: ${ClassName}->FoldFingerprintsByBitDensity: Specified bit density, $BitDensity, is not valid: It must be > 0 && <= 1 ...";
249 }
250
251 return $This->_FoldFingerprintsBitVector('ByDensity', $BitDensity);
252 }
253
254 # Fold fingerprints by recursively reducing its size by half untill size is less than or equal to
255 # specified size...
256 #
257 sub FoldFingerprintsBySize {
258 my($This, $Size, $CheckSizeValue) = @_;
259
260 if (!defined $CheckSizeValue) {
261 $CheckSizeValue = 1;
262 }
263
264 if ($CheckSizeValue) {
265 if (!TextUtil::IsPositiveInteger($Size)) {
266 croak "Error: ${ClassName}->FoldFingerprintsBySize: Specified size, $Size, is not valid: It must be a positive integer";
267 }
268 if (!($Size >= $This->{MinSize} && $Size < $This->{Size})) {
269 croak "Error: ${ClassName}->FoldFingerprintsBySize: Specified size, $Size, is not valid: It must be greater than or equal to minimum size of $This->{MinSize} and less than current size of $This->{Size}...";
270 }
271 if (!TextUtil::IsNumberPowerOfNumber($Size, 2)) {
272 croak "Error: ${ClassName}->FoldFingerprintsBySize: Specified size value, $Size, must be power of 2...";
273 }
274 }
275
276 return $This->_FoldFingerprintsBitVector('BySize', $Size);
277 }
278
279 # Fold fingerprints bit vector using specified size of bit density...
280 #
281 sub _FoldFingerprintsBitVector {
282 my($This, $Mode, $Value) = @_;
283
284 if (!$This->{FingerprintsBitVector}) {
285 return $This;
286 }
287 my($FingerprintsBitVector, $FoldedFingerprintsBitVector);
288
289 $FoldedFingerprintsBitVector = '';
290 $FingerprintsBitVector = $This->{FingerprintsBitVector};
291 MODE: {
292 if ($Mode =~ /^BySize$/i) { $FoldedFingerprintsBitVector = $FingerprintsBitVector->FoldFingerprintsBitVectorBySize($Value); last MODE; }
293 if ($Mode =~ /^ByDensity$/i) { $FoldedFingerprintsBitVector = $FingerprintsBitVector->FoldFingerprintsBitVectorByDensity($Value); last MODE; }
294 $FoldedFingerprintsBitVector = '';
295 }
296 if ($FoldedFingerprintsBitVector) {
297 $This->{FingerprintsBitVector} = $FoldedFingerprintsBitVector;
298 $This->{Size} = $FoldedFingerprintsBitVector->GetSize();
299 }
300 return $This;
301 }
302
303 # Get fingerprints as a binary ascii string containing 0s and 1s...
304 #
305 sub GetFingerprintBitsAsBinaryString {
306 my($This, $BitOrder) = @_;
307
308 return $This->_GetFingerprintBitsAsString('Binary', $BitOrder);
309 }
310
311 # Get fingerprints as a hexadecimal string...
312 #
313 sub GetFingerprintBitsAsHexadecimalString {
314 my($This, $BitOrder) = @_;
315
316 return $This->_GetFingerprintBitsAsString('Hexadecimal', $BitOrder);
317 }
318
319 # Get fingerprints as a raw binary string containing packed bit values for each
320 # byte...
321 #
322 sub GetFingerprintBitsAsRawBinaryString {
323 my($This, $BitOrder) = @_;
324
325 return $This->_GetFingerprintBitsAsString('RawBinary', $BitOrder);
326 }
327
328 # Get fingerprint bits as a string...
329 #
330 sub _GetFingerprintBitsAsString {
331 my($This, $Format) = @_;
332
333 if (!$This->{FingerprintsBitVector}) {
334 return undef;
335 }
336 FORMAT : {
337 if ($Format =~ /^(Binary|Bin|BinaryString)$/i) { return $This->{FingerprintsBitVector}->GetBitsAsBinaryString(); last FORMAT; }
338 if ($Format =~ /^(Hexadecimal|Hex|HexadecimalString)$/i) { return $This->{FingerprintsBitVector}->GetBitsAsHexadecimalString(); last FORMAT; }
339 if ($Format =~ /^(RawBinary|RawBin|RawBinaryString)$/i) { return $This->{FingerprintsBitVector}->GetBitsAsRawBinaryString(); last FORMAT; }
340 croak "Error: ${ClassName}->_GetFingerprintBitsAsString: Specified bit vector string format, $Format, is not supported. Value values: Binary, Bin, BinaryString, Hexdecimal, Hex, HexadecimalString, RawBinary, RawBin, RawBinaryString...";
341 }
342 return undef;
343 }
344
345 #
346 # Methods/functions for FingerprintsVector...
347 #
348
349 # Initialize fingerprint vector...
350 sub _InitializeFingerprintsVector {
351 my($This) = @_;
352
353 if ($This->{VectorType} !~ /^FingerprintsVector$/i) {
354 croak "Error: ${ClassName}->_InitializeFingerprintsVector: Can't initialize fingerprints vector: VectorType must be FingerprintsVector...";
355 }
356
357 if ($This->{FingerprintsVectorType}) {
358 $This->{FingerprintsVector} = new Fingerprints::FingerprintsVector('Type' => $This->{FingerprintsVectorType});
359 }
360 return $This;
361 }
362
363 # Set FingerprintsVector object and make sure it's not already set...
364 #
365 sub SetFingerprintsVector {
366 my($This, $FingerprintsVector) = @_;
367
368 if ($This->{FingerprintsVector}) {
369 croak "Error: ${ClassName}->SetFingerprintsVector: Can't change FingerprintsVector object: It's already set...";
370 }
371 $This->{FingerprintsVector} = $FingerprintsVector;
372
373 return $This;
374 }
375
376 # Types of FingerprintsVector values: OrderedNumericalValues, NumericalValues or AlphaNumericalValues.
377 #
378 sub SetFingerprintsVectorType {
379 my($This, $FingerprintsVectorType) = @_;
380
381 if ($This->{FingerprintsVectorType}) {
382 croak "Error: ${ClassName}->SetFingerprintsVector: Can't change FingerprintsVectorType: It's already set...";
383 }
384 if ($FingerprintsVectorType !~ /^(OrderedNumericalValues|NumericalValues|AlphaNumericalValues)$/i) {
385 croak "Error: ${ClassName}->SetFingerprintsVectorType: Specified value, $FingerprintsVectorType, for Type is not vaild. Supported types in current release of MayaChemTools: OrderedNumericalValues, NumericalValues or AlphaNumericalValues";
386 }
387 $This->{FingerprintsVectorType} = $FingerprintsVectorType;
388
389 return $This;
390 }
391
392 # Get fingerprints vector values as an array or reference to an array...
393 #
394 sub GetFingerprintsVectorValues {
395 my($This) = @_;
396
397 if (!$This->{FingerprintsVector}) {
398 return undef;
399 }
400 return $This->{FingerprintsVector}->GetValues();
401 }
402
403 # Get fingerprints vector value IDs as an array or reference to an array...
404 #
405 sub GetFingerprintsVectorValueIDs {
406 my($This) = @_;
407
408 if (!$This->{FingerprintsVector}) {
409 return undef;
410 }
411 return $This->{FingerprintsVector}->GetValueIDs();
412 }
413
414 1;
415
416 __END__
417
418 =head1 NAME
419
420 Fingerprints - Fingerprints class
421
422 =head1 SYNOPSIS
423
424 use Fingerprints::Fingerprints;
425
426 use Fingerprints::Fingerprints qw(:all);
427
428 =head1 DESCRIPTION
429
430 B<Fingerprints> class provides the following methods:
431
432 new, FoldFingerprintsByBitDensity, FoldFingerprintsBySize,
433 GetFingerprintBitsAsBinaryString, GetFingerprintBitsAsHexadecimalString,
434 GetFingerprintBitsAsRawBinaryString, GetFingerprintsVectorValueIDs,
435 GetFingerprintsVectorValues, IsFingerprintsGenerationSuccessful,
436 SetFingerprintsBitVector, SetFingerprintsVector, SetFingerprintsVectorType,
437 SetMolecule, SetSize, SetType, SetVectorType
438
439 B<Fingerprints> class is used as a base class for various specific fingerprint classes such as
440 B<AtomNeighborhoodsFingerprints>, B<AtomTypesFingerprints>, B<EStateIndiciesFingerprints>,
441 B<PathLengthFingerprints>, B<ExtendedConnectivityFingerprints>, B<MACCSKeys> and so on.
442 It implements functionality common to fingerprint classes.
443
444 B<Fingerprints> class is derived from B<ObjectProperty> base class which provides methods not
445 explicitly defined in B<Fingerprints> or B<ObjectProperty> classes using Perl's AUTOLOAD functionality.
446 These methods are generated on-the-fly for a specified object property:
447
448 Set<PropertyName>(<PropertyValue>);
449 $PropertyValue = Get<PropertyName>();
450 Delete<PropertyName>();
451
452 B<Fingerprints> class uses B<FingerprintsBitVector> class to provide bits manipulation functionality.
453
454 =head2 METHODS
455
456 =over 4
457
458 =item B<new>
459
460 $NewFingerprints = new Fingerprints(%NamesAndValues);
461
462 Using specified I<Fingerprints> property names and values hash, B<new> method creates a new object
463 and returns a reference to newly created B<Fingerprints> object. By default, following properties are
464 initialized:
465
466 Molecule = '';
467 Type = '';
468 VectorType = '';
469 Size = '';
470 MinSize = '';
471 MaxSize = '';
472 FingerprintsBitVector = '';
473 FingerprintsVectorType = '';
474 FingerprintsVector = '';
475
476 =item B<FoldFingerprintsByBitDensity>
477
478 $Fingerprints->FoldFingerprintsByBitDensity($BitDensity);
479
480 Folds fingerprints by recursively reducing its size by half until bit density is greater than or equal to
481 specified I<BitDensity> and returns I<Fingerprints>.
482
483 =item B<FoldFingerprintsBySize>
484
485 $Fingerprints->FoldFingerprintsBySize($Size, [$CheckSizeValue]);
486
487 Fold fingerprints by recursively reducing its size by half until size is less than or equal to specified
488 I<Size> and returns I<Fingerprints>. By default, value I<Size> is checked to make sure it's:
489
490 >= MinSize and < Size and IsPowerOfTwo
491
492 =item B<GetFingerprintBitsAsBinaryString>
493
494 $BinaryASCIIString =
495 $Fingerprints->GetFingerprintBitsAsBinaryString();
496
497 Returns fingerprints as a binary ASCII string containing 0s and 1s.
498
499 =item B<GetFingerprintBitsAsHexadecimalString>
500
501 $HexadecimalString =
502 $Fingerprints->GetFingerprintBitsAsHexadecimalString();
503
504 Returns fingerprints as a hexadecimal string
505
506 =item B<GetFingerprintBitsAsRawBinaryString>
507
508 $RawBinaryString =
509 $Fingerprints->GetFingerprintBitsAsRawBinaryString();
510
511 Returns fingerprints as a raw binary string containing packed bit values for each byte.
512
513 =item B<GetFingerprintsVectorValueIDs>
514
515 $ValueIDsRef = $Fingerprints->GetFingerprintsVectorValueIDs();
516 @ValueIDs = $Fingerprints->GetFingerprintsVectorValueIDs();
517
518 Returns fingerprints vector value IDs as an array or reference to an array.
519
520 =item B<GetFingerprintsVectorValues>
521
522 $ValuesRef = $Fingerprints->GetFingerprintsVectorValues();
523 @Values = $Fingerprints->GetFingerprintsVectorValues();
524
525 Returns fingerprints vector values as an array or reference to an array.
526
527 =item B<IsFingerprintsGenerationSuccessful>
528
529 $Return = $Fingerprints->IsFingerprintsGenerationSuccessful();
530
531 Returns 1 or 0 based on whether fingerprints were successfully generated.
532
533 =item B<SetFingerprintsBitVector>
534
535 $Fingerprints->SetFingerprintsBitVector($FingerprintsBitVector);
536
537 Sets I<FingerprintsBitVector> object for I<Fingerprints> and returns I<Fingerprints>.
538
539 =item B<SetFingerprintsVector>
540
541 $Fingerprints->SetFingerprintsVector();
542
543 Sets I<FingerprintsVector> object for I<Fingerprints> and returns I<Fingerprints>.
544
545 =item B<SetFingerprintsVectorType>
546
547 $Fingerprints->SetFingerprintsVectorType($VectorType);
548
549 Sets I<FingerprintsVector> type for I<Fingerprints> and returns I<Fingerprints>. Possible
550 I<VectorType> values: I<OrderedNumericalValues, NumericalValues or AlphaNumericalValues>.
551
552 =item B<SetMolecule>
553
554 $Fingerprints->SetMolecule($Molecule);
555
556 Sets I<Molecule> object for I<Fingerprints> and returns I<Fingerprints>.
557
558 =item B<SetSize>
559
560 $Fingerprints->SetSize($Size);
561
562 Sets I<Size> of fingerprints and returns I<Fingerprints>.
563
564 =item B<SetType>
565
566 $Fingerprints->SetType($Type);
567
568 Sets I<Type> of fingerprints and returns I<Fingerprints>.
569
570 =item B<SetVectorType>
571
572 $Fingerprints->SetVectorType($Type);
573
574 Sets I<Type> of fingerprints vector and returns I<Fingerprints>. Possible I<Type> values:
575 I<FingerprintsBitVector or FingerprintsVector>.
576
577 =back
578
579 =head1 AUTHOR
580
581 Manish Sud <msud@san.rr.com>
582
583 =head1 SEE ALSO
584
585 FingerprintsStringUtil.pm, AtomNeighborhoodsFingerprints.pm, AtomTypesFingerprints.pm,
586 EStateIndiciesFingerprints.pm, ExtendedConnectivityFingerprints.pm, MACCSKeys.pm,
587 PathLengthFingerprints.pm, TopologicalAtomPairsFingerprints.pm, TopologicalAtomTripletsFingerprints.pm,
588 TopologicalAtomTorsionsFingerprints.pm, TopologicalPharmacophoreAtomPairsFingerprints.pm,
589 TopologicalPharmacophoreAtomTripletsFingerprints.pm
590
591 =head1 COPYRIGHT
592
593 Copyright (C) 2015 Manish Sud. All rights reserved.
594
595 This file is part of MayaChemTools.
596
597 MayaChemTools is free software; you can redistribute it and/or modify it under
598 the terms of the GNU Lesser General Public License as published by the Free
599 Software Foundation; either version 3 of the License, or (at your option)
600 any later version.
601
602 =cut