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

如何设置函数以明智地使用fastq机箱修改fastq文件
EN

Stack Overflow用户
提问于 2022-05-05 14:35:06
回答 1查看 75关注 0票数 0

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

我试图使用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'$';
        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

Stack Overflow用户

回答已采纳

发布于 2022-05-19 19:39:35

关于你的“你的函数签名看起来像什么”的问题,这些东西在发展过程中会发生变化,所以不需要花太多的时间在它上,

我在下面做了两个方法代码,

代码语言:javascript
复制
use bytes::BytesMut;
use fastq::{Parser, Record, RefRecord};

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| {
            // modify_qual1(record, &mut total)
            println!("Before mod");
            println!("{}", String::from_utf8_lossy(record.qual()));
            let owned_rec = modify_qual(record);
            println!("After mod");
            println!("{}", String::from_utf8_lossy(owned_rec.qual()));
            total += 1;
            true
        })
        .expect("Invalid fastq file");
    println!("{}", total);
}

fn modify_qual(record: RefRecord) -> fastq::OwnedRecord {
    let mut owned_rec = RefRecord::to_owned_record(&record);
    let mut curr_bytes = BytesMut::from(owned_rec.qual());
    curr_bytes[0] = b'$';
    owned_rec.qual = curr_bytes.to_vec();
    owned_rec
}

fn modify_qual1(record: RefRecord, total: &mut usize) -> bool {
    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'$';
    owned_rec.qual = curr_bytes.to_vec();
    println!("After mod");
    println!("{}", String::from_utf8_lossy(owned_rec.qual()));
    *total += 1;
    true
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72129003

复制
相关文章

相似问题

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