Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,20 @@ Suggests:
Remotes: drieslab/GiottoUtils
Config/testthat/edition: 3
Collate:
'classes-virtuals.R'
'classes-utils.R'
'classes-images.R'
'classes-overlaps.R'
'classes-points.R'
'classes-polygons.R'
'package_imports.R'
'classes.R'
'generics.R'
'NN_network.R'
'aggregate.R'
'auxilliary.R'
'buffer.R'
'classes-binpoints.R'
'combine_metadata.R'
'slot_accessors.R'
'create.R'
Expand Down
7 changes: 7 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ S3method(.DollarNames,terraVectData)
S3method(as.data.frame,overlapIntensityDT)
S3method(as.data.frame,overlapPointDT)
S3method(as.data.table,SpatVector)
S3method(as.data.table,giottoBinPoints)
S3method(as.data.table,giottoPoints)
S3method(as.data.table,giottoPolygon)
S3method(print,ghistory)
Expand Down Expand Up @@ -75,6 +76,7 @@ export(createCellMetaObj)
export(createDimObj)
export(createExprObj)
export(createFeatMetaObj)
export(createGiottoBinPoints)
export(createGiottoImage)
export(createGiottoInstructions)
export(createGiottoLargeImage)
Expand Down Expand Up @@ -295,6 +297,7 @@ exportClasses(exprObj)
exportClasses(featMetaObj)
exportClasses(featureNetwork)
exportClasses(giotto)
exportClasses(giottoBinPoints)
exportClasses(giottoImage)
exportClasses(giottoLargeImage)
exportClasses(giottoPoints)
Expand Down Expand Up @@ -353,6 +356,7 @@ exportMethods(ext)
exportMethods(featIDs)
exportMethods(featType)
exportMethods(flip)
exportMethods(head)
exportMethods(hist)
exportMethods(hull)
exportMethods(instructions)
Expand Down Expand Up @@ -381,6 +385,7 @@ exportMethods(splitGeom)
exportMethods(subset)
exportMethods(symdif)
exportMethods(t)
exportMethods(tail)
exportMethods(union)
exportMethods(vect)
exportMethods(wrap)
Expand Down Expand Up @@ -429,6 +434,7 @@ importMethodsFrom(terra,density)
importMethodsFrom(terra,erase)
importMethodsFrom(terra,ext)
importMethodsFrom(terra,flip)
importMethodsFrom(terra,head)
importMethodsFrom(terra,hist)
importMethodsFrom(terra,hull)
importMethodsFrom(terra,intersect)
Expand All @@ -441,6 +447,7 @@ importMethodsFrom(terra,snap)
importMethodsFrom(terra,spin)
importMethodsFrom(terra,symdif)
importMethodsFrom(terra,t)
importMethodsFrom(terra,tail)
importMethodsFrom(terra,union)
importMethodsFrom(terra,vect)
importMethodsFrom(terra,wrap)
Expand Down
7 changes: 6 additions & 1 deletion NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,18 @@

## changes
- `calculateOverlap()` and `overlapToMatrix()` param harmonization
- refactor of `saveGiotto()` and `loadGiotto()`
- code reorganization for `classes.R`

## new
- `aggregateFeatures()` wrapper for running `calculateOverlap()` and `overlapToMatrix()`
- `aggregateFeatures()` giotto object wrapper function for running `calculateOverlap()` and `overlapToMatrix()`
- `overlapPointDT()` and `overlapIntensityDT()` classes to store overlaps relationships efficiently and help with aggregation pipeline
- `giottoBinPoints` class for efficient binned spatial points

## bug fixes
- `overlaps()` will now properly find image overlaps
- fix a naming bug when exporting images during save



# GiottoClass 0.4.12 (2025/12/12)
Expand Down
82 changes: 2 additions & 80 deletions R/aggregate.R
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# collate
#' @include generics.R
#' @include classes.R
NULL

# aggregate expression ####
Expand Down Expand Up @@ -802,6 +803,7 @@ setMethod(
)
)

# (constructor) see classes-overlaps.R
.create_overlap_point_dt(x, y, res, feat_ids = feat_ids)
}
)
Expand Down Expand Up @@ -988,87 +990,7 @@ calculateOverlapRaster <- function(
}
}

#' @param overlap_data `data.table` of extracted intensity values per poly_ID
#' @noRd
.create_overlap_intensity_dt <- function(overlap_data) {
odt <- new("overlapIntensityDT", data = overlap_data)
odt@nfeats <- ncol(overlap_data) - 1L
odt
}

#' @param x from data (SpatVector)
#' @param y to data (SpatVector)
#' @param overlap_data relationships (data.frame). Expected to be numeric row
#' indices between x and y
#' @param keep additional col(s) in `y` to keep
#' @noRd
.create_overlap_point_dt <- function(x, y,
overlap_data, keep = NULL, feat_ids) {
poly <- feat_idx <- feat <- feat_id_index <- NULL # NSE vars
# cleanup input overlap_data
checkmate::assert_data_frame(overlap_data)
data.table::setDT(overlap_data)
cnames <- colnames(overlap_data)
data.table::setnames(overlap_data,
old = c(cnames[[2]], cnames[[1]]),
new = c("poly", "feat_idx")
)
# make relationships table sparse by removing non-overlapped features
# these results are indexed by all features, so no need to filter
# non-overlapped polys
overlap_data <- overlap_data[!is.na(poly)]

# extract needed info from y
keep <- c("feat_ID", "feat_ID_uniq", keep)
ytab <- terra::as.data.frame(y[overlap_data$feat_idx, keep])

# initialize overlap object and needed ids
sids <- x$poly_ID
fids <- unique(ytab$feat_ID)
odt <- new("overlapPointDT",
spat_ids = sids,
feat_ids = feat_ids,
nfeats = as.integer(nrow(y))
)

# Ensure data is stored as integer or integer-based mapping
## - if poly/feat_idx contents are NOT integer coercible, establish a map #
if (!overlap_data[, checkmate::test_integerish(head(poly, 100))]) {
overlap_data[, poly := match(poly, sids)]
}
if (!overlap_data[, checkmate::test_integerish(head(feat_idx, 100))]) {
overlap_data[, feat_idx := match(feat_idx, fids)]
}
## -- if still not integer, coerce to integer --------------------------- #
if (!is.integer(overlap_data$poly[1])) {
overlap_data[, poly := as.integer(poly)]
}
if (!is.integer(overlap_data$feat_idx[1])) {
overlap_data[, feat_idx := as.integer(feat_idx)]
}

# append y attribute info
overlap_data <- cbind(overlap_data, ytab)
data.table::setnames(overlap_data,
old = c("feat_ID_uniq", "feat_ID"),
new = c("feat", "feat_id_index")
)
if (!is.integer(overlap_data$feat[1])) {
overlap_data[, feat := as.integer(feat)]
}
# add feat_ID map
overlap_data[, feat_id_index := match(feat_id_index, odt@feat_ids)]
# remove feat_idx which may not be reliable after feature subsets
overlap_data[, feat_idx := NULL]
# set indices
data.table::setkeyv(overlap_data, "feat")
data.table::setindexv(overlap_data, "poly")
data.table::setcolorder(overlap_data, c("poly", "feat", "feat_id_index"))
# add to object
odt@data <- overlap_data

odt
}



Expand Down
Loading
Loading