我正在学习锈菌,我有一个简单的程序,我希望用它来做一个学习练习。我在这里的目标是更好地了解正确的做事方法。
我试图使用fastq箱对fastq文件进行一些操作--这些是用于存储高吞吐量DNA/RNA测序数据的简单文本文件。我想要做的是修改条目的子集,并将修改后的条目写入文件。
现在,我有了下面概念的初步证明,它可以修改每个质量值的第一个字节。我想确定我做的事情是否明智。我的一般思维过程:
上面的过程和下面的代码看起来合理吗?你会有不同的做法吗?为什么?由于我对锈菌如此陌生,我觉得我可能是以一种天真和不太理想的方式看待事物。告诉我你的大致想法。
依赖关系:
下面是我的示例代码:
use bytes::BytesMut;
use fastq::{Parser, parse_path, Record, RefRecord};
use std::env::args;
const READS: &str = r#"@read1/ENST00000266263.10;mate1:84-183;mate2:264-363
GACAGCCAGGGGCCAGCGGGTGGCAGTGCCCAGGACATAGAGAGAGGCAGCACACACGCGGTTGATGGTGAAGCCCGGAATGGCCACAGAGGCTAGAGCC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@read2/ENST00000266263.10;mate1:163-262;mate2:283-382
GATGCCATTGACAAAGGCAAGAAGGCTGGAGAGGTGCCCAGCCCTGAAGCAGGCCGCAGCGCCAGGGTGACTGTGGCTGTGGTGGACACCTTTGTATGGC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@read3/ENST00000266263.10;mate1:86-185;mate2:265-364
GGACAGCCAGGGGCCAGCGGGTGGCAGTGCCCAGGACATAGAGAGAGGCAGCANACACACGGTTGATGGTGAAGCCCGGAATGGCCACAGAGGCTAGAGC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII!IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@read4/ENST00000266263.10;mate1:297-396;mate2:401-500
CAGGAGGAGCTGGGCTTCCCCACTGTTAGGTAGAGCTTGCGCAGGCTGGAGTCCAGGAGGAAATCCACCGACCTGTCAATGGGGTGGATAATGATGGGGA
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
"#;
fn main() {
let mut total: usize = 0;
let parser = Parser::new(READS.as_bytes());
parser.each(|record| {
println!("Before mod");
println!("{}", String::from_utf8_lossy(record.qual()));
let mut owned_rec = RefRecord::to_owned_record(&record);
let mut curr_bytes = BytesMut::from(owned_rec.qual());
curr_bytes[0] = b'另外,我希望把这个过程变成一个函数,所以我想知道做这个的最佳过程。我正在考虑一个函数modify_qual,它可以为我执行这个任务。对于这种情况,您的函数签名是什么样子的?也许某种东西会消耗记录并返回修改过的记录?还有别的吗?我理解易变性的概念,在表面上通过参考,但没有一个好的心理模型,什么时候去做某些事情。;
owned_rec.qual = curr_bytes.to_vec();
println!("After mod");
println!("{}", String::from_utf8_lossy(owned_rec.qual()));
total += 1;
true
}).expect("Invalid fastq file");
println!("{}", total);
}另外,我希望把这个过程变成一个函数,所以我想知道做这个的最佳过程。我正在考虑一个函数modify_qual,它可以为我执行这个任务。对于这种情况,您的函数签名是什么样子的?也许某种东西会消耗记录并返回修改过的记录?还有别的吗?我理解易变性的概念,在表面上通过参考,但没有一个好的心理模型,什么时候去做某些事情。
发布于 2022-05-26 00:00:00
这似乎是一个非常普遍的问题,所以很难找到答案。不过,我有一些线索给你。fastq机箱已经4年没有更新了,所以我建议不要依赖它。bio-rs机箱是一个非常好的替代品,除了fastq文件之外还有更多的功能。我不知道为什么您需要BytesMut而不是依赖Vec<u8>。除此之外,你所展示的代码除了改变第一个氨基酸的分数之外,什么也不做,这使得你很难从一个函数中想象出你想要什么。但是,作为一般规则,您希望“点击并忘记”这些(可能非常大)的fastq文件。因此,这意味着您每次读取一个记录,进行计算,在另一个向量/文件中保存所需的任何信息,然后转到下一个向量/文件。因此,一般来说,您将不需要从内部函数返回任何东西。
use bio::io::fastq;
use bio::io::fastq::FastqRead;
use bio::io::fastq::Record;
...
fn main() {
// Note: structure derived from the example given by `bio-rs`.
let mut total = 0;
let mut reader = fastq::Reader::new(READS.as_bytes());
let mut record = fastq::Record::new();
reader
.read(&mut record)
.expect("Failed to parse the first record");
while !record.is_empty() {
record
.check()
.unwrap_or_else(|_| panic!("I got a rubbish record! Index: {}", total));
total += 1;
change_record(&record);
reader
.read(&mut record)
.unwrap_or_else(|_| panic!("Failed to parse record! Index: {}", total));
}
println!("Total sequences: {}", total);
}
// Note: the the parameter `record` is passed by reference and nothing is returned.
fn change_record(record: &Record) {
let mut qual = record.qual().to_vec();
qual[0] = b';
let new_record = Record::with_attrs(record.id(), record.desc(), record.seq(), &qual);
}
```A5
https://codereview.stackexchange.com/questions/276361
复制相似问题