|
@@ -9,7 +9,7 @@ use std::{
|
|
|
use anyhow::Context;
|
|
use anyhow::Context;
|
|
|
// use bgzip::{BGZFReader, BGZFWriter};
|
|
// use bgzip::{BGZFReader, BGZFWriter};
|
|
|
use bitcode::{Decode, Encode};
|
|
use bitcode::{Decode, Encode};
|
|
|
-use csv::ReaderBuilder;
|
|
|
|
|
|
|
+use crate::io::tsv::TsvLine;
|
|
|
use dashmap::DashMap;
|
|
use dashmap::DashMap;
|
|
|
use log::{debug, error, info, warn};
|
|
use log::{debug, error, info, warn};
|
|
|
use rayon::prelude::*;
|
|
use rayon::prelude::*;
|
|
@@ -1789,30 +1789,32 @@ impl ExternalAnnotation {
|
|
|
// fs::remove_file(in_tmp)?;
|
|
// fs::remove_file(in_tmp)?;
|
|
|
|
|
|
|
|
// Parse echtvar output
|
|
// Parse echtvar output
|
|
|
- let mut reader = ReaderBuilder::new()
|
|
|
|
|
- .delimiter(b'\t')
|
|
|
|
|
- .has_headers(false)
|
|
|
|
|
- .comment(Some(b'#'))
|
|
|
|
|
- .flexible(true)
|
|
|
|
|
- .from_reader(get_reader(out_tmp.to_str().unwrap())?);
|
|
|
|
|
-
|
|
|
|
|
|
|
+ let mut echtvar_rdr = std::io::BufReader::new(
|
|
|
|
|
+ get_reader(out_tmp.to_str().unwrap())?
|
|
|
|
|
+ );
|
|
|
|
|
+ let mut echtvar_line = TsvLine::new();
|
|
|
let mut chunk_results = Vec::new();
|
|
let mut chunk_results = Vec::new();
|
|
|
- for (i, result) in reader.deserialize::<crate::io::vcf::VCFRow>().enumerate() {
|
|
|
|
|
- let row = result?;
|
|
|
|
|
|
|
+ let mut i = 0usize;
|
|
|
|
|
+
|
|
|
|
|
+ while echtvar_line.read(&mut echtvar_rdr)? {
|
|
|
|
|
+ if echtvar_line.as_str().starts_with('#') || echtvar_line.as_str().is_empty() {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ let row: crate::io::vcf::VCFRow = echtvar_line.as_str().parse()
|
|
|
|
|
+ .context("Failed to parse echtvar VCF row")?;
|
|
|
|
|
|
|
|
// Verify that the ID corresponds to the input
|
|
// Verify that the ID corresponds to the input
|
|
|
let id: usize = row.id.parse().context("Failed to parse ID")?;
|
|
let id: usize = row.id.parse().context("Failed to parse ID")?;
|
|
|
if id != i + 1 {
|
|
if id != i + 1 {
|
|
|
return Err(anyhow::anyhow!(
|
|
return Err(anyhow::anyhow!(
|
|
|
"Echtvar output ID {} does not match expected ID {}",
|
|
"Echtvar output ID {} does not match expected ID {}",
|
|
|
- id,
|
|
|
|
|
- i + 1
|
|
|
|
|
|
|
+ id, i + 1
|
|
|
));
|
|
));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
let (cosmic, gnomad) = parse_echtvar_val(&row.info)?;
|
|
let (cosmic, gnomad) = parse_echtvar_val(&row.info)?;
|
|
|
-
|
|
|
|
|
let hash = chunk[i].hash;
|
|
let hash = chunk[i].hash;
|
|
|
|
|
+ i += 1;
|
|
|
|
|
|
|
|
chunk_results.push((hash, cosmic, gnomad));
|
|
chunk_results.push((hash, cosmic, gnomad));
|
|
|
}
|
|
}
|
|
@@ -1978,18 +1980,17 @@ impl ExternalAnnotation {
|
|
|
let mut vep_job = VepJob::new(&in_tmp, &out_vep, config);
|
|
let mut vep_job = VepJob::new(&in_tmp, &out_vep, config);
|
|
|
run!(config, &mut vep_job).context("Error while running VEP.")?;
|
|
run!(config, &mut vep_job).context("Error while running VEP.")?;
|
|
|
|
|
|
|
|
- let mut reader_vep = ReaderBuilder::new()
|
|
|
|
|
- .delimiter(b'\t')
|
|
|
|
|
- .has_headers(false)
|
|
|
|
|
- .comment(Some(b'#'))
|
|
|
|
|
- .flexible(true)
|
|
|
|
|
- .from_reader(
|
|
|
|
|
- fs::File::open(&out_vep).context("Can't open result file.")?,
|
|
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
|
|
+ let mut vep_rdr = std::io::BufReader::new(
|
|
|
|
|
+ fs::File::open(&out_vep).context("Can't open result file.")?,
|
|
|
|
|
+ );
|
|
|
|
|
+ let mut vep_line = TsvLine::new();
|
|
|
let mut lines: HashMap<u64, Vec<VepLine>> = HashMap::new();
|
|
let mut lines: HashMap<u64, Vec<VepLine>> = HashMap::new();
|
|
|
- for line in reader_vep.deserialize() {
|
|
|
|
|
- let line: VepLine = line.context("Failed to deserialize VepLine")?;
|
|
|
|
|
|
|
+ while vep_line.read(&mut vep_rdr)? {
|
|
|
|
|
+ if vep_line.as_str().starts_with('#') || vep_line.as_str().is_empty() {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ let line: VepLine = vep_line.as_str().parse()
|
|
|
|
|
+ .context("Failed to parse VepLine")?;
|
|
|
let key = line
|
|
let key = line
|
|
|
.uploaded_variation
|
|
.uploaded_variation
|
|
|
.parse::<u64>()
|
|
.parse::<u64>()
|
|
@@ -2100,16 +2101,15 @@ fn process_vep_chunk(
|
|
|
return Err(anyhow::anyhow!("VEP execution failed: {}", e));
|
|
return Err(anyhow::anyhow!("VEP execution failed: {}", e));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- let mut reader_vep = ReaderBuilder::new()
|
|
|
|
|
- .delimiter(b'\t')
|
|
|
|
|
- .has_headers(false)
|
|
|
|
|
- .comment(Some(b'#'))
|
|
|
|
|
- .flexible(true)
|
|
|
|
|
- .from_reader(fs::File::open(&out_vep)?);
|
|
|
|
|
-
|
|
|
|
|
|
|
+ let mut vep_rdr = std::io::BufReader::new(fs::File::open(&out_vep)?);
|
|
|
|
|
+ let mut vep_line = TsvLine::new();
|
|
|
let mut lines: HashMap<u64, Vec<VepLine>> = HashMap::new();
|
|
let mut lines: HashMap<u64, Vec<VepLine>> = HashMap::new();
|
|
|
- for line in reader_vep.deserialize() {
|
|
|
|
|
- let line: VepLine = line.context("Failed to deserialize VepLine")?;
|
|
|
|
|
|
|
+ while vep_line.read(&mut vep_rdr)? {
|
|
|
|
|
+ if vep_line.as_str().starts_with('#') || vep_line.as_str().is_empty() {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ let line: VepLine = vep_line.as_str().parse()
|
|
|
|
|
+ .context("Failed to parse VepLine")?;
|
|
|
let key = line
|
|
let key = line
|
|
|
.uploaded_variation
|
|
.uploaded_variation
|
|
|
.parse::<u64>()
|
|
.parse::<u64>()
|