99 lines
2.9 KiB
C
99 lines
2.9 KiB
C
/*
|
||
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); |