getFamily() and associated methods implemented and tested

-- Sample no longer serializable
-- Sample now implements Comparable
This commit is contained in:
Mark DePristo 2011-10-05 09:55:05 -07:00
parent 9bd3ba4c7e
commit 51ecc20867
3 changed files with 78 additions and 25 deletions

View File

@ -9,7 +9,7 @@ import java.util.Map;
/**
*
*/
public class Sample implements java.io.Serializable {
public class Sample implements Comparable<Sample> { // implements java.io.Serializable {
final private String familyID, paternalID, maternalID;
final private Gender gender;
final private double quantitativePhenotype;
@ -118,6 +118,11 @@ public class Sample implements java.io.Serializable {
return gender;
}
@Override
public int compareTo(final Sample sample) {
return ID.compareTo(sample.getID());
}
@Override
public String toString() {
return String.format("Sample %s fam=%s dad=%s mom=%s gender=%s affection=%s qt=%s props=%s",

View File

@ -4,7 +4,6 @@ import net.sf.samtools.SAMReadGroupRecord;
import net.sf.samtools.SAMRecord;
import org.broadinstitute.sting.utils.exceptions.StingException;
import org.broadinstitute.sting.utils.variantcontext.Genotype;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.*;
@ -139,30 +138,42 @@ public class SampleDB {
//
// --------------------------------------------------------------------------------
public Set<String> getFamilyIDs() {
throw new NotImplementedException();
/**
* Returns a sorted set of the family IDs in all samples (excluding null ids)
* @return
*/
public final Set<String> getFamilyIDs() {
return getFamilies().keySet();
}
public Map<String, Set<Sample>> getFamilies() {
throw new NotImplementedException();
/**
* Returns a map from family ID -> set of family members for all samples with
* non-null family ids
*
* @return
*/
public final Map<String, Set<Sample>> getFamilies() {
final Map<String, Set<Sample>> families = new TreeMap<String, Set<Sample>>();
for ( final Sample sample : samples.values() ) {
final String famID = sample.getFamilyID();
if ( famID != null ) {
if ( ! families.containsKey(famID) )
families.put(famID, new TreeSet<Sample>());
families.get(famID).add(sample);
}
}
return families;
}
/**
* Return all samples with a given family ID
* Note that this isn't terribly efficient (linear) - it may be worth adding a new family ID data structure for this
* @param familyId
* @return
*/
public Set<Sample> getFamily(String familyId) {
HashSet<Sample> familyMembers = new HashSet<Sample>();
for (Sample sample : samples.values()) {
if (sample.getFamilyID() != null) {
if (sample.getFamilyID().equals(familyId))
familyMembers.add(sample);
}
}
return familyMembers;
return getFamilies().get(familyId);
}
/**
@ -172,9 +183,9 @@ public class SampleDB {
* @return
*/
public Set<Sample> getChildren(Sample sample) {
HashSet<Sample> children = new HashSet<Sample>();
for (Sample familyMember : getFamily(sample.getFamilyID())) {
if (familyMember.getMother() == sample || familyMember.getFather() == sample) {
final HashSet<Sample> children = new HashSet<Sample>();
for ( final Sample familyMember : getFamily(sample.getFamilyID())) {
if ( familyMember.getMother() == sample || familyMember.getFather() == sample ) {
children.add(familyMember);
}
}

View File

@ -9,9 +9,7 @@ import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.File;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.*;
/**
* Created by IntelliJ IDEA.
@ -36,9 +34,17 @@ public class SampleDBUnitTest extends BaseTest {
private static final String testPEDString =
String.format("%s%n%s%n%s",
"fam1 kid dad mom 1 2",
"fam1 dad 0 0 1 1",
"fam1 mom 0 0 2 2");
"fam1 kid dad mom 1 2",
"fam1 dad 0 0 1 1",
"fam1 mom 0 0 2 2");
private static final String testPEDMultipleFamilies =
String.format("%s%n%s%n%s%n%s%n%s",
"fam1 kid dad mom 1 2",
"fam1 dad 0 0 1 1",
"fam1 mom 0 0 2 2",
"fam3 s1 d1 m1 2 2",
"fam2 s2 d2 m2 2 2");
private static final String testPEDStringInconsistentGender =
"fam1 kid 0 0 2 2";
@ -117,4 +123,35 @@ public class SampleDBUnitTest extends BaseTest {
builder.addSamplesFromPedigreeStrings(Arrays.asList(testPEDStringInconsistentGender));
builder.getFinalSampleDB();
}
@Test()
public void getFamilyIDs() {
builder.addSamplesFromPedigreeStrings(Arrays.asList(testPEDMultipleFamilies));
SampleDB db = builder.getFinalSampleDB();
Assert.assertEquals(db.getFamilyIDs(), new TreeSet<String>(Arrays.asList("fam1", "fam2", "fam3")));
}
@Test()
public void getFamily() {
builder.addSamplesFromPedigreeStrings(Arrays.asList(testPEDMultipleFamilies));
SampleDB db = builder.getFinalSampleDB();
Assert.assertEquals(db.getFamily("fam1"), testPEDSamplesAsSet);
}
@Test()
public void loadFamilyIDs() {
builder.addSamplesFromPedigreeStrings(Arrays.asList(testPEDMultipleFamilies));
SampleDB db = builder.getFinalSampleDB();
Map<String, Set<Sample>> families = db.getFamilies();
Assert.assertEquals(families.size(), 3);
Assert.assertEquals(families.keySet(), new TreeSet<String>(Arrays.asList("fam1", "fam2", "fam3")));
for ( final String famID : families.keySet() ) {
final Set<Sample> fam = families.get(famID);
Assert.assertEquals(fam.size(), 3);
for ( final Sample sample : fam ) {
Assert.assertEquals(sample.getFamilyID(), famID);
}
}
}
}