RangedSummarizedExperiment.js

import { RangedSummarizedExperiment } from "bioconductor";
import { H5Group, H5DataSet } from "./h5.js";
import { readObject, readObjectFile, saveObject } from "./general.js";
import { readSummarizedExperiment, saveSummarizedExperiment } from "./SummarizedExperiment.js"; 

/**
 * A ranged summarized experiment.
 * @external RangedSummarizedExperiment 
 * @see {@link https://ltla.github.io/bioconductor.js/RangedSummarizedExperiment.html}
 */

/**
 * @param {string} path - Path to the takane-formatted object directory containing the {@link external:RangedSummarizedExperiment RangedSummarizedExperiment}.
 * @param {object} metadata - Takane object metadata, typically generated by calling {@linkcode readObjectFile} on `path`.
 * @param {object} globals - Object containing `fs`, an object satisfying the {@link GlobalFsInterface}; and `h5`, an object satisfying the {@link GlobalH5Interface}.
 * @param {object} [options={}] - Further options, see also {@link readSummarizedExperiment}.
 *
 * @return {external:RangedSummarizedExperiment} The ranged summarized experiment object.
 * @async
 */
export async function readRangedSummarizedExperiment(path, metadata, globals, options = {}) {
    let se = await readSummarizedExperiment(path, metadata, globals, options);

    let rse = new RangedSummarizedExperiment(
        se.assays(),
        null,
        {
            assayOrder: se.assayNames(),
            rowData: se.rowData(),
            columnData: se.columnData(),
            rowNames: se.rowNames(),
            columnNames: se.columnNames(),
            metadata: se.metadata(),
        }
    );

    return rse;
}

/**
 * @param {external:RangedSummarizedExperiment} x - The ranged summarized experiment.
 * @param {string} path - Path to the directory in which to save `x`.
 * @param {object} globals - Object containing `fs`, an object satisfying the {@link GlobalFsInterface}; and `h5`, an object satisfying the {@link GlobalH5Interface}.
 * @param {object} [options={}] - Further options, see also {@linkcode saveSummarizedExperiment}.
 *
 * @return `x` is stored at `path`.
 * @async
 */
export async function saveRangedSummarizedExperiment(x, path, globals, options = {}) {
    await saveSummarizedExperiment(x, path, globals, options);
    const existing = await readObjectFile(path, globals);
    existing.type = "ranged_summarized_experiment";
    existing.ranged_summarized_experiment = { "version": "1.0" };
    await globals.fs.write(path + "/OBJECT", JSON.stringify(existing));
}