1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
//! CSI reference sequence bin and fields. mod chunk; pub use self::chunk::Chunk; use noodles_bgzf as bgzf; pub(crate) const METADATA_CHUNK_COUNT: u32 = 2; /// A CSI reference sequence bin. #[derive(Clone, Debug, Eq, PartialEq)] pub struct Bin { id: u32, loffset: bgzf::VirtualPosition, chunks: Vec<Chunk>, } impl Bin { /// Calculates the maximum bin ID. /// /// # Examples /// /// ``` /// use noodles_csi::index::reference_sequence::Bin; /// assert_eq!(Bin::max_id(5), 37449); /// ``` pub fn max_id(depth: i32) -> u32 { bin_limit(depth) as u32 } /// Calculates the metadata bin ID. /// /// # Examples /// /// ``` /// use noodles_csi::index::reference_sequence::Bin; /// assert_eq!(Bin::metadata_id(5), 37450); /// ``` pub fn metadata_id(depth: i32) -> u32 { Self::max_id(depth) + 1 } /// Creates a new bin. /// /// # Examples /// /// ``` /// use noodles_bgzf as bgzf; /// use noodles_csi::index::reference_sequence::Bin; /// let bin = Bin::new(10946, bgzf::VirtualPosition::default(), Vec::new()); /// ``` pub fn new(id: u32, loffset: bgzf::VirtualPosition, chunks: Vec<Chunk>) -> Self { Self { id, loffset, chunks, } } /// Returns the bin ID. /// /// # Examples /// /// ``` /// use noodles_bgzf as bgzf; /// use noodles_csi::index::reference_sequence::Bin; /// let bin = Bin::new(10946, bgzf::VirtualPosition::default(), Vec::new()); /// assert_eq!(bin.id(), 10946); /// ``` pub fn id(&self) -> u32 { self.id } /// Returns the last offset in the linear index. /// /// # Examples /// /// ``` /// use noodles_bgzf as bgzf; /// use noodles_csi::index::reference_sequence::Bin; /// let bin = Bin::new(10946, bgzf::VirtualPosition::default(), Vec::new()); /// assert_eq!(bin.loffset(), bgzf::VirtualPosition::default()); /// ``` pub fn loffset(&self) -> bgzf::VirtualPosition { self.loffset } /// Returns the list of chunks in the bin. /// /// # Examples /// /// ``` /// use noodles_bgzf as bgzf; /// use noodles_csi::index::reference_sequence::Bin; /// let bin = Bin::new(10946, bgzf::VirtualPosition::default(), Vec::new()); /// assert!(bin.chunks().is_empty()); /// ``` pub fn chunks(&self) -> &[Chunk] { &self.chunks } } // `CSIv1.pdf` (2020-07-21) fn bin_limit(depth: i32) -> i32 { assert!(depth <= 10); (1 << ((depth + 1) * 3)) / 7 }