53 lines
1.4 KiB
C
53 lines
1.4 KiB
C
|
|
|
|||
|
|
/*
|
|||
|
|
Description: 解析knownsites vcf文件的类
|
|||
|
|
|
|||
|
|
Copyright : All right reserved by ICT
|
|||
|
|
|
|||
|
|
Author : Zhang Zhonghai
|
|||
|
|
Date : 2025/12/24
|
|||
|
|
*/
|
|||
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include <htslib/sam.h>
|
|||
|
|
|
|||
|
|
#include <deque>
|
|||
|
|
#include <fstream>
|
|||
|
|
#include <string>
|
|||
|
|
|
|||
|
|
#include "interval.h"
|
|||
|
|
#include "linear_index.h"
|
|||
|
|
|
|||
|
|
using std::deque;
|
|||
|
|
using std::ifstream;
|
|||
|
|
using std::string;
|
|||
|
|
|
|||
|
|
// 需要支持vcf idx,tbi,csi三种索引方式
|
|||
|
|
// vcf和idx是一对
|
|||
|
|
// vcf.gz和tbi或csi是一对
|
|||
|
|
|
|||
|
|
// 解析knownSites
|
|||
|
|
struct VCFParser {
|
|||
|
|
deque<Interval> knownSites; // 已知的变异位点
|
|||
|
|
char* buf = nullptr; // // 数据buffer
|
|||
|
|
uint32_t bufLen = 4 * 1024; // 数据buffer长度
|
|||
|
|
LinearIndex index; // vcf文件索引
|
|||
|
|
ifstream inStm; // vcf文件流
|
|||
|
|
|
|||
|
|
VCFParser() { Init(); }
|
|||
|
|
VCFParser(const string& vcfFileName) { Init(vcfFileName); }
|
|||
|
|
VCFParser(const string& vcfFileName, sam_hdr_t* samHeader) { Init(vcfFileName, samHeader); }
|
|||
|
|
|
|||
|
|
void Init() { buf = (char*)malloc(bufLen); }
|
|||
|
|
void Init(const string& vcfFileName) {
|
|||
|
|
Init();
|
|||
|
|
inStm.open(vcfFileName, ifstream::in);
|
|||
|
|
string idxFileName = vcfFileName + ".idx";
|
|||
|
|
if (!index.ReadIndex(idxFileName))
|
|||
|
|
error("[%s] fail to load the %s index file\n", __func__, idxFileName.c_str());
|
|||
|
|
}
|
|||
|
|
void Init(const string& vcfFileName, sam_hdr_t* samHeader) {
|
|||
|
|
index.SetHeader(samHeader);
|
|||
|
|
Init(vcfFileName);
|
|||
|
|
}
|
|||
|
|
};
|