hyb-align/mate_sw.h

99 lines
2.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
Description: 计算mate sw过程用到的一些数据和函数
Copyright : All right reserved by ICT
Author : Zhang Zhonghai
Date : 2026/01/12
*/
#pragma once
#include <stdint.h>
#include "ksw_align_avx.h"
#include "kvec.h"
// 需要做mate sw的read
typedef struct {
uint8_t is_rev; // seq是否在反向互补链上
uint8_t skip; // 记录任务创建时候的skip状态
int xtra;
int64_t rb, re; // ref的起始截止位置左闭右开
int64_t seq_id; // 对应的当前数据块的seq id
int aj; // 对应的pair-end的第几个aln;
int to; // task order,因为u8和i16分开放入的但是他们也是有顺序的这个用来排序
kswr_avx_t aln;
} msw_task_t;
// mate sw task数组
typedef kvec_t(msw_task_t) msw_task_v;
// mate sw task的指针数组
typedef kvec_t(msw_task_t*) msw_task_ptr_v;
// 每个seq保留task所在的线程和数组idx
typedef struct {
int thread_idx; // 在哪个线程
int arr_idx; // 是u8还是i16
int task_idx; // 数组内的索引
} msw_seq_task_t;
typedef kvec_t(msw_seq_task_t) msw_seq_task_v;
//////////////////////////////////////////////
// 用来存放获取的mate sw阶段的ref序列
// typedef kvec_t(byte_v) byte_vv;
// 记录一些用到的数据统计比如最长ref长度最长seq长度等
typedef struct {
int max_seq_len;
int max_ref_len; // mate sw里的最长的ref长度
} msw_stats_t;
// 用于记录参与计算的query只保存指针
typedef struct {
uint8_t* seq; // 只是指向seq的指针
int l_seq; // seq长度
} msw_seq_t;
typedef kvec_t(msw_seq_t) msw_seq_v;
// 用于记录参与计算的ref只保存指针
typedef struct {
uint8_t* ref;
int l_ref;
} msw_ref_t;
typedef kvec_t(msw_ref_t) msw_ref_v;
// 记录结果
typedef kvec_t(kswr_avx_t) msw_kswr_v;
////////////////////////////////////////////
// mate sw相关的所有数据
typedef struct {
msw_task_v** t_msw_tasks; // 0是u8, 1是i16线程内收集需要做mate sw的任务的数据
msw_task_ptr_v p_msw_tasks_u8; // 线程共享的mate sw task指针
msw_task_ptr_v p_msw_tasks_i16;
msw_buf_t* t_msw_buf; // 每个线程一个mate sw 缓存
msw_stats_t* t_msw_stats; // 每个线程一个,统计信息
msw_stats_t p_msw_stats; //只是用来开辟空间
byte_vv* t_msw_ref_buf; // ref的缓存
byte_vv* t_msw_seq_buf; // seq的缓存因为有些seq需要反向互补而且用了buf之后第二阶段反转不需要再还原了
msw_ref_v* t_msw_1_refs; // msw 第一阶段数据
msw_seq_v* t_msw_1_seqs;
int_v* t_msw_1_xtras;
msw_kswr_v* t_msw_1_kswrs;
msw_ref_v* t_msw_2_refs; // msw 第一阶段数据
msw_seq_v* t_msw_2_seqs;
int_v* t_msw_2_xtras;
msw_kswr_v* t_msw_2_kswrs;
} msw_data_t;
void init_msw_data(msw_data_t* msw, int n_threads, int msw_batch_size);
void calc_msw_mem_size(msw_data_t* msw, int n_threads, int64_t *total_bytes);