///|
pub fn select_info_fields(
record : VcfRecord,
keys : Array[String],
) -> VcfRecord {
let selected : Array[(String, VcfValue)] = []
for key in keys {
for pair in record.info {
let (item_key, value) = pair
if item_key == key {
selected.push((item_key, value))
break
}
}
}
{
chrom: record.chrom,
pos: record.pos,
ids: record.ids,
ref_allele: record.ref_allele,
alt_alleles: record.alt_alleles,
qual: record.qual,
filters: record.filters,
info: selected,
format_keys: record.format_keys,
samples: record.samples,
}
}
///|
pub fn select_document_samples(
document : VcfDocument,
names : Array[String],
) -> VcfDocument raise ParseError {
let indexes : Array[Int] = []
for wanted in names {
let mut found : Int? = None
for index, name in document.header.samples {
if name == wanted {
found = Some(index)
}
}
match found {
Some(index) => indexes.push(index)
None =>
raise ParseError::InvalidHeader(
line=0,
column=1,
message="unknown sample: {wanted}",
)
}
}
let columns = if document.header.columns.length() > 9 {
let base = document.header.columns[:9].to_owned()
for name in names {
base.push(name)
}
base
} else {
document.header.columns
}
let header = VcfHeader::{
fileformat: document.header.fileformat,
meta: document.header.meta,
columns,
samples: names,
}
let records = document.records.map(fn(record) {
let samples : Array[SampleCall] = []
for index in indexes {
if index < record.samples.length() {
samples.push(record.samples[index])
}
}
{
chrom: record.chrom,
pos: record.pos,
ids: record.ids,
ref_allele: record.ref_allele,
alt_alleles: record.alt_alleles,
qual: record.qual,
filters: record.filters,
info: record.info,
format_keys: record.format_keys,
samples,
}
})
{ header, records }
}