diff lib/CPT/Util/CRC64.pm @ 1:97ef96676b48 draft

planemo upload commit 94b0cd1fff0826c6db3e7dc0c91c0c5a8be8bb0c
author cpt
date Mon, 05 Jun 2023 02:51:26 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/CPT/Util/CRC64.pm	Mon Jun 05 02:51:26 2023 +0000
@@ -0,0 +1,163 @@
+package CPT::Util::CRC64;
+
+# This was taken from Bio::GMOD::Bulkfiles::SWISS_CRC64
+
+use Moose;
+use strict;
+use warnings;
+use autodie;
+
+
+has 'POLY64REVh' => ( is => 'ro', isa => 'Any', default      => 0xd8000000 );
+has 'CRCTableh'  => ( is => 'rw', isa => 'ArrayRef', default => sub { [] });
+has 'CRCTablel'  => ( is => 'rw', isa => 'ArrayRef', default => sub { [] });
+has 'initialized' => ( is => 'rw', isa => 'Bool', default     => 0 );
+has 'size'       => ( is => 'rw', isa => 'Int' );
+has 'crcl' => (is => 'rw', isa => 'Any', default => 0);
+has 'crch' => (is => 'rw', isa => 'Any', default => 0);
+
+sub add {
+	my ($self, $sequence) = @_;
+	my $crcl = $self->crcl();
+	my $crch = $self->crch();
+	my $size = $self->size();
+	my @CRCTableh = @{$self->CRCTableh()};
+	my @CRCTablel = @{$self->CRCTablel()};
+
+	foreach (split //, $sequence){
+		my $shr = ($crch & 0xFF) << 24;
+		my $temp1h = $crch >> 8;
+		my $temp1l = ($crcl >> 8) | $shr;
+		my $tableindex = ($crcl ^ (unpack "C", $_)) & 0xFF;
+		$crch = $temp1h ^ $CRCTableh[$tableindex];
+		$crcl = $temp1l ^ $CRCTablel[$tableindex];
+		$size++;
+	}
+	$self->crcl($crcl);
+	$self->crch($crch);
+	$self->size($size);
+}
+
+sub hexsum {
+	my ($self) = @_;
+	my $crcl = $self->crcl();
+	my $crch = $self->crch();
+	return sprintf("%08X%08X", $crch, $crcl);
+}
+
+sub init {
+	my ($self) = @_;
+	$self->crcl(0);
+	$self->crch(0);
+	$self->size(0);
+	my @h;
+	my @l;
+	my $POLY64REVh = $self->POLY64REVh();
+	if(! $self->initialized() ){
+		$self->initialized(1);
+		for (my $i=0; $i<256; $i++) {
+			my $partl = $i;
+			my $parth = 0;
+			for (my $j=0; $j<8; $j++) {
+				my $rflag = $partl & 1;
+				$partl >>= 1;
+				$partl |= (1 << 31) if $parth & 1;
+				$parth >>= 1;
+				$parth ^= $POLY64REVh if $rflag;
+			}
+			$h[$i] = $parth;
+			$l[$i] = $partl;
+		}
+		$self->CRCTableh(\@h);
+		$self->CRCTablel(\@l);
+	}
+}
+
+sub crc64 {	
+	my ($self, $sequence) = @_;
+	$self->init();
+	$self->add($sequence);
+	return $self->hexsum();
+}
+
+no Moose;
+
+1;
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+CPT::Util::CRC64
+
+=head1 VERSION
+
+version 1.99.4
+
+=head1 CRC64 perl module documentation
+
+=head2 NAME
+
+CRC64 - Calculate the cyclic redundancy check.
+
+=head2 SYNOPSIS
+
+   use CPT::Util::CRC64;
+
+   my $crc = CPT::Util::CRC64->new();
+   $crc = $crc->add("IHATEMATH");
+   #returns the string "E3DCADD69B01ADD1"
+
+=head2 DESCRIPTION
+
+SWISS-PROT + TREMBL use a 64-bit Cyclic Redundancy Check for the
+amino acid sequences.
+
+The algorithm to compute the CRC is described in the ISO 3309
+standard.  The generator polynomial is x64 + x4 + x3 + x + 1.
+Reference: W. H. Press, S. A. Teukolsky, W. T. Vetterling, and B. P.
+Flannery, "Numerical recipes in C", 2nd ed., Cambridge University 
+Press. Pages 896ff.
+
+=head2 Functions
+
+=over
+
+=item crc64 string
+
+Calculate the CRC64 (cyclic redundancy checksum) for B<string>.
+
+In array context, returns two integers equal to the higher and lower
+32 bits of the CRC64. In scalar context, returns a 16-character string
+containing the CRC64 in hexadecimal format.
+
+=back
+
+=head1 AUTHOR
+
+Alexandre Gattiker, gattiker@isb-sib.ch
+
+Eric Rasche <rasche.eric@yandex.ru> (reworte for CPT framework)
+
+=head1 ACKNOWLEDGEMENTS
+
+Based on SPcrc, a C implementation by Christian Iseli, available at 
+ftp://ftp.ebi.ac.uk/pub/software/swissprot/Swissknife/old/SPcrc.tar.gz
+
+=head1 AUTHOR
+
+Eric Rasche <rasche.eric@yandex.ru>
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is Copyright (c) 2014 by Eric Rasche.
+
+This is free software, licensed under:
+
+  The GNU General Public License, Version 3, June 2007
+
+=cut