annotate cpt_psm_plotter/lib/CPT/Util/CRC64.pm @ 0:54c7a3ea81e2 draft

Uploaded
author cpt
date Tue, 05 Jul 2022 05:40:36 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
1 package CPT::Util::CRC64;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
2
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
3 # This was taken from Bio::GMOD::Bulkfiles::SWISS_CRC64
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
4
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
5 use Moose;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
6 use strict;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
7 use warnings;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
8 use autodie;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
9
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
10
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
11 has 'POLY64REVh' => ( is => 'ro', isa => 'Any', default => 0xd8000000 );
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
12 has 'CRCTableh' => ( is => 'rw', isa => 'ArrayRef', default => sub { [] });
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
13 has 'CRCTablel' => ( is => 'rw', isa => 'ArrayRef', default => sub { [] });
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
14 has 'initialized' => ( is => 'rw', isa => 'Bool', default => 0 );
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
15 has 'size' => ( is => 'rw', isa => 'Int' );
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
16 has 'crcl' => (is => 'rw', isa => 'Any', default => 0);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
17 has 'crch' => (is => 'rw', isa => 'Any', default => 0);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
18
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
19 sub add {
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
20 my ($self, $sequence) = @_;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
21 my $crcl = $self->crcl();
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
22 my $crch = $self->crch();
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
23 my $size = $self->size();
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
24 my @CRCTableh = @{$self->CRCTableh()};
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
25 my @CRCTablel = @{$self->CRCTablel()};
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
26
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
27 foreach (split //, $sequence){
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
28 my $shr = ($crch & 0xFF) << 24;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
29 my $temp1h = $crch >> 8;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
30 my $temp1l = ($crcl >> 8) | $shr;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
31 my $tableindex = ($crcl ^ (unpack "C", $_)) & 0xFF;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
32 $crch = $temp1h ^ $CRCTableh[$tableindex];
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
33 $crcl = $temp1l ^ $CRCTablel[$tableindex];
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
34 $size++;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
35 }
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
36 $self->crcl($crcl);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
37 $self->crch($crch);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
38 $self->size($size);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
39 }
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
40
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
41 sub hexsum {
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
42 my ($self) = @_;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
43 my $crcl = $self->crcl();
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
44 my $crch = $self->crch();
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
45 return sprintf("%08X%08X", $crch, $crcl);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
46 }
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
47
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
48 sub init {
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
49 my ($self) = @_;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
50 $self->crcl(0);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
51 $self->crch(0);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
52 $self->size(0);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
53 my @h;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
54 my @l;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
55 my $POLY64REVh = $self->POLY64REVh();
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
56 if(! $self->initialized() ){
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
57 $self->initialized(1);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
58 for (my $i=0; $i<256; $i++) {
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
59 my $partl = $i;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
60 my $parth = 0;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
61 for (my $j=0; $j<8; $j++) {
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
62 my $rflag = $partl & 1;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
63 $partl >>= 1;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
64 $partl |= (1 << 31) if $parth & 1;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
65 $parth >>= 1;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
66 $parth ^= $POLY64REVh if $rflag;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
67 }
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
68 $h[$i] = $parth;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
69 $l[$i] = $partl;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
70 }
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
71 $self->CRCTableh(\@h);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
72 $self->CRCTablel(\@l);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
73 }
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
74 }
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
75
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
76 sub crc64 {
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
77 my ($self, $sequence) = @_;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
78 $self->init();
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
79 $self->add($sequence);
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
80 return $self->hexsum();
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
81 }
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
82
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
83 no Moose;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
84
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
85 1;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
86
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
87 __END__
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
88
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
89 =pod
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
90
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
91 =encoding UTF-8
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
92
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
93 =head1 NAME
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
94
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
95 CPT::Util::CRC64
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
96
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
97 =head1 VERSION
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
98
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
99 version 1.99.4
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
100
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
101 =head1 CRC64 perl module documentation
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
102
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
103 =head2 NAME
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
104
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
105 CRC64 - Calculate the cyclic redundancy check.
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
106
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
107 =head2 SYNOPSIS
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
108
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
109 use CPT::Util::CRC64;
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
110
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
111 my $crc = CPT::Util::CRC64->new();
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
112 $crc = $crc->add("IHATEMATH");
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
113 #returns the string "E3DCADD69B01ADD1"
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
114
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
115 =head2 DESCRIPTION
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
116
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
117 SWISS-PROT + TREMBL use a 64-bit Cyclic Redundancy Check for the
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
118 amino acid sequences.
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
119
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
120 The algorithm to compute the CRC is described in the ISO 3309
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
121 standard. The generator polynomial is x64 + x4 + x3 + x + 1.
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
122 Reference: W. H. Press, S. A. Teukolsky, W. T. Vetterling, and B. P.
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
123 Flannery, "Numerical recipes in C", 2nd ed., Cambridge University
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
124 Press. Pages 896ff.
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
125
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
126 =head2 Functions
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
127
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
128 =over
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
129
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
130 =item crc64 string
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
131
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
132 Calculate the CRC64 (cyclic redundancy checksum) for B<string>.
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
133
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
134 In array context, returns two integers equal to the higher and lower
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
135 32 bits of the CRC64. In scalar context, returns a 16-character string
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
136 containing the CRC64 in hexadecimal format.
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
137
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
138 =back
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
139
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
140 =head1 AUTHOR
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
141
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
142 Alexandre Gattiker, gattiker@isb-sib.ch
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
143
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
144 Eric Rasche <rasche.eric@yandex.ru> (reworte for CPT framework)
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
145
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
146 =head1 ACKNOWLEDGEMENTS
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
147
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
148 Based on SPcrc, a C implementation by Christian Iseli, available at
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
149 ftp://ftp.ebi.ac.uk/pub/software/swissprot/Swissknife/old/SPcrc.tar.gz
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
150
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
151 =head1 AUTHOR
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
152
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
153 Eric Rasche <rasche.eric@yandex.ru>
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
154
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
155 =head1 COPYRIGHT AND LICENSE
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
156
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
157 This software is Copyright (c) 2014 by Eric Rasche.
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
158
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
159 This is free software, licensed under:
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
160
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
161 The GNU General Public License, Version 3, June 2007
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
162
54c7a3ea81e2 Uploaded
cpt
parents:
diff changeset
163 =cut