/* Description: 计算mate sw过程用到的一些数据和函数 Copyright : All right reserved by ICT Author : Zhang Zhonghai Date : 2026/01/12 */ #pragma once #include #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; ////////////////////////////////////////////// // 用来存放获取的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_u8; // 线程内收集需要做mate sw的任务的数据 msw_task_v* t_msw_tasks_i16; 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);