/* Description: 解析knownsites vcf文件的类 Copyright : All right reserved by ICT Author : Zhang Zhonghai Date : 2025/12/24 */ #pragma once #include #include #include #include #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 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); } };