private static void AddFormatAndSampleColumns(List <int>[] sampleGenoTypes, VariantInfo variantInfo, ref List <string> vcfFields)
        {
            var formatTags = "GT";
            var hasGq      = false;
            var hasPs      = false;
            int numSamples = sampleGenoTypes.Length;

            string[] sampleGenotypeStrings = GetSampleGenotypeStrings(sampleGenoTypes, variantInfo, ref hasGq, ref hasPs, numSamples);

            int numFields = 1;

            if (hasGq)
            {
                formatTags += ":GQ";
                numFields++;
            }
            if (hasPs)
            {
                formatTags += ":PS";
                numFields++;
            }

            vcfFields.Add(formatTags);

            for (var index = 0; index < numSamples; index++)
            {
                string sampleGenotypeStr = sampleGenotypeStrings[index];

                if (sampleGenotypeStr == null || sampleGenotypeStr == ".")
                {
                    vcfFields.Add(".");
                }
                else
                {
                    var nonMissingFields = new string[numFields];
                    nonMissingFields[0] = sampleGenotypeStr;
                    var fieldIndex = 1;
                    if (hasGq)
                    {
                        nonMissingFields[fieldIndex] = variantInfo.SampleGqs[index];
                        fieldIndex++;
                    }
                    if (hasPs)
                    {
                        nonMissingFields[fieldIndex] = variantInfo.SamplePhaseSets[index];
                    }

                    var sampleColumnStr = string.Join(":", TrimTrailingMissValues(nonMissingFields));
                    vcfFields.Add(sampleColumnStr);
                }
            }
        }
        private string[] GetVcfFields(VariantSite varSite, VariantInfo variantInfo, string altAlleleColumn, List <int>[] sampleGenoTypes, string variantId = VariantId, string info = InfoTag)
        {
            var vcfFields = new List <string>
            {
                _chrName,
                varSite.Start.ToString(),
                variantId,
                varSite.RefAllele,
                altAlleleColumn,
                variantInfo.Qual,
                variantInfo.GetMnvFilterTag(),
                info
            };

            AddFormatAndSampleColumns(sampleGenoTypes, variantInfo, ref vcfFields);
            return(vcfFields.ToArray());
        }
        private static string[] GetSampleGenotypeStrings(IReadOnlyList <List <int> > sampleGenoTypes, VariantInfo variantInfo, ref bool hasGq, ref bool hasPs, int numSamples)
        {
            var sampleGenotypeStrings = new string[numSamples];

            for (var index = 0; index < numSamples; index++)
            {
                var homoReferenceSamplePloidy = variantInfo.HomoReferenceSamplePloidies[index];
                sampleGenotypeStrings[index] = GetGenotype(sampleGenoTypes[index], homoReferenceSamplePloidy);
                if (sampleGenotypeStrings[index] == ".")
                {
                    continue;
                }

                if (variantInfo.SampleGqs[index] != ".")
                {
                    hasGq = true;
                }
                if (variantInfo.SamplePhaseSets[index] != ".")
                {
                    hasPs = true;
                }
            }

            return(sampleGenotypeStrings);
        }