Skip to content

Platform: Seq-Scope (--platform seqscope)

Built-in profile for Seq-Scope. The usual input is a MEX triple (barcodes.tsv.gz, features.tsv.gz, matrix.mtx.gz) in the Seq-Scope dialect: the barcode file carries the spatial coordinates, and the feature file and matrix carry five count columns per entry instead of one. sge_convert --platform seqscope (via spatula convert-sge) reads that dialect; this profile wires it into the end-to-end run. A raw per-molecule TSV can be ingested instead with --raw-transcript.

Seq-Scope has no cell segmentation, so the run is pixel-level throughout: ingest → FICTURE → packaging (+ histology). No cell analysis stage is planned or expected.

Expected inputs

--in-dir is the MEX directory itself — there is no standard parent layout to search:

File in --in-dir Contents
barcodes.tsv.gz barcode, index, …, X (col 6), Y (col 7), counts — coordinates in nanometers
features.tsv.gz gene_id, gene_name, index, counts
matrix.mtx.gz MatrixMarket with 5 count columns: gn, gt, spl, unspl, ambig

Alternatively, --raw-transcript / a raw_transcript column names a raw per-molecule TSV (header #lane tile X Y gene_id gene gn gt spl unspl ambig, coordinates in nanometers), which sge_convert ingests through its CSV route (--in-csv) instead of the MEX; --in-dir is then not needed. An already-ingested transcript can be given with --in-transcript.

Histology has no standard filename, so it is always given explicitly with --image (see Images).

Defaults: ingest with --units-per-um 1000 (nm → µm), --icols-mtx 2 (the gene-exon count), --sge-visual; FICTURE width=12, n_factor=24,48,96, single-molecule mode; packaging with --use-pmpoint --bin-count 500.


1. Single sample

1
2
3
4
5
cartloader run_together --platform seqscope \
    --in-dir /data/seqscope/sample1/mex \
    --out-dir OUT \
    --image type=hne,source=/data/seqscope/sample1/HE.tif \
    --width 12 --n-factor 24

The sample id defaults to rep1, so the packaged directory is OUT/cartl/<OUT basename>-rep1/; override with --id.

From the raw per-molecule TSV instead:

1
2
3
cartloader run_together --platform seqscope \
    --raw-transcript /data/seqscope/sample1/molecules.tsv.gz \
    --out-dir OUT --width 12 --n-factor 24

2. Multi-sample (sample sheet)

Each row's in_dir is that sample's MEX directory (or give raw_transcript). Images come from a separate --images TSV keyed by sample:

samples.tsv

1
2
3
id     in_dir
liver1 /data/seqscope/liver1/mex
liver2 /data/seqscope/liver2/mex

images.tsv

1
2
3
sample type source
liver1 hne  /data/seqscope/liver1/HE.tif
liver2 hne  /data/seqscope/liver2/HE.tif
1
2
cartloader run_together --platform seqscope \
    --samples samples.tsv --images images.tsv --out-dir OUT -j 8

Hosting without FICTURE

Seq-Scope datasets are often published without factor analysis. Add --no-ficture to any of the commands above:

1
2
cartloader run_together --platform seqscope --in-dir /data/mex --out-dir OUT --no-ficture \
    --image type=hne,source=/data/HE.tif

Only FICTURE's tiling step runs; the packaged output carries the transcript points, the SGE raster basemap, and the histology, with no factor layers. Nothing about this is Seq-Scope specific — it works on every platform. See FICTURE mode.

Hexagon-binned 10x MEX files

To also get the hexagon-binned counts as 10x MEX directories (for Seurat/Scanpy-style downstream analysis), add --segment-10x, optionally with the widths to export:

1
2
cartloader run_together --platform seqscope --in-dir /data/mex --out-dir OUT --no-ficture \
    --segment-10x --segment-width-10x 12,24

For a wide hexagon (roughly --width above 40), also raise the tiling size — punkst rejects a tile under 20× the hexagon side length and recommends 50–100× — e.g. --width 100 --tile-size 5000 (config: "tile_size": 5000). Each sample and width yields OUT/fic/samples/<id>/<id>.hex_<width>.mex/ with barcodes.tsv.gz (hexagon centers as x:y, µm), features.tsv.gz, and matrix.mtx.gz. These are converted from the same hexagon files FICTURE trains on (after --min-ct-per-unit-hexagon, default 50), so they match the factor analysis exactly; without --segment-width-10x every --width is exported. Works together with a full FICTURE run too. Config equivalent: "segment_10x": true or { "widths": "12,24" }.


Coordinates and count columns

Barcode X/Y are in nanometers, so the profile's ingest.extra_flags pass --units-per-um 1000 to sge_convert. Columns 6 and 7 of barcodes.tsv.gz are read as X and Y (the sge_convert defaults --icol-bcd-x 6 --icol-bcd-y 7).

The matrix's five count columns are, in order, gn, gt, spl, unspl, ambig. The profile selects column 2 (--icols-mtx 2), the gene-exon count, and names it count in the output.

These settings live in ingest.extra_flags, which come last on the sge_convert command line, so --units-per-um on the CLI (or ingest.units_per_um) has no effect here — the profile's --units-per-um 1000 takes precedence. To change any of them, replace the list in a --config (a list is replaced whole, so restate every flag you want to keep):

1
{ "ingest": { "extra_flags": ["--units-per-um 1000", "--icols-mtx 2", "--icol-bcd-x 5", "--icol-bcd-y 6", "--sge-visual"] } }

To quantify on a different count column — e.g. total gene counts (gn) — set --icols-mtx 1 the same way.

On the raw-TSV route (--raw-transcript), --icols-mtx does not apply: the count column defaults to gn (sge_convert's Seq-Scope TSV preset), so pass --colname-transcript-count gt to count the gene-exon column, as the MEX route does.

Barcodes whose features do not match the feature file are dropped by sge_drop_mismatches after conversion (the sge_convert default for this platform).


Images

Seq-Scope histology is typically an H&E TIF that has already been georeferenced — it carries its own geotransform, aligned to the transcript frame, but usually no CRS. The profile therefore sets image_defaults.georeferenced = true: the corner coordinates are kept as they are and only the CRS is assigned:

1
2
cartloader image_png2pmtiles --in-img HE.tif --out-prefix .../hne \
    --geotif2mbtiles --mbtiles2pmtiles --georeference --georef-detect gtiff

No bounds are synthesized, so --um-per-pixel / --georef-plain do not apply. If a particular image is not already georeferenced, opt it out per image and state its scale instead:

1
--image type=hne,source=/data/HE_plain.tif,georeferenced=false,georef_plain=true,um_per_pixel=0.5

Single-channel modalities (e.g. type=dapi) are colorized through import_image on the usual path and are not covered by georeferenced; give them a scale with um_per_pixel.

See also