Skip to content

Commit

Permalink
#450 stabilising sort order in VCF output
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Cameron committed Feb 16, 2021
1 parent 9f0c15a commit 7b08669
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 deletions.
16 changes: 15 additions & 1 deletion src/main/java/au/edu/wehi/idsv/IdsvVariantContext.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package au.edu.wehi.idsv;

import au.edu.wehi.idsv.debruijn.VariantEvidence;
import au.edu.wehi.idsv.vcf.VcfFormatAttributes;
import au.edu.wehi.idsv.vcf.VcfInfoAttributes;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Ordering;
import com.google.common.primitives.Doubles;
import htsjdk.samtools.SAMSequenceDictionary;
import htsjdk.variant.variantcontext.Allele;
import htsjdk.variant.variantcontext.VariantContext;

import java.util.List;

/**
* Generates variant context records from the underlying @link {@link VariantContext}
* @author Daniel Cameron
Expand Down Expand Up @@ -81,6 +85,8 @@ public int compare(IdsvVariantContext o1, IdsvVariantContext o2) {
.compare(o1.getReferenceIndex(), o2.getReferenceIndex())
.compare(o1.getStart(), o2.getStart())
.compare(o1.getEnd(), o2.getEnd())
.compare(o1.getReference(), o2.getReference())
.compare(getOrderingAllele(o1), getOrderingAllele(o2))
.compare(o1.getID(), o2.getID())
.result();
}
Expand All @@ -91,6 +97,7 @@ public int compare(IdsvVariantContext o1, IdsvVariantContext o2) {
.compare(o1.getReferenceIndex(), o2.getReferenceIndex())
.compare(o1.getEnd(), o2.getEnd())
.compare(o1.getStart(), o2.getStart())
.compare(getOrderingAllele(o1), getOrderingAllele(o2))
.compare(o1.getID(), o2.getID())
.result();
}
Expand All @@ -114,9 +121,16 @@ public int compare(VariantContext o1, VariantContext o2) {
.compare(dictionary.getSequenceIndex(o1.getContig()), dictionary.getSequenceIndex(o2.getContig()))
.compare(o1.getEnd(), o2.getEnd())
.compare(o1.getStart(), o2.getStart())
.compare(getOrderingAllele(o1), getOrderingAllele(o2))
.compare(o1.getID(), o2.getID())
.result();
}
};
}
}
private static Allele getOrderingAllele(VariantContext v) {
List<Allele> alt = v.getAlleles();
if (alt.size() >= 2) return alt.get(1);
if (alt.size() >= 1) return alt.get(0);
return null;
}
}
22 changes: 20 additions & 2 deletions src/test/java/au/edu/wehi/idsv/IdsvVariantContextTest.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package au.edu.wehi.idsv;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Ordering;
import htsjdk.variant.variantcontext.VariantContext;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.*;

public class IdsvVariantContextTest extends TestHelper {
@Test
Expand Down Expand Up @@ -91,4 +93,20 @@ public void getAttributeAsIntListOffset_should_default_should_get_ith_element()
TestIdsvVariantContext vc = new TestIdsvVariantContext(minimalVariant().attribute("intlist", L("1", "2")).make());
assertEquals(1, vc.getAttributeAsIntListOffset("intlist", 0, 7));
}
@Test
public void ByLocation_should_have_stable_sort_order() {
IdsvVariantContext v1 = (IdsvVariantContext)new IdsvVariantContextBuilder(getContext()).chr("polyA").start(1).stop(1).alleles("A", "C").make();
IdsvVariantContext v2 = (IdsvVariantContext)new IdsvVariantContextBuilder(getContext()).chr("polyA").start(1).stop(1).alleles("A", "T").make();
for (Ordering<IdsvVariantContext> order : ImmutableList.of(IdsvVariantContext.ByLocationStart, IdsvVariantContext.ByLocationEnd)) {
List<IdsvVariantContext> list1 = new ArrayList<>();
list1.add(v1);
list1.add(v2);
List<IdsvVariantContext> list2 = new ArrayList<>();
list2.add(v2);
list2.add(v1);
list1.sort(order);
list2.sort(order);
assertEquals(list1, list2);
}
}
}

0 comments on commit 7b08669

Please sign in to comment.