*/
package jalview.ext.htsjdk;
-import htsjdk.samtools.SAMSequenceDictionary;
-import htsjdk.samtools.SAMSequenceRecord;
-import htsjdk.samtools.reference.ReferenceSequence;
-import htsjdk.samtools.reference.ReferenceSequenceFile;
-import htsjdk.samtools.reference.ReferenceSequenceFileFactory;
-import htsjdk.samtools.util.StringUtil;
import jalview.datamodel.Sequence;
import jalview.datamodel.SequenceI;
import java.io.File;
+import java.io.IOException;
import java.math.BigInteger;
+import java.nio.file.Path;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
+import htsjdk.samtools.SAMException;
+import htsjdk.samtools.SAMSequenceDictionary;
+import htsjdk.samtools.SAMSequenceRecord;
+import htsjdk.samtools.reference.FastaSequenceIndexCreator;
+import htsjdk.samtools.reference.ReferenceSequence;
+import htsjdk.samtools.reference.ReferenceSequenceFile;
+import htsjdk.samtools.reference.ReferenceSequenceFileFactory;
+import htsjdk.samtools.util.StringUtil;
+
/**
* a source of sequence data accessed via the HTSJDK
*
*/
public class HtsContigDb
{
-
private String name;
private File dbLocation;
private htsjdk.samtools.reference.ReferenceSequenceFile refFile = null;
- public HtsContigDb(String name, File descriptor) throws Exception
+ public static void createFastaSequenceIndex(Path path, boolean overwrite)
+ throws IOException
+ {
+ try
+ {
+ FastaSequenceIndexCreator.create(path, overwrite);
+ } catch (SAMException e)
+ {
+ throw new IOException(e.getMessage());
+ }
+ }
+
+ public HtsContigDb(String name, File descriptor)
{
if (descriptor.isFile())
{
initSource();
}
- private void initSource() throws Exception
+ public void close()
+ {
+ if (refFile != null)
+ {
+ try
+ {
+ refFile.close();
+ } catch (IOException e)
+ {
+ // ignore
+ }
+ }
+ }
+
+ private void initSource()
{
if (refFile != null)
{
final ReferenceSequenceFile refSeqFile = ReferenceSequenceFileFactory
.getReferenceSequenceFile(f, truncate);
ReferenceSequence refSeq;
- List<SAMSequenceRecord> ret = new ArrayList<SAMSequenceRecord>();
- Set<String> sequenceNames = new HashSet<String>();
+ List<SAMSequenceRecord> ret = new ArrayList<>();
+ Set<String> sequenceNames = new HashSet<>();
for (int numSequences = 0; (refSeq = refSeqFile
.nextSequence()) != null; ++numSequences)
{
// ///// end of hts bits.
- SequenceI getSequenceProxy(String id)
+ public SequenceI getSequenceProxy(String id)
{
if (!isValid())
{
ReferenceSequence sseq = refFile.getSequence(id);
return new Sequence(sseq.getName(), new String(sseq.getBases()));
}
+
+ public boolean isIndexed()
+ {
+ return refFile != null && refFile.isIndexed();
+ }
+
}
*/
package jalview.ext.htsjdk;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
import jalview.datamodel.SequenceI;
-import jalview.gui.JvOptionPane;
import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
*/
public class TestHtsContigDb
{
+ @Test(groups = "Functional")
+ public final void testGetSequenceProxy() throws Exception
+ {
+ String pathname = "test/jalview/ext/htsjdk/pgmb.fasta";
+ HtsContigDb db = new HtsContigDb("ADB", new File(pathname));
+
+ assertTrue(db.isValid());
+ assertTrue(db.isIndexed()); // htsjdk opens the .fai file
+
+ SequenceI sq = db.getSequenceProxy("Deminut");
+ assertNotNull(sq);
+ assertEquals(sq.getLength(), 606);
- @BeforeClass(alwaysRun = true)
- public void setUpJvOptionPane()
+ /*
+ * read a sequence earlier in the file
+ */
+ sq = db.getSequenceProxy("PPL_06716");
+ assertNotNull(sq);
+ assertEquals(sq.getLength(), 602);
+
+ // dict = db.getDictionary(f, truncate))
+ }
+
+ /**
+ * Trying to open a .fai file directly results in IllegalArgumentException -
+ * have to provide the unindexed file name instead
+ */
+ @Test(
+ groups = "Functional",
+ expectedExceptions = java.lang.IllegalArgumentException.class)
+ public final void testGetSequenceProxy_indexed()
{
- JvOptionPane.setInteractiveMode(false);
- JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
+ String pathname = "test/jalview/ext/htsjdk/pgmb.fasta.fai";
+ new HtsContigDb("ADB", new File(pathname));
+ fail("Expected exception opening .fai file");
}
@Test(groups = "Functional")
- public final void testHTSReferenceSequence() throws Exception
+ public void testCreateFastaSequenceIndex() throws IOException
{
- HtsContigDb remmadb = new HtsContigDb("REEMADB", new File(
- "test/jalview/ext/htsjdk/pgmb.fasta"));
+ File fasta = new File("test/jalview/ext/htsjdk/pgmb.fasta");
+
+ /*
+ * create .fai with no overwrite fails if it exists
+ */
+ try {
+ HtsContigDb.createFastaSequenceIndex(fasta.toPath(), false);
+ fail("Expected exception");
+ } catch (IOException e)
+ {
+ // expected
+ }
- Assert.assertTrue(remmadb.isValid());
+ /*
+ * create a copy of the .fasta (as a temp file)
+ */
+ File copyFasta = File.createTempFile("copyFasta", ".fasta");
+ copyFasta.deleteOnExit();
+ assertTrue(copyFasta.exists());
+ Files.copy(fasta.toPath(), copyFasta.toPath(),
+ StandardCopyOption.REPLACE_EXISTING);
- SequenceI sq = remmadb.getSequenceProxy("Deminut");
- Assert.assertNotNull(sq);
- Assert.assertNotEquals(0, sq.getLength());
- }
+ /*
+ * open the Fasta file - not indexed, as no .fai file yet exists
+ */
+ HtsContigDb db = new HtsContigDb("ADB", copyFasta);
+ assertTrue(db.isValid());
+ assertFalse(db.isIndexed());
+ db.close();
+ /*
+ * create the .fai index, re-open the .fasta file - now indexed
+ */
+ HtsContigDb.createFastaSequenceIndex(copyFasta.toPath(), true);
+ db = new HtsContigDb("ADB", copyFasta);
+ assertTrue(db.isValid());
+ assertTrue(db.isIndexed());
+ db.close();
+ }
}