A computer program product comprising a non-transitory machine readable medium storing program code that, when executed by one or more processors of a computer system, causes the computer system to implement a method for determining sequence information of a sequence of interest in a sample using unique molecular indices (UMIs), which are oligonucleotide sequences that can be used to identify individual molecules of double-stranded DNA fragments in the sample, said program code comprising: code for obtaining reads of a plurality of amplified polynucleotides, wherein the plurality of amplified polynucleotides are obtained by amplifying double-stranded DNA fragments in the sample including the sequence of interest and attaching adapters to the double-stranded DNA fragments; code for identifying a plurality of physical UMIs in the reads of the plurality of amplified polynucleotides, wherein each physical UMI is found in an adapter attached to one of the double-stranded DNA fragments; code for identifying a plurality of virtual UMIs in the reads of the plurality of amplified polynucleotides, wherein each virtual UMI is found in an individual molecule of one of the double-stranded DNA fragments; and code for determining sequences of the double-stranded DNA fragments using the reads of the plurality of amplified polynucleotides, the plurality of physical UMIs, and the plurality of virtual UMIs, thereby reducing errors in the determined sequences of the double-stranded DNA fragments, wherein the code for determining sequences of the double-stranded DNA fragments comprises: code for collapsing, for each of one or more of the double-stranded DNA fragments in the sample, reads having a first physical UMI at one end and at least one virtual UMI but no physical UMI at another end into a first group to obtain a first consensus nucleotide sequence; code for collapsing, for each of the one or more of the double-stranded DNA fragments in the sample, reads having a second physical UMI at one end and the at least one virtual UMI but no physical UMI at another end into a second group to obtain a second consensus nucleotide sequence; and code for determining, for each of the one or more of the double-stranded DNA fragments in the sample (a) a third consensus nucleotide sequence using the first and second consensus nucleotide sequences and (b) the sequence of one of the double-stranded DNA fragments in the sample using the third consensus nucleotide sequence. code for obtaining reads of a plurality of amplified polynucleotides, wherein the plurality of amplified polynucleotides are obtained by amplifying double-stranded DNA fragments in the sample including the sequence of interest and attaching adapters to the double-stranded DNA fragments; code for identifying a plurality of physical UMIs in the reads of the plurality of amplified polynucleotides, wherein each physical UMI is found in an adapter attached to one of the double-stranded DNA fragments; code for identifying a plurality of virtual UMIs in the reads of the plurality of amplified polynucleotides, wherein each virtual UMI is found in an individual molecule of one of the double-stranded DNA fragments; and code for determining sequences of the double-stranded DNA fragments using the reads of the plurality of amplified polynucleotides, the plurality of physical UMIs, and the plurality of virtual UMIs, thereby reducing errors in the determined sequences of the double-stranded DNA fragments, wherein the code for determining sequences of the double-stranded DNA fragments comprises: code for collapsing, for each of one or more of the double-stranded DNA fragments in the sample, reads having a first physical UMI at one end and at least one virtual UMI but no physical UMI at another end into a first group to obtain a first consensus nucleotide sequence; code for collapsing, for each of the one or more of the double-stranded DNA fragments in the sample, reads having a second physical UMI at one end and the at least one virtual UMI but no physical UMI at another end into a second group to obtain a second consensus nucleotide sequence; and code for determining, for each of the one or more of the double-stranded DNA fragments in the sample (a) a third consensus nucleotide sequence using the first and second consensus nucleotide sequences and (b) the sequence of one of the double-stranded DNA fragments in the sample using the third consensus nucleotide sequence. code for collapsing, for each of one or more of the double-stranded DNA fragments in the sample, reads having a first physical UMI at one end and at least one virtual UMI but no physical UMI at another end into a first group to obtain a first consensus nucleotide sequence; code for collapsing, for each of the one or more of the double-stranded DNA fragments in the sample, reads having a second physical UMI at one end and the at least one virtual UMI but no physical UMI at another end into a second group to obtain a second consensus nucleotide sequence; and code for determining, for each of the one or more of the double-stranded DNA fragments in the sample (a) a third consensus nucleotide sequence using the first and second consensus nucleotide sequences and (b) the sequence of one of the double-stranded DNA fragments in the sample using the third consensus nucleotide sequence.