use crate::general::{ObjectId, UserObject};
use crate::seqloc::{NaStrand, SeqId, SeqLoc};
use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
pub type SeqAlignSet = Vec<SeqAlign>;
#[derive(Clone, Serialize_repr, Deserialize_repr, PartialEq, Debug)]
#[repr(u8)]
pub enum SeqAlignType {
NotSet,
Global,
Diags,
Partial,
Disc,
Other = 255,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "lowercase")]
pub enum SeqAlignSegs {
DenDiag(Vec<DenseDiag>),
DenSeg(DenseSeg),
Std(Vec<StdSeg>),
Packed(PackedSeg),
Disc(SeqAlignSet),
Spliced(SplicedSeg),
Sparse(SparseSeg),
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct SeqAlign {
#[serde(rename = "type")]
pub r#type: SeqAlignType,
pub dim: Option<u64>,
pub score: Option<Vec<Score>>,
pub segs: SeqAlignSegs,
pub bounds: Option<Vec<SeqLoc>>,
pub id: Option<Vec<ObjectId>>,
pub ext: Option<Vec<UserObject>>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct DenseDiag {
pub dim: u64,
pub ids: Vec<SeqId>,
pub starts: Vec<u64>,
pub len: u64,
pub strands: Option<Vec<NaStrand>>,
pub scores: Option<Vec<Score>>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct DenseSeg {
pub dim: u64,
pub numseg: u64,
pub ids: Vec<SeqId>,
pub starts: Vec<u64>,
pub lens: Vec<u64>,
pub strands: Option<Vec<NaStrand>>,
pub scores: Option<Vec<Score>>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct PackedSeg {
pub dim: u64,
pub numseg: u64,
pub ids: Vec<SeqId>,
pub starts: Vec<u64>,
pub present: Vec<u8>,
pub lens: Vec<u64>,
pub strands: Option<Vec<NaStrand>>,
pub scores: Option<Vec<Score>>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct StdSeg {
pub dim: u64,
pub ids: Option<Vec<SeqId>>,
pub loc: Vec<SeqLoc>,
pub scores: Option<Vec<Score>>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "lowercase")]
pub enum SplicedSegProduct {
Transcript,
Protein,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct SplicedSeg {
pub product_id: Option<SeqId>,
pub genomic_id: Option<SeqId>,
pub product_strand: Option<NaStrand>,
pub genomic_strand: Option<NaStrand>,
pub product_type: SplicedSegProduct,
pub exons: Vec<SplicedExon>,
pub poly_a: Option<i64>,
pub product_length: Option<u64>,
pub modifiers: Option<Vec<SplicedSegModifier>>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub enum SplicedSegModifier {
StartCodonFound(bool),
StopCodonFound(bool),
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct SplicedExon {
pub product_start: ProductPos,
pub product_end: ProductPos,
pub genomic_start: i64,
pub genomic_end: i64,
pub product_id: Option<SeqId>,
pub genomic_id: Option<SeqId>,
pub product_strand: Option<NaStrand>,
pub genomic_strand: Option<NaStrand>,
pub parts: Option<Vec<SplicedExonChunk>>,
pub scores: Option<ScoreSet>,
pub acceptor_before_exon: Option<SpliceSite>,
pub donor_after_exon: Option<SpliceSite>,
pub partial: Option<bool>,
pub ext: Option<Vec<UserObject>>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "lowercase")]
pub enum ProductPos {
NucPos(u64),
ProtPos(ProtPos),
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct ProtPos {
pub amin: u64,
pub frame: usize,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub enum SplicedExonChunk {
Match(u64),
Mismatch(u64),
Diag(u64),
ProductIns(u64),
GenomicIns(u64),
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct SpliceSite {
pub bases: String,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct SparseSeg {
pub master_id: Option<SeqId>,
pub rows: Vec<SparseAlign>,
pub row_scores: Option<Vec<Score>>,
pub ext: Option<Vec<SparseSegExt>>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "kebab-case")]
pub struct SparseAlign {
pub first_id: SeqId,
pub second_id: SeqId,
pub numseg: u64,
pub first_starts: Vec<u64>,
pub second_starts: Vec<u64>,
pub lens: Vec<u64>,
pub second_strands: Option<Vec<NaStrand>>,
pub seg_scores: Option<Vec<Score>>,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct SparseSegExt {
pub index: u64,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
#[serde(rename_all = "lowercase")]
pub enum ScoreValue {
Real(f64),
Int(i64),
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Debug)]
pub struct Score {
pub id: Option<ObjectId>,
pub value: ScoreValue,
}
pub type ScoreSet = Vec<Score>;