diff --git a/src/cljam/io/cram/writer.clj b/src/cljam/io/cram/writer.clj index 8b6f24cb..2f787c71 100644 --- a/src/cljam/io/cram/writer.clj +++ b/src/cljam/io/cram/writer.clj @@ -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] diff --git a/test/cljam/io/cram_test.clj b/test/cljam/io/cram_test.clj index 50ec6d1f..a18ffd9d 100644 --- a/test/cljam/io/cram_test.clj +++ b/test/cljam/io/cram_test.clj @@ -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!)