diff --git a/CHANGELOG.md b/CHANGELOG.md
index e329501..2c1e45d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 3.0.61 Dec 29, 2018
+
+Added `--reverse` and `--reverseComplement` options to `filter-fasta.py`
+and the underlying `ReadFilter` class.
+
 ## 3.0.60 Dec 13, 2018
 
 In `reads.py`, changed the `_makeComplementTable` function so that 
diff --git a/bin/convert-diamond-to-sam.py b/bin/convert-diamond-to-sam.py
index a4a7bd5..fbab91f 100755
--- a/bin/convert-diamond-to-sam.py
+++ b/bin/convert-diamond-to-sam.py
@@ -77,7 +77,7 @@ for match in diamondTabularFormatToDicts(sys.stdin):
     referenceLengths[stitle] = 3 * match['slen']
 
     # If the query frame is less than zero, the match was with a reverse
-    # complemented translation of the query. Put the reverse compliment
+    # complemented translation of the query. Put the reverse complement
     # into the SAM output, which seems to be standard / accepted practice
     # based on my web searches. See e.g., https://www.biostars.org/p/131891/
     # for what Bowtie2 does and for some comments on this issue for SAM/BAM
diff --git a/dark/__init__.py b/dark/__init__.py
index ffb465c..7f64217 100644
--- a/dark/__init__.py
+++ b/dark/__init__.py
@@ -8,4 +8,4 @@ if sys.version_info < (2, 7):
 #
 # Remember to update ../CHANGELOG.md describing what's new in each version.
 
-__version__ = '3.0.60'
+__version__ = '3.0.61'
diff --git a/dark/filter.py b/dark/filter.py
index 05d36e8..91971bd 100644
--- a/dark/filter.py
+++ b/dark/filter.py
@@ -379,6 +379,15 @@ def addFASTAEditingCommandLineOptions(parser):
               'function will be passed to eval with the dark.reads classes '
               'Read, DNARead, AARead, etc. all in scope.'))
 
+    parser.add_argument(
+        '--reverse', action='store_true', default=False,
+        help=('Reverse the sequences. Note that this is NOT reverse '
+              'complementing.'))
+
+    parser.add_argument(
+        '--reverseComplement', action='store_true', default=False,
+        help='Reverse complement the sequences.')
+
 
 def parseFASTAEditingCommandLineOptions(args, reads):
     """
@@ -430,4 +439,5 @@ def parseFASTAEditingCommandLineOptions(args, reads):
         truncateTitlesAfter=truncateTitlesAfter,
         removeDescriptions=removeDescriptions,
         idLambda=args.idLambda, readLambda=args.readLambda,
-        keepSites=keepSites, removeSites=removeSites)
+        keepSites=keepSites, removeSites=removeSites,
+        reverse=args.reverse, reverseComplement=args.reverseComplement)
diff --git a/dark/reads.py b/dark/reads.py
index df381e0..98a78cc 100644
--- a/dark/reads.py
+++ b/dark/reads.py
@@ -126,6 +126,17 @@ class Read(object):
             'quality': self.quality,
         }
 
+    def reverse(self):
+        """
+        Reverse a read (note that this is NOT a reverse complement).
+
+        @return: The reversed sequence as an instance of the current class.
+        """
+        return self.__class__(
+            self.id,
+            self.sequence[::-1],
+            None if self.quality is None else self.quality[::-1])
+
     @classmethod
     def fromDict(cls, d):
         """
@@ -807,12 +818,20 @@ class ReadFilter(object):
     @param removeSites: A set of C{int} 0-based sites (i.e., indices) in
         sequences that should be removed. If C{None} (the default), no sites
         are removed.
+    @param reverse: If C{True}, reverse the sequences. Reversing happens
+        at a very late stage (i.e., after sites are altered via keepSites
+        and removeSites).
+    @param reverseComplement: If C{True}, replace seqeunces with their reverse
+        complements. Reversing happens at a very late stage (i.e., after sites
+        are altered via keepSites and removeSites).
     @raises ValueError: If C{randomSubset} and C{sampleFraction} are both
         specified, or if C{randomSubset} is specified but C{trueLength} is not,
         or if the sequence numbers in C{sequenceNumbersFile} are
         non-positive or not ascending, or if both C{keepSites} and
         C{removeSites} are given, or if both C{keepSequences} and
         C{removeSequences} are given.
+    @raise AttributeError: If C{reverseComplement} is C{True} but the read
+        type does not allow for reverse complementing.
     """
 
     # TODO, when/if needed: make it possible to pass a seed for the RNG
@@ -830,7 +849,8 @@ class ReadFilter(object):
                  removeDescriptions=False, modifier=None, randomSubset=None,
                  trueLength=None, sampleFraction=None,
                  sequenceNumbersFile=None, idLambda=None, readLambda=None,
-                 keepSites=None, removeSites=None):
+                 keepSites=None, removeSites=None, reverse=False,
+                 reverseComplement=False):
 
         if randomSubset is not None:
             if sampleFraction is not None:
@@ -867,6 +887,12 @@ class ReadFilter(object):
         self.keepSites = keepSites
         self.removeSites = removeSites
 
+        if reverseComplement:
+            # Make sure reverse is not also set.
+            reverse = False
+        self.reverse = reverse
+        self.reverseComplement = reverseComplement
+
         self.alwaysFalse = False
         self.yieldCount = 0
         self.readIndex = -1
@@ -1069,6 +1095,11 @@ class ReadFilter(object):
         if self.removeDescriptions:
             read.id = read.id.split()[0]
 
+        if self.reverse:
+            read = read.reverse()
+        elif self.reverseComplement:
+            read = read.reverseComplement()
+
         self.yieldCount += 1
         return read
 
diff --git a/dark/sequence.py b/dark/sequence.py
index 6266569..028bd00 100644
--- a/dark/sequence.py
+++ b/dark/sequence.py
@@ -30,7 +30,7 @@ def findPrimer(primer, seq):
 
 def findPrimerBidi(primer, seq):
     """
-    Look for a primer in a sequence and its reverse compliment.
+    Look for a primer in a sequence and its reverse complement.
 
     @param primer: A C{str} primer sequence.
     @param seq: A BioPython C{Bio.Seq} sequence.
@@ -38,7 +38,7 @@ def findPrimerBidi(primer, seq):
     @return: A C{tuple} of two lists. The first contains (zero-based)
         ascending offsets into the sequence at which the primer can be found.
         The second is a similar list ascending offsets into the original
-        sequence where the primer matches the reverse complimented of the
+        sequence where the primer matches the reverse complemented of the
         sequence. If no instances are found, the corresponding list in the
         returned tuple must be empty.
     """
@@ -54,7 +54,7 @@ def findPrimerBidi(primer, seq):
 def findPrimerBidiLimits(primer, seq):
     """
     Report the extreme (inner) offsets of primer in a sequence and its
-    reverse compliment.
+    reverse complement.
 
     @param primer: A C{str} primer sequence.
     @param seq: A BioPython C{Bio.Seq} sequence.
diff --git a/requirements.txt b/requirements.txt
index 1c46c1e..8ae39e2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -10,7 +10,7 @@ numpy>=1.14.2
 pyfaidx==0.5.0
 pysam>=0.14.1
 pysam>=0.14.1
-pytest>=3.8.1
+pytest>=4.0.2
 pyzmq>=14.3.1
 requests>=2.18.4
 simplejson>=3.5.3

Add --reverse and --reverseCompliment options to filter-fasta.py
diff --git a/test/test_reads.py b/test/test_reads.py
index 4663234..8339e8a 100644
--- a/test/test_reads.py
+++ b/test/test_reads.py
@@ -619,6 +619,22 @@ class TestRead(TestCase):
                          Read('id1', 'ATCGAT').newFromSites({100, 200},
                                                             exclude=True))
 
+    def testReverseNoQuality(self):
+        """
+        The reverse method must work as expected when there is no quality
+        string.
+        """
+        self.assertEqual(Read('id1', 'ATCGAT'),
+                         Read('id1', 'TAGCTA').reverse())
+
+    def testReverseWithQuality(self):
+        """
+        The reverse method must work as expected when there is a quality
+        string.
+        """
+        self.assertEqual(Read('id1', 'ATCGAT', '123456'),
+                         Read('id1', 'TAGCTA', '654321').reverse())
+
 
 class TestDNARead(TestCase):
     """
@@ -3184,6 +3200,63 @@ class TestReadsFiltering(TestCase):
         (result,) = list(result)
         self.assertEqual(Read('xid1-x', 'AT'), result)
 
+    def testReverse(self):
+        """
+        When reverse=True, reads with the expected sequences and qualities
+        must be returned.
+        """
+        read1 = Read('id1', 'ATCGCC', '123456')
+        read2 = Read('id2', 'GGATCG', '987654')
+        reads = Reads(initialReads=[read1, read2])
+        result1, result2 = list(reads.filter(reverse=True))
+        self.assertEqual(Read('id1', 'CCGCTA', '654321'), result1)
+        self.assertEqual(Read('id2', 'GCTAGG', '456789'), result2)
+
+    def testReverseComplement(self):
+        """
+        When reverseComplement=True, reads with the expected sequences and
+        qualities must be returned when the reads are of type DNARead.
+        """
+        read1 = DNARead('id1', 'ATCGCC', '123456')
+        read2 = DNARead('id2', 'GGATCG', '987654')
+        reads = Reads(initialReads=[read1, read2])
+        result1, result2 = list(reads.filter(reverseComplement=True))
+        self.assertEqual(Read('id1', 'GGCGAT', '654321'), result1)
+        self.assertEqual(Read('id2', 'CGATCC', '456789'), result2)
+
+    def testReverseAndReverseComplement(self):
+        """
+        When reverseComplement=True and reverse=True, the expected reads must
+        be returned (reverse complemented) when the reads are of type DNARead.
+        """
+        read1 = DNARead('id1', 'ATCGCC', '123456')
+        read2 = DNARead('id2', 'GGATCG', '987654')
+        reads = Reads(initialReads=[read1, read2])
+        result1, result2 = list(reads.filter(reverseComplement=True,
+                                             reverse=True))
+        self.assertEqual(Read('id1', 'GGCGAT', '654321'), result1)
+        self.assertEqual(Read('id2', 'CGATCC', '456789'), result2)
+
+    def testReverseComplementNonDNA(self):
+        """
+        When reverseComplement=True and the read is not a DNARead, an
+        AttributeError must be raised.
+        """
+        reads = Reads(initialReads=[Read('id1', 'ATCGCC', '123456')])
+        error = "^'Read' object has no attribute 'reverseComplement'$"
+        six.assertRaisesRegex(self, AttributeError, error, list,
+                              reads.filter(reverseComplement=True))
+
+    def testReverseComplementAARead(self):
+        """
+        When reverseComplement=True and the read is an AARead, an
+        AttributeError must be raised.
+        """
+        reads = Reads(initialReads=[AARead('id1', 'ATCGCC', '123456')])
+        error = "^'AARead' object has no attribute 'reverseComplement'$"
+        six.assertRaisesRegex(self, AttributeError, error, list,
+                              reads.filter(reverseComplement=True))
+
 
 class TestReadsInRAM(TestCase):
     """
diff --git a/test/test_sam.py b/test/test_sam.py
index 42ef202..dc5908a 100644
--- a/test/test_sam.py
+++ b/test/test_sam.py
@@ -397,8 +397,8 @@ class TestPaddedSAM(TestCase):
 
     def testRcNeeded(self):
         """
-        A reverse-complimented match (flag = 16) when rcNeeded=True is passed
-        must result in the expected (reverse complimented) padded sequence
+        A reverse-complemented match (flag = 16) when rcNeeded=True is passed
+        must result in the expected (reverse complemented) padded sequence
         and reversed quality string.
         """
         data = '\n'.join([
@@ -413,7 +413,7 @@ class TestPaddedSAM(TestCase):
 
     def testRcSuffix(self):
         """
-        A reverse-complimented sequence should have the rcSuffix string added
+        A reverse-complemented sequence should have the rcSuffix string added
         to its id when an rcSuffix value is passed.
         """
         data = '\n'.join([

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.7
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
backcall==0.2.0
biopython==1.81
bz2file==0.98
certifi @ file:///croot/certifi_1671487769961/work/certifi
cffi==1.15.1
charset-normalizer==3.4.1
cycler==0.11.0
-e git+https://github.com/acorg/dark-matter.git@f0762e7528caea72a817d441e0a34af20349ed3d#egg=dark_matter
decorator==5.1.1
ete3==3.1.3
exceptiongroup==1.2.2
flake8==5.0.4
fonttools==4.38.0
idna==3.10
importlib-metadata==4.2.0
iniconfig==2.0.0
ipython==7.34.0
jedi==0.19.2
kiwisolver==1.4.5
matplotlib==3.5.3
matplotlib-inline==0.1.6
mccabe==0.7.0
mysql-connector-python==8.0.11
numpy==1.21.6
packaging==24.0
parso==0.8.4
pexpect==4.9.0
pickleshare==0.7.5
Pillow==9.5.0
pluggy==1.2.0
prompt_toolkit==3.0.48
protobuf==4.24.4
ptyprocess==0.7.0
pycodestyle==2.9.1
pycparser==2.21
pyfaidx==0.5.0
pyflakes==2.5.0
Pygments==2.17.2
pyparsing==3.1.4
pysam==0.23.0
pytest==7.4.4
python-dateutil==2.9.0.post0
pyzmq==26.2.1
requests==2.31.0
simplejson==3.20.1
six==1.17.0
tomli==2.0.1
traitlets==5.9.0
typing_extensions==4.7.1
urllib3==2.0.7
wcwidth==0.2.13
zipp==3.15.0

name: dark-matter
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - backcall==0.2.0
      - biopython==1.81
      - bz2file==0.98
      - cffi==1.15.1
      - charset-normalizer==3.4.1
      - cycler==0.11.0
      - decorator==5.1.1
      - ete3==3.1.3
      - exceptiongroup==1.2.2
      - flake8==5.0.4
      - fonttools==4.38.0
      - idna==3.10
      - importlib-metadata==4.2.0
      - iniconfig==2.0.0
      - ipython==7.34.0
      - jedi==0.19.2
      - kiwisolver==1.4.5
      - matplotlib==3.5.3
      - matplotlib-inline==0.1.6
      - mccabe==0.7.0
      - mysql-connector-python==8.0.11
      - numpy==1.21.6
      - packaging==24.0
      - parso==0.8.4
      - pexpect==4.9.0
      - pickleshare==0.7.5
      - pillow==9.5.0
      - pluggy==1.2.0
      - prompt-toolkit==3.0.48
      - protobuf==4.24.4
      - ptyprocess==0.7.0
      - pycodestyle==2.9.1
      - pycparser==2.21
      - pyfaidx==0.5.0
      - pyflakes==2.5.0
      - pygments==2.17.2
      - pyparsing==3.1.4
      - pysam==0.23.0
      - pytest==7.4.4
      - python-dateutil==2.9.0.post0
      - pyzmq==26.2.1
      - requests==2.31.0
      - simplejson==3.20.1
      - six==1.17.0
      - tomli==2.0.1
      - traitlets==5.9.0
      - typing-extensions==4.7.1
      - urllib3==2.0.7
      - wcwidth==0.2.13
      - zipp==3.15.0
prefix: /opt/conda/envs/dark-matter

test/test_reads.py::TestRead::testReverseNoQuality test/test_reads.py::TestRead::testReverseWithQuality test/test_reads.py::TestReadsFiltering::testReverse test/test_reads.py::TestReadsFiltering::testReverseAndReverseComplement test/test_reads.py::TestReadsFiltering::testReverseComplement test/test_reads.py::TestReadsFiltering::testReverseComplementAARead test/test_reads.py::TestReadsFiltering::testReverseComplementNonDNA
test/test_reads.py::TestReadsInRAM::testFastaFile
test/test_reads.py::TestRead::testCasePreservation test/test_reads.py::TestRead::testCheckAlphabetAAReadMatchingReturnTrue test/test_reads.py::TestRead::testCheckAlphabetAAReadNotMatchingRaise test/test_reads.py::TestRead::testCheckAlphabetDNAReadMatchingReturnTrue test/test_reads.py::TestRead::testCheckAlphabetDNAReadNotMatchingRaise test/test_reads.py::TestRead::testCheckAlphabetwithReadMustBePermissive test/test_reads.py::TestRead::testEquality test/test_reads.py::TestRead::testEqualityWithDifferingIds test/test_reads.py::TestRead::testEqualityWithDifferingQuality test/test_reads.py::TestRead::testEqualityWithDifferingSequences test/test_reads.py::TestRead::testEqualityWithNoQuality test/test_reads.py::TestRead::testEqualityWithOneOmittedQuality test/test_reads.py::TestRead::testExpectedAttributes test/test_reads.py::TestRead::testFromDict test/test_reads.py::TestRead::testFromDictNoQuality test/test_reads.py::TestRead::testGetitemFullCopy test/test_reads.py::TestRead::testGetitemId test/test_reads.py::TestRead::testGetitemLength test/test_reads.py::TestRead::testGetitemQuality test/test_reads.py::TestRead::testGetitemReturnsNewRead test/test_reads.py::TestRead::testGetitemReversed test/test_reads.py::TestRead::testGetitemSequence test/test_reads.py::TestRead::testGetitemSingleIndex test/test_reads.py::TestRead::testGetitemWithStep test/test_reads.py::TestRead::testHashDiffersIfIdDiffers test/test_reads.py::TestRead::testHashDiffersIfQualityDiffers test/test_reads.py::TestRead::testHashDiffersIfSequenceDiffers test/test_reads.py::TestRead::testHashIdenticalNoQuality test/test_reads.py::TestRead::testHashIdenticalWithQuality test/test_reads.py::TestRead::testHashViaDict test/test_reads.py::TestRead::testHashViaSet test/test_reads.py::TestRead::testKeepSites test/test_reads.py::TestRead::testKeepSitesAllSites test/test_reads.py::TestRead::testKeepSitesNoSites test/test_reads.py::TestRead::testKeepSitesOutOfRange test/test_reads.py::TestRead::testKeepSitesWithQuality test/test_reads.py::TestRead::testLength test/test_reads.py::TestRead::testLowComplexityFraction test/test_reads.py::TestRead::testLowComplexityFractionEmptySequence test/test_reads.py::TestRead::testLowComplexityFractionOne test/test_reads.py::TestRead::testLowComplexityFractionZero test/test_reads.py::TestRead::testNoQuality test/test_reads.py::TestRead::testRemoveSites test/test_reads.py::TestRead::testRemoveSitesAllSites test/test_reads.py::TestRead::testRemoveSitesNoSites test/test_reads.py::TestRead::testRemoveSitesOutOfRange test/test_reads.py::TestRead::testRemoveSitesWithQuality test/test_reads.py::TestRead::testToDict test/test_reads.py::TestRead::testToDictNoQuality test/test_reads.py::TestRead::testToFASTA test/test_reads.py::TestRead::testToFASTAWithQuality test/test_reads.py::TestRead::testToFASTQ test/test_reads.py::TestRead::testToFASTQWithNoQuality test/test_reads.py::TestRead::testToUnknownFormat test/test_reads.py::TestRead::testUnequalLengths test/test_reads.py::TestRead::testWalkHSPExactMatch test/test_reads.py::TestRead::testWalkHSPExactMatchWithGap test/test_reads.py::TestRead::testWalkHSPLeftAndRightOverhangingMatch test/test_reads.py::TestRead::testWalkHSPLeftAndRightOverhangingMatchNoWhiskers test/test_reads.py::TestRead::testWalkHSPLeftOverhangingMatch test/test_reads.py::TestRead::testWalkHSPLeftOverhangingMatchNoWhiskers test/test_reads.py::TestRead::testWalkHSPRightOverhangingMatch test/test_reads.py::TestRead::testWalkHSPRightOverhangingMatchNoWhiskers test/test_reads.py::TestDNARead::testGetitemReturnsNewDNARead test/test_reads.py::TestDNARead::testReverseComplement test/test_reads.py::TestDNARead::testReverseComplementAmbiguous test/test_reads.py::TestDNARead::testReverseComplementLowercaseLetters test/test_reads.py::TestDNARead::testReverseComplementReversesQuality test/test_reads.py::TestDNARead::testTranslationOfMultipleStopCodons test/test_reads.py::TestDNARead::testTranslationOfStartCodonATG test/test_reads.py::TestDNARead::testTranslationOfStopCodonTAG test/test_reads.py::TestDNARead::testTranslationOfStopCodonTGA test/test_reads.py::TestDNARead::testTranslations test/test_reads.py::TestDNARead::testTranslationsOfEmptySequence test/test_reads.py::TestDNARead::testTranslationsOfOneBaseSequence test/test_reads.py::TestDNARead::testTranslationsOfTwoBaseSequence test/test_reads.py::TestRNARead::testGetitemReturnsNewRNARead test/test_reads.py::TestRNARead::testReverseComplement test/test_reads.py::TestRNARead::testReverseComplementAmbiguous test/test_reads.py::TestRNARead::testTranslationOfStopCodonUAA test/test_reads.py::TestAARead::testCloseCloseORF test/test_reads.py::TestAARead::testCloseCloseThenCloseCloseORF test/test_reads.py::TestAARead::testCloseCloseThenCloseCloseThenCloseCloseORF test/test_reads.py::TestAARead::testCloseCloseThenCloseCloseThenCloseCloseORFWithJunk test/test_reads.py::TestAARead::testCloseCloseThenCloseCloseThenCloseOpenORF test/test_reads.py::TestAARead::testCloseCloseThenCloseCloseThenCloseOpenORFWithJunk test/test_reads.py::TestAARead::testCloseCloseThenCloseOpenORF test/test_reads.py::TestAARead::testCloseOpenORF test/test_reads.py::TestAARead::testCloseOpenORFWithMultipleStarts test/test_reads.py::TestAARead::testGetitemReturnsNewAARead test/test_reads.py::TestAARead::testNoStartCodon_GithubIssue239 test/test_reads.py::TestAARead::testORFsEmptySequence test/test_reads.py::TestAARead::testORFsEmptySequenceWithStart test/test_reads.py::TestAARead::testORFsEmptySequenceWithStartStop test/test_reads.py::TestAARead::testORFsWithJustStartsAndStops test/test_reads.py::TestAARead::testORFsWithOneStopCodon test/test_reads.py::TestAARead::testORFsWithTwoStopCodons test/test_reads.py::TestAARead::testOpenCloseORF test/test_reads.py::TestAARead::testOpenCloseORFWithMultipleStops test/test_reads.py::TestAARead::testOpenCloseThenCloseCloseThenCloseOpenORF test/test_reads.py::TestAARead::testOpenCloseThenCloseCloseThenCloseOpenORFWithJunk test/test_reads.py::TestAARead::testOpenCloseThenCloseOpenORF test/test_reads.py::TestAARead::testOpenOpenORF test/test_reads.py::TestAARead::testPropertiesCorrectTranslation test/test_reads.py::TestAARead::testPropertyDetailsCorrectTranslation test/test_reads.py::TestAAReadWithX::testAlphabet test/test_reads.py::TestAAReadWithX::testAlphabetChecking test/test_reads.py::TestAAReadWithX::testGetitemReturnsNewAAReadWithX test/test_reads.py::TestAAReadORF::testClosedClosedId test/test_reads.py::TestAAReadORF::testClosedOpenId test/test_reads.py::TestAAReadORF::testFromDict test/test_reads.py::TestAAReadORF::testOpenClosedId test/test_reads.py::TestAAReadORF::testOpenLeft test/test_reads.py::TestAAReadORF::testOpenOpenId test/test_reads.py::TestAAReadORF::testOpenRight test/test_reads.py::TestAAReadORF::testSequence test/test_reads.py::TestAAReadORF::testStart test/test_reads.py::TestAAReadORF::testStartGreaterThanStop test/test_reads.py::TestAAReadORF::testStartNegative test/test_reads.py::TestAAReadORF::testStop test/test_reads.py::TestAAReadORF::testStopGreaterThanOriginalSequenceLength test/test_reads.py::TestAAReadORF::testToDict test/test_reads.py::TestSSAARead::testCorrectAttributes test/test_reads.py::TestSSAARead::testFromDict test/test_reads.py::TestSSAARead::testGetitemFullCopy test/test_reads.py::TestSSAARead::testGetitemId test/test_reads.py::TestSSAARead::testGetitemLength test/test_reads.py::TestSSAARead::testGetitemReturnsNewRead test/test_reads.py::TestSSAARead::testGetitemReversed test/test_reads.py::TestSSAARead::testGetitemSequence test/test_reads.py::TestSSAARead::testGetitemSingleIndex test/test_reads.py::TestSSAARead::testGetitemStructure test/test_reads.py::TestSSAARead::testGetitemWithStep test/test_reads.py::TestSSAARead::testHashDiffersIfIdDiffers test/test_reads.py::TestSSAARead::testHashDiffersIfSequenceDiffers test/test_reads.py::TestSSAARead::testHashDiffersIfStructureDiffers test/test_reads.py::TestSSAARead::testHashViaDict test/test_reads.py::TestSSAARead::testHashViaSet test/test_reads.py::TestSSAARead::testKeepSites test/test_reads.py::TestSSAARead::testKeepSitesAllSites test/test_reads.py::TestSSAARead::testKeepSitesNoSites test/test_reads.py::TestSSAARead::testKeepSitesOutOfRange test/test_reads.py::TestSSAARead::testReads test/test_reads.py::TestSSAARead::testRemoveSites test/test_reads.py::TestSSAARead::testRemoveSitesAllSites test/test_reads.py::TestSSAARead::testRemoveSitesNoSites test/test_reads.py::TestSSAARead::testRemoveSitesOutOfRange test/test_reads.py::TestSSAARead::testSequenceLengthMatchesStructureLength test/test_reads.py::TestSSAARead::testToDict test/test_reads.py::TestSSAARead::testToString test/test_reads.py::TestSSAARead::testToStringWithExplicitFastaFormat test/test_reads.py::TestSSAARead::testToStringWithExplicitFastaSSFormat test/test_reads.py::TestSSAARead::testToStringWithStructureSuffix test/test_reads.py::TestSSAARead::testToStringWithUnknownFormat test/test_reads.py::TestSSAAReadWithX::testCorrectAttributes test/test_reads.py::TestSSAAReadWithX::testFromDict test/test_reads.py::TestSSAAReadWithX::testGetitemFullCopy test/test_reads.py::TestSSAAReadWithX::testGetitemId test/test_reads.py::TestSSAAReadWithX::testGetitemLength test/test_reads.py::TestSSAAReadWithX::testGetitemReturnsNewRead test/test_reads.py::TestSSAAReadWithX::testGetitemReversed test/test_reads.py::TestSSAAReadWithX::testGetitemSequence test/test_reads.py::TestSSAAReadWithX::testGetitemSingleIndex test/test_reads.py::TestSSAAReadWithX::testGetitemStructure test/test_reads.py::TestSSAAReadWithX::testGetitemWithStep test/test_reads.py::TestSSAAReadWithX::testHashDiffersIfIdDiffers test/test_reads.py::TestSSAAReadWithX::testHashDiffersIfSequenceDiffers test/test_reads.py::TestSSAAReadWithX::testHashDiffersIfStructureDiffers test/test_reads.py::TestSSAAReadWithX::testHashViaDict test/test_reads.py::TestSSAAReadWithX::testHashViaSet test/test_reads.py::TestSSAAReadWithX::testKeepSites test/test_reads.py::TestSSAAReadWithX::testKeepSitesAllSites test/test_reads.py::TestSSAAReadWithX::testKeepSitesNoSites test/test_reads.py::TestSSAAReadWithX::testKeepSitesOutOfRange test/test_reads.py::TestSSAAReadWithX::testReads test/test_reads.py::TestSSAAReadWithX::testRemoveSites test/test_reads.py::TestSSAAReadWithX::testRemoveSitesAllSites test/test_reads.py::TestSSAAReadWithX::testRemoveSitesNoSites test/test_reads.py::TestSSAAReadWithX::testRemoveSitesOutOfRange test/test_reads.py::TestSSAAReadWithX::testSequenceContainingX test/test_reads.py::TestSSAAReadWithX::testSequenceLengthMatchesStructureLength test/test_reads.py::TestSSAAReadWithX::testToDict test/test_reads.py::TestSSAAReadWithX::testToString test/test_reads.py::TestSSAAReadWithX::testToStringWithExplicitFastaFormat test/test_reads.py::TestSSAAReadWithX::testToStringWithExplicitFastaSSFormat test/test_reads.py::TestSSAAReadWithX::testToStringWithStructureSuffix test/test_reads.py::TestSSAAReadWithX::testToStringWithUnknownFormat test/test_reads.py::TestTranslatedRead::testExpectedAttributes test/test_reads.py::TestTranslatedRead::testExpectedFrame test/test_reads.py::TestTranslatedRead::testFromDict test/test_reads.py::TestTranslatedRead::testId test/test_reads.py::TestTranslatedRead::testIdReverseComplemented test/test_reads.py::TestTranslatedRead::testMaximumORFLength test/test_reads.py::TestTranslatedRead::testMaximumORFLengthNoStops test/test_reads.py::TestTranslatedRead::testOutOfRangeFrame test/test_reads.py::TestTranslatedRead::testReverseComplemented test/test_reads.py::TestTranslatedRead::testSequence test/test_reads.py::TestTranslatedRead::testToDict test/test_reads.py::TestReadClassNameToClass::testNames test/test_reads.py::TestReads::testEmptyInitialReads test/test_reads.py::TestReads::testInitialReads test/test_reads.py::TestReads::testManuallyAddedReads test/test_reads.py::TestReads::testManuallyAddedReadsLength test/test_reads.py::TestReads::testNoReads test/test_reads.py::TestReads::testNoReadsLength test/test_reads.py::TestReads::testRepeatedIter test/test_reads.py::TestReads::testSaveAsFASTA test/test_reads.py::TestReads::testSaveAsFASTQ test/test_reads.py::TestReads::testSaveAsFASTQFailsOnReadWithNoQuality test/test_reads.py::TestReads::testSaveFASTAIsDefault test/test_reads.py::TestReads::testSaveReturnsReadCount test/test_reads.py::TestReads::testSaveToFileDescriptor test/test_reads.py::TestReads::testSaveWithUnknownFormat test/test_reads.py::TestReads::testSaveWithUppercaseFormat test/test_reads.py::TestReads::testSubclass test/test_reads.py::TestReads::testSubclassLength test/test_reads.py::TestReads::testSubclassWithAdditionalReads test/test_reads.py::TestReads::testUnfilteredLengthAdditionalReads test/test_reads.py::TestReads::testUnfilteredLengthAdditionalReadsAfterFiltering test/test_reads.py::TestReads::testUnfilteredLengthBeforeIterating test/test_reads.py::TestReads::testUnfilteredLengthInitialReads test/test_reads.py::TestReads::testUnfilteredLengthInitialReadsAfterFiltering test/test_reads.py::TestReads::testUnfilteredLengthInitialReadsIsReads test/test_reads.py::TestReads::testUnfilteredLengthInitialReadsIsReadsWithAdditional test/test_reads.py::TestReads::testUnfilteredLengthInitialSubclassThenFiltered test/test_reads.py::TestReads::testUnfilteredLengthInitialSubclassWithAdditionalThenFiltered test/test_reads.py::TestReads::testUnfilteredLengthInitialSubclassWithNoLen test/test_reads.py::TestReads::testUnfilteredLengthNoReads test/test_reads.py::TestReadsFiltering::testAddFiltersThenClearFilters test/test_reads.py::TestReadsFiltering::testFilterBlacklist test/test_reads.py::TestReadsFiltering::testFilterDoNotRemoveDescriptions test/test_reads.py::TestReadsFiltering::testFilterDuplicates test/test_reads.py::TestReadsFiltering::testFilterDuplicatesById test/test_reads.py::TestReadsFiltering::testFilterHead test/test_reads.py::TestReadsFiltering::testFilterHeadZero test/test_reads.py::TestReadsFiltering::testFilterKeepSequences test/test_reads.py::TestReadsFiltering::testFilterKeepSequencesNoSequences test/test_reads.py::TestReadsFiltering::testFilterNegativeRegex test/test_reads.py::TestReadsFiltering::testFilterNoArgs test/test_reads.py::TestReadsFiltering::testFilterOnLengthEverythingMatches test/test_reads.py::TestReadsFiltering::testFilterOnLengthNothingMatches test/test_reads.py::TestReadsFiltering::testFilterOnMaxLength test/test_reads.py::TestReadsFiltering::testFilterOnMinLength test/test_reads.py::TestReadsFiltering::testFilterPositiveRegex test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetOfFiveFromFiveReads test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetOfFiveFromOneRead test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetOfOneFromOneRead test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetOfTwoFromFiveReads test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetOfZeroReads test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetSizeZeroNoReads test/test_reads.py::TestReadsFiltering::testFilterRandomSubsetSizeZeroTwoReads test/test_reads.py::TestReadsFiltering::testFilterRemoveDescriptions test/test_reads.py::TestReadsFiltering::testFilterRemoveGaps test/test_reads.py::TestReadsFiltering::testFilterRemoveGapsWithQuality test/test_reads.py::TestReadsFiltering::testFilterRemoveSequences test/test_reads.py::TestReadsFiltering::testFilterRemoveSequencesNoSequences test/test_reads.py::TestReadsFiltering::testFilterReturnsReadInstance test/test_reads.py::TestReadsFiltering::testFilterTruncateTitles test/test_reads.py::TestReadsFiltering::testFilterWhitelist test/test_reads.py::TestReadsFiltering::testFilterWithMinLengthEqualToMaxLength test/test_reads.py::TestReadsFiltering::testFilterWithModifierThatChangesIds test/test_reads.py::TestReadsFiltering::testFilterWithModifierThatOmits test/test_reads.py::TestReadsFiltering::testFilterWithModifierThatOmitsAndChangesIds test/test_reads.py::TestReadsFiltering::testFilteredReadsInstanceHasExpectedLength test/test_reads.py::TestReadsFiltering::testIdLambda test/test_reads.py::TestReadsFiltering::testIdLambdaReturningNone test/test_reads.py::TestReadsFiltering::testKeepSites test/test_reads.py::TestReadsFiltering::testKeepSitesAllSites test/test_reads.py::TestReadsFiltering::testKeepSitesNoSites test/test_reads.py::TestReadsFiltering::testKeepSitesOutOfRange test/test_reads.py::TestReadsFiltering::testKeepSitesWithQuality test/test_reads.py::TestReadsFiltering::testLineNumberFile test/test_reads.py::TestReadsFiltering::testLineNumberFileEmpty test/test_reads.py::TestReadsFiltering::testLineNumberFileFirstLineTooSmall test/test_reads.py::TestReadsFiltering::testLineNumberFileNonAscending test/test_reads.py::TestReadsFiltering::testLineNumberFileRunOutOfSequences test/test_reads.py::TestReadsFiltering::testReadLambda test/test_reads.py::TestReadsFiltering::testReadLambdaReturningNone test/test_reads.py::TestReadsFiltering::testRemoveAndKeepSites test/test_reads.py::TestReadsFiltering::testRemoveSites test/test_reads.py::TestReadsFiltering::testRemoveSitesAllSites test/test_reads.py::TestReadsFiltering::testRemoveSitesNoSites test/test_reads.py::TestReadsFiltering::testRemoveSitesOutOfRange test/test_reads.py::TestReadsFiltering::testRemoveSitesWithQuality test/test_reads.py::TestReadsFiltering::testSampleFractionAndNoTrueLengthRaisesValueError test/test_reads.py::TestReadsFiltering::testSampleFractionAndRandomSubsetRaisesValueError test/test_reads.py::TestReadsFiltering::testSampleFractionOne test/test_reads.py::TestReadsFiltering::testSampleFractionPointOne test/test_reads.py::TestReadsFiltering::testSampleFractionZero test/test_reads.py::TestReadsInRAM::testAdd test/test_reads.py::TestReadsInRAM::testFromReads test/test_reads.py::TestReadsInRAM::testNoReads test/test_reads.py::TestReadsInRAM::testOneReadIndex test/test_reads.py::TestReadsInRAM::testOneReadLength test/test_reads.py::TestReadsInRAM::testOneReadList test/test_reads.py::TestReadsInRAM::testSetItem test/test_reads.py::TestReadsInRAM::testTwoReadsIndex test/test_reads.py::TestReadsInRAM::testTwoReadsLength test/test_reads.py::TestReadsInRAM::testTwoReadsList test/test_reads.py::TestSummarizePosition::testCorrectFrequencies test/test_reads.py::TestSummarizePosition::testExcludeShortSequences test/test_reads.py::TestSummarizePosition::testFrequenciesNoReads test/test_reads.py::TestSummarizePosition::testIndexLargerThanSequenceLength test/test_reads.py::TestSummarizePosition::testNumberOfExclusionsNoReads test/test_reads.py::TestSitesMatching::testAllMatches test/test_reads.py::TestSitesMatching::testIgnoreCase test/test_reads.py::TestSitesMatching::testMatchCase test/test_reads.py::TestSitesMatching::testMultipleReadsAll test/test_reads.py::TestSitesMatching::testMultipleReadsAllWithDifferingLengths test/test_reads.py::TestSitesMatching::testMultipleReadsAny test/test_reads.py::TestSitesMatching::testMultipleReadsAnyWithDifferingLengths test/test_reads.py::TestSitesMatching::testNoMatches test/test_reads.py::TestSitesMatching::testPartialMatch test/test_sam.py::TestSAMFilter::testAlignmentCount test/test_sam.py::TestSAMFilter::testCloseButNoCIGAR test/test_sam.py::TestSAMFilter::testDropDuplicates test/test_sam.py::TestSAMFilter::testDropSecondary test/test_sam.py::TestSAMFilter::testDropSupplementary test/test_sam.py::TestSAMFilter::testKeepQualityControlFailures test/test_sam.py::TestSAMFilter::testMaxScore test/test_sam.py::TestSAMFilter::testMaxScoreNoScores test/test_sam.py::TestSAMFilter::testMinAndMaxScore test/test_sam.py::TestSAMFilter::testMinLength test/test_sam.py::TestSAMFilter::testMinScore test/test_sam.py::TestSAMFilter::testMinScoreNoScores test/test_sam.py::TestSAMFilter::testNoQuality test/test_sam.py::TestSAMFilter::testStoreQueryIds test/test_sam.py::TestSAMFilter::testUnknownReferences test/test_sam.py::TestPaddedSAM::testAllMMatch test/test_sam.py::TestPaddedSAM::testAllowDuplicateIds test/test_sam.py::TestPaddedSAM::testAlsoYieldAlignments test/test_sam.py::TestPaddedSAM::testDropDuplicates test/test_sam.py::TestPaddedSAM::testDropSecondary test/test_sam.py::TestPaddedSAM::testDropSupplementary test/test_sam.py::TestPaddedSAM::testDuplicateIdDisambiguation test/test_sam.py::TestPaddedSAM::testHardClipLeft test/test_sam.py::TestPaddedSAM::testHardClipRight test/test_sam.py::TestPaddedSAM::testHardClippingInCIGARButQueryNotHardClipped test/test_sam.py::TestPaddedSAM::testKF414679SoftClipLeft test/test_sam.py::TestPaddedSAM::testKeepQualityControlFailures test/test_sam.py::TestPaddedSAM::testMinLength test/test_sam.py::TestPaddedSAM::testMixedMatch test/test_sam.py::TestPaddedSAM::testMixedMatchSpecificReference test/test_sam.py::TestPaddedSAM::testMixedMatchSpecificReferenceButNoMatches test/test_sam.py::TestPaddedSAM::testNotSecondaryAndNotSupplementaryWithNoSequence test/test_sam.py::TestPaddedSAM::testPrimaryAndSecondaryReferenceInsertion test/test_sam.py::TestPaddedSAM::testQueryHardClipAndSoftClipProtrudesBothSides test/test_sam.py::TestPaddedSAM::testQuerySoftClipLeft test/test_sam.py::TestPaddedSAM::testQuerySoftClipProtrudesBothSides test/test_sam.py::TestPaddedSAM::testQuerySoftClipProtrudesLeft test/test_sam.py::TestPaddedSAM::testQuerySoftClipProtrudesRight test/test_sam.py::TestPaddedSAM::testQuerySoftClipReachesLeftEdge test/test_sam.py::TestPaddedSAM::testQuerySoftClipReachesRightEdge test/test_sam.py::TestPaddedSAM::testQuerySoftClipRight test/test_sam.py::TestPaddedSAM::testQueryTooLong test/test_sam.py::TestPaddedSAM::testRcNeeded test/test_sam.py::TestPaddedSAM::testRcSuffix test/test_sam.py::TestPaddedSAM::testReferenceDeletion test/test_sam.py::TestPaddedSAM::testReferenceDeletionAlternateChars test/test_sam.py::TestPaddedSAM::testReferenceInsertion test/test_sam.py::TestPaddedSAM::testReferenceSkip test/test_sam.py::TestPaddedSAM::testReferenceSkipAlternateChars test/test_sam.py::TestPaddedSAM::testSecondaryAlignmentHasQuery test/test_sam.py::TestPaddedSAM::testSecondaryWithNoPreviousSequence test/test_sam.py::TestPaddedSAM::testSecondaryWithNoSequence test/test_sam.py::TestPaddedSAM::testSupplementaryAlignmentHasQuery test/test_sam.py::TestPaddedSAM::testSupplementaryWithNoPreviousSequence test/test_sam.py::TestPaddedSAM::testSupplementaryWithNoSequence test/test_sam.py::TestPaddedSAM::testUnequalReferenceLengths test/test_sam.py::TestSamReferencesToStr::testIndent test/test_sam.py::TestSamReferencesToStr::testSimple test/test_sam.py::TestHardClip::testClipBoth test/test_sam.py::TestHardClip::testClipBothAlreadyDone test/test_sam.py::TestHardClip::testClipLeft test/test_sam.py::TestHardClip::testClipLeftAlreadyDone test/test_sam.py::TestHardClip::testClipRight test/test_sam.py::TestHardClip::testClipRightAlreadyDone test/test_sam.py::TestHardClip::testHardClipInMiddle test/test_sam.py::TestHardClip::testNoClip test/test_sam.py::TestHardClip::testThreeHardClips
dark/reads.py bin/convert-diamond-to-sam.py CHANGELOG.md dark/__init__.py requirements.txt dark/filter.py dark/sequence.py
dark/reads.py bin/convert-diamond-to-sam.py CHANGELOG.md dark/__init__.py requirements.txt dark/filter.py dark/sequence.py