use std::collections::HashMap; use std::error::Error; use std::fs::File; use std::io::{self}; use std::path::PathBuf; use tempfile; use bigtools::bed::bedparser::{BedFileStream, StreamingBedValues}; use bigtools::beddata::BedParserStreamingIterator; use bigtools::{BigWigRead, BigWigWrite, Value}; use tokio::runtime; #[test] fn test() -> Result<(), Box> { let mut dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); dir.push("resources/test"); let mut single_chrom_bedgraph = dir.clone(); single_chrom_bedgraph.push("single_chrom.bedGraph"); let first = { let infile = File::open(single_chrom_bedgraph.clone())?; let mut vals_iter = BedFileStream::from_bedgraph_file(infile); vals_iter.next().unwrap().unwrap().1 }; let runtime = runtime::Builder::new_multi_thread() .worker_threads(6) .build() .expect("Unable to create runtime."); let infile = File::open(single_chrom_bedgraph)?; let tempfile = tempfile::NamedTempFile::new()?; let mut chrom_map = HashMap::new(); chrom_map.insert("chr17".to_string(), 83257441); let outb = BigWigWrite::create_file(tempfile.path(), chrom_map)?; let data = BedParserStreamingIterator::from_bedgraph_file(infile, false); outb.write(data, runtime).unwrap(); let mut bwread = BigWigRead::open_file(tempfile.path()).unwrap(); let chroms = bwread.chroms(); assert_eq!(chroms.len(), 1); assert_eq!(chroms[0].name, "chr17"); assert_eq!(chroms[0].length, 83257441); let mut intervals = bwread.get_interval("chr17", 0, 83257441)?; let first_interval = intervals.next().unwrap().unwrap(); assert_eq!(first.start, first_interval.start); assert_eq!(first.end, first_interval.end); assert_eq!(first.value, first_interval.value); Ok(()) } #[test] fn test_multi_pass() -> Result<(), Box> { let mut dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); dir.push("resources/test"); let mut single_chrom_bedgraph = dir.clone(); single_chrom_bedgraph.push("single_chrom.bedGraph"); let first = { let infile = File::open(single_chrom_bedgraph.clone())?; let mut vals_iter = BedFileStream::from_bedgraph_file(infile); vals_iter.next().unwrap().unwrap().1 }; let runtime = runtime::Builder::new_multi_thread() .worker_threads(6) .build() .expect("Unable to create runtime."); let tempfile = tempfile::NamedTempFile::new()?; let mut chrom_map = HashMap::new(); chrom_map.insert("chr17".to_string(), 83257441); let outb = BigWigWrite::create_file(tempfile.path().to_string_lossy().to_string(), chrom_map).unwrap(); outb.write_multipass( || { let infile = File::open(single_chrom_bedgraph.clone())?; let data = BedParserStreamingIterator::from_bedgraph_file(infile, false); Ok(data) }, runtime, ) .unwrap(); let mut bwread = BigWigRead::open_file(tempfile.path()).unwrap(); let chroms = bwread.chroms(); assert_eq!(chroms.len(), 1); assert_eq!(chroms[0].name, "chr17"); assert_eq!(chroms[0].length, 83257441); let mut intervals = bwread.get_interval("chr17", 0, 83257441)?; let first_interval = intervals.next().unwrap().unwrap(); assert_eq!(first.start, first_interval.start); assert_eq!(first.end, first_interval.end); assert_eq!(first.value, first_interval.value); Ok(()) } #[test] fn test_multi_chrom() -> io::Result<()> { let mut dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); dir.push("resources/test"); let mut multi_chrom_bedgraph = dir.clone(); multi_chrom_bedgraph.push("multi_chrom.bedGraph"); let runtime = runtime::Builder::new_multi_thread() .worker_threads(6) .build() .expect("Unable to create runtime."); let infile = File::open(multi_chrom_bedgraph)?; let tempfile = tempfile::NamedTempFile::new()?; let mut chrom_map = HashMap::new(); chrom_map.insert("chr1".to_string(), 248956422); chrom_map.insert("chr2".to_string(), 242193529); chrom_map.insert("chr3".to_string(), 198295559); chrom_map.insert("chr4".to_string(), 190214555); chrom_map.insert("chr5".to_string(), 181538259); chrom_map.insert("chr6".to_string(), 170805979); let outb = BigWigWrite::create_file(tempfile.path().to_string_lossy().to_string(), chrom_map)?; let data = BedParserStreamingIterator::from_bedgraph_file(infile, false); outb.write(data, runtime).unwrap(); let mut bwread = BigWigRead::open_file(tempfile.path()).unwrap(); let chroms = bwread.chroms(); assert_eq!(chroms.len(), 6); assert_eq!( bwread.get_interval("chr1", 0, 248956422).unwrap().count(), 200 ); assert_eq!( bwread.get_interval("chr6", 0, 170805979).unwrap().count(), 2000 ); Ok(()) } #[test] fn test_iter() { let chroms = vec![ "chrY", "chrY", "chrY", "chrY", "chrY", "chrY", "chrY", "chrY", "chrY", "chrY", ]; let starts: Vec = vec![530, 538, 584, 713, 751, 860, 865, 873, 879, 902]; let ends: Vec = vec![538, 584, 713, 751, 860, 865, 873, 879, 902, 923]; let iter = chroms .into_iter() .zip(starts.into_iter().zip(ends.into_iter())); let iter = iter.map(|(chrom, (start, end))| { ( chrom, Value { start, end, value: 0.0, }, ) }); let vals_iter = BedParserStreamingIterator::wrap_infallible_iter(iter, true); let chrom_map = HashMap::from([("chrY".to_string(), 57_227_415)]); let runtime = tokio::runtime::Builder::new_current_thread() .build() .expect("Unable to create runtime."); let tempfile = tempfile::NamedTempFile::new().unwrap(); let outb = BigWigWrite::create_file(tempfile.path().to_string_lossy().to_string(), chrom_map).unwrap(); outb.write(vals_iter, runtime).unwrap(); }