diff --git a/src/vcf-popgen.cpp b/src/vcf-popgen.cpp index f826ac4..a5c14aa 100644 --- a/src/vcf-popgen.cpp +++ b/src/vcf-popgen.cpp @@ -14,7 +14,7 @@ List heterozygosity(std::string vcffile, std::string region = "", std::string sa while (vcf.getNextVariant(var)) { if (pass && (var.FILTER() != "PASS")) continue; if ((qual > 0) && (var.QUAL() < qual)) continue; - var.getGenotypes(gt); + if(!var.getGenotypes(gt)) continue; // analyze SNP variant if (!var.isSNP()) continue; assert(var.ploidy() == 2); // make sure it is diploidy diff --git a/src/vcf-reader.cpp b/src/vcf-reader.cpp index 2379528..7d2cedd 100644 --- a/src/vcf-reader.cpp +++ b/src/vcf-reader.cpp @@ -190,7 +190,7 @@ class vcfreader { } vector genotypes(bool collapse) { - var.getGenotypes(v_int); + if (!var.getGenotypes(v_int)) { return vector(); } if (var.ploidy() == 2 && collapse) { for (size_t i = 0; i < v_int.size(); i += 2) { v_int[i + 1] += v_int[i]; diff --git a/src/vcfpp.h b/src/vcfpp.h index 00970cd..9627cd4 100644 --- a/src/vcfpp.h +++ b/src/vcfpp.h @@ -2,7 +2,7 @@ * @file https://github.com/Zilong-Li/vcfpp/vcfpp.h * @author Zilong Li * @email zilong.dk@gmail.com - * @version v0.3.9 + * @version v0.4.0 * @breif a single C++ file for manipulating VCF * Copyright (C) 2022-2023.The use of this code is governed by the LICENSE file. ******************************************************************************/ @@ -497,7 +497,9 @@ class BcfRecord ret = bcf_get_genotypes(header->hdr, line.get(), >s, &ndst); if(ret <= 0) { +# if defined(VERBOSE) std::cerr << "GT not present for current site. did you initilize the variant object?\n"; +# endif return false; } // if nploidy is not set manually. find the max nploidy using the first variant (eg. 2) resize v as @@ -568,7 +570,9 @@ class BcfRecord ret = bcf_get_genotypes(header->hdr, line.get(), >s, &ndst); if(ret <= 0) { +# if defined(VERBOSE) std::cerr << "GT not present for current site. did you initilize the variant object?\n"; +# endif return false; } v.resize(ret); @@ -672,7 +676,7 @@ class BcfRecord fmt = bcf_get_fmt(header->hdr, line.get(), tag.c_str()); if(!fmt) { - throw std::invalid_argument("invalid FORMAT=" + tag + " for current variant.\n"); + throw std::invalid_argument("no FORMAT=" + tag + " in the VCF header.\n"); } nvalues = fmt->n; // if ndst < (fmt->n+1)*nsmpl; then realloc is involved @@ -767,8 +771,10 @@ class BcfRecord } else { +# if defined(VERBOSE) std::cerr << "there are multiple values for " + tag + " in INFO for current site. please use vector instead\n"; +# endif return false; } } @@ -825,7 +831,9 @@ class BcfRecord } if(ret < 0) { +# if defined(VERBOSE) std::cerr << "couldn't set " + tag + " for this variant.\nplease add the tag in headerfirst.\n"; +# endif return false; } return true; @@ -861,7 +869,9 @@ class BcfRecord if(ret < 0) { +# if defined(VERBOSE) std::cerr << "couldn't set " + tag + " for this variant.\nplease add the tag in headerfirst.\n"; +# endif return false; } return true; @@ -927,7 +937,9 @@ class BcfRecord if(bcf_update_genotypes(header->hdr, line.get(), gt, v.size()) < 0) { free(gt); +# if defined(VERBOSE) std::cerr << "couldn't set genotypes correctly.\n"; +# endif return false; } free(gt); @@ -994,7 +1006,9 @@ class BcfRecord if(ret < 0) { +# if defined(VERBOSE) std::cerr << "couldn't set format " + tag + " corectly.\n"; +# endif return false; } return true; @@ -1026,7 +1040,9 @@ class BcfRecord } if(ret < 0) { +# if defined(VERBOSE) std::cerr << "couldn't set format " + tag + " corectly.\n"; +# endif return false; } return true;