HsHTSLib-1.9.2: src/Bio/HTS/Internal.chs
{-# LANGUAGE ForeignFunctionInterface #-}
module Bio.HTS.Internal
( HTSFile
, withHTSFile
, htsOpen
, htsClose
-- * BGZF
, BGZF
, getBgzf
-- * Bam Header
, BamHdr
, bamHdrRead
, bamHdrWrite
, getHeaderText
, getHeaderSize
-- * Bam
, Bam1
, bamRead1
, bamWrite1
, bamChr
, bamEndpos
, bamIsRev
, bamGetSeq
, bamGetQual
, bamGetCigar
, bamGetAux
, bamGetLAux
, bamAuxGet
, bamAuxAppend
, bamMarkDup
) where
import Control.Exception (bracket)
import Foreign
import Foreign.C.Types
import Foreign.C.String
import System.IO (IOMode(..))
#include "htslib/sam.h"
#c
BGZF* get_bgzf(htsFile *h);
char* get_header_text(bam_hdr_t *hdr);
uint32_t get_header_size(bam_hdr_t *hdr);
char* bam_chr(bam_hdr_t *h, int32_t i);
int bam_is_rev_(bam1_t *b);
void bam_get_seq_(bam1_t *b, char *res, uint32_t l);
int bam_get_qual_(bam1_t *b, char *res, uint32_t l);
void bam_get_cigar_(bam1_t *b, int *num, char *str, uint32_t l);
uint8_t* bam_get_aux_(bam1_t *b);
int bam_get_l_aux_(bam1_t *b);
void bam_mark_dup(bam1_t *b);
#endc
-- | Opaque data representing the hts file.
data HTSFile
withHTSFile :: FilePath -> IOMode -> (Ptr HTSFile -> IO a) -> IO a
withHTSFile fl mode = bracket (htsOpen fl md) htsClose
where
md = case mode of
ReadMode -> "r"
WriteMode -> "wb"
_ -> error "Not a supported mode"
-- | Open a hts file.
{#fun hts_open as ^
{ withCString* `String'
, withCString* `String'
} -> `Ptr HTSFile' castPtr #}
-- | Close the hts file.
{#fun hts_close as ^ { castPtr `Ptr HTSFile'} -> `CInt' void- #}
--------------------------------------------------------------------------------
-- BGZF
--------------------------------------------------------------------------------
-- | Opaque data representing the Blocked GNU Zip Format (BGZF) used
-- by Bam.
data BGZF
-- | Get the location of BGZF block.
{#fun get_bgzf as ^ { castPtr `Ptr HTSFile' } -> `Ptr BGZF' castPtr #}
--------------------------------------------------------------------------------
-- BAM
--------------------------------------------------------------------------------
-- | Opaque data representing Bam type.
data Bam1
-- | Read one Bam record.
{#fun bam_read1 as ^ { castPtr `Ptr BGZF', castPtr `Ptr Bam1'} -> `CInt' #}
-- | Save one Bam record.
{#fun bam_write1 as ^ { castPtr `Ptr BGZF', castPtr `Ptr Bam1'} -> `CInt' #}
-- | Get chromosome.
{#fun bam_chr as ^ {castPtr `Ptr BamHdr', `Int'} -> `CString' #}
-- | Get end position.
{#fun bam_endpos as ^ {castPtr `Ptr Bam1'} -> `Int' #}
-- | Is reverse.
{#fun bam_is_rev_ as bamIsRev {castPtr `Ptr Bam1'} -> `Bool' #}
{#fun bam_get_seq_ as bamGetSeq {castPtr `Ptr Bam1', `CString', `Int' } -> `()' #}
{#fun bam_get_qual_ as bamGetQual {castPtr `Ptr Bam1', `CString', `Int' } -> `CInt' #}
{#fun bam_get_cigar_ as bamGetCigar
{ castPtr `Ptr Bam1', castPtr `Ptr CInt', `CString', `Int' } -> `()' #}
{#fun bam_get_aux_ as bamGetAux { castPtr `Ptr Bam1' } -> `Ptr ()' castPtr #}
{#fun bam_get_l_aux_ as bamGetLAux { castPtr `Ptr Bam1' } -> `Int' #}
{#fun bam_aux_get as ^ { castPtr `Ptr Bam1', `String'} -> `Ptr ()' castPtr #}
{#fun bam_aux_append as ^
{ castPtr `Ptr Bam1', `String', `Char', `Int', castPtr `Ptr ()'
} -> `CInt' #}
{#fun bam_mark_dup as ^ { castPtr `Ptr Bam1' } -> `()' #}
--------------------------------------------------------------------------------
-- BAM Header
--------------------------------------------------------------------------------
-- | Opaque data representing Bam header type.
data BamHdr
-- | Get the bam header.
{#fun bam_hdr_read as ^ { castPtr `Ptr BGZF' } -> `Ptr BamHdr' castPtr #}
-- | Save the bam header.
{#fun bam_hdr_write as ^ { castPtr `Ptr BGZF', castPtr `Ptr BamHdr' } -> `CInt' #}
{#fun get_header_text as ^ { castPtr `Ptr BamHdr' } -> `CString' #}
{#fun get_header_size as ^ { castPtr `Ptr BamHdr' } -> `Int' #}