diff --git a/cooltools/api/rearrange.py b/cooltools/api/rearrange.py index 82fd05f4..ae2ac226 100644 --- a/cooltools/api/rearrange.py +++ b/cooltools/api/rearrange.py @@ -202,6 +202,8 @@ def rearrange_cooler( bins_old, view_df, new_chrom_col=new_chrom_col, orientation_col=orientation_col ) logging.info("Creating a new cooler") + # fetching pixel dtypes to avoid implicit casts of count column + dtypes = clr.pixels().dtypes.to_dict() cooler.create_cooler( out_cooler, bins_new, @@ -210,6 +212,7 @@ def rearrange_cooler( bin_mapping, chunksize=chunksize, ), + dtypes = dtypes, assembly=assembly, mode=mode, mergebuf=int(2e7), diff --git a/tests/data/float_counts.cool b/tests/data/float_counts.cool new file mode 100644 index 00000000..1a565999 Binary files /dev/null and b/tests/data/float_counts.cool differ diff --git a/tests/test_rearrange_cooler.py b/tests/test_rearrange_cooler.py index dc50f57c..41765196 100644 --- a/tests/test_rearrange_cooler.py +++ b/tests/test_rearrange_cooler.py @@ -62,7 +62,7 @@ def test_rearrange_cooler(request): # III. # Check that when taking two chromosomes in a different order and inverting one, - # all is ax espected + # all is as espected reorder_invert_view = ( orig_view.iloc[1::-1].assign(strand=["+", "-"]).reset_index(drop=True) @@ -136,3 +136,15 @@ def test_rearrange_cooler(request): ::-1, : ] assert np.array_equal(old_trans_m, reordered_inverted_trans_m, equal_nan=True) + + # IV. + # Check that pixel datatypes are propagated to output cooler + float_clr = cooler.Cooler(op.join(request.fspath.dirname, "data/float_counts.cool")) + new_view = bioframe.make_viewframe(float_clr.chromsizes) + rearrange_cooler(float_clr, new_view, "test_propagated_datatypes.cool") + + propagate_clr = cooler.Cooler("test_propagated_datatypes.cool") + assert_frame_equal( + float_clr.pixels()[:], + propagate_clr.pixels()[:] + )