package Bio::DB::Sam::Constants;

# $Id$

=head1 NAME

Bio::DB::Sam::Constants -- Constants for use with SAM/BAM

=head1 SYNOPSIS

 use Bio::DB::Sam::Constants;
 my $pad_flag = BAM_CPAD;

=head1 DESCRIPTION

This module exports several constants for use with the SAM/BAM
module. See the SAM documentation for their interpretation.

=over 4

=item Cigar operations

  BAM_CIGAR_SHIFT
  BAM_CIGAR_MASK
  BAM_CMATCH
  BAM_CINS
  BAM_CDEL
  BAM_CREF_SKIP
  BAM_CSOFT_CLIP
  BAM_CHARD_CLIP
  BAM_CPAD

=item FLAGS

A hashref that maps flag values to human-readable names. For example:

 FLAGS->{0x0008} == 'M_UNMAPPED'

=item RFLAGS

The reverse of FLAGS:

 FLAGS->{M_UNMAPPED} == 0x0008

=back

=head1 SEE ALSO

L<Bio::Perl>, L<Bio::DB::Sam>, L<Bio::DB::Bam::Alignment>

=head1 AUTHOR

Lincoln Stein E<lt>lincoln.stein@oicr.on.caE<gt>.
E<lt>lincoln.stein@bmail.comE<gt>

Copyright (c) 2009-2015 Ontario Institute for Cancer Research.

This package and its accompanying libraries are free software; you can
redistribute it and/or modify it under the terms of the Artistic
License 2.0, the Apache 2.0 License, or the GNU General Public License
(version 1 or higher).  Refer to LICENSE for the full license text.

=cut


use strict;

require Exporter;
our @ISA    = qw(Exporter);
our @EXPORT = qw(CIGAR_SYMBOLS BAM_CIGAR_SHIFT BAM_CIGAR_MASK
                 BAM_CMATCH BAM_CINS BAM_CDEL BAM_CREF_SKIP
                 BAM_CSOFT_CLIP BAM_CHARD_CLIP BAM_CPAD FLAGS RFLAGS);
our @EXPORT_OK = @EXPORT;

use constant CIGAR_SYMBOLS   => [qw(M I D N S H P = X)];
use constant BAM_CIGAR_SHIFT => 4;
use constant BAM_CIGAR_MASK  => (1 << BAM_CIGAR_SHIFT) - 1;
use constant BAM_CMATCH      => 0;
use constant BAM_CINS        => 1;
use constant BAM_CDEL        => 2;
use constant BAM_CREF_SKIP   => 3;
use constant BAM_CSOFT_CLIP  => 4;
use constant BAM_CHARD_CLIP  => 5;
use constant BAM_CPAD        => 6;

use constant FLAGS => {
    0x0001 => 'PAIRED',
    0x0002 => 'MAP_PAIR',
    0x0004 => 'UNMAPPED',
    0x0008 => 'M_UNMAPPED',
    0x0010 => 'REVERSED',
    0x0020 => 'M_REVERSED',
    0x0040 => 'FIRST_MATE',
    0x0080 => 'SECOND_MATE',
    0x0100 => 'NOT_PRIMARY',
    0x0200 => 'QC_FAILED',
    0x0400 => 'DUPLICATE',
    0x0800 => 'SUPPLEMENTARY',
};
use constant RFLAGS => {reverse %{FLAGS()}};

1;
