首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >明智地使用fastq机箱修改fastq文件

明智地使用fastq机箱修改fastq文件
EN

Code Review用户
提问于 2022-05-06 16:57:01
回答 1查看 37关注 0票数 1

我正在学习锈菌,我有一个简单的程序,我希望用它来做一个学习练习。我在这里的目标是更好地了解正确的做事方法。

我试图使用fastq箱对fastq文件进行一些操作--这些是用于存储高吞吐量DNA/RNA测序数据的简单文本文件。我想要做的是修改条目的子集,并将修改后的条目写入文件。

现在,我有了下面概念的初步证明,它可以修改每个质量值的第一个字节。我想确定我做的事情是否明智。我的一般思维过程:

  1. 使用fastq::RefRecord::to_owned_record()创建我将拥有的记录的副本
  2. 从quality字段字节片创建一个字节::BytesMut
  3. 修改BytesMut的字节
  4. 从修改后的OwnedRecord中设置my BytesMut中的quality字段
  5. 验证是否设置了

上面的过程和下面的代码看起来合理吗?你会有不同的做法吗?为什么?由于我对锈菌如此陌生,我觉得我可能是以一种天真和不太理想的方式看待事物。告诉我你的大致想法。

依赖关系:

  • 字节数
  • fastq

下面是我的示例代码:

代码语言:javascript
复制
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,它可以为我执行这个任务。对于这种情况,您的函数签名是什么样子的?也许某种东西会消耗记录并返回修改过的记录?还有别的吗?我理解易变性的概念,在表面上通过参考,但没有一个好的心理模型,什么时候去做某些事情。

EN

回答 1

Code Review用户

发布于 2022-05-26 00:00:00

这似乎是一个非常普遍的问题,所以很难找到答案。不过,我有一些线索给你。fastq机箱已经4年没有更新了,所以我建议不要依赖它。bio-rs机箱是一个非常好的替代品,除了fastq文件之外还有更多的功能。我不知道为什么您需要BytesMut而不是依赖Vec<u8>。除此之外,你所展示的代码除了改变第一个氨基酸的分数之外,什么也不做,这使得你很难从一个函数中想象出你想要什么。但是,作为一般规则,您希望“点击并忘记”这些(可能非常大)的fastq文件。因此,这意味着您每次读取一个记录,进行计算,在另一个向量/文件中保存所需的任何信息,然后转到下一个向量/文件。因此,一般来说,您将不需要从内部函数返回任何东西。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/276361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档