/* * Eoulsan development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public License version 2.1 or * later and CeCILL-C. This should be distributed with the code. * If you do not have a copy, see: * * http://www.gnu.org/licenses/lgpl-2.1.txt * http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.txt * * Copyright for this code is held jointly by the Genomic platform * of the Institut de Biologie de l'École normale supérieure and * the individual authors. These should be listed in @author doc * comments. * * For more information on the Eoulsan project and its aims, * or to join the Eoulsan Google group, visit the home page * at: * * http://outils.genomique.biologie.ens.fr/eoulsan * */ package fr.ens.biologie.genomique.eoulsan.bio.alignmentsfilters; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import htsjdk.samtools.SAMLineParser; import htsjdk.samtools.SAMRecord; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import fr.ens.biologie.genomique.eoulsan.EoulsanException; import fr.ens.biologie.genomique.eoulsan.bio.GenomeDescription; import fr.ens.biologie.genomique.eoulsan.bio.SAMUtils; import fr.ens.biologie.genomique.eoulsan.bio.alignmentsfilters.DistanceFromReferenceReadAlignmentsFilter; /** * This class is a JUnit test class to test the class * DistanceFromReferenceReadAlignmentsFilter.java. * @author Claire Wallon */ public class DistanceFromReferenceReadAlignmentsFilterTest { private String recordSE1, recordSE2, recordSE3; private String recordPE1, recordPE2, recordPE3, recordPE4, recordPE5, recordPE6; private SAMRecord samRecordSE1, samRecordSE2, samRecordSE3; private SAMRecord samRecordPE1, samRecordPE2, samRecordPE3, samRecordPE4, samRecordPE5, samRecordPE6; private List<SAMRecord> records; private DistanceFromReferenceReadAlignmentsFilter filter; @Before public void setUp() throws Exception { // recordSE1, recordSE2 and recordSE3 have the same read name (three matches // for the same read) // recordSE1 : clipping ko, NM ok this.recordSE1 = "HWI-EAS285_0001_'':1:1:1261:14574#0/1\t16\tchr1\t173235257\t38\t15S61M\t*\t0\t0" + "\tGAGCCTTGCAGTAAGCAGCTNAACAGGAGCATTNNNNNNNNNNNNAAGGGCATCACTNTCTCAGGCCTCAAGCCAG" + "\tGEGDDGGGFGGDDCDDCDDD#DCDDDCCCCC=2############BGGGGGCCBAAD#DDDEGGGEGGGGGGFGGG" + "\tMD:Z:61\tNH:i:1\tHI:i:1\tNM:i:0\tSM:i:38\tXQ:i:40\tX2:i:0"; // recordSE2 : clipping ok, NM ok this.recordSE2 = "HWI-EAS285_0001_'':1:1:1261:12613#0/1\t0\tchr5\t142537259\t35\t76M\t*\t0\t0" + "\tGAAGCCAGCAATTTGTCANGTGTGATTCATGNNNNNNNNNNNNCCTGGTGTTTTANAAATGCATTGTCTTAAGTAC" + "\tD=?DDDCBD=?AAAB;BB#@6;06,>@@>@A############;96777;>A@A:#=8;9>B<>=C@CBBB?D?@=" + "\tMD:Z:76\tNH:i:1\tHI:i:1\tNM:i:0\tSM:i:35\tXQ:i:40\tX2:i:0"; // recordSE3 : clipping ok, NM ko this.recordSE3 = "HWI-EAS285_0001_'':1:1:1421:9400#0/1\t16\tchr9\t104076172\t38\t35M4D41M\t*\t0\t0" + "\tCAGCTGAACTCTTCAGCAACTAGTGTTAAATTCCTAAAAAAAAAGATGAAAAGGAAGACCTGAGGTCCACTTTGCC" + "\tGEGEEGGEGGGGGDGGFGEFGGGGGGGGGGGFGGGGGGGGGGGGGGGGGGGGGGGGGGEGGGGGGGFGGGGGGGGG" + "\tMD:Z:35^AAAA41\tNH:i:1\tHI:i:1\tNM:i:4\tSM:i:38\tXQ:i:40\tX2:i:0"; // recordPE1, recordPE2, recordPE3, recordPE4, recordPE5 and recordPE6 have // the same read name (three matches for the same read) // recordPE1 and recordPE2 paired // recordPE1 : clipping ok, NM ok this.recordPE1 = "HWI-1KL110:37:C0BE6ACXX:7:1101:1617:2229\t99\tchr11\t119192614\t40\t101M\t=\t119192649\t136" + "\tCTTTTTGCCCTCCTGTGGATTCTCCCATCAGCCATTTGGTCTTACTCTTAAGGCCAGTTGAAGATGGTCCCTTACGGTTTCCCAAGTTAGGTTAGTGATGT" + "\tCCCFFFFFHHHHHJJHJIJJJIJJJJJJJJJIJJJJJJIIHIJJJJIJJJJJJJJJJIJJJJJIJJJHIJJJJHHEHDFFFEEEEDDDEDDCCDDCDEEDC" + "\tMD:Z:5C95\tNH:i:1\tHI:i:1\tNM:i:1\tSM:i:40\tXQ:i:40\tX2:i:0"; // recordPE2 : clipping ko, NM ok this.recordPE2 = "HWI-1KL110:37:C0BE6ACXX:7:1101:1617:2229\t147\tchr11\t119192649\t40\t100M1S\t=\t119192614\t-136" + "\tTTGGTCTTACTCTTAAGGCCAGTTGAAGATGGTCCCTTACGGTTTCCCAAGTTAGGTTAGTGATGTGAGATGCCCTGTCCCTACCTCCTTCCCGAGCCCCG" + "\tDDDDDCDCADDDDDDDDDDDDDDEEDDDDDDDDDDDDDBDEEFFFFHHHHEHIEJJJIGJIIGGIIJIJJIIJJJJIHJHGD?JIHJJHFHHGFFFFFCCC" + "\tMD:Z:87T12\tNH:i:1\tHI:i:1\tNM:i:1\tSM:i:40\tXQ:i:40\tX2:i:0"; // recordPE3 and recordPE4 paired // recordPE3 : clipping ok, NM ko this.recordPE3 = "HWI-1KL110:37:C0BE6ACXX:7:1101:8942:2345\t83\tchr5\t103806613\t40\t46M2D55M\t=\t103806546\t-170" + "\tGGCTGGTGGGAGTTGAAGCTCACTGGGTCCTGTGAAGCCATAGAGGCTCATGGGGGAAGGGAAGGAAGGGTCTCAGCGACTTCCTGCATATTACAAGGTTG" + "\tDDDDDDDDDDDDDDDDDDDDDDDDC?DFFFFHHHHHJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIIJJJJJJJJJJJJJJJJJJJJJHHHHHFFFFFCCC" + "\tMD:Z:23A22^TA0G54\tNH:i:1\tHI:i:1\tNM:i:4\tSM:i:40\tXQ:i:40\tX2:i:0"; // recordPE4 : clipping ok, NM ok this.recordPE4 = "HWI-1KL110:37:C0BE6ACXX:7:1101:8942:2345\t163\tchr5\t103806546\t40\t101M\t=\t103806613\t170" + "\tCTGAGATATTAGTGACAGGTTTTGGAGAAGAAGGGTCCTTGCAGCCAAGGGTATCATTTCAAACCAAGGCTGGTGGGAGTTGAAGCTCACTGGGTCCTGTG" + "\tB<?AADBDDFHBCG>EEFC3AEFFF>@9AEEFIJJIJJJJJJIJJJJIJJGFHHIIIJJJIJJJJIIJHHHHFDFFDDDBDDDDDDDDDDDCDDDDDDDCD" + "\tMD:Z:90A10\tNH:i:1\tHI:i:1\tNM:i:1\tSM:i:40\tXQ:i:40\tX2:i:0"; // recordPE5 and recordPE6 paired // recordPE5 : clipping ok, NM ok this.recordPE5 = "HWI-1KL110:37:C0BE6ACXX:7:1101:1426:2207\t99\tchr1\t35400491\t40\t101M\t=\t35400811\t421" + "\tCCGGNNNNNNGGGAGCGGGAAACACAGAAAGCCAAGGGCCAAGAGCAGTGGTTCCGAGTGAGCCTGAGGAACCTGCTCGGCTACTACAACCAGAGCGCGGG" + "\t<<<@######34@=@?@@?????????????????????????????????????===<?????=<<<<=<<<<<;<=<:<<<<======<<<<<=:::::" + "\tMD:Z:101\tNH:i:1\tHI:i:1\tNM:i:0\tSM:i:40\tXQ:i:40\tX2:i:0"; // recordPE6 : clipping ok, NM ok this.recordPE6 = "HWI-1KL110:37:C0BE6ACXX:7:1101:1426:2207\t147\tchr1\t35400811\t40\t101M\t=\t35400491\t-421" + "\tGCTGTGACTTGGGGTCGGACTGGCGCCTCCTCCGCGGGTACCTGCAGTTCGCCTATGAAGGCCGCGATTACATCGCCCTGAACGAAGACCTGAAAACGTGG" + "\tDDDDEDCDDDDDDDDDDDDDDDDDDDDDDDBDDDDDDDDBDDDDDDDDFHEHHJIJJJJJJJJJJJJJIHJJIIIIHIJIJIJJJJIHHHHHHFFFFFCCC" + "\tMD:Z:101\tNH:i:1\tHI:i:1\tNM:i:0\tSM:i:40\tXQ:i:40\tX2:i:0"; final GenomeDescription desc = new GenomeDescription(); desc.addSequence("chr1", 197195432); desc.addSequence("chr5", 152537259); desc.addSequence("chr9", 124076172); desc.addSequence("chr11", 121843856); SAMLineParser parser = new SAMLineParser(SAMUtils.newSAMFileHeader(desc)); this.samRecordSE1 = parser.parseLine(this.recordSE1); this.samRecordSE2 = parser.parseLine(this.recordSE2); this.samRecordSE3 = parser.parseLine(this.recordSE3); this.samRecordPE1 = parser.parseLine(this.recordPE1); this.samRecordPE2 = parser.parseLine(this.recordPE2); this.samRecordPE3 = parser.parseLine(this.recordPE3); this.samRecordPE4 = parser.parseLine(this.recordPE4); this.samRecordPE5 = parser.parseLine(this.recordPE5); this.samRecordPE6 = parser.parseLine(this.recordPE6); this.records = new ArrayList<>(); this.filter = new DistanceFromReferenceReadAlignmentsFilter(); this.filter.setParameter("threshold", "3"); } @Test public void testSetParameter() { try { this.filter.setParameter("threshold", "40"); assertTrue(true); } catch (EoulsanException e) { assertTrue(false); } try { this.filter.setParameter("threshold", "-2"); assertTrue(false); } catch (EoulsanException e) { assertTrue(true); } try { this.filter.setParameter("ko", "2"); assertTrue(false); } catch (EoulsanException e) { assertTrue(true); } } @Test public void testInit() { try { this.filter.init(); assertTrue(true); } catch (Exception e) { assertTrue(false); } } @Test public void testGetName() { assertEquals("distancefromreference", this.filter.getName()); assertFalse("ko".equals(this.filter.getName())); } @Test public void testGetDescription() { assertEquals( "After this filter, only the alignments which the distance from the " + "reference is lower than the given distance are kept.", this.filter.getDescription()); assertFalse("ko".equals(this.filter.getName())); } @Test public void testFilterReadAlignments() { // single-end mode this.records.add(this.samRecordSE1); assertEquals(1, this.records.size()); this.filter.filterReadAlignments(this.records); assertEquals(0, this.records.size()); this.records.add(this.samRecordSE3); assertEquals(1, this.records.size()); this.filter.filterReadAlignments(this.records); assertEquals(0, this.records.size()); this.records.add(this.samRecordSE2); assertEquals(1, this.records.size()); this.filter.filterReadAlignments(this.records); assertEquals(1, this.records.size()); this.records.add(this.samRecordSE1); this.records.add(this.samRecordSE3); assertEquals(3, this.records.size()); this.filter.filterReadAlignments(this.records); assertEquals(1, this.records.size()); this.records.clear(); // paired-end mode this.records.add(this.samRecordPE1); this.records.add(this.samRecordPE2); assertEquals(2, this.records.size()); this.filter.filterReadAlignments(this.records); assertEquals(0, this.records.size()); this.records.add(this.samRecordPE3); this.records.add(this.samRecordPE4); assertEquals(2, this.records.size()); this.filter.filterReadAlignments(this.records); assertEquals(0, this.records.size()); this.records.add(this.samRecordPE5); this.records.add(this.samRecordPE6); assertEquals(2, this.records.size()); this.filter.filterReadAlignments(this.records); assertEquals(2, this.records.size()); this.records.add(this.samRecordPE3); this.records.add(this.samRecordPE4); this.records.add(this.samRecordPE1); this.records.add(this.samRecordPE2); assertEquals(6, this.records.size()); this.filter.filterReadAlignments(this.records); assertEquals(2, this.records.size()); } }