Skip to content

Commit

Permalink
wip: Throw error if reference embedding target CRAM is not sorted
Browse files Browse the repository at this point in the history
  • Loading branch information
athos committed Oct 10, 2024
1 parent 2ccd5a5 commit de3fc6a
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 26 deletions.
22 changes: 15 additions & 7 deletions src/cljam/io/cram/writer.clj
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,21 @@
(defn write-header
"Writes the CRAM header."
[^CRAMWriter wtr header]
(when (and (.-index-writer wtr)
(not (:skip-sort-order-check? (.-options wtr)))
(not= (sam.header/sort-order header) sam.header/order-coordinate))
(throw
(ex-info "Cannot create CRAM index file for CRAM file not declared as sorted by coordinate"
{:sort-order (sam.header/sort-order header)})))
(struct/encode-cram-header-container (.-stream wtr) header))
(let [opts (.-options wtr)
sort-order (sam.header/sort-order header)]
(when (and (not (= sort-order sam.header/order-coordinate))
(not (:skip-sort-order-check? opts)))
(when (.-index-writer wtr)
(throw
(ex-info (str "Cannot create CRAM index file for CRAM file not declared "
"as sorted by coordinate")
{:sort-order sort-order})))
(when (:embed-reference? opts)
(throw
(ex-info (str "Cannot embed reference sequences for CRAM file not declared "
"as sorted by coordinate")
{:sort-order sort-order}))))
(struct/encode-cram-header-container (.-stream wtr) header)))

(defn- preprocess-records
[cram-header seq-resolver options ^objects container-records]
Expand Down
58 changes: 39 additions & 19 deletions test/cljam/io/cram_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -143,25 +143,45 @@
(deftest writer-with-reference-embedding-test
(with-before-after {:before (prepare-cache!)
:after (clean-cache!)}
(with-open [r (cram/reader common/test-sorted-cram-file
{:reference common/test-fa-file})
w (cram/writer temp-sorted-cram-file
{:reference common/test-fa-file
:embed-reference? true
:ds-compressor-overrides {:embedded-ref :raw}})]
(cram/write-header w (cram/read-header r))
(cram/write-alignments w (cram/read-alignments r) (cram/read-header r)))
(with-open [r (cram/reader common/test-sorted-cram-file
{:reference common/test-fa-file})
r' (cram/reader temp-sorted-cram-file)]
(is (= (cram/read-header r)
(cram/read-header r')))
(is (= (cram/read-alignments r)
(cram/read-alignments r'))))
(with-open [r (cram/reader temp-sorted-cram-file)]
(let [headers (all-compression-headers r)]
(is (seq headers))
(is (every? #(false? (get-in % [:preservation-map :RR])) headers))))))
(testing "Reference embedding will be enabled if `:embed-reference?` is set to true"
(with-open [r (cram/reader common/test-sorted-cram-file
{:reference common/test-fa-file})
w (cram/writer temp-sorted-cram-file
{:reference common/test-fa-file
:embed-reference? true
:skip-sort-order-check? true
:ds-compressor-overrides {:embedded-ref :raw}})]
(cram/write-header w (cram/read-header r))
(cram/write-alignments w (cram/read-alignments r) (cram/read-header r)))
(with-open [r (cram/reader common/test-sorted-cram-file
{:reference common/test-fa-file})
r' (cram/reader temp-sorted-cram-file)]
(is (= (cram/read-header r)
(cram/read-header r')))
(is (= (cram/read-alignments r)
(cram/read-alignments r'))))
(with-open [r (cram/reader temp-sorted-cram-file)]
(let [headers (all-compression-headers r)]
(is (seq headers))
(is (every? #(false? (get-in % [:preservation-map :RR])) headers)))))
(testing "Error when trying to embed reference sequences for a CRAM file not declared as `SO:coordinate`"
(with-open [r (cram/reader common/test-sorted-with-unknown-so-cram-file
{:reference common/test-fa-file})
w (cram/writer temp-cram-file
{:reference common/test-fa-file
:embed-reference? true
:ds-compressor-overrides {:embedded-ref :raw}})]
(is (thrown-with-msg? Exception #"Cannot embed reference sequences for CRAM file not declared as sorted by coordinate"
(cram/write-header w (cram/read-header r))))))
(testing "`:skip-sort-order-check?` skips the header check when embedding reference sequences"
(with-open [r (cram/reader common/test-sorted-with-unknown-so-cram-file
{:reference common/test-fa-file})
w (cram/writer temp-cram-file
{:reference common/test-fa-file
:embed-reference? true
:skip-sort-order-check? true
:ds-compressor-overrides {:embedded-ref :raw}})]
(is (any? (cram/write-header w (cram/read-header r))))))))

(deftest writer-index-options-test
(with-before-after {:before (prepare-cache!)
Expand Down

0 comments on commit de3fc6a

Please sign in to comment.